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}