/* BindingListModelListModel.java
{{IS_NOTE
Purpose:
Description:
History:
Jul 13, 2011 15:06:25 AM, Created by peterkuo
}}IS_NOTE
Copyright (C) 2011 Potix Corporation. All Rights Reserved.
*/
package org.zkoss.zkplus.databind;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.zkoss.lang.Objects;
import org.zkoss.zul.ListModel;
import org.zkoss.zul.event.ListDataListener;
import org.zkoss.zul.ext.Selectable;
import org.zkoss.zul.ext.SelectionControl;
/**
* <p>This is the {@link BindingListModel} as a {@link ListModel} to be used with
* {@link org.zkoss.zul.Listbox}, {@link org.zkoss.zul.Grid},
* and {@link DataBinder}.
* Add or remove the contents of this model as a ListModel would cause the associated Listbox or Grid to change accordingly.</p>
*
* @author peterkuo
* @since 5.0.8
* @deprecated As of release 7.0.0, replace with new ZK binding.
*/
public class BindingListModelListModel<E>
implements BindingListModel<E>, Selectable<E>, java.io.Serializable, BindingListModelExt<E> {
private static final long serialVersionUID = -4454049848612772393L;
protected ListModel<E> _model;
private Selectable<E> _selectable;
private boolean distinct = true;
public BindingListModelListModel(ListModel<E> model) {
_model = model;
}
public BindingListModelListModel(ListModel<E> model, boolean distinct) {
_model = model;
this.distinct = distinct;
if (model instanceof Set || model instanceof Map) {
distinct = true;
}
}
//--BindingListModel--//
public int indexOf(Object obj) {
for (int j = getSize(); j-- > 0;) {
if (Objects.equals(getElementAt(j), obj)) {
return j;
}
}
return -1;
}
public E getElementAt(int index) {
return _model.getElementAt(index);
}
public int getSize() {
return _model.getSize();
}
public void addListDataListener(ListDataListener l) {
_model.addListDataListener(l);
}
public void removeListDataListener(ListDataListener l) {
_model.removeListDataListener(l);
}
public ListModel<E> getInnerModel() {
return _model;
}
private static class EmptySelectable<E> implements Selectable<E>, java.io.Serializable {
private static final long serialVersionUID = 7942486785062723611L;
private SelectionControl<E> _ctrl;
public void setSelectionControl(SelectionControl ctrl) {
_ctrl = ctrl;
}
public SelectionControl getSelectionControl() {
return _ctrl;
}
public Set<E> getSelection() {
return null;
}
public void setSelection(Collection<? extends E> selection) {
}
public boolean isSelected(Object obj) {
return false;
}
public boolean isSelectionEmpty() {
return false;
}
public boolean addToSelection(E obj) {
return false;
}
public boolean removeFromSelection(Object obj) {
return false;
}
public void clearSelection() {
}
public void setMultiple(boolean multiple) {
}
public boolean isMultiple() {
return false;
}
}
@SuppressWarnings("unchecked")
private Selectable<E> getSelectModel() {
if (_model instanceof Selectable<?>)
return (Selectable<E>) _model;
if (_selectable == null) {
_selectable = new EmptySelectable<E>();
}
return _selectable;
}
public void setSelectionControl(SelectionControl ctrl) {
getSelectModel().setSelectionControl(ctrl);
}
public SelectionControl getSelectionControl() {
return getSelectModel().getSelectionControl();
}
public Set<E> getSelection() {
return getSelectModel().getSelection();
}
public void setSelection(Collection<? extends E> selection) {
getSelectModel().setSelection(selection);
}
public boolean isSelected(Object obj) {
return getSelectModel().isSelected(obj);
}
public boolean isSelectionEmpty() {
return getSelectModel().isSelectionEmpty();
}
public boolean addToSelection(E obj) {
return getSelectModel().addToSelection(obj);
}
public boolean removeFromSelection(Object obj) {
return getSelectModel().removeFromSelection(obj);
}
public void clearSelection() {
getSelectModel().clearSelection();
}
public void setMultiple(boolean multiple) {
getSelectModel().setMultiple(multiple);
}
public boolean isMultiple() {
return getSelectModel().isMultiple();
}
//--BindingListModelExt--//
public int[] indexesOf(Object elm) {
if (isDistinct()) {
final int idx = indexOf(elm);
return idx < 0 ? new int[0] : new int[] { idx };
} else {
final List<Integer> indexes = new LinkedList<Integer>();
for (int ind = getSize(); ind-- > 0;) {
//final Iterator<E> it = _list.iterator(); it.hasNext(); ++j
if (Objects.equals(elm, getElementAt(ind))) {
indexes.add(Integer.valueOf(ind));
}
}
int j = 0;
final int[] result = new int[indexes.size()];
j = 0;
for (final Iterator<Integer> it = indexes.iterator(); it.hasNext(); ++j) {
final int idx = it.next().intValue();
result[j] = idx;
}
return result;
}
}
public boolean isDistinct() {
return distinct;
}
}