/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.client.ui.tokenpanel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.ListIterator;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.ListModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import com.t3.client.TabletopTool;
import com.t3.model.Token;
import com.t3.model.Zone;
public class TokenListModel implements ListModel<Token> {
private List<ListDataListener> listenerList = new CopyOnWriteArrayList<ListDataListener>();
private Zone zone;
private List<Token> tokenList;
public TokenListModel () {
this(null);
}
public TokenListModel(Zone zone) {
this.zone = zone;
}
@Override
public int getSize() {
return getTokenList().size();
}
@Override
public Token getElementAt(int index) {
return getTokenList().get(index);
}
@Override
public void addListDataListener(ListDataListener l) {
listenerList.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
listenerList.remove(l);
}
public void update() {
tokenList = new ArrayList<Token>();
if (zone == null) {
return;
}
if (TabletopTool.getPlayer().isGM()) {
tokenList.addAll(zone.getAllTokens());
} else {
for (Token token : zone.getAllTokens()) {
if (zone.isTokenVisible(token)) {
tokenList.add(token);
}
}
}
for (ListIterator<Token> iter = tokenList.listIterator(); iter.hasNext();) {
if (iter.next().isObjectStamp()) {
iter.remove();
}
}
Collections.sort(tokenList, new Comparator<Token>(){
@Override
public int compare(Token o1, Token o2) {
String lName = o1.getName();
String rName = o2.getName();
return lName.compareTo(rName);
}
});
fireContentsChangedEvent(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, tokenList.size()));
}
private void fireContentsChangedEvent(ListDataEvent e) {
for (ListDataListener listener : listenerList) {
listener.contentsChanged(e);
}
}
private List<Token> getTokenList() {
if (tokenList == null) {
update();
}
return tokenList;
}
}