]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph.swing/src/org/simantics/scenegraph/swing/SymbolMonitorNode.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.scenegraph.swing / src / org / simantics / scenegraph / swing / SymbolMonitorNode.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
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
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.scenegraph.swing;
13
14 import java.awt.Color;
15 import java.awt.Font;
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;
25
26 import javax.swing.JTextField;
27 import javax.swing.border.Border;
28
29 import org.simantics.scenegraph.utils.InitValueSupport;
30
31 public class SymbolMonitorNode extends ComponentNode<JTextField> implements ActionListener, FocusListener, PropertyChangeListener, InitValueSupport {
32
33     private static final long serialVersionUID = 6438147255141035799L;
34
35     final static private Font defaultFont = Font.decode("Arial 3");
36
37     protected boolean editable = false;
38
39     protected String value = "";
40
41     protected transient ActionListener actionListener = null;
42
43     private boolean doResize = false;
44
45     protected Font font = null;
46     protected Color color = null;
47
48     static class TextField extends JTextField {
49         private static final long serialVersionUID = -668522226693100386L;
50
51         // workaround for 4530952
52         @Override
53         public void setText(String s) {
54             if (getText().equals(s)) {
55                 return;
56             }
57             super.setText(s);
58         }
59
60         @Override
61         public void setBorder(Border border) {
62             super.setBorder(null);
63         }
64
65         public void setBorder(double borderWidth) {
66             super.setBorder(null);
67         }
68     }
69
70     @Override
71     public String toString() {
72         return super.toString() + "[editable=" + editable + ", value=" + value + "]";
73     }
74
75     @Override
76     public void init() {
77         component = new TextField();
78         component.setEditable(editable);
79         component.setEnabled(editable);
80         component.addActionListener(this);
81         component.addFocusListener(this);
82         setVisible(false);
83         super.init();
84     }
85
86     @SyncField("editable")
87     public void setEditable(boolean value) {
88         this.editable = value;
89
90         if(component != null) {
91             component.setEditable(value);
92             component.setEnabled(value);
93         }
94     }
95
96 //    private static final FontRenderContext FRC =
97 //        new FontRenderContext(
98 //                new AffineTransform(),
99 //                true, true);
100
101     @SyncField("value")
102     public void setText(String value) {
103         this.value = value;
104
105         if(value == null) {
106             setVisible(false);
107             return;
108         } else {
109             setVisible(true);
110         }
111
112         // RemoteViewer does not have component initialized
113         if (component != null) {
114             component.setText(value);
115             doResize = true;
116         }
117     }
118
119
120     @SyncField("font")
121     public void setFont(Font font) {
122         this.font = font;
123         if (component != null) {
124             setComponentFont(font);
125             doResize = true;
126         }
127     }
128
129     @SyncField("color")
130     public void setColor(Color color) {
131         this.color = color;
132         if (component != null) {
133             component.setForeground(color);
134             doResize = true;
135         }
136     }
137
138     @Override
139     public void render(Graphics2D g2d) {
140         if(doResize) {
141             doResize = false;
142             recalculateSize(g2d);
143         }
144         // TODO: fix this!!
145         component.setScrollOffset(0);
146         super.render(g2d);
147     }
148
149     private void recalculateSize(Graphics2D g2d) {
150         if(component == null || value == null) return;
151         Font font = component.getFont();
152         if (font != null) {
153             FontMetrics metrics = component.getFontMetrics(font);
154             Rectangle2D size = metrics.getStringBounds(value, g2d);
155             int xPadding = 0;
156             int yPadding = 0;
157             setBounds(new Rectangle2D.Double(0, 0, xPadding + (int) Math.ceil(size.getWidth()), yPadding + (int) Math.ceil(size.getHeight())));
158             component.setScrollOffset(0);
159         }
160     }
161
162     public String getText() {
163         return value;
164     }
165
166     @Override
167     public void propertyChange(PropertyChangeEvent evt) {
168         if("value".equals(evt.getPropertyName()) && component != null) {
169             component.setText((String)evt.getNewValue());
170             doResize = true;
171         } else if("editable".equals(evt.getPropertyName()) && component != null) {
172             component.setEditable((Boolean)evt.getNewValue());
173             component.setEnabled((Boolean)evt.getNewValue());
174         }
175     }
176
177
178     public void setActionListener(ActionListener actionListener) {
179         this.actionListener = actionListener;
180     }
181
182     @Override
183     public void actionPerformed(ActionEvent e) {
184 //        performAction(e);
185         if(container.getParent() != null)
186             container.getParent().requestFocusInWindow(); // Loose focus
187     }
188
189     @Override
190     public void focusGained(FocusEvent arg0) {
191     }
192
193     @Override
194     public void focusLost(FocusEvent arg0) {
195         ActionEvent e = new ActionEvent(component, ActionEvent.ACTION_PERFORMED, ((TextField)component).getText());
196         performAction(e);
197     }
198
199     /**
200      * Wrapper method to send event to serverside
201      * 
202      * @param e
203      */
204     @ServerSide
205     public void performAction(ActionEvent e) {
206         if(actionListener != null)
207             actionListener.actionPerformed(e);
208     }
209
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);
215             } else {
216                 String error = "monitornode expects a string as 'text' (got " + (value != null ? value.getClass().getName() : "null") + ").";
217                 System.out.println(error);
218                 setText(error);
219             }
220         }
221         if("font".equals(key)) {
222 //                      System.out.println("monitornode font -> " + value);
223             setFont(Font.decode((String)value));
224         }
225     }
226
227     @Override
228     public void initValues() {
229         setText(null);
230         setFont(defaultFont);
231     }
232
233 }