|
@@ -1,56 +1,35 @@ |
1 |
1 |
|
package com.temp.client.foundation.widget.input.fieldsupport; |
2 |
2 |
|
|
3 |
|
- |
import com.google.gwt.event.dom.client.ChangeEvent; |
4 |
|
- |
import com.google.gwt.event.dom.client.ChangeHandler; |
5 |
|
- |
import com.google.gwt.user.client.ui.HasName; |
6 |
3 |
|
import com.google.gwt.user.client.ui.Panel; |
7 |
4 |
|
import com.google.gwt.user.client.ui.Widget; |
8 |
5 |
|
import com.temp.client.foundation.util.UtilsGwt; |
9 |
|
- |
import com.temp.client.foundation.widget.NameToID; |
10 |
6 |
|
import com.temp.client.foundation.widget.input.InputField; |
11 |
|
- |
import com.temp.shared.ValueValidator; |
12 |
7 |
|
import com.temp.shared.externalization.E13nData; |
13 |
|
- |
import com.temp.shared.externalization.E13nResolver; |
14 |
|
- |
import com.temp.shared.externalization.OptionallyPrefixingE13nResolver; |
15 |
8 |
|
import com.temp.shared.utils.Enableable; |
16 |
9 |
|
import com.temp.shared.utils.ObjectUtils; |
17 |
|
- |
import com.temp.shared.utils.StringUtils; |
18 |
|
- |
import com.temp.shared.utils.Validate; |
19 |
10 |
|
|
20 |
|
- |
import java.util.ArrayList; |
21 |
11 |
|
import java.util.HashSet; |
22 |
|
- |
import java.util.List; |
23 |
12 |
|
import java.util.Set; |
24 |
13 |
|
|
25 |
14 |
|
/** |
26 |
15 |
|
* Common abstract helper for both the generated Widget and the Proxied versions of the InputField. |
27 |
16 |
|
*/ |
28 |
|
- |
public abstract class AbstractInputField<T, C extends AbstractInputField<T,C>> implements InputField<T> { |
29 |
|
- |
// Required to be set |
30 |
|
- |
private String name; |
31 |
|
- |
|
32 |
|
- |
// The above must be set/changed BEFORE the widget is attached! |
33 |
|
- |
|
|
17 |
+ |
public abstract class AbstractInputField<T, C extends AbstractInputField<T, C>> implements InputField<T> { |
34 |
18 |
|
// Optionally set |
35 |
|
- |
private List<ValueValidator<T>> validators = new ArrayList<ValueValidator<T>>(); |
36 |
19 |
|
private Set<ChangeListener<T>> changeListeners = new HashSet<ChangeListener<T>>(); |
37 |
20 |
|
|
38 |
|
- |
private boolean enabled = true; |
|
21 |
+ |
protected boolean enabled = true; |
39 |
22 |
|
|
40 |
23 |
|
private State visibility = State.Visible; |
41 |
24 |
|
private StateInputField currentStyleState; |
42 |
25 |
|
|
43 |
|
- |
private CompleteInputFieldAccessor<T> completeInputFieldAccessor; |
44 |
|
- |
|
45 |
|
- |
protected final List<HasName> namedWidgets = new ArrayList<HasName>(); |
46 |
|
- |
|
47 |
26 |
|
@Override |
48 |
|
- |
public State getVisibility() { |
|
27 |
+ |
public final State getVisibility() { |
49 |
28 |
|
return visibility; |
50 |
29 |
|
} |
51 |
30 |
|
|
52 |
31 |
|
@Override |
53 |
|
- |
public void setVisibility(State visibility) { |
|
32 |
+ |
public final void setVisibility(State visibility) { |
54 |
33 |
|
visibility = ObjectUtils.deNull(visibility, State.Visible); |
55 |
34 |
|
Panel container = getContainer(); |
56 |
35 |
|
if (container != null) { |
|
@@ -63,64 +42,6 @@ |
63 |
42 |
|
// Configuration Methods |
64 |
43 |
|
|
65 |
44 |
|
@Override |
66 |
|
- |
public final String getName() { |
67 |
|
- |
return name; |
68 |
|
- |
} |
69 |
|
- |
|
70 |
|
- |
@Override |
71 |
|
- |
public final void setName(String name) { |
72 |
|
- |
assertBuildMode("setName"); |
73 |
|
- |
setValidatedName(Validate.noEmptyIdentifier("Name", name)); |
74 |
|
- |
} |
75 |
|
- |
|
76 |
|
- |
@Override |
77 |
|
- |
public final C name(String name) { |
78 |
|
- |
assertBuildMode("name"); |
79 |
|
- |
setValidatedName(Validate.noEmptyIdentifier("Name", name)); |
80 |
|
- |
return inheritanceLeaf(); |
81 |
|
- |
} |
82 |
|
- |
|
83 |
|
- |
protected void setValidatedName(String name) { |
84 |
|
- |
this.name = name; |
85 |
|
- |
} |
86 |
|
- |
|
87 |
|
- |
/** |
88 |
|
- |
* The 'Builder' to 'Run' state transition method fully constructs/populates the InputField's Widget / container. |
89 |
|
- |
* |
90 |
|
- |
* @return this for method chaining |
91 |
|
- |
*/ |
92 |
|
- |
@Override |
93 |
|
- |
public final void init(E13nResolver resolver) { |
94 |
|
- |
Validate.notNull("resolver", resolver); |
95 |
|
- |
if (name == null) { |
96 |
|
- |
throw new IllegalStateException("Unable to init, Name not set"); |
97 |
|
- |
} |
98 |
|
- |
assertBuildMode("init"); |
99 |
|
- |
|
100 |
|
- |
resolver = new OptionallyPrefixingE13nResolver(name, resolver); // add our name to keys! |
101 |
|
- |
|
102 |
|
- |
completeInputFieldAccessor = buildActualWidget(resolver); |
103 |
|
- |
completeInputFieldAccessor.init(enabled, // propagate current enabled state |
104 |
|
- |
new FocusChangedListener() { |
105 |
|
- |
@Override |
106 |
|
- |
public void focusChanged() { |
107 |
|
- |
processFocusChanged(); |
108 |
|
- |
} |
109 |
|
- |
}); |
110 |
|
- |
completeInputFieldAccessor.getInput().addChangeHandler(new ChangeHandler() { |
111 |
|
- |
@Override |
112 |
|
- |
public void onChange(ChangeEvent event) { |
113 |
|
- |
processDataChanged(); |
114 |
|
- |
} |
115 |
|
- |
}); |
116 |
|
- |
} |
117 |
|
- |
|
118 |
|
- |
@Override |
119 |
|
- |
public final boolean isRunMode() { |
120 |
|
- |
return (completeInputFieldAccessor != null); |
121 |
|
- |
} |
122 |
|
- |
|
123 |
|
- |
@Override |
124 |
45 |
|
public final InputField<T> add(ChangeListener<T> changeListener) { |
125 |
46 |
|
if (changeListener != null) { |
126 |
47 |
|
changeListeners.add(changeListener); |
|
@@ -138,35 +59,7 @@ |
138 |
59 |
|
changeListeners.clear(); |
139 |
60 |
|
} |
140 |
61 |
|
|
141 |
|
- |
@Override |
142 |
|
- |
public final ValueValidator<T>[] getValidators() { |
143 |
|
- |
return ObjectUtils.cast(validators.isEmpty() ? ValueValidator.EMPTY_ARRAY : validators.toArray(new ValueValidator[validators.size()])); |
144 |
|
- |
} |
145 |
|
- |
|
146 |
|
- |
@Override |
147 |
|
- |
public final InputField<T> add(ValueValidator<T> validator) { |
148 |
|
- |
if (validator != null) { |
149 |
|
- |
validators.add(validator); |
150 |
|
- |
validatorAdded(validator); |
151 |
|
- |
} |
152 |
|
- |
return this; |
153 |
|
- |
} |
154 |
|
- |
|
155 |
|
- |
@Override |
156 |
|
- |
public final InputField<T> add(ValueValidator<T>... additionalValidators) { |
157 |
|
- |
if (additionalValidators != null) { |
158 |
|
- |
for (ValueValidator<T> validator : additionalValidators) { |
159 |
|
- |
add(validator); // null OK will be filter later |
160 |
|
- |
} |
161 |
|
- |
} |
162 |
|
- |
return this; |
163 |
|
- |
} |
164 |
|
- |
|
165 |
|
- |
abstract protected void validatorAdded(ValueValidator<T> validator); |
166 |
|
- |
|
167 |
|
- |
private Enableable getEnableable() { |
168 |
|
- |
return completeInputFieldAccessor; |
169 |
|
- |
} |
|
62 |
+ |
abstract protected Enableable getEnableable(); |
170 |
63 |
|
|
171 |
64 |
|
// Anytime Methods |
172 |
65 |
|
|
|
@@ -236,152 +129,7 @@ |
236 |
129 |
|
|
237 |
130 |
|
// Only callable in Run Mode |
238 |
131 |
|
|
239 |
|
- |
@Override |
240 |
|
- |
public final void reset() { |
241 |
|
- |
checkRunMode("reset").getInput().setValue(null); |
242 |
|
- |
} |
243 |
|
- |
|
244 |
|
- |
@Override |
245 |
|
- |
public final T setCurrentValue(T value) { |
246 |
|
- |
InputWidgetChangeFilter<T> input = checkRunMode("setCurrentValue").getInput(); |
247 |
|
- |
input.setValue(value); |
248 |
|
- |
return input.getValue(); |
249 |
|
- |
} |
250 |
|
- |
|
251 |
|
- |
@Override |
252 |
|
- |
public final T getCurrentValue() { |
253 |
|
- |
return checkRunMode("getCurrentValue").getInput().getValue(); |
254 |
|
- |
} |
255 |
|
- |
|
256 |
|
- |
@Override |
257 |
|
- |
public final T getBaseValue() { |
258 |
|
- |
return checkRunMode("getBaseValue").getInput().getBaseValue(); |
259 |
|
- |
} |
260 |
|
- |
|
261 |
|
- |
@Override |
262 |
|
- |
public final void revert() { |
263 |
|
- |
InputWidgetChangeFilter<T> input = checkRunMode("revert").getInput(); |
264 |
|
- |
input.setValue(input.getBaseValue()); |
265 |
|
- |
} |
266 |
|
- |
|
267 |
|
- |
@Override |
268 |
|
- |
public final boolean isChanged() { |
269 |
|
- |
return checkRunMode("isChanged").getInput().isChanged(); |
270 |
|
- |
} |
271 |
|
- |
|
272 |
|
- |
@Override |
273 |
|
- |
public final Boolean isFocused() { |
274 |
|
- |
CompleteInputFieldAccessor<T> fieldAccessor = checkRunMode("isFocused"); |
275 |
|
- |
Boolean focused = fieldAccessor.isFocused(); |
276 |
|
- |
return Boolean.TRUE.equals(focused) ? isVisible() : focused; |
277 |
|
- |
} |
278 |
|
- |
|
279 |
|
- |
@Override |
280 |
|
- |
public final boolean isErrored() { |
281 |
|
- |
return (null != checkRunMode("isErrored").getValidator().getErrorData()); |
282 |
|
- |
} |
283 |
|
- |
|
284 |
|
- |
@Override |
285 |
|
- |
public final boolean validate() { |
286 |
|
- |
CompleteInputFieldAccessor<T> fieldAccessor = checkRunMode("validate"); |
287 |
|
- |
E13nData error = fieldAccessor.getValidator().validate(); |
288 |
|
- |
updateStyle(fieldAccessor); |
289 |
|
- |
updateErrorLabel(fieldAccessor.getErrorLabel(), error); |
290 |
|
- |
return (error == null); |
291 |
|
- |
} |
292 |
|
- |
|
293 |
|
- |
@Override |
294 |
|
- |
public final boolean setFocused() { |
295 |
|
- |
CompleteInputFieldAccessor<T> fieldAccessor = checkRunMode("setFocused"); |
296 |
|
- |
return isVisible() && fieldAccessor.setFocused(); |
297 |
|
- |
} |
298 |
|
- |
|
299 |
|
- |
@Override |
300 |
|
- |
public final E13nResolver getE13nResolver() { |
301 |
|
- |
return checkRunMode("E13nResolver").getE13nResolver(); |
302 |
|
- |
} |
303 |
|
- |
|
304 |
|
- |
@Override |
305 |
|
- |
public final Widget getInputWidget() { |
306 |
|
- |
return checkRunMode("InputWidget").getInputWidget(); |
307 |
|
- |
} |
308 |
|
- |
|
309 |
|
- |
@Override |
310 |
|
- |
public final InputWidgetChangeFilter<T> getInput() { |
311 |
|
- |
return checkRunMode("Input").getInput(); |
312 |
|
- |
} |
313 |
|
- |
|
314 |
|
- |
@Override |
315 |
|
- |
public final InputWidgetValidator<T> getValidator() { |
316 |
|
- |
return checkRunMode("Validator").getValidator(); |
317 |
|
- |
} |
318 |
|
- |
|
319 |
|
- |
@Override |
320 |
|
- |
public final Widget getLabelLabel() { |
321 |
|
- |
return checkRunMode("LabelLabel").getLabelLabel(); |
322 |
|
- |
} |
323 |
|
- |
|
324 |
|
- |
@Override |
325 |
|
- |
public final Widget getExtendedLabel() { |
326 |
|
- |
return checkRunMode("ExtendedLabel").getExtendedLabel(); |
327 |
|
- |
} |
328 |
|
- |
|
329 |
|
- |
@Override |
330 |
|
- |
public final Widget getExampleLabel() { |
331 |
|
- |
return checkRunMode("ExampleLabel").getExampleLabel(); |
332 |
|
- |
} |
333 |
|
- |
|
334 |
|
- |
@Override |
335 |
|
- |
public final Widget getErrorLabel() { |
336 |
|
- |
return checkRunMode("ErrorLabel").getErrorLabel(); |
337 |
|
- |
} |
338 |
|
- |
|
339 |
|
- |
@Override |
340 |
|
- |
public final Widget getHelpWidget() { |
341 |
|
- |
return checkRunMode("HelpWidget").getHelpWidget(); |
342 |
|
- |
} |
343 |
|
- |
|
344 |
|
- |
@Override |
345 |
|
- |
public NameToID addNamedWidgetsTo(NameToID nameToID) { |
346 |
|
- |
return nameToID.add(namedWidgets); |
347 |
|
- |
} |
348 |
|
- |
|
349 |
|
- |
// Support Methods... |
350 |
|
- |
|
351 |
|
- |
protected final <W extends Widget & HasName> W addNamedWidgetWithStyle(W widget, String style) { |
352 |
|
- |
widget.addStyleName(style); |
353 |
|
- |
return addNamedWidgetWithNameExtension(widget, style); |
354 |
|
- |
} |
355 |
|
- |
|
356 |
|
- |
protected final <W extends HasName> W addNamedWidgetWithNameExtension(W widget, String nameExtension) { |
357 |
|
- |
widget.setName(getName() + "_" + nameExtension); |
358 |
|
- |
return addNamedWidget(widget); |
359 |
|
- |
} |
360 |
|
- |
|
361 |
|
- |
protected final <W extends HasName> W addNamedWidget(W widget) { |
362 |
|
- |
namedWidgets.add(widget); |
363 |
|
- |
return widget; |
364 |
|
- |
} |
365 |
|
- |
|
366 |
|
- |
protected void processDataChanged() { |
367 |
|
- |
updateStyle(checkRunMode("processDataChanged")); |
368 |
|
- |
for (ChangeListener<T> zListener : changeListeners) { |
369 |
|
- |
zListener.changed(this); |
370 |
|
- |
} |
371 |
|
- |
} |
372 |
|
- |
|
373 |
|
- |
protected void processFocusChanged() { |
374 |
|
- |
updateStyle(checkRunMode("processFocusChanged")); |
375 |
|
- |
} |
376 |
|
- |
|
377 |
|
- |
protected void updateStyle(CompleteInputFieldAccessor<T> fieldAccessor) { |
378 |
|
- |
updateStyle(StateInputField.BASE // |
379 |
|
- |
.errored(fieldAccessor.getValidator().getErrorData() != null) // |
380 |
|
- |
.focused(Boolean.TRUE.equals(fieldAccessor.isFocused())) // |
381 |
|
- |
.changed(fieldAccessor.getInput().isChanged())); |
382 |
|
- |
} |
383 |
|
- |
|
384 |
|
- |
protected void updateStyle(StateInputField state) { |
|
132 |
+ |
protected final void updateStyle(StateInputField state) { |
385 |
133 |
|
state = ObjectUtils.deNull(state, StateInputField.BASE); |
386 |
134 |
|
if (state != currentStyleState) { |
387 |
135 |
|
Panel panel = getContainer(); |
|
@@ -395,30 +143,25 @@ |
395 |
143 |
|
} |
396 |
144 |
|
} |
397 |
145 |
|
|
398 |
|
- |
protected String revolve(String method, E13nData error) { |
399 |
|
- |
if (error != null) { |
400 |
|
- |
CompleteInputFieldAccessor<T> fieldAccessor = checkRunMode(method); |
401 |
|
- |
String resolved = fieldAccessor.getE13nResolver().resolve(error); |
402 |
|
- |
return StringUtils.noEmpty(StringUtils.convertNBSPsToSpaces(resolved)); |
|
146 |
+ |
protected final void notifyChangeListeners() { |
|
147 |
+ |
for (ChangeListener<T> zListener : changeListeners) { |
|
148 |
+ |
zListener.changed(this); |
403 |
149 |
|
} |
404 |
|
- |
return null; |
405 |
150 |
|
} |
406 |
151 |
|
|
407 |
152 |
|
protected final void assertBuildMode(String method) { |
408 |
|
- |
if (completeInputFieldAccessor != null) { |
409 |
|
- |
throw new IllegalStateException("Unable to process method '" + method + "' of InputField Named '" + name + "', because no longer in Build Mode (init has already been called)"); |
410 |
|
- |
} |
|
153 |
+ |
assertMode(method, false); |
411 |
154 |
|
} |
412 |
155 |
|
|
413 |
|
- |
protected final CompleteInputFieldAccessor<T> checkRunMode(String method) { |
414 |
|
- |
if (completeInputFieldAccessor == null) { |
415 |
|
- |
throw new IllegalStateException("Unable to access component/method '" + method + "' of InputField Named '" + name + "', because not in Run Mode (init NOT called)"); |
416 |
|
- |
} |
417 |
|
- |
return completeInputFieldAccessor; |
|
156 |
+ |
protected final void assertRunMode(String method) { |
|
157 |
+ |
assertMode(method, true); |
418 |
158 |
|
} |
419 |
159 |
|
|
420 |
|
- |
protected final CompleteInputFieldAccessor<T> checkRunMode() { |
421 |
|
- |
return completeInputFieldAccessor; |
|
160 |
+ |
private void assertMode(String method, boolean expectedRunMode) { |
|
161 |
+ |
if (isRunMode() != expectedRunMode) { |
|
162 |
+ |
throw new IllegalStateException("Unable to access component/method '" + method + "' of InputField Named '" + getName() + // |
|
163 |
+ |
(expectedRunMode ? "', because not in Run Mode (init NOT called)" : "', because no longer in Build Mode (init has already been called)")); |
|
164 |
+ |
} |
422 |
165 |
|
} |
423 |
166 |
|
|
424 |
167 |
|
protected final C inheritanceLeaf() { |
|
@@ -428,6 +171,4 @@ |
428 |
171 |
|
abstract protected Panel getContainer(); |
429 |
172 |
|
|
430 |
173 |
|
abstract protected void updateErrorLabel(Widget errorLabel, E13nData error); |
431 |
|
- |
|
432 |
|
- |
abstract protected CompleteInputFieldAccessor<T> buildActualWidget(E13nResolver resolver); |
433 |
174 |
|
} |