--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.scenegraph.swing;\r
+\r
+import java.awt.BasicStroke;\r
+import java.awt.Color;\r
+import java.awt.Cursor;\r
+import java.awt.Graphics2D;\r
+import java.awt.Shape;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.awt.geom.AffineTransform;\r
+import java.awt.geom.Rectangle2D;\r
+import java.util.HashSet;\r
+import java.util.Set;\r
+\r
+import javax.swing.JToggleButton;\r
+\r
+import org.simantics.scenegraph.utils.DummyComponent;\r
+\r
+public class JBooleanToggleValueNode extends ComponentNode<JToggleButton> implements ActionListener {\r
+ /**\r
+ * \r
+ */\r
+ private static final long serialVersionUID = 3255791584573492072L;\r
+\r
+ protected static final BasicStroke STROKE = new BasicStroke(1.0f);\r
+ protected static final Rectangle2D BOUNDS = new Rectangle2D.Double(-10, -10, 20, 20);\r
+\r
+ protected Boolean value = null;\r
+ protected transient Set<ActionListener> actionListeners = new HashSet<ActionListener>();\r
+\r
+ @SyncField("value")\r
+ public void setValue(Boolean value) {\r
+ this.value = value;\r
+ if(component instanceof JToggleButton) {\r
+ ((JToggleButton)component).setSelected(value == null ? false : value);\r
+ }\r
+ }\r
+ \r
+ @SyncField("transform")\r
+ public void setTransform(AffineTransform transform) {\r
+ assert(transform != null);\r
+ this.transform = transform;\r
+ this.transform.translate(-10, -10);\r
+ }\r
+\r
+ @Override\r
+ public void render(Graphics2D g2d) {\r
+ if (component != null) {\r
+ int width = (int)BOUNDS.getWidth();\r
+ int height = (int)BOUNDS.getHeight();\r
+ \r
+ AffineTransform ot = g2d.getTransform();\r
+ double sx = 1;\r
+ double sy = 1;\r
+ if(transform != null) {\r
+ g2d.transform(transform);\r
+ sx = g2d.getTransform().getScaleX();\r
+ sy = g2d.getTransform().getScaleY();\r
+ g2d.scale(1/sx, 1/sy);\r
+ }\r
+ component.setSize((int)(width*sx), (int)(height*sy));\r
+ component.paint(g2d);\r
+ \r
+ g2d.setTransform(ot);\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * Helper method to be used inside MonitorClass\r
+ * @return\r
+ */\r
+ public static Shape getOutline() {\r
+ return BOUNDS;\r
+ }\r
+ \r
+ @Override\r
+ public Rectangle2D getBoundsInLocal() {\r
+ return BOUNDS;\r
+ }\r
+\r
+ /**\r
+ * ClientSide method for handling event and transforming it\r
+ * NOTE: This is just a wrapper method\r
+ */\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ Boolean s = component.isSelected();\r
+ performAction(new ActionEvent(new DummyComponent(), ActionEvent.ACTION_PERFORMED, ""+s));\r
+ }\r
+ \r
+ /**\r
+ * ServerSide method for calling the actionlisteners\r
+ * @param e\r
+ */\r
+ @ServerSide\r
+ protected void performAction(ActionEvent e) {\r
+ for(ActionListener listener : actionListeners)\r
+ listener.actionPerformed(e);\r
+ }\r
+ \r
+ public void addActionListener(ActionListener l) {\r
+ actionListeners.add(l);\r
+ }\r
+ \r
+ public void removeActionListener(ActionListener l) {\r
+ actionListeners.remove(l);\r
+ }\r
+ \r
+ @Override\r
+ public void init() {\r
+ Boolean s = value == null ? false : value;\r
+ component = new JToggleButton(null, null, s);\r
+ component.setCursor(new Cursor(Cursor.HAND_CURSOR));\r
+ component.addActionListener(this);\r
+ component.setBackground(Color.RED);\r
+ super.init();\r
+ }\r
+}\r