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 }