/* * WBI Indicator Explorer * * Copyright 2015 Sebastian Nogara <snogaraleal@gmail.com> * * This file is part of WBI. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package client.ui.components; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import client.ClientConf; /** * List item with enhanced look and feel. */ public class MaterialItem extends Composite implements HasClickHandlers, ClickHandler { /** * Icon displayed by a {@link MaterialItem}. */ public static enum Icon { /** * Download icon. */ DOWNLOAD(ClientConf.asset("icon/ic_download.svg")), /** * Delete icon. */ DELETE(ClientConf.asset("icon/ic_delete.svg")); /** * Icon URL. */ private String url; /** * Initialize icon. * * @param url Icon URL. */ private Icon(String url) { this.url = url; } /** * Get icon URL. * * @return Icon URL. */ public String getUrl() { return url; } } /** * {@link MaterialItem} element class. */ public static enum Class { /** * Class added to animate the {@code MaterialItem}. */ ANIMATE("animate"), /** * Class added to highlight the {@code MaterialItem}. */ ACTIVE("active"), /** * Class added to a {@code MaterialItem} to show progress. */ LOADING("loading"); /** * Class name. */ private String name; /** * Initialize {@code Class}. * * @param name Class name. */ private Class(String name) { this.name = name; } /** * Get class name. * * @return Class name. */ public String getName() { return name; } } public interface MaterialItemUiBinder extends UiBinder<Widget, MaterialItem> {} private static MaterialItemUiBinder uiBinder = GWT.create(MaterialItemUiBinder.class); /** * Main {@code Widget}. */ @UiField public FocusPanel panel; /** * Ink for ripple animation. */ @UiField public FlowPanel ink; /** * Item title. */ @UiField public Label title; /** * Item subtitle. */ @UiField public Label subtitle; /** * Item icon. */ @UiField public Image icon; /** * Whether animations are enabled by default. */ private static boolean DEFAULT_ANIMATION_ENABLED = false; /** * Whether animations are enabled. */ private boolean animationEnabled; /** * Initialize {@code MaterialItem}. */ public MaterialItem() { initWidget(uiBinder.createAndBindUi(this)); panel.addClickHandler(this); } /** * Initialize {@code MaterialItem}. * * @param titleText Item title. * @param subtitleText Item subtitle. * @param animationEnabled Whether animations are enabled. */ public MaterialItem( String titleText, String subtitleText, boolean animationEnabled) { this(); setTitleText(titleText); setSubtitleText(subtitleText); setAnimationEnabled(animationEnabled); } /** * Initialize {@code MaterialItem}. * * @param titleText Item title. * @param subtitleText Item subtitle. */ public MaterialItem(String titleText, String subtitleText) { this(titleText, subtitleText, DEFAULT_ANIMATION_ENABLED); } /** * Set whether animations are enabled. * * @param animationEnabled Whether animations are enabled. */ public void setAnimationEnabled(boolean animationEnabled) { this.animationEnabled = animationEnabled; } @Override public void onClick(ClickEvent event) { if (animationEnabled) { Element inkElement = ink.getElement(); inkElement.removeClassName(Class.ANIMATE.getName()); Style style = inkElement.getStyle(); int size = panel.getOffsetWidth(); style.setWidth(size, Style.Unit.PX); style.setHeight(size, Style.Unit.PX); style.setMarginLeft(-size / 2, Style.Unit.PX); style.setMarginTop(-size / 2, Style.Unit.PX); style.setLeft(event.getX(), Style.Unit.PX); style.setTop(event.getY(), Style.Unit.PX); inkElement.addClassName(Class.ANIMATE.getName()); } } @Override public HandlerRegistration addClickHandler(ClickHandler handler) { return panel.addClickHandler(handler); } /** * Set item title. * * @param text Item title. */ public void setTitleText(String text) { title.setText(text); } /** * Set item subtitle. * * @param text Item subtitle. */ public void setSubtitleText(String text) { subtitle.setText(text); } /** * Set item {@link Icon}. * * @param icon Item {@code Icon}. */ public void setIcon(Icon icon) { this.icon.setUrl(icon.getUrl()); } /** * Set whether the icon is visible. * * @param iconVisible Whether the icon is visible. */ public void setIconVisible(boolean iconVisible) { icon.setVisible(iconVisible); } /** * Toggle the specified class. * * @param cls {@link Class} to toggle. * @param toggle Whether to add or remove the class. */ private void toggleClass(Class cls, boolean toggle) { Element panelElement = panel.getElement(); if (toggle) { panelElement.addClassName(cls.getName()); } else { panelElement.removeClassName(cls.getName()); } } /** * Set whether the item is active. * * @param active Whether the item is active. */ public void setActive(boolean active) { toggleClass(Class.ACTIVE, active); } /** * Set whether the item is loading. * * @param loading Whether the item is loading. */ public void setLoading(boolean loading) { toggleClass(Class.LOADING, loading); } }