/*
* Freeplane - mind map editor
* Copyright (C) 2008 Dimitry Polivaev
*
* This file author is Dimitry Polivaev
*
* 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, see <http://www.gnu.org/licenses/>.
*/
package org.freeplane.core.util.collection;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ListModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
/**
* @author Dimitry Polivaev
*/
public class ExtendedComboBoxModel extends DefaultComboBoxModel {
private class ExtensionDataListener implements ListDataListener {
/*
* (non-Javadoc)
* @see
* javax.swing.event.ListDataListener#contentsChanged(javax.swing.event
* .ListDataEvent)
*/
public void contentsChanged(final ListDataEvent e) {
final int size = getOwnSize();
fireContentsChanged(getModel(), size + e.getIndex0(), size + e.getIndex1());
}
/*
* (non-Javadoc)
* @see
* javax.swing.event.ListDataListener#intervalAdded(javax.swing.event
* .ListDataEvent)
*/
public void intervalAdded(final ListDataEvent e) {
final 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(final ListDataEvent e) {
final int size = getOwnSize();
fireIntervalRemoved(getModel(), size + e.getIndex0(), size + e.getIndex1());
}
}
/**
*
*/
private static final long serialVersionUID = 1L;
private ListModel extension = null;
final private ExtensionDataListener extensionDataListener = new ExtensionDataListener();
public ExtendedComboBoxModel() {
super();
}
public ExtendedComboBoxModel(final Object[] o) {
super(o);
}
public ExtendedComboBoxModel(final Vector<?> v) {
super(v);
}
public void addExtensionList(final ListModel listModel) {
if (extension == null) {
setExtensionList(listModel);
}
else {
final int oldSize = getOwnSize();
extension.removeListDataListener(extensionDataListener);
extension = new DoubleListModel(extension, listModel);
final int newListSize = listModel.getSize();
if (newListSize != 0) {
fireIntervalAdded(listModel, oldSize + 1, oldSize + newListSize);
}
extension.addListDataListener(extensionDataListener);
}
}
@Override
public Object getElementAt(final int i) {
final int s = getOwnSize();
if (i < s || extension == null) {
return super.getElementAt(i);
}
return extension.getElementAt(i - s);
}
private int getExtensionSize() {
return extension != null ? extension.getSize() : 0;
}
@Override
public int getIndexOf(final Object o) {
final int idx = super.getIndexOf(o);
if (idx > -1 || extension == null) {
return idx;
}
final int extIdx = getExtensionIndex(o);
return extIdx > -1 ? extIdx + getOwnSize() : -1;
}
private int getExtensionIndex(final Object o) {
final int size = extension.getSize();
for (int count = 0; count < size; count++) {
if (extension.getElementAt(count).equals(o)) {
return count;
}
}
return -1;
}
private ExtendedComboBoxModel getModel() {
return this;
}
/**
*/
private int getOwnSize() {
return super.getSize();
}
@Override
public int getSize() {
return getOwnSize() + getExtensionSize();
}
@Override
public void insertElementAt(final Object o, final int i) {
super.insertElementAt(o, Math.min(getOwnSize(), i));
}
@Override
public void removeAllElements() {
super.removeAllElements();
if (extension != null) {
setExtensionList(null);
}
}
@Override
public void removeElement(final Object o) {
super.removeElement(o);
}
@Override
public void removeElementAt(final int i) {
if (i < getOwnSize()) {
super.removeElementAt(i);
}
}
/**
*/
public void setExtensionList(final ListModel 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);
}
}
}
}