KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > prefuse > data > query > ListModel


1 package prefuse.data.query;
2
3 import java.util.ArrayList JavaDoc;
4
5 import javax.swing.DefaultListSelectionModel JavaDoc;
6 import javax.swing.MutableComboBoxModel JavaDoc;
7 import javax.swing.event.ListDataEvent JavaDoc;
8 import javax.swing.event.ListDataListener JavaDoc;
9
10 import prefuse.util.collections.CopyOnWriteArrayList;
11
12 /**
13  * List data model supporting both data modeling and selection management.
14  * Though generally useful, this has been designed particularly to support
15  * dynamic queries.
16  *
17  * @author <a HREF="http://jheer.org">jeffrey heer</a>
18  */

19 public class ListModel extends DefaultListSelectionModel JavaDoc
20     implements MutableComboBoxModel JavaDoc
21 {
22     private ArrayList JavaDoc m_items = new ArrayList JavaDoc();
23     private CopyOnWriteArrayList m_lstnrs = new CopyOnWriteArrayList();
24     
25     /**
26      * Create an empty ListModel.
27      */

28     public ListModel() {
29         // do nothing
30
}
31     
32     /**
33      * Create a ListModel with the provided items.
34      * @param items the items for the data model.
35      */

36     public ListModel(final Object JavaDoc[] items) {
37         for ( int i=0; i<items.length; ++i )
38             m_items.add(items[i]);
39     }
40     
41     // --------------------------------------------------------------------
42

43     /**
44      * Indicates if the ListModel currently has multiple selections.
45      * @return true if there are multiple selections, false otherwise
46      */

47     private boolean isMultipleSelection() {
48         return getMaxSelectionIndex()-getMinSelectionIndex() > 0;
49     }
50     
51     /**
52      * @see javax.swing.ComboBoxModel#getSelectedItem()
53      */

54     public Object JavaDoc getSelectedItem() {
55         int idx = getMinSelectionIndex();
56         return ( idx == -1 ? null : m_items.get(idx) );
57     }
58     
59     /**
60      * @see javax.swing.ComboBoxModel#setSelectedItem(java.lang.Object)
61      */

62     public void setSelectedItem(Object JavaDoc item) {
63         int idx = m_items.indexOf(item);
64         if ( idx < 0 ) return;
65         
66         if ( !isMultipleSelection() && idx == getMinSelectionIndex() )
67             return;
68         
69         super.setSelectionInterval(idx,idx);
70         fireDataEvent(this,ListDataEvent.CONTENTS_CHANGED,-1,-1);
71     }
72     
73     /**
74      * @see javax.swing.ListModel#getSize()
75      */

76     public int getSize() {
77         return m_items.size();
78     }
79     
80     /**
81      * @see javax.swing.ListModel#getElementAt(int)
82      */

83     public Object JavaDoc getElementAt(int idx) {
84         return m_items.get(idx);
85     }
86     
87     /**
88      * @see javax.swing.MutableComboBoxModel#addElement(java.lang.Object)
89      */

90     public void addElement(Object JavaDoc item) {
91         m_items.add(item);
92         int sz = m_items.size()-1;
93         fireDataEvent(this,ListDataEvent.INTERVAL_ADDED,sz,sz);
94         if ( sz >= 0 && isSelectionEmpty() && item != null )
95             setSelectedItem(item);
96     }
97     
98     /**
99      * @see javax.swing.MutableComboBoxModel#insertElementAt(java.lang.Object, int)
100      */

101     public void insertElementAt(Object JavaDoc item, int idx) {
102         m_items.add(idx, item);
103         fireDataEvent(this,ListDataEvent.INTERVAL_ADDED,idx,idx);
104     }
105     
106     /**
107      * @see javax.swing.MutableComboBoxModel#removeElement(java.lang.Object)
108      */

109     public void removeElement(Object JavaDoc item) {
110         int idx = m_items.indexOf(item);
111         if ( idx >= 0 )
112             removeElementAt(idx);
113     }
114     
115     /**
116      * @see javax.swing.MutableComboBoxModel#removeElementAt(int)
117      */

118     public void removeElementAt(int idx) {
119         if ( !isMultipleSelection() && idx == getMinSelectionIndex() ) {
120             int sidx = ( idx==0 ? getSize()==1 ? -1 : idx+1 : idx-1 );
121             Object JavaDoc sel = ( sidx == -1 ? null : m_items.get(sidx) );
122             setSelectedItem(sel);
123         }
124     
125         m_items.remove(idx);
126         fireDataEvent(this,ListDataEvent.INTERVAL_REMOVED,idx,idx);
127     }
128     
129     // --------------------------------------------------------------------
130
// List Data Listeners
131

132     /**
133      * @see javax.swing.ListModel#addListDataListener(javax.swing.event.ListDataListener)
134      */

135     public void addListDataListener(ListDataListener JavaDoc l) {
136         if ( !m_lstnrs.contains(l) )
137             m_lstnrs.add(l);
138     }
139     
140     /**
141      * @see javax.swing.ListModel#removeListDataListener(javax.swing.event.ListDataListener)
142      */

143     public void removeListDataListener(ListDataListener JavaDoc l) {
144         m_lstnrs.remove(l);
145     }
146     
147     /**
148      * Fires a change notification in response to changes in the ListModel.
149      */

150     protected void fireDataEvent(Object JavaDoc src, int type, int idx0, int idx1) {
151         Object JavaDoc[] lstnrs = m_lstnrs.getArray();
152         if ( lstnrs.length > 0 ) {
153             ListDataEvent JavaDoc e = new ListDataEvent JavaDoc(src, type, idx0, idx1);
154             for ( int i=0; i<lstnrs.length; ++i ) {
155                 ((ListDataListener JavaDoc)lstnrs[i]).contentsChanged(e);
156             }
157         }
158     }
159
160 } // end of class ListModel
161
Popular Tags