Java tutorial
/* * Copyright (c) 2010 Zhihua (Dennis) Jiang * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.gwtm.ui.client.widgets; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.HasValueChangeHandlers; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Widget; import com.gwtm.ui.client.core.Utils; import com.gwtm.ui.client.core.widgets.CssFactory.BoxAlign; import com.gwtm.ui.client.core.widgets.CssFactory.BoxOrient; import com.gwtm.ui.client.core.widgets.CssFactory.BoxPack; import com.gwtm.ui.client.events.DraggingEvent; import com.gwtm.ui.client.events.DraggingHandler; import com.gwtm.ui.client.themes.ThemeConstants; import com.gwtm.ui.client.themes.ThemeManager; public class ListPanel extends BoxPanel implements ClickHandler, DraggingHandler, HasValueChangeHandlers<Integer> { public enum ShowArrow { visible, hidden }; private ShowArrow showArrow; private int selected = -1; private boolean selectable = true; public ListPanel() { super(BoxOrient.vertical, BoxPack.start, BoxAlign.justify); Utils.Widgets.setPrimaryCssClass(this, ThemeManager.getTheme().listpanel()); addDraggingHandler(this); addClickTapHandler(this); } @Override public void add(Widget w) { if (w.getClass() == ListItem.class) { super.add(w); } else { // TODO: check with joao if this is causing problem with gwt // designer. // yes, this asserts are causing some issues, for instance, an empty // panel on gwt designer // will have a child Label saying that the panel is empty. With this // assert we cant use gwtd // assert false : "Only ListItem can be added to ListPanel."; ListItem listItem = new ListItem(); super.add(listItem); listItem.add(w); if (showArrow == ShowArrow.visible) { Chevron chevron = new Chevron(); listItem.add(chevron); } } } @Override public void onClick(ClickEvent e) { if (selected >= 0) { ListItem item = (ListItem) getWidget(selected); if (item.isEnabled()) { ValueChangeEvent.fire(this, selected); Utils.Widgets.removeExtensionCssClass(item, ThemeConstants.Extension.pressed); } selected = -1; } } public void setDisplayArrow(ShowArrow show) { showArrow = show; for (int i = 0; i < getWidgetCount(); i++) { ListItem listItem = (ListItem) getWidget(i); listItem.setDisplayArrowFromParent(show); } } public ShowArrow getDisplayArrow() { return showArrow; } public void isSelectable(boolean selectable) { this.selectable = selectable; } public void setSelectable(boolean selectable) { this.selectable = selectable; } public boolean getSelectable() { return selectable; } public ListItem getItem(int index) { return (ListItem) getWidget(index); } static class Chevron extends HTML { public Chevron() { super("<span></span><span></span>"); Utils.Widgets.setSecondaryCssClass(this, ThemeManager.getTheme().chevron()); } } @Override public void onDraggingStart(DraggingEvent e) { if (selectable) { selected = Utils.Html.getTargetItemIndex(getElement(), e.getNativeEvent().getEventTarget()); // if nothing selected, return if (selected < 0) return; // set timer to detect a click new Timer() { @Override public void run() { if (selected >= 0) { ListItem item = (ListItem) getWidget(selected); if (item.isEnabled()) { Utils.Widgets.setExtensionCssClass(getWidget(selected), ThemeConstants.Extension.pressed); } } } }.schedule(75); } } @Override public void onDraggingMove(DraggingEvent e) { if (selected >= 0) { Utils.Widgets.removeExtensionCssClass(getWidget(selected), ThemeConstants.Extension.pressed); selected = -1; } } @Override public void onDraggingEnd(DraggingEvent e) { if (selected >= 0) { Utils.Widgets.removeExtensionCssClass(getWidget(selected), ThemeConstants.Extension.pressed); // _selected = -1; need to keep the selected value for click event. } } @Override public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Integer> handler) { return this.addHandler(handler, ValueChangeEvent.getType()); } }