001package gwt.material.design.client.ui;
002
003import com.google.gwt.core.client.Scheduler;
004import com.google.gwt.core.client.Scheduler.ScheduledCommand;
005
006/*
007 * #%L
008 * GwtMaterial
009 * %%
010 * Copyright (C) 2015 GwtMaterialDesign
011 * %%
012 * Licensed under the Apache License, Version 2.0 (the "License");
013 * you may not use this file except in compliance with the License.
014 * You may obtain a copy of the License at
015 * 
016 *      http://www.apache.org/licenses/LICENSE-2.0
017 * 
018 * Unless required by applicable law or agreed to in writing, software
019 * distributed under the License is distributed on an "AS IS" BASIS,
020 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
021 * See the License for the specific language governing permissions and
022 * limitations under the License.
023 * #L%
024 */
025
026import com.google.gwt.dom.client.Document;
027import com.google.gwt.dom.client.Style;
028import com.google.gwt.editor.client.EditorError;
029import com.google.gwt.editor.client.HasEditorErrors;
030import com.google.gwt.editor.client.IsEditor;
031import com.google.gwt.editor.ui.client.adapters.ValueBoxEditor;
032import com.google.gwt.event.dom.client.*;
033import com.google.gwt.event.logical.shared.ValueChangeEvent;
034import com.google.gwt.event.logical.shared.ValueChangeHandler;
035import com.google.gwt.event.shared.HandlerRegistration;
036import com.google.gwt.i18n.client.AutoDirectionHandler;
037import com.google.gwt.i18n.shared.DirectionEstimator;
038import com.google.gwt.i18n.shared.HasDirectionEstimator;
039import com.google.gwt.uibinder.client.UiChild;
040import com.google.gwt.user.client.DOM;
041import com.google.gwt.user.client.ui.*;
042import com.google.gwt.user.client.ui.ValueBoxBase;
043import com.google.gwt.user.client.ui.ValueBoxBase.TextAlignment;
044import gwt.material.design.client.base.*;
045import gwt.material.design.client.base.error.*;
046import gwt.material.design.client.base.error.ErrorHandler;
047import gwt.material.design.client.base.mixin.BlankValidatorMixin;
048import gwt.material.design.client.base.mixin.CounterMixin;
049import gwt.material.design.client.base.mixin.ErrorHandlerMixin;
050import gwt.material.design.client.base.mixin.ErrorMixin;
051import gwt.material.design.client.base.mixin.FocusableMixin;
052import gwt.material.design.client.base.validator.HasBlankValidator;
053import gwt.material.design.client.base.validator.HasValidators;
054import gwt.material.design.client.base.validator.ValidationChangedEvent.ValidationChangedHandler;
055import gwt.material.design.client.base.validator.Validator;
056import gwt.material.design.client.constants.IconPosition;
057import gwt.material.design.client.constants.IconSize;
058import gwt.material.design.client.constants.IconType;
059import gwt.material.design.client.constants.InputType;
060import gwt.material.design.client.ui.html.Label;
061
062import java.util.List;
063
064//@formatter:off
065
066/**
067 * Material Text Box is an input field that accepts any text based string from user.
068 * <h3>UiBinder Usage:</h3>
069 * <pre>
070 *{@code <m:MaterialTextBox placeholder="First Name" />}
071 * </pre>
072 * @see <a href="http://gwt-material-demo.herokuapp.com/#forms">Material TextBox</a>
073 * @author kevzlou7979
074 * @author Ben Dol
075 * @author paulux84
076 */
077//@formatter:on
078public class MaterialValueBox<T> extends MaterialWidget implements HasChangeHandlers, HasName, HasDirectionEstimator,
079        HasValue<T>, HasText, AutoDirectionHandler.Target, IsEditor<ValueBoxEditor<T>>, HasKeyUpHandlers,
080        HasClickHandlers, HasDoubleClickHandlers, HasAllDragAndDropHandlers, HasAllFocusHandlers, HasIcon,
081        HasAllGestureHandlers, HasAllKeyHandlers, HasAllMouseHandlers, HasAllTouchHandlers, HasError, HasInputType,
082        HasPlaceholder, HasCounter, HasEditorErrors<T>, HasErrorHandler, HasValidators<T>, HasBlankValidator {
083
084    private String placeholder;
085    private InputType type = InputType.TEXT;
086
087    private ValueBoxEditor<T> editor;
088    private Label label = new Label();
089    private MaterialLabel lblName = new MaterialLabel();
090    private MaterialLabel lblError = new MaterialLabel();
091    private MaterialIcon icon = new MaterialIcon();
092
093    private final CounterMixin<MaterialValueBox<T>> counterMixin = new CounterMixin<>(this);
094    private final ErrorHandlerMixin<T> errorHandlerMixin = new ErrorHandlerMixin<>(this);
095    private final BlankValidatorMixin<MaterialValueBox<T>, T> validatorMixin = new BlankValidatorMixin<>(this,
096            errorHandlerMixin.getErrorHandler());
097
098    @Ignore protected ValueBoxBase<T> valueBoxBase;
099
100    private FocusableMixin<MaterialWidget> focusableMixin;
101
102    public class MaterialValueBoxEditor<V> extends ValueBoxEditor<V> {
103        private final ValueBoxBase<V> valueBoxBase;
104
105        private MaterialValueBoxEditor(ValueBoxBase<V> valueBoxBase) {
106            super(valueBoxBase);
107            this.valueBoxBase = valueBoxBase;
108        }
109
110        @Override
111        public void setValue(V value) {
112            super.setValue(value);
113            if (this.valueBoxBase.getText() != null && !this.valueBoxBase.getText().isEmpty()) {
114                label.addStyleName("active");
115            } else {
116                label.removeStyleName("active");
117            }
118        }
119    }
120
121    private final ErrorMixin<MaterialValueBox<T>, MaterialLabel> errorMixin = new ErrorMixin<>(this, lblError, valueBoxBase);
122
123    protected MaterialValueBox() {
124        super(Document.get().createDivElement(), "input-field");
125    }
126
127    public MaterialValueBox(ValueBoxBase<T> tValueBox) {
128        this();
129        initValueBox(tValueBox);
130    }
131
132    public void initValueBox(ValueBoxBase<T> tValueBox) {
133        valueBoxBase = tValueBox;
134        add(valueBoxBase);
135    }
136
137    @Deprecated
138    @UiChild(limit = 1)
139    public void addValueBox(ValueBoxBase<T> widget) {
140        initValueBox(widget);
141    }
142
143    @Override
144    public void onLoad() {
145        super.onLoad();
146
147        String id = DOM.createUniqueId();
148        valueBoxBase.getElement().setId(id);
149        label.getElement().setAttribute("for", id);
150
151        // Make valueBoxBase the primary focus target
152        getFocusableMixin().setUiObject(new MaterialWidget(valueBoxBase.getElement()));
153    }
154
155    /**
156     * Resets the textbox by removing its content and resetting visual state.
157     */
158    public void clear() {
159        valueBoxBase.setText("");
160        clearErrorOrSuccess();
161        label.removeStyleName("active");
162    }
163
164    public void removeErrorModifiers() {
165        valueBoxBase.getElement().removeClassName("valid");
166        valueBoxBase.getElement().removeClassName("invalid");
167        lblName.removeStyleName("green-text");
168        lblName.removeStyleName("red-text");
169    }
170
171    @Override
172    public String getText() {
173        return valueBoxBase.getText();
174    }
175
176    @Override
177    public void setText(String text) {
178        valueBoxBase.setText(text);
179
180        if (text != null && !text.isEmpty()) {
181            label.addStyleName("active");
182        }
183    }
184
185    @Override
186    public String getPlaceholder() {
187        return placeholder;
188    }
189
190    @Override
191    public void setPlaceholder(String placeholder) {
192        this.placeholder = placeholder;
193        if(getType() != InputType.SEARCH) {
194            lblName.setText(placeholder);
195        } else {
196            valueBoxBase.getElement().setAttribute("placeholder", placeholder);
197        }
198    }
199
200    @Override
201    public InputType getType() {
202        return type;
203    }
204
205    @Override
206    public void setType(InputType type) {
207        this.type = type;
208        valueBoxBase.getElement().setAttribute("type", type.getType());
209        if(getType() != InputType.SEARCH) {
210            add(label);
211            label.add(lblName);
212            lblError.setVisible(false);
213            add(lblError);
214        }
215    }
216
217    @Override
218    public HandlerRegistration addValueChangeHandler(final ValueChangeHandler<T> handler) {
219        return valueBoxBase.addValueChangeHandler(new ValueChangeHandler<T>() {
220            @Override
221            public void onValueChange(ValueChangeEvent<T> event) {
222                if(isEnabled()){
223                    handler.onValueChange(event);
224                }
225            }
226        });
227    }
228
229    @Override
230    public T getValue() {
231        return valueBoxBase.getValue();
232    }
233
234    @Override
235    public void setValue(T value) {
236        setValue(value, false);
237    }
238
239    @Override
240    public void setValue(T value, boolean fireEvents) {
241        valueBoxBase.setValue(value, fireEvents);
242
243        if (value != null && !value.toString().isEmpty()) {
244            label.addStyleName("active");
245        }
246    }
247
248    @Override
249    public void setDirection(Direction direction) {
250        valueBoxBase.setDirection(direction);
251    }
252
253    @Override
254    public Direction getDirection() {
255        return valueBoxBase.getDirection();
256    }
257
258    @Override
259    public ValueBoxEditor<T> asEditor() {
260        if (editor == null) {
261            editor = new MaterialValueBoxEditor<>(valueBoxBase);
262        }
263        return editor;
264    }
265
266    @Override
267    public DirectionEstimator getDirectionEstimator() {
268        return valueBoxBase.getDirectionEstimator();
269    }
270
271    @Override
272    public void setDirectionEstimator(boolean enabled) {
273        valueBoxBase.setDirectionEstimator(enabled);
274    }
275
276    @Override
277    public void setDirectionEstimator(DirectionEstimator directionEstimator) {
278        valueBoxBase.setDirectionEstimator(directionEstimator);
279    }
280
281    @Override
282    public void setName(String name) {
283        valueBoxBase.setName(name);
284    }
285
286    @Override
287    public String getName() {
288        return valueBoxBase.getName();
289    }
290
291    @Override
292    public HandlerRegistration addKeyUpHandler(final KeyUpHandler handler) {
293        return addDomHandler(new KeyUpHandler() {
294            @Override
295            public void onKeyUp(KeyUpEvent event) {
296                if(isEnabled()){
297                    handler.onKeyUp(event);
298                }
299            }
300        }, KeyUpEvent.getType());
301    }
302
303    @Override
304    public HandlerRegistration addChangeHandler(final ChangeHandler handler) {
305        return valueBoxBase.addChangeHandler(new ChangeHandler() {
306            @Override
307            public void onChange(ChangeEvent event) {
308                if(isEnabled()){
309                    handler.onChange(event);
310                }
311            }
312        });
313    }
314
315    @Override
316    public HandlerRegistration addDragEndHandler(final DragEndHandler handler) {
317        return valueBoxBase.addDragEndHandler(new DragEndHandler() {
318            @Override
319            public void onDragEnd(DragEndEvent event) {
320                if(isEnabled()){
321                    handler.onDragEnd(event);
322                }
323            }
324        });
325    }
326
327    @Override
328    public HandlerRegistration addDragEnterHandler(final DragEnterHandler handler) {
329        return valueBoxBase.addDragEnterHandler(new DragEnterHandler() {
330            @Override
331            public void onDragEnter(DragEnterEvent event) {
332                if(isEnabled()){
333                    handler.onDragEnter(event);
334                }
335            }
336        });
337    }
338
339    @Override
340    public HandlerRegistration addDragLeaveHandler(final DragLeaveHandler handler) {
341        return valueBoxBase.addDragLeaveHandler(new DragLeaveHandler() {
342            @Override
343            public void onDragLeave(DragLeaveEvent event) {
344                if(isEnabled()) {
345                    handler.onDragLeave(event);
346                }
347            }
348        });
349    }
350
351    @Override
352    public HandlerRegistration addDragHandler(final DragHandler handler) {
353        return valueBoxBase.addDragHandler(new DragHandler() {
354            @Override
355            public void onDrag(final DragEvent event) {
356                if(isEnabled()){
357                    handler.onDrag(event);
358                }
359            }
360        });
361    }
362
363    @Override
364    public HandlerRegistration addDragOverHandler(final DragOverHandler handler) {
365        return valueBoxBase.addDragOverHandler(new DragOverHandler() {
366            @Override
367            public void onDragOver(DragOverEvent event) {
368                if(isEnabled()){
369                    handler.onDragOver(event);
370                }
371            }
372        });
373    }
374
375    @Override
376    public HandlerRegistration addDragStartHandler(final DragStartHandler handler) {
377        return valueBoxBase.addDragStartHandler(new DragStartHandler() {
378            @Override
379            public void onDragStart(DragStartEvent event) {
380                if(isEnabled()){
381                    handler.onDragStart(event);
382                }
383            }
384        });
385    }
386
387    @Override
388    public HandlerRegistration addDropHandler(final DropHandler handler) {
389        return valueBoxBase.addDropHandler(new DropHandler() {
390            @Override
391            public void onDrop(DropEvent event) {
392                if(isEnabled()){
393                    handler.onDrop(event);
394                }
395            }
396        });
397    }
398
399    @Override
400    public HandlerRegistration addFocusHandler(final FocusHandler handler) {
401        return valueBoxBase.addFocusHandler(new FocusHandler() {
402            @Override
403            public void onFocus(FocusEvent event) {
404                if(isEnabled()){
405                    handler.onFocus(event);
406                }
407            }
408        });
409    }
410
411    @Override
412    public HandlerRegistration addBlurHandler(final BlurHandler handler) {
413        return valueBoxBase.addBlurHandler(new BlurHandler() {
414            @Override
415            public void onBlur(BlurEvent event) {
416                if(isEnabled()){
417                    handler.onBlur(event);
418                }
419            }
420        });
421    }
422
423    @Override
424    public HandlerRegistration addGestureStartHandler(final GestureStartHandler handler) {
425        return valueBoxBase.addGestureStartHandler(new GestureStartHandler() {
426            @Override
427            public void onGestureStart(GestureStartEvent event) {
428                if(isEnabled()){
429                    handler.onGestureStart(event);
430                }
431            }
432        });
433    }
434
435    @Override
436    public HandlerRegistration addGestureChangeHandler(final GestureChangeHandler handler) {
437        return valueBoxBase.addGestureChangeHandler(new GestureChangeHandler() {
438            @Override
439            public void onGestureChange(GestureChangeEvent event) {
440                if(isEnabled()){
441                    handler.onGestureChange(event);
442                }
443            }
444        });
445    }
446
447    @Override
448    public HandlerRegistration addGestureEndHandler(final GestureEndHandler handler) {
449        return valueBoxBase.addGestureEndHandler(new GestureEndHandler() {
450            @Override
451            public void onGestureEnd(GestureEndEvent event) {
452                if(isEnabled()){
453                    handler.onGestureEnd(event);
454                }
455            }
456        });
457    }
458
459    @Override
460    public HandlerRegistration addKeyDownHandler(final KeyDownHandler handler) {
461        return valueBoxBase.addKeyDownHandler(new KeyDownHandler() {
462            @Override
463            public void onKeyDown(KeyDownEvent event) {
464                if(isEnabled()){
465                    handler.onKeyDown(event);
466                }
467            }
468        });
469    }
470
471    @Override
472    public HandlerRegistration addKeyPressHandler(final KeyPressHandler handler) {
473        return valueBoxBase.addKeyPressHandler(new KeyPressHandler() {
474            @Override
475            public void onKeyPress(KeyPressEvent event) {
476                if(isEnabled()){
477                    handler.onKeyPress(event);
478                }
479            }
480        });
481    }
482
483    @Override
484    public HandlerRegistration addMouseDownHandler(final MouseDownHandler handler) {
485        return valueBoxBase.addMouseDownHandler(new MouseDownHandler() {
486            @Override
487            public void onMouseDown(MouseDownEvent event) {
488                if(isEnabled()){
489                    handler.onMouseDown(event);
490                }
491            }
492        });
493    }
494
495    @Override
496    public HandlerRegistration addMouseUpHandler(final MouseUpHandler handler) {
497        return valueBoxBase.addMouseUpHandler(new MouseUpHandler() {
498            @Override
499            public void onMouseUp(MouseUpEvent event) {
500                if(isEnabled()){
501                    handler.onMouseUp(event);
502                }
503            }
504        });
505    }
506
507    @Override
508    public HandlerRegistration addMouseOutHandler(final MouseOutHandler handler) {
509        return valueBoxBase.addMouseOutHandler(new MouseOutHandler() {
510            @Override
511            public void onMouseOut(MouseOutEvent event) {
512                if(isEnabled()){
513                    handler.onMouseOut(event);
514                }
515            }
516        });
517    }
518
519    @Override
520    public HandlerRegistration addMouseOverHandler(final MouseOverHandler handler) {
521        return valueBoxBase.addMouseOverHandler(new MouseOverHandler() {
522            @Override
523            public void onMouseOver(MouseOverEvent event) {
524                if(isEnabled()){
525                    handler.onMouseOver(event);
526                }
527            }
528        });
529    }
530
531    @Override
532    public HandlerRegistration addMouseMoveHandler(final MouseMoveHandler handler) {
533        return valueBoxBase.addMouseMoveHandler(new MouseMoveHandler() {
534            @Override
535            public void onMouseMove(MouseMoveEvent event) {
536                if(isEnabled()){
537                    handler.onMouseMove(event);
538                }
539            }
540        });
541    }
542
543    @Override
544    public HandlerRegistration addMouseWheelHandler(final MouseWheelHandler handler) {
545        return valueBoxBase.addMouseWheelHandler(new MouseWheelHandler() {
546            @Override
547            public void onMouseWheel(MouseWheelEvent event) {
548                if(isEnabled()){
549                    handler.onMouseWheel(event);
550                }
551            }
552        });
553    }
554
555    @Override
556    public HandlerRegistration addTouchStartHandler(final TouchStartHandler handler) {
557        return valueBoxBase.addTouchStartHandler(new TouchStartHandler() {
558            @Override
559            public void onTouchStart(TouchStartEvent event) {
560                if(isEnabled()){
561                    handler.onTouchStart(event);
562                }
563            }
564        });
565    }
566
567    @Override
568    public HandlerRegistration addTouchMoveHandler(final TouchMoveHandler handler) {
569        return valueBoxBase.addTouchMoveHandler(new TouchMoveHandler() {
570            @Override
571            public void onTouchMove(TouchMoveEvent event) {
572                if(isEnabled()){
573                    handler.onTouchMove(event);
574                }
575            }
576        });
577    }
578
579    @Override
580    public HandlerRegistration addTouchEndHandler(final TouchEndHandler handler) {
581        return valueBoxBase.addTouchEndHandler(new TouchEndHandler() {
582            @Override
583            public void onTouchEnd(TouchEndEvent event) {
584                if(isEnabled()){
585                    handler.onTouchEnd(event);
586                }
587            }
588        });
589    }
590
591    @Override
592    public HandlerRegistration addTouchCancelHandler(final TouchCancelHandler handler) {
593        return valueBoxBase.addTouchCancelHandler(new TouchCancelHandler() {
594            @Override
595            public void onTouchCancel(TouchCancelEvent event) {
596                if(isEnabled()){
597                    handler.onTouchCancel(event);
598                }
599            }
600        });
601    }
602
603    @Override
604    public HandlerRegistration addDoubleClickHandler(final DoubleClickHandler handler) {
605        return valueBoxBase.addDoubleClickHandler(new DoubleClickHandler() {
606            @Override
607            public void onDoubleClick(DoubleClickEvent event) {
608                if(isEnabled()){
609                    handler.onDoubleClick(event);
610                }
611            }
612        });
613    }
614
615    @Override
616    public HandlerRegistration addClickHandler(final ClickHandler handler) {
617        return valueBoxBase.addClickHandler(new ClickHandler() {
618            @Override
619            public void onClick(ClickEvent event) {
620                if(isEnabled()){
621                    handler.onClick(event);
622                }
623            }
624        });
625    }
626
627    @Override
628    public void setError(String error) {
629        errorMixin.setError(error);
630
631        removeErrorModifiers();
632        lblName.setStyleName("red-text");
633        valueBoxBase.getElement().addClassName("invalid");
634    }
635
636    @Override
637    public void setSuccess(String success) {
638        errorMixin.setSuccess(success);
639
640        removeErrorModifiers();
641        lblName.setStyleName("green-text");
642        valueBoxBase.getElement().addClassName("valid");
643    }
644
645    @Override
646    public void setHelperText(String helperText) {
647        errorMixin.setHelperText(helperText);
648    }
649
650    @Override
651    public void clearErrorOrSuccess() {
652        errorMixin.clearErrorOrSuccess();
653        removeErrorModifiers();
654    }
655
656    @Override
657    public MaterialIcon getIcon() {
658        return icon;
659    }
660
661    @Override
662    public void setIconType(IconType iconType) {
663        icon.setIconType(iconType);
664        icon.setIconPrefix(true);
665        lblError.setPaddingLeft(44);
666        insert(icon, 0);
667    }
668
669    @Override
670    public void setIconPosition(IconPosition position) {
671        icon.setIconPosition(position);
672    }
673
674    @Override
675    public void setIconSize(IconSize size) {
676        icon.setIconSize(size);
677    }
678
679    @Override
680    public void setIconFontSize(double size, Style.Unit unit) {
681        icon.setIconFontSize(size, unit);
682    }
683
684    @Override
685    public void setIconColor(String iconColor) {
686        icon.setIconColor(iconColor);
687    }
688
689    @Override
690    public void setIconPrefix(boolean prefix) {
691        icon.setIconPrefix(prefix);
692    }
693
694    @Override
695    public boolean isIconPrefix() {
696        return icon.isIconPrefix();
697    }
698
699    @Override
700    public void setLength(int length) {
701        counterMixin.setLength(length);
702    }
703
704    @Override
705    public int getLength() {
706        return counterMixin.getLength();
707    }
708
709    @Ignore
710    public ValueBoxBase<T> asValueBoxBase() {
711        return valueBoxBase;
712    }
713
714    @Override
715    public void showErrors(List<EditorError> errors) {
716        errorHandlerMixin.showErrors(errors);
717    }
718
719    @Override
720    public int getTabIndex() {
721        return valueBoxBase.getTabIndex();
722    }
723
724    @Override
725    public void setAccessKey(char key) {
726        valueBoxBase.setAccessKey(key);
727    }
728
729    @Override
730    public void setFocus(final boolean focused) {
731        Scheduler.get().scheduleDeferred(new ScheduledCommand() {
732            @Override
733            public void execute() {
734                valueBoxBase.setFocus(focused);
735                if (focused) {
736                    label.addStyleName("active");
737                } else {
738                    updateLabelActiveStyle();
739                }
740            }
741        });
742    }
743
744    /**
745     * Updates the style of the field label according to the field value if the
746     * field value is empty - null or "" - removes the label 'active' style else
747     * will add the 'active' style to the field label.
748     */
749    protected void updateLabelActiveStyle() {
750        if (this.valueBoxBase.getText() != null && !this.valueBoxBase.getText().isEmpty()) {
751            label.addStyleName("active");
752        } else {
753            label.removeStyleName("active");
754        }
755    }
756
757    public String getSelectedText() {
758        return valueBoxBase.getSelectedText();
759    }
760
761    public int getSelectionLength() {
762        return valueBoxBase.getSelectionLength();
763    }
764
765    public void setSelectionRange(int pos, int length) {
766        valueBoxBase.setSelectionRange(pos, length);
767    }
768
769    public void setReadOnly(boolean readOnly) {
770        valueBoxBase.setReadOnly(readOnly);
771    }
772
773    public boolean isReadOnly() {
774        return valueBoxBase.isReadOnly();
775    }
776
777    public void setCursorPos(int pos) {
778        valueBoxBase.setCursorPos(pos);
779    }
780
781    public void setAlignment(TextAlignment align) {
782        valueBoxBase.setAlignment(align);
783    }
784
785    @Override
786    public void setTabIndex(int tabIndex) {
787        valueBoxBase.setTabIndex(tabIndex);
788    }
789
790    @Override
791    public void setEnabled(boolean enabled) {
792        super.setEnabled(enabled);
793        valueBoxBase.setEnabled(enabled);
794    }
795
796    @Override
797    public boolean isAllowBlank() {
798        return validatorMixin.isAllowBlank();
799    }
800
801    @Override
802    public void setAllowBlank(boolean allowBlank) {
803        validatorMixin.setAllowBlank(allowBlank);
804    }
805
806    @Override
807    public ErrorHandler getErrorHandler() {
808        return errorHandlerMixin.getErrorHandler();
809    }
810
811    @Override
812    public void setErrorHandler(ErrorHandler errorHandler) {
813        errorHandlerMixin.setErrorHandler(errorHandler);
814    }
815
816    @Override
817    public ErrorHandlerType getErrorHandlerType() {
818        return errorHandlerMixin.getErrorHandlerType();
819    }
820
821    @Override
822    public void setErrorHandlerType(ErrorHandlerType errorHandlerType) {
823        errorHandlerMixin.setErrorHandlerType(errorHandlerType);
824    }
825
826    @Override
827    public void addValidator(Validator<T> validator) {
828        validatorMixin.addValidator(validator);
829    }
830
831    @Override
832    public boolean isValidateOnBlur() {
833        return validatorMixin.isValidateOnBlur();
834    }
835
836    @Override
837    public boolean removeValidator(Validator<T> validator) {
838        return validatorMixin.removeValidator(validator);
839    }
840
841    @Override
842    public void reset() {
843        validatorMixin.reset();
844    }
845
846    @Override
847    public void setValidateOnBlur(boolean validateOnBlur) {
848        validatorMixin.setValidateOnBlur(validateOnBlur);
849    }
850
851    @Override
852    public void setValidators(@SuppressWarnings("unchecked") Validator<T>... validators) {
853        validatorMixin.setValidators(validators);
854    }
855
856    @Override
857    public boolean validate() {
858        return validatorMixin.validate();
859    }
860
861    @Override
862    public boolean validate(boolean show) {
863        return validatorMixin.validate(show);
864    }
865
866    @Override
867    public HandlerRegistration addValidationChangedHandler(ValidationChangedHandler handler) {
868        return (HandlerRegistration)validatorMixin.addValidationChangedHandler(handler);
869    }
870}