/******************************************************************************* * Copyright (c) 2009 Fraunhofer IWU and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Fraunhofer IWU - initial API and implementation *******************************************************************************/ package net.enilink.komma.owl.editor.properties; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import net.enilink.komma.common.adapter.IAdapterFactory; import net.enilink.komma.common.command.CommandResult; import net.enilink.komma.common.command.ICommand; import net.enilink.komma.common.command.SimpleCommand; import net.enilink.komma.core.IEntity; import net.enilink.komma.core.IReference; import net.enilink.komma.core.Statement; import net.enilink.komma.core.URI; import net.enilink.komma.edit.ui.properties.IEditUIPropertiesImages; import net.enilink.komma.edit.ui.properties.KommaEditUIPropertiesPlugin; import net.enilink.komma.edit.ui.provider.AdapterFactoryContentProvider; import net.enilink.komma.edit.ui.provider.AdapterFactoryLabelProvider; import net.enilink.komma.edit.ui.provider.ExtendedImageRegistry; import net.enilink.komma.edit.ui.provider.reflective.ObjectComparator; import net.enilink.komma.edit.ui.util.SearchWidget; import net.enilink.komma.edit.ui.views.AbstractEditingDomainPart; import net.enilink.komma.edit.ui.wizards.NewObjectWizard; import net.enilink.komma.em.concepts.IProperty; import net.enilink.komma.em.concepts.IResource; import net.enilink.komma.model.IModel; import net.enilink.komma.owl.editor.OWLEditorPlugin; import net.enilink.vocab.owl.AnnotationProperty; import net.enilink.vocab.owl.OWL; import net.enilink.vocab.owl.OntologyProperty; import net.enilink.vocab.rdf.RDF; import net.enilink.vocab.rdfs.RDFS; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.Tree; public abstract class AbstractPropertiesPart extends AbstractEditingDomainPart { Action deleteItemAction, addItemAction; protected Tree tree; protected TreeViewer treeViewer; protected IModel model; protected IAdapterFactory adapterFactory; protected boolean hideBuiltins = true; abstract protected String getName(); abstract protected URI getPropertyType(); abstract protected URI getRootProperty(); @Override public void createContents(Composite parent) { GridLayout gridLayout = new GridLayout(1, false); gridLayout.marginWidth = gridLayout.marginHeight = 0; parent.setLayout(gridLayout); createActions(parent); tree = getWidgetFactory().createTree(parent, SWT.MULTI); tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); treeViewer = new TreeViewer(tree); treeViewer.setUseHashlookup(true); treeViewer.setComparator(new ObjectComparator()); treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { getForm().fireSelectionChanged(AbstractPropertiesPart.this, event.getSelection()); } }); treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if (deleteItemAction != null) deleteItemAction .setEnabled(!event.getSelection().isEmpty()); } }); SearchWidget searchWidget = new SearchWidget(); searchWidget.setViewer(treeViewer); searchWidget.createControl(parent); searchWidget.getControl().setLayoutData( new GridData(SWT.FILL, SWT.END, false, false)); } public void createActions(Composite parent) { IToolBarManager toolBarManager = (IToolBarManager) getForm() .getAdapter(IToolBarManager.class); ToolBarManager ownManager = null; if (toolBarManager == null) { toolBarManager = ownManager = new ToolBarManager(SWT.HORIZONTAL); ToolBar toolBar = ownManager.createControl(parent); getWidgetFactory().adapt(toolBar); toolBar.setLayoutData(new GridData(SWT.RIGHT, SWT.DEFAULT, true, false)); } addItemAction = new Action("Add") { public void run() { addItem(); } }; addItemAction.setImageDescriptor(ExtendedImageRegistry.getInstance() .getImageDescriptor( KommaEditUIPropertiesPlugin.INSTANCE .getImage(IEditUIPropertiesImages.ADD))); toolBarManager.add(addItemAction); deleteItemAction = new Action("Remove") { public void run() { deleteItem(); } }; deleteItemAction.setImageDescriptor(ExtendedImageRegistry.getInstance() .getImageDescriptor( KommaEditUIPropertiesPlugin.INSTANCE .getImage(IEditUIPropertiesImages.REMOVE))); deleteItemAction.setEnabled(false); toolBarManager.add(deleteItemAction); IAction refreshAction = new Action("Refresh") { @Override public void run() { refresh(); } }; refreshAction.setImageDescriptor(ExtendedImageRegistry.getInstance() .getImageDescriptor( KommaEditUIPropertiesPlugin.INSTANCE .getImage(IEditUIPropertiesImages.REFRESH))); toolBarManager.add(refreshAction); final IAction hideAction = new Action("Hide built-in properties", Action.AS_CHECK_BOX) { @Override public void run() { hideBuiltins = !hideBuiltins; setChecked(hideBuiltins); refresh(); } }; hideAction .setImageDescriptor(ExtendedImageRegistry .getInstance() .getImageDescriptor( KommaEditUIPropertiesPlugin.INSTANCE .getImage(IEditUIPropertiesImages.HIDE_BUILTINS))); hideAction.setChecked(hideBuiltins); toolBarManager.add(hideAction); if (ownManager != null) { ownManager.update(true); } } void addItem() { NewObjectWizard wizard = new NewObjectWizard(model) { @Override public boolean performFinish() { final URI resourceName = getObjectName(); try { ICommand cmd = new SimpleCommand("Add property") { @Override protected CommandResult doExecuteWithResult( IProgressMonitor progressMonitor, IAdaptable info) throws ExecutionException { final IEntity property = model.getManager() .createNamed(resourceName, getPropertyType()); // add inferred property model.getManager().add( new Statement(property, RDFS.PROPERTY_SUBPROPERTYOF, getRootProperty(), true)); return CommandResult.newOKCommandResult(property); } }; getEditingDomain().getCommandStack().execute(cmd, null, null); // update viewer and set selection // refresh(); treeViewer.setSelection(new StructuredSelection(cmd .getCommandResult().getReturnValue()), true); } catch (ExecutionException e) { OWLEditorPlugin.INSTANCE.log(e); } return true; } }; WizardDialog wizardDialog = new WizardDialog(getShell(), wizard); wizardDialog.open(); } void deleteItem() { try { getEditingDomain().getCommandStack().execute( new SimpleCommand("Delete property") { @Override protected CommandResult doExecuteWithResult( IProgressMonitor progressMonitor, IAdaptable info) throws ExecutionException { final Object selected = ((IStructuredSelection) treeViewer.getSelection()).getFirstElement(); if (selected instanceof IResource) { ((IResource) selected).getEntityManager() .remove((IResource) selected); // add inferred property model.getManager().remove( new Statement((IResource) selected, RDFS.PROPERTY_SUBPROPERTYOF, getRootProperty(), true)); return CommandResult .newOKCommandResult(selected); } return CommandResult.newCancelledCommandResult(); } }, null, null); } catch (ExecutionException e) { OWLEditorPlugin.INSTANCE.log(e); } } @Override public boolean setFocus() { if (tree != null && tree.setFocus()) { return true; } return super.setFocus(); } @Override public boolean setEditorInput(Object input) { if (input instanceof IProperty && treeViewer != null) { treeViewer.setSelection(new StructuredSelection(input), true); } return super.setEditorInput(input); } @Override public void setInput(Object input) { if (treeViewer != null && adapterFactory != null) { treeViewer.setInput(null); } this.model = (IModel) input; setStale(true); } protected Object[] filterElements(Object parent, Object[] elements) { if (hideBuiltins && getRootProperty().equals(parent)) { List<Object> list = new ArrayList<>(Arrays.asList(elements)); for (Iterator<?> it = list.iterator(); it.hasNext();) { Object element = it.next(); if (element instanceof IReference) { URI uri = ((IReference) element).getURI(); if (uri != null && RDF.NAMESPACE_URI.equals(uri.namespace()) || OWL.NAMESPACE_URI.equals(uri.namespace()) && !(element instanceof AnnotationProperty || element instanceof OntologyProperty)) { it.remove(); } } } return list.toArray(); } return elements; } @Override public void refresh() { if (model != null) { IAdapterFactory newAdapterFactory = getAdapterFactory(); if (adapterFactory == null || !adapterFactory.equals(newAdapterFactory)) { adapterFactory = newAdapterFactory; treeViewer .setContentProvider(new AdapterFactoryContentProvider( adapterFactory) { @Override public Object[] getElements(Object object) { if (object instanceof Object[]) { return filterElements(object, (Object[]) object); } return filterElements(object, super.getElements(object)); } }); treeViewer .setLabelProvider(new AdapterFactoryLabelProvider.ColorProvider( adapterFactory, treeViewer)); } createContextMenuFor(treeViewer); treeViewer.setInput(model.getManager().find(getRootProperty())); } } }