com.autentia.wuija.widget.SelectManyLists.java Source code

Java tutorial

Introduction

Here is the source code for com.autentia.wuija.widget.SelectManyLists.java

Source

/**
 * Copyright 2008 Autentia Real Business Solutions S.L.
 * 
 * This file is part of Autentia WUIJA.
 * 
 * Autentia WUIJA is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, version 3 of the License.
 * 
 * Autentia WUIJA 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 Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with Autentia WUIJA. If not, see <http://www.gnu.org/licenses/>.
 */

package com.autentia.wuija.widget;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import javax.faces.context.FacesContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.support.MessageSourceAccessor;

import com.autentia.wuija.i18n.MessageSourceUtils;
import com.autentia.wuija.widget.notification.ActionEvent;
import com.autentia.wuija.widget.notification.ActionListener;
import com.autentia.wuija.widget.notification.ValueChangeEvent;
import com.autentia.wuija.widget.notification.ValueChangeListener;

/**
 * Esta clase pone dos {@link SelectManyListbox} de forma que podemos pasara elementos de uno al otro, con los tpicos
 * botones de >> > < <<.
 * 
 * @param <T> el tipo de los objetos que contienen los {@link SelectManyListbox}
 */
public class SelectManyLists<T> extends JsfWidget {

    private static final Log log = LogFactory.getLog(SelectManyLists.class);

    /**
     * Widget con la lista de elementos seleccionados
     */
    private SelectManyListbox<T> selectedValuesList;

    /**
     * Widget con la lista de elementos no seleccionados
     */
    private SelectManyListbox<T> allowedValuesList;

    /**
     * Boton para pasar todos los elementos a la lista de elementos no seleccionados
     */
    private Button unselectAllButton;

    /**
     * Boton para pasar los elementos seleccionados en la lista de la derecha a la lista de la izquierda
     */
    private Button selectButton;

    /**
     * Boton para pasar los elementos seleccionados en la lista de la izquierda a la lista de la derecha
     */
    private Button unselectButton;

    /**
     * Boton para pasar todos los elementos a la lista de elementos seleccionados
     */
    private Button selectAllButton;

    /**
     * Campo de los elementos que sera presentado en las listas
     */
    private String field;

    /** Numero de opciones visibles en cada una de las dos listas */
    private int size;

    /** Almacena la lista de elementos seleccionados anterior, despues de cada cambio */
    private Collection<T> oldValue = new ArrayList<T>();

    /**
     * @param selectedValues coleccion de elementos que apareceran en la lista de la izquierda
     * @param allowedValues coleccion de elementos que apareceran en la lista de la derecha
     * @param field nombre del campo a mostrar en las listas para cada elemento (como un String). Si es
     *            <code>null</code> se llamara al metodo <code>toString</code> de los elementos
     * @param size numero de opciones visibles en cada una de las dos listas. Si no es mayor que cero se tomara el
     *            numero de elementos total entre las dos listas
     */
    public SelectManyLists(Collection<T> selectedValues, Collection<T> allowedValues, String field, int size) {
        super();

        final MessageSourceAccessor msa = MessageSourceUtils.getMessageSourceAccessor();
        this.size = size >= 0 ? size : selectedValues.size() + allowedValues.size();

        selectedValuesList = new SelectManyListbox<T>(selectedValues, field, this.size);
        selectedValuesList.setTitle(msa.getMessage("selectManyLists.titleSelected"));
        selectedValuesList.addListener(new ValueChangeListener() {

            @SuppressWarnings("unchecked")
            public void processValueChange(ValueChangeEvent event) {
                updateButtonsUnSelect();
                oldValue = (Collection<T>) event.getOldValue();

                // fireEvent(event);
            }
        });

        allowedValuesList = new SelectManyListbox<T>(allowedValues, field, this.size);
        allowedValuesList.setTitle(msa.getMessage("selectManyLists.titleAllowed"));
        allowedValuesList.addListener(new ValueChangeListener() {

            public void processValueChange(ValueChangeEvent event) {
                updateButtonsSelect();
            }
        });

        /*** Se establecen las acciones para los botones ***/
        selectAllButton = new Button("btn.selectAll", new ActionListener() {

            public void processAction(ActionEvent event) {
                executeButtonAction("addAll");
            }
        });
        unselectAllButton = new Button("btn.unselectAll", new ActionListener() {

            public void processAction(ActionEvent event) {
                executeButtonAction("removeAll");
            }
        });
        selectButton = new Button("btn.select", new ActionListener() {

            public void processAction(ActionEvent event) {
                executeButtonAction("addSelected");
            }
        });
        unselectButton = new Button("btn.unselect", new ActionListener() {

            public void processAction(ActionEvent event) {
                executeButtonAction("removeSelected");
            }
        });

        updateButtonsSelect();
        updateButtonsUnSelect();
    }

    /**
     * @param selectedValues coleccion de elementos que apareceran en la lista de la izquierda
     * @param allowedValues coleccion de elementos que apareceran en la lista de la derecha
     * @param field nombre del campo a mostrar en las listas para cada elemento (como un String). Si es
     *            <code>null</code> se llamara al metodo <code>toString</code> de los elementos
     */
    public SelectManyLists(Collection<T> selectedValues, Collection<T> allowedValues, String field) {
        this(selectedValues, allowedValues, field, -1);
    }

    private void updateButtonsSelect() {
        final boolean disabledSelect = allowedValuesList.getItems().size() == 0;

        selectAllButton.setDisabled(disabledSelect);
        selectButton.setDisabled(disabledSelect);
    }

    private void updateButtonsUnSelect() {
        final boolean disabledUnSelect = selectedValuesList.getItems().size() == 0;

        unselectAllButton.setDisabled(disabledUnSelect);
        unselectButton.setDisabled(disabledUnSelect);
    }

    private void executeButtonAction(String command) {
        try {
            this.getClass().getMethod(command).invoke(this);
        } catch (Exception e) {
            log.error("Error al ejecutar el mtodo " + command, e);
        }

        FacesContext.getCurrentInstance().renderResponse();
    }

    public void restrictValues(Collection<T> values) {
        final Set<T> allowedValues = new HashSet<T>(values);

        allowedValues.removeAll(getSelectedItems());
        getSelectedValuesList().retainAll(values);

        getAllowedValuesList().clear();
        addAllToAllowed(allowedValues);
    }

    /**
     * Metodo de conveniencia que devuelve los elementos existentes en la lista de la izquierda (seleccionados)
     * 
     * @return coleccion de elementos en la lista izquierda
     */
    public Collection<T> getSelectedItems() {
        return selectedValuesList.getItems();
    }

    /**
     * Metodo de conveniencia que devuelve los elementos existentes en la lista de la derecha (disponibles)
     * 
     * @return coleccion de elementos en la lista derecha
     */
    public Collection<T> getAllowedItems() {
        return allowedValuesList.getItems();
    }

    public Collection<T> getAllItems() {
        final Collection<T> items = allowedValuesList.getItems();
        items.addAll(selectedValuesList.getItems());

        return items;
    }

    public void fireChangeEvent() {
        final ValueChangeEvent event = new ValueChangeEvent(this, oldValue, selectedValuesList.getSelectedItems());
        fireEvent(event);
    }

    public void addAllToSelected(Collection<T> items) {
        selectedValuesList.addAll(items);
        fireChangeEvent();
    }

    public void addAllToAllowed(Collection<T> items) {
        allowedValuesList.addAll(items);
    }

    public void removeAllFromSelected(Collection<T> items) {
        selectedValuesList.removeAll(items);
        fireChangeEvent();
    }

    public void removeAllFromAllowed(Collection<T> items) {
        allowedValuesList.removeAll(items);
    }

    /**
     * Pasa todos los elementos seleccionados en la lista derecha (disponibles) a la lista izquierda (seleccionados)
     */
    public void addSelected() {
        final Collection<T> items = getCollectionFromArray(allowedValuesList.getSelectedItems());

        selectedValuesList.addAll(items);
        allowedValuesList.removeAll(items);
        fireChangeEvent();
    }

    /**
     * Pasa todos los elementos seleccionados en la lista izquierda (seleccionados) a la lista derecha (disponibles)
     */
    public void removeSelected() {
        final Collection<T> items = getCollectionFromArray(selectedValuesList.getSelectedItems());

        selectedValuesList.removeAll(items);
        allowedValuesList.addAll(items);
        fireChangeEvent();
    }

    /**
     * Pasa todos los elementos de la lista derecha (disponibles) a la lista izquierda (seleccionados)
     */
    public void addAll() {
        log.debug("Seleccionar todo");
        final Collection<T> items = allowedValuesList.getItems();

        selectedValuesList.addAll(items);
        allowedValuesList.removeAll(items);
        fireChangeEvent();
    }

    /**
     * Pasa todos los elementos de la lista izquierda (seleccionados) a la lista derecha (disponibles)
     */
    public void removeAll() {
        log.debug("Deseleccionar todo");
        final Collection<T> items = selectedValuesList.getItems();

        allowedValuesList.addAll(items);
        selectedValuesList.removeAll(items);
        fireChangeEvent();
    }

    public String getTitleSelected() {
        return selectedValuesList.getTitle();
    }

    public void setTitleSelected(String titleSelected) {
        selectedValuesList.setTitle(titleSelected);
    }

    public String getTitleAllowed() {
        return allowedValuesList.getTitle();
    }

    public void setTitleAllowed(String titleAllowed) {
        allowedValuesList.setTitle(titleAllowed);
    }

    private Collection<T> getCollectionFromArray(T[] array) {
        final Collection<T> items = new ArrayList<T>();

        for (int i = 0; i < array.length; i++) {
            items.add(array[i]);
        }

        return items;
    }

    @Override
    public String getRendererPath() {
        return RENDERER_PATH + "selectManyLists.jspx";
    }

    public Button getUnselectAllButton() {
        return unselectAllButton;
    }

    public void setUnselectAllButton(Button unselectAllButton) {
        this.unselectAllButton = unselectAllButton;
    }

    public Button getSelectButton() {
        return selectButton;
    }

    public void setSelectButton(Button selectButton) {
        this.selectButton = selectButton;
    }

    public Button getUnselectButton() {
        return unselectButton;
    }

    public void setUnselectButton(Button unselectButton) {
        this.unselectButton = unselectButton;
    }

    public Button getSelectAllButton() {
        return selectAllButton;
    }

    public void setSelectAllButton(Button selectAllButton) {
        this.selectAllButton = selectAllButton;
    }

    public SelectManyListbox<T> getSelectedValuesList() {
        return selectedValuesList;
    }

    public void setSelectedValuesList(SelectManyListbox<T> selectedValuesList) {
        this.selectedValuesList = selectedValuesList;
    }

    public SelectManyListbox<T> getAllowedValuesList() {
        return allowedValuesList;
    }

    public void setAllowedValuesList(SelectManyListbox<T> allowedValuesList) {
        this.allowedValuesList = allowedValuesList;
    }

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
        this.allowedValuesList.setField(field);
        this.selectedValuesList.setField(field);
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public String getSelectedValuesListId() {
        return selectedValuesList.getId();
    }
}