org.eclipse.papyrus.uml.diagram.dnd.strategy.instancespecification.ui.SlotSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.papyrus.uml.diagram.dnd.strategy.instancespecification.ui.SlotSelectionDialog.java

Source

/*****************************************************************************
 * 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;
    }

}