blob: a44612b5dd97e3953bab7515d38a79f605cfe3ca [file] [log] [blame]
/*******************************************************************************
* 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,
* Regent L'Archeveque,
* Olivier L. Larouche - initial API and implementation
* SPDX-License-Identifier: EPL-1.0
*
*******************************************************************************/
package org.eclipse.apogy.common.emf.ui.preferences;
import java.util.Map.Entry;
import org.eclipse.apogy.common.emf.ui.ApogyCommonEMFUIFacade;
import org.eclipse.apogy.common.emf.ui.ApogyCommonEMFUIFactory;
import org.eclipse.apogy.common.emf.ui.EOperationEParametersUnitsProvider;
import org.eclipse.apogy.common.emf.ui.EOperationEParametersUnitsProviderParameters;
import org.eclipse.apogy.common.emf.ui.ETypedElementToUnitsMap;
import org.eclipse.apogy.common.emf.ui.UnitsProvider;
import org.eclipse.apogy.common.emf.ui.impl.ETypedElementToUnitsKeyValueImpl;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.conversion.Converter;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EParameter;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.ETypedElement;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.IViewerObservableValue;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Tree;
import org.eclipse.swt.widgets.TreeColumn;
public class UnitsProvidersUnitsMapComposite extends Composite {
private DataBindingContext dataBindingContext;
private final AdapterFactory adapterFactory = new ComposedAdapterFactory(
ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
private final TreeViewer treeViewer;
private final Button deleteButton;
private ETypedElementToUnitsMap map;
public UnitsProvidersUnitsMapComposite(Composite parent, int style) {
super(parent, style);
setLayout(new GridLayout(2, false));
addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (UnitsProvidersUnitsMapComposite.this.dataBindingContext != null) {
UnitsProvidersUnitsMapComposite.this.dataBindingContext.dispose();
}
}
});
/** Tree viewer with: | the unit | the converted current value | */
this.treeViewer = new TreeViewer(this, SWT.BORDER);
Tree tree = this.treeViewer.getTree();
GridData gd_treeViewer = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 2);
gd_treeViewer.heightHint = 1;
tree.setLayoutData(gd_treeViewer);
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
TreeViewerColumn treeViewerTypedElementColumn = new TreeViewerColumn(this.treeViewer, SWT.NONE);
TreeColumn treeclmnTypedElement = treeViewerTypedElementColumn.getColumn();
treeclmnTypedElement.setWidth(150);
treeclmnTypedElement.setText("Typed element");
TreeViewerColumn treeViewerProviderColumn = new TreeViewerColumn(this.treeViewer, SWT.NONE);
TreeColumn treeclmnProvider = treeViewerProviderColumn.getColumn();
treeclmnProvider.setWidth(150);
treeclmnProvider.setText("Unit");
this.treeViewer.setLabelProvider(new UnitsProvidersLabelProvider(this.adapterFactory));
this.treeViewer.setContentProvider(new UnitsProvidersContentProvider(this.adapterFactory));
/** Delete entry button */
this.deleteButton = new Button(this, SWT.None);
this.deleteButton.setText("Delete");
this.deleteButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
this.deleteButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Object obj = UnitsProvidersUnitsMapComposite.this.treeViewer.getStructuredSelection().getFirstElement();
if (obj instanceof ETypedElementToUnitsKeyValueImpl) {
ETypedElementToUnitsKeyValueImpl entry = (ETypedElementToUnitsKeyValueImpl) UnitsProvidersUnitsMapComposite.this.treeViewer
.getStructuredSelection().getFirstElement();
UnitsProvidersUnitsMapComposite.this.map.getEntries().removeKey(entry.getKey());
} else if (obj instanceof EParameter) {
EParameter param = (EParameter) obj;
EOperationEParametersUnitsProvider provider = (EOperationEParametersUnitsProvider) UnitsProvidersUnitsMapComposite.this.map
.getEntries().get(param.getEOperation());
provider.getMap().getEntries().removeKey(param);
}
UnitsProvidersUnitsMapComposite.this.treeViewer.refresh();
}
});
initDataBindings();
}
/**
* Sets the map that is displayed in the composite
*
* @param map
*/
public void setMap(ETypedElementToUnitsMap map) {
this.map = map;
this.treeViewer.setInput(map);
}
/**
* Gets the modified map.
*/
public ETypedElementToUnitsMap getMap() {
return this.map;
}
private void initDataBindings() {
if (this.dataBindingContext != null) {
this.dataBindingContext.dispose();
}
this.dataBindingContext = new DataBindingContext();
/** TreeViewer selection observable */
IViewerObservableValue treeViewerSelectionObservableValue = ViewerProperties.singleSelection()
.observe(this.treeViewer);
/** Button enable observable */
ISWTObservableValue deleteButtonEnableObservableValue = WidgetProperties.enabled().observe(this.deleteButton);
this.dataBindingContext.bindValue(deleteButtonEnableObservableValue, treeViewerSelectionObservableValue,
new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER),
new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE)
.setConverter(new Converter(Object.class, boolean.class) {
@Override
public Object convert(Object fromObject) {
return fromObject != null;
}
}));
}
/**
* Label provider for the tree viewer.
*/
// TODO add other UnitsProvidersTypes if new are created.
private class UnitsProvidersLabelProvider extends AdapterFactoryLabelProvider {
public UnitsProvidersLabelProvider(AdapterFactory adapterFactory) {
super(adapterFactory);
}
private static final int TYPED_ELEMENT_COLUMN_ID = 0;
private static final int UNITS_COLUMN_ID = 1;
@Override
public String getColumnText(Object object, int columnIndex) {
if (object instanceof Entry) {
@SuppressWarnings("unchecked")
Entry<ETypedElement, UnitsProvider> entry = (Entry<ETypedElement, UnitsProvider>) object;
switch (columnIndex) {
case TYPED_ELEMENT_COLUMN_ID:
/** Typed element name */
// Return the fully qualified name of the type element.
return getString(entry.getKey());
case UNITS_COLUMN_ID:
/** UnitsProvider itemProvider .toString() */
return entry.getValue() instanceof EOperationEParametersUnitsProvider ? ""
: super.getColumnText(entry.getValue(), columnIndex);
default:
}
}
if (object instanceof EParameter) {
EParameter param = (EParameter) object;
switch (columnIndex) {
case TYPED_ELEMENT_COLUMN_ID:
return param.getName();
case UNITS_COLUMN_ID:
EOperationEParametersUnitsProviderParameters params = ApogyCommonEMFUIFactory.eINSTANCE
.createEOperationEParametersUnitsProviderParameters();
params.setParam(param);
return ApogyCommonEMFUIFacade.INSTANCE.getDisplayUnits(param.getEOperation(), params).toString();
default:
}
}
return super.getColumnText(object, columnIndex);
}
@Override
public Image getColumnImage(Object object, int columnIndex) {
return null;
}
private String getString(final ETypedElement element) {
EObject currentETypedElement = element;
String string = null;
while (currentETypedElement != null) {
if (currentETypedElement instanceof EStructuralFeature) {
EStructuralFeature eStructuralFeature = (EStructuralFeature) currentETypedElement;
if (string != null)
string = eStructuralFeature.getName() + "." + string;
else
string = eStructuralFeature.getName();
currentETypedElement = eStructuralFeature.eContainer();
} else if (currentETypedElement instanceof EAttribute) {
EAttribute eAttribute = (EAttribute) currentETypedElement;
if (string != null)
string = eAttribute.getName() + "." + string;
else
string = eAttribute.getName();
currentETypedElement = eAttribute.eContainer();
} else if (currentETypedElement instanceof EClass) {
EClass eClass = (EClass) currentETypedElement;
if (string != null)
string = eClass.getName() + "." + string;
else
string = eClass.getName();
currentETypedElement = eClass.eContainer();
} else {
currentETypedElement = null;
}
}
return string;
}
}
/**
* Content provider for the native units list tree.
*/
// TODO add other UnitsProvider types if new are created.
private class UnitsProvidersContentProvider extends AdapterFactoryContentProvider {
public UnitsProvidersContentProvider(AdapterFactory adapterFactory) {
super(adapterFactory);
}
@Override
public Object[] getChildren(Object object) {
if (object instanceof ETypedElementToUnitsKeyValueImpl) {
ETypedElementToUnitsKeyValueImpl entry = (ETypedElementToUnitsKeyValueImpl) object;
return ((EOperationEParametersUnitsProvider) entry.getValue()).getMap().getEntries().keySet().toArray();
}
return null;
}
@Override
public boolean hasChildren(Object object) {
if (object instanceof ETypedElementToUnitsKeyValueImpl) {
ETypedElementToUnitsKeyValueImpl entry = (ETypedElementToUnitsKeyValueImpl) object;
return entry.getValue() instanceof EOperationEParametersUnitsProvider;
}
return false;
}
}
}