blob: a12db1abfde5a54e802d53ba7037e672a7ff1d64 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Christian Pontesegger and others.
* 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
*
* Contributors:
* Christian Pontesegger - initial API and implementation
*******************************************************************************/
package org.eclipse.ease.ui.scripts.ui;
import org.eclipse.core.runtime.IPath;
import org.eclipse.ease.IScriptEngine;
import org.eclipse.ease.IScriptEngineProvider;
import org.eclipse.ease.ui.Activator;
import org.eclipse.ease.ui.scripts.repository.IRepositoryService;
import org.eclipse.ease.ui.scripts.repository.IScript;
import org.eclipse.ease.ui.scripts.repository.IScriptListener;
import org.eclipse.ease.ui.scripts.repository.impl.ParameterDelta;
import org.eclipse.ease.ui.scripts.repository.impl.ScriptEvent;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.menus.IMenuService;
/**
* SWT Composite that displays available macros. Implemented as a tree viewer.
*/
public class ScriptComposite extends Composite implements IScriptListener {
private final TreeViewer treeViewer;
private IDoubleClickListener fDoubleClickListener = new IDoubleClickListener() {
@Override
public void doubleClick(final DoubleClickEvent event) {
final Object element = ((IStructuredSelection) event.getSelection()).getFirstElement();
if ((element instanceof IScript) && (fEngineProvider != null)) {
final IScriptEngine scriptEngine = fEngineProvider.getScriptEngine();
if (scriptEngine != null)
scriptEngine.executeAsync("include('script:/" + ((IScript) element).getPath() + "');");
}
}
};
private IScriptEngineProvider fEngineProvider = null;
/**
* Constructor creating the script tree viewer.
*
* @param engineProvider
* component providing script support
* @param site
* site to implement this component on
* @param parent
* parent SWT element
* @param style
* composite style flags
*/
public ScriptComposite(final IScriptEngineProvider engineProvider, final IWorkbenchPartSite site,
final Composite parent, final int style) {
super(parent, style);
fEngineProvider = engineProvider;
setLayout(new FillLayout(SWT.HORIZONTAL));
treeViewer = new TreeViewer(this, SWT.BORDER);
treeViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(final Object element) {
if (element instanceof IPath)
return ((IPath) element).lastSegment();
if (element instanceof IScript)
return ((IScript) element).getName();
return super.getText(element);
}
@Override
public Image getImage(final Object element) {
if (element instanceof IPath)
return Activator.getImage(Activator.PLUGIN_ID, "/icons/eobj16/folder.png", true);
if (element instanceof IScript)
return Activator.getImage(org.eclipse.ease.ui.scripts.Activator.PLUGIN_ID,
"/icons/eobj16/script.png", true);
return super.getImage(element);
}
});
treeViewer.setContentProvider(new ScriptContentProvider());
treeViewer.setComparator(new ViewerComparator() {
@Override
public int category(final Object element) {
return (element instanceof IPath) ? 0 : 1;
}
});
final IRepositoryService repositoryService = (IRepositoryService) PlatformUI.getWorkbench().getService(
IRepositoryService.class);
treeViewer.setInput(repositoryService);
if (fDoubleClickListener != null)
treeViewer.addDoubleClickListener(fDoubleClickListener);
// add listener for script repository changes
repositoryService.addScriptListener(this);
// add context menu support
final MenuManager menuManager = new MenuManager();
final Menu menu = menuManager.createContextMenu(treeViewer.getTree());
treeViewer.getTree().setMenu(menu);
site.registerContextMenu(menuManager, treeViewer);
site.setSelectionProvider(treeViewer);
// add dynamic context menu entries
final IMenuService menuService = (IMenuService) PlatformUI.getWorkbench().getService(IMenuService.class);
menuService.addContributionFactory(new ScriptContextMenuEntries("popup:" + site.getId()));
menuManager.setRemoveAllWhenShown(true);
// add DND support
ScriptDragSource.addDragSupport(treeViewer);
// register for change events
repositoryService.addScriptListener(this);
}
// TODO change this filter to scripttype
public void setEngine(final String engineID) {
treeViewer.setFilters(new ViewerFilter[] { new ScriptEngineFilter(engineID) });
}
@Override
public void dispose() {
final IRepositoryService repositoryService = (IRepositoryService) PlatformUI.getWorkbench().getService(
IRepositoryService.class);
repositoryService.removeScriptListener(this);
super.dispose();
}
public void setDoubleClickListener(final IDoubleClickListener doubleClickListener) {
if ((fDoubleClickListener != null) && (treeViewer != null))
treeViewer.removeDoubleClickListener(fDoubleClickListener);
fDoubleClickListener = doubleClickListener;
if ((fDoubleClickListener != null) && (treeViewer != null))
treeViewer.addDoubleClickListener(fDoubleClickListener);
}
@Override
public void notify(final ScriptEvent event) {
switch (event.getType()) {
case ScriptEvent.PARAMETER_CHANGE:
final ParameterDelta eventData = (ParameterDelta) event.getEventData();
if (!eventData.isAffected("name"))
return;
// name changed, fall through
case ScriptEvent.DELETE:
// fall through
case ScriptEvent.ADD:
// FIXME needs some performance improvements on multiple script
// updates
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
treeViewer.refresh();
}
});
}
}
}