1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
|
/* *************************************************************************
IT Mill Toolkit
Development of Browser User Interfaces Made Easy
Copyright (C) 2000-2006 IT Mill Ltd
*************************************************************************
This product is distributed under commercial license that can be found
from the product package on license/license.txt. Use of this product might
require purchasing a commercial license from IT Mill Ltd. For guidelines
on usage, see license/licensing-guidelines.html
*************************************************************************
For more information, contact:
IT Mill Ltd phone: +358 2 4802 7180
Ruukinkatu 2-4 fax: +358 2 4802 7181
20540, Turku email: info@itmill.com
Finland company www: www.itmill.com
Primary source for information and releases: www.itmill.com
********************************************************************** */
package com.itmill.toolkit.ui;
import java.text.Format;
import java.util.Map;
import com.itmill.toolkit.data.Property;
import com.itmill.toolkit.terminal.PaintException;
import com.itmill.toolkit.terminal.PaintTarget;
/** <p>A text editor component that can be bound to any bindable Property.
* The text editor supports both multiline and single line modes, default
* is one-line mode.</p>
*
* <p>Since <code>TextField</code> extends <code>AbstractField</code> it
* implements the {@link com.itmill.toolkit.data.Buffered} interface. A
* <code>TextField</code> is in write-through mode by default, so
* {@link com.itmill.toolkit.ui.AbstractField#setWriteThrough(boolean)}
* must be called to enable buffering.</p>
*
* @author IT Mill Ltd.
* @version @VERSION@
* @since 3.0
*/
public class TextField extends AbstractField {
/* Private members ************************************************* */
/** Value formatter used to format the string contents*/
private Format format;
/** Number of visible columns in the TextField. */
private int columns = 0;
/** Number of visible rows in a multiline TextField. Value 0 implies a
* single-line text-editor.
*/
private int rows = 0;
/** Tells if word-wrapping should be used in multiline mode. */
private boolean wordwrap = true;
/** Tells if input is used to enter sensitive information that is
* not echoed to display. Typically passwords.
*/
private boolean secret = false;
/** Null representation. */
private String nullRepresentation = "null";
/** Is setting to null from non-null value allowed by setting with
* null representation */
private boolean nullSettingAllowed = false;
/* Constructors **************************************************** */
/** Constructs an empty <code>TextField</code> with no caption. */
public TextField() {
setValue("");
}
/** Constructs an empty <code>TextField</code> with given caption. */
public TextField(String caption) {
setValue("");
setCaption(caption);
}
/** Constructs a new <code>TextField</code> that's bound to the
* specified <code>Property</code> and has no caption.
*
* @param dataSource the Property to be edited with this editor
*/
public TextField(Property dataSource) {
setPropertyDataSource(dataSource);
}
/** Constructs a new <code>TextField</code> that's bound to the
* specified <code>Property</code> and has the given caption
* <code>String</code>.
*
* @param caption caption <code>String</code> for the editor
* @param dataSource the Property to be edited with this editor
*/
public TextField(String caption, Property dataSource) {
this(dataSource);
setCaption(caption);
}
/** Constructs a new <code>TextField</code> with the given caption and
* initial text contents. The editor constructed this way will not be
* bound to a Property unless
* {@link com.itmill.toolkit.data.Property.Viewer#setPropertyDataSource(Property)}
* is called to bind it.
*
* @param caption caption <code>String</code> for the editor
* @param text initial text content of the editor
*/
public TextField(String caption, String value) {
setValue(value);
setCaption(caption);
}
/* Component basic features ********************************************* */
/* Paint this component.
* Don't add a JavaDoc comment here, we use the default documentation
* from implemented interface.
*/
public void paintContent(PaintTarget target) throws PaintException {
super.paintContent(target);
// Set secret attribute
if (this.isSecret())
target.addAttribute("secret", true);
// Add the number of column and rows
int c = getColumns();
int r = getRows();
if (c != 0)
target.addAttribute("cols", String.valueOf(c));
if (r != 0) {
target.addAttribute("rows", String.valueOf(r));
target.addAttribute("multiline", true);
if (!wordwrap)
target.addAttribute("wordwrap", false);
}
// Add content as variable
String value = getFormattedValue();
if (value == null)
value = getNullRepresentation();
if (value == null)
throw new IllegalStateException("Null values are not allowed if the null-representation is null");
target.addVariable(this, "text", value);
}
/** Get the formatted dtring value.
* Sets the field value by using the assigned Format.
* @param value to be formatted
* @return Formatted value
* @see #setFormat(Format)
* @see Format
*/
protected String getFormattedValue() {
Object value = getValue();
if (this.format != null && value != null)
try {
return this.format.format(value);
} catch (IllegalArgumentException ignored) {
// Ignored exception
}
if (value != null)
return value.toString();
return null;
}
/* Gets the components UIDL tag string.
* Don't add a JavaDoc comment here, we use the default documentation
* from implemented interface.
*/
public String getTag() {
return "textfield";
}
/* Invoked when a variable of the component changes.
* Don't add a JavaDoc comment here, we use the default documentation
* from implemented interface.
*/
public void changeVariables(Object source, Map variables) {
// Set the text
if (variables.containsKey("text") && !isReadOnly()) {
// Only do the setting if the string representation of the value
// has been updated
String newValue = (String) variables.get("text");
String oldValue = getFormattedValue();
if (newValue != null
&& (oldValue == null || isNullSettingAllowed())
&& newValue.equals(getNullRepresentation()))
newValue = null;
if (newValue != oldValue
&& (newValue == null || !newValue.equals(oldValue)))
setValue(newValue);
}
}
/* Text field configuration ********************************************* */
/** Gets the number of columns in the editor. If the number of columns
* is set 0, the actual number of displayed columns is determined
* implicitly by the adapter.
*
* @param the number of columns for this editor
*/
public int getColumns() {
return this.columns;
}
/** Sets the number of columns in the editor. If the number of columns
* is set 0, the actual number of displayed columns is determined
* implicitly by the adapter.
*
* @return number of explicitly set columns
*/
public void setColumns(int columns) {
if (columns < 0)
columns = 0;
this.columns = columns;
requestRepaint();
}
/** Gets the number of rows in the editor. If the number of rows is set
* to 0, the actual number of displayed rows is determined implicitly by
* the adapter.
*
* @return number of explicitly set rows
*/
public int getRows() {
return this.rows;
}
/** Sets the number of rows in the editor. If the number of rows is set
* to 0, the actual number of displayed rows is determined implicitly by
* the adapter.
*
* @param the number of rows for this editor
*/
public void setRows(int rows) {
if (rows < 0)
rows = 0;
this.rows = rows;
requestRepaint();
}
/** Tests if the editor is in word-wrap mode.
*
* @return <code>true</code> if the component is in the word-wrap mode,
* <code>false</code> if not
*/
public boolean isWordwrap() {
return this.wordwrap;
}
/** Sets the editor's word-wrap mode on or off.
*
* @param wordwrap boolean value specifying if the editor should be in
* word-wrap mode after the call or not.
*/
public void setWordwrap(boolean wordwrap) {
this.wordwrap = wordwrap;
}
/* Property features **************************************************** */
/* Gets the edited property's type.
* Don't add a JavaDoc comment here, we use the default documentation
* from implemented interface.
*/
public Class getType() {
return String.class;
}
/** Get the secret property on and off.
* If a field is used to enter secretinformation
* the information is not echoed to display.
* @return true if the field is used to enter secret information, false otherwise.
*/
public boolean isSecret() {
return secret;
}
/** Set the secret property on and off.
* If a field is used to enter secretinformation
* the information is not echoed to display.
* @param secret value specifying if the field is used to enter secret information.
*/
public void setSecret(boolean secret) {
this.secret = secret;
}
/** Get the null-string representation.
*
* <p>The null-valued strings are represented on the user interface by replacing the
* null value with this string. If the null representation is set null (not 'null' string),
* painting null value throws exception.</p>
*
* <p>The default value is string 'null'</p>
*
* @see TextField#isNullSettingAllowed()
* @return String Textual representation for null strings.
*/
public String getNullRepresentation() {
return nullRepresentation;
}
/** Is setting nulls with null-string representation allowed.
*
* <p>If this property is true, writing null-representation string to text
* field allways sets the field value to real null. If this property is
* false, null setting is not made, but the null values are maintained.
* Maintenance of null-values is made by only converting the textfield
* contents to real null, if the text field matches the null-string
* representation and the current value of the field is null.</p>
*
* <p>By default this setting is false</p>
*
* @return boolean Should the null-string represenation be allways
* converted to null-values.
* @see TextField#getNullRepresentation()
*/
public boolean isNullSettingAllowed() {
return nullSettingAllowed;
}
/** Sets the null-string representation.
*
* <p>The null-valued strings are represented on the user interface by replacing the
* null value with this string. If the null representation is set null (not 'null' string),
* painting null value throws exception.</p>
*
* <p>The default value is string 'null'</p>
*
* @see TextField#setNullSettingAllowed(boolean)
* @param nullRepresentation Textual representation for null strings.
*/
public void setNullRepresentation(String nullRepresentation) {
this.nullRepresentation = nullRepresentation;
}
/** Set the null conversion mode.
*
* <p>If this property is true, writing null-representation string to text
* field allways sets the field value to real null. If this property is
* false, null setting is not made, but the null values are maintained.
* Maintenance of null-values is made by only converting the textfield
* contents to real null, if the text field matches the null-string
* representation and the current value of the field is null.</p>
*
* <p>By default this setting is false</p>
*
* @param nullSettingAllowed Should the null-string represenation be allways
* converted to null-values.
* @see TextField#getNullRepresentation()
*/
public void setNullSettingAllowed(boolean nullSettingAllowed) {
this.nullSettingAllowed = nullSettingAllowed;
}
/** Get the value formatter of TextField.
*
*
* @return The Format used to format the value.
*/
public Format getFormat() {
return format;
}
/** Get the value formatter of TextField.
*
* @param The Format used to format the value. Null disables the formatting.
*/
public void setFormat(Format format) {
this.format = format;
}
}
|