]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/BooleanToggleValueNode.java
Sync git svn branch with SVN repository r33269.
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / nodes / BooleanToggleValueNode.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.scenegraph.g2d.nodes;\r
13 \r
14 import java.awt.BasicStroke;\r
15 import java.awt.Color;\r
16 import java.awt.Graphics2D;\r
17 import java.awt.Shape;\r
18 import java.awt.event.ActionEvent;\r
19 import java.awt.event.ActionListener;\r
20 import java.awt.geom.AffineTransform;\r
21 import java.awt.geom.Line2D;\r
22 import java.awt.geom.Point2D;\r
23 import java.awt.geom.Rectangle2D;\r
24 \r
25 import org.simantics.scenegraph.g2d.G2DNode;\r
26 import org.simantics.scenegraph.g2d.events.EventTypes;\r
27 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseClickEvent;\r
28 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;\r
29 import org.simantics.scenegraph.utils.DummyComponent;\r
30 import org.simantics.scenegraph.utils.NodeUtil;\r
31 \r
32 public class BooleanToggleValueNode extends G2DNode implements ActionListener {\r
33     private static final long serialVersionUID = 3255791584573492072L;\r
34 \r
35     protected static final BasicStroke STROKE = new BasicStroke(1.0f);\r
36     protected static final Rectangle2D BOUNDS = new Rectangle2D.Double(-10, -10, 20, 20);\r
37 \r
38     protected Boolean value = null;\r
39     protected transient boolean mouseOver = false;\r
40 \r
41     @Override\r
42     public void init() {\r
43         super.init();\r
44         addEventHandler(this);\r
45     }\r
46 \r
47     @SyncField("value")\r
48     public void setValue(Boolean value) {\r
49         this.value = value;\r
50     }\r
51 \r
52     @Override\r
53     public void render(Graphics2D g) {\r
54         Color borderColor = new Color(160, 10, 10);\r
55         Color fillColor   = new Color(210, 10, 10);\r
56         boolean in = false;\r
57         if(value != null && value) {\r
58             borderColor = new Color(10, 160, 10);\r
59             fillColor   = new Color(10, 210, 10);\r
60             in = true;\r
61         }\r
62 \r
63         if(mouseOver) borderColor = borderColor.darker();\r
64         AffineTransform ot = g.getTransform();\r
65 \r
66         g.transform(transform);\r
67 \r
68         g.setColor(fillColor);\r
69         g.fill(BOUNDS);\r
70 \r
71         g.setStroke(STROKE);\r
72         g.setColor(in ? borderColor.darker().darker() : borderColor);\r
73         g.draw(new Line2D.Double(BOUNDS.getMinX(), BOUNDS.getMinY(), BOUNDS.getMinX(), BOUNDS.getMaxY()));\r
74         g.draw(new Line2D.Double(BOUNDS.getMinX(), BOUNDS.getMinY(), BOUNDS.getMaxX(), BOUNDS.getMinY()));\r
75 \r
76         g.setColor(in ? borderColor : borderColor.darker().darker());\r
77         g.draw(new Line2D.Double(BOUNDS.getMaxX(), BOUNDS.getMinY(), BOUNDS.getMaxX(), BOUNDS.getMaxY()));\r
78         g.draw(new Line2D.Double(BOUNDS.getMinX(), BOUNDS.getMaxY(), BOUNDS.getMaxX(), BOUNDS.getMaxY()));\r
79 \r
80         g.setTransform(ot);\r
81     }\r
82 \r
83     /**\r
84      * Helper method to be used inside MonitorClass\r
85      * @return\r
86      */\r
87     public static Shape getOutline() {\r
88         return BOUNDS;\r
89     }\r
90 \r
91     @Override\r
92     public Rectangle2D getBoundsInLocal() {\r
93         return BOUNDS;\r
94     }\r
95 \r
96     protected transient ActionListener actionListener = null;\r
97 \r
98     public void setActionListener(ActionListener actionListener) {\r
99         this.actionListener = actionListener;\r
100     }\r
101 \r
102     @ServerSide\r
103     @Override\r
104     public void actionPerformed(ActionEvent e) {\r
105         if(actionListener != null) {\r
106             actionListener.actionPerformed(e);\r
107         }\r
108     }\r
109 \r
110     @Override\r
111     protected boolean mouseClicked(MouseClickEvent e) {\r
112         Point2D pt = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double());\r
113         if (BOUNDS.contains(pt)) {\r
114             setValue((value == null || value == false) ? true :  false); // Toggle value\r
115             actionPerformed(new ActionEvent(new DummyComponent(), ActionEvent.ACTION_PERFORMED, ""+value));\r
116             repaint();\r
117             return true;\r
118         }\r
119         return false;\r
120     }\r
121 \r
122     @Override\r
123     protected boolean mouseMoved(MouseMovedEvent e) {\r
124         Point2D pt = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double());\r
125         boolean tmp = mouseOver;\r
126         mouseOver = BOUNDS.contains(pt);\r
127         if (tmp != mouseOver)\r
128             repaint();\r
129         return false;\r
130     }\r
131 \r
132     @Override\r
133     public int getEventMask() {\r
134         return EventTypes.MouseMovedMask | EventTypes.MouseClickMask;\r
135     }\r
136 \r
137 }\r