/*
*
* 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;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import VASSAL.i18n.Resources;
import VASSAL.tools.menu.MenuManager;
/**
* Manages {@link PrivateChatter} instances
*/
public class PrivateChatManager {
private ChatServerConnection client;
private List<Entry> chatters;
private List<Player> banned;
public PrivateChatManager(ChatServerConnection client) {
chatters = new ArrayList<Entry>();
banned = new ArrayList<Player>();
this.client = client;
}
public PrivateChatter getChatterFor(final Player sender) {
if (banned.contains(sender)) {
return null;
}
PrivateChatter chat = null;
int index = chatters.indexOf(new Entry(sender, null));
if (index >= 0) {
chat = chatters.get(index).chatter;
}
if (chat == null) {
chat = new PrivateChatter(sender, client);
chatters.add(new Entry(sender, chat));
final JFrame f = new JFrame();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
promptToBan(sender);
}
});
f.setTitle(Resources.getString("Chat.private_channel", sender.getName())); //$NON-NLS-1$
f.setJMenuBar(MenuManager.getInstance().getMenuBarFor(f));
f.getContentPane().add(chat);
f.pack();
f.setLocation(Toolkit.getDefaultToolkit().getScreenSize().width / 2 -
f.getSize().width / 2, 0);
}
return chat;
}
private void promptToBan(Player p) {
if (JOptionPane.YES_OPTION ==
JOptionPane.showConfirmDialog
(null,
Resources.getString("Chat.ignore_messages", p.getName()), //$NON-NLS-1$
null,
JOptionPane.YES_NO_OPTION)) {
banned.add(p);
}
}
private static class Entry {
private Player player;
private PrivateChatter chatter;
private Entry(Player p, PrivateChatter chat) {
if (p == null) {
throw new NullPointerException();
}
player = p;
chatter = chat;
}
public boolean equals(Object o) {
if (o instanceof Entry) {
return player.equals(((Entry) o).player);
}
else {
return false;
}
}
}
}