package net.enilink.komma.edit.ui.properties.internal.wizards; import java.util.Collection; import java.util.Comparator; import java.util.List; 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.SelectionChangedEvent; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import net.enilink.vocab.rdf.Property; import net.enilink.komma.edit.ui.dialogs.FilteredList; import net.enilink.komma.edit.ui.dialogs.FilteredList.AbstractContentProvider; import net.enilink.komma.edit.ui.dialogs.FilteredList.ItemsFilter; import net.enilink.komma.edit.ui.properties.internal.wizards.ItemUtil.LabeledItem; import net.enilink.komma.em.concepts.IProperty; import net.enilink.komma.model.ModelUtil; public class PropertySelectionPage extends WizardPage { private Collection<IProperty> applicableProperties; private List<Property> allProperties; private Button showApplicableProperties; private boolean showAllProperties; public static final String PAGE_NAME = PropertySelectionPage.class .getName(); private FilteredList filteredList; private ILabelProvider labelProvider; private Context context; PropertySelectionPage(Context context) { super(PAGE_NAME, "Select property", null); this.context = context; this.labelProvider = new ItemUtil.LabelProvider(context.adapterFactory); showAllProperties = false; } @Override public void createControl(Composite parent) { super.setDescription("Select property for " + ModelUtil.getLabel(context.subject)); Composite topLevel = new Composite(parent, SWT.NONE); topLevel.setLayout(new GridLayout(1, false)); filteredList = new FilteredList(false) { @Override protected ItemsFilter createFilter() { return new ItemsFilter() { @Override public boolean isConsistentItem(Object item) { return true; } @Override public boolean matchItem(Object item) { return matches(getListItemName(item)); } }; } @Override protected void fillContentProvider( AbstractContentProvider contentProvider, ItemsFilter itemsFilter, IProgressMonitor progressMonitor) throws CoreException { fillListContentProvider(contentProvider, itemsFilter, progressMonitor); } @Override public String getElementName(Object item) { return getListItemName(item); } @Override protected Comparator<Object> getItemsComparator() { return getListItemsComparator(); } @Override protected IStatus validateItem(Object item) { return validateListItem(item); } @Override protected void updateStatus(IStatus status) { } }; filteredList.setListLabelProvider(labelProvider); Control listControl = filteredList.createControl(topLevel); listControl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); filteredList .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) event .getSelection(); Object first = selection.getFirstElement(); context.predicate = first == null ? null : (IProperty) ((LabeledItem) first).value; context.clearObject(); setPageComplete(true); } }); Composite buttonComposite = new Composite(topLevel, SWT.NONE); buttonComposite.setLayout(new GridLayout(2, false)); showApplicableProperties = new Button(buttonComposite, SWT.CHECK); showApplicableProperties.setSelection(true); showApplicableProperties.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { showAllProperties = !showApplicableProperties.getSelection(); filteredList.clearAndRefresh(); } }); Label label = new Label(buttonComposite, SWT.NONE); label.setText("show only applicable properties"); setControl(topLevel); setPageComplete(false); } void fillListContentProvider(AbstractContentProvider contentProvider, ItemsFilter itemsFilter, IProgressMonitor progressMonitor) throws CoreException { context.unitOfWork.begin(); try { if (showAllProperties) { if (allProperties == null) { allProperties = context.subject.getEntityManager() .findAll(Property.class).toList(); } for (Property prop : allProperties) { contentProvider.add( new LabeledItem(prop, labelProvider.getText(prop)), itemsFilter); } } else { if (applicableProperties == null) { applicableProperties = context.subject .getRelevantProperties().toList(); } for (IProperty prop : applicableProperties) { contentProvider.add( new LabeledItem(prop, labelProvider.getText(prop)), itemsFilter); } } } finally { context.unitOfWork.end(); } } IStatus validateListItem(Object item) { return Status.OK_STATUS; } String getListItemName(Object item) { return ((LabeledItem) item).label; } 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 void dispose() { if (labelProvider != null) { labelProvider.dispose(); labelProvider = null; } } }