| /******************************************************************************* |
| * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency |
| * 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 |
| * |
| * Contributors: |
| * Pierre Allard - initial API and implementation |
| * |
| * SPDX-License-Identifier: EPL-1.0 |
| * |
| *******************************************************************************/ |
| package org.eclipse.apogy.common.topology.bindings.ui.composites; |
| |
| import java.util.Collection; |
| |
| import org.eclipse.apogy.common.emf.AbstractFeatureSpecifier; |
| import org.eclipse.apogy.common.emf.AbstractFeatureTreeNode; |
| import org.eclipse.apogy.common.emf.ui.composites.AbstractFeatureSpecifierComposite; |
| import org.eclipse.apogy.common.topology.Node; |
| import org.eclipse.apogy.common.topology.bindings.AbstractTopologyBinding; |
| import org.eclipse.apogy.common.topology.bindings.BindingsSet; |
| import org.eclipse.core.databinding.DataBindingContext; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.DisposeEvent; |
| import org.eclipse.swt.events.DisposeListener; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.ui.forms.widgets.ExpandableComposite; |
| import org.eclipse.ui.forms.widgets.FormToolkit; |
| import org.eclipse.ui.forms.widgets.ScrolledForm; |
| import org.eclipse.ui.forms.widgets.Section; |
| import org.eclipse.ui.forms.widgets.TableWrapData; |
| import org.eclipse.ui.forms.widgets.TableWrapLayout; |
| |
| public abstract class BindingsSetComposite extends Composite { |
| private final FormToolkit formToolkit = new FormToolkit(Display.getCurrent()); |
| private BindingsSet bindingsSet; |
| |
| private DataBindingContext m_bindingContext; |
| |
| private FeatureRootsListComposite featureRootsListComposite; |
| private AbstractFeatureSpecifierComposite abstractFeatureSpecifierComposite; |
| |
| private BindingsListComposite bindingsListComposite; |
| private AbstractTopologyBindingOverviewComposite abstractTopologyBindingOverviewComposite; |
| private AbtractTopologyBindingDetailsComposite abtractTopologyBindingDetailsComposite; |
| |
| public BindingsSetComposite(Composite parent, int style) { |
| super(parent, style); |
| setLayout(new GridLayout(1, false)); |
| |
| ScrolledForm topScrolledForm = this.formToolkit.createScrolledForm(this); |
| topScrolledForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); |
| topScrolledForm.setShowFocusedControl(true); |
| this.formToolkit.paintBordersFor(topScrolledForm); |
| topScrolledForm.setText(null); |
| { |
| TableWrapLayout tableWrapLayout = new TableWrapLayout(); |
| tableWrapLayout.makeColumnsEqualWidth = true; |
| tableWrapLayout.numColumns = 1; |
| topScrolledForm.getBody().setLayout(tableWrapLayout); |
| } |
| |
| // Features Section. |
| Section featuresSection = this.formToolkit.createSection(topScrolledForm.getBody(), |
| ExpandableComposite.EXPANDED | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR); |
| TableWrapData twd_sctnFeatures = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP, 1, 1); |
| twd_sctnFeatures.valign = TableWrapData.FILL; |
| twd_sctnFeatures.grabVertical = true; |
| twd_sctnFeatures.grabHorizontal = true; |
| featuresSection.setLayoutData(twd_sctnFeatures); |
| this.formToolkit.paintBordersFor(featuresSection); |
| featuresSection.setText("Features"); |
| featuresSection.setLayout(new GridLayout(1, false)); |
| |
| ScrolledForm featuresScrolledForm = this.formToolkit.createScrolledForm(featuresSection); |
| featuresScrolledForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); |
| featuresScrolledForm.setShowFocusedControl(true); |
| this.formToolkit.paintBordersFor(featuresScrolledForm); |
| featuresScrolledForm.setText(null); |
| { |
| TableWrapLayout tableWrapLayout = new TableWrapLayout(); |
| tableWrapLayout.makeColumnsEqualWidth = true; |
| tableWrapLayout.numColumns = 2; |
| featuresScrolledForm.getBody().setLayout(tableWrapLayout); |
| } |
| featuresSection.setClient(featuresScrolledForm); |
| |
| // Features List |
| Section featuresListSection = this.formToolkit.createSection(featuresScrolledForm.getBody(), |
| ExpandableComposite.EXPANDED | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR); |
| TableWrapData twd_sctnFeaturesList = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP, 1, 1); |
| twd_sctnFeaturesList.valign = TableWrapData.FILL; |
| twd_sctnFeaturesList.grabVertical = true; |
| twd_sctnFeaturesList.grabHorizontal = true; |
| featuresListSection.setLayoutData(twd_sctnFeaturesList); |
| this.formToolkit.paintBordersFor(featuresListSection); |
| featuresListSection.setText("Features List"); |
| |
| this.featureRootsListComposite = new FeatureRootsListComposite(featuresListSection, SWT.NONE) { |
| @Override |
| protected void newAbstractFeatureTreeNodeSelected(AbstractFeatureTreeNode selectedAbstractFeatureTreeNode) { |
| if (selectedAbstractFeatureTreeNode instanceof AbstractFeatureSpecifier) { |
| BindingsSetComposite.this.abstractFeatureSpecifierComposite |
| .setAbstractFeatureSpecifier((AbstractFeatureSpecifier) selectedAbstractFeatureTreeNode); |
| } |
| } |
| }; |
| GridData gd_featureRootsListComposite = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1); |
| gd_featureRootsListComposite.minimumHeight = 200; |
| gd_featureRootsListComposite.heightHint = 200; |
| this.featureRootsListComposite.setLayoutData(gd_featureRootsListComposite); |
| |
| this.formToolkit.adapt(this.featureRootsListComposite); |
| this.formToolkit.paintBordersFor(this.featureRootsListComposite); |
| featuresListSection.setClient(this.featureRootsListComposite); |
| |
| // Feature Details. |
| Section featureDetailsSection = this.formToolkit.createSection(featuresScrolledForm.getBody(), |
| ExpandableComposite.EXPANDED | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR); |
| TableWrapData twd_sctnFeatureDetails = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP, 1, 1); |
| twd_sctnFeatureDetails.valign = TableWrapData.FILL; |
| twd_sctnFeatureDetails.grabVertical = true; |
| twd_sctnFeatureDetails.grabHorizontal = true; |
| featureDetailsSection.setLayoutData(twd_sctnFeatureDetails); |
| this.formToolkit.paintBordersFor(featureDetailsSection); |
| featureDetailsSection.setText("Feature Details"); |
| |
| this.abstractFeatureSpecifierComposite = new AbstractFeatureSpecifierComposite(featureDetailsSection, SWT.NONE); |
| GridData gd_abstractFeatureSpecifierComposite = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1); |
| gd_abstractFeatureSpecifierComposite.minimumHeight = 200; |
| gd_abstractFeatureSpecifierComposite.heightHint = 200; |
| this.abstractFeatureSpecifierComposite.setLayoutData(gd_abstractFeatureSpecifierComposite); |
| |
| this.formToolkit.adapt(this.abstractFeatureSpecifierComposite); |
| this.formToolkit.paintBordersFor(this.abstractFeatureSpecifierComposite); |
| featureDetailsSection.setClient(this.abstractFeatureSpecifierComposite); |
| |
| // Bindings. |
| Section sctnBindings = this.formToolkit.createSection(topScrolledForm.getBody(), |
| ExpandableComposite.EXPANDED | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR); |
| TableWrapData twd_sctnBindings = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP, 1, 1); |
| twd_sctnBindings.valign = TableWrapData.FILL; |
| twd_sctnBindings.grabVertical = true; |
| twd_sctnBindings.grabHorizontal = true; |
| sctnBindings.setLayoutData(twd_sctnBindings); |
| this.formToolkit.paintBordersFor(sctnBindings); |
| sctnBindings.setText("Bindings"); |
| sctnBindings.setLayout(new GridLayout(1, false)); |
| |
| ScrolledForm bindingsScrolledForm = this.formToolkit.createScrolledForm(sctnBindings); |
| bindingsScrolledForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); |
| bindingsScrolledForm.setShowFocusedControl(true); |
| this.formToolkit.paintBordersFor(bindingsScrolledForm); |
| bindingsScrolledForm.setText(null); |
| { |
| TableWrapLayout tableWrapLayout = new TableWrapLayout(); |
| tableWrapLayout.makeColumnsEqualWidth = true; |
| tableWrapLayout.numColumns = 2; |
| bindingsScrolledForm.getBody().setLayout(tableWrapLayout); |
| } |
| sctnBindings.setClient(bindingsScrolledForm); |
| |
| // Bindings List |
| Section bindingsListSection = this.formToolkit.createSection(bindingsScrolledForm.getBody(), |
| ExpandableComposite.EXPANDED | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR); |
| TableWrapData twd_sctnBindingsList = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP, 2, 1); |
| twd_sctnBindingsList.valign = TableWrapData.FILL; |
| twd_sctnBindingsList.grabVertical = true; |
| twd_sctnBindingsList.grabHorizontal = true; |
| bindingsListSection.setLayoutData(twd_sctnBindingsList); |
| this.formToolkit.paintBordersFor(bindingsListSection); |
| bindingsListSection.setText("Bindings List"); |
| |
| // Bindings. |
| this.bindingsListComposite = new BindingsListComposite(bindingsListSection, SWT.NONE) { |
| @Override |
| protected void newBindingSelected(AbstractTopologyBinding selectedAbstractTopologyBinding) { |
| BindingsSetComposite.this.abstractTopologyBindingOverviewComposite |
| .setAbstractTopologyBinding(selectedAbstractTopologyBinding); |
| BindingsSetComposite.this.abtractTopologyBindingDetailsComposite |
| .setAbstractTopologyBinding(selectedAbstractTopologyBinding); |
| } |
| |
| @Override |
| public Collection<Node> getAvailableTopologyNodesForBinding() { |
| return BindingsSetComposite.this.getAvailableNodes(); |
| } |
| }; |
| GridData gd_bindingsListComposite = new GridData(SWT.FILL, SWT.TOP, true, false); |
| gd_bindingsListComposite.minimumHeight = 200; |
| gd_bindingsListComposite.heightHint = 200; |
| this.bindingsListComposite.setLayoutData(gd_bindingsListComposite); |
| |
| this.formToolkit.adapt(this.bindingsListComposite); |
| this.formToolkit.paintBordersFor(this.bindingsListComposite); |
| bindingsListSection.setClient(this.bindingsListComposite); |
| |
| // Binding Overview. |
| Section bindingsOverviewSection = this.formToolkit.createSection(bindingsScrolledForm.getBody(), |
| ExpandableComposite.EXPANDED | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR); |
| TableWrapData twd_sctnBindingOverview = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP, 1, 1); |
| twd_sctnBindingOverview.valign = TableWrapData.FILL; |
| twd_sctnBindingOverview.grabVertical = true; |
| twd_sctnBindingOverview.grabHorizontal = true; |
| bindingsOverviewSection.setLayoutData(twd_sctnBindingOverview); |
| this.formToolkit.paintBordersFor(bindingsOverviewSection); |
| bindingsOverviewSection.setText("Binding Overview"); |
| |
| this.abstractTopologyBindingOverviewComposite = new AbstractTopologyBindingOverviewComposite( |
| bindingsOverviewSection, SWT.BORDER); |
| GridData gd_abstractTopologyBindingOverviewComposite = new GridData(SWT.FILL, SWT.TOP, true, false); |
| gd_abstractTopologyBindingOverviewComposite.minimumHeight = 200; |
| gd_abstractTopologyBindingOverviewComposite.heightHint = 200; |
| this.abstractTopologyBindingOverviewComposite.setLayoutData(gd_abstractTopologyBindingOverviewComposite); |
| |
| this.formToolkit.adapt(this.abstractTopologyBindingOverviewComposite); |
| this.formToolkit.paintBordersFor(this.abstractTopologyBindingOverviewComposite); |
| bindingsOverviewSection.setClient(this.abstractTopologyBindingOverviewComposite); |
| |
| // Binding details |
| Section bindingsDetailsSection = this.formToolkit.createSection(bindingsScrolledForm.getBody(), |
| ExpandableComposite.EXPANDED | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR); |
| TableWrapData twd_sctnBindingDetails = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP, 1, 1); |
| twd_sctnBindingDetails.valign = TableWrapData.FILL; |
| twd_sctnBindingDetails.grabVertical = true; |
| twd_sctnBindingDetails.grabHorizontal = true; |
| bindingsDetailsSection.setLayoutData(twd_sctnBindingDetails); |
| this.formToolkit.paintBordersFor(bindingsDetailsSection); |
| bindingsDetailsSection.setText("Binding Details"); |
| |
| this.abtractTopologyBindingDetailsComposite = new AbtractTopologyBindingDetailsComposite(bindingsDetailsSection, |
| SWT.NONE); |
| GridData gd_abtractTopologyBindingDetailsComposite = new GridData(SWT.FILL, SWT.TOP, true, true); |
| gd_abtractTopologyBindingDetailsComposite.minimumHeight = 200; |
| gd_abtractTopologyBindingDetailsComposite.heightHint = 200; |
| this.abtractTopologyBindingDetailsComposite.setLayoutData(gd_abtractTopologyBindingDetailsComposite); |
| |
| this.formToolkit.adapt(this.abtractTopologyBindingDetailsComposite); |
| this.formToolkit.paintBordersFor(this.abtractTopologyBindingDetailsComposite); |
| bindingsDetailsSection.setClient(this.abtractTopologyBindingDetailsComposite); |
| |
| // Cleanup on dispose. |
| addDisposeListener(new DisposeListener() { |
| @Override |
| public void widgetDisposed(DisposeEvent e) { |
| if (BindingsSetComposite.this.m_bindingContext != null) |
| BindingsSetComposite.this.m_bindingContext.dispose(); |
| } |
| }); |
| } |
| |
| /** |
| * Returns the BindingsSet being displayed. |
| * |
| * @return The BindingsSet, can be null. |
| */ |
| public BindingsSet getBindingsSet() { |
| return this.bindingsSet; |
| } |
| |
| /** |
| * Sets the BindingsSet to display. |
| * |
| * @param newBindingsSet The BindingsSet to display, can be null. |
| */ |
| public void setBindingsSet(BindingsSet newBindingsSet) { |
| if (this.m_bindingContext != null) |
| this.m_bindingContext.dispose(); |
| |
| this.bindingsSet = newBindingsSet; |
| |
| if (newBindingsSet != null) { |
| this.featureRootsListComposite.setFeatureRootsList(newBindingsSet.getFeatureRootsList()); |
| this.bindingsListComposite.setBindingsList(newBindingsSet.getBindingsList()); |
| |
| this.abstractTopologyBindingOverviewComposite.setAbstractTopologyBinding(null); |
| this.abtractTopologyBindingDetailsComposite.setAbstractTopologyBinding(null); |
| this.abstractFeatureSpecifierComposite.setAbstractFeatureSpecifier(null); |
| |
| this.m_bindingContext = initDataBindingsCustom(); |
| } else { |
| this.featureRootsListComposite.setFeatureRootsList(null); |
| this.bindingsListComposite.setBindingsList(null); |
| |
| this.abstractTopologyBindingOverviewComposite.setAbstractTopologyBinding(null); |
| this.abtractTopologyBindingDetailsComposite.setAbstractTopologyBinding(null); |
| this.abstractFeatureSpecifierComposite.setAbstractFeatureSpecifier(null); |
| } |
| } |
| |
| /** |
| * Returns the list of Node available for binding. |
| * |
| * @return The collection of Node, can be empty, never null. |
| */ |
| public abstract Collection<Node> getAvailableNodes(); |
| |
| private DataBindingContext initDataBindingsCustom() { |
| DataBindingContext bindingContext = new DataBindingContext(); |
| |
| return bindingContext; |
| } |
| } |