### Eclipse Workspace Patch 1.0
#P org.eclipse.pde.ui
Index: src/org/eclipse/pde/internal/ui/preferences/TargetPluginsTab.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetPluginsTab.java,v
retrieving revision 1.45
diff -u -r1.45 TargetPluginsTab.java
--- src/org/eclipse/pde/internal/ui/preferences/TargetPluginsTab.java 16 Jan 2008 17:08:15 -0000 1.45
+++ src/org/eclipse/pde/internal/ui/preferences/TargetPluginsTab.java 18 Jan 2008 09:58:45 -0000
@@ -28,8 +28,7 @@
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.core.IModel;
import org.eclipse.pde.core.IModelProviderEvent;
-import org.eclipse.pde.core.plugin.IPluginModelBase;
-import org.eclipse.pde.core.plugin.PluginRegistry;
+import org.eclipse.pde.core.plugin.*;
import org.eclipse.pde.internal.core.*;
import org.eclipse.pde.internal.core.ifeature.*;
import org.eclipse.pde.internal.core.itarget.*;
@@ -548,6 +547,11 @@
protected void handleReload() {
String platformPath = fPage.getPlatformPath();
if (platformPath != null && platformPath.length() > 0) {
+
+ // Get the set of model ids selected
+ Set selectedModels;
+ selectedModels = getSelectedModelIds(true);
+
ReloadOperation op = new ReloadOperation(platformPath);
try {
PlatformUI.getWorkbench().getProgressService().run(true, false, op);
@@ -556,10 +560,16 @@
}
fPluginListViewer.setInput(PDECore.getDefault().getModelManager().getExternalModelManager());
fPluginTreeViewer.setInput(PDECore.getDefault().getModelManager().getExternalModelManager());
- fPluginTreeViewer.setSubtreeChecked(fPluginTreeViewer.getInput(), true);
fPluginTreeViewer.setGrayedElements(new Object[0]);
fChangedModels.clear();
- handleSelectAll(true);
+
+ boolean restoredSelection;
+ restoredSelection = handleRestoreSelection(selectedModels);
+
+ // If the selection wasn't restored the default to the 'select all' logic
+ if (!restoredSelection)
+ handleSelectAll(true);
+
if (fTreeViewerContents.size() > 1)
fPluginTreeViewer.collapseAll();
fReloaded = true;
@@ -569,6 +579,47 @@
}
/**
+ * Return a set of currently selected model ids
+ * @param nullIfAll Affects what will be returned if all are selected,
+ * i.e. if true and all are selected then this will return null
.
+ * @return A set of identifiers for the currently selected models, or null
+ * if all are selected and nullIfAll
is true
.
+ */
+ private Set getSelectedModelIds(boolean nullIfAll) {
+
+ Object[] itemsCheckedInList = fPluginListViewer.getCheckedElements();
+ IPluginModelBase[] allModels = getCurrentModels();
+ boolean allSelected = (itemsCheckedInList.length == allModels.length);
+ if (nullIfAll && allSelected) {
+
+ // All items are selected - no need to do any magic, just return null
+ return null;
+ }
+
+ Set selectedModels;
+
+ // Build a set containing the ids of the selected plugin/bundle/fragments
+ selectedModels = new HashSet();
+ for (int i = 0; i < itemsCheckedInList.length; i++) {
+ Object item = itemsCheckedInList[i];
+ if (item instanceof IPluginModel) {
+
+ IPluginModel pluginModel = (IPluginModel) item;
+ String id = pluginModel.getPluginBase().getId();
+ selectedModels.add(id);
+
+ } else if (item instanceof IFragmentModel) {
+
+ IFragmentModel fragmentModel = (IFragmentModel) item;
+ String id = fragmentModel.getPluginBase().getId();
+ selectedModels.add(id);
+ }
+ }
+
+ return selectedModels;
+ }
+
+ /**
* Sets the given locations as additional locations to check, then handles the reload.
* @param additionalLocations list of additional locations.
*/
@@ -724,6 +775,79 @@
}
/**
+ * Restore the selection to the specified set of models.
+ * @param selectedModels Set of plugin/bundle identifiers
+ * @return true if the selection occurred, false if it didn't
+ */
+ private boolean handleRestoreSelection(Set selectedModels) {
+
+ boolean restoredSelection = false;
+
+ if (selectedModels != null) {
+
+ int numSelected = 0;
+
+ IPluginModelBase[] allModels = getCurrentModels();
+
+ // There are two ways of dealing with the checking of the UI widgets:
+ // (1) un-check them all and selectively check individual ones
+ // (1) check them all and selectively un-check individual ones
+ // The method chosen depends on the ratio of selectedModels to allModels.
+ // This method cannot be guaranteed to be accurate since the set of plugins
+ // between two targets may be completely different, but it's going to give a
+ // reasonable guess.
+
+ boolean checkingMethod = true;
+ if (selectedModels.size() > (allModels.length / 2)) {
+ // more than half the number of models to be selected than
+ // models we have in total, so selectively un-check
+ checkingMethod = false;
+ }
+
+ fPluginListViewer.setAllChecked(!checkingMethod);
+ fPluginTreeViewer.setAllChecked(!checkingMethod);
+
+ restoredSelection = true;
+
+ for (int i = 0; i < allModels.length; i++) {
+ IPluginModelBase model = allModels[i];
+
+ String id = model.getPluginBase().getId();
+ boolean selected = selectedModels.contains(id);
+
+ if (selected) {
+ numSelected++;
+ if (checkingMethod) {
+ fPluginListViewer.setChecked(model, true);
+ fPluginTreeViewer.setChecked(model, true);
+ }
+ } else if (!checkingMethod) {
+
+ fPluginListViewer.setChecked(model, false);
+ fPluginTreeViewer.setChecked(model, false);
+ }
+
+ if (model.isEnabled() != selected) {
+ fChangedModels.add(model);
+ } else if (fChangedModels.contains(model) && model.isEnabled() == selected) {
+ fChangedModels.remove(model);
+ }
+ }
+
+ // Handle grey-ness in table
+ Set parents = fTreeViewerContents.keySet();
+ Iterator parentIter = parents.iterator();
+ while (parentIter.hasNext()) {
+ File parent = (File) parentIter.next();
+ handleGrayChecked(parent, true);
+ }
+
+ setCounter(numSelected);
+ }
+ return restoredSelection;
+ }
+
+ /**
* Enables or disables all of the plugins.
* @param selected whether to enable or disable the plugins
*/