/** * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * 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. * */ package gov.redhawk.prf.ui.wizard; import gov.redhawk.sca.properties.IPropertiesProviderDescriptor; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import mil.jpeojtrs.sca.prf.AbstractProperty; import mil.jpeojtrs.sca.prf.provider.PrfItemProviderAdapterFactory; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.emf.databinding.EMFDataBindingContext; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.ui.dialogs.FilteredTree; /** * This {@link WizardPage} provides a way to browse known properties. * @since 4.0 */ public class BrowsePropertiesWizardPage extends WizardPage { private static final String PAGE_NAME = "browsePropertyWizard"; private List<EObject> properties = new ArrayList<EObject>(); private TreeViewer propertyTree; private final GridLayoutFactory layoutFactory = GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false); private final GridDataFactory dataFactory = GridDataFactory.fillDefaults(); private List<IPropertiesProviderDescriptor> descriptors; private DataBindingContext context = new EMFDataBindingContext(); public BrowsePropertiesWizardPage(final List<IPropertiesProviderDescriptor> descriptors) { super(BrowsePropertiesWizardPage.PAGE_NAME, "Browse Available Properties", null); this.descriptors = descriptors; this.setDescription("Browse Available Properties"); setPageComplete(false); } public List<EObject> getProperties() { return this.properties; } @Override public void dispose() { this.context.dispose(); super.dispose(); } @Override public void createControl(final Composite parent) { final Composite client = new Composite(parent, SWT.NULL); client.setLayout(new GridLayout(2, false)); final Control tree = createPropertyTree(client); tree.setLayoutData(this.dataFactory.hint(400, SWT.DEFAULT).grab(true, true).create()); // SUPPRESS CHECKSTYLE MagicNumber setPageComplete(false); this.setControl(client); } private Control createPropertyTree(final Composite parent) { final Group treeGroup = new Group(parent, SWT.NULL); treeGroup.setText("Properties"); treeGroup.setLayout(this.layoutFactory.numColumns(1).create()); final BrowsePatternFilter patternFilter = new BrowsePatternFilter(); patternFilter.setIncludeLeadingWildcard(false); final FilteredTree tree = new FilteredTree(treeGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, patternFilter, true); this.propertyTree = tree.getViewer(); this.propertyTree.getControl().setLayoutData(this.dataFactory.span(1, 1).grab(true, true).create()); ComposedAdapterFactory myAdapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE); myAdapterFactory.addAdapterFactory(new PrfItemProviderAdapterFactory()); final PropertiesBrowserContentProvider contentProvider = new PropertiesBrowserContentProvider(myAdapterFactory); this.propertyTree.setContentProvider(contentProvider); this.propertyTree.setLabelProvider(new PropertiesBrowserLabelProvider(myAdapterFactory)); this.propertyTree.setComparator(new ViewerComparator()); this.propertyTree.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { properties.clear(); List<Object> selection = Arrays.asList(((IStructuredSelection) event.getSelection()).toArray()); for (Object obj : selection) { if (obj instanceof AbstractProperty) { AbstractProperty prop = (AbstractProperty) obj; //If children of a selection are also selected, don't add them too. if (!selection.contains(prop.eContainer())) { properties.add(EcoreUtil.copy((EObject) obj)); } } } if (properties.isEmpty()) { setErrorMessage("Select at least one property"); setPageComplete(false); } else { setErrorMessage(null); setPageComplete(true); } } }); this.propertyTree.setInput(this.descriptors); this.propertyTree.getControl().setLayoutData(this.dataFactory.grab(true, true).create()); return treeGroup; } }