Removed
Link Here
|
1 |
/******************************************************************************* |
2 |
* Copyright (c) 2005, 2007 IBM Corporation and others. |
3 |
* All rights reserved. This program and the accompanying materials |
4 |
* are made available under the terms of the Eclipse Public License v1.0 |
5 |
* which accompanies this distribution, and is available at |
6 |
* http://www.eclipse.org/legal/epl-v10.html |
7 |
* |
8 |
* Contributors: |
9 |
* IBM Corporation - initial API and implementation |
10 |
* Bartosz Michalik <bartosz.michalik@gmail.com> - bug 187646 |
11 |
* Les Jones <lesojones@gmail.com> - bug 190717 |
12 |
*******************************************************************************/ |
13 |
package org.eclipse.pde.internal.ui.editor.target; |
14 |
|
15 |
import org.eclipse.pde.internal.ui.dialogs.FeatureSelectionDialog; |
16 |
|
17 |
import java.util.*; |
18 |
import org.eclipse.core.resources.IFile; |
19 |
import org.eclipse.core.resources.IProject; |
20 |
import org.eclipse.core.runtime.*; |
21 |
import org.eclipse.jdt.core.IJavaProject; |
22 |
import org.eclipse.jface.action.*; |
23 |
import org.eclipse.jface.viewers.*; |
24 |
import org.eclipse.jface.window.Window; |
25 |
import org.eclipse.osgi.service.resolver.BundleDescription; |
26 |
import org.eclipse.pde.core.IModelChangedEvent; |
27 |
import org.eclipse.pde.core.plugin.IPluginModelBase; |
28 |
import org.eclipse.pde.core.plugin.PluginRegistry; |
29 |
import org.eclipse.pde.internal.core.PDECore; |
30 |
import org.eclipse.pde.internal.core.TargetPlatformHelper; |
31 |
import org.eclipse.pde.internal.core.ifeature.IFeature; |
32 |
import org.eclipse.pde.internal.core.ifeature.IFeatureModel; |
33 |
import org.eclipse.pde.internal.core.itarget.*; |
34 |
import org.eclipse.pde.internal.core.plugin.ExternalPluginModelBase; |
35 |
import org.eclipse.pde.internal.ui.*; |
36 |
import org.eclipse.pde.internal.ui.editor.*; |
37 |
import org.eclipse.pde.internal.ui.editor.feature.FeatureEditor; |
38 |
import org.eclipse.pde.internal.ui.editor.plugin.ManifestEditor; |
39 |
import org.eclipse.pde.internal.ui.elements.DefaultTableProvider; |
40 |
import org.eclipse.pde.internal.ui.parts.ConditionalListSelectionDialog; |
41 |
import org.eclipse.pde.internal.ui.parts.TablePart; |
42 |
import org.eclipse.pde.internal.ui.search.dependencies.DependencyCalculator; |
43 |
import org.eclipse.pde.internal.ui.util.PersistablePluginObject; |
44 |
import org.eclipse.swt.SWT; |
45 |
import org.eclipse.swt.custom.CTabFolder; |
46 |
import org.eclipse.swt.custom.CTabItem; |
47 |
import org.eclipse.swt.events.SelectionAdapter; |
48 |
import org.eclipse.swt.events.SelectionEvent; |
49 |
import org.eclipse.swt.graphics.Color; |
50 |
import org.eclipse.swt.graphics.Image; |
51 |
import org.eclipse.swt.layout.GridData; |
52 |
import org.eclipse.swt.widgets.*; |
53 |
import org.eclipse.ui.*; |
54 |
import org.eclipse.ui.actions.ActionFactory; |
55 |
import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog; |
56 |
import org.eclipse.ui.forms.IFormColors; |
57 |
import org.eclipse.ui.forms.widgets.FormToolkit; |
58 |
import org.eclipse.ui.forms.widgets.Section; |
59 |
|
60 |
public class ContentSection extends TableSection { |
61 |
|
62 |
class ContentProvider extends DefaultTableProvider { |
63 |
public Object[] getElements(Object parent) { |
64 |
ITarget target = getTarget(); |
65 |
if (fLastTab == 0) |
66 |
return target.getPlugins(); |
67 |
return target.getFeatures(); |
68 |
} |
69 |
} |
70 |
|
71 |
private static final String[] TAB_LABELS = new String[2]; |
72 |
static { |
73 |
TAB_LABELS[0] = PDEUIMessages.ContentSection_plugins; |
74 |
TAB_LABELS[1] = PDEUIMessages.ContentSection_features; |
75 |
} |
76 |
|
77 |
private static final String[] BUTTONS = new String[5]; |
78 |
static { |
79 |
BUTTONS[0] = PDEUIMessages.ContentSection_add; |
80 |
BUTTONS[1] = PDEUIMessages.ContentSection_remove; |
81 |
BUTTONS[2] = PDEUIMessages.ContentSection_removeAll; |
82 |
BUTTONS[3] = PDEUIMessages.ContentSection_workingSet; |
83 |
BUTTONS[4] = PDEUIMessages.ContentSection_required; |
84 |
} |
85 |
|
86 |
private TableViewer fContentViewer; |
87 |
private CTabFolder fTabFolder; |
88 |
private int fLastTab; |
89 |
private Button fUseAllPlugins; |
90 |
private Button fUseSelectedPlugins; |
91 |
private Image[] fTabImages; |
92 |
private Button fIncludeOptionalButton; |
93 |
public static final QualifiedName OPTIONAL_PROPERTY = new QualifiedName(IPDEUIConstants.PLUGIN_ID, "target.includeOptional"); //$NON-NLS-1$ |
94 |
|
95 |
public ContentSection(PDEFormPage page, Composite parent) { |
96 |
super(page, parent, Section.DESCRIPTION, BUTTONS); |
97 |
} |
98 |
|
99 |
/* (non-Javadoc) |
100 |
* @see org.eclipse.pde.internal.ui.editor.PDESection#createClient(org.eclipse.ui.forms.widgets.Section, org.eclipse.ui.forms.widgets.FormToolkit) |
101 |
*/ |
102 |
protected void createClient(Section section, FormToolkit toolkit) { |
103 |
section.setLayout(FormLayoutFactory.createClearGridLayout(false, 1)); |
104 |
Composite client = toolkit.createComposite(section); |
105 |
client.setLayout(FormLayoutFactory.createSectionClientGridLayout(false, 2)); |
106 |
client.setLayoutData(new GridData(GridData.FILL_BOTH)); |
107 |
|
108 |
// create radio buttons |
109 |
SelectionAdapter radioListener = new SelectionAdapter() { |
110 |
public void widgetSelected(SelectionEvent e) { |
111 |
getTarget().setUseAllPlugins(fUseAllPlugins.getSelection()); |
112 |
} |
113 |
}; |
114 |
|
115 |
fUseAllPlugins = toolkit.createButton(client, PDEUIMessages.ContentSection_allTarget, SWT.RADIO); |
116 |
fUseAllPlugins.addSelectionListener(radioListener); |
117 |
GridData gd = new GridData(); |
118 |
gd.horizontalSpan = 2; |
119 |
fUseAllPlugins.setLayoutData(gd); |
120 |
|
121 |
fUseSelectedPlugins = toolkit.createButton(client, PDEUIMessages.ContentSection_selectedOnly, SWT.RADIO); |
122 |
gd = new GridData(); |
123 |
gd.horizontalSpan = 2; |
124 |
gd.verticalIndent = 5; |
125 |
fUseSelectedPlugins.setLayoutData(gd); |
126 |
|
127 |
// create tab folder widget |
128 |
fTabFolder = new CTabFolder(client, SWT.FLAT | SWT.TOP); |
129 |
gd = new GridData(GridData.FILL_HORIZONTAL); |
130 |
gd.heightHint = 2; |
131 |
gd.horizontalSpan = 2; |
132 |
gd.horizontalIndent = 15; |
133 |
fTabFolder.setLayoutData(gd); |
134 |
toolkit.adapt(fTabFolder, true, true); |
135 |
toolkit.getColors().initializeSectionToolBarColors(); |
136 |
Color selectedColor = toolkit.getColors().getColor(IFormColors.TB_BG); |
137 |
fTabFolder.setSelectionBackground(new Color[] {selectedColor, toolkit.getColors().getBackground()}, new int[] {100}, true); |
138 |
fTabFolder.addSelectionListener(new SelectionAdapter() { |
139 |
public void widgetSelected(SelectionEvent e) { |
140 |
refresh(); |
141 |
} |
142 |
}); |
143 |
|
144 |
createTabs(); |
145 |
|
146 |
// create table widget |
147 |
createViewerPartControl(client, SWT.MULTI, 2, toolkit); |
148 |
|
149 |
TablePart tablePart = getTablePart(); |
150 |
GridData data = (GridData) tablePart.getControl().getLayoutData(); |
151 |
data.grabExcessVerticalSpace = true; |
152 |
data.grabExcessHorizontalSpace = true; |
153 |
data.horizontalIndent = 15; |
154 |
fContentViewer = tablePart.getTableViewer(); |
155 |
fContentViewer.setContentProvider(new ContentProvider()); |
156 |
fContentViewer.setLabelProvider(PDEPlugin.getDefault().getLabelProvider()); |
157 |
fContentViewer.setComparator(new ViewerComparator() { |
158 |
public int compare(Viewer viewer, Object e1, Object e2) { |
159 |
if (e1 instanceof ITargetPlugin) { |
160 |
ITargetPlugin p1 = (ITargetPlugin) e1; |
161 |
ITargetPlugin p2 = (ITargetPlugin) e2; |
162 |
return super.compare(viewer, p1.getId(), p2.getId()); |
163 |
} // else |
164 |
ITargetFeature f1 = (ITargetFeature) e1; |
165 |
ITargetFeature f2 = (ITargetFeature) e2; |
166 |
return super.compare(viewer, f1.getId(), f2.getId()); |
167 |
} |
168 |
}); |
169 |
fContentViewer.setInput(PDECore.getDefault().getModelManager()); |
170 |
fContentViewer.addSelectionChangedListener(new ISelectionChangedListener() { |
171 |
public void selectionChanged(SelectionChangedEvent event) { |
172 |
updateEnablement(); |
173 |
} |
174 |
}); |
175 |
|
176 |
createOptionalDependenciesButton(client); |
177 |
|
178 |
toolkit.paintBordersFor(client); |
179 |
section.setClient(client); |
180 |
section.setText(PDEUIMessages.ContentSection_targetContent); |
181 |
section.setDescription(PDEUIMessages.ContentSection_targetContentDesc); |
182 |
section.setLayoutData(new GridData(GridData.FILL_BOTH)); |
183 |
updateEnablement(); |
184 |
getModel().addModelChangedListener(this); |
185 |
} |
186 |
|
187 |
private void createOptionalDependenciesButton(Composite client) { |
188 |
if (isEditable()) { |
189 |
fIncludeOptionalButton = new Button(client, SWT.CHECK); |
190 |
fIncludeOptionalButton.setText(PDEUIMessages.ContentSection_includeOptional); |
191 |
// initialize value |
192 |
IEditorInput input = getPage().getEditorInput(); |
193 |
if (input instanceof IFileEditorInput) { |
194 |
IFile file = ((IFileEditorInput) input).getFile(); |
195 |
try { |
196 |
fIncludeOptionalButton.setSelection("true".equals(file.getPersistentProperty(OPTIONAL_PROPERTY))); //$NON-NLS-1$ |
197 |
} catch (CoreException e) { |
198 |
} |
199 |
} |
200 |
fIncludeOptionalButton.setEnabled(!getTarget().useAllPlugins()); |
201 |
// create listener to save value when the checkbox is changed |
202 |
fIncludeOptionalButton.addSelectionListener(new SelectionAdapter() { |
203 |
public void widgetSelected(SelectionEvent e) { |
204 |
IEditorInput input = getPage().getEditorInput(); |
205 |
if (input instanceof IFileEditorInput) { |
206 |
IFile file = ((IFileEditorInput) input).getFile(); |
207 |
try { |
208 |
file.setPersistentProperty(OPTIONAL_PROPERTY, fIncludeOptionalButton.getSelection() ? "true" : null); //$NON-NLS-1$ |
209 |
} catch (CoreException e1) { |
210 |
} |
211 |
} |
212 |
} |
213 |
}); |
214 |
} |
215 |
} |
216 |
|
217 |
/* (non-Javadoc) |
218 |
* @see org.eclipse.pde.internal.ui.editor.StructuredViewerSection#buttonSelected(int) |
219 |
*/ |
220 |
protected void buttonSelected(int index) { |
221 |
switch (index) { |
222 |
case 0 : |
223 |
handleAdd(); |
224 |
break; |
225 |
case 1 : |
226 |
handleDelete(); |
227 |
break; |
228 |
case 2 : |
229 |
handleRemoveAll(); |
230 |
break; |
231 |
case 3 : |
232 |
handleAddWorkingSet(); |
233 |
break; |
234 |
case 4 : |
235 |
handleAddRequired(getTarget().getPlugins(), fIncludeOptionalButton.getSelection()); |
236 |
} |
237 |
} |
238 |
|
239 |
private void createTabs() { |
240 |
fTabImages = new Image[] {PDEPluginImages.DESC_PLUGIN_OBJ.createImage(), PDEPluginImages.DESC_FEATURE_OBJ.createImage()}; |
241 |
for (int i = 0; i < TAB_LABELS.length; i++) { |
242 |
CTabItem item = new CTabItem(fTabFolder, SWT.NULL); |
243 |
item.setText(TAB_LABELS[i]); |
244 |
item.setImage(fTabImages[i]); |
245 |
} |
246 |
fLastTab = 0; |
247 |
fTabFolder.setSelection(fLastTab); |
248 |
} |
249 |
|
250 |
/* (non-Javadoc) |
251 |
* @see org.eclipse.ui.forms.AbstractFormPart#refresh() |
252 |
*/ |
253 |
public void refresh() { |
254 |
fLastTab = fTabFolder.getSelectionIndex(); |
255 |
fContentViewer.refresh(); |
256 |
updateEnablement(); |
257 |
super.refresh(); |
258 |
} |
259 |
|
260 |
protected void updateEnablement() { |
261 |
boolean useAllPlugins = getTarget().useAllPlugins(); |
262 |
fUseAllPlugins.setSelection(useAllPlugins); |
263 |
fUseSelectedPlugins.setSelection(!useAllPlugins); |
264 |
TablePart table = getTablePart(); |
265 |
boolean itemsSelected = !fContentViewer.getSelection().isEmpty(); |
266 |
boolean hasItems = fContentViewer.getTable().getItemCount() > 0; |
267 |
table.setEnabled(!useAllPlugins); |
268 |
table.setButtonEnabled(0, isEditable() && !useAllPlugins); |
269 |
table.setButtonEnabled(1, isEditable() && !useAllPlugins && itemsSelected); |
270 |
table.setButtonEnabled(2, isEditable() && !useAllPlugins && hasItems); |
271 |
boolean pluginTab = (fLastTab == 0); |
272 |
table.setButtonEnabled(3, isEditable() && pluginTab && !useAllPlugins); |
273 |
table.setButtonEnabled(4, isEditable() && pluginTab && !useAllPlugins && hasItems); |
274 |
|
275 |
// Fix for defect 190717 |
276 |
// Only show the working set and required buttons on the plugin tab |
277 |
// (retaining the existing enablement logic in the rare case the |
278 |
// platform doesn't support control.visible=false; I can't imagine |
279 |
// how this would happen, but better to be safe?) |
280 |
table.setButtonVisible(3, pluginTab); |
281 |
table.setButtonVisible(4, pluginTab); |
282 |
|
283 |
} |
284 |
|
285 |
protected boolean canPaste(Object target, Object[] objects) { |
286 |
for (int i = 0; i < objects.length; i++) { |
287 |
if (objects[i] instanceof ITargetPlugin && fLastTab == 0 || objects[i] instanceof ITargetFeature && fLastTab == 1) |
288 |
return true; |
289 |
} |
290 |
return false; |
291 |
} |
292 |
|
293 |
private ITarget getTarget() { |
294 |
return getModel().getTarget(); |
295 |
} |
296 |
|
297 |
private ITargetModel getModel() { |
298 |
return (ITargetModel) getPage().getPDEEditor().getAggregateModel(); |
299 |
} |
300 |
|
301 |
private void handleAdd() { |
302 |
if (fLastTab == 0) |
303 |
handleAddPlugin(); |
304 |
else |
305 |
handleAddFeature(); |
306 |
updateEnablement(); |
307 |
} |
308 |
|
309 |
private void handleAddPlugin() { |
310 |
ConditionalListSelectionDialog dialog = new ConditionalListSelectionDialog(PDEPlugin.getActiveWorkbenchShell(), PDEPlugin.getDefault().getLabelProvider(), PDEUIMessages.ContentSection_addDialogButtonLabel); |
311 |
|
312 |
TreeMap map = getBundles(); |
313 |
dialog.setElements(map.values().toArray()); |
314 |
dialog.setConditionalElements(getWorkspaceBundles(map).values().toArray()); |
315 |
dialog.setTitle(PDEUIMessages.PluginSelectionDialog_title); |
316 |
dialog.setMessage(PDEUIMessages.PluginSelectionDialog_message); |
317 |
dialog.setMultipleSelection(true); |
318 |
dialog.create(); |
319 |
PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(), IHelpContextIds.PLUGIN_SELECTION); |
320 |
if (dialog.open() == Window.OK) { |
321 |
Object[] bundles = dialog.getResult(); |
322 |
ITarget target = getTarget(); |
323 |
ITargetModelFactory factory = getModel().getFactory(); |
324 |
ITargetPlugin[] plugins = new ITargetPlugin[bundles.length]; |
325 |
for (int i = 0; i < bundles.length; i++) { |
326 |
String id = ((BundleDescription) bundles[i]).getSymbolicName(); |
327 |
ITargetPlugin plugin = factory.createPlugin(); |
328 |
plugin.setId(id); |
329 |
plugins[i] = plugin; |
330 |
} |
331 |
target.addPlugins(plugins); |
332 |
fContentViewer.setSelection(new StructuredSelection(plugins[plugins.length - 1])); |
333 |
} |
334 |
} |
335 |
|
336 |
private TreeMap getBundles() { |
337 |
TreeMap map = new TreeMap(); |
338 |
ITarget target = getTarget(); |
339 |
IPluginModelBase[] models = PluginRegistry.getExternalModels(); |
340 |
for (int i = 0; i < models.length; i++) { |
341 |
BundleDescription desc = ((ExternalPluginModelBase) models[i]).getBundleDescription(); |
342 |
String id = desc.getSymbolicName(); |
343 |
if (!target.containsPlugin(id)) |
344 |
map.put(id, desc); |
345 |
} |
346 |
return map; |
347 |
} |
348 |
|
349 |
protected TreeMap getWorkspaceBundles(TreeMap used) { |
350 |
TreeMap map = new TreeMap(); |
351 |
ITarget target = getTarget(); |
352 |
IPluginModelBase[] models = PluginRegistry.getWorkspaceModels(); |
353 |
for (int i = 0; i < models.length; i++) { |
354 |
BundleDescription desc = models[i].getBundleDescription(); |
355 |
String id = desc.getSymbolicName(); |
356 |
if (id != null && !target.containsPlugin(id) && !used.containsKey(id)) |
357 |
map.put(id, desc); |
358 |
} |
359 |
return map; |
360 |
} |
361 |
|
362 |
private void handleAddFeature() { |
363 |
IFeatureModel[] allModels = PDECore.getDefault().getFeatureModelManager().getModels(); |
364 |
ArrayList newModels = new ArrayList(); |
365 |
ITarget target = getTarget(); |
366 |
for (int i = 0; i < allModels.length; i++) { |
367 |
if (!target.containsFeature(allModels[i].getFeature().getId())) |
368 |
newModels.add(allModels[i]); |
369 |
} |
370 |
IFeatureModel[] candidateModels = (IFeatureModel[]) newModels.toArray(new IFeatureModel[newModels.size()]); |
371 |
FeatureSelectionDialog dialog = new FeatureSelectionDialog(getSection().getShell(), candidateModels, true); |
372 |
if (dialog.open() == Window.OK) { |
373 |
Object[] models = dialog.getResult(); |
374 |
ITargetModelFactory factory = getModel().getFactory(); |
375 |
ITargetFeature[] features = new ITargetFeature[models.length]; |
376 |
for (int i = 0; i < models.length; ++i) { |
377 |
IFeature feature = ((IFeatureModel) models[i]).getFeature(); |
378 |
String id = feature.getId(); |
379 |
ITargetFeature tfeature = factory.createFeature(); |
380 |
tfeature.setId(id); |
381 |
features[i] = tfeature; |
382 |
} |
383 |
target.addFeatures(features); |
384 |
fContentViewer.setSelection(new StructuredSelection(features[features.length - 1])); |
385 |
} |
386 |
} |
387 |
|
388 |
private void handleDelete() { |
389 |
IStructuredSelection ssel = (IStructuredSelection) fContentViewer.getSelection(); |
390 |
if (ssel.size() > 0) { |
391 |
Object[] objects = ssel.toArray(); |
392 |
ITarget target = getTarget(); |
393 |
if (fLastTab == 0) { |
394 |
ITargetPlugin[] plugins = new ITargetPlugin[objects.length]; |
395 |
System.arraycopy(objects, 0, plugins, 0, objects.length); |
396 |
target.removePlugins(plugins); |
397 |
} else { |
398 |
ITargetFeature[] features = new ITargetFeature[objects.length]; |
399 |
System.arraycopy(objects, 0, features, 0, objects.length); |
400 |
target.removeFeatures(features); |
401 |
} |
402 |
} |
403 |
updateEnablement(); |
404 |
} |
405 |
|
406 |
private void handleRemoveAll() { |
407 |
TableItem[] items = fContentViewer.getTable().getItems(); |
408 |
ITarget target = getTarget(); |
409 |
if (fLastTab == 0) { |
410 |
ITargetPlugin[] plugins = new ITargetPlugin[items.length]; |
411 |
for (int i = 0; i < plugins.length; i++) |
412 |
plugins[i] = (ITargetPlugin) items[i].getData(); |
413 |
target.removePlugins(plugins); |
414 |
} else { |
415 |
ITargetFeature[] features = new ITargetFeature[items.length]; |
416 |
for (int i = 0; i < features.length; i++) |
417 |
features[i] = (ITargetFeature) items[i].getData(); |
418 |
target.removeFeatures(features); |
419 |
} |
420 |
updateEnablement(); |
421 |
} |
422 |
|
423 |
/* (non-Javadoc) |
424 |
* @see org.eclipse.pde.internal.ui.editor.TableSection#handleDoubleClick(org.eclipse.jface.viewers.IStructuredSelection) |
425 |
*/ |
426 |
protected void handleDoubleClick(IStructuredSelection selection) { |
427 |
handleOpen(selection); |
428 |
} |
429 |
|
430 |
private void handleOpen(IStructuredSelection selection) { |
431 |
Object object = selection.getFirstElement(); |
432 |
if (object instanceof ITargetPlugin) { |
433 |
ManifestEditor.openPluginEditor(((ITargetPlugin) object).getId()); |
434 |
} else if (object instanceof ITargetFeature) { |
435 |
handleOpenFeature((ITargetFeature) object); |
436 |
} |
437 |
} |
438 |
|
439 |
private void handleOpenFeature(ITargetFeature feature) { |
440 |
IFeatureModel model = PDECore.getDefault().getFeatureModelManager().findFeatureModel(feature.getId()); |
441 |
FeatureEditor.openFeatureEditor(model); |
442 |
} |
443 |
|
444 |
private void handleAddWorkingSet() { |
445 |
IWorkingSetManager manager = PlatformUI.getWorkbench().getWorkingSetManager(); |
446 |
IWorkingSetSelectionDialog dialog = manager.createWorkingSetSelectionDialog(PDEPlugin.getActiveWorkbenchShell(), true); |
447 |
if (dialog.open() == Window.OK) { |
448 |
IWorkingSet[] workingSets = dialog.getSelection(); |
449 |
ITarget target = getTarget(); |
450 |
ITargetModelFactory factory = target.getModel().getFactory(); |
451 |
HashSet plugins = new HashSet(); |
452 |
for (int i = 0; i < workingSets.length; i++) { |
453 |
IAdaptable[] elements = workingSets[i].getElements(); |
454 |
for (int j = 0; j < elements.length; j++) { |
455 |
IPluginModelBase model = findModel(elements[j]); |
456 |
if (model != null) { |
457 |
ITargetPlugin plugin = factory.createPlugin(); |
458 |
plugin.setId(model.getPluginBase().getId()); |
459 |
plugins.add(plugin); |
460 |
} |
461 |
} |
462 |
} |
463 |
target.addPlugins((ITargetPlugin[]) plugins.toArray(new ITargetPlugin[plugins.size()])); |
464 |
} |
465 |
updateEnablement(); |
466 |
} |
467 |
|
468 |
private IPluginModelBase findModel(IAdaptable object) { |
469 |
if (object instanceof IJavaProject) |
470 |
object = ((IJavaProject) object).getProject(); |
471 |
if (object instanceof IProject) |
472 |
return PluginRegistry.findModel((IProject) object); |
473 |
if (object instanceof PersistablePluginObject) { |
474 |
return PluginRegistry.findModel(((PersistablePluginObject) object).getPluginID()); |
475 |
} |
476 |
return null; |
477 |
} |
478 |
|
479 |
public static void handleAddRequired(ITargetPlugin[] plugins, boolean includeOptional) { |
480 |
if (plugins.length == 0) |
481 |
return; |
482 |
|
483 |
ArrayList list = new ArrayList(plugins.length); |
484 |
for (int i = 0; i < plugins.length; i++) { |
485 |
list.add(TargetPlatformHelper.getState().getBundle(plugins[i].getId(), null)); |
486 |
} |
487 |
DependencyCalculator calculator = new DependencyCalculator(includeOptional); |
488 |
calculator.findDependencies(list.toArray()); |
489 |
Collection dependencies = calculator.getBundleIDs(); |
490 |
|
491 |
ITarget target = plugins[0].getTarget(); |
492 |
ITargetModelFactory factory = target.getModel().getFactory(); |
493 |
ITargetPlugin[] pluginsToAdd = new ITargetPlugin[dependencies.size()]; |
494 |
int i = 0; |
495 |
Iterator iter = dependencies.iterator(); |
496 |
while (iter.hasNext()) { |
497 |
String id = iter.next().toString(); |
498 |
ITargetPlugin plugin = factory.createPlugin(); |
499 |
plugin.setId(id); |
500 |
pluginsToAdd[i++] = plugin; |
501 |
} |
502 |
target.addPlugins(pluginsToAdd); |
503 |
} |
504 |
|
505 |
/* (non-Javadoc) |
506 |
* @see org.eclipse.pde.internal.ui.editor.PDESection#modelChanged(org.eclipse.pde.core.IModelChangedEvent) |
507 |
*/ |
508 |
public void modelChanged(IModelChangedEvent e) { |
509 |
if (e.getChangeType() == IModelChangedEvent.WORLD_CHANGED) { |
510 |
handleModelEventWorldChanged(e); |
511 |
return; |
512 |
} |
513 |
Object[] objects = e.getChangedObjects(); |
514 |
if (e.getChangeType() == IModelChangedEvent.INSERT) { |
515 |
for (int i = 0; i < objects.length; i++) { |
516 |
if ((objects[i] instanceof ITargetPlugin && fLastTab == 0) || (objects[i] instanceof ITargetFeature && fLastTab == 1)) { |
517 |
fContentViewer.add(objects[i]); |
518 |
} |
519 |
} |
520 |
} else if (e.getChangeType() == IModelChangedEvent.REMOVE) { |
521 |
|
522 |
Table table = fContentViewer.getTable(); |
523 |
int index = table.getSelectionIndex(); |
524 |
|
525 |
for (int i = 0; i < objects.length; i++) { |
526 |
if ((objects[i] instanceof ITargetPlugin && fLastTab == 0) || (objects[i] instanceof ITargetFeature && fLastTab == 1)) { |
527 |
fContentViewer.remove(objects[i]); |
528 |
} |
529 |
} |
530 |
|
531 |
// Update Selection |
532 |
|
533 |
int count = table.getItemCount(); |
534 |
|
535 |
if (count == 0) { |
536 |
// Nothing to select |
537 |
} else if (index < count) { |
538 |
table.setSelection(index); |
539 |
} else { |
540 |
table.setSelection(count - 1); |
541 |
} |
542 |
|
543 |
} |
544 |
if (e.getChangedProperty() == ITarget.P_ALL_PLUGINS) { |
545 |
refresh(); |
546 |
fIncludeOptionalButton.setEnabled(!((Boolean) e.getNewValue()).booleanValue()); |
547 |
} |
548 |
} |
549 |
|
550 |
/** |
551 |
* @param event |
552 |
*/ |
553 |
private void handleModelEventWorldChanged(IModelChangedEvent event) { |
554 |
// Reload input |
555 |
fContentViewer.setInput(PDECore.getDefault().getModelManager()); |
556 |
// Perform the refresh |
557 |
refresh(); |
558 |
} |
559 |
|
560 |
public boolean doGlobalAction(String actionId) { |
561 |
if (actionId.equals(ActionFactory.DELETE.getId())) { |
562 |
handleDelete(); |
563 |
return true; |
564 |
} |
565 |
if (actionId.equals(ActionFactory.CUT.getId())) { |
566 |
handleDelete(); |
567 |
return false; |
568 |
} |
569 |
if (actionId.equals(ActionFactory.PASTE.getId())) { |
570 |
doPaste(); |
571 |
return true; |
572 |
} |
573 |
if (actionId.equals(ActionFactory.SELECT_ALL.getId())) { |
574 |
handleSelectAll(); |
575 |
return true; |
576 |
} |
577 |
return false; |
578 |
} |
579 |
|
580 |
private void handleSelectAll() { |
581 |
fContentViewer.getTable().selectAll(); |
582 |
} |
583 |
|
584 |
/* (non-Javadoc) |
585 |
* @see org.eclipse.pde.internal.ui.editor.StructuredViewerSection#fillContextMenu(org.eclipse.jface.action.IMenuManager) |
586 |
*/ |
587 |
protected void fillContextMenu(IMenuManager manager) { |
588 |
IStructuredSelection ssel = (IStructuredSelection) fContentViewer.getSelection(); |
589 |
if (ssel == null) |
590 |
return; |
591 |
|
592 |
Action openAction = new Action(PDEUIMessages.ContentSection_open) { |
593 |
public void run() { |
594 |
handleDoubleClick((IStructuredSelection) fContentViewer.getSelection()); |
595 |
} |
596 |
}; |
597 |
openAction.setEnabled(isEditable() && ssel.size() == 1); |
598 |
manager.add(openAction); |
599 |
|
600 |
manager.add(new Separator()); |
601 |
|
602 |
Action removeAction = new Action(PDEUIMessages.ContentSection_remove) { |
603 |
public void run() { |
604 |
handleDelete(); |
605 |
} |
606 |
}; |
607 |
removeAction.setEnabled(isEditable() && ssel.size() > 0); |
608 |
manager.add(removeAction); |
609 |
|
610 |
Action removeAll = new Action(PDEUIMessages.ContentSection_removeAll) { |
611 |
public void run() { |
612 |
handleRemoveAll(); |
613 |
} |
614 |
}; |
615 |
removeAll.setEnabled(isEditable()); |
616 |
manager.add(removeAll); |
617 |
|
618 |
manager.add(new Separator()); |
619 |
|
620 |
getPage().getPDEEditor().getContributor().contextMenuAboutToShow(manager); |
621 |
} |
622 |
|
623 |
protected void doPaste(Object target, Object[] objects) { |
624 |
for (int i = 0; i < objects.length; i++) { |
625 |
if (objects[i] instanceof ITargetPlugin && fLastTab == 0) |
626 |
getTarget().addPlugin((ITargetPlugin) objects[i]); |
627 |
else if (objects[i] instanceof ITargetFeature && fLastTab == 1) |
628 |
getTarget().addFeature((ITargetFeature) objects[i]); |
629 |
} |
630 |
} |
631 |
|
632 |
protected void selectionChanged(IStructuredSelection selection) { |
633 |
getPage().getPDEEditor().setSelection(selection); |
634 |
} |
635 |
|
636 |
public boolean setFormInput(Object input) { |
637 |
if (input instanceof ITargetPlugin) { |
638 |
if (fTabFolder.getSelectionIndex() != 0) { |
639 |
fTabFolder.setSelection(0); |
640 |
refresh(); |
641 |
} |
642 |
fContentViewer.setSelection(new StructuredSelection(input), true); |
643 |
return true; |
644 |
} else if (input instanceof ITargetFeature) { |
645 |
if (fTabFolder.getSelectionIndex() != 1) { |
646 |
fTabFolder.setSelection(1); |
647 |
refresh(); |
648 |
} |
649 |
fContentViewer.setSelection(new StructuredSelection(input), true); |
650 |
return true; |
651 |
} |
652 |
return super.setFormInput(input); |
653 |
} |
654 |
|
655 |
public void dispose() { |
656 |
ITargetModel model = getModel(); |
657 |
if (model != null) |
658 |
model.removeModelChangedListener(this); |
659 |
if (fTabImages != null) |
660 |
for (int i = 0; i < fTabImages.length; i++) |
661 |
fTabImages[i].dispose(); |
662 |
super.dispose(); |
663 |
} |
664 |
|
665 |
protected boolean createCount() { |
666 |
return true; |
667 |
} |
668 |
} |