/*******************************************************************************
* 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.tggeditor.util.dialogs;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.henshin.model.Graph;
import org.eclipse.emf.henshin.model.Module;
import org.eclipse.emf.henshin.model.Node;
import org.eclipse.emf.henshin.model.Rule;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import de.tub.tfs.henshin.tgg.TGG;
import de.tub.tfs.henshin.tgg.TripleComponent;
import de.tub.tfs.henshin.tgg.TripleGraph;
import de.tub.tfs.henshin.tgg.interpreter.impl.NodeTypes;
import de.tub.tfs.henshin.tgg.interpreter.util.ExceptionUtil;
import de.tub.tfs.henshin.tggeditor.commands.create.CreateNodeCommand;
import de.tub.tfs.henshin.tggeditor.dialogs.AttributeDialog;
import de.tub.tfs.henshin.tggeditor.dialogs.TextDialog;
import de.tub.tfs.henshin.tggeditor.util.AttributeTypes;
import de.tub.tfs.henshin.tggeditor.util.dialogs.SingleElementListSelectionDialog.ListEntry;
public class DialogUtil {
/**
* Run node creation dialog.
*
* @param shell
* the shell
* @param tripleGraph
* the graph
* @return the e class
*/
public static EClass runNodeCreationDialog(Shell shell, CreateNodeCommand c) {
TGG layoutModel = c.getLayoutModel();
Graph graph = c.getGraph();
List<EClass> nodeTypes = new ArrayList<EClass>();
Module transSys = (Module) graph
.eResource().getContents().get(0);
if (canCreateNode(shell, graph, layoutModel, c.getNodeTripleComponent())) {
List<EPackage> epackages = getPackages(layoutModel, c.getNodeTripleComponent());
nodeTypes = NodeTypes.getNodeTypesOfEPackages(epackages,
graph.eContainer() != transSys);
EPackage ecorePackage = EcorePackage.eINSTANCE;
List<EClass> nodeTypes2 = new ArrayList<EClass>();
nodeTypes2 = NodeTypes.getNodeTypesOfEPackage(ecorePackage,
graph.eContainer() != transSys);
nodeTypes.addAll(nodeTypes2);
switch (nodeTypes.size()) {
case 0:
return null;
case 1:
return nodeTypes.get(0);
default:
return new SingleElementListSelectionDialog<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:").run();
}
}
return null;
}
/**
* Run node creation dialog.
*
* @param shell
* the shell
* @param tripleGraph
* the graph
* @return the e class
*/
public static EClass runClassSelectionDialog(Shell shell, List<EClassifier> c,EClassifier source,ListEntry<EClass>... entries) {
List<EClass> nodeTypes = new ArrayList<EClass>();
for (EClassifier eClassifier : c) {
if (eClassifier instanceof EClass){
nodeTypes.add((EClass) eClassifier);
}
}
return new SingleElementListSelectionDialog<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()]),
source.getName(),
("Select a EClass for the mapping to "+source.getName()+":"),entries).run();
}
/**
* Run attribute creation dialog.
*
* @param shell
* the shell
* @param node
* the node
* @return the map
*/
public static SimpleEntry<EAttribute, String> runAttributeCreationDialog(
Shell shell, Node node) {
AttributeDialog dialog = new AttributeDialog(shell, SWT.NULL,
AttributeTypes.getFreeAttributeTypes(node),null);
dialog.open();
return dialog.getResult();
}
/**
* 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 SingleElementListSelectionDialog<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:").run();
}
}
/**
* selects the packages depending on the triple component
*
*/
public static List<EPackage> getPackages(TGG layoutModel, TripleComponent type) {
if (layoutModel == null) {ExceptionUtil.error("Layout model is missing"); return null;}
return NodeTypes.getEPackagesOfComponent(layoutModel.getImportedPkgs(),type);
}
/**
* Can create node.
*
* @param shell
* the shell
* @param graph
* the graph
* @param layoutModel
* the layoutModel
* @param x
* the position
*
* @return true, if successful
*/
private static boolean canCreateNode(Shell shell, Graph graph, TGG layoutModel,
TripleComponent nodeTripleComponent) {
Module module = (Module) graph
.eResource().getContents().get(0);
// At least one ePackage must be imported
if (module.getImports().isEmpty()) {
MessageDialog.openError(shell, "Node Creation Error",
"There are no model packages imported yet!");
return false;
}
else if (getPackages(layoutModel,nodeTripleComponent).isEmpty()) {
MessageDialog.openError(shell, "Node Creation Error",
"There are no " + nodeTripleComponent + " model packages imported yet!");
return false;
}
return true;
}
/**
* Run graph choice dialog.
*
* @param shell
* the shell
* @param graphs
* the graphen
* @return the graph
*/
public static Graph runGraphChoiceDialog(Shell shell, List<Graph> graphs) {
switch (graphs.size()) {
case 0:
return null;
case 1:
return graphs.get(0);
default:
return new SingleElementListSelectionDialog<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:")
.run();
}
}
/**
* Run rule choice dialog.
*
* @param shell
* the shell
* @param rules
* the rules
* @return the rule
*/
public static Rule runRuleChoiceDialog(Shell shell, List<Rule> rules) {
switch (rules.size()) {
case 0:
return null;
case 1:
return rules.get(0);
default:
return new SingleElementListSelectionDialog<Rule>(shell,
new LabelProvider() {
@Override
public String getText(Object element) {
return ((Rule) element).getName();
}
// @Override
// public Image getImage(Object element) {
// return IconUtil.getDescriptor("ruler16.png")
// .createImage();
// }
}, rules.toArray(new Rule[rules.size()]), "Rule Selection",
"Select a Rule for transformation:").run();
}
}
public static void showWarningDialog(String text, String scrollableText){
showTextDialog("Warning", text, scrollableText);
}
public static void showTextDialog(String title, String text, String scrollableText){
Shell shell = new Shell();
TextDialog dialog = new TextDialog(shell, title, text, scrollableText);
dialog.open();
shell.dispose();
}
}