001/*
002 * #%L
003 * GwtMaterial
004 * %%
005 * Copyright (C) 2015 - 2017 GwtMaterialDesign
006 * %%
007 * Licensed under the Apache License, Version 2.0 (the "License");
008 * you may not use this file except in compliance with the License.
009 * You may obtain a copy of the License at
010 * 
011 *      http://www.apache.org/licenses/LICENSE-2.0
012 * 
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 * #L%
019 */
020package gwt.material.design.client.ui;
021
022import com.google.gwt.dom.client.Document;
023import com.google.gwt.dom.client.Style;
024import com.google.gwt.event.logical.shared.CloseEvent;
025import com.google.gwt.event.logical.shared.CloseHandler;
026import com.google.gwt.event.logical.shared.HasCloseHandlers;
027import com.google.gwt.event.shared.HandlerRegistration;
028import com.google.gwt.resources.client.ImageResource;
029import com.google.gwt.user.client.ui.HasValue;
030import com.google.gwt.user.client.ui.Image;
031import gwt.material.design.client.base.AbstractValueWidget;
032import gwt.material.design.client.base.HasIcon;
033import gwt.material.design.client.base.HasImage;
034import gwt.material.design.client.base.HasLetter;
035import gwt.material.design.client.base.mixin.ImageMixin;
036import gwt.material.design.client.base.mixin.LetterMixin;
037import gwt.material.design.client.constants.*;
038import gwt.material.design.client.ui.html.Span;
039
040//@formatter:off
041
042/**
043 * Chips can be used to represent small blocks of information.
044 * They are most commonly used either for contacts or for tags.
045 * <p>
046 * <h3>UiBinder Usage:</h3>
047 * <pre>
048 * {@code Simple Chips
049 * <m:MaterialChip text="Default" iconType="CLOSE"/>
050 *
051 * // Static Chip
052 * <m:MaterialChip text="Apple" />
053 *
054 * // Contact Chips
055 * <m:MaterialChip url="http://b.vimeocdn.com/ps/339/488/3394886_300.jpg" text="Yunalis Mat Zara'ai" iconType="CLOSE"/>
056 * }
057 * </pre>
058 *
059 * @author kevzlou7979
060 * @author Ben Dol
061 * @see <a href="http://gwtmaterialdesign.github.io/gwt-material-demo/#chips">Material Chips</a>
062 * @see <a href="https://material.io/guidelines/components/chips.html">Material Design Specification</a>
063 */
064//@formatter:on
065public class MaterialChip extends AbstractValueWidget<String> implements HasImage, HasIcon, HasLetter, HasValue<String>, HasCloseHandlers {
066
067    private MaterialIcon icon = new MaterialIcon(IconType.CLOSE);
068    private Span chipLabel = new Span();
069    private MaterialImage image = new MaterialImage();
070
071    private ImageMixin<MaterialImage> imageMixin;
072    private LetterMixin<MaterialChip> letterMixin;
073
074    public MaterialChip() {
075        super(Document.get().createDivElement(), CssName.CHIP);
076        add(chipLabel);
077    }
078
079    public MaterialChip(String text) {
080        this();
081        setText(text);
082    }
083
084    public MaterialChip(String text, IconType icon) {
085        this(text);
086        setIconType(icon);
087    }
088
089    public MaterialChip(String text, String imageUrl) {
090        this(text);
091        setUrl(imageUrl);
092    }
093
094    public MaterialChip(String text, Color bgColor, Color textColor) {
095        this(text);
096        setBackgroundColor(bgColor);
097        setTextColor(textColor);
098    }
099
100    @Deprecated
101    public MaterialChip(String text, String bgColor, String textColor) {
102        this(text, Color.fromStyleName(bgColor), Color.fromStyleName(textColor));
103    }
104
105    @Override
106    protected void onLoad() {
107        super.onLoad();
108
109        registerHandler(icon.addClickHandler(clickEvent -> close()));
110    }
111
112    public void close() {
113        if (isAttached()) {
114            removeFromParent();
115            CloseEvent.fire(this, this);
116        }
117    }
118
119    public void setText(String text) {
120        setValue(text, true);
121    }
122
123    public String getText() {
124        return getValue();
125    }
126
127    @Override
128    public void setValue(String value, boolean fireEvents) {
129        chipLabel.setText(value);
130        super.setValue(value, fireEvents);
131    }
132
133    @Override
134    public String getValue() {
135        return chipLabel.getElement().getInnerText();
136    }
137
138    @Override
139    public void setUrl(String url) {
140        getImageMixin().setUrl(url);
141        add(image);
142    }
143
144    @Override
145    public String getUrl() {
146        return getImageMixin().getUrl();
147    }
148
149    @Override
150    public void setResource(ImageResource resource) {
151        getImageMixin().setResource(resource);
152        add(image);
153    }
154
155    @Override
156    public ImageResource getResource() {
157        return getImageMixin().getResource();
158    }
159
160    @Override
161    public MaterialIcon getIcon() {
162        return icon;
163    }
164
165    @Override
166    public void setIconType(IconType iconType) {
167        icon.setIconType(iconType);
168        add(icon);
169    }
170
171    @Override
172    public void setIconPosition(IconPosition position) {
173        icon.setIconPosition(position);
174    }
175
176    @Override
177    public void setIconSize(IconSize size) {
178        icon.setIconSize(size);
179    }
180
181    @Override
182    public void setIconFontSize(double size, Style.Unit unit) {
183        icon.setIconFontSize(size, unit);
184    }
185
186    @Override
187    public void setIconColor(Color iconColor) {
188        icon.setIconColor(iconColor);
189    }
190
191    @Override
192    public Color getIconColor() {
193        return icon.getIconColor();
194    }
195
196    @Override
197    public void setIconPrefix(boolean prefix) {
198        icon.setIconPrefix(prefix);
199    }
200
201    @Override
202    public boolean isIconPrefix() {
203        return icon.isIconPrefix();
204    }
205
206    @Override
207    public void setLetter(String letter) {
208        getLetterMixin().setLetter(letter);
209    }
210
211    @Override
212    public String getLetter() {
213        return getLetterMixin().getLetter();
214    }
215
216    @Override
217    public Span getLetterLabel() {
218        return getLetterMixin().getLetterLabel();
219    }
220
221    @Override
222    public void setLetterColor(Color letterColor) {
223        getLetterMixin().setLetterColor(letterColor);
224    }
225
226    @Override
227    public void setLetterBackgroundColor(Color letterBackgroundColor) {
228        getLetterMixin().setLetterBackgroundColor(letterBackgroundColor);
229    }
230
231    public MaterialImage getImage() {
232        return image;
233    }
234
235    public void setImage(MaterialImage image) {
236        this.image = image;
237    }
238
239    public Span getChipLabel() {
240        return chipLabel;
241    }
242
243    @Override
244    public HandlerRegistration addCloseHandler(CloseHandler closeHandler) {
245        return addHandler(closeHandler, CloseEvent.getType());
246    }
247
248    protected LetterMixin<MaterialChip> getLetterMixin() {
249        if (letterMixin == null) {
250            letterMixin = new LetterMixin<>(this);
251        }
252        return letterMixin;
253    }
254
255    protected ImageMixin<MaterialImage> getImageMixin() {
256        if (imageMixin == null) {
257            imageMixin = new ImageMixin<>(image);
258        }
259        return imageMixin;
260    }
261}