[164932] Make sure connection profiles contributed by repositories are refreshed after a connect/disconnect action
diff --git a/plugins/org.eclipse.datatools.connectivity.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.datatools.connectivity.ui/META-INF/MANIFEST.MF
index 106c941..3181af0 100644
--- a/plugins/org.eclipse.datatools.connectivity.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.datatools.connectivity.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Plugin.Name
 Bundle-SymbolicName: org.eclipse.datatools.connectivity.ui; singleton:=true
-Bundle-Version: 1.0.0.200611271
+Bundle-Version: 1.0.0.200611272
 Bundle-Activator: org.eclipse.datatools.connectivity.internal.ui.ConnectivityUIPlugin
 Bundle-Vendor: %Plugin.ProviderName
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.datatools.connectivity.ui/build.properties b/plugins/org.eclipse.datatools.connectivity.ui/build.properties
index 96538f9..8a6cdb5 100644
--- a/plugins/org.eclipse.datatools.connectivity.ui/build.properties
+++ b/plugins/org.eclipse.datatools.connectivity.ui/build.properties
@@ -9,7 +9,7 @@
 output.connectivityui.jar = bin/
 
 src.dir =		src/
-plugin.version =	1.0.0.200611271
+plugin.version =	1.0.0.200611272
 javadoc.dir =		doc/api/
 download.dir =		./download/
 javac.source =		1.4
diff --git a/plugins/org.eclipse.datatools.connectivity.ui/src/org/eclipse/datatools/connectivity/internal/ui/CPRepositoryContentProvider.java b/plugins/org.eclipse.datatools.connectivity.ui/src/org/eclipse/datatools/connectivity/internal/ui/CPRepositoryContentProvider.java
index 9df0af9..454106d 100644
--- a/plugins/org.eclipse.datatools.connectivity.ui/src/org/eclipse/datatools/connectivity/internal/ui/CPRepositoryContentProvider.java
+++ b/plugins/org.eclipse.datatools.connectivity.ui/src/org/eclipse/datatools/connectivity/internal/ui/CPRepositoryContentProvider.java
@@ -10,14 +10,85 @@
  ******************************************************************************/
 package org.eclipse.datatools.connectivity.internal.ui;
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.datatools.connectivity.IConnectionProfile;
+import org.eclipse.datatools.connectivity.IManagedConnection;
+import org.eclipse.datatools.connectivity.IProfileListener;
+import org.eclipse.datatools.connectivity.IPropertySetChangeEvent;
+import org.eclipse.datatools.connectivity.IPropertySetListener;
+import org.eclipse.datatools.connectivity.ProfileManager;
 import org.eclipse.datatools.connectivity.internal.repository.IConnectionProfileRepository;
+import org.eclipse.datatools.connectivity.ui.RefreshProfileJob;
 import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.ui.navigator.CommonViewer;
 
 public class CPRepositoryContentProvider implements ITreeContentProvider {
 
+	private Viewer mViewer;
+	private Set mRepositories = new HashSet();
+
+	private IProfileListener mProfileListener = new IProfileListener() {
+
+		public void profileAdded(IConnectionProfile profile) {
+			if (isChildProfile(profile)) {
+				profile.addPropertySetListener(mPropertyListener);
+				refreshViewer(profile, true);
+			}
+		}
+
+		public void profileDeleted(IConnectionProfile profile) {
+			if (isChildProfile(profile)) {
+				profile.removePropertySetListener(mPropertyListener);
+				refreshViewer(profile, false);
+			}
+		}
+
+		public void profileChanged(IConnectionProfile profile) {
+			if (isChildProfile(profile)) {
+				refreshViewer(profile, false);
+			}
+		}
+
+		private boolean isChildProfile(IConnectionProfile profile) {
+			if (profile.getParentProfile() == null || !profile.isConnected()) {
+				return false;
+			}
+			IManagedConnection imc = profile
+					.getManagedConnection(IConnectionProfileRepository.class
+							.getName());
+			return imc != null && mRepositories.contains(imc.getConnection());
+		}
+
+	};
+	private IPropertySetListener mPropertyListener = new IPropertySetListener() {
+
+		public void propertySetChanged(IPropertySetChangeEvent event) {
+			handleProfilePropertyChanged(event);
+		}
+	};
+
+	public CPRepositoryContentProvider() {
+		super();
+		ProfileManager.getInstance().addProfileListener(mProfileListener);
+	}
+
 	public Object[] getChildren(Object parentElement) {
 		if (parentElement instanceof IConnectionProfileRepository) {
+			if (!mRepositories.contains(parentElement)) {
+				for (Iterator it = Arrays.asList(
+						((IConnectionProfileRepository) parentElement)
+								.getProfiles()).iterator(); it.hasNext();) {
+					((IConnectionProfile) it.next())
+							.addPropertySetListener(mPropertyListener);
+				}
+				mRepositories.add(parentElement);
+			}
 			return ((IConnectionProfileRepository) parentElement).getProfiles();
 		}
 		return new Object[0];
@@ -25,7 +96,8 @@
 
 	public Object getParent(Object element) {
 		if (element instanceof IConnectionProfileRepository) {
-			return ((IConnectionProfileRepository) element).getRepositoryProfile();
+			return ((IConnectionProfileRepository) element)
+					.getRepositoryProfile();
 		}
 		return null;
 	}
@@ -39,9 +111,46 @@
 	}
 
 	public void dispose() {
+		ProfileManager.getInstance().removeProfileListener(mProfileListener);
+		for (Iterator repIt = mRepositories.iterator(); repIt.hasNext();) {
+			for (Iterator it = Arrays
+					.asList(
+							((IConnectionProfileRepository) repIt.next())
+									.getProfiles()).iterator(); it.hasNext();) {
+				((IConnectionProfile) it.next())
+						.removePropertySetListener(mPropertyListener);
+			}
+		}
 	}
 
 	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		mViewer = viewer;
+	}
+
+	protected void refreshViewer(final IConnectionProfile profile,
+			final boolean expand) {
+		if (mViewer instanceof TreeViewer && profile != null) {
+			RefreshProfileJob.scheduleRefreshProfileJob(profile,
+					(TreeViewer) mViewer);
+		}
+		else {
+			Runnable runner = new Runnable() {
+
+				public void run() {
+					((CommonViewer) mViewer).refresh();
+				}
+			};
+			mViewer.getControl().getDisplay().syncExec(runner);
+		}
+	}
+
+	protected void handleProfilePropertyChanged(IPropertySetChangeEvent event) {
+		if (IConnectionProfile.CONNECTION_PROFILE_PROPERTY_SET.equals(event
+				.getPropertySetType())
+				&& event
+						.getChangedProperty(IConnectionProfile.CONNECTED_PROPERTY_ID) != null) {
+			refreshViewer(event.getConnectionProfile(), false);
+		}
 	}
 
 }