Skip to content

Commit 6d51a60

Browse files
committed
Packages/bundles that are already imported/added are shown
Fixes #146
1 parent 214071f commit 6d51a60

File tree

10 files changed

+188
-40
lines changed

10 files changed

+188
-40
lines changed

ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/util/PDEJavaHelper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ public static HashMap<String, IPackageFragment> getPackageFragmentsHash2(IJavaPr
363363
if (name.length() == 0) {
364364
name = "."; //$NON-NLS-1$
365365
}
366-
if ((fragment.hasChildren() || fragment.getNonJavaResources().length > 0) && !existingPackages.contains(name)) {
366+
if ((fragment.hasChildren() || fragment.getNonJavaResources().length > 0)) {
367367
if (!name.equals("java") || !name.startsWith("java.") || allowJava) { //$NON-NLS-1$ //$NON-NLS-2$
368368
map.put(fragment.getPath().makeRelative() + "_" + fragment.getElementName(), fragment); //$NON-NLS-1$
369369
}

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

+18
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,14 @@ 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,
215+
false);
216+
if (existingImports.get(pluginBase.getId()) != null && existingImports.get(pluginBase.getId())) {
217+
text += " " + PDEUIMessages.PluginModelManager_alreadyAddedViaReexport; //$NON-NLS-1$
218+
} else if (existingImports.get(pluginBase.getId()) != null && !existingImports.get(pluginBase.getId())) {
219+
text += " " + PDEUIMessages.PluginModelManager_alreadyAdded; //$NON-NLS-1$
220+
}
206221
return text;
207222
}
208223

@@ -951,4 +966,7 @@ public static String formatVersion(String versionRange) {
951966
return versionRange;
952967
}
953968

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

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

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

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

3038
public static String AbstractLauncherToolbar_noSelection;

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

+38-13
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.osgi.service.resolver.VersionRange;
3131
import org.eclipse.pde.core.plugin.IFragment;
@@ -43,6 +43,7 @@
4343
import org.eclipse.pde.internal.ui.IHelpContextIds;
4444
import org.eclipse.pde.internal.ui.PDEPlugin;
4545
import org.eclipse.pde.internal.ui.PDEUIMessages;
46+
import org.eclipse.swt.widgets.Button;
4647
import org.eclipse.swt.widgets.Composite;
4748
import org.eclipse.swt.widgets.Control;
4849
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;
@@ -220,7 +227,7 @@ private static void addImportedPackages(IBundlePluginModelBase base, HashSet<Str
220227
continue;
221228
}
222229
}
223-
existingImports.add(exported[i].getSupplier().getSymbolicName());
230+
existingImports.put(exported[i].getSupplier().getSymbolicName(), false);
224231
}
225232
}
226233
}
@@ -297,4 +304,22 @@ protected void createButtonsForButtonBar(Composite parent) {
297304
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
298305
}
299306

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

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

+23-2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.eclipse.core.resources.IProject;
2828
import org.eclipse.core.resources.IResource;
2929
import org.eclipse.core.runtime.CoreException;
30+
import org.eclipse.jdt.core.IJavaElement;
3031
import org.eclipse.jdt.core.IJavaProject;
3132
import org.eclipse.jdt.core.IPackageFragment;
3233
import org.eclipse.jdt.core.JavaCore;
@@ -42,6 +43,7 @@
4243
import org.eclipse.jface.viewers.ISelection;
4344
import org.eclipse.jface.viewers.IStructuredContentProvider;
4445
import org.eclipse.jface.viewers.IStructuredSelection;
46+
import org.eclipse.jface.viewers.LabelProvider;
4547
import org.eclipse.jface.viewers.StructuredSelection;
4648
import org.eclipse.jface.viewers.TableViewer;
4749
import org.eclipse.jface.viewers.Viewer;
@@ -408,8 +410,8 @@ private void handleAdd() {
408410
final IProject project = model.getUnderlyingResource().getProject();
409411
try {
410412
if (project.hasNature(JavaCore.NATURE_ID)) {
411-
ILabelProvider labelProvider = new JavaElementLabelProvider();
412-
final ConditionalListSelectionDialog dialog = new ConditionalListSelectionDialog(PDEPlugin.getActiveWorkbenchShell(), labelProvider, PDEUIMessages.ExportPackageSection_dialogButtonLabel);
413+
ILabelProvider labelProvider = new ExportPackgeLabelProvider();
414+
final ConditionalListSelectionDialog dialog = new ConditionalListSelectionDialog(PDEPlugin.getActiveWorkbenchShell(), labelProvider, PDEUIMessages.ExportPackageSection_dialogButtonLabel, fHeader);
413415
final Collection<String> pckgs = fHeader == null ? Collections.emptySet() : fHeader.getPackageNames();
414416
final boolean allowJava = "true".equals(getBundle().getHeader(ICoreConstants.ECLIPSE_JREBUNDLE)); //$NON-NLS-1$
415417
Runnable runnable = () -> {
@@ -441,6 +443,7 @@ private void handleAdd() {
441443
if (fHeader != null) {
442444
for (Object selectedObject : selected) {
443445
IPackageFragment candidate = (IPackageFragment) selectedObject;
446+
if (!fHeader.getPackageNames().contains(candidate.getElementName()))
444447
fHeader.addPackage(new ExportPackageObject(fHeader, candidate, getVersionAttribute()));
445448
}
446449
} else {
@@ -626,4 +629,22 @@ private void calculateUses() {
626629
Action action = new CalculateUsesAction(proj, (IBundlePluginModelBase) getPage().getModel());
627630
action.run();
628631
}
632+
633+
class ExportPackgeLabelProvider extends LabelProvider {
634+
JavaElementLabelProvider javaElementLabel = new JavaElementLabelProvider();
635+
@Override
636+
public String getText(Object element) {
637+
638+
if (element instanceof IJavaElement javaElement) {
639+
String text = javaElementLabel.getText(javaElement);
640+
final Collection<String> pckgs = fHeader == null ? Collections.emptySet() : fHeader.getPackageNames();
641+
if (!pckgs.isEmpty() && pckgs.contains(text)) {
642+
return text + " " + PDEUIMessages.PluginModelManager_alreadyExported; //$NON-NLS-1$
643+
}
644+
645+
}
646+
return javaElementLabel.getText(element);
647+
}
648+
}
649+
629650
}

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)