/*
*
* Copyright (c) 2000-2007 by Rodney Kinney
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License (LGPL) as published by the Free Software Foundation.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, copies are available
* at http://www.opensource.org.
*/
package VASSAL.chat.ui;
import java.util.List;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import VASSAL.chat.Player;
import VASSAL.chat.Room;
import VASSAL.i18n.Resources;
/**
* JTree component displaying chat rooms on the server
* @author rkinney
*
*/
public class RoomTree extends JTree {
private static final long serialVersionUID = 1L;
protected DefaultTreeModel model;
protected DefaultMutableTreeNode root;
public RoomTree() {
setRootVisible(false);
setShowsRootHandles(true);
root = new DefaultMutableTreeNode(Resources.getString("Chat.server")); //$NON-NLS-1$
model = new DefaultTreeModel(root) {
private static final long serialVersionUID = 1L;
public boolean isLeaf(Object node) {
return ((DefaultMutableTreeNode) node).getUserObject() instanceof Player;
}
};
setModel(model);
setCellRenderer(new RoomTreeRenderer());
}
public synchronized void setRooms(Room[] room) {
if (room == null) {
room = new Room[0];
}
// Remove rooms no longer present
for (int i = 0; i < root.getChildCount(); ++i) {
Room r = roomAt(i);
int j = 0;
for (j = 0; j < room.length; ++j) {
if (room[j] == r) {
break;
}
else if (room[j].equals(r)) {
model.valueForPathChanged
(new TreePath(((DefaultMutableTreeNode) root.getChildAt(i))
.getPath()), room[j]);
break;
}
}
if (j >= room.length) { // No match
model.removeNodeFromParent((DefaultMutableTreeNode) root.getChildAt(i--));
}
}
// Add new rooms
for (int i = 0; i < room.length; ++i) {
int j;
for (j = 0; j < root.getChildCount(); ++j) {
if (roomAt(j) == room[i]) {
break;
}
}
if (j >= root.getChildCount()) {
model.insertNodeInto
(new DefaultMutableTreeNode(room[i]), root, i);
}
}
// Update players
for (int i = 0; i < root.getChildCount(); ++i) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) root.getChildAt(i);
List<Player> p = roomAt(i).getPlayerList();
while (p.size()< node.getChildCount()) {
model.removeNodeFromParent((DefaultMutableTreeNode) node.getChildAt(0));
}
while (p.size() > node.getChildCount()) {
model.insertNodeInto
(new DefaultMutableTreeNode(room[i]), node, 0);
}
for (int j = 0; j < node.getChildCount(); ++j) {
model.valueForPathChanged
(new TreePath(((DefaultMutableTreeNode) node.getChildAt(j))
.getPath()), p.get(j));
}
}
}
protected Room roomAt(int index) {
return (Room) ((DefaultMutableTreeNode) root.getChildAt(index)).getUserObject();
}
}