001    /*
002     * Copyright 2002-2004 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.richclient.list;
017    
018    import java.util.ArrayList;
019    import java.util.Collection;
020    import java.util.Comparator;
021    import java.util.List;
022    
023    import javax.swing.ComboBoxModel;
024    import javax.swing.MutableComboBoxModel;
025    
026    import org.springframework.binding.value.support.ListListModel;
027    import org.springframework.util.ObjectUtils;
028    
029    /**
030     * @author Keith Donald
031     */
032    public class ComboBoxListModel extends ListListModel implements ComboBoxModel, MutableComboBoxModel {
033        private Object selectedItem;
034    
035        public ComboBoxListModel() {
036            this(new ArrayList(9));
037        }
038    
039        public ComboBoxListModel(List items) {
040            super(items);
041            if (getSize() > 0) {
042                selectedItem = getElementAt(0);
043            }
044        }
045    
046        public ComboBoxListModel(List items, Comparator sorter) {
047            super(items, sorter);
048            if (getSize() > 0) {
049                selectedItem = getElementAt(0);
050            }
051        }
052    
053        public Object getSelectedItem() {
054            return selectedItem;
055        }
056    
057        public void setSelectedItem(Object anItem) {
058            if (!ObjectUtils.nullSafeEquals(selectedItem, anItem)) {
059                this.selectedItem = anItem;
060                if (this.selectedItem == null) {
061                    setSelectedItemOnNullValue();
062                }
063                fireContentsChanged(this, -1, -1);
064            }
065        }
066    
067        public void add(int index, Object o) {
068            super.add(index, o);
069            setSelectedItemIfNecessary(o);
070        }
071    
072        protected void setSelectedItemOnNullValue() {
073            setSelectedItemIfNecessary(null);
074        }
075    
076        protected void setSelectedItemIfNecessary(Object o) {
077            if (getItems().size() > 0 && getSelectedItem() == null) {
078                if (o != null) {
079                    setSelectedItem(o);
080                }
081                else {
082                    setSelectedItem(getItems().get(0));
083                }
084            }
085        }
086    
087        public boolean add(Object o) {
088            boolean result = super.add(o);
089            if (result) {
090                setSelectedItemIfNecessary(o);
091            }
092            return result;
093        }
094    
095        public boolean addAll(Collection c) {
096            boolean result = super.addAll(c);
097            if (result) {
098                setSelectedItemIfNecessary(null);
099            }
100            return result;
101        }
102    
103        public boolean addAll(int index, Collection c) {
104            boolean result = super.addAll(index, c);
105            if (result) {
106                setSelectedItemIfNecessary(null);
107            }
108            return result;
109        }
110    
111        public void clear() {
112            super.clear();
113            this.selectedItem = null;
114        }
115    
116        public Object remove(int index) {
117            if (get(index) == selectedItem) {
118                if (index == 0) {
119                    setSelectedItem(getSize() == 1 ? null : get(index + 1));
120                }
121                else {
122                    setSelectedItem(get(index - 1));
123                }
124            }
125            return super.remove(index);
126        }
127    
128        public void addElement(Object anObject) {
129            add(anObject);
130        }
131    
132        public void insertElementAt(Object anObject, int index) {
133            add(index, anObject);
134        }
135    
136        public void removeElementAt(int index) {
137            remove(index);
138        }
139    
140        public void removeElement(Object o) {
141            remove(o);
142        }
143    
144    }