001package gwt.material.design.client.base;
002
003/*
004 * #%L
005 * GwtMaterial
006 * %%
007 * Copyright (C) 2015 GwtMaterialDesign
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 com.google.gwt.dom.client.Element;
024import com.google.gwt.dom.client.Style;
025import com.google.gwt.event.dom.client.ClickEvent;
026import com.google.gwt.event.dom.client.ClickHandler;
027import com.google.gwt.event.dom.client.DoubleClickEvent;
028import com.google.gwt.event.dom.client.DoubleClickHandler;
029import com.google.gwt.event.dom.client.HasAllMouseHandlers;
030import com.google.gwt.event.dom.client.HasClickHandlers;
031import com.google.gwt.event.dom.client.HasDoubleClickHandlers;
032import com.google.gwt.event.dom.client.MouseDownEvent;
033import com.google.gwt.event.dom.client.MouseDownHandler;
034import com.google.gwt.event.dom.client.MouseMoveEvent;
035import com.google.gwt.event.dom.client.MouseMoveHandler;
036import com.google.gwt.event.dom.client.MouseOutEvent;
037import com.google.gwt.event.dom.client.MouseOutHandler;
038import com.google.gwt.event.dom.client.MouseOverEvent;
039import com.google.gwt.event.dom.client.MouseOverHandler;
040import com.google.gwt.event.dom.client.MouseUpEvent;
041import com.google.gwt.event.dom.client.MouseUpHandler;
042import com.google.gwt.event.dom.client.MouseWheelEvent;
043import com.google.gwt.event.dom.client.MouseWheelHandler;
044import com.google.gwt.event.shared.HandlerRegistration;
045import com.google.gwt.user.client.History;
046import com.google.gwt.user.client.ui.HasText;
047import gwt.material.design.client.base.mixin.ActivatesMixin;
048import gwt.material.design.client.base.mixin.CssTypeMixin;
049import gwt.material.design.client.constants.ButtonSize;
050import gwt.material.design.client.constants.ButtonType;
051import gwt.material.design.client.constants.WavesType;
052import gwt.material.design.client.ui.html.Span;
053
054/**
055 * @author Ben Dol
056 */
057public abstract class AbstractButton extends MaterialWidget implements HasHref, HasGrid, HasActivates,
058        HasTargetHistoryToken, HasType<ButtonType>, HasClickHandlers, HasAllMouseHandlers,
059        HasDoubleClickHandlers {
060
061    private final ActivatesMixin<AbstractButton> activatesMixin = new ActivatesMixin<>(this);
062    private final CssTypeMixin<ButtonType, AbstractButton> cssTypeMixin = new CssTypeMixin<>(this);
063
064    private Span span = new Span();
065    private ButtonSize size;
066
067    private String targetHistoryToken;
068
069    /** Creates button with RAISED type.
070     */
071    protected AbstractButton() {
072        setElement(createElement());
073
074        getElement().getStyle().setCursor(Style.Cursor.POINTER);
075    }
076
077    protected AbstractButton(String... initialClass) {
078        this();
079        setInitialClasses(initialClass);
080    }
081
082    protected AbstractButton(String text, String bgColor, WavesType waves) {
083        this(null, text, bgColor);
084        setWaves(waves);
085    }
086
087    protected AbstractButton(final ButtonType type, String text, String bgColor, WavesType waves) {
088        this(type, text, bgColor);
089        setWaves(waves);
090    }
091
092    protected AbstractButton(final ButtonType type, String text, String bgColor) {
093        this(type, text);
094        setBackgroundColor(bgColor);
095    }
096
097    protected AbstractButton(final ButtonType type, String text) {
098        this(type);
099        setText(text);
100    }
101
102    protected AbstractButton(final ButtonType type) {
103        this();
104        setType(type);
105    }
106
107    protected abstract Element createElement();
108
109    @Override
110    public void setHref(String href) {
111        getElement().setAttribute("href", href);
112    }
113
114    @Override
115    public String getHref() {
116        return getElement().getAttribute("href");
117    }
118
119    @Override
120    public void setTarget(String target) {
121        getElement().setAttribute("target", target);
122    }
123
124    @Override
125    public String getTarget() {
126        return getElement().getAttribute("target");
127    }
128
129    @Override
130    public void setActivates(String activates) {
131        removeStyleName(getActivates() + " dropdown-button");
132        activatesMixin.setActivates(activates);
133        addStyleName(activates + " dropdown-button");
134    }
135
136    @Override
137    public String getActivates() {
138        return activatesMixin.getActivates();
139    }
140
141    @Override
142    public void setType(ButtonType type) {
143        cssTypeMixin.setType(type);
144    }
145
146    @Override
147    public ButtonType getType() {
148        return cssTypeMixin.getType();
149    }
150
151    public void setSize(ButtonSize size) {
152        if(this.size != null) {
153            removeStyleName(this.size.getCssName());
154        }
155        this.size = size;
156
157        if(size != null) {
158            addStyleName(size.getCssName());
159        }
160    }
161
162    public ButtonSize getSize() {
163        return size;
164    }
165
166    public String getText() {
167        return span.getText();
168    }
169
170    public void setText(String text) {
171        span.setText(text);
172        add(span);
173    }
174
175    /**
176     * Set the target history token for the widget. Note, that you should use either
177     * {@link #setTargetHistoryToken(String)}or {@link #setHref(String)}, but not both as
178     * {@link #setHref(String)} resets the target history token.
179     * @param targetHistoryToken String target history token of the widget
180     */
181    @Override
182    public void setTargetHistoryToken(final String targetHistoryToken) {
183        this.targetHistoryToken = targetHistoryToken;
184        if (targetHistoryToken != null) {
185            setHref("#" + History.encodeHistoryToken(targetHistoryToken));
186        }
187    }
188
189    /**
190     * Get the target history token for the widget. May return {@code null} if no
191     * history token has been set or if it has been reset by {@link #setHref(String)}.
192     * @return String the widget's target history token.
193     */
194    @Override
195    public String getTargetHistoryToken() {
196        return targetHistoryToken;
197    }
198
199    @Override
200    public HandlerRegistration addClickHandler(final ClickHandler handler) {
201        return addDomHandler(new ClickHandler() {
202            @Override
203            public void onClick(ClickEvent event) {
204                if(isEnabled()){
205                    handler.onClick(event);
206                }
207            }
208        }, ClickEvent.getType());
209    }
210
211    @Override
212    public HandlerRegistration addMouseDownHandler(final MouseDownHandler handler) {
213        return addDomHandler(new MouseDownHandler() {
214            @Override
215            public void onMouseDown(MouseDownEvent event) {
216                if(isEnabled()){
217                    handler.onMouseDown(event);
218                }
219            }
220        }, MouseDownEvent.getType());
221    }
222
223    @Override
224    public HandlerRegistration addMouseMoveHandler(final MouseMoveHandler handler) {
225        return addDomHandler(new MouseMoveHandler() {
226            @Override
227            public void onMouseMove(MouseMoveEvent event) {
228                if(isEnabled()){
229                    handler.onMouseMove(event);
230                }
231            }
232        }, MouseMoveEvent.getType());
233    }
234
235    @Override
236    public HandlerRegistration addMouseOutHandler(final MouseOutHandler handler) {
237        return addDomHandler(new MouseOutHandler() {
238            @Override
239            public void onMouseOut(MouseOutEvent event) {
240                if(isEnabled()) {
241                    handler.onMouseOut(event);
242                }
243            }
244        }, MouseOutEvent.getType());
245    }
246
247    @Override
248    public HandlerRegistration addMouseOverHandler(final MouseOverHandler handler) {
249        return addDomHandler(new MouseOverHandler() {
250            @Override
251            public void onMouseOver(MouseOverEvent event) {
252                if(isEnabled()) {
253                    handler.onMouseOver(event);
254                }
255            }
256        }, MouseOverEvent.getType());
257    }
258
259    @Override
260    public HandlerRegistration addMouseUpHandler(final MouseUpHandler handler) {
261        return addDomHandler(new MouseUpHandler() {
262            @Override
263            public void onMouseUp(MouseUpEvent event) {
264                if(isEnabled()) {
265                    handler.onMouseUp(event);
266                }
267            }
268        }, MouseUpEvent.getType());
269    }
270
271    @Override
272    public HandlerRegistration addMouseWheelHandler(final MouseWheelHandler handler) {
273        return addDomHandler(new MouseWheelHandler() {
274            @Override
275            public void onMouseWheel(MouseWheelEvent event) {
276                if(isEnabled()) {
277                    handler.onMouseWheel(event);
278                }
279            }
280        }, MouseWheelEvent.getType());
281    }
282
283    @Override
284    public HandlerRegistration addDoubleClickHandler(final DoubleClickHandler handler) {
285        return addDomHandler(new DoubleClickHandler() {
286            @Override
287            public void onDoubleClick(DoubleClickEvent event) {
288                if(isEnabled()) {
289                    handler.onDoubleClick(event);
290                }
291            }
292        }, DoubleClickEvent.getType());
293    }
294}