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__ */