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}