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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.diagram.participant;
\r
14 import java.awt.geom.Point2D;
\r
15 import java.util.List;
\r
16 import java.util.Set;
\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
32 * Adds support for drawing connections through {@link ConnectTool2} and
\r
33 * {@link RouteGraphConnectTool} to {@link PointerInteractor}.
\r
35 * @author Tuukka Lehtonen
\r
37 public class PointerInteractor2 extends PointerInteractor {
\r
39 public PointerInteractor2() {
\r
40 this(true, true, true, false, true, false, ElementClassProviders.staticProvider(null));
\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
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
52 protected ICanvasParticipant createConnectTool(TerminalInfo ti, int mouseId, Point2D startCanvasPos) {
\r
53 return new ConnectTool2(ti, mouseId, startCanvasPos);
\r
57 protected ICanvasParticipant createConnectToolWithTerminals(List<TerminalInfo> tis, int mouseId, Point2D startCanvasPos) {
\r
58 return new ConnectTool2(tis, mouseId, startCanvasPos);
\r
61 protected ICanvasParticipant initiateRouteGraphConnectTool(RouteGraphTarget target, int mouseId) {
\r
62 return new RouteGraphConnectTool(target, mouseId);
\r
66 protected ICanvasParticipant createTranslateTool(int mouseId, Point2D startCanvasPos, Point2D curCanvasPos, Set<IElement> elementsToDrag) {
\r
67 return new TranslateMode2(startCanvasPos, curCanvasPos, mouseId, elementsToDrag);
\r
70 protected boolean checkInitiateConnectTool(MouseEvent me, Point2D mouseCanvasPos) {
\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
77 ICanvasParticipant bsi = null;
\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
84 bsi = initiateRouteGraphConnectTool(cp, me.mouseId);
\r
86 ISnapAdvisor snapAdvisor = getHint(DiagramHints.SNAP_ADVISOR);
\r
87 if (snapAdvisor != null)
\r
88 snapAdvisor.snap(mouseCanvasPos);
\r
90 // Start connection out of thin air, without a terminal.
\r
91 bsi = createConnectTool(null, me.mouseId, mouseCanvasPos);
\r
94 // Find the terminals that are equally close
\r
95 tis = TerminalUtil.findNearestOverlappingTerminals(tis);
\r
96 int tcount = tis.size();
\r
99 bsi = createConnectTool(tis.get(0), me.mouseId, mouseCanvasPos);
\r
101 //System.out.println("many terminals (" + tcount + "):\n" + EString.implode(tis));
\r
102 bsi = createConnectToolWithTerminals(tis, me.mouseId, mouseCanvasPos);
\r
107 // Did we catch anything?
\r
109 startConnectTool(bsi);
\r