]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/participant/PointerInteractor2.java
Merge commit 'bd5bc6e45f700e755b61bd112631796631330ecb'
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / participant / PointerInteractor2.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.diagram.participant;\r
13 \r
14 import java.awt.geom.Point2D;\r
15 import java.util.List;\r
16 import java.util.Set;\r
17 \r
18 import org.simantics.g2d.canvas.Hints;\r
19 import org.simantics.g2d.canvas.ICanvasParticipant;\r
20 import org.simantics.g2d.canvas.IToolMode;\r
21 import org.simantics.g2d.diagram.DiagramHints;\r
22 import org.simantics.g2d.diagram.participant.pointertool.PointerInteractor;\r
23 import org.simantics.g2d.diagram.participant.pointertool.TerminalUtil;\r
24 import org.simantics.g2d.diagram.participant.pointertool.TerminalUtil.TerminalInfo;\r
25 import org.simantics.g2d.element.ElementClassProviders;\r
26 import org.simantics.g2d.element.IElement;\r
27 import org.simantics.g2d.element.IElementClassProvider;\r
28 import org.simantics.scenegraph.g2d.events.MouseEvent;\r
29 import org.simantics.scenegraph.g2d.snap.ISnapAdvisor;\r
30 \r
31 /**\r
32  * Adds support for drawing connections through {@link ConnectTool2} and\r
33  * {@link RouteGraphConnectTool} to {@link PointerInteractor}.\r
34  * \r
35  * @author Tuukka Lehtonen\r
36  */\r
37 public class PointerInteractor2 extends PointerInteractor {\r
38 \r
39     public PointerInteractor2() {\r
40         this(true, true, true, false, true, false, ElementClassProviders.staticProvider(null));\r
41     }\r
42 \r
43     public PointerInteractor2(boolean clickSelect, boolean boxSelect, boolean dragElement, boolean dndDragElement, boolean connect, IElementClassProvider newConnectionClassProvider) {\r
44         this(clickSelect, boxSelect, dragElement, dndDragElement, connect, false, newConnectionClassProvider);\r
45     }\r
46 \r
47     public PointerInteractor2(boolean clickSelect, boolean boxSelect, boolean dragElement, boolean dndDragElement, boolean connect, boolean doubleClickEdit, IElementClassProvider newConnectionClassProvider) {\r
48         super(clickSelect, boxSelect, dragElement, dndDragElement, connect, doubleClickEdit, newConnectionClassProvider, null); \r
49     }\r
50 \r
51     @Override\r
52     protected ICanvasParticipant createConnectTool(TerminalInfo ti, int mouseId, Point2D startCanvasPos) {\r
53         return new ConnectTool2(ti, mouseId, startCanvasPos);\r
54     }\r
55 \r
56     @Override\r
57     protected ICanvasParticipant createConnectToolWithTerminals(List<TerminalInfo> tis, int mouseId, Point2D startCanvasPos) {\r
58         return new ConnectTool2(tis, mouseId, startCanvasPos);\r
59     }\r
60 \r
61     protected ICanvasParticipant initiateRouteGraphConnectTool(RouteGraphTarget target, int mouseId) {\r
62         return new RouteGraphConnectTool(target, mouseId);\r
63     }\r
64 \r
65     @Override\r
66     protected ICanvasParticipant createTranslateTool(int mouseId, Point2D startCanvasPos, Point2D curCanvasPos, Set<IElement> elementsToDrag) {\r
67         return new TranslateMode2(startCanvasPos, curCanvasPos, mouseId, elementsToDrag);\r
68     }\r
69 \r
70     protected boolean checkInitiateConnectTool(MouseEvent me, Point2D mouseCanvasPos) {\r
71         // Pick Terminal\r
72         IToolMode mode = getToolMode();\r
73         if (mode == Hints.CONNECTTOOL || me.hasAnyModifier(MouseEvent.ALT_MASK | MouseEvent.ALT_GRAPH_MASK)) {\r
74             //IConnectionAdvisor advisor = diagram.getHint(DiagramHints.CONNECTION_ADVISOR);\r
75             List<TerminalInfo> tis = pickTerminals(me.controlPosition);\r
76 \r
77             ICanvasParticipant bsi = null;\r
78 \r
79             if (tis.isEmpty()) {\r
80                 // Look for potential connection to branch.\r
81                 RouteGraphTarget cp = RouteGraphConnectTool.pickRouteGraphConnection(diagram,\r
82                         getCanvasPickShape(me.controlPosition), getPickDistance());\r
83                 if (cp != null) {\r
84                     bsi = initiateRouteGraphConnectTool(cp, me.mouseId);\r
85                 } else {\r
86                     ISnapAdvisor snapAdvisor = getHint(DiagramHints.SNAP_ADVISOR);\r
87                     if (snapAdvisor != null)\r
88                         snapAdvisor.snap(mouseCanvasPos);\r
89 \r
90                     // Start connection out of thin air, without a terminal.\r
91                     bsi = createConnectTool(null, me.mouseId, mouseCanvasPos);\r
92                 }\r
93             } else {\r
94                 // Find the terminals that are equally close\r
95                 tis = TerminalUtil.findNearestOverlappingTerminals(tis);\r
96                 int tcount = tis.size();\r
97                 if (tcount > 0) {\r
98                     if (tcount == 1) {\r
99                         bsi = createConnectTool(tis.get(0), me.mouseId, mouseCanvasPos);\r
100                     } else {\r
101                         //System.out.println("many terminals (" + tcount + "):\n" + EString.implode(tis));\r
102                         bsi = createConnectToolWithTerminals(tis, me.mouseId, mouseCanvasPos);\r
103                     }\r
104                 }\r
105             }\r
106 \r
107             // Did we catch anything?\r
108             if (bsi != null) {\r
109                 startConnectTool(bsi);\r
110                 return true;\r
111             }\r
112         }\r
113 \r
114         return false;\r
115     }\r
116 \r
117 }\r