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 */
016 package com.github.gwtbootstrap.client.ui;
017
018 import com.github.gwtbootstrap.client.ui.base.TextBoxBase;
019 import com.google.gwt.dom.client.Document;
020 import com.google.gwt.dom.client.Element;
021 import com.google.gwt.dom.client.TextAreaElement;
022 import com.google.gwt.user.client.ui.RootPanel;
023 import com.google.gwt.user.client.ui.Widget;
024
025 /**
026 * A TextArea for Bootstrap form.
027 *
028 * @since 2.0.4.0
029 * @author ohashi keisuke
030 */
031 public class TextArea extends TextBoxBase {
032
033 /**
034 * Creates a TextArea widget that wraps an existing <textarea>
035 * element.
036 *
037 * This element must already be attached to the document. If the element is
038 * removed from the document, you must call
039 * {@link RootPanel#detachNow(Widget)}.
040 *
041 * @param element
042 * the element to be wrapped
043 */
044 public static TextArea wrap(Element element) {
045 // Assert that the element is attached.
046 assert Document.get().getBody().isOrHasChild(element);
047
048 TextArea textArea = new TextArea(element);
049
050 // Mark it attached and remember it for cleanup.
051 textArea.onAttach();
052 RootPanel.detachOnWindowClose(textArea);
053
054 return textArea;
055 }
056
057 /**
058 * Creates an empty text area.
059 */
060 public TextArea() {
061 super(Document.get().createTextAreaElement());
062 setStyleName("gwt-TextArea");
063 }
064
065 /**
066 * This constructor may be used by subclasses to explicitly use an existing
067 * element. This element must be a <textarea> element.
068 *
069 * @param element
070 * the element to be used
071 */
072 protected TextArea(Element element) {
073 super(element.<Element> cast());
074 TextAreaElement.as(element);
075 }
076
077 /**
078 * Gets the requested width of the text box (this is not an exact value, as
079 * not all characters are created equal).
080 *
081 * @return the requested width, in characters
082 */
083 public int getCharacterWidth() {
084 return getTextAreaElement().getCols();
085 }
086
087 @Override
088 public int getCursorPos() {
089 return getImpl().getTextAreaCursorPos(getElement());
090 }
091
092 @Override
093 public int getSelectionLength() {
094 return getImpl().getTextAreaSelectionLength(getElement());
095 }
096
097 /**
098 * Gets the number of text lines that are visible.
099 *
100 * @return the number of visible lines
101 */
102 public int getVisibleLines() {
103 return getTextAreaElement().getRows();
104 }
105
106 /**
107 * Sets the requested width of the text box (this is not an exact value, as
108 * not all characters are created equal).
109 *
110 * @param width
111 * the requested width, in characters
112 */
113 public void setCharacterWidth(int width) {
114 getTextAreaElement().setCols(width);
115 }
116
117 /**
118 * Sets the number of text lines that are visible.
119 *
120 * @param lines
121 * the number of visible lines
122 */
123 public void setVisibleLines(int lines) {
124 getTextAreaElement().setRows(lines);
125 }
126
127 private TextAreaElement getTextAreaElement() {
128 return getElement().cast();
129 }
130
131 }