package org.marketcetera.photon.internal.strategy.engine.ui.workbench.ws; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.eclipse.ui.model.BaseWorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.marketcetera.photon.strategy.engine.ui.ScriptSelectionButton; import org.marketcetera.photon.strategy.engine.ui.workbench.ws.StrategyEngineWorkspaceUI; import org.marketcetera.util.misc.ClassVersion; /* $License$ */ /** * A {@link ScriptSelectionButton} that selects scripts from the workspace and * returns the result as a platform resource URL. * * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: WorkspaceScriptSelectionButton.java 16154 2012-07-14 16:34:05Z colin $ * @since 2.0.0 */ @ClassVersion("$Id: WorkspaceScriptSelectionButton.java 16154 2012-07-14 16:34:05Z colin $") public class WorkspaceScriptSelectionButton extends ScriptSelectionButton { /** * The prefix used to convert an IFile path to a platform resource URL. */ private static final String PLATFORM_RESOURCE_URL_PREFIX = "platform:/resource"; //$NON-NLS-1$ /** * Constructor. */ public WorkspaceScriptSelectionButton() { super(Messages.WORKSPACE_SCRIPT_SELECTION_BUTTON__LABEL.getText()); } @Override public String selectScript(Shell shell, String current) { final ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog( shell, new WorkbenchLabelProvider(), new BaseWorkbenchContentProvider()); dialog .setTitle(Messages.WORKSPACE_SCRIPT_SELECTION_BUTTON_DIALOG__TITLE .getText()); dialog .setMessage(Messages.WORKSPACE_SCRIPT_SELECTION_BUTTON_DIALOG_PROMPT .getText()); dialog .setEmptyListMessage(Messages.WORKSPACE_SCRIPT_SELECTION_BUTTON_EMPTY_WORKSPACE .getText()); dialog.setAllowMultiple(false); dialog.setInput(ResourcesPlugin.getWorkspace().getRoot()); if (current != null) { if (current.startsWith(PLATFORM_RESOURCE_URL_PREFIX)) { dialog.setInitialSelection(ResourcesPlugin.getWorkspace() .getRoot().getFile( new Path(current .substring(PLATFORM_RESOURCE_URL_PREFIX .length())))); } } dialog.addFilter(new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IFile) { // filter dotfiles return !(((IFile) element).getName()).startsWith("."); //$NON-NLS-1$ } return true; } }); dialog.setValidator(new ISelectionStatusValidator() { @Override public IStatus validate(Object[] selection) { // only accept files if (selection.length > 0 && selection[0] instanceof IFile) { return new Status(IStatus.OK, StrategyEngineWorkspaceUI.PLUGIN_ID, null, null); } else { return new Status(IStatus.ERROR, StrategyEngineWorkspaceUI.PLUGIN_ID, null, null); } } }); dialog.open(); IFile result = (IFile) dialog.getFirstResult(); if (result == null) { return null; } else { return PLATFORM_RESOURCE_URL_PREFIX + result.getFullPath().toString(); } } }