1 /*
2 * Copyright (c) 2006 Stiftung Deutsches Elektronen-Synchroton,
3 * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
4 *
5 * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
6 * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
7 * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
8 * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
9 * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
10 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
11 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
12 * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
13 * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
14 * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
15 * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
16 * OR MODIFICATIONS.
17 * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
18 * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
19 * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
20 * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
21 */
22
23 package de.desy.acop.displayers.selector;
24
25 import java.lang.reflect.Array;
26
27 import javax.swing.AbstractListModel;
28 import javax.swing.ComboBoxModel;
29
30 /**
31 * <code>AcopComboBoxModel</code> is an implementation of the <code>ListModel</code>
32 * which allows adding multiple items at once. This model can only work with String
33 * objects.
34 *
35 * @author <a href="mailto:jaka.bobnar@cosylab.com">Jaka Bobnar</a>
36 * @version $Id: Templates.xml,v 1.10 2004/01/13 16:17:13 jbobnar Exp $
37 *
38 */
39 public class AcopComboBoxModel<T> extends AbstractListModel implements ComboBoxModel {
40
41 private static final long serialVersionUID = -380035760547442817L;
42 private T[] elements;
43 private T selectedItem;
44 private Class<T> type;
45
46 /**
47 * Constructs an empty DefaultComboBoxModel object.
48 */
49 @SuppressWarnings("unchecked")
50 public AcopComboBoxModel(Class<T> type) {
51 this.type = type;
52 elements = (T[]) Array.newInstance(type, 0);
53 }
54
55 /**
56 * Set the value of the selected item. The selected item may be null.
57 * <p>
58 * @param anObject The combo box value or null for no selection.
59 */
60 public void setSelectedItem(Object anObject) {
61 if ("".equals(anObject)) {
62 anObject=null;
63 }
64 if ((selectedItem != null && !selectedItem.equals( anObject )) ||
65 (selectedItem == null && anObject != null)) {
66 selectedItem= type.cast(anObject);
67 fireContentsChanged(this, -1, -1);
68 }
69 }
70
71 /*
72 * (non-Javadoc)
73 * @see javax.swing.ComboBoxModel#getSelectedItem()
74 */
75 public T getSelectedItem() {
76 return selectedItem;
77 }
78
79 /*
80 * (non-Javadoc)
81 * @see javax.swing.ListModel#getSize()
82 */
83 public int getSize() {
84 return elements.length;
85 }
86
87 /*
88 * (non-Javadoc)
89 * @see javax.swing.ListModel#getElementAt(int)
90 */
91 public Object getElementAt(int index) {
92 if ( index >= 0 && index < elements.length)
93 return elements[index];
94 else
95 return null;
96 }
97
98 /**
99 * Sets new elements to this model.
100 *
101 * @param obj new elements
102 */
103 public void setElements(T[] obj) {
104 if (obj==elements || (obj==null && elements==null)) {
105 return;
106 }
107 removeAllElements();
108 if (obj != null) {
109 elements=obj;
110 fireIntervalAdded(this,0, obj.length-1 > 0 ? obj.length - 1 : 0);
111 }
112
113 }
114
115 /**
116 * Returns all elements in the model.
117 *
118 * @return the elements
119 */
120 public T[] getElements() {
121 return elements;
122 }
123
124 /**
125 * Empties the list.
126 */
127 @SuppressWarnings("unchecked")
128 protected void removeAllElements() {
129 if ( elements.length > 0 ) {
130 int firstIndex = 0;
131 int lastIndex = elements.length - 1;
132 elements=(T[])Array.newInstance(type ,0);
133 fireIntervalRemoved(this, firstIndex, lastIndex);
134 }
135 }
136
137 /**
138 * Replaces an element at the specified index.
139 *
140 * @param index the index the element should be replaced at
141 * @param newItem the replacement element
142 */
143 public void replaceElement(int index, T newItem) {
144 if (elements == null || index > elements.length || index < 0) return;
145 elements[index] = newItem;
146 fireIntervalAdded(this, index, index);
147 }
148
149 /**
150 * Checks if this model containes the given object.
151 *
152 * @param o the object that existance should be checked for
153 * @return true if object is in the model.
154 */
155 public boolean contains(Object o) {
156 if (o == null) return false;
157 for (T obj : elements) {
158 if (o.equals(obj)) return true;
159 }
160 return false;
161 }
162
163
164 }
165
166
167 /* __oOo__ */