// Selection (Model of a filtered list of students) // Modified: Carsten Schuermann // Date: Sat Mar 25 22:02:34 2006 import java.util.ArrayList; import java.util.Iterator; import javax.swing.AbstractListModel; // Interface for Event driven SelectionListener interface SelectionListener { // Non-trival event: needs to communicate the selected OOPStudent public static class Event{ private OOPStudent selection; public Event( OOPStudent selection){ this.selection=selection; } public OOPStudent getSelection(){ return selection; } } void selectionChanged(Event e); } class Selection extends AbstractListModel { // Listener functionality announced to the outside. private ArrayList listeners = new ArrayList (); public void addListener(SelectionListener l){listeners.add(l);} public void removeListener(SelectionListener l){listeners.remove(l);} // Listener functionality connecting the inside to the outside. private void notifyListeners() { SelectionListener.Event ev = new SelectionListener.Event(this.getSelected ()); Iterator itr = listeners.iterator(); while ( itr.hasNext() ){ SelectionListener l = (SelectionListener)itr.next(); l.selectionChanged(ev); } } // Model of a selection private final OOPStudent[] rawData; private ArrayList filteredData = new ArrayList(); private String filter; private OOPStudent selectedStudent; public void setSelected (OOPStudent student) { if (selectedStudent != null) {selectedStudent.removeListener ();} selectedStudent = student; if (selectedStudent != null) { // Listener Relationship 5 selectedStudent.addListener (new OOPStudentListener () { public void nameChanged () { Selection.this.fireContentsChanged( this, 0 , filteredData.size() ); } }); } notifyListeners (); } public OOPStudent getSelected () { return selectedStudent; } Selection(OOPStudent[] raw){ rawData = raw; updateFilter(""); } private boolean checkAgainstFilter(Object o){ String data = o.toString().toLowerCase(); String filter = this.filter.toLowerCase(); return data.indexOf(filter) >=0; } void updateFilter(String newFilter){ filter = newFilter; filteredData.clear(); for (int i = 0; i