diff options
7 files changed, 93 insertions, 104 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSChangeSetCollector.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSChangeSetCollector.java index 0639ae5ad..00620620f 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSChangeSetCollector.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSChangeSetCollector.java @@ -136,7 +136,7 @@ public class CVSChangeSetCollector extends SyncInfoSetChangeSetCollector { * @see org.eclipse.team.core.subscribers.ChangeSet#getComment() */ public String getComment() { - return getName(); + return ""; //$NON-NLS-1$ } } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java index 9f7670c87..87671876d 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java @@ -10,51 +10,24 @@ *******************************************************************************/ package org.eclipse.team.internal.ui.synchronize; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; +import java.util.*; -import org.eclipse.compare.structuremergeviewer.IDiffContainer; import org.eclipse.compare.structuremergeviewer.IDiffElement; -import org.eclipse.core.resources.IContainer; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IResourceStatus; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.ISafeRunnable; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; +import org.eclipse.core.resources.*; +import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.ListenerList; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.AbstractTreeViewer; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.StructuredViewer; -import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.util.*; +import org.eclipse.jface.viewers.*; import org.eclipse.swt.events.TreeEvent; import org.eclipse.swt.events.TreeListener; import org.eclipse.swt.widgets.Tree; import org.eclipse.team.core.ITeamStatus; -import org.eclipse.team.core.synchronize.ISyncInfoSetChangeEvent; -import org.eclipse.team.core.synchronize.ISyncInfoSetChangeListener; -import org.eclipse.team.core.synchronize.ISyncInfoTreeChangeEvent; -import org.eclipse.team.core.synchronize.SyncInfo; -import org.eclipse.team.core.synchronize.SyncInfoSet; +import org.eclipse.team.core.synchronize.*; import org.eclipse.team.internal.core.Assert; import org.eclipse.team.internal.core.TeamPlugin; +import org.eclipse.team.internal.ui.*; import org.eclipse.team.internal.ui.Policy; -import org.eclipse.team.internal.ui.TeamUIPlugin; -import org.eclipse.team.internal.ui.Utils; -import org.eclipse.team.ui.synchronize.ISynchronizeModelElement; -import org.eclipse.team.ui.synchronize.ISynchronizePage; -import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; -import org.eclipse.team.ui.synchronize.SynchronizePageActionGroup; +import org.eclipse.team.ui.synchronize.*; /** * This class is reponsible for creating and maintaining a presentation model of @@ -718,8 +691,31 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo * well. * @param node the root node */ - protected void clearModelObjects(ISynchronizeModelElement node) { - // Clear all the children of the node + protected final void clearModelObjects(ISynchronizeModelElement node) { + // When clearing model objects, any parents of the node + // That are not out-of-sync, not the model root and that would + // be empty as a result of this clear, should also be cleared. + ISynchronizeModelElement rootToClear = getRootToClear(node); + // Recursively clear the nodes from the root + recursiveClearModelObjects(rootToClear); + if (node == getModelRoot()) { + IDiffElement[] children = node.getChildren(); + for (int i = 0; i < children.length; i++) { + IDiffElement element = children[i]; + ((SynchronizeModelElement)node).remove(element); + } + } else { + SynchronizeModelElement parent = ((SynchronizeModelElement)node.getParent()); + if (parent != null) parent.remove(node); + } + } + + /** + * Method that sublcasses can oiverride when clearing model objects. + * @param node the node to be cleared recursively + */ + protected void recursiveClearModelObjects(ISynchronizeModelElement node) { + // Clear all the children of the node IDiffElement[] children = node.getChildren(); for (int i = 0; i < children.length; i++) { IDiffElement element = children[i]; @@ -727,33 +723,27 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo ISynchronizeModelElement sme = (ISynchronizeModelElement) element; ISynchronizeModelProvider provider = getProvider(sme); if (provider != null && provider instanceof AbstractSynchronizeModelProvider) { - ((AbstractSynchronizeModelProvider)provider).clearModelObjects(sme); + ((AbstractSynchronizeModelProvider)provider).recursiveClearModelObjects(sme); } else { - clearModelObjects(sme); + recursiveClearModelObjects(sme); } } } - // Remove the node from the tree - removeToRoot(node); - // Notify the update handler that the node has been cleared updateHandler.modelObjectCleared(node); - } - - /* + } + + /* * Remove to root should only remove to the root of the provider and not the * diff tree. */ - private void removeToRoot(ISynchronizeModelElement node) { - if (node == getModelRoot()) return; - IDiffContainer parent = node.getParent(); - if (parent != null) { - ISynchronizeModelElement element = (ISynchronizeModelElement)parent; - ((SynchronizeModelElement)element).remove(node); - if (!element.hasChildren() && !isOutOfSync(element)) { - removeToRoot(element); - } + private ISynchronizeModelElement getRootToClear(ISynchronizeModelElement node) { + if (node == getModelRoot()) return node; + ISynchronizeModelElement parent = (ISynchronizeModelElement)node.getParent(); + if (parent != null && parent != getModelRoot() && !isOutOfSync(parent) && parent.getChildren().length == 1) { + return getRootToClear(parent); } + return node; } /* @@ -814,7 +804,7 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo * This is a callback from the model update handler that gets invoked * when a node is removed from the viewer. It is only invoked for the * root level model provider. A removed node may have children for - * which a <code>nodeRemoved</code> callback is not recieved (see + * which a <code>nodeRemoved</code> callback is not received (see * <code>modelObjectCleared</code>). * @param node */ @@ -825,9 +815,9 @@ public abstract class AbstractSynchronizeModelProvider implements ISynchronizeMo /** * This is a callback from the model update handler that gets invoked * when a node is cleared from the model. It is only invoked for the - * root level model provider. This calbakc is deep in the sense that - * a callbakc is sent for each node that is cleared. - * @param node the node that was removed. + * root level model provider. This callback is deep in the sense that + * a callback is sent for each node that is cleared. + * @param node the node that was cleared. */ public void modelObjectCleared(ISynchronizeModelElement node) { // Default is to do nothing diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ActiveChangeSetCollector.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ActiveChangeSetCollector.java index 6d434dfe9..5a0f5780b 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ActiveChangeSetCollector.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ActiveChangeSetCollector.java @@ -20,6 +20,7 @@ import java.util.Map; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.team.core.ITeamStatus; +import org.eclipse.team.core.TeamException; import org.eclipse.team.core.subscribers.ChangeSet; import org.eclipse.team.core.subscribers.IChangeSetChangeListener; import org.eclipse.team.core.subscribers.SubscriberChangeSetCollector; @@ -28,6 +29,7 @@ import org.eclipse.team.core.synchronize.ISyncInfoSetChangeListener; import org.eclipse.team.core.synchronize.SyncInfo; import org.eclipse.team.core.synchronize.SyncInfoSet; import org.eclipse.team.core.synchronize.SyncInfoTree; +import org.eclipse.team.internal.ui.TeamUIPlugin; import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; /** @@ -117,23 +119,27 @@ public class ActiveChangeSetCollector implements ISyncInfoSetChangeListener { // Now repopulate if (seedSet != null) { - // Show all active change sets even if they are empty - sets = getActiveChangeSetManager().getSets(); - for (int i = 0; i < sets.length; i++) { - ChangeSet set = sets[i]; - add(set); - } - // The above will add all sync info that are contained in sets. - // We still need to add uncontained infos to the root set - SyncInfo[] syncInfos = seedSet.getSyncInfos(); - for (int i = 0; i < syncInfos.length; i++) { - SyncInfo info = syncInfos[i]; - if (isLocalChange(info)) { - ChangeSet[] containingSets = findChangeSets(info); - if (containingSets.length == 0) { - rootSet.add(info); - } - } + if (getConfiguration().getComparisonType() == ISynchronizePageConfiguration.THREE_WAY) { + // Show all active change sets even if they are empty + sets = getActiveChangeSetManager().getSets(); + for (int i = 0; i < sets.length; i++) { + ChangeSet set = sets[i]; + add(set); + } + // The above will add all sync info that are contained in sets. + // We still need to add uncontained infos to the root set + SyncInfo[] syncInfos = seedSet.getSyncInfos(); + for (int i = 0; i < syncInfos.length; i++) { + SyncInfo info = syncInfos[i]; + if (isLocalChange(info)) { + ChangeSet[] containingSets = findChangeSets(info); + if (containingSets.length == 0) { + rootSet.add(info); + } + } + } + } else { + add(seedSet.getSyncInfos()); } } } @@ -212,6 +218,14 @@ public class ActiveChangeSetCollector implements ISyncInfoSetChangeListener { * Return if this sync info is an outgoing change. */ private boolean isLocalChange(SyncInfo info) { + if (!info.getComparator().isThreeWay()) { + try { + // Obtain the sync info from the subscriber and use it to see if the change is local + info = getActiveChangeSetManager().getSubscriber().getSyncInfo(info.getLocal()); + } catch (TeamException e) { + TeamUIPlugin.log(e); + } + } return (info.getComparator().isThreeWay() && ((info.getKind() & SyncInfo.DIRECTION_MASK) == SyncInfo.OUTGOING || (info.getKind() & SyncInfo.DIRECTION_MASK) == SyncInfo.CONFLICTING)); @@ -238,17 +252,19 @@ public class ActiveChangeSetCollector implements ISyncInfoSetChangeListener { SyncInfoTree sis = (SyncInfoTree)activeSets.get(set); // Register the listener last since the add will // look for new elements - boolean listen = false; + boolean added = false; if (sis == null) { sis = new SyncInfoTree(); activeSets.put(set, sis); - listen = true; + added = true; } else { sis.clear(); } sis.addAll(select(set.getSyncInfoSet().getSyncInfos())); - if (listen) + if (added) { set.getSyncInfoSet().addSyncSetChangedListener(this); + listener.setAdded(set); + } return sis; } @@ -273,9 +289,8 @@ public class ActiveChangeSetCollector implements ISyncInfoSetChangeListener { sis = new SyncInfoTree(); set.getSyncInfoSet().addSyncSetChangedListener(this); activeSets.put(set, sis); + sis.addAll(select(set.getSyncInfoSet().getSyncInfos())); } - sis.clear(); - sis.addAll(select(set.getSyncInfoSet().getSyncInfos())); return sis; } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ChangeSetModelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ChangeSetModelProvider.java index 8e5ef14d1..0888c4d49 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ChangeSetModelProvider.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ChangeSetModelProvider.java @@ -312,8 +312,8 @@ public class ChangeSetModelProvider extends CompositeModelProvider { /* (non-Javadoc) * @see org.eclipse.team.internal.ui.synchronize.CompositeModelProvider#clearModelObjects(org.eclipse.team.ui.synchronize.ISynchronizeModelElement) */ - protected void clearModelObjects(ISynchronizeModelElement node) { - super.clearModelObjects(node); + protected void recursiveClearModelObjects(ISynchronizeModelElement node) { + super.recursiveClearModelObjects(node); if (node == getModelRoot()) { rootToProvider.clear(); // Throw away the embedded sorter @@ -404,14 +404,6 @@ public class ChangeSetModelProvider extends CompositeModelProvider { removeProvider(provider); } } - - public void createActiveChangeSetModelElements() { - ChangeSet[] sets = activeCollector.getActiveChangeSetManager().getSets(); - for (int i = 0; i < sets.length; i++) { - ChangeSet set = sets[i]; - createChangeSetModelElement(set, activeCollector.getSyncInfoSet(set)); - } - } public void createChangeSetModelElement(ChangeSet set, SyncInfoTree tree) { // Add the model element and provider for the set diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/CompositeModelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/CompositeModelProvider.java index 274bd0d0e..4c9c94d01 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/CompositeModelProvider.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/CompositeModelProvider.java @@ -208,15 +208,6 @@ public abstract class CompositeModelProvider extends AbstractSynchronizeModelPro elementToProvider.put(node, provider); super.nodeAdded(node, provider); } - - /* (non-Javadoc) - * @see org.eclipse.team.internal.ui.synchronize.AbstractSynchronizeModelProvider#nodeRemoved(org.eclipse.team.ui.synchronize.ISynchronizeModelElement) - */ - protected void nodeRemoved(ISynchronizeModelElement node, AbstractSynchronizeModelProvider provider) { - // Update the resource-to-element map and the element-to-provider map - modelObjectCleared(node); - super.nodeRemoved(node, provider); - } /* (non-Javadoc) * @see org.eclipse.team.internal.ui.synchronize.AbstractSynchronizeModelProvider#modelObjectCleared(org.eclipse.team.ui.synchronize.ISynchronizeModelElement) @@ -239,8 +230,8 @@ public abstract class CompositeModelProvider extends AbstractSynchronizeModelPro /* (non-Javadoc) * @see org.eclipse.team.internal.ui.synchronize.AbstractSynchronizeModelProvider#clearModelObjects(org.eclipse.team.ui.synchronize.ISynchronizeModelElement) */ - protected void clearModelObjects(ISynchronizeModelElement node) { - super.clearModelObjects(node); + protected void recursiveClearModelObjects(ISynchronizeModelElement node) { + super.recursiveClearModelObjects(node); if (node == getModelRoot()) { clearProviders(); } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelProvider.java index 38cecdca3..c359bce83 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelProvider.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelProvider.java @@ -131,8 +131,8 @@ public abstract class SynchronizeModelProvider extends AbstractSynchronizeModelP /* (non-Javadoc) * @see org.eclipse.team.internal.ui.synchronize.AbstractSynchronizeModelProvider#clearModelObjects(org.eclipse.team.ui.synchronize.ISynchronizeModelElement) */ - protected void clearModelObjects(ISynchronizeModelElement node) { - super.clearModelObjects(node); + protected void recursiveClearModelObjects(ISynchronizeModelElement node) { + super.recursiveClearModelObjects(node); if (node == getModelRoot()) { // If we are clearing everything under the root // than just purge the resource map diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelUpdateHandler.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelUpdateHandler.java index 66ecd65e2..a6c97f782 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelUpdateHandler.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelUpdateHandler.java @@ -432,6 +432,7 @@ public class SynchronizeModelUpdateHandler extends BackgroundEventHandler implem * @param node the node that was cleared */ public void modelObjectCleared(ISynchronizeModelElement node) { + node.removePropertyChangeListener(listener); this.provider.modelObjectCleared(node); if (DEBUG) { System.out.println("Node cleared: " + getDebugDisplayLabel(node)); //$NON-NLS-1$ |