package games.strategy.engine.chat;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import games.strategy.engine.chat.Chat.CHAT_SOUND_PROFILE;
import games.strategy.engine.message.IChannelMessenger;
import games.strategy.engine.message.IRemoteMessenger;
import games.strategy.net.IMessenger;
/**
* A Chat window.
*
* <p>
* Mutiple chat panels can be connected to the same Chat.
* </p>
*
* <p>
* We can change the chat we are connected to using the setChat(...) method.
* </p>
*/
public class ChatPanel extends JPanel implements IChatPanel {
private static final long serialVersionUID = -6177517517279779486L;
static int s_divider_size = 5;
private ChatPlayerPanel chatPlayerPanel;
private ChatMessagePanel chatMessagePanel;
/** Creates a new instance of ChatPanel. */
public ChatPanel(final IMessenger messenger, final IChannelMessenger channelMessenger,
final IRemoteMessenger remoteMessenger, final String chatName, final CHAT_SOUND_PROFILE chatSoundProfile) {
init();
final Chat chat = new Chat(messenger, chatName, channelMessenger, remoteMessenger, chatSoundProfile);
setChat(chat);
}
public ChatPanel(final Chat chat) {
init();
setChat(chat);
}
private void init() {
createComponents();
layoutComponents();
setSize(300, 200);
}
@Override
public boolean isHeadless() {
return false;
}
@Override
public String getAllText() {
return chatMessagePanel.getAllText();
}
@Override
public void shutDown() {
// get first, before below turns it null
final Chat chat = getChat();
chatMessagePanel.shutDown();
chatPlayerPanel.shutDown();
if (chat != null) {
// now shut down
chat.shutdown();
}
}
@Override
public void setChat(final Chat chat) {
chatMessagePanel.setChat(chat);
chatPlayerPanel.setChat(chat);
}
@Override
public Chat getChat() {
return chatMessagePanel.getChat();
}
private void layoutComponents() {
final Container content = this;
content.setLayout(new BorderLayout());
final JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
split.setLeftComponent(chatMessagePanel);
split.setRightComponent(chatPlayerPanel);
split.setOneTouchExpandable(false);
split.setDividerSize(s_divider_size);
split.setResizeWeight(1);
content.add(split, BorderLayout.CENTER);
}
private void createComponents() {
chatPlayerPanel = new ChatPlayerPanel(null);
chatMessagePanel = new ChatMessagePanel(null);
}
@Override
public void setPlayerRenderer(final DefaultListCellRenderer renderer) {
chatPlayerPanel.setPlayerRenderer(renderer);
// gets remaining width from parent component, so setting
// the width is not really necessary
chatMessagePanel.setPreferredSize(new Dimension(30, chatMessagePanel.getPreferredSize().height));
}
@Override
public void setShowChatTime(final boolean showTime) {
chatMessagePanel.setShowTime(showTime);
}
public ChatPlayerPanel getChatPlayerPanel() {
return chatPlayerPanel;
}
public ChatMessagePanel getChatMessagePanel() {
return chatMessagePanel;
}
}