/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 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 Lesser General Public License for more details.
*
* Copyright 2008 - 2009 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.pac.client.common.ui;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.google.gwt.user.client.ui.ListBox;
public class GenericObjectListBox<T> extends ListBox {
List<T> objects = new ArrayList<T>();
List<T> sortedAndFilteredObjects = new ArrayList<T>();
IListBoxFilter filter;
Comparator<T> comparator;
public GenericObjectListBox(boolean isMultiSelect) {
super(isMultiSelect);
}
public List<T> getObjects() {
return objects;
}
public List<T> getSortedAndFilteredObjects() {
return sortedAndFilteredObjects;
}
public void setObjects(List<T> objects) {
this.objects.clear();
this.objects.addAll(objects);
sortAndFilter();
}
public void setComparator(Comparator<T> comparator) {
this.comparator = comparator;
sortAndFilter();
}
public Comparator<T> getComparator() {
return comparator;
}
public void addObject(T object) {
objects.add(object);
sortAndFilter();
}
public List<T> getSelectedObjects() {
List<T> selectedObjects = new ArrayList<T>();
int itemCount = getItemCount();
for (int i = 0; i < itemCount; i++) {
if (isItemSelected(i)) {
selectedObjects.add(sortedAndFilteredObjects.get(i));
}
}
return selectedObjects;
}
public T getSelectedObject() {
T result = null;
List<T> selectedObjects = getSelectedObjects();
if (selectedObjects.size() > 0) {
result = selectedObjects.get(0);
}
return result;
}
public void setSelectedObject(T object) {
if (object == null) {
int itemCount = getItemCount();
for (int i = 0; i < itemCount; i++) {
setItemSelected(i, false);
}
} else {
List<T> objects = new ArrayList<T>();
objects.add(object);
setSelectedObjects(objects);
}
}
public void setSelectedObjects(List<T> objects) {
int itemCount = getItemCount();
for (int i = 0; i < itemCount; i++) {
setItemSelected(i, objects.contains(sortedAndFilteredObjects.get(i)));
}
}
public void removeSelectedObjects() {
removeObjects(getSelectedObjects());
}
public void removeObject(T object) {
ArrayList<T> list = new ArrayList<T>();
list.add(object);
removeObjects(list);
}
public void removeObjects(List<T> objectsToRemove) {
List<T> selectedObjects = getSelectedObjects();
int selectedIndex = -1;
if (selectedObjects.size() == 1) {
selectedIndex = sortedAndFilteredObjects.indexOf(selectedObjects.get(0));
}
for (T selectedObject : selectedObjects) {
int index = sortedAndFilteredObjects.indexOf(selectedObject);
sortedAndFilteredObjects.remove(selectedObject);
objects.remove(selectedObject);
removeItem(index);
}
if (selectedIndex >= getItemCount()) {
selectedIndex = getItemCount() - 1;
}
if (selectedIndex >= 0) {
setItemSelected(selectedIndex, true);
}
}
public void setFilter(IListBoxFilter listBoxFilter) {
this.filter = listBoxFilter;
sortAndFilter();
}
public IListBoxFilter getFilter() {
return filter;
}
private void sortAndFilter() {
List<T> selectedObjects = getSelectedObjects();
clear();
sortedAndFilteredObjects.clear();
sortedAndFilteredObjects.addAll(objects);
if (comparator != null) {
Collections.sort(sortedAndFilteredObjects, comparator);
}
for (int i = sortedAndFilteredObjects.size() - 1; i >= 0; i--) {
if (!doesFilterMatch(sortedAndFilteredObjects.get(i))) {
sortedAndFilteredObjects.remove(i);
}
}
for (T object : sortedAndFilteredObjects) {
addItem(getObjectText(object));
}
setSelectedObjects(selectedObjects);
}
private boolean doesFilterMatch(T filterTarget )
{
return (filter == null) || (filter.accepts(filterTarget));
}
protected String getObjectText(T object) {
return object.toString();
}
}