/******************************************************************************* * 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.ui.dialog; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.henshin.model.Graph; import org.eclipse.emf.henshin.model.Node; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; 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.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Shell; import de.tub.tfs.henshin.editor.util.EdgeReferences; /** * The Class CreateEdgeDialog. */ public class CreateEdgeDialog extends Dialog { /** The graph nodes. */ private java.util.List<Node> graphNodes; /** The source. */ private Node source; /** The target. */ private Node target; /** The edge type. */ private EReference edgeType; /** The title. */ private String title; /** The source list viewer. */ private ListViewer sourceListViewer; /** The target list viewer. */ private ListViewer targetListViewer; /** The type list viewer. */ private ListViewer typeListViewer; /** The source list. */ private List sourceList; /** The target list. */ private List targetList; /** The type list. */ private List typeList; /** The ok button. */ private Button okButton; /** * Gets the source. * * @return the source */ public Node getSource() { return source; } /** * Gets the target. * * @return the target */ public Node getTarget() { return target; } /** * Gets the edge type. * * @return the edgeType */ public EReference getEdgeType() { return edgeType; } /** * Instantiates a new creates the edge dialog. * * @param parentShell * the parent shell * @param graph * the graph * @param title * the title */ public CreateEdgeDialog(Shell parentShell, Graph graph, String title) { super(parentShell); this.title = title; if (graph != null) { graphNodes = graph.getNodes(); } else { throw new IllegalArgumentException("The given graph is null!"); } } /* * (non-Javadoc) * * @see * org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets * .Shell) */ @Override protected void configureShell(Shell shell) { super.configureShell(shell); if (title != null) { shell.setText(title); } shell.setSize(600, 400); shell.layout(); } /* * (non-Javadoc) * * @see * org.eclipse.jface.dialogs.Dialog#createButton(org.eclipse.swt.widgets * .Composite, int, java.lang.String, boolean) */ @Override protected Button createButton(Composite parent, int id, String label, boolean defaultButton) { Button button = super.createButton(parent, id, label, defaultButton); if (id == OK) { okButton = button; okButton.setEnabled(false); } return button; } /* * (non-Javadoc) * * @see * org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets * .Composite) */ @Override protected Control createDialogArea(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout(3, true)); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); final Label sourceLabel = new Label(composite, SWT.NONE); sourceLabel.setText("Source: "); final Label targetLabel = new Label(composite, SWT.NONE); targetLabel.setText("Target: "); final Label typeLabel = new Label(composite, SWT.NONE); typeLabel.setText("Type: "); sourceListViewer = new ListViewer(composite, SWT.READ_ONLY | SWT.BORDER | SWT.V_SCROLL); sourceList = sourceListViewer.getList(); sourceList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); sourceListViewer.setContentProvider(new ArrayContentProvider()); sourceListViewer.setLabelProvider(new NodeLabelProvider()); sourceListViewer.setSorter(new ViewerSorter()); sourceListViewer.add(graphNodes.toArray()); targetListViewer = new ListViewer(composite, SWT.READ_ONLY | SWT.BORDER | SWT.V_SCROLL); targetList = targetListViewer.getList(); targetList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); targetList.setEnabled(false); targetListViewer.setContentProvider(new ArrayContentProvider()); targetListViewer.setLabelProvider(new NodeLabelProvider()); targetListViewer.setSorter(new ViewerSorter()); typeListViewer = new ListViewer(composite, SWT.READ_ONLY | SWT.BORDER | SWT.V_SCROLL); typeList = typeListViewer.getList(); typeList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); typeList.setEnabled(false); typeListViewer.setContentProvider(new ArrayContentProvider()); typeListViewer.setSorter(new ViewerSorter()); typeListViewer.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { if (element instanceof EReference) { return ((EReference) element).getName(); } return null; } }); addListener(); return composite; } /** * Adds the listener. */ private void addListener() { sourceListViewer .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { Object selection = getListSelection(sourceList, sourceListViewer); if (selection instanceof Node) { source = (Node) selection; refreshTargetListContents(); refreshTypeListContents(); } } }); targetListViewer .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { Object selection = getListSelection(targetList, targetListViewer); if (selection instanceof Node) { target = (Node) selection; refreshTypeListContents(); } } }); typeListViewer .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { Object selection = getListSelection(typeList, typeListViewer); if (selection instanceof EReference) { edgeType = (EReference) selection; okButton.setEnabled(true); } } }); } /** * Refresh target list contents. */ private void refreshTargetListContents() { targetList.removeAll(); if (source != null) { for (Node node : graphNodes) { if (!EdgeReferences.getSourceToTargetFreeReferences(source, node).isEmpty()) { targetListViewer.add(node); } } } targetList.setEnabled(source != null); } /** * Refresh type list contents. */ private void refreshTypeListContents() { typeList.removeAll(); okButton.setEnabled(false); if (target != null) { java.util.List<EReference> eReferences = EdgeReferences .getSourceToTargetFreeReferences(source, target); for (EReference ref : eReferences) { typeListViewer.add(ref); } } typeList.setEnabled(target != null); } /** * Gets the list selection. * * @param list * the list * @param listViewer * the list viewer * @return the list selection */ private Object getListSelection(List list, ListViewer listViewer) { Object selection = listViewer.getSelection(); if (selection != null && selection instanceof StructuredSelection) { selection = ((StructuredSelection) selection).getFirstElement(); } return selection; } /** * The Class NodeLabelProvider. */ private class NodeLabelProvider extends LabelProvider { /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object) */ @Override public String getText(Object element) { if (element instanceof Node) { Node node = (Node) element; if (node.getName() != null) { return node.getName() + ":" + node.getType().getName(); } return ":" + node.getType().getName(); } else { return null; } } } }