/*****************************************************************************
* Copyright (c) 2012 CEA LIST.
*
* 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:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.uml.diagram.dnd.strategy.instancespecification.ui;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.uml2.uml.Classifier;
import org.eclipse.uml2.uml.InstanceSpecification;
import org.eclipse.uml2.uml.Property;
import org.eclipse.uml2.uml.Slot;
/**
* A dialog which lets the user choose the properties he wishes to instantiate,
* from a list of classifiers.
*
* The dialog returns the list of selected properties.
*
* @author Camille Letavernier
*/
public class SlotSelectionDialog extends SelectionDialog {
private final InstanceSpecification specification;
private final List<Classifier> classifiers;
private final Map<Property, Boolean> properties;
public SlotSelectionDialog(Shell parentShell, InstanceSpecification specification, List<Classifier> classifiers) {
super(parentShell);
this.specification = specification;
this.classifiers = classifiers;
properties = new LinkedHashMap<Property, Boolean>();
}
@Override
public void create() {
setTitle("Select the slots to create");
super.create();
getShell().setImage(org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImage("icons/papyrus.png"));
Composite parent = getDialogArea();
Label label = new Label(parent, SWT.NONE);
label.setText("Select the slots you wish to create. Existing slots cannot be removed here");
TreeViewer viewer = new TreeViewer(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
viewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Tree tree = viewer.getTree();
TableLayout layout = new TableLayout();
TreeColumn propertyColumn = new TreeColumn(tree, SWT.CENTER);
propertyColumn.setText("Property");
layout.addColumnData(new ColumnWeightData(30, 150, true));
TreeColumn ownerColumn = new TreeColumn(tree, SWT.CENTER);
ownerColumn.setText("Qualified name");
layout.addColumnData(new ColumnWeightData(60, 300, true));
TreeColumn checkColumn = new TreeColumn(tree, SWT.CENTER);
checkColumn.setText("Create slot");
layout.addColumnData(new ColumnWeightData(10, 70, true));
tree.setLayout(layout);
tree.setHeaderVisible(true);
viewer.setContentProvider(new ClassifierPropertiesContentProvider());
viewer.setLabelProvider(new ClassifierPropertiesLabelProvider());
viewer.setInput(classifiers);
viewer.expandAll();
for(TreeItem classifierItem : tree.getItems()) {
for(TreeItem propertyItem : classifierItem.getItems()) {
final Property property = (Property)propertyItem.getData();
properties.put(property, select(property));
final Button checkbox = new Button(tree, SWT.CHECK);
checkbox.setSelection(true);
checkbox.setEnabled(select(property));
checkbox.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
properties.put(property, checkbox.getSelection());
}
public void widgetDefaultSelected(SelectionEvent e) {
//Nothing
}
});
TreeEditor editor = new TreeEditor(tree);
editor.horizontalAlignment = SWT.CENTER;
editor.grabHorizontal = true;
editor.setEditor(checkbox, propertyItem, 2);
}
}
parent.layout();
getShell().pack();
}
protected boolean select(Property property) {
//Checks whether a slot already represents the given property
for(Slot slot : specification.getSlots()) {
if(slot.getDefiningFeature() == property) {
return false;
}
}
return true;
}
@Override
protected void okPressed() {
List<Property> result = new LinkedList<Property>();
for(Map.Entry<Property, Boolean> entry : properties.entrySet()) {
if(entry.getValue()) {
result.add(entry.getKey());
}
}
setResult(result);
super.okPressed();
}
@Override
public Composite getDialogArea() {
return (Composite)super.getDialogArea();
}
@Override
public boolean isResizable() {
return true;
}
}