package org.limewire.ui.swing.friends.chat;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import net.miginfocom.swing.MigLayout;
import org.jdesktop.application.Resource;
import org.limewire.friend.api.MessageWriter;
import org.limewire.inject.LazySingleton;
import org.limewire.ui.swing.util.GuiUtils;
import org.limewire.ui.swing.util.ResizeUtils;
import org.limewire.listener.EventBroadcaster;
import com.google.inject.Inject;
/**
* Main Panel for the Chat window. Creates and manages all of the other
* components within the Chat window.
*/
@LazySingleton
class ChatFrame extends JPanel {
@Resource private Color borderColor;
@Resource private Color dividerColor;
private final ChatHeader chatHeader;
private final ChatFriendList chatList;
private final ConversationPanel conversationPanel;
private final ChatMediator chatMediator;
private final EventBroadcaster<ChatMessageEvent> chatMessageList;
private final EventBroadcaster<ChatStateEvent> chatStateList;
@Inject
public ChatFrame(ChatHeader chatHeader, ChatFriendList chatList,
ConversationPanel conversationPanel, ChatPopupHandler popupHandler,
ChatMediator chatMediator,
EventBroadcaster<ChatMessageEvent> chatMessageList,
EventBroadcaster<ChatStateEvent> chatStateList) {
super(new MigLayout("gap 0, insets 0, fill"));
this.chatHeader = chatHeader;
this.chatList = chatList;
this.conversationPanel = conversationPanel;
this.chatMediator = chatMediator;
this.chatMessageList = chatMessageList;
this.chatStateList = chatStateList;
GuiUtils.assignResources(this);
setBorder(BorderFactory.createMatteBorder(1,1,0,1, borderColor));
add(chatHeader.getComponent(), "dock north");
JScrollPane scrollPane = new JScrollPane(chatList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, dividerColor));
ResizeUtils.forceWidth(scrollPane, 122);
chatList.setPopupHandler(popupHandler);
add(scrollPane, "dock west");
add(conversationPanel.getComponent(), "dock center");
}
@Inject
public void register() {
// listen for selection of a friend in the ChatList. Update the shown conversation and
// ChatFrame header when appropriate.
chatList.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
@Override
public void valueChanged(ListSelectionEvent e) {
if(chatList.getSelectedRow() >= 0 && chatList.getSelectedRow() < chatList.getRowCount()) {
ChatFriend chatFriend = (ChatFriend) chatList.getModel().getValueAt(chatList.getSelectedRow(), 0);
if(conversationPanel.hasConversation(chatFriend)) {
chatHeader.setFriend(chatFriend);
conversationPanel.displayConverstaion(chatFriend);
}
}
}
});
// double click listener
chatList.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
if(e.getClickCount() == 2) {
int index = chatList.rowAtPoint(e.getPoint());
if(index >= 0 && index < chatList.getRowCount()) {
ChatFriend chatFriend = (ChatFriend) chatList.getModel().getValueAt(chatList.getSelectedRow(), 0);
selectOrStartConversation(chatFriend);
}
}
}
});
}
/**
* Starts or selects a conversation with the given ChatFriend.
*/
public void selectOrStartConversation(ChatFriend chatFriend) {
if(!conversationPanel.hasConversation(chatFriend)) {
startConversation(chatFriend, createMessageWriter(chatFriend));
} else {
conversationPanel.displayConverstaion(chatFriend);
chatHeader.setFriend(chatFriend);
// underline the currently selected friend, need to repaint all the chats
chatList.repaint();
}
chatMediator.getChatButton().repaint();
}
/**
* Creates a new MessageWriter for this ChatFriend if one doesn't already exist.
*/
private MessageWriter createMessageWriter(ChatFriend chatFriend) {
MessageWriter writer = chatFriend.createChat(new MessageReaderImpl(chatFriend, chatMessageList, chatStateList));
MessageWriter messageWriter = new MessageWriterImpl(chatFriend, writer, chatMessageList);
return messageWriter;
}
/**
* Starts a conversation with the given ChatFriend using the given MessageWriter.
*/
public void startConversation(ChatFriend chatFriend, MessageWriter messageWriter) {
if(!conversationPanel.hasConversation(chatFriend)) {
chatFriend.startChat();
conversationPanel.startNewChat(chatFriend, messageWriter);
chatHeader.setFriend(chatFriend);
// underline the currently selected friend, need to repaint all the chats
chatList.repaint();
}
}
/**
* Returns the ChatFriend whose conversation is currently selected,
* or null if no ChatFriend exists.
*/
public ChatFriend getSelectedConversation() {
return conversationPanel.getCurrentConversationFriend();
}
/**
* Closes all Conversations with all friends.
*/
public void closeAllChats() {
chatHeader.clearFriend();
conversationPanel.removeAllConversations();
chatList.repaint();
chatMediator.getChatButton().repaint();
}
/**
* Closes a Conversation with a given Friend.
*/
public void closeConversation(ChatFriend chatFriend) {
chatHeader.clearFriend();
conversationPanel.removeConversation(chatFriend);
chatList.repaint();
chatMediator.getChatButton().repaint();
}
}