]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram.connection/src/org/simantics/diagram/connection/actions/ReconnectLineAction.java
Round corners between non-axis-aligned connection lines properly
[simantics/platform.git] / bundles / org.simantics.diagram.connection / src / org / simantics / diagram / connection / actions / ReconnectLineAction.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2011 Association for Decentralized Information Management in
3  * 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.connection.actions;
13
14 import gnu.trove.map.hash.THashMap;
15
16 import java.awt.Graphics2D;
17
18 import org.simantics.diagram.connection.RouteGraph;
19 import org.simantics.diagram.connection.RouteLine;
20 import org.simantics.diagram.connection.RouteLineHalf;
21 import org.simantics.diagram.connection.RouteTerminal;
22 import org.simantics.diagram.connection.rendering.IRouteGraphRenderer;
23
24 public class ReconnectLineAction implements IReconnectAction {
25
26     RouteGraph rg;
27     RouteGraph rgc;
28     RouteLine line;
29
30     public ReconnectLineAction(RouteGraph rg, RouteGraph rgc, RouteLine line) {
31         this.rg = rg;
32         this.rgc = rgc;
33         this.line = line;
34     }
35
36     @Override
37     public void render(Graphics2D g, IRouteGraphRenderer renderer, double mouseX, double mouseY) {
38         THashMap<Object, Object> map = new THashMap<Object, Object>();
39         RouteGraph rgc = this.rgc.copy(map);  
40         RouteLine sLine = (RouteLine)map.get(line);
41         if(!rgc.connectLine(sLine, mouseX, mouseY, TOLERANCE) || !rgc.isTree()) {
42             map.clear();
43             rgc = this.rgc.copy(map);
44             sLine = (RouteLine)map.get(line);
45             RouteTerminal t2 = rgc.addTerminal(mouseX, mouseY, 
46                     mouseX, mouseY,
47                     mouseX, mouseY, 15);
48             rgc.link(sLine, t2);
49         }
50         renderer.render(g, rgc);  
51     }
52
53     @Override
54     public void finish(double x, double y) {
55         if(rgc.connectLine(line, x, y, TOLERANCE) && rgc.isTree()) {
56             rgc.removeExtraConnections();
57             rg.replaceBy(rgc);
58         }
59     }
60
61     public static IAction create(RouteGraph rg, double x, double y) {
62         RouteGraph rgc = rg.copy();
63         RouteLineHalf lh = rgc.pickLineHalf(x, y, TOLERANCE);
64         if(lh == null)
65             return null;
66         RouteLine line = lh.getLine();
67         if(line.isTransient()) {
68             RouteTerminal terminal = line.getTerminal();
69             rgc.disconnect(terminal);
70             return new ReconnectTerminalAction(rg, rgc, terminal);
71         }
72         else {
73             rgc.makePersistent(line);
74             rgc.remove(lh.getLink());
75             return new ReconnectLineAction(rg, rgc, line);
76         }
77     }
78
79 }