package org.nightlabs.jfire.scripting.ui.tree;
import java.util.Set;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerColumn;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.nightlabs.base.ui.resource.SharedImages;
import org.nightlabs.jfire.base.ui.jdo.notification.SelectionNotificationProxy;
import org.nightlabs.jfire.base.ui.jdo.tree.ActiveJDOObjectTreeComposite;
import org.nightlabs.jfire.base.ui.jdo.tree.ActiveJDOObjectTreeController;
import org.nightlabs.jfire.base.ui.jdo.tree.JDOObjectTreeContentProvider;
import org.nightlabs.jfire.base.ui.jdo.tree.JDOObjectTreeLabelProvider;
import org.nightlabs.jfire.base.ui.jdo.tree.JDOTreeNodesChangedEvent;
import org.nightlabs.jfire.base.ui.jdo.tree.JDOTreeNodesChangedEventHandler;
import org.nightlabs.jfire.scripting.Script;
import org.nightlabs.jfire.scripting.ScriptCategory;
import org.nightlabs.jfire.scripting.ScriptRegistryItem;
import org.nightlabs.jfire.scripting.id.ScriptRegistryItemID;
import org.nightlabs.jfire.scripting.ui.ScriptingPlugin;
/**
* @author Fitas Amine - fitas [at] nightlabs [dot] de
*/
public class ScriptRegistryItemTree extends ActiveJDOObjectTreeComposite<ScriptRegistryItemID, ScriptRegistryItem, ScriptRegistryItemNode>
{
/**
* This proxy delegates to the {@link NotificationManager}.
* It will extract the {@link ReportRegistryItem} from the {@link ReportRegistryItemNode}.
*/
protected static class SelectionProxy extends SelectionNotificationProxy {
public SelectionProxy(ScriptRegistryItemTree source, String zone, boolean ignoreInheritance, boolean clearOnEmptySelection) {
super(source, zone, ignoreInheritance, clearOnEmptySelection);
}
@Override
protected Object getPersistenceCapable(Object selectionObject) {
if (selectionObject instanceof ScriptRegistryItemNode)
return ((ScriptRegistryItemNode)selectionObject).getJdoObject();
return super.getPersistenceCapable(selectionObject);
}
}
protected class ContentProvider extends JDOObjectTreeContentProvider<ScriptRegistryItemID, ScriptRegistryItem, ScriptRegistryItemNode> {
@Override
public boolean hasJDOObjectChildren(ScriptRegistryItem jdoObject) {
return jdoObject instanceof ScriptCategory;
}
}
protected class LabelProvider extends JDOObjectTreeLabelProvider<ScriptRegistryItemID, ScriptRegistryItem, ScriptRegistryItemNode> {
@Override
protected String getJDOObjectText(ScriptRegistryItem jdoObject, int columnIndex) {
return jdoObject.getName().getText();
}
@Override
public Image getJDOObjectImage(ScriptRegistryItem jdoObject, int columnIndex) {
if (jdoObject.getClass().equals(ScriptCategory.class))
return SharedImages.getSharedImage(ScriptingPlugin.getDefault(), org.nightlabs.jfire.scripting.ui.ScriptRegistryItemTree.class, "category"); //$NON-NLS-1$
if (jdoObject.getClass().equals(Script.class))
return SharedImages.getSharedImage(ScriptingPlugin.getDefault(), org.nightlabs.jfire.scripting.ui.ScriptRegistryItemTree.class, "script"); //$NON-NLS-1$
return super.getJDOObjectImage(jdoObject, columnIndex);
}
protected String getTooltipText(Object element, int columnText) {
ScriptRegistryItem item = ((ScriptRegistryItemNode)element).getJdoObject();
if (item.getDescription().isEmpty())
return null;
else
return item.getDescription().getText();
}
}
private SelectionProxy selectionProxy;
private String selectionZone;
private boolean addSelectionProxy;
// TODO: ignoreinheritance ?
private static final boolean IGNORE_INHERITANCE = false;
private ActiveScriptRegistryItemTreeController activeScriptRegistryItemTreeController;
/**
* Create a new {@link ScriptRegistryItemTree}
*
* @param parent
* The parent to add the control to.
* @param addSelectionProxy
* Whether to add a selection proxy that will delegate the
* selection events to the {@link NotificationManager}.
* @param selectionZone
* The selection zone to use when delegating the selection events.
*
*/
public ScriptRegistryItemTree(Composite parent, boolean addSelectionProxy, String selectionZone)
{
super(parent, DEFAULT_STYLE_SINGLE, true, true, false);
this.addSelectionProxy = addSelectionProxy;
activeScriptRegistryItemTreeController = new ActiveScriptRegistryItemTreeController() {
@Override
protected void onJDOObjectsChanged(JDOTreeNodesChangedEvent<ScriptRegistryItemID, ScriptRegistryItemNode> changedEvent)
{
JDOTreeNodesChangedEventHandler.handle(getTreeViewer(), changedEvent);
}
};
setInput(activeScriptRegistryItemTreeController);
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e)
{
activeScriptRegistryItemTreeController.close();
activeScriptRegistryItemTreeController = null;
}
});
}
@Override
public void init() {
super.init();
if (addSelectionProxy) {
selectionProxy = new SelectionProxy(this, selectionZone, IGNORE_INHERITANCE, false);
getTreeViewer().addSelectionChangedListener(selectionProxy);
}
getTreeViewer().setComparator(new ViewerComparator() {
@Override
public int category(Object element) {
if (element instanceof ScriptRegistryItemNode) {
ScriptRegistryItem item = ((ScriptRegistryItemNode) element).getJdoObject();
if (item instanceof ScriptCategory)
return 1;
else
return 2;
} else
return 3;
}
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
if (! (e1 instanceof ScriptRegistryItemNode && e2 instanceof ScriptRegistryItemNode))
return super.compare(viewer, e1, e2);
ScriptRegistryItemNode node1 = (ScriptRegistryItemNode) e1;
ScriptRegistryItemNode node2 = (ScriptRegistryItemNode) e2;
return node1.getJdoObject().getName().getText().compareTo(node2.getJdoObject().getName().getText());
}
});
}
@Override
public void createTreeColumns(Tree tree)
{
}
@Override
public void setTreeProvider(TreeViewer treeViewer)
{
treeViewer.setContentProvider(new ContentProvider());
ViewerColumn column = new ViewerColumn(treeViewer, treeViewer.getTree()) {
};
column.setLabelProvider(new CellLabelProvider() {
LabelProvider lp = new LabelProvider();
@Override
public void update(ViewerCell cell) {
cell.setText(lp.getColumnText(cell.getElement(), 0));
cell.setImage(lp.getColumnImage(cell.getElement(), 0));
}
@Override
public String getToolTipText(Object element) {
return lp.getTooltipText(element, 0);
}
});
ColumnViewerToolTipSupport.enableFor(treeViewer);
}
@Override
protected ActiveJDOObjectTreeController<ScriptRegistryItemID, ScriptRegistryItem, ScriptRegistryItemNode> getJDOObjectTreeController() {
return activeScriptRegistryItemTreeController;
}
/**
* Returns all selected ScriptRegistryItems in a Set.
* @return All selected ScriptRegistryItems in a Set.
*/
public Set<ScriptRegistryItem> getSelectedRegistryItems() {
return getSelectedElements();
}
}