001package gwt.material.design.client.ui; 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.Document; 024import com.google.gwt.dom.client.ImageElement; 025import com.google.gwt.event.dom.client.*; 026import com.google.gwt.event.shared.HandlerRegistration; 027import com.google.gwt.resources.client.ImageResource; 028import gwt.material.design.client.base.HasCaption; 029import gwt.material.design.client.base.HasImage; 030import gwt.material.design.client.base.HasType; 031import gwt.material.design.client.base.MaterialWidget; 032import gwt.material.design.client.base.mixin.CssTypeMixin; 033import gwt.material.design.client.base.mixin.ImageMixin; 034import gwt.material.design.client.constants.ImageType; 035 036//@formatter:off 037/** 038 * Images can be styled in different ways using Material Design 039 * <h3>UiBinder Usage:</h3> 040 * 041 * <pre> 042 *{@code//Simple Image 043 * <m:MaterialImage url="http://assets.materialup.com/uploads/0587e4a8-6a46-4e27-b8bf-836e4350fe82/candycons.gif"/> 044 * 045 * // Circle Image 046 * <m:MaterialImage url="http://assets.materialup.com/uploads/0587e4a8-6a46-4e27-b8bf-836e4350fe82/candycons.gif" type="CIRCLE"/> 047 * 048 * // MaterialBoxed Image 049 * <m:MaterialImage url="http://assets.materialup.com/uploads/0587e4a8-6a46-4e27-b8bf-836e4350fe82/candycons.gif" type="MATERIALBOXED"/> 050 * } 051 * </pre> 052 * 053 * @author kevzlou7979 054 * @author Ben Dol 055 * @see <a href="http://gwt-material-demo.herokuapp.com/#media">Material Media</a> 056 */ 057//@formatter:on 058public class MaterialImage extends MaterialWidget implements HasCaption, HasType<ImageType>, HasImage, HasClickHandlers, 059 HasDoubleClickHandlers, HasAllMouseHandlers, HasLoadHandlers, HasErrorHandlers, HasAllDragAndDropHandlers, 060 HasAllGestureHandlers, HasAllTouchHandlers { 061 062 private final CssTypeMixin<ImageType, MaterialImage> typeMixin = new CssTypeMixin<>(this); 063 private final ImageMixin<MaterialImage> imageMixin = new ImageMixin<>(this); 064 065 /** 066 * Creates an empty image. 067 */ 068 public MaterialImage() { 069 super(Document.get().createImageElement(), "responsive-img"); 070 } 071 072 /** 073 * Creates a simple image. 074 */ 075 public MaterialImage(String url) { 076 this(); 077 setUrl(url); 078 } 079 080 /** 081 * Creates an image with Specific type. 082 */ 083 public MaterialImage(String url, ImageType type) { 084 this(url); 085 setType(type); 086 } 087 088 /** 089 * Creates an image from an ImageResource. 090 */ 091 public MaterialImage(ImageResource resource) { 092 this(); 093 setResource(resource); 094 } 095 096 /** 097 * Creates an image from an ImageResource with Specific type. 098 */ 099 public MaterialImage(ImageResource resource, ImageType type) { 100 this(resource); 101 setType(type); 102 } 103 104 @Override 105 public void onLoad() { 106 super.onLoad(); 107 onInitMaterialDesign(); 108 } 109 110 @Override 111 public void setType(ImageType type) { 112 typeMixin.setType(type); 113 } 114 115 @Override 116 public ImageType getType() { 117 return typeMixin.getType(); 118 } 119 120 @Override 121 public String getCaption() { 122 return getElement().getAttribute("caption"); 123 } 124 125 @Override 126 public void setCaption(String caption) { 127 getElement().setAttribute("data-caption", caption); 128 } 129 130 public native void onInitMaterialDesign() /*-{ 131 $wnd.jQuery(document).ready(function() { 132 $wnd.jQuery('.materialboxed').materialbox(); 133 }); 134 }-*/; 135 136 @Override 137 public void setUrl(String url) { 138 imageMixin.setUrl(url); 139 } 140 141 @Override 142 public String getUrl() { 143 return imageMixin.getUrl(); 144 } 145 146 @Override 147 public void setResource(ImageResource resource) { 148 imageMixin.setResource(resource); 149 } 150 151 @Override 152 public ImageResource getResource() { 153 return imageMixin.getResource(); 154 } 155 156 public int getWidth() { 157 ImageElement imageElement = getElement().cast(); 158 return imageElement.getWidth(); 159 } 160 161 public int getHeight() { 162 ImageElement imageElement = getElement().cast(); 163 return imageElement.getHeight(); 164 } 165 166 @Override 167 public HandlerRegistration addClickHandler(final ClickHandler handler) { 168 return addDomHandler(new ClickHandler() { 169 @Override 170 public void onClick(ClickEvent event) { 171 if(isEnabled()){ 172 handler.onClick(event); 173 } 174 } 175 }, ClickEvent.getType()); 176 } 177 178 @Override 179 public HandlerRegistration addMouseDownHandler(final MouseDownHandler handler) { 180 return addDomHandler(new MouseDownHandler() { 181 @Override 182 public void onMouseDown(MouseDownEvent event) { 183 if(isEnabled()){ 184 handler.onMouseDown(event); 185 } 186 } 187 }, MouseDownEvent.getType()); 188 } 189 190 @Override 191 public HandlerRegistration addMouseMoveHandler(final MouseMoveHandler handler) { 192 return addDomHandler(new MouseMoveHandler() { 193 @Override 194 public void onMouseMove(MouseMoveEvent event) { 195 if(isEnabled()){ 196 handler.onMouseMove(event); 197 } 198 } 199 }, MouseMoveEvent.getType()); 200 } 201 202 @Override 203 public HandlerRegistration addMouseOutHandler(final MouseOutHandler handler) { 204 return addDomHandler(new MouseOutHandler() { 205 @Override 206 public void onMouseOut(MouseOutEvent event) { 207 if(isEnabled()){ 208 handler.onMouseOut(event); 209 } 210 } 211 }, MouseOutEvent.getType()); 212 } 213 214 @Override 215 public HandlerRegistration addMouseOverHandler(final MouseOverHandler handler) { 216 return addDomHandler(new MouseOverHandler() { 217 @Override 218 public void onMouseOver(MouseOverEvent event) { 219 if(isEnabled()){ 220 handler.onMouseOver(event); 221 } 222 } 223 }, MouseOverEvent.getType()); 224 } 225 226 @Override 227 public HandlerRegistration addMouseUpHandler(final MouseUpHandler handler) { 228 return addDomHandler(new MouseUpHandler() { 229 @Override 230 public void onMouseUp(MouseUpEvent event) { 231 if(isEnabled()){ 232 handler.onMouseUp(event); 233 } 234 } 235 }, MouseUpEvent.getType()); 236 } 237 238 @Override 239 public HandlerRegistration addMouseWheelHandler(final MouseWheelHandler handler) { 240 return addDomHandler(new MouseWheelHandler() { 241 @Override 242 public void onMouseWheel(MouseWheelEvent event) { 243 if(isEnabled()){ 244 handler.onMouseWheel(event); 245 } 246 } 247 }, MouseWheelEvent.getType()); 248 } 249 250 @Override 251 public HandlerRegistration addLoadHandler(final LoadHandler handler) { 252 return addDomHandler(new LoadHandler() { 253 @Override 254 public void onLoad(LoadEvent event) { 255 if(isEnabled()){ 256 handler.onLoad(event); 257 } 258 } 259 }, LoadEvent.getType()); 260 } 261 262 @Override 263 public HandlerRegistration addErrorHandler(final ErrorHandler handler) { 264 return addDomHandler(new ErrorHandler() { 265 @Override 266 public void onError(ErrorEvent event) { 267 if(isEnabled()){ 268 handler.onError(event); 269 } 270 } 271 }, ErrorEvent.getType()); 272 } 273 274 @Override 275 public HandlerRegistration addDoubleClickHandler(final DoubleClickHandler handler) { 276 return addDomHandler(new DoubleClickHandler() { 277 @Override 278 public void onDoubleClick(DoubleClickEvent event) { 279 if(isEnabled()){ 280 handler.onDoubleClick(event); 281 } 282 } 283 }, DoubleClickEvent.getType()); 284 285 } 286 287 @Override 288 public HandlerRegistration addDragEndHandler(final DragEndHandler handler) { 289 return addBitlessDomHandler(new DragEndHandler() { 290 @Override 291 public void onDragEnd(DragEndEvent event) { 292 if(isEnabled()){ 293 handler.onDragEnd(event); 294 } 295 } 296 }, DragEndEvent.getType()); 297 } 298 299 @Override 300 public HandlerRegistration addDragEnterHandler(final DragEnterHandler handler) { 301 return addBitlessDomHandler(new DragEnterHandler() { 302 @Override 303 public void onDragEnter(DragEnterEvent event) { 304 if(isEnabled()){ 305 handler.onDragEnter(event); 306 } 307 } 308 }, DragEnterEvent.getType()); 309 } 310 311 @Override 312 public HandlerRegistration addDragHandler(final DragHandler handler) { 313 return addBitlessDomHandler(new DragHandler() { 314 @Override 315 public void onDrag(DragEvent event) { 316 if(isEnabled()){ 317 handler.onDrag(event); 318 } 319 } 320 }, DragEvent.getType()); 321 } 322 323 @Override 324 public HandlerRegistration addDragLeaveHandler(final DragLeaveHandler handler) { 325 return addBitlessDomHandler(new DragLeaveHandler() { 326 @Override 327 public void onDragLeave(DragLeaveEvent event) { 328 if(isEnabled()){ 329 handler.onDragLeave(event); 330 } 331 } 332 }, DragLeaveEvent.getType()); 333 } 334 335 @Override 336 public HandlerRegistration addDragOverHandler(final DragOverHandler handler) { 337 return addBitlessDomHandler(new DragOverHandler() { 338 @Override 339 public void onDragOver(DragOverEvent event) { 340 if(isEnabled()){ 341 handler.onDragOver(event); 342 } 343 } 344 }, DragOverEvent.getType()); 345 } 346 347 @Override 348 public HandlerRegistration addDragStartHandler(final DragStartHandler handler) { 349 return addBitlessDomHandler(new DragStartHandler() { 350 @Override 351 public void onDragStart(DragStartEvent event) { 352 if(isEnabled()){ 353 handler.onDragStart(event); 354 } 355 } 356 }, DragStartEvent.getType()); 357 } 358 359 @Override 360 public HandlerRegistration addDropHandler(final DropHandler handler) { 361 return addBitlessDomHandler(new DropHandler() { 362 @Override 363 public void onDrop(DropEvent event) { 364 if(isEnabled()){ 365 handler.onDrop(event); 366 } 367 } 368 }, DropEvent.getType()); 369 } 370 371 @Override 372 public HandlerRegistration addGestureChangeHandler(final GestureChangeHandler handler) { 373 return addDomHandler(new GestureChangeHandler() { 374 @Override 375 public void onGestureChange(GestureChangeEvent event) { 376 if(isEnabled()){ 377 handler.onGestureChange(event); 378 } 379 } 380 }, GestureChangeEvent.getType()); 381 } 382 383 @Override 384 public HandlerRegistration addGestureEndHandler(final GestureEndHandler handler) { 385 return addDomHandler(new GestureEndHandler() { 386 @Override 387 public void onGestureEnd(GestureEndEvent event) { 388 if(isEnabled()){ 389 handler.onGestureEnd(event); 390 } 391 } 392 }, GestureEndEvent.getType()); 393 } 394 395 @Override 396 public HandlerRegistration addGestureStartHandler(final GestureStartHandler handler) { 397 return addDomHandler(new GestureStartHandler() { 398 @Override 399 public void onGestureStart(GestureStartEvent event) { 400 if(isEnabled()){ 401 handler.onGestureStart(event); 402 } 403 } 404 }, GestureStartEvent.getType()); 405 } 406 407 @Override 408 public HandlerRegistration addTouchCancelHandler(final TouchCancelHandler handler) { 409 return addDomHandler(new TouchCancelHandler() { 410 @Override 411 public void onTouchCancel(TouchCancelEvent event) { 412 if(isEnabled()){ 413 handler.onTouchCancel(event); 414 } 415 } 416 }, TouchCancelEvent.getType()); 417 } 418 419 @Override 420 public HandlerRegistration addTouchEndHandler(final TouchEndHandler handler) { 421 return addDomHandler(new TouchEndHandler() { 422 @Override 423 public void onTouchEnd(TouchEndEvent event) { 424 if(isEnabled()){ 425 handler.onTouchEnd(event); 426 } 427 } 428 }, TouchEndEvent.getType()); 429 } 430 431 @Override 432 public HandlerRegistration addTouchMoveHandler(final TouchMoveHandler handler) { 433 return addDomHandler(new TouchMoveHandler() { 434 @Override 435 public void onTouchMove(TouchMoveEvent event) { 436 if(isEnabled()){ 437 handler.onTouchMove(event); 438 } 439 } 440 }, TouchMoveEvent.getType()); 441 } 442 443 @Override 444 public HandlerRegistration addTouchStartHandler(final TouchStartHandler handler) { 445 return addDomHandler(new TouchStartHandler() { 446 @Override 447 public void onTouchStart(TouchStartEvent event) { 448 if(isEnabled()){ 449 handler.onTouchStart(event); 450 } 451 } 452 }, TouchStartEvent.getType()); 453 } 454}