/* Ara - capture species and specimen data
*
* Copyright (C) 2009 INBio ( Instituto Nacional de Biodiversidad )
*
* 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 org.inbio.ara.util;
import com.sun.webui.jsf.model.Option;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author asanabria
*/
public class AddRemoveList implements Serializable {
// <editor-fold defaultstate="collapsed" desc="Labels del componente">
// Titulo del select
private String lbTitle;
// Label de disponibles.
private String lbAvailable;
// Label de selecionados
private String lbSelected;
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Listas de elementos">
// Lista global de opciones
private Option[] options = new Option[0];
// lista de disponibles (lista de la izquierda).
private Long[] leftSelected = new Long[0];
private Option[] leftOptions = new Option[0];
// lista de selecionados (lista de la izquierda).
private Long[] rightSelected = new Long[0];
private Option[] rightOptions = new Option[0];
// </editor-fold>
/**
* Default constructor
*/
public AddRemoveList() {}
/**
* Agrega Opciones selecionadas en la lista de disponibles a la lista de
* seleccionados.
* @return <code>null</code>
*/
public String addSelectedOptions() {
Long[] selected = null;
Option[] newSelectedOptions = null;
Option[] newAvailableOptions = null;
// Determino cuales fueron selecionados
selected = leftSelected;
// Tomo los selecionados y los agrego a la lista de selecionados.
newSelectedOptions = this.intersect(this.options, selected);
this.rightOptions = this.add(this.rightOptions, newSelectedOptions);
// Elimino los selecionados de la lista de disponibles.
newAvailableOptions = this.substract(this.leftOptions, selected);
this.leftOptions = newAvailableOptions;
return null;
}
/**
* Elimina las Opciones selecionadas en la lista de selecionadas y la agrega
* a la lista de disponibles
* @return <code>null</code>
*/
public String removeSelectedOptions() {
Long[] selected = null;
Option[] newSelectedOptions = null;
Option[] newAvailableOptions = null;
// Determino cuales fueron selecionados
selected = rightSelected;
// Tomo los selecionados y los agrego a la lista de selecionados.
newAvailableOptions = this.intersect(this.options, selected);
this.leftOptions = this.add(this.leftOptions, newAvailableOptions);
// Elimino los selecionados de la lista de disponibles.
newSelectedOptions = this.substract(this.rightOptions, selected);
this.rightOptions = newSelectedOptions;
return null;
}
/**
* Asigna las opciones indicadas a la lista de disponibles.
* @param options
*/
public void setAvailableOptions(Option[] newAvailableOptions) {
Long[] selected = null;
Option[] available = null;
//asigno la lista global de opciones
this.options = newAvailableOptions;
/**
* Elimino de la lista de disponibles las opciones que estan en
* la lista de selecionados.
*/
// Tomo las opciones selecionadas
selected = this.getSelectedOptions();
// Extraigo los objetos Option del arreglo global de opciones
available = this.substract(this.options, selected);
// asigno las opciones disponibles.
this.leftOptions = available;
}
public Option[] getAvailableOptions() {
return this.options;
}
/**
* Asigna las opciones indicadas a la lista de selecionados.
* @param options
*/
public void setSelectedOptions(Long[] newSelectedOptions) {
Option[] selected = null;
/**
* Elimino de la lista de selecionados las opciones que estan en
* la lista de disponibles.
*/
// Extraigo los objetos Option del arreglo global de opciones
selected = this.intersect(this.options, newSelectedOptions);
// Asigno a la lista de selecionados las opciones indicadas por los
// valores del arreglo newSelectedOptions
this.rightOptions = this.add(this.rightOptions, selected);
// Los elimino de la izquierda
this.leftOptions = this.substract(this.leftOptions, newSelectedOptions);
}
/**
* Retorna un arreglo con los valores de las opciones selecionadas.
* @return <code>Long[]</code>
*/
public Long[] getSelectedOptions(){
int selectedLength = 0;
List<Long> result = new ArrayList<Long>();
if(this.rightOptions != null)
selectedLength = this.rightOptions.length;
for(int i=0; i < selectedLength; i++){
result.add((Long)this.rightOptions[i].getValue());
}
return result.toArray(new Long[result.size()]);
}
// <editor-fold defaultstate="collapsed" desc="Funciones de utileria">
/**
* Retorna la un arreglo con la interseccion de la lista de opciones
* disponibles y la lista de opciones selecionadas.
*
* @param availableOptions
* @param selectedOptions
* @return <code>Option[]</code>
*/
private Option[] intersect(Option[] availableOptions, Long[] selectedOptions) {
int selectedLength = 0;
int availableLength = 0;
Long optionValue = null;
List<Option> result = new ArrayList<Option>();
if(selectedOptions != null){
availableLength = availableOptions.length;
selectedLength = selectedOptions.length;
for (int i = 0; i < availableLength; i++) {
for (int j = 0; j < selectedLength; j++) {
optionValue = (Long) availableOptions[i].getValue();
if (optionValue.equals(selectedOptions[j])) {
result.add(availableOptions[i]);
}
}
}
}
return result.toArray(new Option[result.size()]);
}
/**
* Retorna la un arreglo con la resta de la lista de opciones
* disponibles y la lista de opciones selecionadas.
*
* @param availableOptions
* @param selectedOptions
* @return <code>Option[]</code>
*/
private Option[] substract(Option[] availableOptions, Long[] selectedOptions) {
List<Option> result = new ArrayList<Option>();
List<Option> temp = new ArrayList<Option>();
int availableLength = availableOptions.length;
int selectedLength = selectedOptions.length;
Long optionValue = null;
Long resultValue = null;
//pasa todas las opciones a A.
for (int i = 0; i < availableLength; i++) {
result.add(availableOptions[i]);
}
for (Option current : result) {
for (int i = 0; i < selectedLength; i++) {
resultValue = (Long)current.getValue();
optionValue = selectedOptions[i];
if(resultValue.equals(optionValue))
temp.add(current);
}
}
result.removeAll(temp);
return result.toArray(new Option[result.size()]);
}
/**
* Retorna la un arreglo con la adicion de 2 listas de opciones
*
* @param availableOptions
* @param selectedOptions
* @return <code>Option[]</code>
*/
private Option[] add(Option[] left, Option[] rigth) {
List<Option> result = new ArrayList<Option>();
for (int i = 0; i < left.length; i++) {
result.add(left[i]);
}
for (int i = 0; i < rigth.length; i++) {
result.add(rigth[i]);
}
return result.toArray(new Option[result.size()]);
}
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Getters y Setters">
public String getLbAvailable() {
return lbAvailable;
}
public void setLbAvailable(String lbAvailable) {
this.lbAvailable = lbAvailable;
}
public String getLbSelected() {
return lbSelected;
}
public void setLbSelected(String lbSelected) {
this.lbSelected = lbSelected;
}
public String getLbTitle() {
return lbTitle;
}
public void setLbTitle(String lbTitle) {
this.lbTitle = lbTitle;
}
public Option[] getLeftOptions() {
return leftOptions;
}
public void setLeftOptions(Option[] leftOptions) {
this.leftOptions = leftOptions;
}
public Long[] getLeftSelected() {
return leftSelected;
}
public void setLeftSelected(Long[] leftSelected) {
this.leftSelected = leftSelected;
}
public Option[] getRightOptions() {
return rightOptions;
}
public void setRightOptions(Option[] rightOptions) {
this.rightOptions = rightOptions;
}
public Long[] getRightSelected() {
return rightSelected;
}
public void setRightSelected(Long[] rightSelected) {
this.rightSelected = rightSelected;
}
// </editor-fold>
}