/*
* $Id$
*
* Copyright (c) 2000-2009 by Rodney Kinney, Brent Easton
*
* 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.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Action;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import VASSAL.chat.ChatServerConnection;
import VASSAL.chat.Player;
import VASSAL.chat.Room;
import VASSAL.chat.SimplePlayer;
import VASSAL.chat.SimpleRoom;
/**
* Adds mouse listeners to the RoomTree components: double-click to join a room, etc. Builds a popup when right-clicking
* on a player or room
*
* @author rkinney
*
*/
public class RoomInteractionControlsInitializer implements ChatControlsInitializer {
public static final Font POPUP_MENU_FONT = new Font("Dialog", 0, 10); //$NON-NLS-1$
private List<PlayerActionFactory> playerActionFactories =
new ArrayList<PlayerActionFactory>();
private List<RoomActionFactory> roomActionFactories =
new ArrayList<RoomActionFactory>();
protected ChatServerConnection client;
private MouseAdapter currentRoomPopupBuilder;
private MouseAdapter roomPopupBuilder;
private ActionListener roomCreator;
public RoomInteractionControlsInitializer(ChatServerConnection client) {
super();
this.client = client;
}
public void initializeControls(final ChatServerControls controls) {
currentRoomPopupBuilder = new MouseAdapter() {
public void mouseReleased(MouseEvent evt) {
JTree tree = (JTree) evt.getSource();
if (evt.isMetaDown()) {
TreePath path = tree.getPathForLocation(evt.getX(), evt.getY());
if (path != null) {
Object target = ((DefaultMutableTreeNode) path.getLastPathComponent()).getUserObject();
if (target instanceof Player) {
JPopupMenu popup = buildPopupForPlayer((SimplePlayer) target, tree);
if (popup != null) {
for (int i = 0, n = popup.getComponentCount(); i < n; ++i) {
popup.getComponent(i).setFont(POPUP_MENU_FONT);
}
popup.show(tree, evt.getX(), evt.getY());
}
}
}
}
}
};
controls.getCurrentRoom().addMouseListener(currentRoomPopupBuilder);
roomPopupBuilder = new MouseAdapter() {
public void mouseReleased(MouseEvent evt) {
JTree tree = (JTree) evt.getSource();
TreePath path = tree.getPathForLocation(evt.getX(), evt.getY());
if (path != null) {
Object target = ((DefaultMutableTreeNode) path.getLastPathComponent()).getUserObject();
if (target instanceof Player) {
if (evt.isMetaDown()) {
JPopupMenu popup = buildPopupForPlayer((SimplePlayer) target, tree);
for (int i = 0, n = popup.getComponentCount(); i < n; ++i) {
popup.getComponent(i).setFont(POPUP_MENU_FONT);
}
popup.show(tree, evt.getX(), evt.getY());
}
}
else if (target instanceof SimpleRoom) {
if (evt.isMetaDown()) {
JPopupMenu popup = buildPopupForRoom((VASSAL.chat.Room) target, tree);
if (popup != null) {
for (int i = 0, n = popup.getComponentCount(); i < n; ++i) {
popup.getComponent(i).setFont(POPUP_MENU_FONT);
}
popup.show(tree, evt.getX(), evt.getY());
}
}
else if (evt.getClickCount() == 2) {
int row = tree.getRowForLocation(evt.getX(), evt.getY());
if (tree.isCollapsed(row)) {
tree.expandRow(row);
}
else {
tree.collapseRow(row);
}
doubleClickRoom((VASSAL.chat.Room) target, tree);
}
}
}
}
};
controls.getRoomTree().addMouseListener(roomPopupBuilder);
roomCreator = new ActionListener() {
public void actionPerformed(ActionEvent e) {
createRoom(controls.getNewRoom().getText());
controls.getNewRoom().setText(""); //$NON-NLS-1$
}
};
controls.getNewRoom().addActionListener(roomCreator);
}
protected void createRoom(String name) {
client.setRoom(new SimpleRoom(name));
}
public JPopupMenu buildPopupForRoom(Room room, JTree tree) {
JPopupMenu popup = new JPopupMenu();
for (RoomActionFactory f : roomActionFactories) {
popup.add(f.getAction(room, tree));
}
return popup.getComponentCount() == 0 ? null : popup;
}
public void doubleClickRoom(Room room, JTree tree) {
if (!room.equals(client.getRoom())) {
new JoinRoomAction(room, client).actionPerformed(null);
}
}
public void addPlayerActionFactory(PlayerActionFactory f) {
playerActionFactories.add(f);
}
public void addRoomActionFactory(RoomActionFactory f) {
roomActionFactories.add(f);
}
public JPopupMenu buildPopupForPlayer(SimplePlayer target, JTree tree) {
JPopupMenu popup = new JPopupMenu();
for (PlayerActionFactory f : playerActionFactories) {
final Action a = f.getAction(target, tree);
if (a != null) {
popup.add(a);
}
}
return popup.getComponentCount() == 0 ? null : popup;
}
public void uninitializeControls(ChatServerControls controls) {
controls.getRoomTree().removeMouseListener(roomPopupBuilder);
controls.getCurrentRoom().removeMouseListener(currentRoomPopupBuilder);
controls.getNewRoom().removeActionListener(roomCreator);
}
}