package net.enilink.komma.owl.editor.rcp; import net.enilink.commons.ui.editor.EditorForm; import net.enilink.commons.ui.editor.IEditorPart; import net.enilink.komma.common.util.IResourceLocator; import net.enilink.komma.core.IValue; import net.enilink.komma.edit.command.EditingDomainCommandStack; import net.enilink.komma.edit.domain.AdapterFactoryEditingDomain; import net.enilink.komma.edit.domain.IEditingDomainProvider; import net.enilink.komma.edit.ui.editor.IPropertySheetPageSupport; import net.enilink.komma.edit.ui.editor.KommaMultiPageEditor; import net.enilink.komma.edit.ui.editor.KommaMultiPageEditorSupport; import net.enilink.komma.edit.ui.rcp.editor.TabbedPropertySheetPageSupport; import net.enilink.komma.edit.ui.rcp.project.ProjectModelSetManager; import net.enilink.komma.edit.ui.views.IViewerMenuSupport; import net.enilink.komma.edit.ui.views.SelectionProviderAdapter; import net.enilink.komma.model.IModel; import net.enilink.komma.model.IModelSet; import net.enilink.komma.owl.editor.OWLEditorPlugin; import net.enilink.komma.owl.editor.classes.ClassesPart; import net.enilink.komma.owl.editor.ontology.OntologyPart; import net.enilink.komma.owl.editor.properties.DatatypePropertiesPart; import net.enilink.komma.owl.editor.properties.ObjectPropertiesPart; import net.enilink.komma.owl.editor.properties.OtherPropertiesPart; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.dialogs.SaveAsDialog; /** * A basic OWL editor. */ public class OWLEditor extends KommaMultiPageEditor implements IViewerMenuSupport { protected EditorForm form; protected SelectionProviderAdapter formSelectionProvider = new SelectionProviderAdapter(); protected IProject project; protected ProjectModelSetManager modelSetManager; protected void addPage(String label, IEditorPart editPart) { Composite control = form.getWidgetFactory().createComposite( form.getBody()); control.setLayout(new FillLayout()); control.setData("editPart", editPart); editPart.initialize(form); editPart.createContents(control); editPart.setInput(getEditorSupport().getModel()); editPart.refresh(); setPageText(addPage(control), label); } @Override protected void createPages() { final boolean[] internalChange = { false }; form = new EditorForm(getContainer()) { @Override public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) { if (IEditingDomainProvider.class.equals(adapter)) { return OWLEditor.this; } else if (IViewerMenuSupport.class.equals(adapter)) { return OWLEditor.this; } return super.getAdapter(adapter); } @Override public void fireSelectionChanged(IEditorPart firingPart, ISelection selection) { try { internalChange[0] = true; formSelectionProvider.setSelection(selection); } finally { internalChange[0] = false; } } }; formSelectionProvider .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { if (internalChange[0]) { return; } Object selected = ((IStructuredSelection) event .getSelection()).getFirstElement(); // allow arbitrary selections to be adapted to IValue // objects if (selected != null && !(selected instanceof IValue)) { Object adapter = Platform.getAdapterManager() .getAdapter(selected, IValue.class); if (adapter != null) { selected = adapter; } } if (selected != null) { IEditorPart editPart = (IEditorPart) getControl( getActivePage()).getData("editPart"); if (editPart != null && editPart.setEditorInput(selected)) { form.refreshStale(); } } } }); try { // Creates the model from the editor input getEditorSupport().createModel(); addPage("Ontology", new OntologyPart()); addPage("Classes", new ClassesPart()); addPage("ObjectProperties", new ObjectPropertiesPart()); addPage("DatatypeProperties", new DatatypePropertiesPart()); addPage("other Properties", new OtherPropertiesPart()); getSite().getShell().getDisplay().asyncExec(new Runnable() { public void run() { getEditorSupport().updateProblemIndication(); } }); } catch (Exception e) { OWLEditorPlugin.INSTANCE.log(e); } } @Override protected KommaMultiPageEditorSupport<? extends KommaMultiPageEditor> createEditorSupport() { return new KommaMultiPageEditorSupport<KommaMultiPageEditor>(this) { { saveAllModels = false; disposeModelSet = false; } @Override public void handlePageChange(Object activeEditor) { super.handlePageChange(activeEditor); editorSelectionProvider .setSelectionProvider(formSelectionProvider); } @Override protected IResourceLocator getResourceLocator() { return OWLEditorPlugin.INSTANCE; } protected AdapterFactoryEditingDomain getExistingEditingDomain( IModelSet modelSet) { AdapterFactoryEditingDomain editingDomain = super .getExistingEditingDomain(modelSet); // set up an editor-local editing domain with own command stack EditingDomainCommandStack commandStack = new EditingDomainCommandStack(); editingDomain = new AdapterFactoryEditingDomain( modelSetManager.getAdapterFactory(), commandStack, modelSet) { protected void registerDomainProviderAdapter() { // do not register this editing domain as adapter } }; commandStack.setEditingDomain(editingDomain); editingDomain .setModelToReadOnlyMap(new java.util.WeakHashMap<IModel, Boolean>()); return editingDomain; } protected IModelSet createModelSet() { if (getEditorInput() instanceof IFileEditorInput) { project = ((IFileEditorInput) getEditorInput()).getFile() .getProject(); } else { project = (IProject) getEditorInput().getAdapter( IProject.class); } modelSetManager = ProjectModelSetManager.getSharedInstance(project); modelSetManager.addClient(OWLEditor.this); return modelSetManager.getModelSet(); } @Override protected IPropertySheetPageSupport createPropertySheetPageSupport() { return new TabbedPropertySheetPageSupport(); } protected IPath getSaveAsPath() { SaveAsDialog saveAsDialog = new SaveAsDialog(editor.getSite() .getShell()); saveAsDialog.open(); return saveAsDialog.getResult(); } @Override public void dispose() { super.dispose(); if (modelSetManager != null) { modelSetManager.removeClient(OWLEditor.this); modelSet = null; } } }; } @Override public Object getAdapter(@SuppressWarnings("rawtypes") Class key) { if (key == IModel.class) { return getEditorSupport().getModel(); } return super.getAdapter(key); } @Override public void createContextMenuFor(StructuredViewer viewer) { getEditorSupport().createContextMenuFor(viewer); } }