com.gwtm.ui.client.widgets.ListPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.gwtm.ui.client.widgets.ListPanel.java

Source

/*
 * 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());
    }

}