package com.limegroup.gnutella.gui.chat;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.swing.JFrame;
import com.limegroup.gnutella.chat.Chatter;
/**
* Manages all chat session and provides an interface to access each
* chat session.
*/
public final class ChatUIManager {
/**
* Constant for the single <tt>ChatManager</tt> instance for
* singleton.
*/
private static final ChatUIManager INSTANCE = new ChatUIManager();
/**
* <tt>Map</tt> of <tt>Chatter</tt> instances.
*/
private Map _chats = Collections.synchronizedMap(new HashMap());
/**
* Private constructor to ensure that this class cannot be
* constructed from any other class.
*/
private ChatUIManager() {}
/**
* Returns the single instance of this class, following singleton.
*
* @return the single <tt>ChatManager</tt> instance
*/
public static ChatUIManager instance() {
return INSTANCE;
}
/**
* Accepts a new chat session with a new user.
*
* @chatter the new <tt>Chatter</tt> instance to chat with
*/
public void acceptChat(Chatter chatter) {
if (frameAlreadyExists(chatter)) {
raiseExistingFrame(chatter);
return;
}
ChatFrame cframe = new ChatFrame(chatter);
cframe.setVisible(true);
_chats.put(chatter, cframe);
}
/**
* Checks if there is already an existing chat with the same port.
*
*/
private boolean frameAlreadyExists(Chatter chatter) {
Set existingChats = _chats.keySet();
for (Iterator i = existingChats.iterator(); i.hasNext(); ) {
Chatter c = (Chatter)i.next();
if (c.getHost().compareTo(chatter.getHost()) == 0) {
return true;
}
}
return false;
}
/**
* Raises an existing chat window.
*
*/
private void raiseExistingFrame(Chatter chatter) {
Set existingChats = _chats.keySet();
for (Iterator i = existingChats.iterator(); i.hasNext(); ) {
Chatter c = (Chatter)i.next();
if (c.getHost().compareTo(chatter.getHost()) == 0) {
ChatFrame frame = (ChatFrame)(_chats.get(c));
frame.setState(JFrame.NORMAL);
frame.toFront();
return;
}
}
}
/**
* Removes the specified chat session from the list of active
* sessions.
*
* @param the <tt>Chatter</tt> instance to remove
*/
public void removeChat(Chatter chatter) {
ChatFrame cframe = (ChatFrame)(_chats.remove(chatter));
if (cframe != null) {
cframe.dispose();
cframe.setVisible(false);
}
}
/**
* Receives a message for the session associated with the specified
* <tt>Chatter</tt> instance.
*
* @param chatter the <tt>Chatter</tt> instance with which the new
* message is associated
*/
public void receiveMessage(Chatter chatter) {
ChatFrame cframe = (ChatFrame)_chats.get(chatter);
if(cframe == null) {
// The frame could be null if the user on this end already
// removed it, for example.
return;
}
cframe.addResponse( chatter.getMessage() );
}
/**
* Lets the user know that a host is no longer available.
*
* @param the <tt>Chatter</tt> instance for the host that is no longer
* available
*/
public void chatUnavailable(Chatter chatter) {
ChatFrame cframe = (ChatFrame)_chats.get(chatter);
if(cframe == null) {
return;
}
cframe.chatUnavailable();
}
/**
* Display an error message in the chat gui for the specified chat
* session.
*
* @param chatter the <tt>Chatter</tt> instance associated with the error
* @param str the error message to display
*/
public void chatErrorMessage(Chatter chatter, String str) {
ChatFrame cframe = (ChatFrame)_chats.get(chatter);
if(cframe == null) {
return;
}
cframe.displayErrorMessage(str);
}
}