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 }