/*******************************************************************************
* Copyright (c) 2011 University of Mannheim: Chair for Software Engineering
* 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:
* Ralph Gerbig - initial API and implementation and initial documentation
*******************************************************************************/
package de.uni_mannheim.informatik.swt.models.plm.diagram.custom.propertysheet;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.gef.Request;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Table;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import de.uni_mannheim.informatik.swt.models.plm.PLM.Element;
import de.uni_mannheim.informatik.swt.models.plm.PLM.LMLVisualizer;
import de.uni_mannheim.informatik.swt.models.plm.PLM.impl.PLMPackageImpl;
public class VisualizationPropertySectionAbstractPropertySection extends
AbstractPropertySection {
public VisualizationPropertySectionAbstractPropertySection() {
// TODO Auto-generated constructor stub
}
private IGraphicalEditPart selectedElement = null;
CCombo visualizerSelectionCombo = null;
List<LMLVisualizer> visualizers = null;
TableViewer viewer;
private ISelection selection;
private IWorkbenchPart part;
@Override
public void setInput(IWorkbenchPart part, ISelection selection) {
super.setInput(part, selection);
this.part = part;
this.selection = selection;
if (selection instanceof StructuredSelection
&& ((StructuredSelection) selection).getFirstElement() instanceof IGraphicalEditPart)
selectedElement = (IGraphicalEditPart)((StructuredSelection) selection).getFirstElement();
visualizerSelectionCombo.removeAll();
if (visualizerSelectionCombo == null || ! (selectedElement.resolveSemanticElement() instanceof Element))
return;
Element e = (Element)selectedElement.resolveSemanticElement();
for (LMLVisualizer v : e.getVisualizer())
visualizerSelectionCombo.add("Visualizer^" + v.getDurability());
visualizers = e.getVisualizer();
if (visualizerSelectionCombo.getItems().length > 0)
{
visualizerSelectionCombo.select(0);
viewer.setInput(visualizers.get(0).getAttributes());
viewer.refresh();
}
}
@Override
public void createControls(Composite parent,
TabbedPropertySheetPage aTabbedPropertySheetPage) {
super.createControls(parent, aTabbedPropertySheetPage);
Composite composite = getWidgetFactory().createFlatFormComposite(parent);
GridLayout gl = new GridLayout(5, false);
composite.setLayout(gl);
CLabel visualizerSelectionLabel = getWidgetFactory().createCLabel(composite, "Visualizer");
visualizerSelectionCombo = getWidgetFactory().createCCombo(composite);
Button addButton = getWidgetFactory().createButton(composite, "Add", SWT.NONE);
Button removeButton = getWidgetFactory().createButton(composite, "Remove", SWT.NONE);
Button editButton = getWidgetFactory().createButton(composite, "Edit", SWT.NONE);
viewer = new TableViewer(composite, SWT.FULL_SELECTION);
visualizerSelectionCombo.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
viewer.setInput(visualizers.get(visualizerSelectionCombo.getSelectionIndex()).getAttributes());
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
viewer.setInput(visualizers.get(visualizerSelectionCombo.getSelectionIndex()).getAttributes());
}
});
GridData visualizerComboData = new GridData(GridData.FILL, GridData.CENTER, true, false);
visualizerSelectionCombo.setLayoutData(visualizerComboData);
Table table = viewer.getTable();
GridData tableGridData = new GridData(GridData.FILL, GridData.FILL, true, true);
tableGridData.horizontalSpan = 5;
table.setLayoutData(tableGridData);
table.setHeaderVisible(true);
table.setLinesVisible(true);
//Add ContentProviders
viewer.setContentProvider(new VisualizerContentProvider());
TableViewerColumn keyColumn = new TableViewerColumn(viewer, SWT.NONE);
keyColumn.getColumn().setText("Name");
keyColumn.getColumn().setWidth(200);
keyColumn.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
String keyValuePair = (String)cell.getElement();
String key = keyValuePair.substring(0, keyValuePair.indexOf("=")).trim();
cell.setText(key);
}
});
TableViewerColumn valueColumn = new TableViewerColumn(viewer, SWT.NONE);
valueColumn.getColumn().setText("Value");
valueColumn.getColumn().setWidth(100);
valueColumn.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
String keyValuePair = (String)cell.getElement();
int equalIndex = keyValuePair.indexOf("=") + 1;
String value = keyValuePair.substring(equalIndex, keyValuePair.length()).trim();
cell.setText(value);
}
});
valueColumn.setEditingSupport(new EditingSupport(viewer) {
@Override
protected void setValue(Object element, Object value) {
LMLVisualizer visualizer = visualizers.get(visualizerSelectionCombo.getSelectionIndex());
String keyValuePair = (String)element;
String key = keyValuePair.substring(0, keyValuePair.indexOf("=")).trim();
CommandParameter parameters = null;
int oldIndex = -1;
for (String s : visualizer.getAttributes())
if (s.equals(element))
{
oldIndex = visualizer.getAttributes().indexOf(s);
break;
}
parameters = new CommandParameter(visualizer, PLMPackageImpl.eINSTANCE.getLMLVisualizer_Attributes(), key + "= " + value, oldIndex);
Command cmd = selectedElement.getEditingDomain().createCommand(SetCommand.class, parameters);
selectedElement.getEditingDomain().getCommandStack().execute(cmd);
selectedElement.performRequest(new Request(RequestConstants.REQ_REFRESH));
viewer.refresh();
setInput(part, selection);
}
@Override
protected Object getValue(Object element) {
String keyValuePair = (String)element;
int equalIndex = keyValuePair.indexOf("=") + 1;
String value = keyValuePair.substring(equalIndex, keyValuePair.length()).trim();
return value;
}
@Override
protected CellEditor getCellEditor(Object element) {
String keyValuePair = (String)element;
int equalIndex = keyValuePair.indexOf("=") + 1;
String value = keyValuePair.substring(equalIndex, keyValuePair.length()).trim();
if ("false".equals(value) || "true".equals(value))
{
ComboBoxViewerCellEditor cb = new ComboBoxViewerCellEditor(viewer.getTable());
cb.setContentProvider(ArrayContentProvider.getInstance());
cb.setInput(new String[]{"true", "false"});
return cb;
}
else if ("default".equals(value) || "tvs".equals(value)
|| "noshow".equals(value) || "max".equals(value))
{
ComboBoxViewerCellEditor cb = new ComboBoxViewerCellEditor(viewer.getTable());
cb.setContentProvider(ArrayContentProvider.getInstance());
cb.setInput(new String[]{"default", "tvs", "noshow", "max", "show"});
return cb;
}
return new TextCellEditor(viewer.getTable());
}
@Override
protected boolean canEdit(Object element) {
return true;
}
});
}
private class VisualizerContentProvider extends ArrayContentProvider{
@Override
public Object[] getElements(Object inputElement) {
//Durability needs to be added
LinkedList<Object> elementsPlusTraits = new LinkedList<Object>();
LMLVisualizer v = visualizers.get(visualizerSelectionCombo.getSelectionIndex());
elementsPlusTraits.add("durability= " + v.getDurability());
//Append the attributes list
elementsPlusTraits.addAll(Arrays.asList(super.getElements(inputElement)));
return elementsPlusTraits.toArray();
}
}
}