001/*
002 *  Copyright 2012 GWT-Bootstrap
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package com.github.gwtbootstrap.client.ui;
017
018import com.github.gwtbootstrap.client.ui.base.ValueBoxBase;
019import com.google.gwt.dom.client.Document;
020import com.google.gwt.dom.client.Element;
021import com.google.gwt.dom.client.InputElement;
022import com.google.gwt.i18n.client.LocaleInfo;
023import com.google.gwt.text.shared.Parser;
024import com.google.gwt.text.shared.Renderer;
025import com.google.gwt.user.client.ui.RootPanel;
026import com.google.gwt.user.client.ui.Widget;
027
028/**
029 * A text box cant parse its displayed value.Support Bootstarp style.
030 * 
031 * It's a same as GWT's {@link com.google.gwt.user.client.ui.ValueBox}.
032 * But support Bootstarp styles.
033 * 
034 * @param <T> the value type
035 * @see com.google.gwt.user.client.ui.ValueBox
036 * @since 2.0.4.0
037 * @author ohashi keisuke
038 */
039public class ValueBox<T> extends ValueBoxBase<T> {
040
041        /**
042         * Creates a ValueBox widget that wraps an existing &lt;input
043         * type='text'&gt; element.
044         * 
045         * This element must already be attached to the document. If the element is
046         * removed from the document, you must call
047         * {@link RootPanel#detachNow(Widget)}.
048         * 
049         * @param element
050         *            the element to be wrapped
051         */
052        public static <T> ValueBox<T> wrap(Element element, Renderer<T> renderer, Parser<T> parser) {
053                // Assert that the element is attached.
054                assert Document.get().getBody().isOrHasChild(element);
055
056                ValueBox<T> valueBox = new ValueBox<T>(element, renderer, parser);
057
058                // Mark it attached and remember it for cleanup.
059                valueBox.onAttach();
060                RootPanel.detachOnWindowClose(valueBox);
061
062                return valueBox;
063        }
064
065        /**
066         * This constructor may be used by subclasses to explicitly use an existing
067         * element. This element must be an &lt;input&gt; element whose type is
068         * 'text'.
069         * 
070         * @param element
071         *            the element to be used
072         */
073        protected ValueBox(Element element,
074                Renderer<T> renderer,
075                Parser<T> parser) {
076                super(element, renderer, parser);
077                // BiDi input is not expected - disable direction estimation.
078                setDirectionEstimator(false);
079                if (LocaleInfo.getCurrentLocale().isRTL()) {
080                        setDirection(Direction.LTR);
081                }
082                assert InputElement.as(element).getType().equalsIgnoreCase("text");
083        }
084
085        /**
086         * Gets the maximum allowable length.
087         * 
088         * @return the maximum length, in characters
089         */
090        public int getMaxLength() {
091                return getInputElement().getMaxLength();
092        }
093
094        /**
095         * Gets the number of visible characters.
096         * 
097         * @return the number of visible characters
098         */
099        public int getVisibleLength() {
100                return getInputElement().getSize();
101        }
102
103        /**
104         * Sets the maximum allowable length.
105         * 
106         * @param length
107         *            the maximum length, in characters
108         */
109        public void setMaxLength(int length) {
110                getInputElement().setMaxLength(length);
111        }
112
113        /**
114         * Sets the number of visible characters.
115         * 
116         * @param length
117         *            the number of visible characters
118         */
119        public void setVisibleLength(int length) {
120                getInputElement().setSize(length);
121        }
122
123        private InputElement getInputElement() {
124                return getElement().cast();
125        }
126
127}