1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
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
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.diagram.participant;
14 import java.awt.geom.Point2D;
15 import java.util.List;
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;
32 * Adds support for drawing connections through {@link ConnectTool2} and
33 * {@link RouteGraphConnectTool} to {@link PointerInteractor}.
35 * @author Tuukka Lehtonen
37 public class PointerInteractor2 extends PointerInteractor {
39 public PointerInteractor2() {
40 this(true, true, true, false, true, false, ElementClassProviders.staticProvider(null));
43 public PointerInteractor2(boolean clickSelect, boolean boxSelect, boolean dragElement, boolean dndDragElement, boolean connect, IElementClassProvider newConnectionClassProvider) {
44 this(clickSelect, boxSelect, dragElement, dndDragElement, connect, false, newConnectionClassProvider);
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);
52 protected ICanvasParticipant createConnectTool(TerminalInfo ti, int mouseId, Point2D startCanvasPos) {
53 return new ConnectTool2(ti, mouseId, startCanvasPos);
57 protected ICanvasParticipant createConnectToolWithTerminals(List<TerminalInfo> tis, int mouseId, Point2D startCanvasPos) {
58 return new ConnectTool2(tis, mouseId, startCanvasPos);
61 protected ICanvasParticipant initiateRouteGraphConnectTool(RouteGraphTarget target, int mouseId) {
62 return new RouteGraphConnectTool(target, mouseId);
66 protected ICanvasParticipant createTranslateTool(int mouseId, Point2D startCanvasPos, Point2D curCanvasPos, Set<IElement> elementsToDrag) {
67 return new TranslateMode2(startCanvasPos, curCanvasPos, mouseId, elementsToDrag);
70 protected boolean checkInitiateConnectTool(MouseEvent me, Point2D mouseCanvasPos) {
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);
77 ICanvasParticipant bsi = null;
80 // Look for potential connection to branch.
81 RouteGraphTarget cp = RouteGraphConnectTool.pickRouteGraphConnection(
82 getContext(), diagram,
83 getCanvasPickShape(me.controlPosition), getPickDistance());
85 bsi = initiateRouteGraphConnectTool(cp, me.mouseId);
87 ISnapAdvisor snapAdvisor = getHint(DiagramHints.SNAP_ADVISOR);
88 if (snapAdvisor != null)
89 snapAdvisor.snap(mouseCanvasPos);
91 // Start connection out of thin air, without a terminal.
92 bsi = createConnectTool(null, me.mouseId, mouseCanvasPos);
95 // Find the terminals that are equally close
96 tis = TerminalUtil.findNearestOverlappingTerminals(tis);
97 int tcount = tis.size();
100 bsi = createConnectTool(tis.get(0), me.mouseId, mouseCanvasPos);
102 //System.out.println("many terminals (" + tcount + "):\n" + EString.implode(tis));
103 bsi = createConnectToolWithTerminals(tis, me.mouseId, mouseCanvasPos);
108 // Did we catch anything?
110 startConnectTool(bsi);