de.tub.tfs.henshin.editor.util.DialogUtil.java Source code

Java tutorial

Introduction

Here is the source code for de.tub.tfs.henshin.editor.util.DialogUtil.java

Source

/*******************************************************************************
 * Copyright (c) 2010-2015 Henshin developers. 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:
 *     TU Berlin, University of Luxembourg, SES S.A.
 *******************************************************************************/
package de.tub.tfs.henshin.editor.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.henshin.model.ConditionalUnit;
import org.eclipse.emf.henshin.model.Graph;
import org.eclipse.emf.henshin.model.IndependentUnit;
import org.eclipse.emf.henshin.model.Module;
import org.eclipse.emf.henshin.model.Node;
import org.eclipse.emf.henshin.model.PriorityUnit;
import org.eclipse.emf.henshin.model.Rule;
import org.eclipse.emf.henshin.model.SequentialUnit;
import org.eclipse.emf.henshin.model.Unit;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Shell;

import de.tub.tfs.henshin.editor.interfaces.Messages;
import de.tub.tfs.henshin.editor.ui.dialog.AttributeTableDialog;
import de.tub.tfs.henshin.editor.ui.dialog.ExtendedElementListSelectionDialog;

/**
 * The Class DialogUtil.
 */
public class DialogUtil {

    /**
     * Run node creation dialog.
     * 
     * @param shell
     *            the shell
     * @param graph
     *            the graph
     * @return the e class
     */
    public static EClass runNodeCreationDialog(Shell shell, Graph graph) {
        List<EClass> nodeTypes = new ArrayList<EClass>();
        Module transSys = HenshinUtil.INSTANCE.getTransformationSystem(graph);

        if (canCreateNode(shell, graph)) {
            if (transSys != null) {
                EList<EPackage> imports = transSys.getImports();

                for (EPackage ePackage : imports) {
                    nodeTypes.addAll(NodeTypes.getNodeTypesOfEPackage(ePackage, false));
                }
            }

            // =============================================================
            // TODO: ?? why ??: This causes creation dialog not to be shown up, if graph is empty.
            // nodeTypes = NodeTypes.getNodeTypes(graph, graph.eContainer() != transSys);
            // ===========================================================

            switch (nodeTypes.size()) {
            case 0:
                break;
            case 1:
                return nodeTypes.get(0);
            default:
                return new ExtendedElementListSelectionDialog<EClass>(shell, new LabelProvider() {
                    @Override
                    public String getText(Object element) {
                        return ((EClass) element).getName();
                    }

                    @Override
                    public Image getImage(Object element) {
                        return IconUtil.getIcon("node18.png");
                    }
                }, nodeTypes.toArray(new EClass[nodeTypes.size()]), "Node Type Selection",
                        "Select a EClass for the new node type:").runSingle();
            }
        }

        return null;
    }

    /**
     * Run attribute creation dialog.
     * 
     * @param shell
     *            the shell
     * @param node
     *            the node
     * @return the map
     */
    public static Map<EAttribute, String> runAttributeCreationDialog(Shell shell, Node node) {
        AttributeTableDialog dialog = new AttributeTableDialog(shell, SWT.NULL, node,
                AttributeTypes.getFreeAttributeTypes(node));
        dialog.open();
        return dialog.getAssigment();
    }

    /**
     * Run edge type selection dialog.
     * 
     * @param shell
     *            the shell
     * @param eReferences
     *            the e references
     * @return the e reference
     */
    public static EReference runEdgeTypeSelectionDialog(Shell shell, List<EReference> eReferences) {
        switch (eReferences.size()) {
        case 0:
            return null;
        case 1:
            return eReferences.get(0);
        default:
            return new ExtendedElementListSelectionDialog<EReference>(shell, new LabelProvider() {
                @Override
                public String getText(Object element) {
                    return ((EReference) element).getName();
                }

                @Override
                public Image getImage(Object element) {
                    return IconUtil.getIcon("edge18.png");
                }
            }, eReferences.toArray(new EReference[eReferences.size()]), "Edge Type Selection",
                    "Select a EReference for the new edge type:").runSingle();
        }
    }

    /**
     * Run graph choice dialog.
     * 
     * @param shell
     *            the shell
     * @param graphs
     *            the graphen
     * @return the graph
     */
    public static Graph runGraphChoiceDialog(Shell shell, List<Graph> graphs) {
        return new ExtendedElementListSelectionDialog<Graph>(shell, new LabelProvider() {
            @Override
            public String getText(Object element) {
                return ((Graph) element).getName();
            }

            @Override
            public Image getImage(Object element) {
                return IconUtil.getIcon("graph18.png");
            }
        }, graphs.toArray(new Graph[graphs.size()]), "Graph Selection", "Select a Graph for transformation:")
                .runSingle();
    }

    /**
     * Run rule choice dialog.
     * 
     * @param shell
     *            the shell
     * @param rules
     *            the rules
     * @return the rule
     */
    public static Rule runRuleChoiceDialog(Shell shell, List<Rule> rules) {
        return new ExtendedElementListSelectionDialog<Rule>(shell, new LabelProvider() {
            @Override
            public String getText(Object element) {
                return ((Rule) element).getName();
            }

            @Override
            public Image getImage(Object element) {
                return ResourceUtil.ICONS.RULE.img(16);
            }
        }, rules.toArray(new Rule[rules.size()]), Messages.RULE_SELECTION, Messages.RULE_SELECTION_MSG).runSingle();
    }

    /**
     * Run transformation unit choice dialog.
     * 
     * @param shell
     *            the shell
     * @param transUnits
     *            the trans units
     * @return the transformation unit
     */
    public static Unit runTransformationUnitChoiceDialog(Shell shell, List<Unit> transUnits) {
        return new ExtendedElementListSelectionDialog<Unit>(shell, new LabelProvider() {
            @Override
            public String getText(Object element) {
                return ((Unit) element).getName();
            }

            @Override
            public Image getImage(Object element) {
                if (element instanceof Rule) {
                    return IconUtil.getIcon("ruler16.png");
                }

                if (element instanceof ConditionalUnit) {
                    return IconUtil.getIcon("conditionalUnit18.png");
                }
                if (element instanceof SequentialUnit) {
                    return IconUtil.getIcon("seqUnit18.png");
                }
                if (element instanceof IndependentUnit) {
                    return IconUtil.getIcon("independent16.png");
                }
                if (element instanceof PriorityUnit) {
                    return IconUtil.getIcon("priority16.png");
                }

                return null;
            }
        }, transUnits.toArray(new Unit[transUnits.size()]), "Transformation Unit Selection",
                "Select a Transformation Unit:").runSingle();
    }

    /**
     * Can create node.
     * 
     * @param shell
     *            the shell
     * @param graph
     *            the graph
     * @return true, if successful
     */
    private static boolean canCreateNode(Shell shell, Graph graph) {
        Module transSys = (Module) graph.eResource().getContents().get(0);

        // At least one ePackage must be imported
        if (transSys.getImports().isEmpty()) {
            MessageDialog.openError(shell, "Node Creation Error", "There are no model packages imported yet!");
            return false;
        }

        return true;
    }

    /**
     * Run transformation unit choice for add unit dialog.
     * 
     * @param shell
     *            the shell
     * @param tUnit
     *            the t unit
     * @return the transformation unit
     */
    public static Unit runTransformationUnitChoiceForAddUnitDialog(Shell shell, Unit tUnit) {
        Module transSys = HenshinUtil.INSTANCE.getTransformationSystem(tUnit);

        if (transSys != null) {
            List<Unit> list = new Vector<Unit>();

            list.addAll(transSys.getUnits());

            if (!(tUnit instanceof ConditionalUnit || tUnit instanceof SequentialUnit)) {
                list.removeAll(tUnit.getSubUnits(true));
            }

            list.remove(tUnit);

            // forbids cyclic includes
            for (Iterator<Unit> it = list.iterator(); it.hasNext();) {
                if (it.next().getSubUnits(true).contains(tUnit)) {
                    it.remove();
                }
            }

            return runTransformationUnitChoiceDialog(shell, list);
        }
        return null;
    }
}