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.HasType;
019 import com.github.gwtbootstrap.client.ui.base.StyleHelper;
020 import com.github.gwtbootstrap.client.ui.constants.ButtonType;
021 import com.github.gwtbootstrap.client.ui.constants.Constants;
022 import com.github.gwtbootstrap.client.ui.resources.ButtonSize;
023 import com.google.gwt.dom.client.Document;
024 import com.google.gwt.dom.client.Element;
025 import com.google.gwt.dom.client.InputElement;
026 import com.google.gwt.event.dom.client.ChangeEvent;
027 import com.google.gwt.event.dom.client.ChangeHandler;
028 import com.google.gwt.event.dom.client.ClickHandler;
029 import com.google.gwt.event.dom.client.HasChangeHandlers;
030 import com.google.gwt.event.logical.shared.ValueChangeEvent;
031 import com.google.gwt.event.logical.shared.ValueChangeHandler;
032 import com.google.gwt.event.shared.HandlerRegistration;
033 import com.google.gwt.safehtml.shared.SafeHtml;
034 import com.google.gwt.user.client.ui.FocusWidget;
035 import com.google.gwt.user.client.ui.HasName;
036 import com.google.gwt.user.client.ui.HasText;
037 import com.google.gwt.user.client.ui.HasValue;
038
039 /**
040 * A SubmitButton for Bootstrap form.
041 *
042 * @since 2.0.4.0
043 * @author ohashi keisuke
044 */
045 public class SubmitButton extends FocusWidget implements HasType<ButtonType>, HasValue<String>, HasText, HasName, HasChangeHandlers {
046
047 private boolean valueChangeHandlerInitialized;
048
049 /**
050 * Creates an submit button with no caption.
051 */
052 public SubmitButton() {
053 super(Document.get().createSubmitInputElement());
054 setStyleName(Constants.BTN);
055 }
056
057 private InputElement asInputElement() {
058 return getElement().cast();
059 }
060
061 /**
062 * This constructor may be used by subclasses to explicitly use an existing
063 * element. This element must be a <input type="submit"> element.
064 *
065 * @param element
066 * the element to be used
067 */
068 protected SubmitButton(Element element) {
069 super(element);
070 assert "submit".equalsIgnoreCase(element.<InputElement> cast().getType());
071 }
072
073 /**
074 * Creates a button with the given HTML caption and click listener.
075 *
076 * @param html
077 * the HTML caption
078 * @param handler
079 * the click handler
080 */
081 public SubmitButton(SafeHtml html,
082 ClickHandler handler) {
083 this(html.asString(), handler);
084 }
085
086 /**
087 * Creates a button with the given HTML caption.
088 *
089 * @param html
090 * the HTML caption
091 */
092 public SubmitButton(SafeHtml html) {
093 this(html.asString());
094 }
095
096 /**
097 * Creates a button with the given Text caption and click listener.
098 *
099 * @param text
100 * the Text caption
101 * @param handler
102 * the click handler
103 */
104 public SubmitButton(String text,
105 ClickHandler handler) {
106 this(text);
107 addClickHandler(handler);
108 }
109
110 /**
111 * Creates a button with the given Text caption.
112 *
113 * @param text
114 * the Text caption
115 */
116 public SubmitButton(String text) {
117 this();
118 setValue(text);
119 }
120
121 /**
122 * Programmatic equivalent of the user clicking the button.
123 */
124 public void click() {
125 getElement().<InputElement> cast().click();
126 }
127
128 /**
129 * Sets the type of the Button.
130 * <p>
131 * Different types give the button a different look.
132 *
133 * @param type
134 * the type of the Button.
135 */
136 public void setType(ButtonType type) {
137 StyleHelper.changeStyle(this, type, ButtonType.class);
138 }
139
140 /**
141 * Sets the size of the Button.
142 *
143 * @param size
144 * the size of the Button.
145 */
146 public void setSize(ButtonSize size) {
147 StyleHelper.changeStyle(this, size, ButtonSize.class);
148 }
149
150 /**
151 * {@inheritDoc}
152 */
153 public HandlerRegistration addChangeHandler(ChangeHandler handler) {
154 return addDomHandler(handler, ChangeEvent.getType());
155 }
156
157 /**
158 * @see com.google.gwt.event.logical.shared.HasValueChangeHandlers#addValueChangeHandler(com.google.gwt.event.logical.shared.ValueChangeHandler)
159 */
160 public HandlerRegistration addValueChangeHandler(ValueChangeHandler<String> handler) {
161 if (!valueChangeHandlerInitialized) {
162 valueChangeHandlerInitialized = true;
163 addChangeHandler(new ChangeHandler() {
164
165 public void onChange(ChangeEvent event) {
166 ValueChangeEvent.fire(SubmitButton.this, getValue());
167 }
168 });
169 }
170 return addHandler(handler, ValueChangeEvent.getType());
171 }
172
173 /**
174 * {@inheritDoc}
175 */
176 @Override
177 public void setName(String name) {
178 asInputElement().setName(name);
179 }
180
181 /**
182 * {@inheritDoc}
183 */
184 @Override
185 public String getName() {
186 return asInputElement().getName();
187 }
188
189 /**
190 * {@inheritDoc}
191 */
192 @Override
193 public String getText() {
194 return asInputElement().getValue();
195 }
196
197 /**
198 * {@inheritDoc}
199 */
200 @Override
201 public void setText(String text) {
202 setValue(text);
203 }
204
205 /**
206 * {@inheritDoc}
207 */
208 @Override
209 public String getValue() {
210 return asInputElement().getValue();
211 }
212
213 /**
214 * {@inheritDoc}
215 */
216 @Override
217 public void setValue(String value) {
218 this.setValue(value , false);
219 }
220
221 /**
222 * {@inheritDoc}
223 */
224 @Override
225 public void setValue(String value, boolean fireEvents) {
226 String oldValue = getValue();
227 asInputElement().setValue(value);
228 if (fireEvents) {
229 ValueChangeEvent.fireIfNotEqual(this, oldValue, value);
230 }
231 }
232 }