com.watopi.chosen.client.gwt.ChosenListBox.java Source code

Java tutorial

Introduction

Here is the source code for com.watopi.chosen.client.gwt.ChosenListBox.java

Source

/*
 * Copyright (C) 2012 Julien Dramaix
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
 * associated documentation files (the "Software"), to deal in the Software without restriction,
 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all copies or
 * substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
 * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package com.watopi.chosen.client.gwt;

import static com.google.gwt.query.client.GQuery.$;
import static com.watopi.chosen.client.Chosen.CHOSEN_DATA_KEY;
import static com.watopi.chosen.client.Chosen.Chosen;

import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.OptionElement;
import com.google.gwt.dom.client.SelectElement;
import com.google.gwt.event.dom.client.DomEvent.Type;
import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.i18n.client.HasDirection.Direction;
import com.google.gwt.query.client.GQuery;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.event.shared.EventBus;
import com.google.web.bindery.event.shared.HandlerRegistration;
import com.google.web.bindery.event.shared.SimpleEventBus;
import com.watopi.chosen.client.ChosenImpl;
import com.watopi.chosen.client.ChosenOptions;
import com.watopi.chosen.client.event.ChosenChangeEvent;
import com.watopi.chosen.client.event.ChosenChangeEvent.ChosenChangeHandler;
import com.watopi.chosen.client.event.HidingDropDownEvent;
import com.watopi.chosen.client.event.HidingDropDownEvent.HidingDropDownHandler;
import com.watopi.chosen.client.event.MaxSelectedEvent;
import com.watopi.chosen.client.event.MaxSelectedEvent.MaxSelectedHandler;
import com.watopi.chosen.client.event.ReadyEvent;
import com.watopi.chosen.client.event.ReadyEvent.ReadyHandler;
import com.watopi.chosen.client.event.ShowingDropDownEvent;
import com.watopi.chosen.client.event.ShowingDropDownEvent.ShowingDropDownHandler;
import com.watopi.chosen.client.event.UpdatedEvent;

public class ChosenListBox extends ListBox {

    /**
     * Indicates of the ChosenListBox is supported by the current browser. If
     * not (IE6/7), we fall back on normal select element.
     * 
     * @return
     */
    public static boolean isSupported() {
        return com.watopi.chosen.client.Chosen.isSupported();
    }

    /**
     * Creates a ChosenListBox widget that wraps an existing <select>
     * element.
     * 
     * This element must already be attached to the document. If the element is
     * removed from the document, you must call
     * {@link RootPanel#detachNow(Widget)}.
     * 
     * @param element
     *            the element to be wrapped
     * @return list box
     */
    public static ChosenListBox wrap(Element element) {
        assert Document.get().getBody().isOrHasChild(element);

        ChosenListBox listBox = new ChosenListBox(element);

        listBox.onAttach();
        RootPanel.detachOnWindowClose(listBox);

        return listBox;
    }

    private EventBus chznHandlerManager;

    private ChosenOptions options;

    private boolean visible = true;

    /**
     * Creates an empty chosen component in single selection mode.
     */
    public ChosenListBox() {
        this(false);
    }

    /**
     * Creates an empty chosen component in single selection mode.
     */
    public ChosenListBox(ChosenOptions options) {
        this(false, options);
    }

    /**
     * Creates an empty list box. The preferred way to enable multiple
     * selections is to use this constructor rather than
     * {@link #setMultipleSelect(boolean)}.
     * 
     * @param isMultipleSelect
     *            specifies if multiple selection is enabled
     */
    public ChosenListBox(boolean isMultipleSelect) {
        this(isMultipleSelect, new ChosenOptions());
    }

    /**
     * Creates an empty list box. The preferred way to enable multiple
     * selections is to use this constructor rather than
     * {@link #setMultipleSelect(boolean)}.
     * 
     * @param isMultipleSelect
     *            specifies if multiple selection is enabled
     */
    public ChosenListBox(boolean isMultipleSelect, ChosenOptions options) {
        super(Document.get().createSelectElement(isMultipleSelect));
        this.options = options;
    }

    protected ChosenListBox(Element element) {
        super(element);
    }

    /**
     * Deprecated, use {@link #addChosenChangeHandler(ChosenChangeHandler)}
     * instead
     */
    @Override
    @Deprecated
    public com.google.gwt.event.shared.HandlerRegistration addChangeHandler(
            final com.google.gwt.event.dom.client.ChangeHandler handler) {
        final HandlerRegistration registration = addChosenChangeHandler(new ChosenChangeHandler() {
            public void onChange(ChosenChangeEvent event) {
                handler.onChange(null);
            }
        });

        return new com.google.gwt.event.shared.HandlerRegistration() {
            public void removeHandler() {
                registration.removeHandler();
            }
        };
    }

    public HandlerRegistration addChosenChangeHandler(ChosenChangeHandler handler) {
        return ensureChosenHandlers().addHandler(ChosenChangeEvent.getType(), handler);
    }

    protected final <H extends EventHandler> HandlerRegistration addChosenHandler(H handler, Type<H> type) {
        return ensureChosenHandlers().addHandler(type, handler);
    }

    /**
     * Adds a group at the end of the list box.
     * 
     * @param group
     *            the text of the group to be added
     */
    public void addGroup(String group) {
        insertGroup(group, -1);
    }

    public HandlerRegistration addHidingDropDownHandler(HidingDropDownHandler handler) {
        return ensureChosenHandlers().addHandler(HidingDropDownEvent.getType(), handler);
    }

    /**
     * Adds an item to the last optgroup of the list box.
     * 
     * @param item
     *            the text of the item to be added
     */
    public void addItemToGroup(String item) {
        insertItemToGroup(item, -1, -1);
    }

    /**
     * Adds an item to the an optgroup of the list box.
     * 
     * @param item
     *            the text of the item to be added
     * @param groupIndex
     *            the index of the optGroup where the item will be inserted
     */
    public void addItemToGroup(String item, int groupIndex) {
        insertItemToGroup(item, groupIndex, -1);
    }

    /**
     * Adds an item to the last optgroup of the list box.
     * 
     * @param item
     *            the text of the item to be added
     */
    public void addItemToGroup(String item, String value) {
        insertItemToGroup(item, value, -1, -1);
    }

    /**
     * Adds an item to the an optgroup of the list box.
     * 
     * @param item
     *            the text of the item to be added
     * @param groupIndex
     *            the index of the optGroup where the item will be inserted
     */
    public void addItemToGroup(String item, String value, int groupIndex) {
        insertItemToGroup(item, value, groupIndex, -1);
    }

    public HandlerRegistration addMaxSelectedHandler(MaxSelectedHandler handler) {
        return ensureChosenHandlers().addHandler(MaxSelectedEvent.getType(), handler);
    }

    public HandlerRegistration addReadyHandler(ReadyHandler handler) {
        return ensureChosenHandlers().addHandler(ReadyEvent.getType(), handler);
    }

    public HandlerRegistration addShowingDropDownHandler(ShowingDropDownHandler handler) {
        return ensureChosenHandlers().addHandler(ShowingDropDownEvent.getType(), handler);
    }

    protected EventBus ensureChosenHandlers() {
        return chznHandlerManager == null ? chznHandlerManager = new SimpleEventBus() : chznHandlerManager;
    }

    public void forceRedraw() {
        $(getElement()).as(Chosen).destroy().chosen(options, ensureChosenHandlers());
    }

    protected GQuery getChosenElement() {
        ChosenImpl impl = $(getElement()).data(CHOSEN_DATA_KEY, ChosenImpl.class);
        if (impl != null) {
            return impl.getContainer();
        }
        return $();
    }

    protected EventBus getChosenHandlerManager() {
        return chznHandlerManager;
    }

    public int getDisableSearchThreshold() {
        return options.getDisableSearchThreshold();
    }

    public int getMaxSelectedOptions() {
        return options.getMaxSelectedOptions();
    }

    public String getNoResultsText() {
        return options.getNoResultsText();
    }

    public String getPlaceholderText() {
        return options.getPlaceholderText();
    }

    public String getPlaceholderTextMultiple() {
        return options.getPlaceholderTextMultiple();
    }

    public String getPlaceholderTextSingle() {
        return options.getPlaceholderTextSingle();
    }

    /**
     * Insert a group to the list box.
     * 
     * @param group
     *            the text of the group to be added
     * @param index
     *            the index at which to insert it
     */
    public void insertGroup(String group, int index) {
        GQuery optGroup = $("<optgroup></optgroup>").attr("label", group);
        GQuery select = $(getElement());

        int itemCount = SelectElement.as(getElement()).getLength();

        if (index < 0 || index > itemCount) {
            select.append(optGroup);
        } else {
            GQuery before = select.children().eq(index);
            before.before(optGroup);
        }
    }

    /**
     * Adds an item to the an optgroup of the list box. If no optgroup exists,
     * the item will be add at the end ot the list box.
     * 
     * @param item
     *            the text of the item to be added
     * @param value
     *            the value of the item to be added
     * @param itemIndex
     *            the index inside the optgroup at which to insert the item
     * @param groupIndex
     *            the index of the optGroup where the item will be inserted
     */
    public void insertItemToGroup(String item, Direction dir, String value, int groupIndex, int itemIndex) {

        GQuery select = $(getElement());
        GQuery optgroupList = select.children("optgroup");

        int groupCount = optgroupList.size();

        if (groupCount == 0) {
            // simply insert the item to the listbox
            insertItem(item, dir, value, itemIndex);
            return;
        }

        if (groupIndex < 0 || groupIndex > groupCount - 1) {
            groupIndex = groupCount - 1;
        }

        GQuery optgroup = optgroupList.eq(groupIndex);

        OptionElement option = Document.get().createOptionElement();
        setOptionText(option, item, dir);
        option.setValue(value);

        int itemCount = optgroup.children().size();

        if (itemIndex < 0 || itemIndex > itemCount - 1) {
            optgroup.append(option);
        } else {
            GQuery before = optgroup.children().eq(itemIndex);
            before.before(option);
        }

    }

    /**
     * Adds an item to the an optgroup of the list box. If no optgroup exists,
     * the item will be add at the end ot the list box.
     * 
     * @param item
     *            the text of the item to be added
     * @param itemIndex
     *            the index inside the optgroup at which to insert the item
     * @param groupIndex
     *            the index of the optGroup where the item will be inserted
     */

    public void insertItemToGroup(String item, int groupIndex, int itemIndex) {
        insertItemToGroup(item, null, item, groupIndex, itemIndex);

    }

    /**
     * Adds an item to the an optgroup of the list box. If no optgroup exists,
     * the item will be add at the end ot the list box.
     * 
     * @param item
     *            the text of the item to be added
     * @param value
     *            the value of the item to be added
     * @param itemIndex
     *            the index inside the optgroup at which to insert the item
     * @param groupIndex
     *            the index of the optGroup where the item will be inserted
     */
    public void insertItemToGroup(String item, String value, int groupIndex, int itemIndex) {
        insertItemToGroup(item, null, value, groupIndex, itemIndex);

    }

    /**
     * Specify if the deselection is allowed on single selects.
     * 
     */
    public boolean isAllowSingleDeselect() {
        return options.isAllowSingleDeselect();
    }

    public boolean isSearchContains() {
        return options.isSearchContains();
    }

    public boolean isSingleBackstrokeDelete() {
        return options.isSingleBackstrokeDelete();
    }

    @Override
    protected void onLoad() {
        super.onLoad();
        $(getElement()).as(Chosen).chosen(options, ensureChosenHandlers());
        setVisible(visible);
    }

    @Override
    protected void onUnload() {
        super.onUnload();
        $(getElement()).as(Chosen).destroy();
    }

    public void setAllowSingleDeselect(boolean allowSingleDeselect) {
        options.setAllowSingleDeselect(allowSingleDeselect);
    }

    public void setDisableSearchThreshold(int disableSearchThreshold) {
        options.setDisableSearchThreshold(disableSearchThreshold);
    }

    public void setMaxSelectedOptions(int maxSelectedOptions) {
        options.setMaxSelectedOptions(maxSelectedOptions);
    }

    public void setNoResultsText(String noResultsText) {
        options.setNoResultsText(noResultsText);
    }

    public void setPlaceholderText(String placeholderText) {
        options.setPlaceholderText(placeholderText);
    }

    public void setPlaceholderTextMultiple(String placeholderTextMultiple) {
        options.setPlaceholderTextMultiple(placeholderTextMultiple);
    }

    public void setPlaceholderTextSingle(String placeholderTextSingle) {
        options.setPlaceholderTextSingle(placeholderTextSingle);
    }

    public void setSearchContains(boolean searchContains) {
        options.setSearchContains(searchContains);
    }

    @Override
    public void setSelectedIndex(int index) {
        super.setSelectedIndex(index);
        update();
    }

    public void setSingleBackstrokeDelete(boolean singleBackstrokeDelete) {
        options.setSingleBackstrokeDelete(singleBackstrokeDelete);
    }

    @Override
    public void setVisible(boolean visible) {
        this.visible = visible;

        if (isSupported()) {
            GQuery chosenElement = getChosenElement();
            if (visible) {
                chosenElement.show();
            } else {
                chosenElement.hide();
            }
        } else {
            super.setVisible(visible);
        }
    }

    /**
     * Use this method to update the chosen list box (i.e. after insertion or
     * removal of options)
     */
    public void update() {
        ensureChosenHandlers().fireEvent(new UpdatedEvent());
    }

}