Skip to content

Commit 204c26f

Browse files
committed
Packages/bundles that are already imported/added are shown
Fixes #146
1 parent b29e97a commit 204c26f

File tree

5 files changed

+120
-26
lines changed

5 files changed

+120
-26
lines changed

Diff for: 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
}

Diff for: 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
}

Diff for: ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/plugin/RequiresSection.java

+21-13
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
import java.io.ByteArrayInputStream;
2121
import java.io.InputStream;
2222
import java.util.ArrayList;
23+
import java.util.HashMap;
2324
import java.util.Iterator;
24-
import java.util.Set;
25+
import java.util.List;
26+
import java.util.Map;
2527
import java.util.Vector;
2628

2729
import org.eclipse.core.runtime.CoreException;
@@ -288,7 +290,7 @@ public boolean doGlobalAction(String actionId) {
288290

289291
@Override
290292
protected boolean canPaste(Object targetObject, Object[] sourceObjects) {
291-
Set<String> existingImportsSet = null;
293+
Map<String, Boolean> existingImportsMap = null;
292294
// Only import objects that are not already existing imports can be
293295
// pasted
294296
for (Object sourceObject : sourceObjects) {
@@ -298,12 +300,12 @@ protected boolean canPaste(Object targetObject, Object[] sourceObjects) {
298300
}
299301
// Get the current import objects and store them for searching
300302
// purposes
301-
if (existingImportsSet == null) {
302-
existingImportsSet = PluginSelectionDialog.getExistingImports(getModel(), false);
303+
if (existingImportsMap == null) {
304+
existingImportsMap = PluginSelectionDialog.getExistingImports(getModel(), false);
303305
}
304306
// Only import object that do not exist are allowed
305307
ImportObject importObject = (ImportObject) sourceObject;
306-
if (existingImportsSet.contains(importObject.getImport().getId())) {
308+
if (existingImportsMap.keySet().contains(importObject.getImport().getId())) {
307309
return false;
308310
}
309311
}
@@ -427,21 +429,28 @@ else if (base instanceof PluginBaseNode)
427429

428430
private void handleAdd() {
429431
IPluginModelBase model = (IPluginModelBase) getPage().getModel();
430-
PluginSelectionDialog dialog = new PluginSelectionDialog(PDEPlugin.getActiveWorkbenchShell(), getAvailablePlugins(model), true);
432+
PluginSelectionDialog dialog = new PluginSelectionDialog(PDEPlugin.getActiveWorkbenchShell(), getAvailablePlugins(model), true, model);
431433
dialog.create();
432434
if (dialog.open() == Window.OK) {
433435
Object[] models = dialog.getResult();
434-
IPluginImport[] imports = new IPluginImport[models.length];
436+
List<IPluginImport> imports = new ArrayList<>();
437+
HashMap<String, Boolean> existingImports = PluginSelectionDialog.getExistingImports(model, false);
435438
try {
436439
for (int i = 0; i < models.length; i++) {
440+
if (!existingImports.keySet().contains(((IPluginModel) models[i]).getPluginBase().getId())) {
437441
IPluginModel candidate = (IPluginModel) models[i];
438442
String pluginId = candidate.getPlugin().getId();
439443
IPluginImport importNode = createImport(model.getPluginFactory(), pluginId);
440444
String version = VersionUtil.computeInitialPluginVersion(candidate.getPlugin().getVersion());
441445
importNode.setVersion(version);
442-
imports[i] = importNode;
446+
imports.add(importNode);
447+
}
448+
}
449+
if (imports.size() > 0) {
450+
IPluginImport[] pluginImports = new IPluginImport[imports.size()];
451+
pluginImports = imports.toArray(pluginImports);
452+
addImports(model.getPluginBase(), pluginImports);
443453
}
444-
addImports(model.getPluginBase(), imports);
445454
} catch (CoreException e) {
446455
}
447456
}
@@ -497,15 +506,14 @@ public void swap(int index1, int index2) {
497506

498507
private IPluginModelBase[] getAvailablePlugins(IPluginModelBase model) {
499508
IPluginModelBase[] plugins = PluginRegistry.getActiveModels(false);
500-
Set<String> existingImports = PluginSelectionDialog.getExistingImports(model, false);
509+
HashMap<String, Boolean> existingImports = PluginSelectionDialog.getExistingImports(model, false);
501510
ArrayList<IPluginModelBase> result = new ArrayList<>();
502511
for (int i = 0; i < plugins.length; i++) {
503-
if (!existingImports.contains(plugins[i].getPluginBase().getId())) {
512+
if (!getModel().getPluginBase().getId().equals(plugins[i].getPluginBase().getId()))
504513
result.add(plugins[i]);
505-
}
506514
}
507515

508-
if (!existingImports.contains("system.bundle")) //$NON-NLS-1$
516+
if (!existingImports.keySet().contains("system.bundle")) //$NON-NLS-1$
509517
addSystemBundle(result);
510518
return result.toArray(new IPluginModelBase[result.size()]);
511519
}

Diff for: ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/parts/ConditionalListSelectionDialog.java

+40
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@
1616
import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
1717

1818
import org.eclipse.core.runtime.Assert;
19+
import org.eclipse.core.runtime.IStatus;
1920
import org.eclipse.core.text.StringMatcher;
21+
import org.eclipse.jdt.core.IPackageFragment;
2022
import org.eclipse.jface.dialogs.IDialogConstants;
2123
import org.eclipse.jface.viewers.ILabelProvider;
24+
import org.eclipse.pde.internal.core.text.bundle.ExportPackageHeader;
2225
import org.eclipse.pde.internal.ui.PDEUIMessages;
26+
import org.eclipse.pde.internal.ui.editor.plugin.ImportPackageSection;
2327
import org.eclipse.swt.SWT;
2428
import org.eclipse.swt.widgets.Button;
2529
import org.eclipse.swt.widgets.Composite;
@@ -34,12 +38,19 @@ public class ConditionalListSelectionDialog extends ElementListSelectionDialog {
3438
private final String fButtonText;
3539
private Object[] fElements;
3640
private Object[] fConditionalElements;
41+
private ExportPackageHeader exportPackageHeader;
3742

3843
public ConditionalListSelectionDialog(Shell parent, ILabelProvider renderer, String buttonText) {
3944
super(parent, renderer);
4045
fButtonText = buttonText;
4146
}
4247

48+
public ConditionalListSelectionDialog(Shell activeWorkbenchShell, ILabelProvider labelProvider,
49+
String exportPackageSection_dialogButtonLabel, ExportPackageHeader fHeader) {
50+
this(activeWorkbenchShell, labelProvider, exportPackageSection_dialogButtonLabel);
51+
exportPackageHeader = fHeader;
52+
}
53+
4354
@Override
4455
protected Control createDialogArea(Composite parent) {
4556
Composite comp = (Composite) super.createDialogArea(parent);
@@ -62,6 +73,7 @@ protected Control createDialogArea(Composite parent) {
6273
else
6374
setListElements(fElements);
6475
}));
76+
button.setSelection(true);
6577
return comp;
6678
}
6779

@@ -111,4 +123,32 @@ protected void createButtonsForButtonBar(Composite parent) {
111123
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
112124
}
113125

126+
@Override
127+
protected void updateButtonsEnableState(IStatus status) {
128+
super.updateButtonsEnableState(status);
129+
Button okButton = getOkButton();
130+
Object[] currentSelection = fFilteredList.getSelection();
131+
if(currentSelection.length>0)
132+
okButton.setEnabled(false);
133+
for (Object selection : currentSelection) {
134+
if (selection instanceof ImportPackageSection.ImportItemWrapper) {
135+
if (!((ImportPackageSection.ImportItemWrapper) selection).isAlreadyImported()) {
136+
okButton.setEnabled(true);
137+
break;
138+
}
139+
}
140+
else if (selection instanceof IPackageFragment) {
141+
if (exportPackageHeader == null || exportPackageHeader.getPackageNames().isEmpty()) {
142+
okButton.setEnabled(true);
143+
break;
144+
}
145+
else if (!exportPackageHeader.getPackageNames()
146+
.contains(((IPackageFragment) selection).getElementName())) {
147+
okButton.setEnabled(true);
148+
break;
149+
}
150+
}
151+
}
152+
}
153+
114154
}

Diff for: ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/wizards/extension/PointSelectionPage.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import java.util.ArrayList;
2424
import java.util.Collections;
2525
import java.util.Locale;
26-
import java.util.Set;
26+
import java.util.Map;
2727
import java.util.regex.Pattern;
2828
import java.util.regex.PatternSyntaxException;
2929

@@ -122,7 +122,7 @@ public class PointSelectionPage extends BaseWizardSelectionPage {
122122
private final IPluginModelBase fModel;
123123
private Button fFilterCheck;
124124
private IPluginExtensionPoint fCurrentPoint;
125-
private final Set<String> fAvailableImports;
125+
private final Map<String, Boolean> fAvailableImports;
126126
private final IProject fProject;
127127
private Label fTemplateLabel;
128128
private ExtensionTreeSelectionPage fWizardsPage;
@@ -147,7 +147,7 @@ public boolean select(Viewer viewer, Object parentElement, Object element) {
147147
if (point instanceof PluginExtensionPointNode)
148148
return true;
149149

150-
return fAvailableImports.contains(point.getPluginBase().getId());
150+
return fAvailableImports.keySet().contains(point.getPluginBase().getId());
151151
}
152152
}
153153

@@ -511,7 +511,7 @@ public boolean finish() {
511511
}
512512

513513
String pluginID = fCurrentPoint.getPluginBase().getId();
514-
if (!(fCurrentPoint instanceof PluginExtensionPointNode) && !fAvailableImports.contains(pluginID) && !(fCurrentPoint.getPluginBase() instanceof IFragment)) {
514+
if (!(fCurrentPoint instanceof PluginExtensionPointNode) && !fAvailableImports.keySet().contains(pluginID) && !(fCurrentPoint.getPluginBase() instanceof IFragment)) {
515515
if (MessageDialog.openQuestion(getShell(), PDEUIMessages.NewExtensionWizard_PointSelectionPage_dependencyTitle, NLS.bind(PDEUIMessages.NewExtensionWizard_PointSelectionPage_dependencyMessage, new String[] {pluginID, fCurrentPoint.getId()}))) {
516516
IPluginImport importNode = fModel.getPluginFactory().createImport();
517517
importNode.setId(pluginID);

0 commit comments

Comments
 (0)