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.swing;
14 import java.awt.Color;
16 import java.awt.FontMetrics;
17 import java.awt.Graphics2D;
18 import java.awt.event.ActionEvent;
19 import java.awt.event.ActionListener;
20 import java.awt.event.FocusEvent;
21 import java.awt.event.FocusListener;
22 import java.awt.geom.Rectangle2D;
23 import java.beans.PropertyChangeEvent;
24 import java.beans.PropertyChangeListener;
26 import javax.swing.JTextField;
27 import javax.swing.border.Border;
29 import org.simantics.scenegraph.utils.InitValueSupport;
31 public class SymbolMonitorNode extends ComponentNode<JTextField> implements ActionListener, FocusListener, PropertyChangeListener, InitValueSupport {
33 private static final long serialVersionUID = 6438147255141035799L;
35 final static private Font defaultFont = Font.decode("Arial 3");
37 protected boolean editable = false;
39 protected String value = "";
41 protected transient ActionListener actionListener = null;
43 private boolean doResize = false;
45 protected Font font = null;
46 protected Color color = null;
48 static class TextField extends JTextField {
49 private static final long serialVersionUID = -668522226693100386L;
51 // workaround for 4530952
53 public void setText(String s) {
54 if (getText().equals(s)) {
61 public void setBorder(Border border) {
62 super.setBorder(null);
65 public void setBorder(double borderWidth) {
66 super.setBorder(null);
71 public String toString() {
72 return super.toString() + "[editable=" + editable + ", value=" + value + "]";
77 component = new TextField();
78 component.setEditable(editable);
79 component.setEnabled(editable);
80 component.addActionListener(this);
81 component.addFocusListener(this);
86 @SyncField("editable")
87 public void setEditable(boolean value) {
88 this.editable = value;
90 if(component != null) {
91 component.setEditable(value);
92 component.setEnabled(value);
96 // private static final FontRenderContext FRC =
97 // new FontRenderContext(
98 // new AffineTransform(),
102 public void setText(String value) {
112 // RemoteViewer does not have component initialized
113 if (component != null) {
114 component.setText(value);
121 public void setFont(Font font) {
123 if (component != null) {
124 setComponentFont(font);
130 public void setColor(Color color) {
132 if (component != null) {
133 component.setForeground(color);
139 public void render(Graphics2D g2d) {
142 recalculateSize(g2d);
145 component.setScrollOffset(0);
149 private void recalculateSize(Graphics2D g2d) {
150 if(component == null || value == null) return;
151 Font font = component.getFont();
153 FontMetrics metrics = component.getFontMetrics(font);
154 Rectangle2D size = metrics.getStringBounds(value, g2d);
157 setBounds(new Rectangle2D.Double(0, 0, xPadding + (int) Math.ceil(size.getWidth()), yPadding + (int) Math.ceil(size.getHeight())));
158 component.setScrollOffset(0);
162 public String getText() {
167 public void propertyChange(PropertyChangeEvent evt) {
168 if("value".equals(evt.getPropertyName()) && component != null) {
169 component.setText((String)evt.getNewValue());
171 } else if("editable".equals(evt.getPropertyName()) && component != null) {
172 component.setEditable((Boolean)evt.getNewValue());
173 component.setEnabled((Boolean)evt.getNewValue());
178 public void setActionListener(ActionListener actionListener) {
179 this.actionListener = actionListener;
183 public void actionPerformed(ActionEvent e) {
185 if(container.getParent() != null)
186 container.getParent().requestFocusInWindow(); // Loose focus
190 public void focusGained(FocusEvent arg0) {
194 public void focusLost(FocusEvent arg0) {
195 ActionEvent e = new ActionEvent(component, ActionEvent.ACTION_PERFORMED, ((TextField)component).getText());
200 * Wrapper method to send event to serverside
205 public void performAction(ActionEvent e) {
206 if(actionListener != null)
207 actionListener.actionPerformed(e);
210 public void setValue(String key, Object value) {
211 if("text".equals(key)) {
212 // System.out.println("monitornode text -> " + value);
213 if(value instanceof String) {
214 setText((String)value);
216 String error = "monitornode expects a string as 'text' (got " + (value != null ? value.getClass().getName() : "null") + ").";
217 System.out.println(error);
221 if("font".equals(key)) {
222 // System.out.println("monitornode font -> " + value);
223 setFont(Font.decode((String)value));
228 public void initValues() {
230 setFont(defaultFont);