package edu.ualberta.med.biobank.widgets.trees;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.dialogs.FilteredTree;
import edu.ualberta.med.biobank.SessionManager;
import edu.ualberta.med.biobank.treeview.AbstractAdapterBase;
import edu.ualberta.med.biobank.treeview.listeners.ContainerDragDropListener;
import edu.ualberta.med.biobank.treeview.util.NodeContentProvider;
import edu.ualberta.med.biobank.treeview.util.NodeLabelProvider;
import edu.ualberta.med.biobank.views.AbstractViewWithAdapterTree;
import edu.ualberta.med.biobank.widgets.multiselect.MultiSelectNodeTransfer;
import edu.ualberta.med.biobank.widgets.utils.TreeFilter;
public class AdapterTreeWidget extends Composite {
private TreeViewer treeViewer;
private ContainerDragDropListener adapterTreeDragDropListener;
private Object mouseMoveLastElement = null;
private String lastToolTipText = null;
public AdapterTreeWidget(Composite parent, boolean patternFilter) {
super(parent, SWT.NONE);
GridLayout gl = new GridLayout(1, false);
gl.marginWidth = 0;
gl.marginHeight = 0;
gl.horizontalSpacing = 0;
gl.verticalSpacing = 0;
parent.setLayout(gl);
setLayout(gl);
setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
if (patternFilter) {
FilteredTree filteredTree = new FilteredTree(this, SWT.BORDER
| SWT.SINGLE | SWT.V_SCROLL, new TreeFilter(), true);
filteredTree.setBackground(parent.getDisplay().getSystemColor(
SWT.COLOR_LIST_BACKGROUND));
filteredTree.setCursor(new Cursor(parent.getDisplay(),
SWT.CURSOR_HAND));
treeViewer = filteredTree.getViewer();
} else {
treeViewer = new TreeViewer(this, SWT.SINGLE);
}
gl = new GridLayout(1, false);
gl.marginWidth = 0;
gl.marginHeight = 0;
gl.horizontalSpacing = 0;
gl.verticalSpacing = 0;
treeViewer.getTree().setLayout(gl);
treeViewer.getTree().setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, true));
/*----------------------------DND-----------------------------------*/
adapterTreeDragDropListener = new ContainerDragDropListener(treeViewer);
treeViewer.addDragSupport(DND.DROP_MOVE | DND.DROP_COPY,
new Transfer[] { MultiSelectNodeTransfer.getInstance() },
adapterTreeDragDropListener);
treeViewer.addDropSupport(DND.DROP_MOVE | DND.DROP_COPY,
new Transfer[] { MultiSelectNodeTransfer.getInstance() },
adapterTreeDragDropListener);
/*----------------------------DND-----------------------------------*/
treeViewer.setLabelProvider(new NodeLabelProvider());
treeViewer.setContentProvider(new NodeContentProvider());
treeViewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
Object selection = event.getSelection();
if (selection == null)
return;
Object element = ((StructuredSelection) selection)
.getFirstElement();
((AbstractAdapterBase) element).performDoubleClick();
treeViewer.expandToLevel(element, 1);
}
});
treeViewer.addTreeListener(new ITreeViewerListener() {
@Override
public void treeCollapsed(TreeExpansionEvent e) {
//
}
@Override
public void treeExpanded(TreeExpansionEvent e) {
((AbstractAdapterBase) e.getElement()).performExpand();
}
});
treeViewer.setUseHashlookup(true);
treeViewer.getTree().addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
AbstractViewWithAdapterTree view = SessionManager
.getCurrentAdapterViewWithTree();
view.setFocus();
// make sure the view is activated when the user click in the
// tree (to update the icons) :
view.activate();
}
});
Menu menu = new Menu(parent.getShell(), SWT.NONE);
menu.addListener(SWT.Show, new Listener() {
@Override
public void handleEvent(Event event) {
Menu menu = treeViewer.getTree().getMenu();
for (MenuItem menuItem : menu.getItems()) {
menuItem.dispose();
}
Object element = ((StructuredSelection) treeViewer
.getSelection()).getFirstElement();
if (element != null) {
((AbstractAdapterBase) element).popupMenu(treeViewer,
treeViewer.getTree(), menu);
}
}
});
treeViewer.getTree().setMenu(menu);
treeViewer.setComparator(new ViewerComparator() {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
if (e1 instanceof AbstractAdapterBase
&& e2 instanceof AbstractAdapterBase) {
return ((AbstractAdapterBase) e1)
.compareTo((AbstractAdapterBase) e2);
}
return 0;
}
});
treeViewer.getTree().addListener(SWT.MouseMove, new Listener() {
@Override
public void handleEvent(Event event) {
String tooltip = null;
ViewerCell cell = treeViewer
.getCell(new Point(event.x, event.y));
if (cell != null) {
Object element = cell.getElement();
if ((element != null) && (element != mouseMoveLastElement)) {
tooltip = ((AbstractAdapterBase) element)
.getTooltipText();
lastToolTipText = tooltip;
mouseMoveLastElement = element;
} else {
tooltip = lastToolTipText;
}
}
treeViewer.getTree().setToolTipText(tooltip);
}
});
}
public TreeViewer getTreeViewer() {
return treeViewer;
}
@Override
public boolean setFocus() {
return treeViewer.getTree().setFocus();
}
}