Author: kmorin Date: 2013-02-25 15:48:45 +0100 (Mon, 25 Feb 2013) New Revision: 2568 Url: http://nuiton.org/projects/jaxx/repository/revisions/2568 Log: refs #2535 Add filter and sorted on the BeanDoubleList widget Added: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxFilterableListModel.java Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxDefaultListModel.java Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxDefaultListModel.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxDefaultListModel.java 2013-02-21 09:03:32 UTC (rev 2567) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxDefaultListModel.java 2013-02-25 14:48:45 UTC (rev 2568) @@ -43,7 +43,7 @@ private static final long serialVersionUID = 1L; - private ArrayList<E> delegate = new ArrayList<E>(); + protected ArrayList<E> delegate = new ArrayList<E>(); /** * Returns the number of components in this list. Added: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxFilterableListModel.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxFilterableListModel.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxFilterableListModel.java 2013-02-25 14:48:45 UTC (rev 2568) @@ -0,0 +1,181 @@ +package jaxx.runtime.swing.model; + +import java.util.ArrayList; +import java.util.Collection; +import org.apache.commons.lang3.StringUtils; +import org.nuiton.util.decorator.JXPathDecorator; + +/** + * + * @author kmorin <kmorin@codelutin.com> + */ +public class JaxxFilterableListModel<E> extends JaxxDefaultListModel<E> { + + private static final long serialVersionUID = 1L; + + private ArrayList<E> filteredItems = new ArrayList<E>(); + + protected String filterText; + + /** the decorator of data */ + protected JXPathDecorator<E> decorator; + + @Override + public E getElementAt(int index) { + if (index < filteredItems.size()) { + return filteredItems.get(index); + } else { + return null; + } + } + + @Override + public E elementAt(int index) { + return getElementAt(index); + } + + @Override + public void addElement(E o) { + super.addElement(o); + refilter(); + } + + @Override + public boolean removeElement(E o) { + boolean result = super.removeElement(o); + refilter(); + return result; + } + + @Override + public int getSize() { + return filteredItems.size(); + } + + @Override + public int size() { + return filteredItems.size(); + } + + @Override + public void trimToSize() { + super.trimToSize(); + filteredItems.trimToSize(); + } + + @Override + public void ensureCapacity(int minCapacity) { + super.ensureCapacity(minCapacity); + filteredItems.ensureCapacity(minCapacity); + } + + @Override + public void setSize(int newSize) { + super.setSize(newSize); + ensureCapacity(newSize); + } + + @Override + public void setElementAt(E element, int index) { + super.setElementAt(element, index); + refilter(); + } + + @Override + public void removeElementAt(int index) { + super.removeElementAt(index); + refilter(); + } + + @Override + public void insertElementAt(E element, int index) { + super.insertElementAt(element, index); + refilter(); + } + + @Override + public void removeAllElements() { + super.removeAllElements(); + refilter(); + } + + @Override + public E set(int index, E element) { + E rv = super.set(index, element); + refilter(); + return rv; + } + + @Override + public void add(int index, E element) { + super.add(index, element); + refilter(); + } + + @Override + public void setAllElements(Collection<E> objects) { + super.setAllElements(objects); + refilter(); + } + + @Override + public void addAllElements(Collection<E> elements) { + super.addAllElements(elements); + refilter(); + } + + @Override + public E remove(int index) { + E rv = super.remove(index); + refilter(); + return rv; + } + + @Override + public void clear() { + super.clear(); + refilter(); + } + + @Override + public void removeRange(int fromIndex, int toIndex) { + super.removeRange(fromIndex, toIndex); + refilter(); + } + + public String getFilterText() { + return filterText; + } + + public void setFilterText(String filterText) { + this.filterText = filterText; + refilter(); + } + + public JXPathDecorator<E> getDecorator() { + return decorator; + } + + public void setDecorator(JXPathDecorator<E> decorator) { + this.decorator = decorator; + } + + protected void refilter() { + filteredItems.clear(); + + if (StringUtils.isBlank(filterText)) { + filteredItems.addAll(delegate); + + } else { + int itemNumber = delegate.size(); + for (int i = 0 ; i < itemNumber ; i++) { + E element = delegate.get(i); + if (StringUtils.startsWithIgnoreCase(decorator.toString(element), filterText)) { + filteredItems.add(element); + } + } + } + + fireContentsChanged(this, 0, getSize()); + } +}