/* BoxTreeModel.java
*
* Created September 20, 2009
*
* This file is a part of Shoddy Battle.
* Copyright (C) 2009 Catherine Fitzpatrick and Benjamin Gwin
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, visit the Free Software Foundation, Inc.
* online at http://gnu.org.
*/
package shoddybattleclient.utils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import shoddybattleclient.shoddybattle.Pokemon;
import shoddybattleclient.shoddybattle.PokemonBox;
import shoddybattleclient.shoddybattle.PokemonBox.PokemonWrapper;
/**
* A subclass of TreeModel that is used to display pokemon in boxes in the team
* builder
* @author ben
*/
public class BoxTreeModel implements TreeModel {
private static final String m_root = "Root";
private static final String m_default = "(default)";
private static final String m_teamRoot = "Teams";
private static final String m_boxRoot = "Boxes";
private List<TreeModelListener> m_listeners = new ArrayList<TreeModelListener>();
private List<Pokemon> m_teamPokemon = new ArrayList<Pokemon>();
private List<PokemonWrapper> m_boxPokemon = new ArrayList<PokemonWrapper>();
public static boolean isDefaultNode(Object name) {
return m_default.equals(name);
}
public static boolean isTeamRoot(Object name) {
return m_teamRoot.equals(name);
}
public static boolean isBoxRoot(Object name) {
return m_boxRoot.equals(name);
}
public static TreePath getTeamPath() {
return new TreePath(new Object[]{m_root, m_teamRoot});
}
public static TreePath getBoxPath() {
return new TreePath(new Object[]{m_root, m_boxRoot});
}
public Object getRoot() {
return m_root;
}
public Object getChild(Object parent, int idx) {
if (parent.equals(m_root)) {
switch (idx) {
case 0: return m_default;
case 1: return m_teamRoot;
case 2: return m_boxRoot;
default: return null;
}
} else if (parent.equals(m_teamRoot)) {
return m_teamPokemon.get(idx);
} else if (parent.equals(m_boxRoot)) {
return m_boxPokemon.get(idx);
} else {
return null;
}
}
public int getChildCount(Object node) {
if (node.equals(m_root)) {
return 3;
} else if (node.equals(m_teamRoot)) {
return m_teamPokemon.size();
} else if (node.equals(m_boxRoot)) {
return m_boxPokemon.size();
} else {
return 0;
}
}
public boolean isLeaf(Object node) {
return (node instanceof Pokemon) || (node instanceof PokemonWrapper) || (node.equals(m_default));
}
public void valueForPathChanged(TreePath path, Object val) {
//not editable
}
public int getIndexOfChild(Object parent, Object child) {
if ((parent == null) || (child == null)) return -1;
if (parent.equals(m_root)) {
return (child.equals(m_teamRoot)) ? 0 : 1;
} else if (parent.equals(m_teamRoot)) {
return m_teamPokemon.indexOf(child);
} else if (parent.equals(m_boxRoot)) {
return m_boxPokemon.indexOf(child);
} else {
return -1;
}
}
public void addTreeModelListener(TreeModelListener l) {
m_listeners.add(l);
}
public void removeTreeModelListener(TreeModelListener l) {
m_listeners.remove(l);
}
public void addTeamPokemon(Pokemon p) {
m_teamPokemon.add(p);
}
public void addBoxPokemon(PokemonWrapper wrapper) {
//This is faster for already sorted lists
int i = 0;
for (i = 0; i < m_boxPokemon.size(); i++) {
int compare = wrapper.compareTo(m_boxPokemon.get(i));
if (compare == 0 && m_boxPokemon.get(i).getParent().equals(wrapper.getParent())) {
m_boxPokemon.set(i, wrapper);
fireChange(wrapper, i);
return;
}
if (compare < 0) break;
}
m_boxPokemon.add(i, wrapper);
fireInsert(wrapper, i);
}
private void fireInsert(PokemonWrapper wrapper, int index) {
TreePath path = getBoxPath();
TreeModelEvent evt = new TreeModelEvent(this, path, new int[]{index}, new Object[]{wrapper});
for (TreeModelListener listener : m_listeners) {
listener.treeNodesInserted(evt);
}
}
private void fireChange(PokemonWrapper wrapper, int index) {
TreePath path = getBoxPath();
TreeModelEvent evt = new TreeModelEvent(this, path, new int[]{index}, new Object[]{wrapper});
for (TreeModelListener listener : m_listeners) {
listener.treeNodesChanged(evt);
}
}
public void addBox(PokemonBox box) {
for (int i = 0; i < box.getSize(); i++) {
m_boxPokemon.add(box.getPokemonAt(i));
}
Collections.sort(m_boxPokemon);
}
}