Skip to content

Commit 7b670f6

Browse files
committed
Packages/bundles that are already imported/added are shown
Fixes #146 Files not present in branch but changes are visible in github commit
1 parent b29e97a commit 7b670f6

9 files changed

+188
-40
lines changed

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDELabelProvider.java

+17
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*******************************************************************************/
1717
package org.eclipse.pde.internal.ui;
1818

19+
import java.util.HashMap;
1920
import java.util.Locale;
2021

2122
import org.eclipse.core.resources.IProject;
@@ -86,6 +87,7 @@
8687
import org.eclipse.pde.internal.core.text.bundle.ImportPackageObject;
8788
import org.eclipse.pde.internal.core.text.bundle.PackageObject;
8889
import org.eclipse.pde.internal.core.util.VersionUtil;
90+
import org.eclipse.pde.internal.ui.dialogs.PluginSelectionDialog;
8991
import org.eclipse.pde.internal.ui.elements.NamedElement;
9092
import org.eclipse.pde.internal.ui.util.SWTUtil;
9193
import org.eclipse.pde.internal.ui.util.SharedLabelProvider;
@@ -96,6 +98,11 @@
9698

9799
public class PDELabelProvider extends SharedLabelProvider {
98100
private static final String SYSTEM_BUNDLE = "system.bundle"; //$NON-NLS-1$
101+
private IPluginModelBase currentModel;
102+
103+
public IPluginModelBase getCurrentPluginModel() {
104+
return currentModel;
105+
}
99106

100107
public PDELabelProvider() {
101108
}
@@ -203,6 +210,13 @@ public String getObjectText(IPluginBase pluginBase) {
203210
}
204211
if (pluginBase.getModel() != null && !pluginBase.getModel().isInSync())
205212
text += " " + PDEUIMessages.PluginModelManager_outOfSync; //$NON-NLS-1$
213+
214+
HashMap<String, Boolean> existingImports = PluginSelectionDialog.getExistingImports(currentModel, false);
215+
if (existingImports.get(pluginBase.getId()) != null && existingImports.get(pluginBase.getId())) {
216+
text += " " + PDEUIMessages.PluginModelManager_alreadyAddedViaReexport; //$NON-NLS-1$
217+
} else if (existingImports.get(pluginBase.getId()) != null && !existingImports.get(pluginBase.getId())) {
218+
text += " " + PDEUIMessages.PluginModelManager_alreadyAdded; //$NON-NLS-1$
219+
}
206220
return text;
207221
}
208222

@@ -952,4 +966,7 @@ public static String formatVersion(String versionRange) {
952966
return versionRange;
953967
}
954968

969+
public void setCurrentModel(IPluginModelBase currentModel) {
970+
this.currentModel = currentModel;
971+
}
955972
}

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java

+8
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@
2626
public class PDEUIMessages extends NLS {
2727
private static final String BUNDLE_NAME = "org.eclipse.pde.internal.ui.pderesources";//$NON-NLS-1$
2828

29+
public static String PluginModelManager_alreadyImported;
30+
31+
public static String PluginModelManager_alreadyAdded;
32+
33+
public static String PluginModelManager_alreadyAddedViaReexport;
34+
35+
public static String PluginModelManager_alreadyExported;
36+
2937
public static String AbstractLauncherToolbar_noProblems;
3038

3139
public static String AbstractLauncherToolbar_noSelection;

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/dialogs/PluginSelectionDialog.java

+39-14
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@
1818

1919
import java.util.Comparator;
2020
import java.util.HashMap;
21-
import java.util.HashSet;
2221

2322
import org.eclipse.core.runtime.CoreException;
2423
import org.eclipse.core.runtime.IProgressMonitor;
2524
import org.eclipse.core.runtime.IStatus;
2625
import org.eclipse.core.runtime.Status;
2726
import org.eclipse.jface.dialogs.IDialogConstants;
2827
import org.eclipse.jface.dialogs.IDialogSettings;
28+
import org.eclipse.jface.viewers.StructuredSelection;
2929
import org.eclipse.osgi.service.resolver.ExportPackageDescription;
3030
import org.eclipse.pde.core.plugin.IFragment;
3131
import org.eclipse.pde.core.plugin.IFragmentModel;
@@ -42,6 +42,7 @@
4242
import org.eclipse.pde.internal.ui.IHelpContextIds;
4343
import org.eclipse.pde.internal.ui.PDEPlugin;
4444
import org.eclipse.pde.internal.ui.PDEUIMessages;
45+
import org.eclipse.swt.widgets.Button;
4546
import org.eclipse.swt.widgets.Composite;
4647
import org.eclipse.swt.widgets.Control;
4748
import org.eclipse.swt.widgets.Shell;
@@ -137,6 +138,11 @@ public PluginSelectionDialog(Shell parentShell, IPluginModelBase[] models, boole
137138
setListLabelProvider(PDEPlugin.getDefault().getLabelProvider());
138139
}
139140

141+
public PluginSelectionDialog(Shell activeWorkbenchShell, IPluginModelBase[] availablePlugins,
142+
boolean multipleSelection, IPluginModelBase model) {
143+
this(activeWorkbenchShell, availablePlugins, multipleSelection);
144+
PDEPlugin.getDefault().getLabelProvider().setCurrentModel(model);
145+
}
140146
@Override
141147
protected void configureShell(Shell newShell) {
142148
super.configureShell(newShell);
@@ -153,8 +159,8 @@ private static IPluginModelBase[] getElements(boolean includeFragments) {
153159
return PluginRegistry.getActiveModels(includeFragments);
154160
}
155161

156-
public static HashSet<String> getExistingImports(IPluginModelBase model, boolean includeImportPkg) {
157-
HashSet<String> existingImports = new HashSet<>();
162+
public static HashMap<String, Boolean> getExistingImports(IPluginModelBase model, boolean includeImportPkg) {
163+
HashMap<String, Boolean> existingImports = new HashMap<>();
158164
addSelfAndDirectImports(existingImports, model);
159165
if (model instanceof IFragmentModel) {
160166
IFragment fragment = ((IFragmentModel) model).getFragment();
@@ -169,33 +175,34 @@ public static HashSet<String> getExistingImports(IPluginModelBase model, boolean
169175
return existingImports;
170176
}
171177

172-
private static void addSelfAndDirectImports(HashSet<String> set, IPluginModelBase model) {
178+
private static void addSelfAndDirectImports(HashMap<String, Boolean> existingImports, IPluginModelBase model) {
173179
if (model == null) {
174180
return;
175181
}
176-
set.add(model.getPluginBase().getId());
182+
existingImports.put(model.getPluginBase().getId(), false);
177183
IPluginImport[] imports = model.getPluginBase().getImports();
178184
for (IPluginImport pImport : imports) {
179185
String id = pImport.getId();
180-
if (set.add(id)) {
181-
addReexportedImport(set, id);
182-
}
186+
existingImports.put(id, false);
187+
addReexportedImport(existingImports, id);
188+
183189
}
184190
}
185191

186-
private static void addReexportedImport(HashSet<String> set, String id) {
192+
private static void addReexportedImport(HashMap<String, Boolean> existingImports, String id) {
187193
IPluginModelBase model = PluginRegistry.findModel(id);
188194
if (model != null) {
189195
IPluginImport[] imports = model.getPluginBase().getImports();
190196
for (IPluginImport pImport : imports) {
191-
if (pImport.isReexported() && set.add(pImport.getId())) {
192-
addReexportedImport(set, pImport.getId());
197+
if (pImport.isReexported()) {
198+
existingImports.put(pImport.getId(), true);
199+
addReexportedImport(existingImports, pImport.getId());
193200
}
194201
}
195202
}
196203
}
197204

198-
private static void addImportedPackages(IBundlePluginModelBase base, HashSet<String> existingImports) {
205+
private static void addImportedPackages(IBundlePluginModelBase base, HashMap<String, Boolean> existingImports) {
199206
HashMap<String, ImportPackageObject> map = getImportPackages(base);
200207
if (map == null) {
201208
return;
@@ -221,7 +228,7 @@ private static void addImportedPackages(IBundlePluginModelBase base, HashSet<Str
221228
continue;
222229
}
223230
}
224-
existingImports.add(exported[i].getSupplier().getSymbolicName());
231+
existingImports.put(exported[i].getSupplier().getSymbolicName(), false);
225232
}
226233
}
227234
}
@@ -298,4 +305,22 @@ protected void createButtonsForButtonBar(Composite parent) {
298305
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
299306
}
300307

301-
}
308+
@Override
309+
protected void updateButtonsEnableState(IStatus status) {
310+
super.updateButtonsEnableState(status);
311+
Button okButton = getOkButton();
312+
StructuredSelection currentSelection = super.getSelectedItems();
313+
HashMap<String, Boolean> existingImports = PluginSelectionDialog
314+
.getExistingImports(PDEPlugin.getDefault().getLabelProvider().getCurrentPluginModel(), false);
315+
if (!currentSelection.isEmpty())
316+
okButton.setEnabled(false);
317+
for (Object selection : currentSelection) {
318+
if (selection instanceof IPluginModelBase
319+
&& !(existingImports.keySet().contains(((IPluginModelBase) selection).getPluginBase().getId()))) {
320+
okButton.setEnabled(true);
321+
break;
322+
}
323+
324+
}
325+
}
326+
}

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ExportPackageSection.java

+24-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import org.eclipse.core.resources.IProject;
2828
import org.eclipse.core.resources.IResource;
29+
import org.eclipse.jdt.core.IJavaElement;
2930
import org.eclipse.jdt.core.IJavaProject;
3031
import org.eclipse.jdt.core.IPackageFragment;
3132
import org.eclipse.jdt.core.JavaCore;
@@ -41,6 +42,7 @@
4142
import org.eclipse.jface.viewers.ISelection;
4243
import org.eclipse.jface.viewers.IStructuredContentProvider;
4344
import org.eclipse.jface.viewers.IStructuredSelection;
45+
import org.eclipse.jface.viewers.LabelProvider;
4446
import org.eclipse.jface.viewers.StructuredSelection;
4547
import org.eclipse.jface.viewers.TableViewer;
4648
import org.eclipse.jface.viewers.Viewer;
@@ -402,10 +404,10 @@ private void handleAdd() {
402404
IPluginModelBase model = (IPluginModelBase) getPage().getModel();
403405
final IProject project = model.getUnderlyingResource().getProject();
404406
if (PluginProject.isJavaProject(project)) {
405-
ILabelProvider labelProvider = new JavaElementLabelProvider();
407+
ILabelProvider labelProvider = new ExportPackgeLabelProvider();
406408
final ConditionalListSelectionDialog dialog = new ConditionalListSelectionDialog(
407409
PDEPlugin.getActiveWorkbenchShell(), labelProvider,
408-
PDEUIMessages.ExportPackageSection_dialogButtonLabel);
410+
PDEUIMessages.ExportPackageSection_dialogButtonLabel,fHeader);
409411
final Collection<String> pckgs = fHeader == null ? Collections.emptySet() : fHeader.getPackageNames();
410412
final boolean allowJava = "true".equals(getBundle().getHeader(ICoreConstants.ECLIPSE_JREBUNDLE)); //$NON-NLS-1$
411413
Runnable runnable = () -> {
@@ -437,7 +439,9 @@ private void handleAdd() {
437439
if (fHeader != null) {
438440
for (Object selectedObject : selected) {
439441
IPackageFragment candidate = (IPackageFragment) selectedObject;
442+
if (!fHeader.getPackageNames().contains(candidate.getElementName())){
440443
fHeader.addPackage(new ExportPackageObject(fHeader, candidate, getVersionAttribute()));
444+
}
441445
}
442446
} else {
443447
getBundle().setHeader(getExportedPackageHeader(), getValue(selected));
@@ -620,4 +624,22 @@ private void calculateUses() {
620624
Action action = new CalculateUsesAction(proj, (IBundlePluginModelBase) getPage().getModel());
621625
action.run();
622626
}
627+
628+
class ExportPackgeLabelProvider extends LabelProvider {
629+
JavaElementLabelProvider javaElementLabel = new JavaElementLabelProvider();
630+
@Override
631+
public String getText(Object element) {
632+
633+
if (element instanceof IJavaElement javaElement) {
634+
String text = javaElementLabel.getText(javaElement);
635+
final Collection<String> pckgs = fHeader == null ? Collections.emptySet() : fHeader.getPackageNames();
636+
if (!pckgs.isEmpty() && pckgs.contains(text)) {
637+
return text + " " + PDEUIMessages.PluginModelManager_alreadyExported; //$NON-NLS-1$
638+
}
639+
640+
}
641+
return javaElementLabel.getText(element);
642+
}
643+
}
644+
623645
}

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/ImportPackageSection.java

+31-7
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,21 @@ public class ImportPackageSection extends TableSection {
114114

115115
private ImportPackageHeader fHeader;
116116

117-
static class ImportItemWrapper {
117+
public static class ImportItemWrapper {
118118
Object fUnderlying;
119+
private boolean isImported = false;
120+
121+
public boolean isAlreadyImported() {
122+
return isImported;
123+
}
119124

120125
public ImportItemWrapper(Object underlying) {
121126
fUnderlying = underlying;
122127
}
123128

129+
public void setAlreadyImported() {
130+
this.isImported = true;
131+
}
124132
@Override
125133
public String toString() {
126134
return getName();
@@ -180,7 +188,7 @@ public Object[] getElements(Object parent) {
180188
}
181189
}
182190

183-
static class ImportPackageDialogLabelProvider extends LabelProvider {
191+
class ImportPackageDialogLabelProvider extends LabelProvider {
184192
@Override
185193
public Image getImage(Object element) {
186194
return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_PACKAGE);
@@ -201,6 +209,10 @@ public String getText(Object element) {
201209
buffer.append(' ');
202210
buffer.append(PDELabelProvider.formatVersion(version.toString()));
203211
}
212+
if (p.isAlreadyImported() && fHeader != null && fHeader.hasPackage(p.getName())) {
213+
buffer.append(' ');
214+
buffer.append(PDEUIMessages.PluginModelManager_alreadyImported);
215+
}
204216
return buffer.toString();
205217
}
206218
}
@@ -464,7 +476,8 @@ private void handleAdd() {
464476
Set<String> names = new HashSet<>(); // set of String names, do not allow the same package to be added twice
465477
for (int i = 0; i < selected.length; i++) {
466478
ImportPackageObject impObject = null;
467-
if (selected[i] instanceof ImportItemWrapper)
479+
if (selected[i] instanceof ImportItemWrapper
480+
&& !((ImportItemWrapper) selected[i]).isAlreadyImported())
468481
selected[i] = ((ImportItemWrapper) selected[i]).fUnderlying;
469482

470483
if (selected[i] instanceof ExportPackageDescription)
@@ -530,8 +543,14 @@ private void setElements(ConditionalListSelectionDialog dialog) {
530543
NameVersionDescriptor nameVersion = new NameVersionDescriptor(exportedPackage.getName(), exportedPackage.getVersion().toString(), NameVersionDescriptor.TYPE_PACKAGE);
531544
if (("java".equals(name) || name.startsWith("java.")) && !allowJava) //$NON-NLS-1$ //$NON-NLS-2$
532545
continue;
533-
if (nameVersions.add(nameVersion) && (fHeader == null || !fHeader.hasPackage(name)))
534-
elements.add(new ImportItemWrapper(exportedPackage));
546+
if (nameVersions.add(nameVersion)) {
547+
ImportItemWrapper importItemWrapper = new ImportItemWrapper(exportedPackage);
548+
elements.add(importItemWrapper);
549+
if (fHeader != null && fHeader.hasPackage(name)) {
550+
importItemWrapper.setAlreadyImported();
551+
}
552+
}
553+
535554
}
536555
IPluginModelBase model = (IPluginModelBase) getPage().getPDEEditor().getAggregateModel();
537556
if (model instanceof IBundlePluginModelBase) {
@@ -544,8 +563,13 @@ private void setElements(ConditionalListSelectionDialog dialog) {
544563
String name = pkg.getName();
545564
String version = pkg.getVersion();
546565
NameVersionDescriptor nameVersion = new NameVersionDescriptor(name, version, NameVersionDescriptor.TYPE_PACKAGE);
547-
if (nameVersions.add(nameVersion) && (fHeader == null || !fHeader.hasPackage(name)))
548-
elements.add(new ImportItemWrapper(pkg));
566+
if (nameVersions.add(nameVersion)) {
567+
ImportItemWrapper importItemWrapper = new ImportItemWrapper(pkg);
568+
elements.add(importItemWrapper);
569+
if (fHeader != null && fHeader.hasPackage(name)) {
570+
importItemWrapper.setAlreadyImported();
571+
}
572+
}
549573
}
550574
}
551575
}

0 commit comments

Comments
 (0)