/*FreeMind - A Program for creating and viewing Mindmaps
*Copyright (C) 2000-2006 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitri Polivaev and others.
*
*See COPYING for Details
*
*This program is free software; you can redistribute it and/or
*modify it under the terms of the GNU General Public License
*as published by the Free Software Foundation; either version 2
*of the License, or (at your option) any later version.
*
*This program is distributed in the hope that it will be useful,
*but WITHOUT ANY WARRANTY; without even the implied warranty of
*MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*GNU General Public License for more details.
*
*You should have received a copy of the GNU General Public License
*along with this program; if not, write to the Free Software
*Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* Created on 14.05.2005
*
*/
package freemind.controller.filter.util;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
/**
* @author dimitri 14.05.2005
*/
public class ExtendedComboBoxModel extends DefaultComboBoxModel {
private class ExtensionDataListener implements ListDataListener {
/*
* (non-Javadoc)
*
* @see
* javax.swing.event.ListDataListener#intervalAdded(javax.swing.event
* .ListDataEvent)
*/
public void intervalAdded(ListDataEvent e) {
int size = getOwnSize();
fireIntervalAdded(getModel(), size + e.getIndex0(),
size + e.getIndex1());
}
/*
* (non-Javadoc)
*
* @see
* javax.swing.event.ListDataListener#intervalRemoved(javax.swing.event
* .ListDataEvent)
*/
public void intervalRemoved(ListDataEvent e) {
int size = getOwnSize();
fireIntervalRemoved(getModel(), size + e.getIndex0(),
size + e.getIndex1());
}
/*
* (non-Javadoc)
*
* @see
* javax.swing.event.ListDataListener#contentsChanged(javax.swing.event
* .ListDataEvent)
*/
public void contentsChanged(ListDataEvent e) {
int size = getOwnSize();
fireContentsChanged(getModel(), size + e.getIndex0(),
size + e.getIndex1());
}
}
private SortedListModel extension = null;
private ExtensionDataListener extensionDataListener = new ExtensionDataListener();
/**
*/
public void setExtensionList(final SortedListModel sortedListModel) {
final int ownSize = getOwnSize();
{
if (extension != null) {
extension.removeListDataListener(extensionDataListener);
final int extensionSize = getExtensionSize();
if (extensionSize > 0) {
fireIntervalRemoved(this, ownSize, ownSize + extensionSize
- 1);
}
}
}
{
extension = sortedListModel;
final int extensionSize = getExtensionSize();
if (extensionSize > 0) {
fireIntervalAdded(this, ownSize, ownSize + extensionSize - 1);
}
if (extension != null) {
extension.addListDataListener(extensionDataListener);
}
}
}
public ExtendedComboBoxModel() {
super();
}
public ExtendedComboBoxModel(Object[] o) {
super(o);
}
public ExtendedComboBoxModel(Vector v) {
super(v);
}
public Object getElementAt(int i) {
int s = getOwnSize();
if (i < s || extension == null)
return super.getElementAt(i);
return extension.getElementAt(i - s);
}
public int getSize() {
return getOwnSize() + getExtensionSize();
}
private int getExtensionSize() {
return extension != null ? extension.getSize() : 0;
}
/**
*/
private int getOwnSize() {
return super.getSize();
}
private ExtendedComboBoxModel getModel() {
return this;
}
public void insertElementAt(Object o, int i) {
super.insertElementAt(o, Math.min(getOwnSize(), i));
}
public void removeAllElements() {
super.removeAllElements();
if (extension != null) {
extension.clear();
}
}
public void removeElement(Object o) {
super.removeElement(o);
}
public void removeElementAt(int i) {
if (i < getOwnSize())
super.removeElementAt(i);
}
public void addSortedElement(Object o) {
if (extension != null && !extension.contains(o)) {
extension.add(o);
}
}
public int getIndexOf(Object o) {
int idx = super.getIndexOf(o);
if (idx > -1 || extension == null) {
return idx;
}
int extIdx = extension.getIndexOf(o);
return extIdx > -1 ? extIdx + getOwnSize() : -1;
}
}