Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/widgets/NattablePropertyEditor.java262
1 files changed, 198 insertions, 64 deletions
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/widgets/NattablePropertyEditor.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/widgets/NattablePropertyEditor.java
index 5ffe05ddff5..c60e7942634 100644
--- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/widgets/NattablePropertyEditor.java
+++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/widgets/NattablePropertyEditor.java
@@ -13,6 +13,8 @@
package org.eclipse.papyrus.uml.properties.widgets;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.util.URI;
@@ -22,7 +24,9 @@ import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.gef.editparts.AbstractEditPart;
import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.papyrus.infra.emf.nattable.selection.EObjectSelectionExtractor;
import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
@@ -47,7 +51,10 @@ import org.eclipse.papyrus.uml.properties.Activator;
import org.eclipse.papyrus.uml.properties.modelelement.UMLNotationModelElement;
import org.eclipse.papyrus.views.properties.contexts.Property;
import org.eclipse.papyrus.views.properties.modelelement.CompositeModelElement;
+import org.eclipse.papyrus.views.properties.modelelement.DataSource;
+import org.eclipse.papyrus.views.properties.modelelement.DataSourceChangedEvent;
import org.eclipse.papyrus.views.properties.modelelement.EMFModelElement;
+import org.eclipse.papyrus.views.properties.modelelement.IDataSourceListener;
import org.eclipse.papyrus.views.properties.modelelement.ModelElement;
import org.eclipse.papyrus.views.properties.widgets.AbstractPropertyEditor;
import org.eclipse.swt.SWT;
@@ -68,7 +75,7 @@ public class NattablePropertyEditor extends AbstractPropertyEditor {
/**
* The composite.
*/
- private Composite self = null;;
+ private Group self = null;;
/**
* The table configuration URI.
@@ -76,6 +83,26 @@ public class NattablePropertyEditor extends AbstractPropertyEditor {
private URI tableConfigURI = null;
/**
+ * The nattable widget.
+ */
+ private NatTable natTableWidget = null;
+
+ /**
+ * The nattable manager.
+ */
+ private INattableModelManager nattableManager = null;
+
+ /**
+ * The dispose listener.
+ */
+ private DisposeListener nattableDisposeListener = null;
+
+ /**
+ * The data source listener.
+ */
+ private IDataSourceListener dataSourceListener;
+
+ /**
* Constructor.
*
* @param parent
@@ -93,7 +120,7 @@ public class NattablePropertyEditor extends AbstractPropertyEditor {
data.minimumHeight = 330;
self.setLayoutData(data);
}
-
+
/**
* Set the table URI.
*
@@ -135,78 +162,80 @@ public class NattablePropertyEditor extends AbstractPropertyEditor {
@Override
protected void doBinding() {
super.doBinding();
-
- // Configure the table
- ModelElement modelElement = input.getModelElement(propertyPath);
-
- Table table = null;
+
+ final ModelElement modelElement = input.getModelElement(propertyPath);
+
+ // The data neede to create the table
+ final List<Object> rows = new ArrayList<Object>();
+ EObject sourceElement = null;
+ EStructuralFeature feature = null;
+
+ // Manage the data needed for the table creation
if (modelElement instanceof CompositeModelElement) {
if (!((CompositeModelElement) modelElement).getSubElements().isEmpty()) {
if (((CompositeModelElement) modelElement).getSubElements().get(0) instanceof UMLNotationModelElement) {
- EModelElement eModelElement = ((UMLNotationModelElement) ((CompositeModelElement) modelElement).getSubElements().get(0)).getEModelElement();
- // Create a list of views to determinate the axis to display (cannot be created without the table editing domain)
- final List<Object> views = new ArrayList<Object>();
- for (ModelElement a : ((CompositeModelElement) modelElement).getSubElements()) {
- if (a instanceof UMLNotationModelElement) {
- views.add(((UMLNotationModelElement) a).getEModelElement());
+ final EModelElement eModelElement = ((UMLNotationModelElement) ((CompositeModelElement) modelElement).getSubElements().get(0)).getEModelElement();
+ // Fill the list of views to determinate the axis to display (cannot be created without the table editing domain)
+ for (ModelElement subModelElement : ((CompositeModelElement) modelElement).getSubElements()) {
+ if (subModelElement instanceof UMLNotationModelElement) {
+ rows.add(((UMLNotationModelElement) subModelElement).getEModelElement());
}
}
- table = createTable(eModelElement, null, views);
- if (table == null) {
- displayError("Cannot initialize the table"); //$NON-NLS-1$
- return;
- }
+ sourceElement = eModelElement;
} else if (((CompositeModelElement) modelElement).getSubElements().get(0) instanceof EMFModelElement) {
- EMFModelElement emfModelElement = (EMFModelElement) ((CompositeModelElement) modelElement).getSubElements().get(0);
- EObject sourceElement = emfModelElement.getSource();
- EStructuralFeature feature = emfModelElement.getFeature(getLocalPropertyPath());
-
- table = createTable(sourceElement, feature, null);
- if (table == null) {
- displayError("Cannot initialize the table"); //$NON-NLS-1$
- return;
- }
+ final EMFModelElement emfModelElement = (EMFModelElement) ((CompositeModelElement) modelElement).getSubElements().get(0);
+ sourceElement = emfModelElement.getSource();
+ feature = emfModelElement.getFeature(getLocalPropertyPath());
}
}
} else if (modelElement instanceof UMLNotationModelElement) {
- EModelElement eModelElement = ((UMLNotationModelElement) modelElement).getEModelElement();
- // Create a list of views to determinate the axis to display (cannot be created without the table editing domain)
- final List<Object> views = new ArrayList<Object>();
- views.add(eModelElement);
- table = createTable(eModelElement, null, views);
- if (table == null) {
- displayError("Cannot initialize the table"); //$NON-NLS-1$
- return;
- }
+ final EModelElement eModelElement = ((UMLNotationModelElement) modelElement).getEModelElement();
+ // Fill the list of views to determinate the axis to display (cannot be created without the table editing domain)
+ rows.add(eModelElement);
+ sourceElement = eModelElement;
} else if (modelElement instanceof EMFModelElement) {
- EMFModelElement emfModelElement = (EMFModelElement) modelElement;
- EObject sourceElement = emfModelElement.getSource();
- EStructuralFeature feature = emfModelElement.getFeature(getLocalPropertyPath());
-
- table = createTable(sourceElement, feature, null);
- if (table == null) {
- displayError("Cannot initialize the table"); //$NON-NLS-1$
- return;
- }
+ final EMFModelElement emfModelElement = (EMFModelElement) modelElement;
+ sourceElement = emfModelElement.getSource();
+ feature = emfModelElement.getFeature(getLocalPropertyPath());
+
+ createTableWidget(sourceElement, feature, null);
} else {
displayError("Invalid table context"); //$NON-NLS-1$
return;
}
+
+ createTableWidget(sourceElement, feature, rows);
+
+ }
+
+ /**
+ * This allow to create the table widget.
+ *
+ * @param sourceElement The source Element.
+ * @param feature The feature.
+ * @param rows The rows of the table.
+ */
+ protected void createTableWidget(final EObject sourceElement, final EStructuralFeature feature, final Collection<?> rows){
+ // Create the table
+ final Table table = createTable(sourceElement, feature, rows);
+ if (table == null) {
+ displayError("Cannot initialize the table"); //$NON-NLS-1$
+ return;
+ }
+
// Create the widget
- final INattableModelManager nattableManager = NattableModelManagerFactory.INSTANCE.createNatTableModelManager(table, new EObjectSelectionExtractor());
- NatTable widget = nattableManager.createNattable(self, SWT.NONE, null);
+ nattableManager = NattableModelManagerFactory.INSTANCE.createNatTableModelManager(table, new EObjectSelectionExtractor());
+ natTableWidget = nattableManager.createNattable(self, SWT.NONE, null);
if (nattableManager instanceof TreeNattableModelManager) {
((TreeNattableModelManager) nattableManager).doCollapseExpandAction(CollapseAndExpandActionsEnum.EXPAND_ALL, null);
}
- self.addDisposeListener(new DisposeListener() {
-
- public void widgetDisposed(DisposeEvent e) {
- nattableManager.dispose();
- }
- });
-
- widget.setBackground(self.getBackground());
+
+ self.addDisposeListener(getDisposeListener());
+ natTableWidget.setBackground(self.getBackground());
+
+ natTableWidget.layout();
+ self.layout();
}
/**
@@ -238,7 +267,7 @@ public class NattablePropertyEditor extends AbstractPropertyEditor {
* The error mesage to display.
*/
protected void displayError(final String message) {
- Label label = new Label(self, SWT.NONE);
+ final Label label = new Label(self, SWT.NONE);
label.setText(message);
label.setImage(org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImage("icons/error.gif")); //$NON-NLS-1$
}
@@ -250,16 +279,17 @@ public class NattablePropertyEditor extends AbstractPropertyEditor {
* The context element.
* @param synchronizedFeature
* The synchronized feature.
+ * @param rows The rows of the table.
* @return The created nattable.
*/
- protected Table createTable(final EObject sourceElement, final EStructuralFeature synchronizedFeature, final List<Object> views) {
+ protected Table createTable(final EObject sourceElement, final EStructuralFeature synchronizedFeature, final Collection<?> rows) {
final TableConfiguration tableConfiguration = getTableConfiguration();
if (tableConfiguration == null) {
return null;
}
- Property property = getModelProperty();
+ final Property property = getModelProperty();
final Table table = NattableFactory.eINSTANCE.createTable();
table.setTableConfiguration(tableConfiguration);
@@ -298,7 +328,7 @@ public class NattablePropertyEditor extends AbstractPropertyEditor {
table.setCurrentColumnAxisProvider(columnProvider);
table.setCurrentRowAxisProvider(rowProvider);
-
+
table.setContext(sourceElement);
for (final Style style : tableConfiguration.getStyles()) {
@@ -306,15 +336,15 @@ public class NattablePropertyEditor extends AbstractPropertyEditor {
}
// Manage the construction of axis here because the table editing domain is null
- if (null != views && !views.isEmpty()) {
+ if (null != rows && !rows.isEmpty()) {
final AbstractAxisProvider axisProvider = table.getCurrentRowAxisProvider();
TableHeaderAxisConfiguration conf = (TableHeaderAxisConfiguration) HeaderAxisConfigurationManagementUtils.getRowAbstractHeaderAxisInTableConfiguration(table);
AxisManagerRepresentation rep = conf.getAxisManagers().get(0);
- for (Object view : views) {
- addTreeItemAxis(axisProvider, rep, view);
+ for (Object context : rows) {
+ addTreeItemAxis(axisProvider, rep, context);
}
}
-
+
return table;
}
@@ -354,7 +384,7 @@ public class NattablePropertyEditor extends AbstractPropertyEditor {
protected TableConfiguration getTableConfiguration() {
ResourceSet resourceSet = new ResourceSetImpl();
try {
- TableConfiguration tableConfiguration = (TableConfiguration) EMFHelper.loadEMFModel(resourceSet,
+ final TableConfiguration tableConfiguration = (TableConfiguration) EMFHelper.loadEMFModel(resourceSet,
tableConfigURI);
return tableConfiguration;
} catch (Exception ex) {
@@ -363,5 +393,109 @@ public class NattablePropertyEditor extends AbstractPropertyEditor {
return null;
}
+
+ /**
+ * This allow to create the dispose listener for the nattable table manager.
+ *
+ * @return The dispose nattable manager listener.
+ */
+ protected DisposeListener getDisposeListener(){
+ if(null == nattableDisposeListener){
+ nattableDisposeListener = new DisposeListener() {
+
+ public void widgetDisposed(DisposeEvent e) {
+ nattableManager.dispose();
+ natTableWidget.dispose();
+ }
+ };
+ }
+ return nattableDisposeListener;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.papyrus.views.properties.widgets.AbstractPropertyEditor#unhookDataSourceListener(org.eclipse.papyrus.views.properties.modelelement.DataSource)
+ */
+ @Override
+ protected void unhookDataSourceListener(DataSource oldInput) {
+ oldInput.removeDataSourceListener(getDataSourceListener());
+ }
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.papyrus.views.properties.widgets.AbstractPropertyEditor#hookDataSourceListener(org.eclipse.papyrus.views.properties.modelelement.DataSource)
+ */
+ @Override
+ protected void hookDataSourceListener(DataSource newInput) {
+ newInput.addDataSourceListener(getDataSourceListener());
+ }
+
+ /**
+ * This allow to create the data source listener.
+ *
+ * @return The created data source listeer.
+ */
+ private IDataSourceListener getDataSourceListener() {
+ if (dataSourceListener == null) {
+ dataSourceListener = new IDataSourceListener() {
+
+ public void dataSourceChanged(final DataSourceChangedEvent event) {
+ if(null != nattableManager){
+ nattableManager.dispose();
+ nattableManager = null;
+ }
+ // Dispose the previous nattablewidget if necessary
+ if(null != natTableWidget){
+ natTableWidget.dispose();
+ natTableWidget = null;
+ self.removeDisposeListener(getDisposeListener());
+ }
+ // Get the datasource
+ final DataSource dataSource = event.getDataSource();
+ final StructuredSelection selection = (StructuredSelection) dataSource.getSelection();
+
+ // Manage the context selection
+ final List<Object> contexts = new ArrayList<Object>(selection.size());
+ final Iterator<?> selectionIterator = selection.iterator();
+ while(selectionIterator.hasNext()){
+ Object selectedObject = selectionIterator.next();
+ if(selectedObject instanceof AbstractEditPart){
+ contexts.add(((AbstractEditPart) selectedObject).getModel());
+ }else{
+ contexts.add(selectedObject);
+ }
+ }
+
+ // Get the model element
+ final ModelElement modelElement = dataSource.getModelElement(propertyPath);
+ EObject sourceElement = null;
+ EStructuralFeature feature = null;
+ if (modelElement instanceof CompositeModelElement) {
+ if (!((CompositeModelElement) modelElement).getSubElements().isEmpty()) {
+ if (((CompositeModelElement) modelElement).getSubElements().get(0) instanceof UMLNotationModelElement) {
+ sourceElement = ((UMLNotationModelElement) ((CompositeModelElement) modelElement).getSubElements().get(0)).getEModelElement();
+ } else if (((CompositeModelElement) modelElement).getSubElements().get(0) instanceof EMFModelElement) {
+ final EMFModelElement emfModelElement = (EMFModelElement) ((CompositeModelElement) modelElement).getSubElements().get(0);
+ sourceElement = emfModelElement.getSource();
+ feature = emfModelElement.getFeature(getLocalPropertyPath());
+ }
+ }
+ } else if (modelElement instanceof UMLNotationModelElement) {
+ sourceElement = ((UMLNotationModelElement) modelElement).getEModelElement();
+ } else if (modelElement instanceof EMFModelElement) {
+ final EMFModelElement emfModelElement = (EMFModelElement) modelElement;
+ sourceElement = emfModelElement.getSource();
+ feature = emfModelElement.getFeature(getLocalPropertyPath());
+ }
+
+ // Recreate the table widget
+ createTableWidget(sourceElement, feature, contexts);
+ }
+ };
+ }
+
+ return dataSourceListener;
+ }
}

Back to the top