package org.japura.gui.model;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractListModel;
import org.japura.gui.event.PriorityComboBoxEvent;
import org.japura.gui.event.PriorityComboBoxListener;
/**
* Copyright (C) 2010-2011 Carlos Eduardo Leite de Andrade
* <P>
* This library is free software: you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version.
* <P>
* 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 Lesser General Public License for more
* details.
* <P>
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <A
* HREF="www.gnu.org/licenses/">www.gnu.org/licenses/</A>
* <P>
* For more information, contact: <A HREF="www.japura.org">www.japura.org</A>
* <P>
*
* @author Carlos Eduardo Leite de Andrade
*/
public class DefaultPriorityComboBoxModel extends AbstractListModel implements
PriorityComboBoxModel{
private static final long serialVersionUID = 3463014910762087126L;
private List<Object> items;
private List<Object> priorityItems;
private Object selectedItem;
private int priorityItemsCapacity;
private int minimalSizeForPriority;
private boolean increasePriorityOnSelection;
public DefaultPriorityComboBoxModel(Object[] objects) {
this();
addAll(objects);
}
public DefaultPriorityComboBoxModel(List<?> objects) {
this();
addAll(objects);
}
public DefaultPriorityComboBoxModel() {
items = new ArrayList<Object>();
priorityItems = new ArrayList<Object>();
priorityItemsCapacity = 3;
setMinimalSizeForPriority(10);
increasePriorityOnSelection = true;
}
private void addAll(Object... objects) {
for (Object obj : objects) {
items.add(obj);
}
}
@Override
public void addElement(Object item, boolean priorityItem) {
if (items.contains(item) == false) {
items.add(item);
int i = items.size() - 1;
if (priorityItem) {
addToPriority(item);
}
fireContentsChanged(this, i, i);
if (selectedItem == null) {
selectedItem = item;
}
}
}
public PriorityComboBoxListener[] getPriorityComboBoxListeners() {
return (PriorityComboBoxListener[]) listenerList
.getListeners(PriorityComboBoxListener.class);
}
@Override
public void addPriorityComboBoxListener(PriorityComboBoxListener listener) {
listenerList.add(PriorityComboBoxListener.class, listener);
}
@Override
public void removePriorityComboBoxListener(PriorityComboBoxListener listener) {
listenerList.remove(PriorityComboBoxListener.class, listener);
}
protected void firePriorityComboBoxListeners() {
PriorityComboBoxEvent event = new PriorityComboBoxEvent(this);
PriorityComboBoxListener[] array = getPriorityComboBoxListeners();
for (PriorityComboBoxListener listener : array) {
listener.priorityChanged(event);
}
}
@Override
public List<Object> getPriorityItems() {
return new ArrayList<Object>(priorityItems);
}
@Override
public int getPriorityItemsCapacity() {
return priorityItemsCapacity;
}
@Override
public void setPriorityItemsCapacity(int capacity) {
priorityItemsCapacity = Math.max(1, capacity);
while (priorityItems.size() > getPriorityItemsCapacity()) {
int i = priorityItems.size() - 1;
priorityItems.remove(i);
fireIntervalRemoved(this, i, i);
}
firePriorityComboBoxListeners();
}
@Override
public Object getSelectedItem() {
return selectedItem;
}
@Override
public void setSelectedItem(Object anItem) {
if (items.contains(anItem)) {
selectedItem = anItem;
if (isIncreasePriorityOnSelection() && anItem != null) {
addToPriority(anItem);
}
}
}
@Override
public Object getElementAt(int index) {
if (index < 0 || index >= getSize())
return null;
if (isPriorityAvailable()) {
if (index < priorityItems.size()) {
return priorityItems.get(index);
}
index -= priorityItems.size();
}
return items.get(index);
}
@Override
public int getSize() {
if (isPriorityAvailable()) {
return items.size() + priorityItems.size();
}
return items.size();
}
@Override
public void addToPriority(Object obj) {
if (priorityItems.contains(obj)) {
int index = priorityItems.indexOf(obj);
if (index > 0) {
priorityItems.remove(index);
priorityItems.add(index - 1, obj);
}
} else {
if (priorityItems.size() == getPriorityItemsCapacity()) {
priorityItems.remove(priorityItems.size() - 1);
}
priorityItems.add(obj);
}
if (isPriorityAvailable()) {
int index = priorityItems.indexOf(obj);
fireContentsChanged(this, index, index);
}
firePriorityComboBoxListeners();
}
@Override
public void removeFromPriority(Object obj) {
if (priorityItems.contains(obj)) {
int index = priorityItems.indexOf(obj);
boolean fire = isPriorityAvailable();
priorityItems.remove(index);
if (fire) {
fireContentsChanged(this, index, index);
}
}
}
@Override
public void addElement(Object item) {
addElement(item, false);
}
@Override
public void insertElementAt(Object item, int index) {
if (items.contains(item) == false) {
if (isPriorityAvailable()) {
index -= priorityItems.size();
}
if (index >= 0 && index <= items.size()) {
items.add(index, item);
}
}
}
@Override
public void removeElement(Object obj) {
if (obj == null)
return;
priorityItems.remove(obj);
int index = items.indexOf(obj);
if (items.remove(obj)) {
int i = index;
if (isPriorityAvailable()) {
i += getPriorityItemsSize();
}
fireIntervalRemoved(this, i, i);
if (priorityItems.remove(obj)) {
firePriorityComboBoxListeners();
}
}
if (selectedItem.equals(obj)) {
if (getSize() > 0) {
selectedItem = getElementAt(0);
} else {
selectedItem = null;
}
}
}
@Override
public void removeElementAt(int index) {
Object obj = getElementAt(index);
removeElement(obj);
}
@Override
public boolean isIncreasePriorityOnSelection() {
return increasePriorityOnSelection;
}
@Override
public void setIncreasePriorityOnSelection(boolean enable) {
this.increasePriorityOnSelection = enable;
}
@Override
public int getPriorityItemsSize() {
return priorityItems.size();
}
@Override
public void clearPriorities() {
priorityItems.clear();
firePriorityComboBoxListeners();
}
@Override
public int getMinimalSizeForPriority() {
return minimalSizeForPriority;
}
@Override
public boolean isPriorityAvailable() {
if (items.size() >= getMinimalSizeForPriority()) {
return true;
}
return false;
}
@Override
public void setMinimalSizeForPriority(int size) {
minimalSizeForPriority = Math.max(1, size);
}
@Override
public boolean isPriorityItem(Object obj) {
return priorityItems.contains(obj);
}
}