/* * This software is Copyright 2005,2006,2007,2008 Langdale Consultants. * Langdale Consultants can be contacted at: http://www.langdale.com.au */ package au.com.langdale.cimtoole.editors; import org.eclipse.core.resources.IFile; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.PartInitException; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import au.com.langdale.cimtoole.project.ModelMinder; import au.com.langdale.cimtoole.project.Cache.CacheListener; import au.com.langdale.jena.JenaTreeModelBase; import au.com.langdale.jena.JenaTreeProvider; import au.com.langdale.jena.OntModelProvider; import au.com.langdale.jena.TreeModelBase.Empty; import au.com.langdale.jena.TreeModelBase.Node; import au.com.langdale.kena.OntModel; import au.com.langdale.kena.OntResource; import au.com.langdale.profiles.ProfileModel; import au.com.langdale.ui.builder.FurnishedMultiEditor; import au.com.langdale.ui.util.SelectionProvider; public abstract class ModelEditor extends FurnishedMultiEditor implements CacheListener, OntModelProvider { abstract public JenaTreeModelBase getTree(); public JenaTreeProvider getProvider() { return new JenaTreeProvider(false); } protected final ModelMinder models = new ModelMinder(this); protected final SelectionProvider selections = new SelectionProvider(); public void listenToSelection(ISelectionProvider source) { source.addSelectionChangedListener(selections); } private ModelOutliner outline; protected ModelOutliner getOutline() { if( outline == null) { outline = new ModelOutliner(this); } return outline; } @Override public Object getAdapter(Class adapter) { if (IContentOutlinePage.class.equals(adapter)) return getOutline(); else return super.getAdapter(adapter); } private IDoubleClickListener drill = new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { IStructuredSelection selection = (IStructuredSelection) event.getSelection(); Node node = (Node) selection.getFirstElement(); OntResource subject = node.getSubject(); if(outline != null) outline.drillTo(subject); } }; public void listenToDoubleClicks(StructuredViewer source) { source.addDoubleClickListener(drill); } /** * Check that the input is an instance of <code>IFileEditorInput</code>. */ @Override public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException { if (!(editorInput instanceof IFileEditorInput)) throw new PartInitException("Invalid Input: Must be IFileEditorInput"); super.init(site, editorInput); getSite().setSelectionProvider(selections); } @Override public void dispose() { models.dispose(); super.dispose(); } private boolean guard; @Override public void doRefresh() { if( guard ) return; guard = true; try { if( outline != null && outline.getSelection().isEmpty()) { TreePath root = new TreePath(new Object[] {getTree().getRoot()}); outline.setSelection(new TreeSelection(root)); outline.getTreeViewer().setExpandedState( root, true ); } super.doRefresh(); } finally { guard = false; } } public OntResource getSubject() { Node node = getNode(); if( node != null) return node.getSubject(); else return null; } public String getComment() { Node node = getNode(); if( node != null) { OntResource subject = node.getSubject(); if( subject != null) { OntResource defnode = subject.getIsDefinedBy(); if( defnode != null) { return node.toString() + " (" + ProfileModel.label(defnode) + ")"; } } return node.toString(); } else return "Nothing selected in outline"; } public IFile getFile() { return ((IFileEditorInput)getEditorInput()).getFile(); } private Node previous; public Node getNode() { if( outline != null ) { ISelection selection = outline.getSelection(); if( ! selection.isEmpty() && selection instanceof IStructuredSelection) { IStructuredSelection structured = (IStructuredSelection) selection; Object raw = structured.getFirstElement(); if( raw instanceof Node && ! (raw instanceof Empty)) { previous = (Node) raw; return previous; } } } if( previous != null) return previous; return getTree().getRoot(); } public OntModel getModel() { JenaTreeModelBase tree = getTree(); if( tree != null) return tree.getOntModel(); else return null; } protected void configureOutline( ModelOutliner outline) { } }