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.Style;
025import com.google.gwt.event.dom.client.*;
026import com.google.gwt.event.shared.HandlerRegistration;
027import com.google.gwt.resources.client.ImageResource;
028import com.google.gwt.user.client.ui.Image;
029import gwt.material.design.client.base.*;
030import gwt.material.design.client.base.mixin.LetterMixin;
031import gwt.material.design.client.constants.IconPosition;
032import gwt.material.design.client.constants.IconSize;
033import gwt.material.design.client.constants.IconType;
034import gwt.material.design.client.ui.html.Span;
035
036//@formatter:off
037
038/**
039 * Chips can be used to represent small blocks of information.
040 * They are most commonly used either for contacts or for tags.
041 *
042 * <h3>UiBinder Usage:</h3>
043 * <pre>
044 *{@code// Simple Chips
045 * <m:MaterialChip text="Default" iconType="close"/>
046 *
047 * // Static Chip
048 * <m:MaterialChip text="Apple" />
049 *
050 * // Contact Chips
051 * <m:MaterialChip url="http://b.vimeocdn.com/ps/339/488/3394886_300.jpg" text="Yunalis Mat Zara'ai" iconType="CLOSE"/>
052 * }
053 * </pre>
054 *
055 * @author kevzlou7979
056 * @author Ben Dol
057 * @see <a href="http://gwt-material-demo.herokuapp.com/#chips">Material Chips</a>
058 */
059//@formatter:on
060public class MaterialChip extends MaterialWidget implements HasImage, HasIcon, HasClickHandlers,
061        HasAllMouseHandlers, HasDoubleClickHandlers, HasLetter {
062
063    private MaterialIcon icon = new MaterialIcon();
064    private Span span = new Span();
065
066    private ImageResource resource;
067    private Image image = new Image();
068
069    private final LetterMixin<MaterialChip> letterMixin = new LetterMixin<>(this);
070
071    /**
072     * Creates an empty chip.
073     */
074    public MaterialChip() {
075        super(Document.get().createDivElement(), "chip");
076    }
077
078    public void setText(String text) {
079        span.setText(text);
080        add(span);
081    }
082
083    public String getText() {
084        return span.getElement().getInnerText();
085    }
086
087    @Override
088    public void setUrl(String url) {
089        image.setUrl(url);
090        add(image);
091    }
092
093    @Override
094    public String getUrl() {
095        return image.getUrl();
096    }
097
098    @Override
099    public void setResource(ImageResource resource) {
100        this.resource = resource;
101        image.setResource(resource);
102        add(image);
103    }
104
105    @Override
106    public ImageResource getResource() {
107        return resource;
108    }
109
110    /**
111     * @return the image
112     */
113    public Image getImage() {
114        return image;
115    }
116
117    /**
118     * @param image the image to set
119     */
120    public void setImage(Image image) {
121        this.image = image;
122    }
123
124    @Override
125    public MaterialIcon getIcon() {
126        return icon;
127    }
128
129    @Override
130    public void setIconType(IconType iconType) {
131        icon.setIconType(iconType);
132        add(icon);
133    }
134
135    @Override
136    public void setIconPosition(IconPosition position) {
137        icon.setIconPosition(position);
138    }
139
140    @Override
141    public void setIconSize(IconSize size) {
142        icon.setIconSize(size);
143    }
144
145    @Override
146    public void setIconFontSize(double size, Style.Unit unit) {
147        icon.setIconFontSize(size, unit);
148    }
149
150    @Override
151    public void setIconColor(String iconColor) {
152        icon.setIconColor(iconColor);
153    }
154
155    @Override
156    public void setIconPrefix(boolean prefix) {
157        icon.setIconPrefix(prefix);
158    }
159
160    @Override
161    public boolean isIconPrefix() {
162        return icon.isIconPrefix();
163    }
164
165    @Override
166    public HandlerRegistration addClickHandler(final ClickHandler handler) {
167        return addDomHandler(new ClickHandler() {
168            @Override
169            public void onClick(ClickEvent event) {
170                if(isEnabled()){
171                    handler.onClick(event);
172                }
173            }
174        }, ClickEvent.getType());
175    }
176
177    @Override
178    public HandlerRegistration addMouseDownHandler(final MouseDownHandler handler) {
179        return addDomHandler(new MouseDownHandler() {
180            @Override
181            public void onMouseDown(MouseDownEvent event) {
182                if(isEnabled()){
183                    handler.onMouseDown(event);
184                }
185            }
186        }, MouseDownEvent.getType());
187    }
188
189    @Override
190    public HandlerRegistration addMouseMoveHandler(final MouseMoveHandler handler) {
191        return addDomHandler(new MouseMoveHandler() {
192            @Override
193            public void onMouseMove(MouseMoveEvent event) {
194                if(isEnabled()){
195                    handler.onMouseMove(event);
196                }
197            }
198        }, MouseMoveEvent.getType());
199    }
200
201    @Override
202    public HandlerRegistration addMouseOutHandler(final MouseOutHandler handler) {
203        return addDomHandler(new MouseOutHandler() {
204            @Override
205            public void onMouseOut(MouseOutEvent event) {
206                if(isEnabled()){
207                    handler.onMouseOut(event);
208                }
209            }
210        }, MouseOutEvent.getType());
211    }
212
213    @Override
214    public HandlerRegistration addMouseOverHandler(final MouseOverHandler handler) {
215        return addDomHandler(new MouseOverHandler() {
216            @Override
217            public void onMouseOver(MouseOverEvent event) {
218                if(isEnabled()){
219                    handler.onMouseOver(event);
220                }
221            }
222        }, MouseOverEvent.getType());
223    }
224
225    @Override
226    public HandlerRegistration addMouseUpHandler(final MouseUpHandler handler) {
227        return addDomHandler(new MouseUpHandler() {
228            @Override
229            public void onMouseUp(MouseUpEvent event) {
230                if(isEnabled()){
231                    handler.onMouseUp(event);
232                }
233            }
234        }, MouseUpEvent.getType());
235    }
236
237    @Override
238    public HandlerRegistration addMouseWheelHandler(final MouseWheelHandler handler) {
239        return addDomHandler(new MouseWheelHandler() {
240            @Override
241            public void onMouseWheel(MouseWheelEvent event) {
242                if(isEnabled()){
243                    handler.onMouseWheel(event);
244                }
245            }
246        }, MouseWheelEvent.getType());
247    }
248
249    @Override
250    public HandlerRegistration addDoubleClickHandler(final DoubleClickHandler handler) {
251        return addDomHandler(new DoubleClickHandler() {
252            @Override
253            public void onDoubleClick(DoubleClickEvent event) {
254                if(isEnabled()){
255                    handler.onDoubleClick(event);
256                }
257            }
258        }, DoubleClickEvent.getType());
259    }
260
261    @Override
262    public void setLetter(String letter) {
263        letterMixin.setLetter(letter);
264    }
265
266    @Override
267    public String getLetter() {
268        return letterMixin.getLetter();
269    }
270
271    @Override
272    public void setLetterColor(String letterColor) {
273        letterMixin.setLetterColor(letterColor);
274    }
275
276    @Override
277    public void setLetterBackgroundColor(String letterBackgroundColor) {
278        letterMixin.setLetterBackgroundColor(letterBackgroundColor);
279    }
280}