]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/participant/PointerPainter.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / participant / PointerPainter.java
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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g2d.participant;\r
13 \r
14 import java.awt.BasicStroke;\r
15 import java.awt.Color;\r
16 import java.awt.Paint;\r
17 import java.awt.Shape;\r
18 import java.awt.Stroke;\r
19 import java.awt.geom.AffineTransform;\r
20 import java.awt.geom.Path2D;\r
21 import java.util.Map;\r
22 \r
23 import org.simantics.g2d.canvas.SGDesignation;\r
24 import org.simantics.g2d.canvas.impl.AbstractCanvasParticipant;\r
25 import org.simantics.g2d.canvas.impl.DependencyReflection.Dependency;\r
26 import org.simantics.g2d.canvas.impl.SGNodeReflection.SGCleanup;\r
27 import org.simantics.g2d.canvas.impl.SGNodeReflection.SGInit;\r
28 import org.simantics.g2d.participant.MouseUtil.MouseInfo;\r
29 import org.simantics.scenegraph.g2d.G2DParentNode;\r
30 import org.simantics.scenegraph.g2d.events.MouseEvent;\r
31 import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler;\r
32 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent;\r
33 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent;\r
34 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;\r
35 import org.simantics.scenegraph.g2d.nodes.InstancingShapeNode;\r
36 import org.simantics.utils.datastructures.hints.IHintContext.Key;\r
37 import org.simantics.utils.datastructures.hints.IHintContext.KeyOf;\r
38 \r
39 /**\r
40  * Paints mouse cursors in a multi-mouse setup.\r
41  * \r
42  * @author Toni Kalajainen\r
43  * @author Tuukka Lehtonen\r
44  */\r
45 public class PointerPainter extends AbstractCanvasParticipant {\r
46 \r
47     /**\r
48      * Key for the hint that determines whether cursors are painter or not.\r
49      */\r
50     public static final Key     KEY_PAINT_POINTER     = new KeyOf(Boolean.class);\r
51 \r
52     public static final int     CURSOR_PAINT_Z_ORDER = 5000;\r
53 \r
54     private final static Stroke CURSOR_STROKE         = new BasicStroke(1.0f);\r
55 \r
56     @Dependency MouseUtil       monitor;\r
57 \r
58     InstancingShapeNode         node;\r
59 \r
60     Shape                       pointer;\r
61 \r
62     public PointerPainter() {\r
63         Path2D p = new Path2D.Double();\r
64         p.moveTo(-10, -10);\r
65         p.lineTo(10, 10);\r
66         p.moveTo(10, -10);\r
67         p.lineTo(-10, 10);\r
68 \r
69         this.pointer = p;\r
70     }\r
71 \r
72     @SGInit(designation = SGDesignation.CONTROL)\r
73     public void init(G2DParentNode parent) {\r
74         node = parent.addNode("pointers", InstancingShapeNode.class);\r
75         node.setZIndex(CURSOR_PAINT_Z_ORDER);\r
76         node.setShape(pointer);\r
77         node.setStroke(CURSOR_STROKE);\r
78         node.setFill(false);\r
79         node.setScaleStroke(false);\r
80         node.setScaleShape(false);\r
81     }\r
82 \r
83     @SGCleanup\r
84     public void cleanup() {\r
85         node.remove();\r
86         node = null;\r
87     }\r
88 \r
89     public boolean isCursorEnabled() {\r
90         Boolean pp = getHint(KEY_PAINT_POINTER);\r
91         return Boolean.TRUE.equals(pp);\r
92     }\r
93 \r
94     @EventHandler(priority = Integer.MAX_VALUE)\r
95     public boolean handleMouseEvent(MouseEvent e) {\r
96         if (!isCursorEnabled())\r
97             return false;\r
98 \r
99         assertDependencies();\r
100 \r
101         if (e instanceof MouseMovedEvent || e instanceof MouseButtonPressedEvent\r
102                 || e instanceof MouseButtonReleasedEvent) {\r
103             updateNode();\r
104             setDirty();\r
105         }\r
106         return false;\r
107     }\r
108 \r
109     private void updateNode() {\r
110         Map<Integer, MouseInfo> miceInfo = monitor.getMiceInfo();\r
111 \r
112         AffineTransform[] transforms = new AffineTransform[miceInfo.size()];\r
113         Paint[] paints = new Paint[miceInfo.size()];\r
114 \r
115         int i = 0;\r
116         for (MouseInfo mi : miceInfo.values()) {\r
117             int color = 0;\r
118             if ((mi.buttons & 1) > 0) color |= 0xff;\r
119             if ((mi.buttons & 2) > 0) color |= 0xff00;\r
120             if ((mi.buttons & 4) > 0) color |= 0xff0000;\r
121 \r
122             transforms[i] = AffineTransform.getTranslateInstance(mi.controlPosition.getX(), mi.controlPosition.getY());\r
123             paints[i] = new Color(color);\r
124 \r
125             ++i;\r
126         }\r
127 \r
128         node.setInstances(transforms, paints);\r
129     }\r
130 \r
131 }\r