Java tutorial
/** * Copyright (c) 2005-2006 Aptana, Inc. 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. If redistributing this code, this entire header must remain intact. */ package org.eclipse.eclipsemonkey.views.scriptsView; import java.io.File; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.eclipsemonkey.EclipseMonkeyPlugin; import org.eclipse.eclipsemonkey.IScriptStoreListener; import org.eclipse.eclipsemonkey.MenuRunMonkeyScript; import org.eclipse.eclipsemonkey.RunMonkeyException; import org.eclipse.eclipsemonkey.StoredScript; import org.eclipse.eclipsemonkey.utils.UIUtils; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.FileTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.plugin.AbstractUIPlugin; import com.aptana.ide.core.ui.PreferenceUtils; /** * ScriptsView * * @author Paul Colton (Aptana, Inc.) */ public class ScriptsView extends ViewPart implements IScriptStoreListener { /* * Fields */ static final String INFO_MESSAGE = Messages.ScriptsView_INF_MSG_Aptana_scripts_view; static final String[] FILTER_EXTENSIONS = new String[] { "*.js", "*.*" }; //$NON-NLS-1$ //$NON-NLS-2$ static final String[] FILTER_NAMES = new String[] { MessageFormat.format(Messages.ScriptsView_Javascript_files_0, new Object[] { FILTER_EXTENSIONS[0] }), MessageFormat.format(Messages.ScriptsView_All_files_0, new Object[] { FILTER_EXTENSIONS[1] }) }; private static Image fProfileFileIcon = getImageDescriptor("icons/js_file.gif").createImage(); //$NON-NLS-1$ private static ImageDescriptor fAddFileIconDescriptor = getImageDescriptor("icons/js_file_new.gif"); //$NON-NLS-1$ private static ImageDescriptor fRefreshIconDescriptor = getImageDescriptor("icons/refresh.gif"); //$NON-NLS-1$ private static ImageDescriptor fEditIconDescriptor = getImageDescriptor("icons/pencil.png"); //$NON-NLS-1$ private static Image fErrIcon = getImageDescriptor("icons/error.gif").createImage(); //$NON-NLS-1$ private static Image fProfileIcon = getImageDescriptor("icons/profile.gif").createImage(); //$NON-NLS-1$ private static Image fProfileDynamicIcon = getImageDescriptor("icons/profile-dynamic.gif").createImage(); //$NON-NLS-1$ private TreeViewer viewer; private StackLayout layout; private Composite viewParent; private Label infoLabel; private Font infoLabelFont; private static ImageRegistry imageRegistry = new ImageRegistry(); private org.eclipse.jface.action.Action actionNewActionSet; private org.eclipse.jface.action.Action actionAdd; private org.eclipse.jface.action.Action actionEdit; private org.eclipse.jface.action.Action actionReload; private Action actionCollapseAll; private Action actionRefresh; private org.eclipse.jface.action.Action actionDelete; private org.eclipse.jface.action.Action actionDoubleClick; private org.eclipse.jface.action.Action actionAddCurrentFile; private org.eclipse.jface.action.Action actionExecute; private org.eclipse.jface.action.Action actionMakeExecutable; private ArrayList listeners = new ArrayList(); private Pattern submenu_pattern = Pattern.compile("^(.+?)>(.*)$"); //$NON-NLS-1$ private ScriptActionsManager _scriptActionsManager; /* * Constructor. */ /** * ScriptsView */ public ScriptsView() { _scriptActionsManager = ScriptActionsManager.getInstance(); } /* * Methods */ /** * fireActionsViewEvent * * @param e */ public void fireActionsViewEvent(ScriptActionsViewEvent e) { for (int i = 0; i < listeners.size(); i++) { IScriptActionsViewEventListener listener = (IScriptActionsViewEventListener) listeners.get(i); listener.onScriptActionsViewEvent(e); } } /** * addActionsViewEventListener * * @param l */ public void addScriptsViewEventListener(IScriptActionsViewEventListener l) { listeners.add(l); } /** * removeActionsViewEventListener * * @param l */ public void removeScriptsViewEventListener(IScriptActionsViewEventListener l) { listeners.remove(l); } /** * The content provider class is responsible for providing objects to the view. It can wrap existing objects in * adapters or simply return objects as-is. These objects may be sensitive to the current input of the view, or * ignore it and always show the same content (like Task List, for example). */ class ScriptsViewContentProvider implements ITreeContentProvider { /** * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, * java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer v, Object oldInput, Object newInput) { } /** * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { } /** * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object parent) { updateActionSets(); // Get actions and action sets IScriptAction[] actions = _scriptActionsManager.getAll(); if (actions != null && actions.length > 0) { if (layout != null && infoLabel != null && viewParent != null && layout.topControl == infoLabel) { layout.topControl = viewer.getControl(); viewParent.layout(); } return actions; } if (layout != null && infoLabel != null && viewParent != null) { layout.topControl = infoLabel; viewParent.layout(); } return new Object[0]; } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */ public Object[] getChildren(Object parentElement) { if (parentElement instanceof ScriptActionSet) { ScriptActionSet actionSet = (ScriptActionSet) parentElement; ScriptAction[] actions = actionSet.getScriptActions(); return actions; } else { return new Object[0]; } } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) */ public Object getParent(Object element) { if (element instanceof ScriptAction) { return ((ScriptAction) element).getParent(); } else { // ActionSets have no parents return null; } } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) */ public boolean hasChildren(Object element) { if (element instanceof ScriptActionSet) { ScriptActionSet actionSet = (ScriptActionSet) element; return actionSet.getScriptActions().length > 0; } else { return false; } } } /** * ViewerSorterProvider * * @author Ingo Muschenetz */ class ScriptsViewSorterProvider extends ViewerSorter { /** * @see org.eclipse.jface.viewers.ViewerSorter#category(java.lang.Object) */ public int category(Object element) { if (element instanceof ScriptAction) { return 0; } else { return 1; } } /** * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, * java.lang.Object) */ public int compare(Viewer viewer, Object e1, Object e2) { int cat1 = category(e1); int cat2 = category(e2); if (cat1 == cat2) { IScriptAction action1 = (IScriptAction) e1; IScriptAction action2 = (IScriptAction) e2; return action1.getName().compareTo(action2.getName()); } else { return cat1 - cat2; } } } /** * ViewLabelProvider * * @author Ingo Muschenetz */ class ScriptsViewLabelProvider extends LabelProvider { /** * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) */ public String getText(Object element) { if (element instanceof IScriptAction) { IScriptAction profile = (IScriptAction) element; return profile.getName(); } else { return null; } } // public Image getColumnImage(Object obj, int index) // { // return getImage(obj); // } /** * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object) */ public Image getImage(Object obj) { if (obj instanceof ScriptActionSet) { ScriptActionSet set = (ScriptActionSet) obj; if (set.isExecutable()) { return fProfileDynamicIcon; } else { return fProfileIcon; } } else if (obj instanceof ScriptAction) { ScriptAction action = (ScriptAction) obj; IPath scriptPath = action.getStoredScript().metadata.getPath(); String imagePath = action.getStoredScript().metadata.getImage(); if (imagePath != null) { return getImageFromMetadata(scriptPath, imagePath); } else { return fProfileFileIcon; } } else { return null; } } } /** * @param scriptPath * @param imagePath * @return */ private Image getImageFromMetadata(IPath scriptPath, String imagePath) { IPath newPath = scriptPath.removeLastSegments(1).append(imagePath); String absolutePath = newPath.toFile().getAbsolutePath(); Image i = imageRegistry.get(absolutePath); if (i == null) { ImageDescriptor id = ImageDescriptor.createFromFile(null, absolutePath); if (id != null) { imageRegistry.put(absolutePath, id); i = imageRegistry.get(absolutePath); } } return i; } /** * @see org.eclipse.eclipsemonkey.IScriptStoreListener#storeChanged() */ public void storeChanged() { Display display = viewer.getControl().getDisplay(); if (!display.isDisposed()) { display.asyncExec(new Runnable() { public void run() { if (viewer.getControl().isDisposed()) return; viewer.refresh(); } }); } } private void updateActionSets() { ArrayList foundItems = new ArrayList(); Map scriptStore = EclipseMonkeyPlugin.getDefault().getScriptStore(); Object[] scripts = scriptStore.values().toArray(); for (int i = 0; i < scripts.length; i++) { if (scripts[i] instanceof StoredScript) { StoredScript s = (StoredScript) scripts[i]; if (s.metadata == null || s.metadata.getMenuName() == null) continue; String menuName = s.metadata.getMenuName().trim(); foundItems.add(menuName); Matcher match = submenu_pattern.matcher(menuName); if (match.find()) { String primary_key = match.group(1).trim(); String secondary_key = match.group(2).trim(); ScriptActionSet as = _scriptActionsManager.createScriptActionSet(primary_key); as.addScriptAction(secondary_key, s); } else { _scriptActionsManager.addScriptAction(menuName, s); } } } pruneUnusedActions(foundItems); } private void pruneUnusedActions(ArrayList foundItems) { ScriptAction[] actions = _scriptActionsManager.getScriptActions(); ScriptActionSet[] sets = _scriptActionsManager.getScriptActionSets(); for (int i = 0; i < actions.length; i++) { String name = actions[i].getStoredScript().metadata.getMenuName(); if (foundItems.contains(name) == false) _scriptActionsManager.removeScriptAction(actions[i]); } for (int i = 0; i < sets.length; i++) { actions = sets[i].getScriptActions(); for (int j = 0; j < actions.length; j++) { String name = actions[j].getStoredScript().metadata.getMenuName(); if (foundItems.contains(name) == false) _scriptActionsManager.removeScriptActionSet(name); } } } /** * @see org.eclipse.ui.IWorkbenchPart#dispose() */ public void dispose() { if (infoLabelFont != null) { infoLabelFont.dispose(); } if (fErrIcon != null) { fErrIcon.dispose(); } if (imageRegistry != null) { imageRegistry.dispose(); } EclipseMonkeyPlugin.getDefault().removeScriptStoreListener(this); } /** * This is a callback that will allow us to create the viewer and initialize it. * * @param parent */ public void createPartControl(Composite parent) { layout = new StackLayout(); parent.setLayout(layout); viewer = new TreeViewer(new Tree(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL)); viewer.setContentProvider(new ScriptsViewContentProvider()); viewer.setLabelProvider(new ScriptsViewLabelProvider()); viewer.setSorter(new ScriptsViewSorterProvider()); viewer.setInput(getViewSite()); viewer.expandAll(); infoLabel = new Label(parent, SWT.CENTER); infoLabel.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); infoLabelFont = new Font(parent.getDisplay(), Messages.ScriptsView_FNT_Aptana_scripts_view, 14, SWT.NONE); infoLabel.setFont(infoLabelFont); infoLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_GRAY)); infoLabel.setText(INFO_MESSAGE); layout.topControl = infoLabel; layout.topControl = viewer.getControl(); viewParent = parent; viewParent.layout(); final DropTarget labeldt = new DropTarget(infoLabel, DND.DROP_MOVE); labeldt.setTransfer(new Transfer[] { FileTransfer.getInstance() }); labeldt.addDropListener(new DropTargetAdapter() { public void drop(DropTargetEvent event) { handleDrop(event); } }); /* * DragSource ds = new DragSource(viewer.getControl(), DND.DROP_COPY | DND.DROP_MOVE); ds.setTransfer(new * Transfer[] { FileTransfer.getInstance() }); ds.addDragListener(new DragSourceAdapter() { public void * dragSetData(DragSourceEvent event) { IStructuredSelection selection = (IStructuredSelection) * viewer.getSelection(); if (FileTransfer.getInstance().isSupportedType(event.dataType)) { Object[] items = * selection.toArray(); ArrayList data = new ArrayList(); for (int j = 0; j < items.length; j++) { Object item = * items[j]; if (item instanceof ActionSet) { // no op } else if (item instanceof Action) { String path = * ((Action)item).getFilePath(); data.add(path); } } if (data.size() > 0) { event.data = data.toArray(new * String[0]); } } } }); */ DropTarget dt = new DropTarget(viewer.getControl(), DND.DROP_MOVE); dt.setTransfer(new Transfer[] { FileTransfer.getInstance() }); dt.addDropListener(new DropTargetAdapter() { public void drop(DropTargetEvent event) { handleDrop(event); } }); makeActions(); hookKeyActions(viewer.getControl()); hookContextMenu(); hookDoubleClickAction(); contributeToActionBars(); EclipseMonkeyPlugin.getDefault().addScriptStoreListener(this); PreferenceUtils.registerBackgroundColorPreference(viewer.getControl(), "com.aptana.ide.core.ui.background.color.scriptsView"); //$NON-NLS-1$ PreferenceUtils.registerForegroundColorPreference(viewer.getControl(), "com.aptana.ide.core.ui.foreground.color.scriptsView"); //$NON-NLS-1$ } /** * handleDrop * * @param event */ protected void handleDrop(DropTargetEvent event) { String[] files = (String[]) event.data; ArrayList paths = new ArrayList(); for (int i = 0; i < files.length; i++) { paths.add(new Path(files[i])); } if (paths.size() > 0) { IPath[] ipaths = (IPath[]) paths.toArray(new IPath[0]); ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.DROP); e.setPaths(ipaths); Widget w = event.item; if (w != null) { TreeItem item = (TreeItem) w; Object element = item.getData(); IScriptAction action = null; if (element instanceof ScriptActionSet) { action = (ScriptActionSet) element; } else if (element instanceof ScriptAction) { action = ((ScriptAction) element).getParent(); } if (action != null) { e.setName(action.getName()); } } fireActionsViewEvent(e); } } private void hookContextMenu() { MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { ISelection selection = viewer.getSelection(); Object firstElement = ((IStructuredSelection) selection).getFirstElement(); ScriptsView.this.fillContextMenu(manager, firstElement); } }); Menu menu = menuMgr.createContextMenu(viewer.getControl()); viewer.getControl().setMenu(menu); getSite().registerContextMenu(menuMgr, viewer); } private void contributeToActionBars() { IActionBars bars = getViewSite().getActionBars(); fillLocalPullDown(bars.getMenuManager()); fillLocalToolBar(bars.getToolBarManager()); } private void fillLocalPullDown(IMenuManager manager) { // No toolbar items for the moment // manager.add(new Separator()); } private void fillContextMenu(IMenuManager manager, Object element) { if (element instanceof ScriptActionSet) { ScriptActionSet set = (ScriptActionSet) element; if (set.isExecutable()) { manager.add(actionExecute); } manager.add(actionMakeExecutable); } else { manager.add(actionExecute); } manager.add(new Separator()); // manager.add(actionAddCurrentFile); if (element instanceof ScriptActionSet == false) { manager.add(actionEdit); } // manager.add(actionReload); // manager.add(actionDelete); // Other plug-ins can contribute there actions here manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } private void fillLocalToolBar(IToolBarManager manager) { manager.add(actionEdit); manager.add(actionCollapseAll); manager.add(actionRefresh); } class PushButtonAction extends Action { /** * PushButtonAction * * @param text */ public PushButtonAction(String text) { super(text, Action.AS_PUSH_BUTTON); } } private void makeActions() { actionRefresh = new PushButtonAction(Messages.ScriptsView_LBL_Refresh) { public void run() { _scriptActionsManager.clearAll(); viewer.refresh(); } }; actionRefresh.setToolTipText(Messages.ScriptsView_TTP_Refresh); actionRefresh.setImageDescriptor(fRefreshIconDescriptor); actionMakeExecutable = new org.eclipse.jface.action.Action() { public void run() { ISelection selection = viewer.getSelection(); if (selection != null && selection instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) selection; Object element = structuredSelection.getFirstElement(); if (element instanceof ScriptActionSet) { if (((ScriptActionSet) element).isExecutable()) { ((ScriptActionSet) element).setExecutable(false); } else { ((ScriptActionSet) element).setExecutable(true); } viewer.refresh(); } } } }; actionMakeExecutable.setText(Messages.ScriptsView_LBL_Toggle_executable); actionMakeExecutable.setToolTipText(Messages.ScriptsView_TTP_Toggle_executable); actionExecute = new org.eclipse.jface.action.Action() { public void run() { ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.EXECUTE); ISelection selection = viewer.getSelection(); if (selection != null && selection instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) selection; Object element = structuredSelection.getFirstElement(); IScriptAction[] actions; if (element instanceof ScriptAction) { actions = new IScriptAction[] { (IScriptAction) element }; executeScript((ScriptAction) element); } else if (element instanceof ScriptActionSet) { actions = ((ScriptActionSet) element).getScriptActions(); for (int i = 0; i < actions.length; i++) { executeScript(actions[i]); } } else { actions = new IScriptAction[0]; } e.setActions(actions); } fireActionsViewEvent(e); } }; actionExecute.setText(Messages.ScriptsView_LBL_Execute); actionExecute.setToolTipText(Messages.ScriptsView_TTP_Execute); actionAddCurrentFile = new org.eclipse.jface.action.Action() { public void run() { ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.ADD_CURRENT_FILE); ISelection selection = viewer.getSelection(); if (selection != null) { Object firstElement = ((IStructuredSelection) selection).getFirstElement(); if (firstElement instanceof ScriptActionSet) { e.setName(((ScriptActionSet) firstElement).getName()); } } fireActionsViewEvent(e); } }; actionAddCurrentFile.setText(Messages.ScriptsView_LBL_Add_current_file); actionAddCurrentFile.setToolTipText(Messages.ScriptsView_TTP_Add_current_file); actionNewActionSet = new org.eclipse.jface.action.Action() { public void run() { InputDialog input = new InputDialog(getSite().getShell(), Messages.ScriptsView_TTL_New_action_set_name, Messages.ScriptsView_MSG_New_action_set_name, org.eclipse.eclipsemonkey.utils.StringUtils.EMPTY, null); if (input.open() == Window.OK && input.getValue().length() > 0) { ScriptActionsViewEvent e = new ScriptActionsViewEvent( ScriptActionsViewEventTypes.CREATE_ACTION_SET); e.setName(input.getValue()); fireActionsViewEvent(e); } } }; actionNewActionSet.setText(Messages.ScriptsView_LBL_New_script_set); actionNewActionSet.setToolTipText(Messages.ScriptsView_TTP_New_script_set); actionNewActionSet.setImageDescriptor(fAddFileIconDescriptor); actionEdit = new org.eclipse.jface.action.Action() { public void run() { ISelection selection = viewer.getSelection(); if (selection != null) { Object firstElement = ((IStructuredSelection) selection).getFirstElement(); if (firstElement instanceof ScriptAction) { ScriptAction a = (ScriptAction) firstElement; editAction(a); } } } }; actionEdit.setText(Messages.ScriptsView_LBL_Edit_script); actionEdit.setToolTipText(Messages.ScriptsView_TTP_Edit_script); actionEdit.setImageDescriptor(fEditIconDescriptor); actionReload = new org.eclipse.jface.action.Action() { public void run() { ISelection selection = viewer.getSelection(); if (selection != null) { Object firstElement = ((IStructuredSelection) selection).getFirstElement(); if (firstElement instanceof ScriptAction) { ScriptAction a = (ScriptAction) firstElement; reloadAction(a); } } } }; actionReload.setText(Messages.ScriptsView_LBL_Reload_script); actionReload.setToolTipText(Messages.ScriptsView_TTP_Reload_script); actionAdd = new org.eclipse.jface.action.Action() { public void run() { FileDialog fileDialog = new FileDialog(viewer.getControl().getShell(), SWT.MULTI); fileDialog.setFilterExtensions(FILTER_EXTENSIONS); fileDialog.setFilterNames(FILTER_NAMES); String text = fileDialog.open(); if (text != null) { IPath basePath = new Path(fileDialog.getFilterPath()); String[] fileNames = fileDialog.getFileNames(); IPath[] paths = new IPath[fileNames.length]; for (int i = 0; i < paths.length; i++) { paths[i] = basePath.append(fileNames[i]); } ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.ADD); e.setPaths(paths); fireActionsViewEvent(e); } } }; actionAdd.setText(Messages.ScriptsView_LBL_Add_file); actionAdd.setToolTipText(Messages.ScriptsView_TTP_Add_file); actionAdd.setImageDescriptor(fAddFileIconDescriptor); actionDelete = new org.eclipse.jface.action.Action() { public void run() { removeFiles(viewer.getSelection()); } }; actionDelete.setText(Messages.ScriptsView_LBL_Remove_file); actionDelete.setToolTipText(Messages.ScriptsView_TTP_Remove_file); actionDelete.setImageDescriptor( PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)); actionDoubleClick = new org.eclipse.jface.action.Action() { public void run() { ISelection selection = viewer.getSelection(); Object firstElement = ((IStructuredSelection) selection).getFirstElement(); if (firstElement instanceof ScriptActionSet) { toggleElementState(firstElement); } else if (firstElement instanceof IScriptAction) { ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.EXECUTE); IScriptAction[] actions = new IScriptAction[] { (IScriptAction) firstElement }; e.setActions(actions); fireActionsViewEvent(e); executeScript((ScriptAction) firstElement); } } }; this.actionCollapseAll = new Action(Messages.ScriptsView_LBL_Collapse_all) { public void run() { if (viewer != null) { viewer.collapseAll(); } } }; this.actionCollapseAll.setToolTipText(Messages.ScriptsView_TTP_Collapse_all); this.actionCollapseAll.setImageDescriptor(getImageDescriptor("icons/collapseall.gif")); //$NON-NLS-1$ } /** * executeScript * * @param script */ private void executeScript(IScriptAction script) { MenuRunMonkeyScript run = new MenuRunMonkeyScript(script.getStoredScript().scriptPath); try { run.run("main", new Object[] {}); //$NON-NLS-1$ } catch (RunMonkeyException e1) { e1.printStackTrace(); } } /** * toggleElementState * * @param element */ private void toggleElementState(Object element) { boolean state = viewer.getExpandedState(element); if (state) { viewer.setExpandedState(element, false); } else { viewer.setExpandedState(element, true); } } /** * Removes one or more files * * @param selection * The currently selected files */ private void removeFiles(ISelection selection) { if (!(selection instanceof StructuredSelection)) { return; } Object o = ((StructuredSelection) selection).getFirstElement(); if (o == null) { return; } if (o instanceof ScriptActionSet) { ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.DELETE_ACTION_SET); e.setName(((ScriptActionSet) o).getName()); fireActionsViewEvent(e); } else { ArrayList actionsList = new ArrayList(); for (Iterator iter = ((StructuredSelection) selection).iterator(); iter.hasNext();) { actionsList.add(iter.next()); } ScriptAction[] actions = (ScriptAction[]) actionsList.toArray(new ScriptAction[0]); if (actions.length > 0) { ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.DELETE); e.setActions(actions); fireActionsViewEvent(e); } } } // private void showMessage(String message) { // MessageDialog.openInformation( // viewer.getControl().getShell(), // "File Explorer", // message); // } /** * hookDoubleClickAction */ private void hookDoubleClickAction() { viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { actionDoubleClick.run(); } }); } /** * hookKeyActions * * @param control */ private void hookKeyActions(Control control) { control.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { if (e.character == SWT.DEL) { removeFiles(viewer.getSelection()); } } public void keyReleased(KeyEvent e) { } }); } /** * Passing the focus request to the viewer's control. */ public void setFocus() { viewer.getControl().setFocus(); } /** * Retrieves the image descriptor associated with resource from the image descriptor registry. If the image * descriptor cannot be retrieved, attempt to find and load the image descriptor at the location specified in * resource. * * @param imageFilePath * the image descriptor to retrieve * @return The image descriptor assocated with resource or the default "missing" image descriptor if one could not * be found */ private static ImageDescriptor getImageDescriptor(String imageFilePath) { ImageDescriptor imageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.eclipsemonkey.ui", //$NON-NLS-1$ imageFilePath); if (imageDescriptor == null) { imageDescriptor = ImageDescriptor.getMissingImageDescriptor(); } return imageDescriptor; } /** * expandAll */ public void expandAll() { this.viewer.expandAll(); } /** * expandActionSet * * @param setName */ public void expandScriptActionSet(String setName) { TreeItem[] treeItems = viewer.getTree().getItems(); for (int i = 0; i < treeItems.length; i++) { Object o = treeItems[i].getData(); if (o instanceof ScriptActionSet) { ScriptActionSet p = (ScriptActionSet) o; String name = p.getName(); if (name.equals(setName)) { viewer.setExpandedState(o, true); viewer.getTree().showItem(treeItems[i]); return; } } } } /** * selectAndReveal * * @param actionPath */ public void selectAndReveal(String actionPath) { IScriptAction a = findAction(actionPath); if (a != null && a instanceof ScriptAction) { selectAndReveal((ScriptAction) a); } } /** * selectAndReveal * * @param action */ public void selectAndReveal(ScriptAction action) { TreeItem[] treeItems = viewer.getTree().getItems(); forcePopulateTree(); for (int i = 0; i < treeItems.length; i++) { Object o = treeItems[i].getData(); if (o instanceof ScriptActionSet) { TreeItem[] children = treeItems[i].getItems(); for (int j = 0; j < children.length; j++) { IScriptAction a = (IScriptAction) children[j].getData(); if (a == action) { viewer.getTree().showItem(children[j]); viewer.getTree().setSelection(new TreeItem[] { children[j] }); return; } } } else if (o instanceof ScriptAction) { ScriptAction a = (ScriptAction) o; if (a == action) { viewer.getTree().showItem(treeItems[i]); viewer.getTree().setSelection(new TreeItem[] { treeItems[i] }); return; } } } } /** * forcePopulateTree */ public void forcePopulateTree() { viewer.getTree().setVisible(false); Object[] expandedElement = viewer.getExpandedElements(); viewer.expandAll(); viewer.setExpandedElements(expandedElement); viewer.getTree().setVisible(true); } /** * Find the action set for the given name * * @param name * The action set name to find * @return Returns the matching action set or null; */ public ScriptActionSet findActionSet(String name) { ScriptActionSet result = null; TreeItem[] treeItems = viewer.getTree().getItems(); for (int i = 0; i < treeItems.length; i++) { Object itemData = treeItems[i].getData(); if (itemData instanceof ScriptActionSet) { ScriptActionSet actionSet = (ScriptActionSet) itemData; if (actionSet.getName().equals(name)) { result = actionSet; break; } } } return result; } /** * findAction * * @param path * @return IAction */ public ScriptAction findAction(String path) { ScriptAction result = null; if (path != null && path.length() > 0 && path.charAt(0) == '/') { int slashIndex = path.indexOf('/', 1); if (slashIndex != -1) { String actionSetName = path.substring(1, slashIndex); String actionName = path.substring(slashIndex + 1); ScriptActionSet actionSet = findActionSet(actionSetName); if (actionSet != null) { ScriptAction[] actions = actionSet.getScriptActions(); for (int i = 0; i < actions.length; i++) { ScriptAction action = actions[i]; if (action.getName().equals(actionName)) { result = action; break; } } } } } return result; } /** * fireAction * * @param actionName */ public void fireAction(String actionName) { IScriptAction action = findAction(actionName); if (action != null) { ScriptActionsViewEvent actionEvent = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.EXECUTE); IScriptAction[] actions = new IScriptAction[] { action }; actionEvent.setActions(actions); fireActionsViewEvent(actionEvent); } } /** * refresh */ public void refresh() { this.viewer.refresh(); } /** * editAction * * @param path */ public void editAction(String path) { editAction(findAction(path)); } /** * editAction * * @param a */ private void editAction(final IScriptAction a) { if (a == null) { return; } IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IEditorDescriptor editorDesc = null; File f = a.getStoredScript().metadata.getPath().toFile(); try { editorDesc = IDE.getEditorDescriptor(f.getName()); if (editorDesc.isOpenExternal() == true) { editorDesc = IDE.getEditorDescriptor("foo.txt"); //$NON-NLS-1$ } } catch (PartInitException e) { System.err.println("Error opening file in editor: " + e); //$NON-NLS-1$ } try { // IEditorPart editorPart = IDE.openEditor(page, UIUtils.createJavaFileEditorInput(f), editorDesc.getId()); // if (editorPart instanceof IUnifiedEditor) // { // IUnifiedEditor editor = (IUnifiedEditor) editorPart; // // editor.addSaveListener(new ISaveEvent() // { // public void onSave(IEditorPart part) // { // reloadAction(a); // } // }); // } } catch (PartInitException e) { System.err.println("Error opening editor: " + e); //$NON-NLS-1$ } } /** * reloadAction * * @param a */ private void reloadAction(final IScriptAction a) { ScriptActionsViewEvent e = new ScriptActionsViewEvent(ScriptActionsViewEventTypes.RELOAD); e.setActions(new IScriptAction[] { a }); fireActionsViewEvent(e); } }