Bug 48827	Progress going on even when Synch view is closed
diff --git a/bundles/org.eclipse.team.cvs.ui/plugin.xml b/bundles/org.eclipse.team.cvs.ui/plugin.xml
index 597175a..c19018f 100644
--- a/bundles/org.eclipse.team.cvs.ui/plugin.xml
+++ b/bundles/org.eclipse.team.cvs.ui/plugin.xml
@@ -37,6 +37,7 @@
       <participant
             name="%CVSWorkspaceParticipant"
             type="static"
+            multipleInstances="false"
             icon="icons/full/cview16/cvs_persp.gif"
             class="org.eclipse.team.internal.ccvs.ui.subscriber.WorkspaceSynchronizeParticipant"
             id="org.eclipse.team.cvs.ui.cvsworkspace-participant">
@@ -44,6 +45,7 @@
       <participant
             name="%CVSMergeParticipant"
             type="dynamic"
+            multipleInstances="true"
             icon="icons/full/clcl16/newstream_wiz.gif"
             class="org.eclipse.team.internal.ccvs.ui.subscriber.MergeSynchronizeParticipant"
             id="org.eclipse.team.cvs.ui.cvsmerge-participant">
@@ -51,6 +53,8 @@
       <participant
             name="%CVSCompareParticipant"
             type="dynamic"
+            multipleInstances="true"
+            persistent="false"
             icon="icons/full/cview16/compare_view.gif"
             class="org.eclipse.team.internal.ccvs.ui.subscriber.CompareParticipant"
             id="org.eclipse.team.cvs.ui.compare-participant">
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java
index 7e75845..4c1c3b2 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java
@@ -41,7 +41,7 @@
 import org.eclipse.team.internal.ui.TeamUIPlugin;
 import org.eclipse.team.internal.ui.Utils;
 import org.eclipse.team.ui.TeamUI;
-import org.eclipse.team.ui.synchronize.ISynchronizeParticipant;
+import org.eclipse.team.ui.synchronize.ISynchronizeParticipantReference;
 import org.eclipse.ui.*;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 
@@ -711,10 +711,14 @@
 	 * @return Returns the cvsWorkspaceSynchronizeViewPage.
 	 */
 	public WorkspaceSynchronizeParticipant getCvsWorkspaceSynchronizeParticipant() {
-		ISynchronizeParticipant[] instances = TeamUI.getSynchronizeManager().find(WorkspaceSynchronizeParticipant.ID);
-		if(instances.length == 1) {
-			return (WorkspaceSynchronizeParticipant)instances[0];
-		} else {
+		ISynchronizeParticipantReference reference = TeamUI.getSynchronizeManager().get(WorkspaceSynchronizeParticipant.ID, null);
+		try {
+			if(reference != null) {
+				return (WorkspaceSynchronizeParticipant)reference.getParticipant();
+			} else {
+				return null;
+			}
+		} catch (TeamException e) {
 			return null;
 		}
 	}
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ReleaseCommentDialog.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ReleaseCommentDialog.java
index 84b4e8e..4f20da1 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ReleaseCommentDialog.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ReleaseCommentDialog.java
@@ -10,35 +10,22 @@
  *******************************************************************************/
 package org.eclipse.team.internal.ccvs.ui;
 
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.compare.CompareConfiguration;
 import org.eclipse.compare.CompareEditorInput;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.util.IPropertyChangeListener;
 import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Shell;
-import org.eclipse.team.core.synchronize.SyncInfo;
 import org.eclipse.team.core.synchronize.SyncInfoTree;
-import org.eclipse.team.internal.ui.Utils;
 import org.eclipse.team.internal.ui.dialogs.DetailsDialog;
-import org.eclipse.team.ui.synchronize.SynchronizeCompareInput;
-import org.eclipse.team.ui.synchronize.TreeViewerAdvisor;
-import org.eclipse.team.ui.synchronize.subscribers.SubscriberParticipant;
 import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.dialogs.ContainerCheckedTreeViewer;
 
 /**
  * Prompts the user for a multi-line comment for releasing to CVS.
@@ -107,21 +94,6 @@
         Dialog.applyDialogFont(parent);
 	}
 
-	private SyncInfoTree createResourcesToCommitSyncInfoSet(IResource[] resourcesToCommit) {
-		// Create a sync set containing only the resources that will be committed.
-		SubscriberParticipant participant = CVSUIPlugin.getPlugin().getCvsWorkspaceSynchronizeParticipant();
-		SyncInfoTree currentSet = participant.getSubscriberSyncInfoCollector().getSyncInfoTree();
-		SyncInfoTree set = new SyncInfoTree();
-		for (int i = 0; i < resourcesToCommit.length; i++) {
-			IResource resource = resourcesToCommit[i];
-			SyncInfo info = currentSet.getSyncInfo(resource);
-			if(info != null) {
-				set.add(info);
-			}
-		}
-		return set;
-	}
-
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.window.Window#getInitialSize()
 	 */
@@ -149,43 +121,7 @@
 	 * @see org.eclipse.team.internal.ui.dialogs.DetailsDialog#createDropDownDialogArea(org.eclipse.swt.widgets.Composite)
 	 */
 	protected Composite createDropDownDialogArea(Composite parent) {
-		try {
-			CompareConfiguration compareConfig = new CompareConfiguration();
-			compareConfig.setLeftEditable(false);
-			TreeViewerAdvisor viewerAdvisor = new TreeViewerAdvisor(set);
-			compareEditorInput = new SynchronizeCompareInput(compareConfig, viewerAdvisor) {
-				protected StructuredViewer internalCreateDiffViewer(Composite parent, TreeViewerAdvisor diffViewerConfiguration) {
-					ContainerCheckedTreeViewer viewer = new TreeViewerAdvisor.NavigableCheckboxTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-					viewer.setCheckedElements(set.getResources());
-					GridData data = new GridData(GridData.FILL_BOTH);
-					viewer.getControl().setLayoutData(data);
-					diffViewerConfiguration.initializeViewer(viewer);
-					return viewer;
-				}
-			};
-			// We don't need a progress monitor because the actualy model will be built
-			// by the event processing thread.
-			compareEditorInput.run(new NullProgressMonitor());
-		} catch (InterruptedException e) {
-			Utils.handle(e);
-		} catch (InvocationTargetException e) {
-			Utils.handle(e);
-		}
-		
-		Composite result= new Composite(parent, SWT.NONE);
-		GridLayout layout= new GridLayout();
-		result.setLayout(layout);
-		GridData data = new GridData(GridData.FILL_BOTH);
-		data.grabExcessHorizontalSpace = true;
-		data.grabExcessVerticalSpace = true;
-		data.heightHint = 350;
-		result.setLayoutData(data);
-		Label l = new Label(result, SWT.WRAP);
-		l.setText(Policy.bind("ReleaseCommentDialog.6")); //$NON-NLS-1$
-		Control c = compareEditorInput.createContents(result);
-		data = new GridData(GridData.FILL_BOTH);
-		c.setLayoutData(data);
-		return result;
+		return null;
 	}
 
 	/* (non-Javadoc)
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithTagAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithTagAction.java
index cc6f9ef..9f7cd0a 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithTagAction.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithTagAction.java
@@ -33,7 +33,10 @@
 		CVSCompareSubscriber s = new CVSCompareSubscriber(resources, tag);
 		CompareParticipant participant = new CompareParticipant(s);
 		participant.refresh(resources, 
-				participant.getRefreshListeners().createModalDialogListener(CVSCompareSubscriber.ID_MODAL, participant, participant.getSubscriberSyncInfoCollector().getSyncInfoTree()), 
+				participant.getRefreshListeners().createModalDialogListener(
+						CVSCompareSubscriber.ID_MODAL, 
+						participant, 
+						participant.getSubscriberSyncInfoCollector().getSyncInfoTree()), 
 				Policy.bind("Participant.comparing"),  //$NON-NLS-1$
 				null);
 	}
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/merge/MergeWizard.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/merge/MergeWizard.java
index e5ebb1d..7f154d4 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/merge/MergeWizard.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/merge/MergeWizard.java
@@ -20,7 +20,6 @@
 import org.eclipse.team.internal.ccvs.ui.*;
 import org.eclipse.team.internal.ccvs.ui.subscriber.MergeSynchronizeParticipant;
 import org.eclipse.team.ui.synchronize.subscribers.IRefreshSubscriberListener;
-import org.eclipse.team.ui.synchronize.subscribers.SubscriberParticipant;
 import org.eclipse.ui.*;
 
 public class MergeWizard extends Wizard {
@@ -59,10 +58,7 @@
 		CVSTag endTag = endPage.getTag();				
 		
 		CVSMergeSubscriber s = new CVSMergeSubscriber(resources, startTag, endTag);
-		MergeSynchronizeParticipant participant = (MergeSynchronizeParticipant)SubscriberParticipant.find(s);
-		if(participant == null) {
-			participant = new MergeSynchronizeParticipant(s);
-		}	
+		MergeSynchronizeParticipant participant = new MergeSynchronizeParticipant(s);
 		IRefreshSubscriberListener listener = participant.getRefreshListeners().createModalDialogListener(CVSMergeSubscriber.ID_MODAL, participant, participant.getSubscriberSyncInfoCollector().getSyncInfoTree());
 		participant.refresh(s.roots(), listener, Policy.bind("Participant.merging"), null); //$NON-NLS-1$
 		return true;
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareParticipant.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareParticipant.java
index 747d40f..0b9d229 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareParticipant.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareParticipant.java
@@ -75,6 +75,8 @@
 		try {
 			ISynchronizeParticipantDescriptor descriptor = TeamUI.getSynchronizeManager().getParticipantDescriptor(CVSCompareSubscriber.ID);
 			setInitializationData(descriptor);
+			CVSCompareSubscriber s = (CVSCompareSubscriber)getSubscriber();
+			setSecondaryId(s.getId().getLocalName());
 		} catch (CoreException e) {
 			CVSUIPlugin.log(e);
 		}
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeAdvisor.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeAdvisor.java
index 9eee0bf..9bbf05f 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeAdvisor.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeAdvisor.java
@@ -39,7 +39,8 @@
 	protected void initializeActions(StructuredViewer treeViewer) {
 		super.initializeActions(treeViewer);
 		
-		removeAction = new RemoveSynchronizeParticipantAction(getParticipant());
+		SubscriberParticipant p = getParticipant();
+		removeAction = new RemoveSynchronizeParticipantAction(p);
 		modes = new DirectionFilterActionGroup(getParticipant(), SubscriberParticipant.INCOMING_MODE | SubscriberParticipant.CONFLICTING_MODE);
 		MergeUpdateAction action = new MergeUpdateAction();
 		action.setPromptBeforeUpdate(true);
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java
index 4436e25..e1e8d53 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java
@@ -22,16 +22,12 @@
 import org.eclipse.team.internal.ccvs.ui.Policy;
 import org.eclipse.team.ui.TeamUI;
 import org.eclipse.team.ui.synchronize.*;
-import org.eclipse.team.ui.synchronize.ISynchronizeParticipantDescriptor;
-import org.eclipse.team.ui.synchronize.ISynchronizeView;
 import org.eclipse.team.ui.synchronize.subscribers.SubscriberParticipant;
 import org.eclipse.ui.IMemento;
 import org.eclipse.ui.PartInitException;
 
 public class MergeSynchronizeParticipant extends SubscriberParticipant {
 	
-	private final static String CTX_QUALIFIER = "qualifier"; //$NON-NLS-1$
-	private final static String CTX_LOCALNAME = "localname"; //$NON-NLS-1$
 	private final static String CTX_ROOT = "root"; //$NON-NLS-1$
 	private final static String CTX_ROOT_PATH = "root_resource"; //$NON-NLS-1$
 	private final static String CTX_START_TAG = "start_tag"; //$NON-NLS-1$
@@ -48,7 +44,6 @@
 		setSubscriber(subscriber);
 	}
 	
-	
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant#createSynchronizeViewerAdvisor(org.eclipse.team.ui.synchronize.ISynchronizeView)
 	 */
@@ -59,25 +54,27 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.sync.SubscriberParticipant#setSubscriber(org.eclipse.team.core.subscribers.TeamSubscriber)
 	 */
-	protected void setSubscriber(Subscriber subscriber) {
+	public  void setSubscriber(Subscriber subscriber) {
 		super.setSubscriber(subscriber);
-		String id = CVSMergeSubscriber.ID;
 		try {
-			ISynchronizeParticipantDescriptor descriptor = TeamUI.getSynchronizeManager().getParticipantDescriptor(id); 
+			ISynchronizeParticipantDescriptor descriptor = TeamUI.getSynchronizeManager().getParticipantDescriptor(CVSMergeSubscriber.ID); 
 			setInitializationData(descriptor);
+			CVSMergeSubscriber s = (CVSMergeSubscriber)getSubscriber();
+			setSecondaryId(s.getId().getLocalName());
 		} catch (CoreException e) {
 			CVSUIPlugin.log(e);
 		}
 	}
-		
+	
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.ISynchronizeParticipant#init(org.eclipse.ui.IMemento)
 	 */
-	public void init(IMemento memento) throws PartInitException {
-		super.init(memento);
+	public void init(String secondayId, IMemento memento) throws PartInitException {
+		super.init(secondayId, memento);
 		if(memento != null) {
-			String qualifier = memento.getString(CTX_QUALIFIER);
-			String localname = memento.getString(CTX_LOCALNAME);
+			ISynchronizeParticipantDescriptor descriptor = TeamUI.getSynchronizeManager().getParticipantDescriptor(CVSMergeSubscriber.ID); 
+			String qualifier = descriptor.getId();
+			String localname = secondayId;
 			if(qualifier == null || localname == null) {
 				throw new PartInitException(Policy.bind("MergeSynchronizeParticipant.8")); //$NON-NLS-1$
 			}
@@ -95,9 +92,6 @@
 	public void saveState(IMemento memento) {
 		super.saveState(memento);
 		CVSMergeSubscriber s = (CVSMergeSubscriber)getSubscriber();
-		QualifiedName sId = s.getId();
-		memento.putString(CTX_QUALIFIER, sId.getQualifier());
-		memento.putString(CTX_LOCALNAME, sId.getLocalName());
 		write(s, memento);
 	}
 		
@@ -106,7 +100,11 @@
 	 */
 	public void dispose() {
 		super.dispose();
-		((CVSMergeSubscriber)getSubscriber()).cancel();
+		if(TeamUI.getSynchronizeManager().get(getId(), getSecondaryId()) == null) {
+			// If the participant isn't managed by the synchronize manager then we
+			// must ensure that the state cached in the synchronizer is flushed.
+			flushStateCache();
+		}
 	}
 	
 	/* (non-Javadoc)
@@ -116,9 +114,6 @@
 		return ((CVSMergeSubscriber)getSubscriber()).getName();
 	}
 	
-	/* (non-Javadoc)
-	 * @see org.eclipse.team.core.subscribers.TeamSubscriber#saveState(org.eclipse.team.internal.core.SaveContext)
-	 */
 	private void write(CVSMergeSubscriber s, IMemento memento) {
 		// start and end tags
 		CVSTag start = s.getStartTag();
@@ -164,4 +159,8 @@
 		IResource[] roots = (IResource[]) resources.toArray(new IResource[resources.size()]);
 		return new CVSMergeSubscriber(id, roots, start, end);
 	}
+	
+	private void flushStateCache() {
+		((CVSMergeSubscriber)getSubscriber()).cancel();
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizeParticipant.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizeParticipant.java
index bd0b4e8..e5babec 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizeParticipant.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizeParticipant.java
@@ -25,8 +25,8 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.ISynchronizeParticipant#init(org.eclipse.ui.IMemento)
 	 */
-	public void init(IMemento memento) throws PartInitException {
-		super.init(memento);
+	public void init(String secondaryId, IMemento memento) throws PartInitException {
+		super.init(secondaryId, memento);
 		Subscriber subscriber = CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber(); 
 		setSubscriber(subscriber);
 	}
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java
index 52b1f62..69f96ee 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java
@@ -12,6 +12,7 @@
 
 
 import java.lang.reflect.InvocationTargetException;
+
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.IProgressMonitor;