1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2011 Association for Decentralized Information Management in
\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.connection.tests;
\r
14 import java.awt.Color;
\r
15 import java.awt.Graphics;
\r
16 import java.awt.Graphics2D;
\r
17 import java.awt.HeadlessException;
\r
18 import java.awt.RenderingHints;
\r
19 import java.awt.event.KeyAdapter;
\r
20 import java.awt.event.KeyEvent;
\r
21 import java.awt.event.MouseAdapter;
\r
22 import java.awt.event.MouseEvent;
\r
23 import java.awt.event.MouseMotionListener;
\r
25 import javax.swing.JApplet;
\r
27 import org.simantics.diagram.connection.RouteGraph;
\r
28 import org.simantics.diagram.connection.RouteLine;
\r
29 import org.simantics.diagram.connection.RouteLink;
\r
30 import org.simantics.diagram.connection.RouteTerminal;
\r
31 import org.simantics.diagram.connection.actions.IAction;
\r
32 import org.simantics.diagram.connection.actions.IReconnectAction;
\r
33 import org.simantics.diagram.connection.actions.MoveAction;
\r
34 import org.simantics.diagram.connection.actions.ReconnectLineAction;
\r
35 import org.simantics.diagram.connection.rendering.ExampleConnectionStyle;
\r
36 import org.simantics.diagram.connection.rendering.IRouteGraphRenderer;
\r
37 import org.simantics.diagram.connection.rendering.StyledRouteGraphRenderer;
\r
38 import org.simantics.diagram.connection.rendering.arrows.ArrowExampleLineEndStyle;
\r
39 import org.simantics.diagram.connection.rendering.arrows.ILineEndStyle;
\r
40 import org.simantics.diagram.connection.rendering.arrows.PlainExampleLineEndStyle;
\r
41 import org.simantics.diagram.connection.tests.actions.HighlightReconnectPointsAction;
\r
42 import org.simantics.diagram.connection.tests.actions.NewTerminalAction;
\r
44 public class TestApplet extends JApplet {
\r
46 private static final long serialVersionUID = 6135978753249808640L;
\r
48 public static final double TOLERANCE = IAction.TOLERANCE;
\r
51 IRouteGraphRenderer renderer =
\r
52 new StyledRouteGraphRenderer(new ExampleConnectionStyle());
\r
60 IAction currentAction;
\r
62 public TestApplet() {
\r
63 this(new RouteGraph());
\r
65 RouteLine v = rg.addLine(false, 0);
\r
67 rg.link(addTerminal(rg, -100, -100, 1, PlainExampleLineEndStyle.INSTANCE), v);
\r
68 rg.link(addTerminal(rg, -100, 100, 1, PlainExampleLineEndStyle.INSTANCE), v);
\r
69 rg.link(addTerminal(rg, 100, -80, 1, ArrowExampleLineEndStyle.INSTANCE), v);
\r
70 rg.link(addTerminal(rg, 100, 100, 4, ArrowExampleLineEndStyle.INSTANCE), v);
\r
73 public TestApplet(RouteGraph rg_) throws HeadlessException {
\r
76 addMouseListener(new MouseAdapter() {
\r
79 public void mousePressed(MouseEvent e) {
\r
80 if(e.getButton() == MouseEvent.BUTTON1) {
\r
81 mouseX = e.getX() - posX;
\r
82 mouseY = e.getY() - posY;
\r
85 currentAction = new NewTerminalAction(rg, mouseX, mouseY);
\r
88 else if(currentAction instanceof NewTerminalAction) {
\r
89 ((NewTerminalAction)currentAction).finish(mouseX, mouseY);
\r
90 currentAction = null;
\r
93 else if(currentAction instanceof HighlightReconnectPointsAction) {
\r
94 currentAction = ReconnectLineAction.create(rg, mouseX, mouseY);
\r
97 else if(currentAction instanceof IReconnectAction) {
\r
98 ((IReconnectAction)currentAction).finish(mouseX, mouseY);
\r
99 currentAction = null;
\r
103 currentAction = MoveAction.create(rg, mouseX, mouseY);
\r
109 public void mouseReleased(MouseEvent e) {
\r
110 if(currentAction instanceof MoveAction) {
\r
111 ((MoveAction)currentAction).finish(mouseX, mouseY);
\r
112 currentAction = null;
\r
118 addMouseMotionListener(new MouseMotionListener() {
\r
120 public void mouseMoved(MouseEvent e) {
\r
121 mouseX = e.getX() - posX;
\r
122 mouseY = e.getY() - posY;
\r
124 if(currentAction != null)
\r
129 public void mouseDragged(MouseEvent e) {
\r
130 mouseX = e.getX() - posX;
\r
131 mouseY = e.getY() - posY;
\r
133 if(currentAction != null)
\r
138 addKeyListener(new KeyAdapter() {
\r
140 public void keyPressed(KeyEvent e) {
\r
141 Object target = rg.pick(mouseX, mouseY, TOLERANCE);
\r
143 if(e.getKeyCode() == KeyEvent.VK_COMMA) {
\r
144 if(target instanceof RouteTerminal) {
\r
145 RouteTerminal terminal = (RouteTerminal)target;
\r
146 rg.rotate(terminal, -1);
\r
150 else if(e.getKeyCode() == KeyEvent.VK_PERIOD) {
\r
151 if(target instanceof RouteTerminal) {
\r
152 RouteTerminal terminal = (RouteTerminal)target;
\r
153 rg.rotate(terminal, 1);
\r
157 else if(e.getKeyCode() == KeyEvent.VK_D) {
\r
158 if(target instanceof RouteTerminal) {
\r
159 RouteTerminal terminal = (RouteTerminal)target;
\r
160 rg.toggleDirectLines(terminal);
\r
164 else if(e.getKeyCode() == KeyEvent.VK_S) {
\r
165 if(target instanceof RouteLine) {
\r
166 RouteLine rLine = (RouteLine)target;
\r
167 rg.split(rLine, rLine.isHorizontal() ? mouseX : mouseY);
\r
171 else if(e.getKeyCode() == KeyEvent.VK_DELETE) {
\r
172 if(target instanceof RouteLine) {
\r
173 RouteLine line = (RouteLine)target;
\r
176 else if(target instanceof RouteLink) {
\r
177 rg.deleteCorner((RouteLink)target);
\r
179 else if(target instanceof RouteTerminal) {
\r
180 rg.remove((RouteTerminal)target);
\r
184 else if(e.getKeyCode() == KeyEvent.VK_ESCAPE) {
\r
185 if(currentAction != null)
\r
186 currentAction = null;
\r
189 else if(e.getKeyCode() == KeyEvent.VK_P) {
\r
192 else if(e.getKeyCode() == KeyEvent.VK_CONTROL) {
\r
193 if(currentAction == null)
\r
194 currentAction = new HighlightReconnectPointsAction(rg);
\r
200 public void keyReleased(KeyEvent e) {
\r
201 if(e.getKeyCode() == KeyEvent.VK_CONTROL) {
\r
202 if(currentAction instanceof HighlightReconnectPointsAction)
\r
203 currentAction = null;
\r
212 private static RouteTerminal addTerminal(RouteGraph rg, double x, double y, int allowedDirections, ILineEndStyle style) {
\r
213 return rg.addTerminal(x, y, x-20, y-20, x+20, y+20, allowedDirections, style);
\r
217 public void paint(Graphics g_) {
\r
218 Graphics2D g = (Graphics2D)g_ ;
\r
219 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
\r
220 g.setColor(Color.BLACK);
\r
221 g.setBackground(Color.WHITE);
\r
222 g.clearRect(0, 0, getWidth(), getHeight());
\r
223 posX = getWidth()*0.5;
\r
224 posY = getHeight()*0.5;
\r
225 g.translate(posX, posY);
\r
227 if(currentAction != null)
\r
228 currentAction.render(g, renderer, mouseX, mouseY);
\r
230 renderer.render(g, rg);
\r