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.scenegraph.g2d.nodes;
14 import java.awt.BasicStroke;
15 import java.awt.Color;
16 import java.awt.Graphics2D;
17 import java.awt.Shape;
18 import java.awt.event.ActionEvent;
19 import java.awt.event.ActionListener;
20 import java.awt.geom.AffineTransform;
21 import java.awt.geom.Line2D;
22 import java.awt.geom.Point2D;
23 import java.awt.geom.Rectangle2D;
25 import org.simantics.scenegraph.g2d.G2DNode;
26 import org.simantics.scenegraph.g2d.events.EventTypes;
27 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseClickEvent;
28 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;
29 import org.simantics.scenegraph.utils.DummyComponent;
30 import org.simantics.scenegraph.utils.NodeUtil;
32 public class BooleanToggleValueNode extends G2DNode implements ActionListener {
33 private static final long serialVersionUID = 3255791584573492072L;
35 protected static final BasicStroke STROKE = new BasicStroke(1.0f);
36 protected static final Rectangle2D BOUNDS = new Rectangle2D.Double(-10, -10, 20, 20);
38 protected Boolean value = null;
39 protected transient boolean mouseOver = false;
44 addEventHandler(this);
48 public void setValue(Boolean value) {
53 public void render(Graphics2D g) {
54 Color borderColor = new Color(160, 10, 10);
55 Color fillColor = new Color(210, 10, 10);
57 if(value != null && value) {
58 borderColor = new Color(10, 160, 10);
59 fillColor = new Color(10, 210, 10);
63 if(mouseOver) borderColor = borderColor.darker();
64 AffineTransform ot = g.getTransform();
66 g.transform(transform);
68 g.setColor(fillColor);
72 g.setColor(in ? borderColor.darker().darker() : borderColor);
73 g.draw(new Line2D.Double(BOUNDS.getMinX(), BOUNDS.getMinY(), BOUNDS.getMinX(), BOUNDS.getMaxY()));
74 g.draw(new Line2D.Double(BOUNDS.getMinX(), BOUNDS.getMinY(), BOUNDS.getMaxX(), BOUNDS.getMinY()));
76 g.setColor(in ? borderColor : borderColor.darker().darker());
77 g.draw(new Line2D.Double(BOUNDS.getMaxX(), BOUNDS.getMinY(), BOUNDS.getMaxX(), BOUNDS.getMaxY()));
78 g.draw(new Line2D.Double(BOUNDS.getMinX(), BOUNDS.getMaxY(), BOUNDS.getMaxX(), BOUNDS.getMaxY()));
84 * Helper method to be used inside MonitorClass
87 public static Shape getOutline() {
92 public Rectangle2D getBoundsInLocal() {
96 protected transient ActionListener actionListener = null;
98 public void setActionListener(ActionListener actionListener) {
99 this.actionListener = actionListener;
104 public void actionPerformed(ActionEvent e) {
105 if(actionListener != null) {
106 actionListener.actionPerformed(e);
111 protected boolean mouseClicked(MouseClickEvent e) {
112 Point2D pt = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double());
113 if (BOUNDS.contains(pt)) {
114 setValue((value == null || value == false) ? true : false); // Toggle value
115 actionPerformed(new ActionEvent(new DummyComponent(), ActionEvent.ACTION_PERFORMED, ""+value));
123 protected boolean mouseMoved(MouseMovedEvent e) {
124 Point2D pt = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double());
125 boolean tmp = mouseOver;
126 mouseOver = BOUNDS.contains(pt);
127 if (tmp != mouseOver)
133 public int getEventMask() {
134 return EventTypes.MouseMovedMask | EventTypes.MouseClickMask;