package net.enilink.komma.edit.ui.properties.internal.wizards; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.LinkedHashSet; import java.util.Set; import net.enilink.komma.edit.ui.dialogs.FilteredList.AbstractContentProvider; import net.enilink.komma.edit.ui.dialogs.FilteredList.ItemsFilter; import net.enilink.komma.edit.ui.dialogs.FilteredTreeAndListSelectionWidget; import net.enilink.komma.edit.ui.dialogs.IFilteredTreeAndListDescriptor; import net.enilink.komma.edit.ui.properties.internal.wizards.ItemUtil.LabeledItem; import net.enilink.komma.edit.ui.provider.AdapterFactoryContentProvider; import net.enilink.komma.em.concepts.IClass; import net.enilink.komma.em.concepts.IProperty; import net.enilink.komma.em.concepts.IResource; import net.enilink.komma.model.ModelUtil; import net.enilink.vocab.owl.OWL; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; public class ObjectPropertyPage extends WizardPage implements IFilteredTreeAndListDescriptor { public static final String PAGE_NAME = ObjectPropertyPage.class.getName(); private FilteredTreeAndListSelectionWidget widget; private IStructuredSelection treeSelection = StructuredSelection.EMPTY; private ILabelProvider labelProvider; private Composite parentComposite; private Context context; protected ObjectPropertyPage(Context context) { super(PAGE_NAME, "Edit property value", null); this.context = context; this.labelProvider = new ItemUtil.LabelProvider(context.adapterFactory); } @Override public void createControl(Composite parent) { parentComposite = new Composite(parent, SWT.NONE); parentComposite.setLayout(new GridLayout(2, false)); widget = new FilteredTreeAndListSelectionWidget(this, false); widget.createControl(parentComposite); widget.getFilteredTree().getViewer() .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { treeSelection = (IStructuredSelection) event .getSelection(); widget.getFilteredList().clearAndRefresh(); } }); widget.getFilteredList().addSelectionChangedListener( new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { context.object = ItemUtil .unwrap(((IStructuredSelection) event .getSelection()).getFirstElement()); setPageComplete(context.object != null); } }); setControl(parentComposite); setPageComplete(false); } @Override public void setVisible(boolean visible) { super.setVisible(visible); if (visible) { super.setDescription("Edit property " + ModelUtil.getLabel(context.predicate) + " of " + ModelUtil.getLabel(context.subject)); widget.getFilteredList().clearAndRefresh(); widget.show(); } } @Override public boolean canFlipToNextPage() { return false; } private Collection<IResource> getAvailableObjects( Collection<IClass> typeClasses) { Set<IResource> individuals = new LinkedHashSet<IResource>(); for (IClass clazz : typeClasses) { for (IResource resource : clazz.getInstances()) { if (!resource.isOntLanguageTerm()) { individuals.add(resource); } } } for (Object value : context.subject.getPropertyValues( context.predicate, true)) { individuals.remove(value); } return individuals; } private Collection<? extends IClass> getPropertyRange(IProperty property) { Collection<? extends IClass> ranges = property.getNamedRanges( context.subject, true).toList(); if (ranges.isEmpty()) { return Arrays.asList(context.subject.getEntityManager().find( OWL.TYPE_THING, IClass.class)); } return ranges; } @Override public void fillListContentProvider( AbstractContentProvider contentProvider, ItemsFilter itemsFilter, IProgressMonitor progressMonitor) throws CoreException { Collection<IClass> typeClasses; if (treeSelection.isEmpty()) { // typeClasses = new ArrayList<IClass>(getPropertyRange(property)); typeClasses = null; } else { typeClasses = new ArrayList<IClass>(); for (Object selectedType : treeSelection.toArray()) { if (!(selectedType instanceof IClass)) { continue; } typeClasses.add((IClass) selectedType); } } if (typeClasses != null) { context.unitOfWork.begin(); try { final Collection<IResource> individuals = getAvailableObjects(typeClasses); for (IResource individual : individuals) { contentProvider.add(new LabeledItem(individual, labelProvider.getText(individual)), itemsFilter); } } finally { context.unitOfWork.end(); } } } @Override public String getListItemName(Object item) { return labelProvider.getText(item); } @Override public Comparator<Object> getListItemsComparator() { return new Comparator<Object>() { @Override public int compare(Object a, Object b) { String labelA = labelProvider.getText(a); String labelB = labelProvider.getText(b); if (labelA == null) { if (labelB == null) { return 0; } return -1; } else if (labelB == null) { return 1; } return labelA.compareTo(labelB); } }; } @Override public Object getTreeInput() { return getPropertyRange(context.predicate); } @Override public IStatus validateListItem(Object item) { return Status.OK_STATUS; } @Override public ILabelProvider getLabelProvider() { return labelProvider; } @Override public ITreeContentProvider getTreeContentProvider() { return new AdapterFactoryContentProvider(context.adapterFactory) { @Override public Object[] getElements(Object object) { if (object instanceof Collection<?>) { return ((Collection<?>) object).toArray(); } return super.getElements(object); } }; } }