1 /*******************************************************************************
2  * Copyright (c) 2005, 2016 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *     EclipseSource Corporation - ongoing enhancements
14  *     Martin Karpisek <martin.karpisek@gmail.com> - Bug 507831
15  *******************************************************************************/
16 package org.eclipse.pde.internal.ui.wizards.product;
17 
18 import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
19 
20 import java.util.ArrayList;
21 import org.eclipse.core.resources.IProject;
22 import org.eclipse.core.resources.IResource;
23 import org.eclipse.core.runtime.CoreException;
24 import org.eclipse.core.runtime.IAdaptable;
25 import org.eclipse.debug.core.*;
26 import org.eclipse.debug.ui.DebugUITools;
27 import org.eclipse.jface.dialogs.Dialog;
28 import org.eclipse.jface.viewers.IStructuredSelection;
29 import org.eclipse.pde.core.plugin.*;
30 import org.eclipse.pde.internal.ui.*;
31 import org.eclipse.pde.internal.ui.wizards.PDEWizardNewFileCreationPage;
32 import org.eclipse.pde.launching.IPDELauncherConstants;
33 import org.eclipse.pde.ui.launcher.EclipseLaunchShortcut;
34 import org.eclipse.swt.SWT;
35 import org.eclipse.swt.layout.GridData;
36 import org.eclipse.swt.layout.GridLayout;
37 import org.eclipse.swt.widgets.*;
38 import org.eclipse.ui.PlatformUI;
39 
40 public class ProductFileWizardPage extends PDEWizardNewFileCreationPage {
41 
42 	public final static int USE_DEFAULT = 0;
43 	public final static int USE_PRODUCT = 1;
44 	public final static int USE_LAUNCH_CONFIG = 2;
45 
46 	private static final String F_FILE_EXTENSION = "product"; //$NON-NLS-1$
47 
48 	private Button fBasicButton;
49 	private Button fProductButton;
50 	private Combo fProductCombo;
51 	private Button fLaunchConfigButton;
52 	private Combo fLaunchConfigCombo;
53 	private Group fGroup;
54 
55 	private IPluginModelBase fModel;
56 
ProductFileWizardPage(String pageName, IStructuredSelection selection)57 	public ProductFileWizardPage(String pageName, IStructuredSelection selection) {
58 		super(pageName, selection);
59 		setDescription(PDEUIMessages.ProductFileWizadPage_title);
60 		setTitle(PDEUIMessages.NewProductFileWizard_title);
61 		// Force the file extension to be 'product'
62 		setFileExtension(F_FILE_EXTENSION);
63 
64 		initializeModel(selection);
65 	}
66 
initializeModel(IStructuredSelection selection)67 	private void initializeModel(IStructuredSelection selection) {
68 		Object selected = selection.getFirstElement();
69 		if (selected instanceof IAdaptable) {
70 			IResource resource = ((IAdaptable) selected).getAdapter(IResource.class);
71 			if (resource != null) {
72 				IProject project = resource.getProject();
73 				fModel = PluginRegistry.findModel(project);
74 			}
75 		}
76 	}
77 
78 	@Override
createAdvancedControls(Composite parent)79 	protected void createAdvancedControls(Composite parent) {
80 		fGroup = new Group(parent, SWT.NONE);
81 		fGroup.setText(PDEUIMessages.ProductFileWizadPage_groupTitle);
82 		fGroup.setLayout(new GridLayout(2, false));
83 		fGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
84 
85 		fBasicButton = new Button(fGroup, SWT.RADIO);
86 		GridData gd = new GridData();
87 		gd.horizontalSpan = 2;
88 		fBasicButton.setLayoutData(gd);
89 		fBasicButton.setText(PDEUIMessages.ProductFileWizadPage_basic);
90 
91 		fProductButton = new Button(fGroup, SWT.RADIO);
92 		fProductButton.setText(PDEUIMessages.ProductFileWizadPage_existingProduct);
93 		fProductButton.addSelectionListener(widgetSelectedAdapter(e -> fProductCombo.setEnabled(fProductButton.getSelection())));
94 
95 		fProductCombo = new Combo(fGroup, SWT.SINGLE | SWT.READ_ONLY);
96 		fProductCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
97 		fProductCombo.setItems(TargetPlatform.getProducts());
98 
99 		fLaunchConfigButton = new Button(fGroup, SWT.RADIO);
100 		fLaunchConfigButton.setText(PDEUIMessages.ProductFileWizadPage_existingLaunchConfig);
101 		fLaunchConfigButton.addSelectionListener(widgetSelectedAdapter(e -> fLaunchConfigCombo.setEnabled(fLaunchConfigButton.getSelection())));
102 
103 		fLaunchConfigCombo = new Combo(fGroup, SWT.SINGLE | SWT.READ_ONLY);
104 		fLaunchConfigCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
105 		fLaunchConfigCombo.setItems(getLaunchConfigurations());
106 
107 		initializeState();
108 	}
109 
initializeState()110 	private void initializeState() {
111 		fLaunchConfigCombo.setEnabled(false);
112 		if (fLaunchConfigCombo.getItemCount() > 0)
113 			fLaunchConfigCombo.setText(fLaunchConfigCombo.getItem(0));
114 
115 		if (fModel != null && fModel.getPluginBase().getId() != null) {
116 			IPluginExtension[] extensions = fModel.getPluginBase().getExtensions();
117 			for (IPluginExtension extension : extensions) {
118 				String point = extension.getPoint();
119 				if ("org.eclipse.core.runtime.products".equals(point)) { //$NON-NLS-1$
120 					String id = extension.getId();
121 					if (id != null) {
122 						String full = fModel.getPluginBase().getId() + "." + id; //$NON-NLS-1$
123 						if (fProductCombo.indexOf(full) != -1) {
124 							fProductCombo.setText(full);
125 							fProductButton.setSelection(true);
126 							return;
127 						}
128 					}
129 				}
130 			}
131 		}
132 
133 		fBasicButton.setSelection(true);
134 
135 		fProductCombo.setEnabled(false);
136 		if (fProductCombo.getItemCount() > 0)
137 			fProductCombo.setText(fProductCombo.getItem(0));
138 
139 	}
140 
getLaunchConfigurations()141 	private String[] getLaunchConfigurations() {
142 		ArrayList<String> list = new ArrayList<>();
143 		try {
144 			ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
145 			ILaunchConfigurationType type = manager.getLaunchConfigurationType(EclipseLaunchShortcut.CONFIGURATION_TYPE);
146 			ILaunchConfiguration[] configs = manager.getLaunchConfigurations(type);
147 			for (int i = 0; i < configs.length; i++) {
148 				if (!DebugUITools.isPrivate(configs[i]))
149 					list.add(configs[i].getName());
150 			}
151 			// add osgi launch configs to the list
152 			type = manager.getLaunchConfigurationType(IPDELauncherConstants.OSGI_CONFIGURATION_TYPE);
153 			configs = manager.getLaunchConfigurations(type);
154 			for (int i = 0; i < configs.length; i++) {
155 				if (!DebugUITools.isPrivate(configs[i]))
156 					list.add(configs[i].getName());
157 			}
158 		} catch (CoreException e) {
159 			PDEPlugin.logException(e);
160 		}
161 		return list.toArray(new String[list.size()]);
162 	}
163 
getSelectedLaunchConfiguration()164 	public ILaunchConfiguration getSelectedLaunchConfiguration() {
165 		if (!fLaunchConfigButton.getSelection())
166 			return null;
167 
168 		String configName = fLaunchConfigCombo.getText();
169 		try {
170 			ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
171 			ILaunchConfigurationType type = manager.getLaunchConfigurationType(EclipseLaunchShortcut.CONFIGURATION_TYPE);
172 			ILaunchConfigurationType type2 = manager.getLaunchConfigurationType(IPDELauncherConstants.OSGI_CONFIGURATION_TYPE);
173 			ILaunchConfiguration[] configs = manager.getLaunchConfigurations(type);
174 			ILaunchConfiguration[] configs2 = manager.getLaunchConfigurations(type2);
175 			ILaunchConfiguration[] configurations = new ILaunchConfiguration[configs.length + configs2.length];
176 			System.arraycopy(configs, 0, configurations, 0, configs.length);
177 			System.arraycopy(configs2, 0, configurations, configs.length, configs2.length);
178 			for (int i = 0; i < configurations.length; i++) {
179 				if (configurations[i].getName().equals(configName) && !DebugUITools.isPrivate(configurations[i]))
180 					return configurations[i];
181 			}
182 		} catch (CoreException e) {
183 			PDEPlugin.logException(e);
184 		}
185 		return null;
186 	}
187 
getSelectedProduct()188 	public String getSelectedProduct() {
189 		return fProductButton.getSelection() ? fProductCombo.getText() : null;
190 	}
191 
getInitializationOption()192 	public int getInitializationOption() {
193 		if (fBasicButton.getSelection())
194 			return USE_DEFAULT;
195 		if (fProductButton.getSelection())
196 			return USE_PRODUCT;
197 		return USE_LAUNCH_CONFIG;
198 	}
199 
200 	@Override
createControl(Composite parent)201 	public void createControl(Composite parent) {
202 		super.createControl(parent);
203 		Dialog.applyDialogFont(fGroup);
204 
205 		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IHelpContextIds.PRODUCT_FILE_PAGE);
206 	}
207 
208 }
209