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}