/******************************************************************************* * 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.ide.spd.internal.ui.editor; import gov.redhawk.common.ui.editor.FormLayoutFactory; import gov.redhawk.ui.editor.ScaSection; import java.util.Collections; import mil.jpeojtrs.sca.scd.ComponentFeatures; import mil.jpeojtrs.sca.scd.Interface; import mil.jpeojtrs.sca.scd.Interfaces; import mil.jpeojtrs.sca.scd.Ports; import mil.jpeojtrs.sca.scd.Provides; import mil.jpeojtrs.sca.scd.ScdFactory; import mil.jpeojtrs.sca.scd.ScdPackage; import mil.jpeojtrs.sca.scd.SoftwareComponent; import mil.jpeojtrs.sca.scd.SupportsInterface; import mil.jpeojtrs.sca.scd.Uses; import mil.jpeojtrs.sca.scd.util.ScdAdapterFactory; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.emf.edit.command.RemoveCommand; import org.eclipse.emf.edit.domain.EditingDomain; 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.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IActionBars; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.forms.widgets.TableWrapData; /** * The Class InterfaceSection. * * @since 2.1 */ public class InterfaceSection extends ScaSection { private static final int NUM_COLUMNS = 3; private static final String AGGREGATE_DEVICE_REPID = "IDL:CF/AggregateDevice:1.0"; private static final String AGGREGATE_DEVICE = "AggregateDevice"; private Button aggregateButton; private TableViewer interfaceViewer; private ComposedAdapterFactory adapterFactory; private Resource resource; /** * Instantiates a new Interface section. * * @param page the page * @param parent the parent */ public InterfaceSection(final ComponentOverviewPage page, final Composite parent) { super(page, parent, Section.DESCRIPTION | ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE | ExpandableComposite.COMPACT); createClient(getSection(), page.getEditor().getToolkit()); } /** * {@inheritDoc} */ @Override protected void createClient(final Section section, final FormToolkit toolkit) { section.setText("Interfaces"); section.setLayout(FormLayoutFactory.createClearTableWrapLayout(false, 1)); final TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB); section.setLayoutData(data); section.setDescription("This section configures the interfaces of the resource."); final Composite client = toolkit.createComposite(section); client.setLayout(FormLayoutFactory.createSectionClientGridLayout(false, InterfaceSection.NUM_COLUMNS)); section.setClient(client); final IActionBars actionBars = getPage().getEditor().getEditorSite().getActionBars(); createInterfacesArea(client, toolkit, actionBars); toolkit.paintBordersFor(client); } /** * Creates the ports area. * * @param client the client * @param toolkit the toolkit * @param actionBars the action bars */ private void createInterfacesArea(final Composite client, final FormToolkit toolkit, final IActionBars actionBars) { final Composite tableComp = toolkit.createComposite(client, SWT.NULL); final GridLayout layout = new GridLayout(2, false); tableComp.setLayout(layout); tableComp.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).grab(true, true).create()); final Table table = toolkit.createTable(tableComp, SWT.SINGLE | SWT.BORDER); table.setLinesVisible(true); table.setHeaderVisible(true); final TableLayout tableLayout = new TableLayout(); tableLayout.addColumnData(new ColumnWeightData(20, 30, true)); // SUPPRESS CHECKSTYLE MagicNumber tableLayout.addColumnData(new ColumnWeightData(30, 70, true)); // SUPPRESS CHECKSTYLE MagicNumber table.setLayout(tableLayout); TableColumn column = new TableColumn(table, SWT.NULL); column.setText("Name"); column = new TableColumn(table, SWT.NULL); column.setText("RepID"); this.interfaceViewer = new TableViewer(table); this.interfaceViewer.setColumnProperties(new String[] { ScdPackage.Literals.INTERFACE__NAME.getName(), ScdPackage.Literals.INTERFACE__REPID.getName() }); table.setLayoutData(GridDataFactory.fillDefaults().span(1, 3).hint(100, 100).grab(true, true).create()); // SUPPRESS CHECKSTYLE MagicNumber // final Button addButton = toolkit.createButton(tableComp, "Add...", // SWT.PUSH); // addButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, // SWT.TOP).create()); // addButton.addSelectionListener(new SelectionAdapter() { // @Override // public void widgetSelected(final SelectionEvent e) { // handleAddInterface(); // } // }); // final Button editButton = toolkit.createButton(tableComp, "Edit", // SWT.PUSH); // editButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, // SWT.TOP).create()); // editButton.setEnabled(false); // editButton.addSelectionListener(new SelectionAdapter() { // @Override // public void widgetSelected(final SelectionEvent e) { // handleEditInterface(); // } // }); // final Button removeButton = toolkit.createButton(tableComp, "Remove", // SWT.PUSH); // removeButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, // SWT.TOP).create()); // removeButton.setEnabled(false); // removeButton.addSelectionListener(new SelectionAdapter() { // @Override // public void widgetSelected(final SelectionEvent e) { // handleRemoveInterface(); // } // }); this.interfaceViewer.setContentProvider(new AdapterFactoryContentProvider(getAdapterFactory())); this.interfaceViewer.setLabelProvider(new AdapterFactoryLabelProvider(getAdapterFactory())); this.interfaceViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(final SelectionChangedEvent event) { // removeButton.setEnabled(!event.getSelection().isEmpty()); // editButton.setEnabled(!event.getSelection().isEmpty()); } }); this.aggregateButton = new Button(tableComp, SWT.CHECK); this.aggregateButton.setText("Aggregate Device"); this.aggregateButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.TOP, true, false, 2, 1)); this.aggregateButton.setVisible(false); this.aggregateButton.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(final SelectionEvent e) { aggregateClicked(InterfaceSection.this.aggregateButton.getSelection()); } @Override public void widgetSelected(final SelectionEvent e) { aggregateClicked(InterfaceSection.this.aggregateButton.getSelection()); } }); } protected void aggregateClicked(final boolean selection) { final Interfaces ifs = getInterfaces(); final ComponentFeatures cf = getComponentFeatures(); if (selection) { boolean addAggregate = true; for (final Interface iface : ifs.getInterface()) { if (InterfaceSection.AGGREGATE_DEVICE.equals(iface.getName())) { addAggregate = false; break; } } if (addAggregate) { final Interface i = ScdFactory.eINSTANCE.createInterface(); i.setName(InterfaceSection.AGGREGATE_DEVICE); i.setRepid(InterfaceSection.AGGREGATE_DEVICE_REPID); final SupportsInterface si = ScdFactory.eINSTANCE.createSupportsInterface(); si.setSupportsName(InterfaceSection.AGGREGATE_DEVICE); si.setRepId(InterfaceSection.AGGREGATE_DEVICE_REPID); execute(AddCommand.create(getEditingDomain(), cf, ScdPackage.Literals.COMPONENT_FEATURES__SUPPORTS_INTERFACE, si)); execute(AddCommand.create(getEditingDomain(), ifs, ScdPackage.Literals.INTERFACES__INTERFACE, i)); } } else { for (final SupportsInterface si : cf.getSupportsInterface()) { if (InterfaceSection.AGGREGATE_DEVICE.equals(si.getSupportsName())) { execute(RemoveCommand.create(getEditingDomain(), cf, ScdPackage.Literals.COMPONENT_FEATURES__SUPPORTS_INTERFACE, si)); break; } } for (final Interface i : ifs.getInterface()) { if (InterfaceSection.AGGREGATE_DEVICE_REPID.equals(i.getRepid())) { execute(RemoveCommand.create(getEditingDomain(), ifs, ScdPackage.Literals.INTERFACES__INTERFACE, i)); break; } } } } /** * Handle remove port. */ protected void handleRemoveInterface() { final Interface iface = (Interface) ((IStructuredSelection) this.interfaceViewer.getSelection()).getFirstElement(); final String repId = iface.getRepid(); if (!containsRepId(repId, iface)) { execute(RemoveCommand.create(getEditingDomain(), this.getInterfaces(), ScdPackage.Literals.INTERFACES__INTERFACE, iface)); } else { final Shell shell = getPage().getEditorSite().getShell(); MessageDialog.openWarning(shell, "Cannot Remove Interface", "The interface \"" + iface.getName() + "\" is in use by a port. It cannot be removed."); } } private boolean containsRepId(final String testRep, final EObject obj) { final Ports ports = this.getPorts(); boolean found = false; for (final Provides p : ports.getProvides()) { if ((p != obj) && p.getRepID().equals(testRep)) { found = true; break; } } if (!found) { for (final Uses u : ports.getUses()) { if ((u != obj) && u.getRepID().equals(testRep)) { found = true; break; } } } return found; } /** * Execute. * * @param command the command */ private void execute(final Command command) { getEditingDomain().getCommandStack().execute(command); } /** * Gets the editing domain. * * @return the editing domain */ private EditingDomain getEditingDomain() { return getPage().getEditor().getEditingDomain(); } private ComponentFeatures getComponentFeatures() { final SoftwareComponent scd = SoftwareComponent.Util.getSoftwareComponent(this.resource); return scd.getComponentFeatures(); } private Interfaces getInterfaces() { final SoftwareComponent scd = SoftwareComponent.Util.getSoftwareComponent(this.resource); return scd.getInterfaces(); } private Ports getPorts() { final SoftwareComponent scd = SoftwareComponent.Util.getSoftwareComponent(this.resource); return scd.getComponentFeatures().getPorts(); } /** * Gets the adapter factory. * * @return the adapter factory */ private AdapterFactory getAdapterFactory() { if (this.adapterFactory == null) { this.adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE); this.adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory()); this.adapterFactory.addAdapterFactory(new ScdAdapterFactory()); this.adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory()); } return this.adapterFactory; } /** * {@inheritDoc} */ @Override public void refresh(final Resource resource) { this.resource = resource; try { boolean foundAggregate = false; this.interfaceViewer.setInput(getInterfaces()); for (final SupportsInterface i : getComponentFeatures().getSupportsInterface()) { if ("Device".equals(i.getSupportsName())) { this.aggregateButton.setVisible(true); } else if (InterfaceSection.AGGREGATE_DEVICE.equals(i.getSupportsName())) { foundAggregate = true; } } this.aggregateButton.setSelection(foundAggregate); } catch (final Exception e) { // SUPPRESS CHECKSTYLE Fallback // Some problem occurred while trying to set the viewer input, // therefore set to empty this.interfaceViewer.setInput(Collections.EMPTY_LIST); } } }