/*
* This file is part of DRBD Management Console by LINBIT HA-Solutions GmbH
* by Rasto Levrinc.
*
* Copyright (C) 2009, Rastislav Levrinc
* Copyright (C) 2009, LINBIT HA-Solutions GmbH.
*
* DRBD Management Console 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 2, or (at your option)
* any later version.
*
* DRBD Management Console 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 drbd; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package lcmc.common.ui.utils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import javax.swing.AbstractListModel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
/**
* A ListModel with filtered items.
*/
public final class MyListModel<E> extends AbstractListModel<E> {
private static final String START_TEXT = "type to search...";
private final Collection<E> items = new ArrayList<E>();
private final List<E> filteredItems = new ArrayList<E>();
private final FilterField filterField = new FilterField(START_TEXT);
public FilterField getFilterField() {
return filterField;
}
@Override
public E getElementAt(final int index) {
if (index < filteredItems.size()) {
return filteredItems.get(index);
} else {
return null;
}
}
@Override
public int getSize() {
return filteredItems.size();
}
public void addElement(final E o) {
items.add(o);
refilter();
}
private void refilter() {
filteredItems.clear();
String filter = filterField.getText();
if (START_TEXT.equals(filter)) {
filter = "";
}
for (final E item : items) {
if (item.toString().toLowerCase(Locale.US).contains(filter.toLowerCase(Locale.US))) {
filteredItems.add(item);
}
}
fireContentsChanged(this, 0, getSize());
}
private class FilterField extends JTextField implements DocumentListener {
FilterField(final String text) {
super(text);
getDocument().addDocumentListener(this);
}
@Override
public void changedUpdate(final DocumentEvent e) {
refilter();
}
@Override
public void insertUpdate(final DocumentEvent e) {
refilter();
}
@Override
public void removeUpdate(final DocumentEvent e) {
refilter();
}
}
}