/******************************************************************************* * 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.composite; import gov.redhawk.common.ui.editor.FormLayoutFactory; import gov.redhawk.ide.codegen.provider.CodegenItemProviderAdapterFactory; import gov.redhawk.ide.spd.internal.ui.editor.provider.ImplementationDetailsSectionDependencyItemProvider; import gov.redhawk.ide.spd.internal.ui.editor.provider.ImplementationDetailsSectionImplementationItemProvider; import gov.redhawk.ide.spd.internal.ui.editor.provider.ImplementationDetailsSectionOsItemProvider; import gov.redhawk.ide.spd.internal.ui.editor.provider.ImplementationDetailsSectionProcessorItemProvider; import gov.redhawk.ide.spd.internal.ui.editor.provider.ImplementationDetailsSectionPropertyRefItemProvider; import gov.redhawk.ide.spd.internal.ui.editor.provider.SpdItemProviderAdapterFactoryAdapter; import gov.redhawk.ui.editor.IScaComposite; import gov.redhawk.ui.util.SWTUtil; import mil.jpeojtrs.sca.spd.Dependency; import mil.jpeojtrs.sca.spd.Os; import mil.jpeojtrs.sca.spd.Processor; import org.eclipse.emf.common.notify.AdapterFactory; 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.layout.GridDataFactory; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; 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 ComponentDependencyComposite extends Composite implements IScaComposite { private static final int NUM_COLUMNS = 3; private static final int NUM_DEPENDENCY_EDIT_BUTTONS = 3; private final FormToolkit toolkit; private ComposedAdapterFactory adapterFactory; private TableViewer osViewer; private TableViewer processorViewer; private TableViewer dependencyViewer; private Button addOsButton; private Button editOsButton; private Button removeOsButton; private Button addProcessorButton; private Button editProcessorButton; private Button removeProcessorButton; private Button addDependencyButton; private Button editDependencyButton; private Button removeDependencyButton; private boolean editable; /** * @param parent * @param style */ public ComponentDependencyComposite(final Composite parent, final int style, final FormToolkit toolkit) { super(parent, style); this.toolkit = toolkit; this.setLayout(FormLayoutFactory.createSectionClientGridLayout(false, ComponentDependencyComposite.NUM_COLUMNS)); createOsArea(); createProcessorArea(); createDependencyArea(); toolkit.paintBordersFor(this); } /** * Creates the os entry. * * @param client the client * @param toolkit the toolkit * @param actionBars the action bars */ private void createOsArea() { final Label label = this.toolkit.createLabel(this, "OS:"); label.setForeground(this.toolkit.getColors().getColor(IFormColors.TITLE)); label.setLayoutData(GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.TOP).create()); final Composite tableComp = this.toolkit.createComposite(this, SWT.NULL); final GridLayout layout = SWTUtil.TABLE_ENTRY_LAYOUT_FACTORY.create(); tableComp.setLayout(layout); tableComp.setLayoutData(GridDataFactory.fillDefaults().span(ComponentDependencyComposite.NUM_COLUMNS - 1, 1).grab(true, true).create()); final Table table = this.toolkit.createTable(tableComp, SWT.SINGLE | SWT.BORDER); this.osViewer = new TableViewer(table); this.osViewer.setLabelProvider(new AdapterFactoryLabelProvider(getAdapterFactory())); this.osViewer.setContentProvider(new AdapterFactoryContentProvider(getAdapterFactory())); this.osViewer.setComparator(createOsViewerComparator()); this.osViewer.setFilters(createOsViewerFilter()); table.setLayoutData(GridDataFactory.fillDefaults().span(1, ComponentDependencyComposite.NUM_COLUMNS).hint(SWT.DEFAULT, 50).grab(true, true).create()); // SUPPRESS CHECKSTYLE MagicNumber this.addOsButton = this.toolkit.createButton(tableComp, "Add...", SWT.PUSH); this.addOsButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create()); this.editOsButton = this.toolkit.createButton(tableComp, "Edit", SWT.PUSH); this.editOsButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create()); this.editOsButton.setEnabled(false); this.removeOsButton = this.toolkit.createButton(tableComp, "Remove", SWT.PUSH); this.removeOsButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create()); this.removeOsButton.setEnabled(false); this.osViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(final SelectionChangedEvent event) { ComponentDependencyComposite.this.removeOsButton.setEnabled(!event.getSelection().isEmpty() && ComponentDependencyComposite.this.editable); ComponentDependencyComposite.this.editOsButton.setEnabled(!event.getSelection().isEmpty() && ComponentDependencyComposite.this.editable); } }); } /** * Creates the os viewer filter. * * @return the viewer filter[] */ private ViewerFilter[] createOsViewerFilter() { return new ViewerFilter[] { new ViewerFilter() { @Override public boolean select(final Viewer viewer, final Object parentElement, final Object element) { return element instanceof Os; } } }; } /** * Creates the os viewer comparator. * * @return the viewer comparator */ private ViewerComparator createOsViewerComparator() { return new ViewerComparator(); } /** * Gets the adapter factory. * * @return the adapter factory */ protected AdapterFactory getAdapterFactory() { if (this.adapterFactory == null) { this.adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE); this.adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory()); final SpdItemProviderAdapterFactoryAdapter spdFactory = new SpdItemProviderAdapterFactoryAdapter(); spdFactory.setImplementationAdapter(new ImplementationDetailsSectionImplementationItemProvider(spdFactory)); spdFactory.setOsAdapter(new ImplementationDetailsSectionOsItemProvider(spdFactory)); spdFactory.setProcessorAdapter(new ImplementationDetailsSectionProcessorItemProvider(spdFactory)); spdFactory.setDependencyAdapter(new ImplementationDetailsSectionDependencyItemProvider(spdFactory)); spdFactory.setPropertyRefAdapter(new ImplementationDetailsSectionPropertyRefItemProvider(spdFactory)); this.adapterFactory.addAdapterFactory(spdFactory); this.adapterFactory.addAdapterFactory(new CodegenItemProviderAdapterFactory()); this.adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory()); } return this.adapterFactory; } /** * {@inheritDoc} */ @Override public void dispose() { if (this.adapterFactory != null) { this.adapterFactory.dispose(); this.adapterFactory = null; } super.dispose(); } /** * Creates the processor entry. * * @param client the client * @param toolkit the toolkit * @param actionBars the action bars */ private void createProcessorArea() { final Label label = this.toolkit.createLabel(this, "Processor(s):"); label.setForeground(this.toolkit.getColors().getColor(IFormColors.TITLE)); label.setLayoutData(GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.TOP).create()); final Composite tableComp = this.toolkit.createComposite(this, SWT.NULL); final GridLayout layout = SWTUtil.TABLE_ENTRY_LAYOUT_FACTORY.create(); tableComp.setLayout(layout); tableComp.setLayoutData(GridDataFactory.fillDefaults().span(ComponentDependencyComposite.NUM_COLUMNS - 1, 1).grab(true, true).create()); final Table table = this.toolkit.createTable(tableComp, SWT.SINGLE | SWT.BORDER); this.processorViewer = new TableViewer(table); this.processorViewer.setLabelProvider(new AdapterFactoryLabelProvider(getAdapterFactory())); this.processorViewer.setContentProvider(new AdapterFactoryContentProvider(getAdapterFactory())); this.processorViewer.setComparator(createProcessorViewerComparator()); this.processorViewer.setFilters(createProcessorViewerFilter()); table.setLayoutData(GridDataFactory.fillDefaults().span(1, ComponentDependencyComposite.NUM_COLUMNS).hint(SWT.DEFAULT, 50).grab(true, true).create()); // SUPPRESS CHECKSTYLE MagicNumber this.addProcessorButton = this.toolkit.createButton(tableComp, "Add...", SWT.PUSH); this.addProcessorButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create()); this.editProcessorButton = this.toolkit.createButton(tableComp, "Edit", SWT.PUSH); this.editProcessorButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create()); this.editProcessorButton.setEnabled(false); this.removeProcessorButton = this.toolkit.createButton(tableComp, "Remove", SWT.PUSH); this.removeProcessorButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create()); this.removeProcessorButton.setEnabled(false); this.processorViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(final SelectionChangedEvent event) { ComponentDependencyComposite.this.removeProcessorButton.setEnabled(!event.getSelection().isEmpty() && ComponentDependencyComposite.this.editable); ComponentDependencyComposite.this.editProcessorButton.setEnabled(!event.getSelection().isEmpty() && ComponentDependencyComposite.this.editable); } }); } /** * Creates the processor viewer comparator. * * @return the viewer comparator */ private ViewerComparator createProcessorViewerComparator() { return new ViewerComparator(); } /** * Creates the processor viewer filter. * * @return the viewer filter[] */ private ViewerFilter[] createProcessorViewerFilter() { return new ViewerFilter[] { new ViewerFilter() { @Override public boolean select(final Viewer viewer, final Object parentElement, final Object element) { return element instanceof Processor; } } }; } /** * Creates the os entry. * * @param client the client * @param toolkit the toolkit * @param actionBars the action bars */ private void createDependencyArea() { final Label label = this.toolkit.createLabel(this, "Dependency:"); label.setForeground(this.toolkit.getColors().getColor(IFormColors.TITLE)); label.setLayoutData(GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.TOP).create()); final Composite tableComp = this.toolkit.createComposite(this, SWT.NULL); final GridLayout layout = SWTUtil.TABLE_ENTRY_LAYOUT_FACTORY.create(); tableComp.setLayout(layout); tableComp.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).grab(true, true).create()); final Table table = this.toolkit.createTable(tableComp, SWT.SINGLE | SWT.BORDER); this.dependencyViewer = new TableViewer(table); this.dependencyViewer.setLabelProvider(new AdapterFactoryLabelProvider(getAdapterFactory())); this.dependencyViewer.setContentProvider(new AdapterFactoryContentProvider(getAdapterFactory())); // this.dependencyViewer.setComparator(createDepednecViewerComparator()); this.dependencyViewer.setFilters(createDependencyViewerFilter()); table.setLayoutData(GridDataFactory.fillDefaults().span(1, ComponentDependencyComposite.NUM_DEPENDENCY_EDIT_BUTTONS).hint(SWT.DEFAULT, 50) // SUPPRESS CHECKSTYLE MagicNumber .grab(true, true).create()); this.addDependencyButton = this.toolkit.createButton(tableComp, "Add...", SWT.PUSH); this.addDependencyButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create()); this.editDependencyButton = this.toolkit.createButton(tableComp, "Edit", SWT.PUSH); this.editDependencyButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create()); this.editDependencyButton.setEnabled(false); this.removeDependencyButton = this.toolkit.createButton(tableComp, "Remove", SWT.PUSH); this.removeDependencyButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create()); this.removeDependencyButton.setEnabled(false); this.dependencyViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(final SelectionChangedEvent event) { ComponentDependencyComposite.this.removeDependencyButton.setEnabled(!event.getSelection().isEmpty() && ComponentDependencyComposite.this.editable); ComponentDependencyComposite.this.editDependencyButton.setEnabled(!event.getSelection().isEmpty() && ComponentDependencyComposite.this.editable); } }); } /** * Creates the processor viewer filter. * * @return the viewer filter[] */ private ViewerFilter[] createDependencyViewerFilter() { return new ViewerFilter[] { new ViewerFilter() { @Override public boolean select(final Viewer viewer, final Object parentElement, final Object element) { return element instanceof Dependency; } } }; } /** * @return the osViewer */ public TableViewer getOsViewer() { return this.osViewer; } /** * @return the processorViewer */ public TableViewer getProcessorViewer() { return this.processorViewer; } /** * @return the dependencyViewer */ public TableViewer getDependencyViewer() { return this.dependencyViewer; } /** * @return the addOsButton */ public Button getAddOsButton() { return this.addOsButton; } /** * @return the editOsButton */ public Button getEditOsButton() { return this.editOsButton; } /** * @return the removeOsButton */ public Button getRemoveOsButton() { return this.removeOsButton; } /** * @return the addProcessorButton */ public Button getAddProcessorButton() { return this.addProcessorButton; } /** * @return the editProcessorButton */ public Button getEditProcessorButton() { return this.editProcessorButton; } /** * @return the removeProcessorButton */ public Button getRemoveProcessorButton() { return this.removeProcessorButton; } /** * @return the addProcessorButton */ public Button getAddDependencyButton() { return this.addDependencyButton; } /** * @return the editProcessorButton */ public Button getEditDependencyButton() { return this.editDependencyButton; } /** * @return the removeProcessorButton */ public Button getRemoveDependencyButton() { return this.removeDependencyButton; } /** * {@inheritDoc} */ @Override public void setEditable(final boolean canEdit) { this.editable = canEdit; // Don't set enabled on properties viewer since this will disable scrolling // this.osViewer.getTable().setEnabled(canEdit); // this.processorViewer.getTable().setEnabled(canEdit); // this.dependencyViewer.getTable().setEnabled(canEdit); this.addDependencyButton.setEnabled(canEdit); this.addOsButton.setEnabled(canEdit); this.addProcessorButton.setEnabled(canEdit); } }