diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/TargetPlatformHelper.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/TargetPlatformHelper.java index 20ba0f1f1d..495bb48121 100644 --- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/TargetPlatformHelper.java +++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/TargetPlatformHelper.java @@ -25,6 +25,7 @@ import java.util.Collection; import java.util.Dictionary; import java.util.HashMap; +import java.util.HashSet; import java.util.Hashtable; import java.util.LinkedHashMap; import java.util.List; @@ -296,27 +297,44 @@ private static boolean containsNotEmptyIULocation(ITargetLocation[] locations) { } public static Set getApplicationNameSet() { + return getApplicationNameSet(java.util.Collections.emptySet()); + } + + public static Set getApplicationNameSet(Set productBundleNames) { TreeSet result = new TreeSet<>(); IExtension[] extensions = PDECore.getDefault().getExtensionsRegistry() .findExtensions("org.eclipse.core.runtime.applications", true); //$NON-NLS-1$ + + final boolean toFilter = !productBundleNames.isEmpty(); + for (IExtension extension : extensions) { String id = extension.getUniqueIdentifier(); IConfigurationElement[] elements = extension.getConfigurationElements(); if (elements.length != 1) { continue; } + String contributorId = elements[0].getContributor().getName(); + + if (toFilter) { + if (!productBundleNames.contains(contributorId)) { + continue; + } + } + String visiblity = elements[0].getAttribute("visible"); //$NON-NLS-1$ boolean visible = visiblity == null || Boolean.parseBoolean(visiblity); if (id != null && visible) { result.add(id); } + } result.add("org.eclipse.ui.ide.workbench"); //$NON-NLS-1$ return result; } public static String[] getApplicationNames() { - Set result = getApplicationNameSet(); + Set productBundleNames = new HashSet<>(); + Set result = getApplicationNameSet(productBundleNames); return result.toArray(new String[result.size()]); } diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/product/ProductInfoSection.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/product/ProductInfoSection.java index b122c6dd48..2541c39895 100644 --- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/product/ProductInfoSection.java +++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/product/ProductInfoSection.java @@ -20,8 +20,11 @@ import static org.eclipse.pde.internal.core.iproduct.IProduct.ProductType.MIXED; import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionDelta; import org.eclipse.core.runtime.IRegistryChangeEvent; @@ -29,13 +32,16 @@ import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.osgi.service.resolver.BundleDescription; import org.eclipse.osgi.service.resolver.State; import org.eclipse.osgi.service.resolver.StateDelta; import org.eclipse.pde.core.IModelChangedEvent; +import org.eclipse.pde.core.plugin.IPluginModelBase; import org.eclipse.pde.core.plugin.TargetPlatform; import org.eclipse.pde.internal.build.IPDEBuildConstants; import org.eclipse.pde.internal.core.IStateDeltaListener; import org.eclipse.pde.internal.core.PDECore; +import org.eclipse.pde.internal.core.TargetPlatformHelper; import org.eclipse.pde.internal.core.iproduct.IProduct; import org.eclipse.pde.internal.core.iproduct.IProduct.ProductType; import org.eclipse.pde.internal.core.iproduct.IProductModel; @@ -44,6 +50,7 @@ import org.eclipse.pde.internal.ui.editor.FormLayoutFactory; import org.eclipse.pde.internal.ui.editor.PDEFormPage; import org.eclipse.pde.internal.ui.editor.PDESection; +import org.eclipse.pde.internal.ui.launcher.LaunchAction; import org.eclipse.pde.internal.ui.parts.ComboPart; import org.eclipse.pde.internal.ui.wizards.product.ProductDefinitionWizard; import org.eclipse.swt.SWT; @@ -258,12 +265,34 @@ private void createApplicationEntry(Composite client, FormToolkit toolkit) { label.setToolTipText(PDEUIMessages.ProductInfoSection_appTooltip); label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); + IProduct products = getProduct(); + Set models = null; + try { + models = LaunchAction.getLaunchedBundlesForProduct(products); + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + if (models == null) { + models = java.util.Collections.emptySet(); // <-- tiny null guard + } + + Set productBundleSymbolicNames = new HashSet<>(); + for (IPluginModelBase model : models) { + BundleDescription desc = model.getBundleDescription(); + if (desc != null && desc.getSymbolicName() != null) { + String symbolicName = desc.getSymbolicName(); + productBundleSymbolicNames.add(symbolicName); + } + } fAppCombo = new ExtensionIdComboPart(); fAppCombo.createControl(client, toolkit, SWT.READ_ONLY); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = NUM_COLUMNS - 1; fAppCombo.getControl().setLayoutData(gd); - fAppCombo.setItems(TargetPlatform.getApplications()); + Set filteredApps = TargetPlatformHelper.getApplicationNameSet(productBundleSymbolicNames); + fAppCombo.setItems(filteredApps.toArray(new String[0])); fAppCombo.add(""); //$NON-NLS-1$ fAppCombo.addSelectionListener( widgetSelectedAdapter(e -> getProduct().setApplication(fAppCombo.getSelection())));