[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);
+ }
}
}