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