001package org.gwtbootstrap3.client.ui.base;
002
003/*
004 * #%L
005 * GwtBootstrap3
006 * %%
007 * Copyright (C) 2013 GwtBootstrap3
008 * %%
009 * Licensed under the Apache License, Version 2.0 (the "License");
010 * you may not use this file except in compliance with the License.
011 * You may obtain a copy of the License at
012 * 
013 *      http://www.apache.org/licenses/LICENSE-2.0
014 * 
015 * Unless required by applicable law or agreed to in writing, software
016 * distributed under the License is distributed on an "AS IS" BASIS,
017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018 * See the License for the specific language governing permissions and
019 * limitations under the License.
020 * #L%
021 */
022
023import java.util.List;
024
025import org.gwtbootstrap3.client.ui.base.helper.StyleHelper;
026import org.gwtbootstrap3.client.ui.base.mixin.BlankValidatorMixin;
027import org.gwtbootstrap3.client.ui.base.mixin.ErrorHandlerMixin;
028import org.gwtbootstrap3.client.ui.base.mixin.IdMixin;
029import org.gwtbootstrap3.client.ui.constants.DeviceSize;
030import org.gwtbootstrap3.client.ui.constants.InputSize;
031import org.gwtbootstrap3.client.ui.form.error.ErrorHandler;
032import org.gwtbootstrap3.client.ui.form.error.ErrorHandlerType;
033import org.gwtbootstrap3.client.ui.form.error.HasErrorHandler;
034import org.gwtbootstrap3.client.ui.form.validator.HasBlankValidator;
035import org.gwtbootstrap3.client.ui.form.validator.HasValidators;
036import org.gwtbootstrap3.client.ui.form.validator.ValidationChangedEvent.ValidationChangedHandler;
037import org.gwtbootstrap3.client.ui.form.validator.Validator;
038
039import com.google.gwt.dom.client.Element;
040import com.google.gwt.editor.client.EditorError;
041import com.google.gwt.editor.client.HasEditorErrors;
042import com.google.gwt.text.shared.Parser;
043import com.google.gwt.text.shared.Renderer;
044import com.google.web.bindery.event.shared.HandlerRegistration;
045
046public class ValueBoxBase<T> extends com.google.gwt.user.client.ui.ValueBoxBase<T> implements HasId, HasReadOnly,
047        HasResponsiveness, HasPlaceholder, HasAutoComplete, HasSize<InputSize>, HasEditorErrors<T>,
048        HasErrorHandler, HasValidators<T>, HasBlankValidator<T> {
049
050    private static final String MAX_LENGTH = "maxlength";
051
052    private final IdMixin<ValueBoxBase<T>> idMixin = new IdMixin<ValueBoxBase<T>>(this);
053
054    private final ErrorHandlerMixin<T> errorHandlerMixin = new ErrorHandlerMixin<T>(this);
055
056    private final BlankValidatorMixin<ValueBoxBase<T>, T> validatorMixin = new BlankValidatorMixin<ValueBoxBase<T>, T>(this,
057        errorHandlerMixin.getErrorHandler());
058
059    /**
060     * Creates a value box that wraps the given browser element handle. This is only used by subclasses.
061     *
062     * @param elem the browser element to wrap
063     */
064    protected ValueBoxBase(final Element elem, final Renderer<T> renderer, final Parser<T> parser) {
065        super(elem, renderer, parser);
066    }
067
068    public void setMaxLength(final int maxLength) {
069        getElement().setAttribute(MAX_LENGTH, Integer.toString(maxLength));
070    }
071
072    @Override
073    public void setPlaceholder(final String placeHolder) {
074        getElement().setAttribute(PLACEHOLDER, placeHolder != null ? placeHolder : "");
075    }
076
077    @Override
078    public String getPlaceholder() {
079        return getElement().getAttribute(PLACEHOLDER);
080    }
081
082    @Override
083    public void setAutoComplete(final boolean autoComplete) {
084        getElement().setAttribute(AUTO_COMPLETE, autoComplete ? ON : OFF);
085    }
086
087    @Override
088    public String getAutoComplete() {
089        return getElement().getAttribute(AUTO_COMPLETE);
090    }
091
092    @Override
093    public void setId(final String id) {
094        idMixin.setId(id);
095    }
096
097    @Override
098    public String getId() {
099        return idMixin.getId();
100    }
101
102    @Override
103    public void setVisibleOn(final DeviceSize deviceSize) {
104        StyleHelper.setVisibleOn(this, deviceSize);
105    }
106
107    @Override
108    public void setHiddenOn(final DeviceSize deviceSize) {
109        StyleHelper.setHiddenOn(this, deviceSize);
110    }
111
112    @Override
113    public void setSize(InputSize size) {
114        StyleHelper.addUniqueEnumStyleName(this, InputSize.class, size);
115    }
116
117    @Override
118    public InputSize getSize() {
119        return InputSize.fromStyleName(getStyleName());
120    }
121
122    /** {@inheritDoc} */
123    @Override
124    public void setValue(T value, boolean fireEvents) {
125        errorHandlerMixin.clearErrors();
126        super.setValue(value, fireEvents);
127    }
128
129    /** {@inheritDoc} */
130    @Override
131    public void showErrors(List<EditorError> errors) {
132        errorHandlerMixin.showErrors(errors);
133    }
134
135    /** {@inheritDoc} */
136    @Override
137    public ErrorHandler getErrorHandler() {
138        return errorHandlerMixin.getErrorHandler();
139    }
140
141    /** {@inheritDoc} */
142    @Override
143    public void setErrorHandler(ErrorHandler handler) {
144        errorHandlerMixin.setErrorHandler(handler);
145        validatorMixin.setErrorHandler(handler);
146    }
147
148    /** {@inheritDoc} */
149    @Override
150    public ErrorHandlerType getErrorHandlerType() {
151        return errorHandlerMixin.getErrorHandlerType();
152    }
153
154    /** {@inheritDoc} */
155    @Override
156    public void setErrorHandlerType(ErrorHandlerType type) {
157        errorHandlerMixin.setErrorHandlerType(type);
158    }
159
160    @Override
161    public void setAllowBlank(boolean allowBlank) {
162        validatorMixin.setAllowBlank(allowBlank);
163    }
164
165    @Override
166    public boolean getAllowBlank() {
167        return validatorMixin.getAllowBlank();
168    }
169
170    @Override
171    public void addValidator(Validator<T> validator) {
172        validatorMixin.addValidator(validator);
173    }
174    
175    /** {@inheritDoc} */
176    @Override
177    public boolean removeValidator(Validator<T> validator) {
178        return validatorMixin.removeValidator(validator);
179    }
180
181    @Override
182    public boolean getValidateOnBlur() {
183        return validatorMixin.getValidateOnBlur();
184    }
185
186    @Override
187    public void setValidateOnBlur(boolean validateOnBlur) {
188        validatorMixin.setValidateOnBlur(validateOnBlur);
189    }
190
191    @Override
192    public void setValidators(@SuppressWarnings("unchecked") Validator<T>... validators) {
193        validatorMixin.setValidators(validators);
194    }
195
196    @Override
197    public boolean validate() {
198        return validatorMixin.validate();
199    }
200
201    @Override
202    public boolean validate(boolean show) {
203        return validatorMixin.validate(show);
204    }
205
206    @Override
207    public void reset() {
208        setValue(null);
209        validatorMixin.reset();
210    }
211
212    @Override
213    public HandlerRegistration addValidationChangedHandler(ValidationChangedHandler handler) {
214        return validatorMixin.addValidationChangedHandler(handler);
215    }
216
217}