/** * 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.internal.ui.editor.composite; import gov.redhawk.common.ui.AdapterFactoryCellLabelProvider; import gov.redhawk.common.ui.doc.HelpConstants; import gov.redhawk.common.ui.editor.FormLayoutFactory; import gov.redhawk.ui.doc.HelpUtil; import java.util.ArrayList; import mil.jpeojtrs.sca.prf.PropertyConfigurationType; import mil.jpeojtrs.sca.prf.provider.PrfItemProviderAdapterFactory; import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory; import org.eclipse.emf.edit.provider.AttributeValueWrapperItemProvider; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory; import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory; import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; 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 org.eclipse.swt.widgets.Table; import org.eclipse.ui.forms.IFormColors; import org.eclipse.ui.forms.widgets.FormToolkit; public class SimpleSequencePropertyComposite extends BasicSimplePropertyComposite { protected static final int NUM_COLUMNS = 3; private Label valuesLabel; private TableViewer valuesViewer; private final ComposedAdapterFactory adapterFactory; private Button addValueButton; private Button removeValueButton; private TableViewerColumn valueColumn; private Object lastSelection; public SimpleSequencePropertyComposite(final Composite parent, final int style, final FormToolkit toolkit) { super(parent, style, toolkit); this.adapterFactory = createAdapterFactory(); createControls(this, toolkit); } protected void createControls(Composite parent, FormToolkit toolkit) { parent.setLayout(FormLayoutFactory.createSectionClientGridLayout(false, SimpleSequencePropertyComposite.NUM_COLUMNS)); createIDEntryField(toolkit, parent); createNameEntryField(toolkit, parent); createTypeViewer(parent, toolkit); createValues(parent, toolkit); createUnitsEntry(parent, toolkit); createKindViewer(parent, toolkit); createModeViewer(parent, toolkit); createActionViewer(parent, toolkit); createRange(parent, toolkit); createDescription(parent, toolkit); ArrayList<Control> tabList = new ArrayList<Control>(); tabList.add(getIdEntry().getText()); tabList.add(getNameEntry().getText()); tabList.add(getTypeViewer().getControl()); tabList.add(getValuesViewer().getControl().getParent()); tabList.add(getUnitsEntry().getText()); tabList.add(getKindViewer().getControl()); tabList.add(getModeViewer().getControl()); tabList.add(getActionViewer().getControl()); tabList.add(getRangeButton()); tabList.add(getMinText().getText().getParent()); tabList.add(getMaxText().getText().getParent()); tabList.add(getDescriptionText()); parent.setTabList(tabList.toArray(new Control[tabList.size()])); toolkit.paintBordersFor(parent); } @Override public void dispose() { this.adapterFactory.dispose(); super.dispose(); } /** * Create an adapter factory that yields item providers. * * @return the composed adapter factory */ private ComposedAdapterFactory createAdapterFactory() { final ComposedAdapterFactory newAdapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE); newAdapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory()); newAdapterFactory.addAdapterFactory(new PrfItemProviderAdapterFactory()); newAdapterFactory.addAdapterFactory(new EcoreItemProviderAdapterFactory()); newAdapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory()); return newAdapterFactory; } @Override protected ComboViewer createKindViewer(Composite parent, FormToolkit toolkit) { ComboViewer retVal = super.createKindViewer(parent, toolkit); // Hide EXECPARAM since only SimpleProps can be exec params. this.getKindViewer().addFilter(new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof PropertyConfigurationType && ((PropertyConfigurationType) element).equals(PropertyConfigurationType.EXECPARAM)) { return false; } return true; } }); return retVal; } protected void createValues(final Composite parent, final FormToolkit toolkit) { // Value this.valuesLabel = toolkit.createLabel(parent, "Values:"); this.valuesLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); this.valuesLabel.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false)); final Composite valuesComp = toolkit.createComposite(parent, SWT.NULL); valuesComp.setLayout(GridLayoutFactory.fillDefaults().margins(0, 0).numColumns(2).create()); valuesComp.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).grab(true, true).create()); final Table table = toolkit.createTable(valuesComp, SWT.BORDER); table.setLayoutData(GridDataFactory.fillDefaults().hint(SWT.DEFAULT, 150).span(1, 2).grab(true, true).create()); this.valuesViewer = new TableViewer(table); final TableLayout layout = new TableLayout(); this.valuesViewer.getTable().setLayout(layout); this.valuesViewer.getTable().setHeaderVisible(false); this.valuesViewer.getTable().setLinesVisible(true); this.valuesViewer.setContentProvider(new AdapterFactoryContentProvider(this.adapterFactory)); this.valueColumn = new TableViewerColumn(this.valuesViewer, SWT.LEFT); this.valueColumn.setLabelProvider(new AdapterFactoryCellLabelProvider(this.adapterFactory)); layout.addColumnData(new ColumnWeightData(1, 20, true)); this.addValueButton = toolkit.createButton(valuesComp, "Add...", SWT.PUSH); this.addValueButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).create()); this.removeValueButton = toolkit.createButton(valuesComp, "Remove", SWT.PUSH); this.removeValueButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).create()); this.valuesViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(final SelectionChangedEvent event) { if (event.getSelection() instanceof StructuredSelection) { if (((StructuredSelection) event.getSelection()).getFirstElement() instanceof AttributeValueWrapperItemProvider) { final AttributeValueWrapperItemProvider provider = (AttributeValueWrapperItemProvider) ((StructuredSelection) event.getSelection()) .getFirstElement(); SimpleSequencePropertyComposite.this.lastSelection = provider.getValue(); } } } }); this.removeValueButton.setEnabled(false); HelpUtil.assignTooltip(this.valuesViewer.getControl(), HelpConstants.prf_properties_simplesequence_values); } public TableViewerColumn getValueColumn() { return this.valueColumn; } public TableViewer getValuesViewer() { return this.valuesViewer; } public Button getRemoveValueButton() { return this.removeValueButton; } public Button getAddValueButton() { return this.addValueButton; } @Override public void setEditable(final boolean canEdit) { super.setEditable(canEdit); this.valuesLabel.setEnabled(canEdit); this.addValueButton.setEnabled(canEdit); } /** * @return The last selected object from the TableViewer */ public Object getLastSelection() { return this.lastSelection; } }