Skip to main content
summaryrefslogtreecommitdiffstats
path: root/launch
diff options
context:
space:
mode:
authorJohn Cortell2009-05-15 13:48:25 +0000
committerJohn Cortell2009-05-15 13:48:25 +0000
commit7e22c45fe6bd633bf07f5e271320d76a04a74809 (patch)
tree56fafa5497a13bb98ba22ee4f9aebc221aa4ce66 /launch
parentcff7d18b90af4ce19fc511368e04b25ed09d095f (diff)
downloadorg.eclipse.cdt-7e22c45fe6bd633bf07f5e271320d76a04a74809.tar.gz
org.eclipse.cdt-7e22c45fe6bd633bf07f5e271320d76a04a74809.tar.xz
org.eclipse.cdt-7e22c45fe6bd633bf07f5e271320d76a04a74809.zip
Bugzilla 276498: Support multiple selection in Launch Group feature
Diffstat (limited to 'launch')
-rw-r--r--launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/MultiLaunchConfigurationDelegate.java12
-rw-r--r--launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties10
-rw-r--r--launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/MultiLaunchConfigurationSelectionDialog.java54
-rw-r--r--launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/MultiLaunchConfigurationTabGroup.java140
4 files changed, 134 insertions, 82 deletions
diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/MultiLaunchConfigurationDelegate.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/MultiLaunchConfigurationDelegate.java
index 8df9d0a161c..fe625c131d1 100644
--- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/MultiLaunchConfigurationDelegate.java
+++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/MultiLaunchConfigurationDelegate.java
@@ -3,6 +3,7 @@ package org.eclipse.cdt.launch.internal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import org.eclipse.cdt.launch.internal.MultiLaunchConfigurationDelegate.LaunchElement.EPostLaunchAction;
@@ -218,7 +219,7 @@ public class MultiLaunchConfigurationDelegate extends LaunchConfigurationDelegat
DebugUIPlugin.getDefault().getPreferenceStore().setValue(IDebugUIConstants.PREF_AUTO_REMOVE_OLD_LAUNCHES,
false);
- final ArrayList<LaunchElement> input = createLaunchElements(configuration, new ArrayList<LaunchElement>());
+ final List<LaunchElement> input = createLaunchElements(configuration, new ArrayList<LaunchElement>());
MultiLaunchListener listener = new MultiLaunchListener(launch);
ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
launchManager.addLaunchListener(listener); // listener removed when launch is removed
@@ -340,8 +341,8 @@ public class MultiLaunchConfigurationDelegate extends LaunchConfigurationDelegat
return null;
}
- public static ArrayList<LaunchElement> createLaunchElements(ILaunchConfiguration configuration,
- ArrayList<MultiLaunchConfigurationDelegate.LaunchElement> input) {
+ public static List<LaunchElement> createLaunchElements(ILaunchConfiguration configuration,
+ List<MultiLaunchConfigurationDelegate.LaunchElement> input) {
try {
Map<?,?> attrs = configuration.getAttributes();
for (Iterator<?> iterator = attrs.keySet().iterator(); iterator.hasNext();) {
@@ -394,11 +395,10 @@ public class MultiLaunchConfigurationDelegate extends LaunchConfigurationDelegat
return input;
}
- public static void storeLaunchElements(ILaunchConfigurationWorkingCopy configuration, ArrayList<LaunchElement> input) {
+ public static void storeLaunchElements(ILaunchConfigurationWorkingCopy configuration, List<LaunchElement> input) {
int i = 0;
removeLaunchElements(configuration);
- for (Iterator<LaunchElement> iterator = input.iterator(); iterator.hasNext();) {
- MultiLaunchConfigurationDelegate.LaunchElement el = iterator.next();
+ for (LaunchElement el : input) {
if (el == null) continue;
configuration.setAttribute(MultiLaunchConfigurationDelegate.getProp(i, NAME_PROP), el.getName());
configuration.setAttribute(MultiLaunchConfigurationDelegate.getProp(i, ACTION_PROP), el.getAction().toString());
diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties
index fae6395088d..9434a42a1fb 100644
--- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties
+++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties
@@ -159,13 +159,17 @@ MultiLaunchConfigurationDelegate.Action.Delay=Delay
MultiLaunchConfigurationDelegate.Action.WaitingForTermination=Waiting for termination of
MultiLaunchConfigurationDelegate.Action.Delaying=Delaying next launch by {0} seconds
MultiLaunchConfigurationSelectionDialog.0=Launch Configuration Selector
-MultiLaunchConfigurationSelectionDialog.1=Select a Launch Configuration and a Launch Mode
MultiLaunchConfigurationSelectionDialog.4=Launch Mode:
MultiLaunchConfigurationSelectionDialog.5=Use default mode when launching
-MultiLaunchConfigurationSelectionDialog.7=Select a Launch Configuration
+MultiLaunchConfigurationSelectionDialog.7=Select a launch configuration
MultiLaunchConfigurationSelectionDialog.8=Post launch action:
MultiLaunchConfigurationSelectionDialog.9=Seconds:
MultiLaunchConfigurationSelectionDialog.10=Enter valid number of seconds
+MultiLaunchConfigurationSelectionDialog.11=Select only one launch configuration
+MultiLaunchConfigurationSelectionDialog.12=Add Launch Configuration
+MultiLaunchConfigurationSelectionDialog.13=Edit Launch Configuration
+MultiLaunchConfigurationSelectionDialog.14=Add one or more launch configurations to the launch group
+MultiLaunchConfigurationSelectionDialog.15=Edit an existing entry in the launch group
MultiLaunchConfigurationTabGroup.1=Up
MultiLaunchConfigurationTabGroup.2=Down
MultiLaunchConfigurationTabGroup.3=Edit...
@@ -173,8 +177,6 @@ MultiLaunchConfigurationTabGroup.4=Add...
MultiLaunchConfigurationTabGroup.5=Remove
MultiLaunchConfigurationTabGroup.6=Name
MultiLaunchConfigurationTabGroup.7=Mode
-MultiLaunchConfigurationTabGroup.8=Select Launch Configuration
-MultiLaunchConfigurationTabGroup.9=Edit Launch Configuration
MultiLaunchConfigurationTabGroup.10=Launches
MultiLaunchConfigurationTabGroup.11=seconds
MultiLaunchConfigurationTabGroup.12=Action
diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/MultiLaunchConfigurationSelectionDialog.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/MultiLaunchConfigurationSelectionDialog.java
index e4fc791a134..169757251a2 100644
--- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/MultiLaunchConfigurationSelectionDialog.java
+++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/MultiLaunchConfigurationSelectionDialog.java
@@ -1,8 +1,10 @@
package org.eclipse.cdt.launch.internal.ui;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
import org.eclipse.cdt.launch.internal.MultiLaunchConfigurationDelegate;
import org.eclipse.cdt.launch.internal.MultiLaunchConfigurationDelegate.LaunchElement;
@@ -65,12 +67,14 @@ public class MultiLaunchConfigurationSelectionDialog extends TitleAreaDialog imp
private ComboControlledStackComposite fStackComposite;
private Label fDelayAmountLabel;
private Text fDelayAmountWidget; // in seconds
+ private boolean fForEditing; // true if dialog was opened to edit an entry, otherwise it was opened to add one
- public MultiLaunchConfigurationSelectionDialog(Shell shell, String title, String initMode) {
+ public MultiLaunchConfigurationSelectionDialog(Shell shell, String initMode, boolean forEditing) {
super(shell);
LaunchConfigurationManager manager = DebugUIPlugin.getDefault().getLaunchConfigurationManager();
launchGroups = manager.getLaunchGroups();
mode = initMode;
+ fForEditing = forEditing;
fFilters = null;
setShellStyle(getShellStyle() | SWT.RESIZE);
emptyTypeFilter = new ViewerFilter() {
@@ -100,10 +104,14 @@ public class MultiLaunchConfigurationSelectionDialog extends TitleAreaDialog imp
}
protected Control createDialogArea(Composite parent2) {
- getShell().setText(LaunchMessages.getString("MultiLaunchConfigurationSelectionDialog.0")); //$NON-NLS-1$
- setTitle(LaunchMessages.getString("MultiLaunchConfigurationSelectionDialog.1")); //$NON-NLS-1$
- //setMessage("Select a Launch Configuration and a Launch Mode");
Composite comp = (Composite) super.createDialogArea(parent2);
+
+ // title bar
+ getShell().setText(fForEditing ? LaunchMessages.getString("MultiLaunchConfigurationSelectionDialog.13") : LaunchMessages.getString("MultiLaunchConfigurationSelectionDialog.12")); //$NON-NLS-1$ //$NON-NLS-2$
+
+ // dialog message area (not title bar)
+ setTitle(fForEditing ? LaunchMessages.getString("MultiLaunchConfigurationSelectionDialog.15") : LaunchMessages.getString("MultiLaunchConfigurationSelectionDialog.14")); //$NON-NLS-1$ //$NON-NLS-2$
+
fStackComposite = new ComboControlledStackComposite(comp, SWT.NONE);
HashMap<String, ILaunchGroup> modes = new HashMap<String, ILaunchGroup>();
for (ILaunchGroup launchGroup : launchGroups) {
@@ -114,15 +122,17 @@ public class MultiLaunchConfigurationSelectionDialog extends TitleAreaDialog imp
if (this.mode.equals(MultiLaunchConfigurationDelegate.DEFAULT_MODE)) {
try {
this.mode = "run"; //$NON-NLS-1$
- ILaunchConfiguration sel = getSelectedLaunchConfiguration();
- if (sel != null)
+ ILaunchConfiguration[] configs = getSelectedLaunchConfigurations();
+ if (configs.length > 0) {
+ // we care only about the first selected element
for (Iterator<String> iterator = modes.keySet().iterator(); iterator.hasNext();) {
String mode = iterator.next();
- if (sel.supportsMode(mode)) {
+ if (configs[0].supportsMode(mode)) {
this.mode = mode;
break;
}
}
+ }
} catch (Exception e) {
}
}
@@ -235,13 +245,17 @@ public class MultiLaunchConfigurationSelectionDialog extends TitleAreaDialog imp
fDelayAmountWidget.setVisible(visible);
}
- public ILaunchConfiguration getSelectedLaunchConfiguration() {
+ public ILaunchConfiguration[] getSelectedLaunchConfigurations() {
+ List<ILaunchConfiguration> configs = new ArrayList<ILaunchConfiguration>();
if (fSelection != null && !fSelection.isEmpty()) {
- Object firstElement = ((IStructuredSelection) fSelection).getFirstElement();
- if (firstElement instanceof ILaunchConfiguration)
- return (ILaunchConfiguration) firstElement;
+ for (Iterator<?> iter = ((IStructuredSelection)fSelection).iterator(); iter.hasNext();) {
+ Object selection = iter.next();
+ if (selection instanceof ILaunchConfiguration) {
+ configs.add((ILaunchConfiguration)selection);
+ }
+ }
}
- return null;
+ return configs.toArray(new ILaunchConfiguration[configs.size()]);
}
public String getMode() {
@@ -256,8 +270,8 @@ public class MultiLaunchConfigurationSelectionDialog extends TitleAreaDialog imp
return actionParam;
}
- public static MultiLaunchConfigurationSelectionDialog createDialog(Shell shell, String title, String groupId) {
- return new MultiLaunchConfigurationSelectionDialog(shell, title, groupId);
+ public static MultiLaunchConfigurationSelectionDialog createDialog(Shell shell, String groupId, boolean forEditing) {
+ return new MultiLaunchConfigurationSelectionDialog(shell, groupId, forEditing);
}
/* (non-Javadoc)
@@ -305,12 +319,22 @@ public class MultiLaunchConfigurationSelectionDialog extends TitleAreaDialog imp
protected void validate() {
Button ok_button = getButton(IDialogConstants.OK_ID);
boolean isValid = true;
- if (getSelectedLaunchConfiguration() == null) {
+ if (getSelectedLaunchConfigurations().length < 1) {
setErrorMessage(LaunchMessages.getString("MultiLaunchConfigurationSelectionDialog.7")); //$NON-NLS-1$
isValid = false;
} else {
setErrorMessage(null);
}
+
+ if (isValid) {
+ if (fForEditing) {
+ // must have only one selection
+ if (getSelectedLaunchConfigurations().length > 1) {
+ setErrorMessage(LaunchMessages.getString("MultiLaunchConfigurationSelectionDialog.11")); //$NON-NLS-1$
+ isValid = false;
+ }
+ }
+ }
if (isValid) {
if (action == EPostLaunchAction.DELAY) {
diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/MultiLaunchConfigurationTabGroup.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/MultiLaunchConfigurationTabGroup.java
index b758f7e565c..1fec1fb1de3 100644
--- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/MultiLaunchConfigurationTabGroup.java
+++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/MultiLaunchConfigurationTabGroup.java
@@ -2,6 +2,7 @@ package org.eclipse.cdt.launch.internal.ui;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.List;
import org.eclipse.cdt.launch.internal.MultiLaunchConfigurationDelegate;
import org.eclipse.cdt.launch.internal.MultiLaunchConfigurationDelegate.LaunchElement;
@@ -47,7 +48,7 @@ import org.eclipse.ui.PlatformUI;
*/
public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup {
static class ContentProvider implements IStructuredContentProvider, ITreeContentProvider {
- protected ArrayList<LaunchElement> input;
+ protected List<LaunchElement> input;
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
@@ -59,27 +60,20 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
@SuppressWarnings("unchecked") // nothing we can do about this
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- if (newInput instanceof ArrayList<?>)
- input = (ArrayList<LaunchElement>) newInput;
+ if (newInput instanceof List<?>)
+ input = (List<LaunchElement>) newInput;
}
public Object[] getChildren(Object parentElement) {
- if (parentElement == input)
- return input.toArray();
- else
- return null;
+ return (parentElement == input) ? input.toArray() : null;
}
public Object getParent(Object element) {
- if (element == input)
- return null;
- return input;
+ return (element == input) ? null : input;
}
public boolean hasChildren(Object element) {
- if (element == input)
- return input.size() > 0;
- return false;
+ return (element == input) ? (input.size() > 0) : false;
}
}
static class LabelProvider extends BaseLabelProvider implements ITableLabelProvider {
@@ -213,7 +207,7 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
}
static class GroupLaunchTab extends AbstractLaunchConfigurationTab {
protected CheckboxTreeViewer treeViewer;
- protected ArrayList<LaunchElement> input = new ArrayList<LaunchElement>();
+ protected List<LaunchElement> input = new ArrayList<LaunchElement>();
private String mode;
public GroupLaunchTab(String mode) {
@@ -245,23 +239,25 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
treeViewer.setInput(input);
final ButtonComposite buts = new ButtonComposite(comp, SWT.NONE) {
protected void addPressed() {
- MultiLaunchConfigurationSelectionDialog dialog = MultiLaunchConfigurationSelectionDialog.createDialog(treeViewer
- .getControl().getShell(), LaunchMessages.getString("MultiLaunchConfigurationTabGroup.8"), //$NON-NLS-1$
- mode
- );
+ MultiLaunchConfigurationSelectionDialog dialog =
+ MultiLaunchConfigurationSelectionDialog.createDialog(
+ treeViewer.getControl().getShell(), mode, false);
if (dialog.open() == Dialog.OK) {
- ILaunchConfiguration conf = dialog.getSelectedLaunchConfiguration();
- if (conf==null) return;
- MultiLaunchConfigurationDelegate.LaunchElement el = new MultiLaunchConfigurationDelegate.LaunchElement();
- input.add(el);
- el.setIndex(input.size() - 1);
- el.setEnabled(true);
- el.setName(conf.getName());
- el.setData(conf);
- el.setMode(dialog.getMode());
- el.setAction(dialog.getAction(), dialog.getActionParam());
- treeViewer.refresh(true);
- treeViewer.setChecked(el, el.isEnabled());
+ ILaunchConfiguration[] configs = dialog.getSelectedLaunchConfigurations();
+ if (configs.length < 1)
+ return;
+ for (ILaunchConfiguration config : configs) {
+ MultiLaunchConfigurationDelegate.LaunchElement el = new MultiLaunchConfigurationDelegate.LaunchElement();
+ input.add(el);
+ el.setIndex(input.size() - 1);
+ el.setEnabled(true);
+ el.setName(config.getName());
+ el.setData(config);
+ el.setMode(dialog.getMode());
+ el.setAction(dialog.getAction(), dialog.getActionParam());
+ treeViewer.refresh(true);
+ treeViewer.setChecked(el, el.isEnabled());
+ }
updateWidgetEnablement();
updateLaunchConfigurationDialog();
}
@@ -269,27 +265,29 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
protected void updateWidgetEnablement(){
downButton.setEnabled(isDownEnabled());
upButton.setEnabled(isUpEnabled());
- int index = getSelIndex();
- deleteButton.setEnabled(index>=0);
- editButton.setEnabled(index>=0);
+
+ int selectionCount = getSelectionCount();
+ editButton.setEnabled(selectionCount == 1);
+ deleteButton.setEnabled(selectionCount > 0);
}
protected void editPressed() {
- int index = getSelIndex();
+ int index = getSingleSelectionIndex();
if (index < 0)
return;
MultiLaunchConfigurationDelegate.LaunchElement el = input.get(index);
- MultiLaunchConfigurationSelectionDialog dialog = MultiLaunchConfigurationSelectionDialog.createDialog(treeViewer
- .getControl().getShell(), LaunchMessages.getString("MultiLaunchConfigurationTabGroup.9"), //$NON-NLS-1$
- el.getMode()
- );
+ MultiLaunchConfigurationSelectionDialog dialog =
+ MultiLaunchConfigurationSelectionDialog.createDialog(
+ treeViewer.getControl().getShell(), el.getMode(), true);
dialog.setInitialSelection(el);
if (dialog.open() == Dialog.OK) {
- ILaunchConfiguration conf = dialog.getSelectedLaunchConfiguration();
- if (conf==null) return;
- el.setName(conf.getName());
- el.setData(conf);
+ ILaunchConfiguration[] confs = dialog.getSelectedLaunchConfigurations();
+ if (confs.length < 0)
+ return;
+ assert confs.length == 1 : "invocation of the dialog for editing an entry sholdn't allow OK to be hit if the user chooses multiple launch configs in the dialog"; //$NON-NLS-1$
+ el.setName(confs[0].getName());
+ el.setData(confs[0]);
el.setMode(dialog.getMode());
el.setAction(dialog.getAction(), dialog.getActionParam());
treeViewer.refresh(true);
@@ -298,27 +296,60 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
}
}
protected void deletePressed() {
- int index = getSelIndex();
- if (index < 0)
+ int[] indices = getMultiSelectionIndices();
+ if (indices.length < 1)
return;
- input.remove(index);
+ // need to delete from high to low
+ for (int i = indices.length - 1; i >= 0; i--) {
+ input.remove(indices[i]);
+ }
treeViewer.refresh(true);
updateWidgetEnablement();
updateLaunchConfigurationDialog();
}
- private int getSelIndex() {
+ /**
+ * @return the index of the selection if a single item is
+ * selected. If zero or multiple are selected, -1 is
+ * returned
+ */
+ private int getSingleSelectionIndex() {
StructuredSelection sel = (StructuredSelection) treeViewer.getSelection();
- if (sel.isEmpty())
+ if (sel.size() != 1)
return -1;
MultiLaunchConfigurationDelegate.LaunchElement el = ((MultiLaunchConfigurationDelegate.LaunchElement) sel
.getFirstElement());
return input.indexOf(el);
}
+ /**
+ * @return the indices of one or more selected items. Indices
+ * are always returned in ascending order
+ */
+ private int[] getMultiSelectionIndices() {
+ StructuredSelection sel = (StructuredSelection) treeViewer.getSelection();
+ List<Integer> indices = new ArrayList<Integer>();
+
+ for (Iterator<?> iter = sel.iterator(); iter.hasNext(); ) {
+ MultiLaunchConfigurationDelegate.LaunchElement el = (MultiLaunchConfigurationDelegate.LaunchElement)iter.next();
+ indices.add(input.indexOf(el));
+
+ }
+ int[] result = new int[indices.size()];
+ for (int i = 0; i < result.length; i++) {
+ result[i] = indices.get(i);
+ }
+ return result;
+ }
+
+ private int getSelectionCount() {
+ return ((StructuredSelection)treeViewer.getSelection()).size();
+ }
+
+
protected void downPressed() {
if (!isDownEnabled()) return;
- int index = getSelIndex();
+ int index = getSingleSelectionIndex();
MultiLaunchConfigurationDelegate.LaunchElement x = input.get(index);
input.set(index, input.get(index + 1));
@@ -329,22 +360,17 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
}
protected boolean isDownEnabled() {
- int index = getSelIndex();
- if (index < 0 || index == input.size() - 1)
- return false;
- return true;
+ final int index = getSingleSelectionIndex();
+ return (index >= 0) && (index != input.size() - 1);
}
protected boolean isUpEnabled(){
- int index = getSelIndex();
- if (index <= 0)
- return false;
- return true;
+ return getSingleSelectionIndex() > 0;
}
protected void upPressed() {
if (!isUpEnabled()) return;
- int index = getSelIndex();
+ int index = getSingleSelectionIndex();
MultiLaunchConfigurationDelegate.LaunchElement x = input.get(index);
input.set(index, input.get(index - 1));
input.set(index - 1, x);

Back to the top