1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package com.cosylab.gui.components;
21
22 import java.awt.BorderLayout;
23 import java.awt.Color;
24 import java.awt.event.ActionListener;
25 import java.awt.event.WindowAdapter;
26 import java.awt.event.WindowEvent;
27
28 import javax.swing.JComponent;
29 import javax.swing.JFrame;
30 import javax.swing.JTextField;
31 import javax.swing.SwingConstants;
32
33 import com.cosylab.application.state.State;
34 import com.cosylab.events.SetListener;
35 import com.cosylab.gui.components.customizer.AbstractCustomizerPanel;
36 import com.cosylab.gui.components.numberfield.NumberDescriptor;
37 import com.cosylab.gui.components.util.PopupManageable;
38
39
40
41
42
43
44
45
46
47 public class LabelledNumberField extends AbstractNumericDisplayerPanel implements PopupManageable
48 {
49 private static final long serialVersionUID = 1L;
50 private NumberField number;
51 private AbstractCustomizerPanel customizer;
52
53
54
55
56 public LabelledNumberField()
57 {
58 this(null, "3.2f", null, null, false);
59 }
60
61
62
63
64
65
66 public LabelledNumberField(String format)
67 {
68 this(null, format, null, null, false);
69 }
70
71
72
73
74
75
76 public LabelledNumberField(Number value)
77 {
78 this(value, "3.2f", null, null, false);
79 }
80
81
82
83
84
85
86
87 public LabelledNumberField(Number value, String format)
88 {
89 this(value, format, null, null);
90 }
91
92
93
94
95
96
97
98
99
100 public LabelledNumberField(Number value, String format, String title,
101 String units)
102 {
103 this(value, format, title, units, false);
104 }
105
106
107
108
109
110
111
112
113
114
115
116 public LabelledNumberField(Number value, String format, String title,
117 String units, boolean unitsWithTitle)
118 {
119 this(value, format, title, units, true, true, true, unitsWithTitle);
120 }
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 public LabelledNumberField(Number value, String format, String title,
136 String units, boolean resizable, boolean enchanced, boolean editable,
137 boolean unitsWithTitle)
138 {
139 super(title, true, HORIZONTAL_LAYOUT, resizable, true, enchanced, 1,
140 Integer.MAX_VALUE, units, !unitsWithTitle, unitsWithTitle);
141
142 setEditable(editable);
143 setFormat(format);
144 setMaximumValue(new Double(Double.MAX_VALUE));
145 setMinimumValue(new Double(-Double.MAX_VALUE));
146
147 if (value != null) {
148 setNumberType(value.getClass());
149 setNumberValue(value);
150 }
151
152
153 }
154
155
156
157
158
159 public AbstractCustomizerPanel getCustomizer()
160 {
161 if (customizer == null) {
162 customizer = AbstractCustomizerPanel.findCustomizer(this);
163 }
164
165 return customizer;
166 }
167
168
169
170
171
172
173 public void setColumns(int columns)
174 {
175 int oldValue = getColumns();
176 getNumber().setColumns(columns);
177 firePropertyChange("columns", oldValue, columns);
178 }
179
180
181
182
183
184
185 public int getColumns()
186 {
187 return getNumber().getColumns();
188 }
189
190
191
192
193
194
195 public void setDoubleValue(double newValue)
196 {
197 double oldValue = getDoubleValue();
198 getNumber().setDoubleValue(newValue);
199 firePropertyChange("doubleValue", oldValue, newValue);
200 }
201
202
203
204
205
206
207 public double getDoubleValue()
208 {
209 return getNumber().getDoubleValue();
210 }
211
212
213
214
215
216
217 public void setEditable(boolean editable)
218 {
219 boolean oldValue = isEditable();
220 getNumber().setEditable(editable);
221 firePropertyChange("editable", oldValue, editable);
222 }
223
224
225
226
227
228
229 public boolean isEditable()
230 {
231 return getNumber().isEditable();
232 }
233
234
235
236
237
238
239 public void setLongValue(long newValue)
240 {
241 long oldValue = getLongValue();
242 getNumber().setLongValue(newValue);
243 firePropertyChange("longValue", oldValue, newValue);
244 }
245
246
247
248
249
250
251 public long getLongValue()
252 {
253 return getNumber().getLongValue();
254 }
255
256
257
258
259
260
261
262
263
264 public void setMaximumValue(Number newMaximum)
265 {
266 Number oldValue = getMaximumValue();
267 getNumber().setMaximum(newMaximum);
268 super.setMaximumValue(number.getMaximum());
269 firePropertyChange("maximumValue", oldValue, newMaximum);
270 }
271
272
273
274
275
276
277
278 public Number getMaximumValue()
279 {
280 return getNumber().getMaximum();
281 }
282
283
284
285
286
287
288
289
290
291 public void setMinimumValue(Number newMinimum)
292 {
293 Number oldValue = getMinimumValue();
294 getNumber().setMinimum(newMinimum);
295 super.setMinimumValue(number.getMinimum());
296 firePropertyChange("minimumValue", oldValue, newMinimum);
297 }
298
299
300
301
302
303
304
305 public Number getMinimumValue()
306 {
307 return getNumber().getMinimum();
308 }
309
310
311
312
313
314
315 public void setNumberType(Class<? extends Number> newNumberFormat)
316 {
317 Class<? extends Number> oldValue = getNumberType();
318 getNumber().setNumberType(newNumberFormat);
319 super.setNumberType(newNumberFormat);
320 firePropertyChange("numberType", oldValue, newNumberFormat);
321 }
322
323
324
325
326
327
328 public Class<? extends Number> getNumberType()
329 {
330 return getNumber().getNumberType();
331 }
332
333
334
335
336
337
338
339
340 public void setNumberValue(Number newValue)
341 {
342 Number oldValue = getNumberValue();
343 getNumber().setValue(newValue);
344 firePropertyChange("numberValue", oldValue, newValue);
345 }
346
347
348
349
350
351
352
353 public Number getNumberValue()
354 {
355 return getNumber().getValue();
356 }
357
358
359
360
361
362 public void setState(State state)
363 {
364 super.setState(state);
365
366 setEditable(state.getBoolean("editable", isEditable()));
367 setColumns(state.getInt("columns", getColumns()));
368 setTiltingEnabled(state.getBoolean("tiltingEnabled", isTiltingEnabled()));
369 }
370
371
372
373
374
375
376
377 public void setTiltingEnabled(boolean b)
378 {
379 if (isTiltingEnabled() == b) return;
380 getNumber().setTiltingEnabled(b);
381 firePropertyChange("tiltingEnabled", !b, b);
382 }
383
384
385
386
387
388 public State getState()
389 {
390 State state = super.getState();
391
392 state.putBoolean("editable", isEditable());
393 state.putBoolean("tiltingEnabled", isTiltingEnabled());
394 state.putInt("columns", getColumns());
395
396 return state;
397 }
398
399
400
401
402
403
404
405
406 public boolean isTiltingEnabled()
407 {
408 return getNumber().isTiltingEnabled();
409 }
410
411
412
413
414
415
416 public void addActionListener(ActionListener l)
417 {
418 number.addActionListener(l);
419 }
420
421
422
423
424
425
426 public void addSetListener(SetListener l)
427 {
428 getNumber().addSetListener(l);
429 }
430
431
432
433
434
435
436 public void removeActionListener(ActionListener l)
437 {
438 number.removeActionListener(l);
439 }
440
441
442
443
444
445
446 public void removeSetListener(SetListener l)
447 {
448 getNumber().removeSetListener(l);
449 }
450
451
452
453
454
455
456
457 protected NumberField getNumber()
458 {
459 if (number == null) {
460 number = new NumberField();
461 number.setResizable(true);
462 number.setSettingPolicy(NumberField.SET_ON_APPLY);
463 number.setHorizontalAlignment(SwingConstants.RIGHT);
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482 number.addMouseListener(getPopupManager().getMouseHook());
483 }
484
485 return number;
486 }
487
488
489
490
491 protected JComponent getValueComponent()
492 {
493 return getNumber();
494 }
495
496
497
498
499
500 protected void internalSetEnabled()
501 {
502 super.internalSetEnabled();
503 getNumber().setEnabled(isEnabled());
504 }
505
506
507
508
509
510 protected void internalSetEnhanced()
511 {
512 super.internalSetEnhanced();
513 getNumber().setEnhanced(isEnhanced());
514 }
515
516
517
518
519
520 protected void internalSetFormat()
521 {
522 super.internalSetFormat();
523
524 String tFormat = getFormat();
525
526 if (tFormat == null) {
527 tFormat = NumberField.createDefaultFormat(getNumberType());
528 }
529
530 getNumber().setFormat(tFormat);
531 }
532
533
534
535
536
537 protected void internalSetResizable()
538 {
539 super.internalSetResizable();
540 getNumber().setResizable(isResizable());
541 getNumber().revalidate();
542 }
543
544
545
546
547
548
549
550 public NumberDescriptor getNumberDescriptor()
551 {
552 return getNumber().getNumberDescriptor();
553 }
554
555
556
557
558
559
560
561
562
563 public void setNumberDescriptor(NumberDescriptor numberDescriptor)
564 {
565 NumberDescriptor oldValue = getNumberDescriptor();
566 getNumber().setNumberDescriptor(numberDescriptor);
567 firePropertyChange("numberDescriptor", oldValue, numberDescriptor);
568 }
569
570
571
572
573
574
575
576
577
578
579 public void setSettingPolicy(int newPolicy)
580 {
581 int oldValue = getSettingPolicy();
582 getNumber().setSettingPolicy(newPolicy);
583 firePropertyChange("settingPolicy", oldValue, newPolicy);
584 }
585
586
587
588
589
590
591 public int getSettingPolicy()
592 {
593 return getNumber().getSettingPolicy();
594 }
595
596
597
598
599
600
601
602 public void setWarnOutOfBounds(Boolean b) {
603 Boolean oldValue = isWarnOutOfBounds();
604 getNumber().setWarnOutOfBounds(b);
605 firePropertyChange("warnOutOfBounds", oldValue, b);
606 }
607
608
609
610
611
612
613 public boolean isWarnOutOfBounds() {
614 return getNumber().isWarnOutOfBounds();
615 }
616
617
618
619
620
621
622 public void setOutOfBoundsColor(Color c) {
623 Color oldValue = getOutOfBoundsColor();
624 getNumber().setOutOfBoundsColor(c);
625 firePropertyChange("outOfBoundColor", oldValue, c);
626 }
627
628
629
630
631
632 public Color getOutOfBoundsColor() {
633 return getNumber().getWarningColor();
634 }
635
636
637
638
639
640 @Override
641 public void setBackground(Color bg) {
642 Color fieldBg = getNumber().getBackground();
643 super.setBackground(bg);
644 getNumber().setBackground(fieldBg);
645 }
646
647
648
649
650
651
652 public static void main(String[] args)
653 {
654 JFrame frame = new JFrame("NumberField Testing Applet");
655 frame.getContentPane().setLayout(new BorderLayout(10, 10));
656
657
658
659 final LabelledNumberField field= new LabelledNumberField(new Double(10),
660 "%1.0f", "Current", "A",true);
661 field.setTitleMaximumFontSize(12);
662 field.setMaximumValue(1000);
663 field.setMinimumValue(0);
664 field.setDoubleValue(0);
665 field.setUnitsVisible(true);
666 field.setTiltingEnabled(true);
667 frame.getContentPane().add(field, BorderLayout.CENTER);
668 frame.setSize(300, 100);
669 frame.addWindowListener(new WindowAdapter() {
670 public void windowClosing(WindowEvent e)
671 {
672 System.exit(0);
673 }
674 });
675 frame.setVisible(true);
676
677 new Thread(new Runnable(){
678 public void run() {
679 double i = 0;
680 while(true) {
681
682
683 try {
684 Thread.sleep(10000);
685 } catch (InterruptedException e) {
686
687 e.printStackTrace();
688 }
689 field.setDoubleValue(i+=1500);
690 }
691
692 }
693 }).start();
694 }
695
696 }
697
698