blob: 505d913ed8f5f239ff42f6805007618a6a929f4a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2009 Markus Herrmannsdoerfer.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Markus Herrmannsdoerfer - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.edapt.history.instantiation.ui;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.ui.celleditor.ExtendedComboBoxCellEditor;
import org.eclipse.emf.common.ui.celleditor.ExtendedDialogCellEditor;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;
import org.eclipse.emf.edapt.common.ui.AutoColumnSizeTableViewer;
import org.eclipse.emf.edapt.common.ui.MultiValueSelectionDialog;
import org.eclipse.emf.edapt.common.ui.SingleValueSelectionDialog;
import org.eclipse.emf.edapt.declaration.Parameter;
import org.eclipse.emf.edapt.spi.history.OperationInstance;
import org.eclipse.emf.edapt.spi.history.ParameterInstance;
import org.eclipse.emf.edapt.spi.history.provider.HistoryEditPlugin;
import org.eclipse.emf.edapt.spi.history.provider.HistoryItemProviderAdapterFactory;
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.celleditor.FeatureEditorDialog;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emf.edit.ui.provider.PropertyDescriptor;
import org.eclipse.jface.dialogs.PopupDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.HelpEvent;
import org.eclipse.swt.events.HelpListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
/**
* Table viewer to display and edit parameter instances of an operation (An
* operation instance is exected as input)
*
* @author herrmama
* @author $Author$
* @version $Rev$
* @levd.rating RED Rev:
*/
public class ParameterViewer extends AutoColumnSizeTableViewer {
/**
* Label of name column
*/
private static final String NAME_COLUMN_PROPERTY = "Name"; //$NON-NLS-1$
/**
* Label of value column
*/
private static final String VALUE_COLUMN_PROPERTY = "Value"; //$NON-NLS-1$
/**
* Operation browser
*/
private final OperationSash operationSash;
/**
* Parameter icon
*/
private Image parameterImage;
/**
* Label provider for cell
*/
private ILabelProvider cellLabelProvider;
/**
* Label provider used in viewer label provider
*/
private AdapterFactoryLabelProvider dialogLabelProvider;
/**
* Default constructor
*
* @param parent
* Parent composite
* @param operationSash
*/
public ParameterViewer(Composite parent, OperationSash operationSash) {
super(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER
| SWT.FULL_SELECTION);
this.operationSash = operationSash;
init();
}
/**
* Initialize table viewer
*
*/
private void init() {
final ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory();
adapterFactory
.addAdapterFactory(new ResourceItemProviderAdapterFactory());
adapterFactory.addAdapterFactory(new EcoreItemProviderAdapterFactory());
adapterFactory
.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
adapterFactory
.addAdapterFactory(new HistoryItemProviderAdapterFactory());
dialogLabelProvider = new AdapterFactoryLabelProvider(adapterFactory);
cellLabelProvider = new LabelProvider() {
@Override
public Image getImage(Object element) {
if (element instanceof Collection) {
final Collection collection = (Collection) element;
if (!collection.isEmpty()) {
return dialogLabelProvider.getImage(collection
.iterator().next());
}
} else {
if (element != null) {
return dialogLabelProvider.getImage(element);
}
}
return null;
}
@Override
public String getText(Object element) {
if (element instanceof Collection) {
String label = ""; //$NON-NLS-1$
final Collection c = (Collection) element;
for (final Iterator i = c.iterator(); i.hasNext();) {
label += dialogLabelProvider.getText(i.next());
if (i.hasNext()) {
label += ", "; //$NON-NLS-1$
}
}
return label;
}
return dialogLabelProvider.getText(element);
}
};
final URL url = (URL) HistoryEditPlugin.INSTANCE
.getImage("full/obj16/ParameterInstance"); //$NON-NLS-1$
final ImageDescriptor imageDescriptor = ImageDescriptor.createFromURL(url);
parameterImage = imageDescriptor.createImage();
// columns
final Table parameterTable = getTable();
parameterTable.setHeaderVisible(true);
final TableColumn parameterNameColumn = new TableColumn(parameterTable,
SWT.None);
parameterNameColumn.setWidth(100);
parameterNameColumn.setText(NAME_COLUMN_PROPERTY);
parameterNameColumn.setResizable(false);
final TableColumn parameterValueColumn = new TableColumn(parameterTable,
SWT.None);
parameterValueColumn.setWidth(100);
parameterValueColumn.setText(VALUE_COLUMN_PROPERTY);
parameterValueColumn.setResizable(false);
// content provider
setContentProvider(new IStructuredContentProvider() {
@Override
public Object[] getElements(Object inputElement) {
final OperationInstance operationInstance = (OperationInstance) inputElement;
return operationInstance.getParameters().toArray();
}
@Override
public void dispose() {
// not required
}
@Override
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
// not required
}
});
// label provider
setLabelProvider(new ITableLabelProvider() {
@Override
public Image getColumnImage(Object element, int columnIndex) {
final ParameterInstance parameterInstance = (ParameterInstance) element;
switch (columnIndex) {
case 0:
return parameterImage;
case 1:
return cellLabelProvider.getImage(parameterInstance
.getValue());
default:
return null;
}
}
@Override
public String getColumnText(Object element, int columnIndex) {
final ParameterInstance parameterInstance = (ParameterInstance) element;
switch (columnIndex) {
case 0:
return parameterInstance.getName();
case 1: {
final Object value = parameterInstance.getValue();
return cellLabelProvider.getText(value);
}
default:
return ""; //$NON-NLS-1$
}
}
@Override
public void addListener(ILabelProviderListener listener) {
// not required
}
@Override
public void dispose() {
// not required
}
@Override
public boolean isLabelProperty(Object element, String property) {
return false;
}
@Override
public void removeListener(ILabelProviderListener listener) {
// not required
}
});
// cell editors
setColumnProperties(new String[] { NAME_COLUMN_PROPERTY,
VALUE_COLUMN_PROPERTY });
final CellEditor[] cellEditors = new CellEditor[2];
cellEditors[1] = new TextCellEditor(getTable());
setCellEditors(cellEditors);
setCellModifier(new ICellModifier() {
@Override
public boolean canModify(Object element, String property) {
if (NAME_COLUMN_PROPERTY.equals(property)) {
return false;
}
final ParameterInstance parameterInstance = (ParameterInstance) element;
final Parameter parameter = parameterInstance.getParameter();
if (parameter.isMain()) {
return false;
}
cellEditors[1] = getCellEditor(parameterInstance);
return true;
}
@Override
public Object getValue(Object element, String property) {
final ParameterInstance parameterInstance = (ParameterInstance) element;
return parameterInstance.getValue();
}
@Override
public void modify(Object element, String property,
final Object value) {
element = ((TableItem) element).getData();
final ParameterInstance parameterInstance = (ParameterInstance) element;
final Parameter parameter = parameterInstance.getParameter();
if (parameter.isMany()) {
if (parameter.getClassifier() instanceof EClass) {
if (!(value instanceof Object[])) {
return;
}
final Object[] values = (Object[]) value;
parameterInstance.setValue(Arrays.asList(values));
} else {
parameterInstance.setValue(value);
}
} else {
if (parameter.getClassifier() instanceof EClass) {
if (!(value instanceof Object[])) {
return;
}
final Object[] values = (Object[]) value;
if (values.length == 0) {
parameterInstance.setValue(null);
} else {
parameterInstance.setValue(values[0]);
}
} else {
parameterInstance.setValue(value);
}
}
refresh(true);
operationSash
.updateConstraints((OperationInstance) parameterInstance
.eContainer());
}
});
// show parameter description upon double click
parameterTable.addHelpListener(new HelpListener() {
@Override
public void helpRequested(HelpEvent e) {
if (parameterTable.getSelectionCount() > 0) {
final TableItem tableItem = parameterTable.getSelection()[0];
showDescription(tableItem);
}
}
});
addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
if (parameterTable.getSelectionCount() > 0) {
final TableItem tableItem = parameterTable.getSelection()[0];
showDescription(tableItem);
}
}
});
}
/**
* Show the description of a parameter which is associated to a table item
*
* @param tableItem
* Table item
*/
private void showDescription(TableItem tableItem) {
final ParameterInstance parameterInstance = (ParameterInstance) tableItem
.getData();
final Parameter parameter = parameterInstance.getParameter();
final PopupDialog dialog = new TableItemPopupDialog(tableItem,
parameter.getName(), parameter.getDescription());
dialog.open();
}
/**
* Get cell editor for a parameter instance based on the type of parameter
*
* @param parameterInstance
* Parameter instance
* @return Cell editor
*/
protected CellEditor getCellEditor(final ParameterInstance parameterInstance) {
final Parameter parameter = parameterInstance.getParameter();
if (parameter.isMany()) {
if (parameter.getClassifier() instanceof EClass) {
return new ExtendedDialogCellEditor(getTable(),
cellLabelProvider) {
@Override
protected Object openDialogBox(Control cellEditorWindow) {
final ParameterValueValidator selection = new ParameterValueValidator(
parameterInstance, operationSash.getHelper()
.getExtent());
final List values = (List) parameterInstance.getValue();
final MultiValueSelectionDialog dialog = new MultiValueSelectionDialog(
cellEditorWindow.getShell(), parameterImage,
getEditorTitle(parameter), values,
getRootPackages(), dialogLabelProvider,
selection);
dialog.open();
return dialog.getResult();
}
};
} else if (parameter.getClassifier() instanceof EDataType) {
return new ExtendedDialogCellEditor(getTable(),
cellLabelProvider) {
@Override
protected Object openDialogBox(Control cellEditorWindow) {
final EDataType type = (EDataType) parameter.getClassifier();
final List values = (List) parameterInstance.getValue();
@SuppressWarnings("deprecation")
final FeatureEditorDialog dialog = new FeatureEditorDialog(
cellEditorWindow.getShell(),
dialogLabelProvider, parameterInstance, type,
values, getEditorTitle(parameterInstance
.getParameter()),
null);
dialog.open();
return dialog.getResult();
}
};
}
} else {
if (parameter.getClassifier() instanceof EClass) {
return new ExtendedDialogCellEditor(getTable(),
cellLabelProvider) {
@Override
protected Object openDialogBox(Control cellEditorWindow) {
final ParameterValueValidator selection = new ParameterValueValidator(
parameterInstance, operationSash.getHelper()
.getExtent());
final SingleValueSelectionDialog dialog = new SingleValueSelectionDialog(
cellEditorWindow.getShell(), parameterImage,
getEditorTitle(parameter), parameterInstance
.getValue(),
getRootPackages(),
dialogLabelProvider, selection);
dialog.open();
return dialog.getResult();
}
};
} else if (parameter.getClassifier() instanceof EDataType) {
final EDataType dataType = (EDataType) parameter.getClassifier();
if (dataType.getInstanceClass() == Boolean.class
|| dataType.getInstanceClass() == Boolean.TYPE) {
final List<Object> values = Arrays.asList(new Object[] { Boolean.FALSE,
Boolean.TRUE });
return new ExtendedComboBoxCellEditor(getTable(),
values, dialogLabelProvider, false);
}
return new PropertyDescriptor.EDataTypeCellEditor(
(EDataType) parameter.getClassifier(), getTable());
}
}
return null;
}
/**
* Helper method to access root packages
*/
private Collection<EPackage> getRootPackages() {
final Collection<EPackage> rootPackages = new ArrayList<EPackage>();
rootPackages.addAll(operationSash.getHelper().getExtent()
.getRootPackages());
rootPackages.add(EcorePackage.eINSTANCE);
return rootPackages;
}
/**
* Get table of cell editor dialog
*
* @param parameter
* Parameter
* @return Title
*/
public static String getEditorTitle(Parameter parameter) {
String result = "Parameter "; //$NON-NLS-1$
result += parameter.getName();
result += " : "; //$NON-NLS-1$
if (parameter.isMany()) {
result += "List<" + parameter.getClassifierName() + ">"; //$NON-NLS-1$ //$NON-NLS-2$
} else {
result += parameter.getClassifierName();
}
return result;
}
}