package openworkspace.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWindowActionDelegate; /** * Our sample action implements workbench action delegate. * The action proxy will be created by the workbench and * shown in the UI. When the user tries to use the action, * this delegate will be created and execution will be * delegated to it. * @see IWorkbenchWindowActionDelegate */ public class SampleAction implements IWorkbenchWindowActionDelegate { private IWorkbenchWindow window; private static final String PROP_VM = "eclipse.vm"; //$NON-NLS-1$ private static final String PROP_VMARGS = "eclipse.vmargs"; //$NON-NLS-1$ private static final String PROP_COMMANDS = "eclipse.commands"; //$NON-NLS-1$ /** * The constructor. */ public SampleAction() { } /** * The action has been activated. The argument of the * method represents the 'real' action sitting * in the workbench UI. * @see IWorkbenchWindowActionDelegate#run */ public void run(IAction action) { String path = new DirectoryDialog(window.getShell()).open(); if (path == null) return; String command = buildCommandLine("-data", path); System.setProperty("eclipse.exitcode", Integer.toString(24)); System.setProperty("eclipse.exitdata", command); window.getWorkbench().restart(); } private String buildCommandLine(String arg, String value) { StringBuffer result = new StringBuffer(300); String entry = System.getProperty(PROP_VM); if (entry == null) return null; result.append(entry ); result.append('\n'); // append the vmargs and commands. Assume that these already end in \n entry = System.getProperty(PROP_VMARGS); if (entry != null) result.append(entry); entry = System.getProperty(PROP_COMMANDS); if (entry != null) { entry = "\n" + entry; int i = entry.indexOf("\n" + arg + "\n"); if (i == -1) entry = arg + "\n" + value + entry; else { i += arg.length() + 2; // skip the leading \n String left = entry.substring(1, i); int j = entry.indexOf('\n', i); String right = entry.substring(j); entry = left + value + right; } result.append(entry); } return result.toString(); } /** * Selection in the workbench has been changed. We * can change the state of the 'real' action here * if we want, but this can only happen after * the delegate has been created. * @see IWorkbenchWindowActionDelegate#selectionChanged */ public void selectionChanged(IAction action, ISelection selection) { } /** * We can use this method to dispose of any system * resources we previously allocated. * @see IWorkbenchWindowActionDelegate#dispose */ public void dispose() { } /** * We will cache window object in order to * be able to provide parent shell for the message dialog. * @see IWorkbenchWindowActionDelegate#init */ public void init(IWorkbenchWindow window) { this.window = window; } }