1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

[270671] - support for post launch actions

This commit is contained in:
Alena Laskavaia 2009-04-01 20:39:46 +00:00
parent a99fb95237
commit 32896c6f39
3 changed files with 176 additions and 45 deletions

View file

@ -39,12 +39,52 @@ public class MultiLaunchConfigurationDelegate extends LaunchConfigurationDelegat
public static String MULTI_LAUNCH_CONSTANTS_PREFIX = "org.eclipse.cdt.launch.launchGroup"; //$NON-NLS-1$
public static class LaunchElement {
public int index;
public boolean enabled;
public String mode;
public String action;
public String name;
public ILaunchConfiguration data;
public static final String POST_LAUNCH_WAIT_FOR_TERM = "wait";
public static final String POST_LAUNCH_CONTINUE = "";
public static final String POST_LAUNCH_DELAY_3_SEC = "delay 3s";
public static final String POST_LAUNCH_DELAY_PREFIX = "delay";
private int index;
private boolean enabled;
private String mode;
private String action;
private String name;
private ILaunchConfiguration data;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAction(String action) {
this.action = action;
}
public String getAction() {
return action;
}
public void setMode(String mode) {
this.mode = mode;
}
public String getMode() {
return mode;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public boolean isEnabled() {
return enabled;
}
public void setIndex(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public void setData(ILaunchConfiguration data) {
this.data = data;
}
public ILaunchConfiguration getData() {
return data;
}
}
public MultiLaunchConfigurationDelegate() {
@ -84,7 +124,7 @@ public class MultiLaunchConfigurationDelegate extends LaunchConfigurationDelegat
private boolean isChild(ILaunch launch2, ArrayList<LaunchElement> input) {
for (Iterator<LaunchElement> iterator = input.iterator(); iterator.hasNext();) {
LaunchElement le = iterator.next();
if (le.name.equals(launch2.getLaunchConfiguration().getName())) { return true; }
if (le.getName().equals(launch2.getLaunchConfiguration().getName())) { return true; }
}
return false;
}
@ -123,15 +163,15 @@ public class MultiLaunchConfigurationDelegate extends LaunchConfigurationDelegat
for (Iterator<LaunchElement> iterator = input.iterator(); iterator.hasNext();) {
LaunchElement le = iterator.next();
if (le.enabled == false) continue;
if (le.isEnabled() == false) continue;
// find launch
final ILaunchConfiguration conf = findLaunch(le.name);
final ILaunchConfiguration conf = findLaunch(le.getName());
// not found, skip (error?)
if (conf == null) continue;
// determine mode for each launch
final String localMode;
if (le.mode != null && !le.mode.equals(DEFAULT_MODE)) {
localMode = le.mode;
if (le.getMode() != null && !le.getMode().equals(DEFAULT_MODE)) {
localMode = le.getMode();
} else {
localMode = mode;
}
@ -151,7 +191,8 @@ public class MultiLaunchConfigurationDelegate extends LaunchConfigurationDelegat
try {
if (configuration.getName().equals(conf.getName())) throw new StackOverflowError();
// LAUNCH child here
DebugUIPlugin.buildAndLaunch(conf, localMode, new SubProgressMonitor(monitor, 1000 / input.size()));
ILaunch subLaunch = DebugUIPlugin.buildAndLaunch(conf, localMode, new SubProgressMonitor(monitor, 1000 / input.size()));
postLaunchAction(subLaunch, le.getAction(), monitor);
} catch (StackOverflowError e) {
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
@ -174,6 +215,43 @@ public class MultiLaunchConfigurationDelegate extends LaunchConfigurationDelegat
}
}
private void postLaunchAction(ILaunch subLaunch, String action, IProgressMonitor monitor) {
if (action==null) return;
if (LaunchElement.POST_LAUNCH_WAIT_FOR_TERM.equals(action)) {
monitor.subTask("Waiting for termination of "+subLaunch.getLaunchConfiguration().getName());
while (!subLaunch.isTerminated() && !monitor.isCanceled()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
break;
}
}
monitor.subTask("");
} else
if (action.startsWith(LaunchElement.POST_LAUNCH_DELAY_PREFIX)) {
String num = action.substring(LaunchElement.POST_LAUNCH_DELAY_PREFIX.length()).trim();
int k = 1000;
if (num.endsWith("ms")) {
num = num.substring(0,num.length()-2);
k = 1;
} else if (num.endsWith("s")) {
num = num.substring(0,num.length()-1);
}
int parseInt;
try {
parseInt = Integer.parseInt(num);
} catch (NumberFormatException e) {
parseInt = 3;
k = 1000;
}
try {
Thread.sleep(parseInt * k);
} catch (InterruptedException e) {
// ok
}
}
}
protected void buildProjects(IProject[] projects, IProgressMonitor monitor) throws CoreException {
// do nothing, project can be rebuild for each launch individually
@ -211,15 +289,15 @@ public class MultiLaunchConfigurationDelegate extends LaunchConfigurationDelegat
String name = prop.substring(k + 1);
if (name.equals(NAME_PROP)) {
MultiLaunchConfigurationDelegate.LaunchElement el = new MultiLaunchConfigurationDelegate.LaunchElement();
el.index = index;
el.name = (String) attrs.get(attr);
el.action = (String) attrs.get(getProp(index, ACTION_PROP));
el.mode = (String) attrs.get(getProp(index, MODE_PROP));
el.enabled = "true".equals(attrs.get(getProp(index, ENABLED_PROP))); //$NON-NLS-1$
el.setIndex(index);
el.setName((String) attrs.get(attr));
el.setAction((String) attrs.get(getProp(index, ACTION_PROP)));
el.setMode((String) attrs.get(getProp(index, MODE_PROP)));
el.setEnabled("true".equals(attrs.get(getProp(index, ENABLED_PROP)))); //$NON-NLS-1$
try {
el.data = findLaunch(el.name);
el.setData(findLaunch(el.getName()));
} catch (Exception e) {
el.data = null;
el.setData(null);
}
while (index >= input.size()) {
input.add(null);
@ -244,10 +322,10 @@ public class MultiLaunchConfigurationDelegate extends LaunchConfigurationDelegat
for (Iterator<LaunchElement> iterator = input.iterator(); iterator.hasNext();) {
MultiLaunchConfigurationDelegate.LaunchElement el = iterator.next();
if (el == null) continue;
configuration.setAttribute(MultiLaunchConfigurationDelegate.getProp(i, NAME_PROP), el.name);
configuration.setAttribute(MultiLaunchConfigurationDelegate.getProp(i, ACTION_PROP), el.action);
configuration.setAttribute(MultiLaunchConfigurationDelegate.getProp(i, MODE_PROP), el.mode);
configuration.setAttribute(MultiLaunchConfigurationDelegate.getProp(i, ENABLED_PROP), el.enabled + ""); //$NON-NLS-1$
configuration.setAttribute(MultiLaunchConfigurationDelegate.getProp(i, NAME_PROP), el.getName());
configuration.setAttribute(MultiLaunchConfigurationDelegate.getProp(i, ACTION_PROP), el.getAction());
configuration.setAttribute(MultiLaunchConfigurationDelegate.getProp(i, MODE_PROP), el.getMode());
configuration.setAttribute(MultiLaunchConfigurationDelegate.getProp(i, ENABLED_PROP), el.isEnabled() + ""); //$NON-NLS-1$
i++;
}
}

View file

@ -1,9 +1,11 @@
package org.eclipse.cdt.launch.internal.ui;
import java.util.HashMap;
import java.util.Iterator;
import org.eclipse.cdt.launch.internal.MultiLaunchConfigurationDelegate;
import org.eclipse.cdt.launch.internal.MultiLaunchConfigurationDelegate.LaunchElement;
import org.eclipse.cdt.launch.ui.ComboControlledStackComposite;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
@ -29,10 +31,12 @@ import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
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.ui.dialogs.PatternFilter;
@ -46,6 +50,7 @@ public class MultiLaunchConfigurationSelectionDialog extends TitleAreaDialog imp
private ISelection fSelection;
private ILaunchGroup[] launchGroups;
private String mode;
private String action;
private boolean isDefaultMode;
private ViewerFilter emptyTypeFilter;
private IStructuredSelection fInitialSelection;
@ -160,9 +165,30 @@ public class MultiLaunchConfigurationSelectionDialog extends TitleAreaDialog imp
isDefaultMode = ((Button) e.widget).getSelection();
}
});
checkBox.setSelection(isDefaultMode);
createPostLaunchControl(comp);
return comp;
}
private void createPostLaunchControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayout(new GridLayout(2, false));
comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label label = new Label(comp, SWT.NONE);
label.setText("Post launch action:");
Combo combo = new Combo(comp, SWT.READ_ONLY);
combo.add(LaunchElement.POST_LAUNCH_CONTINUE);
combo.add(LaunchElement.POST_LAUNCH_WAIT_FOR_TERM);
combo.add(LaunchElement.POST_LAUNCH_DELAY_3_SEC);
combo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
action = ((Combo) e.widget).getText();
}
});
combo.setText(action==null?LaunchElement.POST_LAUNCH_CONTINUE:action);
}
public ILaunchConfiguration getSelectedLaunchConfiguration() {
if (fSelection != null && !fSelection.isEmpty()) {
Object firstElement = ((IStructuredSelection) fSelection).getFirstElement();
@ -179,6 +205,10 @@ public class MultiLaunchConfigurationSelectionDialog extends TitleAreaDialog imp
return mode;
}
public String getAction(){
return action;
}
public static MultiLaunchConfigurationSelectionDialog createDialog(Shell shell, String title, String groupId) {
return new MultiLaunchConfigurationSelectionDialog(shell, title, groupId);
}
@ -200,8 +230,10 @@ public class MultiLaunchConfigurationSelectionDialog extends TitleAreaDialog imp
}
}
public void setInitialSelection(ILaunchConfiguration data) {
fInitialSelection = new StructuredSelection(data);
public void setInitialSelection(LaunchElement el) {
action = el.getAction();
isDefaultMode = el.getMode().equals(MultiLaunchConfigurationDelegate.DEFAULT_MODE);
fInitialSelection = new StructuredSelection(el.getData());
fSelection = fInitialSelection;
}
}

View file

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.cdt.launch.internal.MultiLaunchConfigurationDelegate;
import org.eclipse.cdt.launch.internal.MultiLaunchConfigurationDelegate.LaunchElement;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
@ -14,7 +15,9 @@ import org.eclipse.debug.ui.ILaunchConfigurationDialog;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.BaseLabelProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
@ -23,6 +26,7 @@ import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
@ -41,7 +45,7 @@ import org.eclipse.ui.PlatformUI;
*/
public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup {
static class ContentProvider implements IStructuredContentProvider, ITreeContentProvider {
protected ArrayList input;
protected ArrayList<LaunchElement> input;
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
@ -81,13 +85,13 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
return null;
if (columnIndex == 0) {
MultiLaunchConfigurationDelegate.LaunchElement el = (MultiLaunchConfigurationDelegate.LaunchElement) element;
if (el.data == null) {
if (el.getData() == null) {
Image errorImage = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
return errorImage;
}
try {
String key = el.data.getType().getIdentifier();
String key = el.getData().getType().getIdentifier();
return DebugPluginImages.getImage(key);
} catch (CoreException e) {
Image errorImage = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
@ -103,14 +107,14 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
MultiLaunchConfigurationDelegate.LaunchElement el = (MultiLaunchConfigurationDelegate.LaunchElement) element;
if (columnIndex == 0)
try {
return (el.data != null) ? el.data.getType().getName() + "::" + el.name : el.name; //$NON-NLS-1$
return (el.getData() != null) ? el.getData().getType().getName() + "::" + el.getName() : el.getName(); //$NON-NLS-1$
} catch (CoreException e) {
return el.name;
return el.getName();
}
if (columnIndex == 1)
return el.mode;
return el.getMode();
if (columnIndex == 2)
return el.action;
return el.getAction();
return null;
}
}
@ -210,6 +214,9 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
TreeColumn col2 = new TreeColumn(table, SWT.NONE);
col2.setText(LaunchMessages.getString("MultiLaunchConfigurationTabGroup.7")); //$NON-NLS-1$
col2.setWidth(100);
TreeColumn col3 = new TreeColumn(table, SWT.NONE);
col3.setText("Action");
col3.setWidth(100);
treeViewer.setInput(input);
final ButtonComposite buts = new ButtonComposite(comp, SWT.NONE) {
@ -223,13 +230,13 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
if (conf==null) return;
MultiLaunchConfigurationDelegate.LaunchElement el = new MultiLaunchConfigurationDelegate.LaunchElement();
input.add(el);
el.index = input.size() - 1;
el.enabled = true;
el.name = conf.getName();
el.data = conf;
el.mode = dialog.getMode();
el.setIndex(input.size() - 1);
el.setEnabled(true);
el.setName(conf.getName());
el.setData(conf);
el.setMode(dialog.getMode());
treeViewer.refresh(true);
treeViewer.setChecked(el, el.enabled);
treeViewer.setChecked(el, el.isEnabled());
updateWidgetEnablement();
updateLaunchConfigurationDialog();
}
@ -251,17 +258,17 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
.get(index);
MultiLaunchConfigurationSelectionDialog dialog = MultiLaunchConfigurationSelectionDialog.createDialog(treeViewer
.getControl().getShell(), LaunchMessages.getString("MultiLaunchConfigurationTabGroup.9"), //$NON-NLS-1$
el.mode
el.getMode()
);
dialog.setInitialSelection(el.data);
dialog.setInitialSelection(el);
if (dialog.open() == Dialog.OK) {
ILaunchConfiguration conf = dialog.getSelectedLaunchConfiguration();
if (conf==null) return;
el.name = conf.getName();
el.data = conf;
el.mode = dialog.getMode();
el.setName(conf.getName());
el.setData(conf);
el.setMode(dialog.getMode());
el.setAction(dialog.getAction());
treeViewer.refresh(true);
treeViewer.setChecked(el, el.enabled);
updateWidgetEnablement();
updateLaunchConfigurationDialog();
}
@ -329,6 +336,20 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
buts.updateWidgetEnablement();
}
});
treeViewer.getTree().addSelectionListener(new SelectionAdapter(){
@Override
public void widgetDefaultSelected(SelectionEvent e) {
buts.editPressed();
}
});
treeViewer.addCheckStateListener(new ICheckStateListener(){
public void checkStateChanged(CheckStateChangedEvent event) {
((LaunchElement)event.getElement()).setEnabled(event.getChecked());
updateLaunchConfigurationDialog();
}
});
buts.updateWidgetEnablement();
GridData layoutData = new GridData(GridData.GRAB_VERTICAL);
layoutData.verticalAlignment = SWT.BEGINNING;
@ -345,7 +366,7 @@ public class MultiLaunchConfigurationTabGroup extends AbstractLaunchConfiguratio
for (Iterator iterator = input.iterator(); iterator.hasNext();) {
MultiLaunchConfigurationDelegate.LaunchElement el = (MultiLaunchConfigurationDelegate.LaunchElement) iterator
.next();
treeViewer.setChecked(el, el.enabled);
treeViewer.setChecked(el, el.isEnabled());
}
treeViewer.refresh(true);
}