1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

New Target Management wizard and allow editing of LC names.

Add a new launch target wizard that manages creating and editing of
launch targets (similar to the new CDT toolchain wizard).

Allow editing of launch configuration names in the descriptor edit
dialog.

Change-Id: I1c690a5c5d8a8a6d4e4698b47cd35e6cc40944c5
This commit is contained in:
Doug Schaefer 2017-09-27 13:57:57 -04:00
parent 4a25d3cf1d
commit ccc816a442
21 changed files with 491 additions and 908 deletions

View file

@ -61,12 +61,16 @@ public abstract class AbstractLaunchConfigProvider implements ILaunchConfigurati
return false;
}
// Check for our class name but also that the config name
// matches what we originally set it to.
// This covers the case when the config was duplicated.
// We can own only one, the original one.
return configuration.getAttribute(ATTR_PROVIDER_CLASS, "").equals(getClass().getName()) //$NON-NLS-1$
&& configuration.getAttribute(ATTR_ORIGINAL_NAME, "").equals(configuration.getName()); //$NON-NLS-1$
if (configuration.getAttribute(ATTR_PROVIDER_CLASS, "").equals(getClass().getName())) { //$NON-NLS-1$
// We provided the configuration but we need to check if this is a duplicate and
// not own it. Check the original name and if there is still a config with that
// name, this is the duplicate. Otherwise it's simply a rename
String origName = configuration.getAttribute(ATTR_ORIGINAL_NAME, ""); //$NON-NLS-1$
return origName.equals(configuration.getName())
|| !DebugPlugin.getDefault().getLaunchManager().isExistingLaunchConfigurationName(origName);
} else {
return false;
}
}
}

View file

@ -947,7 +947,7 @@ public class LaunchBarManager implements ILaunchBarManager, ILaunchTargetListene
return;
fireLaunchTargetsChanged();
// if we added new target we probably want to use it
if (activeLaunchDesc == null || supportsTarget(activeLaunchDesc, target)) {
if (activeLaunchDesc != null && supportsTarget(activeLaunchDesc, target)) {
try {
setActiveLaunchTarget(target);
} catch (CoreException e) {

View file

@ -205,7 +205,7 @@ public class LaunchTargetManager implements ILaunchTargetManager {
}
ILaunchTarget target = new LaunchTarget(typeId, id, child);
type.put(id, target);
child.flush();
prefs.flush();
synchronized (listeners) {
for (ILaunchTargetListener listener : listeners) {

View file

@ -77,7 +77,7 @@ public class LaunchTargetWorkingCopy extends PlatformObject implements ILaunchTa
public ILaunchTarget save() {
try {
LaunchTarget target;
if (newId == null) {
if (newId == null || newId.equals(original.getId())) {
target = original;
} else {
// make a new one and remove the old one
@ -91,7 +91,13 @@ public class LaunchTargetWorkingCopy extends PlatformObject implements ILaunchTa
// set the changed attributes
for (Map.Entry<String, String> entry : changes.entrySet()) {
target.attributes.put(entry.getKey(), entry.getValue());
String key = entry.getKey();
String value = entry.getValue();
if (value != null) {
target.attributes.put(key, value);
} else {
target.attributes.remove(key);
}
}
target.attributes.flush();
return target;

View file

@ -18,14 +18,9 @@ import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.CompositeImageDescriptor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.SameShellProvider;
import org.eclipse.launchbar.core.ILaunchBarManager;
import org.eclipse.launchbar.core.target.ILaunchTarget;
import org.eclipse.launchbar.core.target.ILaunchTargetListener;
@ -48,7 +43,6 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PropertyDialogAction;
public class TargetSelector extends CSelector implements ILaunchTargetListener {
@ -108,7 +102,7 @@ public class TargetSelector extends CSelector implements ILaunchTargetListener {
if (status.getCode() == Code.OK) {
return baseImage;
} else {
String compId = String.format("%s.%s.%s", target.getTypeId(), target.getId(),
String compId = String.format("%s.%s.%s", target.getTypeId(), target.getId(), //$NON-NLS-1$
status.getCode());
Image image = Activator.getDefault().getImageRegistry().get(compId);
if (image == null && baseImage != null) {
@ -157,34 +151,9 @@ public class TargetSelector extends CSelector implements ILaunchTargetListener {
return true;
}
private ISelectionProvider getSelectionProvider() {
return new ISelectionProvider() {
@Override
public void setSelection(ISelection selection) {
// ignore
}
@Override
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
// ignore
}
@Override
public ISelection getSelection() {
return new StructuredSelection(TargetSelector.this.getSelection());
}
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
// ignore
}
};
}
@Override
public void handleEdit(Object element) {
// opens property dialog on a selected target
new PropertyDialogAction(new SameShellProvider(getShell()), getSelectionProvider()).run();
targetUIManager.editLaunchTarget((ILaunchTarget) getSelection());
}
@Override

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: LaunchBar UI
Bundle-SymbolicName: org.eclipse.launchbar.ui;singleton:=true
Bundle-Version: 2.1.1.qualifier
Bundle-Version: 2.2.0.qualifier
Bundle-Activator: org.eclipse.launchbar.ui.internal.Activator
Bundle-Vendor: Eclipse CDT
Require-Bundle: org.eclipse.core.runtime,

View file

@ -21,6 +21,7 @@ and target creation wizard.
<sequence>
<element ref="launchTargetTypeUI" minOccurs="1" maxOccurs="unbounded"/>
<element ref="wizard" minOccurs="0" maxOccurs="unbounded"/>
<element ref="wizard2" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="point" type="string" use="required">
<annotation>
@ -173,6 +174,53 @@ Since 3.0
</annotation>
</element>
<element name="wizard2">
<annotation>
<documentation>
Wizard that supports creation and editing of targets. These wizards are per target type.
</documentation>
</annotation>
<complexType>
<attribute name="id" type="string" use="required">
<annotation>
<documentation>
</documentation>
<appinfo>
<meta.attribute kind="identifier" basedOn="org.eclipse.launchbar.core.launchTargetTypes/launchTargetType/@id"/>
</appinfo>
</annotation>
</attribute>
<attribute name="name" type="string" use="required">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="class" type="string" use="required">
<annotation>
<documentation>
</documentation>
<appinfo>
<meta.attribute kind="java" basedOn="org.eclipse.launchbar.ui.target.LaunchTargetWizard:"/>
</appinfo>
</annotation>
</attribute>
<attribute name="icon" type="string">
<annotation>
<documentation>
</documentation>
<appinfo>
<meta.attribute kind="resource"/>
</appinfo>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appinfo>
<meta.section type="since"/>
@ -187,7 +235,7 @@ Since 3.0
<meta.section type="examples"/>
</appinfo>
<documentation>
&lt;extension
&lt;extension
point=&quot;org.eclipse.launchbar.ui.launchTargetTypeUI&quot;&gt;
&lt;launchTargetTypeUI
id=&quot;com.qnx.tools.ide.target.qconn&quot;

View file

@ -103,4 +103,5 @@ public class Activator extends AbstractUIPlugin {
ServiceReference<T> ref = context.getServiceReference(cls);
return ref != null ? context.getService(ref) : null;
}
}

View file

@ -3,7 +3,9 @@ package org.eclipse.launchbar.ui.internal;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.ILaunchMode;
import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPresentationManager;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
@ -24,6 +26,8 @@ import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
@ -31,7 +35,9 @@ import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class LaunchBarLaunchConfigDialog extends TitleAreaDialog implements ILaunchBarLaunchConfigDialog {
@ -40,8 +46,10 @@ public class LaunchBarLaunchConfigDialog extends TitleAreaDialog implements ILau
private final ILaunchMode mode;
private final ILaunchTarget target;
private final ILaunchConfigurationTabGroup buildTabGroup;
private final String originalName;
private ILaunchConfigurationTabGroup group;
private Text nameText;
private CTabFolder tabFolder;
private CTabItem lastSelection;
private ProgressMonitorPart pmPart;
@ -57,6 +65,7 @@ public class LaunchBarLaunchConfigDialog extends TitleAreaDialog implements ILau
this.mode = mode;
this.target = target;
this.buildTabGroup = buildTabGroup;
this.originalName = workingCopy.getName();
setShellStyle(getShellStyle() | SWT.RESIZE);
}
@ -71,14 +80,6 @@ public class LaunchBarLaunchConfigDialog extends TitleAreaDialog implements ILau
protected Control createDialogArea(Composite parent) {
initing = true;
// create the top level composite for the dialog area
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.verticalSpacing = 0;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
composite.setFont(parent.getFont());
getShell().setText(Messages.LaunchBarLaunchConfigDialog_EditConfiguration);
boolean supportsTargets = true;
try {
@ -102,6 +103,31 @@ public class LaunchBarLaunchConfigDialog extends TitleAreaDialog implements ILau
setMessage(Messages.LaunchBarLaunchConfigDialog_SetParameters);
// create the top level composite for the dialog area
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.verticalSpacing = 0;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
composite.setFont(parent.getFont());
Composite nameComp = new Composite(composite, SWT.NONE);
nameComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
nameComp.setLayout(new GridLayout(2, false));
Label nameLabel = new Label(nameComp, SWT.NONE);
nameLabel.setText(Messages.LaunchBarLaunchConfigDialog_LaunchConfigName);
nameText = new Text(nameComp, SWT.BORDER);
nameText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
nameText.setText(workingCopy.getName());
nameText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
updateMessage();
}
});
tabFolder = new CTabFolder(composite, SWT.BORDER);
tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
tabFolder.addFocusListener(new FocusAdapter() {
@ -184,6 +210,11 @@ public class LaunchBarLaunchConfigDialog extends TitleAreaDialog implements ILau
@Override
protected void okPressed() {
String newName = nameText.getText().trim();
if (!newName.equals(originalName)) {
workingCopy.rename(newName);
}
if (buildTabGroup != null) {
buildTabGroup.performApply(workingCopy);
}
@ -277,6 +308,31 @@ public class LaunchBarLaunchConfigDialog extends TitleAreaDialog implements ILau
return;
}
String newName = nameText.getText().trim();
if (newName.isEmpty()) {
setMessage(Messages.LaunchBarLaunchConfigDialog_LCMustHaveName, IMessageProvider.ERROR);
return;
}
if (!newName.equals(originalName)) {
// make sure it's not taken
try {
ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
if (manager.isExistingLaunchConfigurationName(newName)) {
setMessage(Messages.LaunchBarLaunchConfigDialog_LCNameExists, IMessageProvider.ERROR);
return;
}
if (!manager.isValidLaunchConfigurationName(newName)) {
setMessage(Messages.LaunchBarLaunchConfigDialog_LCNameNotValid, IMessageProvider.ERROR);
return;
}
} catch (CoreException e1) {
Activator.log(e1.getStatus());
}
}
for (ILaunchConfigurationTab tab : getTabs()) {
tab.isValid(workingCopy);
}
@ -297,13 +353,14 @@ public class LaunchBarLaunchConfigDialog extends TitleAreaDialog implements ILau
@Override
public void setName(String name) {
// Names aren't setable from this dialog
if (nameText != null && !nameText.isDisposed()) {
nameText.setText(name);
}
}
@Override
public String generateName(String name) {
// Names aren't setable from this dialog
return null;
return DebugPlugin.getDefault().getLaunchManager().generateLaunchConfigurationName(name);
}
@Override

View file

@ -128,7 +128,8 @@ public class LaunchBarUIManager implements ILaunchBarUIManager {
target, buildTabGroup);
if (dialog.open() == Window.OK) {
if (!workingCopy.getOriginal().equals(workingCopy)
&& !workingCopy.getOriginal().getAttributes().equals(workingCopy.getAttributes())) {
&& (!workingCopy.getOriginal().getAttributes().equals(workingCopy.getAttributes())
|| !workingCopy.getOriginal().getName().equals(workingCopy.getName()))) {
workingCopy.doSave();
}
}

View file

@ -33,6 +33,8 @@ public class Messages extends NLS {
public static String NewLaunchConfigTypePage_2;
public static String NewLaunchConfigWizard_0;
public static String NewLaunchTargetWizard_Title;
public static String DescriptorMustNotBeNull;
public static String DescriptorMustNotBeNullDesc;
public static String NoActiveTarget;
@ -47,10 +49,20 @@ public class Messages extends NLS {
public static String LaunchBarLaunchConfigDialog_EditConfiguration;
public static String LaunchBarLaunchConfigDialog_LaunchConfigName;
public static String LaunchBarLaunchConfigDialog_LCMustHaveName;
public static String LaunchBarLaunchConfigDialog_LCNameExists;
public static String LaunchBarLaunchConfigDialog_LCNameNotValid;
public static String LaunchBarLaunchConfigDialog_SetParameters;
public static String LaunchConfigurationNotFound;
public static String LaunchConfigurationNotFoundDesc;
public static String LaunchTargetWizardDialog_Delete;
public static String NoLaunchTabsDefined;
public static String NoLaunchTabsDefinedDesc;

View file

@ -25,6 +25,7 @@ NewLaunchConfigTypePage_0=Select Launch Configuration Type
NewLaunchConfigTypePage_1=Launch Configuration Type
NewLaunchConfigTypePage_2=Select the type of launch configuration to create.
NewLaunchConfigWizard_0=Create Launch Configuration
NewLaunchTargetWizard_Title=New Launch Target
DescriptorMustNotBeNull=Descriptor must not be null
DescriptorMustNotBeNullDesc=The launch descriptor must not be null.
@ -37,8 +38,13 @@ NoLaunchGroupSelected=No launch group found for the current selection.
LaunchBarLaunchConfigDialog_Edit1=Edit configuration %s for %s
LaunchBarLaunchConfigDialog_Edit2=Edit configuration %s for %s on %s
LaunchBarLaunchConfigDialog_EditConfiguration=Edit Configuration
LaunchBarLaunchConfigDialog_LaunchConfigName=Launch Configuration Name:
LaunchBarLaunchConfigDialog_LCMustHaveName=Launch configuration must have a name
LaunchBarLaunchConfigDialog_LCNameExists=A launch configuration with that name already exists.
LaunchBarLaunchConfigDialog_LCNameNotValid=The launch configuration name is not valid.
LaunchBarLaunchConfigDialog_SetParameters=Set parameters for the configuration.
LaunchConfigurationNotFound=Launch Configuration Not Found
LaunchConfigurationNotFoundDesc=No launch configuration is found for the given launch descriptor and target.
LaunchTargetWizardDialog_Delete=Delete
NoLaunchTabsDefined=No launch tabs defined.
NoLaunchTabsDefinedDesc=No launch tabs have been defined for this launch configuration type.

View file

@ -7,9 +7,7 @@
*******************************************************************************/
package org.eclipse.launchbar.ui.internal.target;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
@ -19,19 +17,27 @@ import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.SameShellProvider;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.launchbar.core.target.ILaunchTarget;
import org.eclipse.launchbar.ui.internal.Activator;
import org.eclipse.launchbar.ui.target.ILaunchTargetUIManager;
import org.eclipse.launchbar.ui.target.LaunchTargetWizard;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.internal.dialogs.WizardCollectionElement;
import org.eclipse.ui.internal.registry.WizardsRegistryReader;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PropertyDialogAction;
import org.eclipse.ui.wizards.IWizardDescriptor;
public class LaunchTargetUIManager implements ILaunchTargetUIManager {
private Map<String, IConfigurationElement> typeElements;
private Map<String, ILabelProvider> labelProviders = new HashMap<>();
private IWizardDescriptor[] wizards;
private Map<String, IConfigurationElement> editElements;
@Override
public synchronized ILabelProvider getLabelProvider(ILaunchTarget target) {
@ -43,13 +49,16 @@ public class LaunchTargetUIManager implements ILaunchTargetUIManager {
.getExtensionPoint(Activator.getDefault().getBundle().getSymbolicName() + ".launchTargetTypeUI"); //$NON-NLS-1$
for (IExtension extension : point.getExtensions()) {
for (IConfigurationElement element : extension.getConfigurationElements()) {
String id = element.getAttribute("id"); //$NON-NLS-1$
if (id != null) {
typeElements.put(id, element);
if ("launchTargetTypeUI".equals(element.getName())) { //$NON-NLS-1$
String id = element.getAttribute("id"); //$NON-NLS-1$
if (id != null) {
typeElements.put(id, element);
}
}
}
}
}
String typeId = target.getTypeId();
ILabelProvider labelProvider = labelProviders.get(typeId);
if (labelProvider == null) {
@ -85,27 +94,66 @@ public class LaunchTargetUIManager implements ILaunchTargetUIManager {
}
@Override
public synchronized IWizardDescriptor[] getLaunchTargetWizards() {
if (wizards != null)
return wizards;
WizardsRegistryReader reader = new WizardsRegistryReader(Activator.PLUGIN_ID, "launchTargetTypeUI"); //$NON-NLS-1$
WizardCollectionElement wizardElements = reader.getWizardElements();
List<IWizardDescriptor> result = collectWizards(wizardElements, new ArrayList<>());
wizards = result.toArray(new IWizardDescriptor[result.size()]);
return wizards;
public IWizardDescriptor[] getLaunchTargetWizards() {
// No one one should be using this. The new target wizard is internal.
return null;
}
/* we don't show categories we have to flatten the wizards */
private List<IWizardDescriptor> collectWizards(WizardCollectionElement element, List<IWizardDescriptor> result) {
Object[] children = element.getChildren(null); // children are categories
IWizardDescriptor[] wizards = element.getWizards();
for (IWizardDescriptor desc : wizards) {
result.add(desc);
@Override
public void editLaunchTarget(ILaunchTarget target) {
if (editElements == null) {
// Load them up
editElements = new HashMap<>();
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint point = registry
.getExtensionPoint(Activator.getDefault().getBundle().getSymbolicName() + ".launchTargetTypeUI"); //$NON-NLS-1$
for (IExtension extension : point.getExtensions()) {
for (IConfigurationElement element : extension.getConfigurationElements()) {
if ("wizard2".equals(element.getName())) { //$NON-NLS-1$
String id = element.getAttribute("id"); //$NON-NLS-1$
if (id != null) {
editElements.put(id, element);
}
}
}
}
}
for (Object cat : children) {
WizardCollectionElement category = (WizardCollectionElement) cat;
collectWizards(category, result);
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
IConfigurationElement element = editElements.get(target.getTypeId());
if (element != null) {
try {
LaunchTargetWizard wizard = (LaunchTargetWizard) element.createExecutableExtension("class"); //$NON-NLS-1$
wizard.setLaunchTarget(target);
WizardDialog dialog = wizard.canDelete() ? new LaunchTargetWizardDialog(shell, wizard)
: new WizardDialog(shell, wizard);
dialog.open();
} catch (CoreException e) {
Activator.log(e.getStatus());
}
} else {
new PropertyDialogAction(new SameShellProvider(shell), new ISelectionProvider() {
@Override
public void setSelection(ISelection selection) {
// ignore
}
@Override
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
// ignore
}
@Override
public ISelection getSelection() {
return new StructuredSelection(target);
}
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
// ignore
}
}).run();
}
return result;
}
}

View file

@ -0,0 +1,44 @@
/*******************************************************************************
* Copyright (c) 2017 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.launchbar.ui.internal.target;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.launchbar.ui.internal.Messages;
import org.eclipse.launchbar.ui.target.LaunchTargetWizard;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
public class LaunchTargetWizardDialog extends WizardDialog {
public static final int ID_DELETE = IDialogConstants.CLIENT_ID + 0;
public LaunchTargetWizardDialog(Shell parentShell, IWizard newWizard) {
super(parentShell, newWizard);
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, ID_DELETE, Messages.LaunchTargetWizardDialog_Delete, false);
super.createButtonsForButtonBar(parent);
}
@Override
protected void buttonPressed(int buttonId) {
if (buttonId == ID_DELETE) {
((LaunchTargetWizard) getWizard()).performDelete();
setReturnCode(CANCEL);
close();
} else {
super.buttonPressed(buttonId);
}
}
}

View file

@ -10,104 +10,33 @@
*******************************************************************************/
package org.eclipse.launchbar.ui.internal.target;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.launchbar.ui.internal.Activator;
import org.eclipse.launchbar.ui.target.ILaunchTargetUIManager;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWizard;
import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
import org.eclipse.ui.internal.WorkbenchImages;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.wizards.IWizardDescriptor;
import org.eclipse.launchbar.ui.internal.Messages;
/**
* The new wizard is responsible for allowing the user to choose which new
* (nested) wizard to run. The set of available new wizards comes from the new
* extension point.
*/
public class NewLaunchTargetWizard extends Wizard implements IWorkbenchWizard {
private NewLaunchTargetWizardSelectionPage mainPage;
private IWorkbench workbench;
private final ILaunchTargetUIManager targetUIManager = Activator.getService(ILaunchTargetUIManager.class);
public class NewLaunchTargetWizard extends Wizard {
public NewLaunchTargetWizard() {
setForcePreviousAndNextButtons(true);
}
/**
* Create the wizard pages
*/
@Override
public void addPages() {
mainPage = new NewLaunchTargetWizardSelectionPage(workbench, getWizardDescriptors());
addPage(mainPage);
addPage(new NewLaunchTargetWizardSelectionPage());
setWindowTitle(Messages.NewLaunchTargetWizard_Title);
}
public IWizardDescriptor[] getWizardDescriptors() {
return targetUIManager.getLaunchTargetWizards();
}
/**
* Lazily create the wizards pages
* @param aWorkbench the workbench
* @param currentSelection the current selection
*/
@Override
public void init(IWorkbench aWorkbench,
IStructuredSelection currentSelection) {
this.workbench = aWorkbench;
if (getWindowTitle() == null) {
setWindowTitle(WorkbenchMessages.NewWizard_title);
}
setDefaultPageImageDescriptor(WorkbenchImages
.getImageDescriptor(IWorkbenchGraphicConstants.IMG_WIZBAN_NEW_WIZ));
setNeedsProgressMonitor(true);
}
/**
* The user has pressed Finish. Instruct self's pages to finish, and answer
* a boolean indicating success.
*
* @return boolean
*/
@Override
public boolean performFinish() {
//save our selection state
mainPage.saveWidgetValues();
// if we're finishing from the main page then perform finish on the selected wizard.
if (getContainer().getCurrentPage() == mainPage) {
if (mainPage.canFinishEarly()) {
IWizard wizard = mainPage.getSelectedNode().getWizard();
wizard.setContainer(getContainer());
return wizard.performFinish();
}
}
return true;
// Downstream wizards do finish
return false;
}
@Override
public IDialogSettings getDialogSettings() {
IDialogSettings wizardSettings = super.getDialogSettings();
if (wizardSettings == null) {
IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault().getDialogSettings();
String settingsSection = getClass().getSimpleName();
wizardSettings = workbenchSettings.getSection(settingsSection);
if (wizardSettings == null) {
wizardSettings = workbenchSettings.addNewSection(settingsSection);
}
setDialogSettings(wizardSettings);
}
return wizardSettings;
}
@Override
public boolean canFinish() {
// we can finish if the first page is current and the the page can finish early.
if (getContainer().getCurrentPage() == mainPage) {
if (mainPage.canFinishEarly()) {
return true;
}
}
return super.canFinish();
}
}

View file

@ -1,518 +0,0 @@
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.launchbar.ui.internal.target;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.jface.wizard.IWizardContainer2;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbenchWizard;
import org.eclipse.ui.activities.WorkbenchActivityHelper;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.dialogs.DialogUtil;
import org.eclipse.ui.internal.dialogs.WizardActivityFilter;
import org.eclipse.ui.internal.dialogs.WizardContentProvider;
import org.eclipse.ui.internal.dialogs.WizardPatternFilter;
import org.eclipse.ui.internal.dialogs.WorkbenchWizardElement;
import org.eclipse.ui.internal.dialogs.WorkbenchWizardNode;
import org.eclipse.ui.model.AdaptableList;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.wizards.IWizardCategory;
import org.eclipse.ui.wizards.IWizardDescriptor;
/**
* New wizard selection tab that allows the user to select a registered 'New'
* wizard to be launched.
*/
class NewLaunchTargetWizardNewPage implements ISelectionChangedListener {
// id constants
private static final String DIALOG_SETTING_SECTION_NAME = "NewWizardSelectionPage."; //$NON-NLS-1$
private final static int SIZING_LISTS_HEIGHT = 200;
private final static int SIZING_VIEWER_WIDTH = 300;
private final static String STORE_EXPANDED_CATEGORIES_ID = DIALOG_SETTING_SECTION_NAME
+ "STORE_EXPANDED_CATEGORIES_ID"; //$NON-NLS-1$
private final static String STORE_SELECTED_ID = DIALOG_SETTING_SECTION_NAME
+ "STORE_SELECTED_ID"; //$NON-NLS-1$
private NewLaunchTargetWizardSelectionPage page;
private FilteredTree filteredTree;
private WizardPatternFilter filteredTreeFilter;
//Keep track of the wizards we have previously selected
private Hashtable selectedWizards = new Hashtable();
private IDialogSettings settings;
private Button showAllCheck;
private IWizardDescriptor[] primaryWizards;
private CLabel descImageCanvas;
private Map imageTable = new HashMap();
private IWizardDescriptor selectedElement;
private WizardActivityFilter filter = new WizardActivityFilter();
private boolean needShowAll;
/**
* Create an instance of this class
* @param mainPage
* @param wizardCategories
* @param primaryWizards
* @param projectsOnly
*/
public NewLaunchTargetWizardNewPage(NewLaunchTargetWizardSelectionPage mainPage,
IWizardCategory wizardCategories,
IWizardDescriptor[] primaryWizards) {
this.page = mainPage;
this.primaryWizards = primaryWizards;
needShowAll = !allActivityEnabled(primaryWizards);
}
/**
* @param category the wizard category
* @return whether all of the wizards in the category are enabled via activity filtering
*/
private boolean allActivityEnabled(IWizardDescriptor[] wizards) {
for (int i = 0; i < wizards.length; i++) {
IWizardDescriptor wizard = wizards[i];
if (WorkbenchActivityHelper.filterItem(wizard)) {
return false;
}
}
return true;
}
/**
* @since 3.0
*/
public void activate() {
page.setDescription(WorkbenchMessages.NewWizardNewPage_description);
}
/**
* Create this tab's visual components
*
* @param parent Composite
* @return Control
*/
protected Control createControl(Composite parent) {
Font wizardFont = parent.getFont();
// top level group
Composite outerContainer = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
outerContainer.setLayout(layout);
Label wizardLabel = new Label(outerContainer, SWT.NONE);
GridData data = new GridData(SWT.BEGINNING, SWT.FILL, false, true);
outerContainer.setLayoutData(data);
wizardLabel.setFont(wizardFont);
wizardLabel.setText(WorkbenchMessages.NewWizardNewPage_wizardsLabel);
Composite innerContainer = new Composite(outerContainer, SWT.NONE);
layout = new GridLayout(2, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
innerContainer.setLayout(layout);
innerContainer.setFont(wizardFont);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
innerContainer.setLayoutData(data);
filteredTree = createFilteredTree(innerContainer);
createOptionsButtons(innerContainer);
createImage(innerContainer);
updateDescription(null);
// wizard actions pane...create SWT table directly to
// get single selection mode instead of multi selection.
restoreWidgetValues();
return outerContainer;
}
/**
* Create a new FilteredTree in the parent.
*
* @param parent the parent <code>Composite</code>.
* @since 3.0
*/
protected FilteredTree createFilteredTree(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
composite.setLayout(layout);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.widthHint = SIZING_VIEWER_WIDTH;
data.horizontalSpan = 2;
data.grabExcessHorizontalSpace = true;
data.grabExcessVerticalSpace = true;
boolean needsHint = DialogUtil.inRegularFontMode(parent);
//Only give a height hint if the dialog is going to be too small
if (needsHint) {
data.heightHint = SIZING_LISTS_HEIGHT;
}
composite.setLayoutData(data);
filteredTreeFilter = new WizardPatternFilter();
FilteredTree filterTree = new FilteredTree(composite,
SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, filteredTreeFilter, true);
filterTree.setQuickSelectionMode(true);
final TreeViewer treeViewer = filterTree.getViewer();
treeViewer.setContentProvider(new WizardContentProvider());
treeViewer.setLabelProvider(new WorkbenchLabelProvider());
//treeViewer.setComparator(NewWizardCollectionComparator.INSTANCE);
treeViewer.addSelectionChangedListener(this);
ArrayList inputArray = new ArrayList();
for (int i = 0; i < primaryWizards.length; i++) {
inputArray.add(primaryWizards[i]);
}
boolean expandTop = false;
// ensure the category is expanded. If there is a remembered expansion it will be set later.
if (expandTop) {
treeViewer.setAutoExpandLevel(2);
}
AdaptableList input = new AdaptableList(inputArray);
treeViewer.setInput(input);
filterTree.setBackground(parent.getDisplay().getSystemColor(
SWT.COLOR_WIDGET_BACKGROUND));
treeViewer.getTree().setFont(parent.getFont());
treeViewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection s = (IStructuredSelection) event
.getSelection();
selectionChanged(new SelectionChangedEvent(event.getViewer(), s));
Object element = s.getFirstElement();
if (treeViewer.isExpandable(element)) {
treeViewer.setExpandedState(element, !treeViewer
.getExpandedState(element));
} else if (element instanceof WorkbenchWizardElement) {
page.advanceToNextPageOrFinish();
}
}
});
treeViewer.addFilter(filter);
Dialog.applyDialogFont(filterTree);
return filterTree;
}
/**
* Create the Show All and help buttons at the bottom of the page.
*
* @param parent the parent composite on which to create the widgets
*/
private void createOptionsButtons(Composite parent) {
if (needShowAll) {
showAllCheck = new Button(parent, SWT.CHECK);
GridData data = new GridData();
showAllCheck.setLayoutData(data);
showAllCheck.setFont(parent.getFont());
showAllCheck.setText(WorkbenchMessages.NewWizardNewPage_showAll);
showAllCheck.setSelection(false);
// flipping tabs updates the selected node
showAllCheck.addSelectionListener(new SelectionAdapter() {
// the delta of expanded elements between the last 'show all'
// and the current 'no show all'
private Object[] delta = new Object[0];
@Override
public void widgetSelected(SelectionEvent e) {
boolean showAll = showAllCheck.getSelection();
if (showAll) {
filteredTree.getViewer().getControl().setRedraw(false);
} else {
// get the inital expanded elements when going from show
// all-> no show all.
// this isnt really the delta yet, we're just reusing
// the variable.
delta = filteredTree.getViewer().getExpandedElements();
}
try {
if (showAll) {
filteredTree.getViewer().resetFilters();
filteredTree.getViewer().addFilter(filteredTreeFilter);
// restore the expanded elements that were present
// in the last show all state but not in the 'no
// show all' state.
Object[] currentExpanded = filteredTree.getViewer()
.getExpandedElements();
Object[] expanded = new Object[delta.length
+ currentExpanded.length];
System.arraycopy(currentExpanded, 0, expanded, 0,
currentExpanded.length);
System.arraycopy(delta, 0, expanded,
currentExpanded.length, delta.length);
filteredTree.getViewer().setExpandedElements(expanded);
} else {
filteredTree.getViewer().addFilter(filter);
}
filteredTree.getViewer().refresh(false);
if (!showAll) {
// if we're going from show all -> no show all
// record the elements that were expanded in the
// 'show all' state but not the 'no show all' state
// (because they didnt exist).
Object[] newExpanded = filteredTree.getViewer().getExpandedElements();
List deltaList = new ArrayList(Arrays.asList(delta));
deltaList.removeAll(Arrays.asList(newExpanded));
}
} finally {
if (showAll) {
filteredTree.getViewer().getControl().setRedraw(true);
}
}
}
});
}
}
/**
* Create the image controls.
*
* @param parent the parent <code>Composite</code>.
* @since 3.0
*/
private void createImage(Composite parent) {
descImageCanvas = new CLabel(parent, SWT.NONE);
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING
| GridData.VERTICAL_ALIGN_BEGINNING);
data.widthHint = 0;
data.heightHint = 0;
descImageCanvas.setLayoutData(data);
// hook a listener to get rid of cached images.
descImageCanvas.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
for (Iterator i = imageTable.values().iterator(); i.hasNext();) {
((Image) i.next()).dispose();
}
imageTable.clear();
}
});
}
/**
* Returns the single selected object contained in the passed
* selectionEvent, or <code>null</code> if the selectionEvent contains
* either 0 or 2+ selected objects.
*/
protected Object getSingleSelection(IStructuredSelection selection) {
return selection.size() == 1 ? selection.getFirstElement() : null;
}
/**
* Set self's widgets to the values that they held last time this page was
* open
*
*/
protected void restoreWidgetValues() {
//expandPreviouslyExpandedCategories();
selectPreviouslySelected();
}
/**
* Store the current values of self's widgets so that they can be restored
* in the next instance of self
*
*/
public void saveWidgetValues() {
storeSelectedCategoryAndWizard();
}
/**
* The user selected either new wizard category(s) or wizard element(s).
* Proceed accordingly.
*
* @param selectionEvent ISelection
*/
@Override
public void selectionChanged(SelectionChangedEvent selectionEvent) {
page.setErrorMessage(null);
page.setMessage(null);
Object selectedObject = getSingleSelection((IStructuredSelection) selectionEvent
.getSelection());
if (selectedObject instanceof IWizardDescriptor) {
if (selectedObject == selectedElement) {
return;
}
updateWizardSelection((IWizardDescriptor) selectedObject);
} else {
selectedElement = null;
page.setHasPages(false);
page.setCanFinishEarly(false);
page.selectWizardNode(null);
updateDescription(null);
}
}
/**
* Selects the wizard category and wizard in this page that were selected
* last time this page was used. If a category or wizard that was
* previously selected no longer exists then it is ignored.
*/
protected void selectPreviouslySelected() {
String selectedId = settings.get(STORE_SELECTED_ID);
if (selectedId == null) {
return;
}
Object selected = null;
for (int i = 0; i < primaryWizards.length; i++) {
IWizardDescriptor wizard = primaryWizards[i];
if (wizard.getId().equals(selectedId)) {
selected = wizard;
break;
}
}
if (selected == null) {
// if we cant find either a category or a wizard, abort.
return;
}
//work around for 62039
final StructuredSelection selection = new StructuredSelection(selected);
filteredTree.getViewer().getControl().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
filteredTree.getViewer().setSelection(selection, true);
}
});
}
/**
* Set the dialog store to use for widget value storage and retrieval
*
* @param settings IDialogSettings
*/
public void setDialogSettings(IDialogSettings settings) {
this.settings = settings;
}
/**
* Stores the currently-selected element in this page's dialog store, in
* order to recreate this page's state in the next instance of this page.
*/
protected void storeSelectedCategoryAndWizard() {
Object selected = getSingleSelection((IStructuredSelection) filteredTree
.getViewer().getSelection());
if (selected != null) {
if (selected instanceof IWizardCategory) {
settings.put(STORE_SELECTED_ID,
((IWizardCategory) selected).getPath()
.toString());
} else {
// else its a wizard
settings.put(STORE_SELECTED_ID,
((IWizardDescriptor) selected).getId());
}
}
}
/**
* Update the current description controls.
*
* @param selectedObject the new wizard
* @since 3.0
*/
private void updateDescription(IWizardDescriptor selectedObject) {
String string = ""; //$NON-NLS-1$
if (selectedObject != null) {
string = selectedObject.getDescription();
}
page.setDescription(string);
if (hasImage(selectedObject)) {
ImageDescriptor descriptor = null;
if (selectedObject != null) {
descriptor = selectedObject.getDescriptionImage();
}
if (descriptor != null) {
GridData data = (GridData) descImageCanvas.getLayoutData();
data.widthHint = SWT.DEFAULT;
data.heightHint = SWT.DEFAULT;
Image image = (Image) imageTable.get(descriptor);
if (image == null) {
image = descriptor.createImage(false);
imageTable.put(descriptor, image);
}
descImageCanvas.setImage(image);
}
} else {
GridData data = (GridData) descImageCanvas.getLayoutData();
data.widthHint = 0;
data.heightHint = 0;
descImageCanvas.setImage(null);
}
descImageCanvas.getParent().layout(true);
filteredTree.getViewer().getTree().showSelection();
IWizardContainer container = page.getWizard().getContainer();
if (container instanceof IWizardContainer2) {
((IWizardContainer2) container).updateSize();
}
}
/**
* Tests whether the given wizard has an associated image.
*
* @param selectedObject the wizard to test
* @return whether the given wizard has an associated image
*/
private boolean hasImage(IWizardDescriptor selectedObject) {
if (selectedObject == null) {
return false;
}
if (selectedObject.getDescriptionImage() != null) {
return true;
}
return false;
}
/**
* @param selectedObject
*/
private void updateWizardSelection(IWizardDescriptor selectedObject) {
selectedElement = selectedObject;
WorkbenchWizardNode selectedNode;
if (selectedWizards.containsKey(selectedObject)) {
selectedNode = (WorkbenchWizardNode) selectedWizards
.get(selectedObject);
} else {
selectedNode = new WorkbenchWizardNode(page, selectedObject) {
@Override
public IWorkbenchWizard createWizard() throws CoreException {
return wizardElement.createWizard();
}
};
selectedWizards.put(selectedObject, selectedNode);
}
page.setCanFinishEarly(selectedObject.canFinishEarly());
page.setHasPages(selectedObject.hasPages());
page.selectWizardNode(selectedNode);
updateDescription(selectedObject);
}
}

View file

@ -10,111 +10,156 @@
*******************************************************************************/
package org.eclipse.launchbar.ui.internal.target;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.wizard.WizardDialog;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.launchbar.ui.internal.Activator;
import org.eclipse.launchbar.ui.target.LaunchTargetWizard;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.activities.ws.WorkbenchTriggerPoints;
import org.eclipse.ui.internal.dialogs.WorkbenchWizardSelectionPage;
import org.eclipse.ui.wizards.IWizardDescriptor;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IWorkbenchWizard;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.plugin.AbstractUIPlugin;
/**
* New wizard selection tab that allows the user to either select a
* registered 'New' wizard to be launched, or to select a solution or
* projects to be retrieved from an available server. This page
* contains two visual tabs that allow the user to perform these tasks.
*
* Temporarily has two inner pages. The new format page is used if the system
* is currently aware of activity categories.
*/
class NewLaunchTargetWizardSelectionPage extends WorkbenchWizardSelectionPage {
// widgets
private NewLaunchTargetWizardNewPage newResourcePage;
private IWizardDescriptor[] wizards;
private boolean canFinishEarly = false, hasPages = true;
class NewLaunchTargetWizardSelectionPage extends WizardPage {
/**
* Create an instance of this class.
*
* @param workbench the workbench
* @param wizards the primary wizard elements
*/
public NewLaunchTargetWizardSelectionPage(IWorkbench workbench,
IWizardDescriptor[] wizards) {
super("newWizardSelectionPage", workbench, null, null, WorkbenchTriggerPoints.NEW_WIZARDS);//$NON-NLS-1$
setTitle(WorkbenchMessages.NewWizardSelectionPage_description);
this.wizards = wizards;
}
private Table table;
/**
* Makes the next page visible.
*/
public void advanceToNextPageOrFinish() {
if (canFlipToNextPage()) {
getContainer().showPage(getNextPage());
} else if (canFinishEarly()) {
if (getWizard().performFinish()) {
((WizardDialog) getContainer()).close();
}
}
public NewLaunchTargetWizardSelectionPage() {
super(NewLaunchTargetWizardSelectionPage.class.getName());
}
@Override
public void createControl(Composite parent) {
IDialogSettings settings = getDialogSettings();
newResourcePage = new NewLaunchTargetWizardNewPage(this, null, wizards);
newResourcePage.setDialogSettings(settings);
Control control = newResourcePage.createControl(parent);
getWorkbench().getHelpSystem().setHelp(control,
IWorkbenchHelpContextIds.NEW_WIZARD_SELECTION_WIZARD_PAGE);
setControl(control);
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayout(new GridLayout());
table = new Table(comp, SWT.BORDER | SWT.SINGLE);
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
List<IConfigurationElement> elements = new ArrayList<>();
IExtensionPoint point = Platform.getExtensionRegistry()
.getExtensionPoint(Activator.PLUGIN_ID + ".launchTargetTypeUI"); //$NON-NLS-1$
for (IExtension extension : point.getExtensions()) {
for (IConfigurationElement element : extension.getConfigurationElements()) {
String elementName = element.getName();
if ("wizard2".equals(elementName) || "wizard".equals(elementName)) { //$NON-NLS-1$ //$NON-NLS-2$
elements.add(element);
}
}
}
elements.sort(new Comparator<IConfigurationElement>() {
@Override
public int compare(IConfigurationElement o1, IConfigurationElement o2) {
String name1 = o1.getAttribute("name"); //$NON-NLS-1$
String name2 = o2.getAttribute("name"); //$NON-NLS-1$
return name1.compareTo(name2);
}
});
for (IConfigurationElement element : elements) {
String name = element.getAttribute("name"); //$NON-NLS-1$
TableItem item = new TableItem(table, SWT.NONE);
item.setText(name);
String iconFile = element.getAttribute("icon"); //$NON-NLS-1$
if (iconFile != null) {
ImageDescriptor desc = Activator.imageDescriptorFromPlugin(element.getNamespaceIdentifier(), iconFile);
if (desc != null) {
item.setImage(desc.createImage());
}
}
item.setData(element);
}
table.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
getContainer().updateButtons();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
if (canFlipToNextPage()) {
getContainer().showPage(getNextPage());
}
}
});
setControl(comp);
}
/**
* Since Finish was pressed, write widget values to the dialog store so that they
*will persist into the next invocation of this wizard page
*/
protected void saveWidgetValues() {
newResourcePage.saveWidgetValues();
@Override
public void dispose() {
for (TableItem item : table.getItems()) {
Object obj = item.getData();
if (obj instanceof Wizard) {
((Wizard) obj).dispose();
}
}
super.dispose();
}
public ImageDescriptor getDescriptionImage(IConfigurationElement element) {
String descImage = element.getAttribute("icon"); //$NON-NLS-1$
if (descImage == null) {
return null;
}
return AbstractUIPlugin.imageDescriptorFromPlugin(element.getNamespaceIdentifier(), descImage);
}
@Override
public boolean canFlipToNextPage() {
// if the current page advertises that it does have pages then ask it via the super call
if (hasPages) {
return super.canFlipToNextPage();
return table.getSelectionIndex() >= 0;
}
@Override
public IWizardPage getNextPage() {
int i = table.getSelectionIndex();
if (i >= 0) {
TableItem item = table.getItem(i);
Object obj = item.getData();
Wizard nextWizard;
if (obj instanceof IConfigurationElement) {
IConfigurationElement element = (IConfigurationElement) obj;
try {
nextWizard = (Wizard) element.createExecutableExtension("class"); //$NON-NLS-1$
nextWizard.addPages();
if (nextWizard instanceof IWorkbenchWizard) {
((IWorkbenchWizard) nextWizard).init(PlatformUI.getWorkbench(), new StructuredSelection());
}
item.setData(nextWizard);
} catch (CoreException e) {
Activator.log(e);
return null;
}
} else {
nextWizard = (LaunchTargetWizard) obj;
}
return nextWizard.getStartingPage();
}
return false;
return super.getNextPage();
}
/**
* Sets whether the selected wizard advertises that it does provide pages.
*
* @param newValue whether the selected wizard has pages
* @since 3.1
*/
public void setHasPages(boolean newValue) {
hasPages = newValue;
}
/**
* Sets whether the selected wizard advertises that it can finish early.
*
* @param newValue whether the selected wizard can finish early
*/
public void setCanFinishEarly(boolean newValue) {
canFinishEarly = newValue;
}
/**
* Answers whether the currently selected page, if any, advertises that it may finish early.
*
* @return whether the page can finish early
*/
public boolean canFinishEarly() {
return canFinishEarly;
}
}

View file

@ -25,5 +25,19 @@ public interface ILaunchTargetUIManager {
*/
ILabelProvider getLabelProvider(ILaunchTarget target);
/**
* @deprecated this should never have been in the interface, now returns null
* @return null
*/
@Deprecated
public IWizardDescriptor[] getLaunchTargetWizards();
/**
* Open a dialog to edit the specified launch target.
*
* @param target
* launch target to edit
*/
void editLaunchTarget(ILaunchTarget target);
}

View file

@ -0,0 +1,33 @@
/*******************************************************************************
* Copyright (c) 2017 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.launchbar.ui.target;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.launchbar.core.target.ILaunchTarget;
public abstract class LaunchTargetWizard extends Wizard {
protected ILaunchTarget launchTarget;
public void setLaunchTarget(ILaunchTarget launchTarget) {
this.launchTarget = launchTarget;
}
public ILaunchTarget getLaunchTarget() {
return launchTarget;
}
public boolean canDelete() {
return false;
}
public void performDelete() {
// do nothing by default
}
}

View file

@ -1,140 +1,27 @@
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* Copyright (c) 2017 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.launchbar.ui.target;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.launchbar.ui.internal.target.NewLaunchTargetWizard;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.*;
import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.WorkbenchPlugin;
/**
* Invoke the resource creation wizard selection Wizard.
* <p>
* This class may be instantiated; it is not intended to be subclassed.
* </p>
* <p>
* This method automatically registers listeners so that it can keep its
* enablement state up to date. Ordinarily, the window's references to these
* listeners will be dropped automatically when the window closes. However,
* if the client needs to get rid of an action while the window is still open,
* the client must call #dispose() to give the
* action an opportunity to deregister its listeners and to perform any other
* cleanup.
* </p>
* @noextend This class is not intended to be subclassed by clients.
* Open the new launch target wizard.
*/
public class NewLaunchTargetWizardAction extends Action implements
ActionFactory.IWorkbenchAction {
/**
* The wizard dialog width
*/
private static final int SIZING_WIZARD_WIDTH = 500;
/**
* The wizard dialog height
*/
private static final int SIZING_WIZARD_HEIGHT = 500;
/**
* The title of the wizard window or <code>null</code> to use the default
* wizard window title.
*/
private String windowTitle = null;
/**
* The workbench window; or <code>null</code> if this
* action has been <code>dispose</code>d.
*/
private IWorkbenchWindow workbenchWindow;
/**
* Create a new instance of this class.
*/
public NewLaunchTargetWizardAction() {
super(WorkbenchMessages.NewWizardAction_text);
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window == null) {
throw new IllegalArgumentException();
}
this.workbenchWindow = window;
// @issues should be IDE-specific images
ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
setImageDescriptor(images
.getImageDescriptor(ISharedImages.IMG_TOOL_NEW_WIZARD));
setDisabledImageDescriptor(images
.getImageDescriptor(ISharedImages.IMG_TOOL_NEW_WIZARD_DISABLED));
setToolTipText(WorkbenchMessages.NewWizardAction_toolTip);
PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
IWorkbenchHelpContextIds.NEW_ACTION);
}
/**
* <p>
* Sets the title of the wizard window
* <p>
*
* <p>
* If the title of the wizard window is <code>null</code>, the default
* wizard window title will be used.
* </p>
*
* @param windowTitle
* The title of the wizard window, otherwise <code>null</code>
* (default wizard window title).
*
* @since 3.6
*/
public void setWizardWindowTitle(String windowTitle) {
this.windowTitle = windowTitle;
}
public class NewLaunchTargetWizardAction extends Action {
@Override
public void run() {
if (workbenchWindow == null) {
// action has been disposed
return;
}
NewLaunchTargetWizard wizard = new NewLaunchTargetWizard();
wizard.setWindowTitle(windowTitle);
wizard.init(workbenchWindow.getWorkbench(), null);
IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault().getDialogSettings();
String settingsSection = getClass().getSimpleName();
IDialogSettings wizardSettings = workbenchSettings.getSection(settingsSection);
if (wizardSettings == null) {
wizardSettings = workbenchSettings.addNewSection(settingsSection);
}
wizard.setDialogSettings(wizardSettings);
wizard.setForcePreviousAndNextButtons(true);
Shell parent = workbenchWindow.getShell();
WizardDialog dialog = new WizardDialog(parent, wizard);
dialog.create();
dialog.getShell().setSize(
Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
SIZING_WIZARD_HEIGHT);
PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(),
IWorkbenchHelpContextIds.NEW_WIZARD);
dialog.open();
Wizard wizard = new NewLaunchTargetWizard();
new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), wizard).open();
}
@Override
public void dispose() {
if (workbenchWindow == null) {
// action has already been disposed
return;
}
workbenchWindow = null;
}
}

View file

@ -18,7 +18,6 @@ import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
@ -27,7 +26,6 @@ import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.launchbar.core.internal.Activator;
import org.eclipse.launchbar.core.internal.LaunchBarManager2Test;
import org.eclipse.launchbar.core.target.ILaunchTarget;
import org.eclipse.launchbar.core.target.ILaunchTargetManager;
import org.junit.After;
@ -54,7 +52,7 @@ public class PerTargetLaunchConfigProviderTest {
null);
localTarget = mock(ILaunchTarget.class);
doReturn("Local").when(localTarget).getName();
doReturn("Local").when(localTarget).getId();
doReturn(ILaunchTargetManager.localLaunchTargetTypeId).when(localTarget).getTypeId();
doReturn(localTarget).when(targetManager).getLaunchTarget(ILaunchTargetManager.localLaunchTargetTypeId,
"Local");
@ -62,7 +60,7 @@ public class PerTargetLaunchConfigProviderTest {
// other mocked remote connections
otherTarget = mock(ILaunchTarget.class);
doReturn("otherTargetType").when(otherTarget).getTypeId();
doReturn("otherTarget").when(otherTarget).getName();
doReturn("otherTarget").when(otherTarget).getId();
doReturn(otherTarget).when(targetManager).getLaunchTarget("otherTargetType", "otherTarget");
doReturn(new ILaunchTarget[] { localTarget, otherTarget }).when(targetManager).getLaunchTargets();
@ -94,7 +92,7 @@ public class PerTargetLaunchConfigProviderTest {
public class PerTargetLaunchConfigProvider1 extends PerTargetLaunchConfigProvider {
public static final String CONNECTION_NAME_ATTR = "connectionName";
private ILaunchBarManager manager;
private ILaunchBarManager manager = mock(ILaunchBarManager.class);
@Override
public boolean supports(ILaunchDescriptor descriptor, ILaunchTarget target) throws CoreException {
@ -111,7 +109,7 @@ public class PerTargetLaunchConfigProviderTest {
protected void populateLaunchConfiguration(ILaunchDescriptor descriptor, ILaunchTarget target,
ILaunchConfigurationWorkingCopy workingCopy) throws CoreException {
super.populateLaunchConfiguration(descriptor, target, workingCopy);
workingCopy.setAttribute(CONNECTION_NAME_ATTR, target.getName());
workingCopy.setAttribute(CONNECTION_NAME_ATTR, target.getId());
}
@Override
@ -122,9 +120,9 @@ public class PerTargetLaunchConfigProviderTest {
@Override
protected ILaunchTarget getLaunchTarget(ILaunchConfiguration configuration) throws CoreException {
String name = configuration.getAttribute(CONNECTION_NAME_ATTR, "");
if (localTarget.getName().equals(name)) {
if (localTarget.getId().equals(name)) {
return localTarget;
} else if (otherTarget.getName().equals(name)) {
} else if (otherTarget.getId().equals(name)) {
return otherTarget;
} else {
return null;
@ -133,9 +131,6 @@ public class PerTargetLaunchConfigProviderTest {
@Override
protected ILaunchBarManager getManager() {
if (manager == null) {
manager = mock(ILaunchBarManager.class);
}
return manager;
}
@ -230,7 +225,7 @@ public class PerTargetLaunchConfigProviderTest {
ILaunchConfiguration launchConfiguration1 = provider.getLaunchConfiguration(descriptor, localTarget);
assertNotNull(launchConfiguration1);
ILaunchConfigurationWorkingCopy wc = launchConfiguration1.getWorkingCopy();
wc.setAttribute(PerTargetLaunchConfigProvider1.CONNECTION_NAME_ATTR, otherTarget.getName());
wc.setAttribute(PerTargetLaunchConfigProvider1.CONNECTION_NAME_ATTR, otherTarget.getId());
wc.doSave();
provider.launchConfigurationChanged(launchConfiguration1);
// provider.launchConfigurationChanged(lc3);
@ -244,13 +239,15 @@ public class PerTargetLaunchConfigProviderTest {
ILaunchConfiguration launchConfiguration1 = provider.getLaunchConfiguration(descriptor, localTarget);
assertNotNull(launchConfiguration1);
ILaunchConfigurationWorkingCopy wc = launchConfiguration1.getWorkingCopy();
wc.setAttribute(LaunchBarManager2Test.ATTR_ORIGINAL_NAME, "bla");
wc.rename("blah");
launchConfiguration1 = wc.doSave();
provider.launchConfigurationChanged(launchConfiguration1);
// we should have lost ownership
assertFalse(provider.ownsLaunchConfiguration(launchConfiguration1));
verify(provider.manager).launchConfigurationRemoved(launchConfiguration1);
verify(provider.manager).launchConfigurationAdded(launchConfiguration1);
// we should still maintain ownership on a rename
assertTrue(provider.ownsLaunchConfiguration(launchConfiguration1));
// provider not hooked up properly to verify these.
// TODO not sure this test is valid as a result
// verify(provider.manager).launchConfigurationAdded(launchConfiguration1);
// verify(provider.manager).launchConfigurationRemoved(launchConfiguration1);
// have to fake out the remove
provider.launchConfigurationRemoved(launchConfiguration1);
ILaunchConfiguration launchConfiguration2 = provider.getLaunchConfiguration(descriptor, localTarget);