/** * */ package org.feature.multi.perspective.model.editor.editors.listeners; import java.util.LinkedList; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.zest.core.viewers.GraphViewer; import org.eclipse.zest.core.widgets.Graph; import org.eclipse.zest.core.widgets.GraphNode; import org.feature.multi.perspective.model.viewmodel.Group; import org.feature.multi.perspective.model.editor.editors.ViewmodelMultiPageEditor; import org.feature.multi.perspective.model.editor.util.Util; import org.feature.multi.perspective.model.editor.zest.model.CoreGroupNode; import org.feature.multi.perspective.model.editor.zest.model.FeatureNode; import org.feature.multi.perspective.model.editor.zest.model.GroupNode; import org.feature.multi.perspective.model.editor.zest.model.Node; import org.feature.multi.perspective.model.editor.zest.model.ViewPointNode; /** * @author winkelti * */ public class ViewPointNodeMouseListener implements IDoubleClickListener { private ViewmodelMultiPageEditor multiPageEditor; private List<Node> nodesForHighlighting; public ViewPointNodeMouseListener(ViewmodelMultiPageEditor multiPageEditor) { this.multiPageEditor = multiPageEditor; } @Override public void doubleClick(DoubleClickEvent event) { ISelection selection = event.getSelection(); Viewer viewer = event.getViewer(); List selectedNodes = null; if (viewer instanceof GraphViewer) { GraphViewer graphViewer = (GraphViewer) viewer; Graph graph = graphViewer.getGraphControl(); selectedNodes = graph.getSelection(); } if (!selection.isEmpty()) { if (selection instanceof StructuredSelection) { StructuredSelection ss = (StructuredSelection) selection; if (ss.size() == 1) { Object firstElement = ss.getFirstElement(); if (firstElement instanceof Node) { Node node = (Node) firstElement; for (Object object : selectedNodes) { if (object instanceof GraphNode) { GraphNode selectedNode = (GraphNode) object; if (selectedNode.getBackgroundColor().equals(Util.attachedGraphNodeBackgroundColor) && selectedNode.getData().equals(node)) { multiPageEditor.clearHighlighting(); return; } } } } if (firstElement instanceof ViewPointNode) { ViewPointNode viewPointNode = (ViewPointNode) firstElement; List<Node> connectedTo = viewPointNode.getConnectedTo(); nodesForHighlighting = collectAllImportantNodes(connectedTo); nodesForHighlighting.add(viewPointNode); multiPageEditor.highlightNodes(nodesForHighlighting); }else if (firstElement instanceof GroupNode) { GroupNode groupNode = (GroupNode) firstElement; nodesForHighlighting = collectAllImportantNodes(fetchAllImportantNodes(groupNode)); nodesForHighlighting.add(groupNode); multiPageEditor.highlightNodes(nodesForHighlighting); }else if (firstElement instanceof CoreGroupNode) { CoreGroupNode groupNode = (CoreGroupNode) firstElement; List<Node> connectedTo2 = groupNode.getConnectedTo(); nodesForHighlighting = new LinkedList<Node>(); for (Node node2 : connectedTo2) { if (node2 instanceof FeatureNode) { FeatureNode featureNode = (FeatureNode) node2; nodesForHighlighting.add(featureNode); } } nodesForHighlighting.add(groupNode); multiPageEditor.highlightNodes(nodesForHighlighting); }else{ multiPageEditor.clearHighlighting(); } } } } } /** * * @param connectedTo * @return */ private List<Node> collectAllImportantNodes(List<Node> connectedTo) { List<Node> nodesForHighlighting = new LinkedList<Node>(); for (Node node : connectedTo) { if (node instanceof GroupNode) { GroupNode groupNode = (GroupNode) node; nodesForHighlighting.addAll(fetchAllImportantNodes(groupNode)); } if (node instanceof CoreGroupNode) { List<Node> connectedTo2 = node.getConnectedTo(); for (Node node2 : connectedTo2) { if (node2 instanceof FeatureNode) { FeatureNode featureNode = (FeatureNode) node2; nodesForHighlighting.add(featureNode); } } } nodesForHighlighting.add(node); } return nodesForHighlighting; } /** * * @param groupNode * @return */ private List<Node> fetchAllImportantNodes(GroupNode groupNode) { List<Node> nodesForHighlighting = new LinkedList<Node>(); List<Node> connectedTo2 = groupNode.getConnectedTo(); for (Node node2 : connectedTo2) { if (node2 instanceof FeatureNode) { FeatureNode featureNode = (FeatureNode) node2; nodesForHighlighting.add(featureNode); } if (node2 instanceof GroupNode) { GroupNode connectedGroupNode = (GroupNode) node2; if (isParent(groupNode,connectedGroupNode)) { nodesForHighlighting.add(connectedGroupNode); nodesForHighlighting.addAll(fetchAllImportantNodes(connectedGroupNode)); } } } return nodesForHighlighting; } /** * * @param groupNode * @param connectedGroupNode * @return */ private boolean isParent(GroupNode groupNode, GroupNode connectedGroupNode) { String name = connectedGroupNode.getName(); EObject eContainer = groupNode.getGroup().eContainer(); if (eContainer instanceof Group) { Group gn = (Group) eContainer; if (gn.getName().equals(name)) { return true; } } return false; } }