package org.japura.gui.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import javax.swing.event.EventListenerList;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import org.japura.gui.event.ListCheckListener;
import org.japura.gui.event.ListEvent;
import org.japura.gui.event.ListLockListener;
import org.japura.gui.event.ListModelListener;
/**
* 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 DefaultListCheckModel implements ListCheckModel, Serializable{
protected EventListenerList listenerList = new EventListenerList();
private List<Object> items;
private List<Object> checkeds;
private List<Object> lockeds;
public DefaultListCheckModel() {
checkeds = new ArrayList<Object>();
lockeds = new ArrayList<Object>();
items = new ArrayList<Object>();
}
protected void fireAddedListModelListeners(List<Object> values, int index1,
int index2,
boolean valueIsAdjusting) {
ListModelListener listeners[] =
listenerList.getListeners(ListModelListener.class);
ListEvent e = new ListEvent(this, values, valueIsAdjusting);
for (ListModelListener l : listeners) {
l.valueAdded(e);
}
ListDataEvent e2 =
new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index1, index2);
ListDataListener listeners2[] =
listenerList.getListeners(ListDataListener.class);
for (ListDataListener l : listeners2) {
l.intervalAdded(e2);
}
}
protected void fireRemovedListModelListeners(List<Object> values,
boolean valueIsAdjusting) {
ListModelListener listeners[] =
listenerList.getListeners(ListModelListener.class);
ListEvent e = new ListEvent(this, values, valueIsAdjusting);
for (ListModelListener l : listeners) {
l.valueRemoved(e);
}
}
protected void fireRemovedListModelListeners(int index1, int index2,
boolean valueIsAdjusting) {
ListDataEvent e2 =
new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index1, index2);
ListDataListener listeners2[] =
listenerList.getListeners(ListDataListener.class);
for (ListDataListener l : listeners2) {
l.intervalRemoved(e2);
}
}
protected void fireAddLockListModelListeners(List<Object> values,
boolean valueIsAdjusting) {
fireLockListModelListeners(values, valueIsAdjusting, true);
}
protected void fireRemoveLockListModelListeners(List<Object> values,
boolean valueIsAdjusting) {
fireLockListModelListeners(values, valueIsAdjusting, false);
}
private void fireLockListModelListeners(List<Object> values,
boolean valueIsAdjusting, boolean add) {
ListLockListener listeners[] =
listenerList.getListeners(ListLockListener.class);
ListEvent e = new ListEvent(this, values, valueIsAdjusting);
for (ListLockListener l : listeners) {
if (add)
l.addLock(e);
else
l.removeLock(e);
}
}
protected void fireAddCheckListModelListeners(List<Object> values,
boolean valueIsAdjusting) {
fireCheckListModelListeners(values, valueIsAdjusting, true);
}
protected void fireRemoveCheckListModelListeners(List<Object> values,
boolean valueIsAdjusting) {
fireCheckListModelListeners(values, valueIsAdjusting, false);
}
private void fireCheckListModelListeners(List<Object> values,
boolean valueIsAdjusting, boolean add) {
ListCheckListener listeners[] =
listenerList.getListeners(ListCheckListener.class);
ListEvent e = new ListEvent(this, values, valueIsAdjusting);
for (ListCheckListener l : listeners) {
if (add)
l.addCheck(e);
else
l.removeCheck(e);
}
}
@Override
public void clear() {
clear(false);
}
private void clear(boolean valueIsAdjusting) {
if (items.size() == 0)
return;
checkeds.clear();
lockeds.clear();
if (items.size() > 0) {
int index2 = items.size() - 1;
items.clear();
fireRemovedListModelListeners(0, index2, valueIsAdjusting);
fireRemovedListModelListeners(new ArrayList<Object>(), valueIsAdjusting);
}
}
public void clearLockeds() {
clearLockeds(false);
}
private void clearLockeds(boolean valueIsAdjusting) {
if (lockeds.size() == 0)
return;
lockeds.clear();
fireRemoveLockListModelListeners(new ArrayList<Object>(), valueIsAdjusting);
}
@Override
public void addListLockListener(ListLockListener listener) {
listenerList.add(ListLockListener.class, listener);
}
@Override
public ListLockListener[] getListLockListeners() {
return listenerList.getListeners(ListLockListener.class);
}
@Override
public void removeListLockListener(ListLockListener listener) {
listenerList.remove(ListLockListener.class, listener);
}
@Override
public void addLock(Object... values) {
if (values.length == 0) {
return;
}
List<Object> list = new ArrayList<Object>();
for (Object value : values) {
if (contains(value) && lockeds.contains(value) == false) {
lockeds.add(value);
list.add(value);
}
}
if (list.size() > 0) {
fireAddLockListModelListeners(list, false);
}
}
@Override
public boolean isLocked(Object obj) {
return lockeds.contains(obj);
}
@Override
public void removeLock(Object... values) {
if (values.length == 0)
return;
List<Object> list = new ArrayList<Object>();
for (Object value : values) {
if (lockeds.remove(value)) {
list.add(value);
}
}
if (list.size() > 0) {
fireRemoveLockListModelListeners(list, false);
}
}
@Override
public void setLock(Object... objs) {
clearLockeds(true);
addLock(objs);
}
@Override
public List<Object> getLockeds() {
return new ArrayList<Object>(lockeds);
}
private void clearCheckeds(boolean valueIsAdjusting) {
if (checkeds.size() == 0) {
return;
}
checkeds.clear();
fireRemoveCheckListModelListeners(new ArrayList<Object>(), valueIsAdjusting);
}
@Override
public void addListCheckListener(ListCheckListener listener) {
listenerList.add(ListCheckListener.class, listener);
}
@Override
public ListCheckListener[] getListCheckListeners() {
return listenerList.getListeners(ListCheckListener.class);
}
@Override
public void removeListCheckListener(ListCheckListener listener) {
listenerList.remove(ListCheckListener.class, listener);
}
@Override
public void addCheck(Object... values) {
if (values.length == 0) {
return;
}
List<Object> list = new ArrayList<Object>();
for (Object value : values) {
if (contains(value) && checkeds.contains(value) == false) {
checkeds.add(value);
list.add(value);
}
}
if (list.size() > 0) {
fireAddCheckListModelListeners(list, false);
}
}
@Override
public boolean isChecked(Object value) {
return checkeds.contains(value);
}
@Override
public void removeCheck(Object... values) {
if (values.length == 0)
return;
List<Object> list = new ArrayList<Object>();
for (Object value : values) {
if (checkeds.remove(value)) {
list.add(value);
}
}
if (list.size() > 0) {
fireRemoveCheckListModelListeners(list, false);
}
}
@Override
public void setCheck(Object... values) {
clearCheckeds(true);
addCheck(values);
}
@Override
public List<Object> getCheckeds() {
return new ArrayList<Object>(checkeds);
}
@Override
public void addElement(int index, Object value) {
if (index >= 0 && index <= items.size() && items.contains(value) == false) {
List<Object> list = new ArrayList<Object>();
items.add(index, value);
list.add(value);
fireAddedListModelListeners(list, index, index, false);
}
}
@Override
public void setElement(Object... values) {
clear(true);
addElement(values);
}
@Override
public void addElement(Object... values) {
if (values.length == 0)
return;
List<Object> list = new ArrayList<Object>();
for (Object value : values) {
items.add(value);
list.add(value);
}
if (list.size() > 0) {
int index1 = items.size();
int index2 = index1 - 1 + list.size();
fireAddedListModelListeners(list, index1, index2, false);
}
}
@Override
public boolean contains(Object obj) {
return items.contains(obj);
}
@Override
public void removeElement(Object... values) {
if (values.length == 0)
return;
HashMap<Object, Integer> indexMap = new HashMap<Object, Integer>();
for (Object value : values) {
indexMap.put(value, items.indexOf(value));
}
List<Integer> indexList = new ArrayList<Integer>();
List<Object> list = new ArrayList<Object>();
for (Object value : values) {
if (items.remove(value)) {
indexList.add(indexMap.get(value));
list.add(value);
lockeds.remove(value);
checkeds.remove(value);
}
}
if (list.size() > 0) {
Collections.sort(indexList);
int index1 = -1;
int index2 = -1;
for (int i = 0; i < indexList.size(); i++) {
if (index1 == -1) {
index1 = indexList.get(i);
index2 = index1;
} else {
if (indexList.get(i) > index2 + 1) {
fireRemovedListModelListeners(index1, index2, true);
index1 = indexList.get(i);
index2 = index1;
} else {
index2 = indexList.get(i);
}
}
if (i == indexList.size() - 1) {
fireRemovedListModelListeners(index1, index2, false);
}
}
fireRemovedListModelListeners(list, false);
}
}
@Override
public Object getElementAt(int index) {
return items.get(index);
}
@Override
public int getSize() {
return items.size();
}
@Override
public void addListModelListener(ListModelListener listener) {
listenerList.add(ListModelListener.class, listener);
}
@Override
public ListModelListener[] getListModelListeners() {
return listenerList.getListeners(ListModelListener.class);
}
@Override
public void removeListModelListener(ListModelListener listener) {
listenerList.remove(ListModelListener.class, listener);
}
@Override
public void addListDataListener(ListDataListener l) {
listenerList.add(ListDataListener.class, l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listenerList.remove(ListDataListener.class, l);
}
@Override
public void removeChecks() {
List<Object> list = null;
if (listenerList.getListenerCount(ListCheckListener.class) > 0) {
list = new ArrayList<Object>(checkeds);
}
checkeds.clear();
if (list != null) {
fireRemoveCheckListModelListeners(list, false);
}
}
@Override
public void removeLocks() {
List<Object> list = null;
if (listenerList.getListenerCount(ListLockListener.class) > 0) {
list = new ArrayList<Object>(checkeds);
}
lockeds.clear();
if (list != null) {
fireRemoveLockListModelListeners(list, false);
}
}
@Override
public int getLocksCount() {
return lockeds.size();
}
@Override
public int getChecksCount() {
return checkeds.size();
}
@Override
public void checkAll() {
List<Object> list = null;
if (listenerList.getListenerCount(ListCheckListener.class) > 0) {
list = new ArrayList<Object>(items);
}
checkeds.clear();
checkeds.addAll(items);
if (list != null) {
fireAddCheckListModelListeners(list, false);
}
}
@Override
public void lockAll() {
List<Object> list = null;
if (listenerList.getListenerCount(ListLockListener.class) > 0) {
list = new ArrayList<Object>(items);
}
lockeds.clear();
lockeds.addAll(items);
if (list != null) {
fireAddLockListModelListeners(list, false);
}
}
}