package au.com.langdale.cimtoole.editors; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.DragSourceListener; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.views.contentoutline.ContentOutlinePage; import au.com.langdale.jena.TreeModelBase.Node; import au.com.langdale.kena.OntResource; public class ModelOutliner extends ContentOutlinePage { public ModelOutliner(ModelEditor master) { this.master = master; } ModelEditor master; @Override public void createControl(Composite parent) { super.createControl(parent); TreeViewer viewer = getTreeViewer(); viewer.setUseHashlookup(true); viewer.setContentProvider(master.getProvider()); viewer.setInput(master.getTree()); setupDragging(viewer); master.listenToDoubleClicks(viewer); master.configureOutline(this); } @Override public TreeViewer getTreeViewer() { return super.getTreeViewer(); } private void setupDragging(final TreeViewer viewer) { viewer.addDragSupport(DND.DROP_COPY, new Transfer[] { TextTransfer.getInstance() }, new DragSourceListener() { public void dragStart(DragSourceEvent event) { event.doit = !viewer.getSelection().isEmpty(); } public void dragSetData(DragSourceEvent event) { IStructuredSelection selection = (IStructuredSelection)viewer.getSelection(); if(TextTransfer.getInstance().isSupportedType(event.dataType) && !selection.isEmpty()) { Node first = (Node)selection.getFirstElement(); OntResource base = first.getBase(); if( base.isURIResource()) event.data = base.getLocalName(); else event.data = first.getName(); } } public void dragFinished(DragSourceEvent event) { } }); } @Override public void selectionChanged(SelectionChangedEvent event) { fireSelectionChanged(event.getSelection()); master.doRefresh(); } public void drillTo(OntResource subject) { TreeViewer viewer = getTreeViewer(); if( viewer == null ) return; Node root = master.getTree().getRoot(); Node top = root.findChild(subject); if( top != null ) { TreePath path = new TreePath(new Object[]{root, top}); viewer.setSelection(new TreeSelection(path), true); } else { ITreeSelection selection = (ITreeSelection) viewer.getSelection(); TreePath[] paths = selection.getPaths(); if( paths.length == 1) { TreePath current = paths[0]; Node parent = (Node) current.getLastSegment(); Node child = parent.findChild(subject); if( child != null ) { TreePath path = current.createChildPath(child); viewer.setSelection(new TreeSelection(path), true); } } } } public void drillTo(Node[] path) { getTreeViewer().setSelection(new TreeSelection(new TreePath(path)), true); } }