package org.pokenet.client.ui.frames; import java.util.ArrayList; import java.util.HashMap; import mdes.slick.sui.Frame; import mdes.slick.sui.TextField; import mdes.slick.sui.event.ActionEvent; import mdes.slick.sui.event.ActionListener; import mdes.slick.sui.event.MouseAdapter; import mdes.slick.sui.event.MouseEvent; import org.newdawn.slick.Color; import org.newdawn.slick.gui.GUIContext; import org.pokenet.client.GameClient; import org.pokenet.client.backend.ModerationManager; import org.pokenet.client.ui.base.ComboBox; /** * Chat Dialog * @author ZombieBear * */ public class ChatDialog extends Frame { private ArrayList<ArrayList<String>> m_chatList = new ArrayList<ArrayList<String>>(); private HashMap<String, ArrayList<String>> m_availableChats = new HashMap<String, ArrayList<String>>(); private Color m_backColor = new Color(0, 0, 0, 85); private String m_curChat = ""; private Color m_foreColor = new Color(255, 255, 255); private TextField m_inputBox = new TextField(); private ComboBox m_possibleChats = new ComboBox(); private ChatWidget m_chatWidget = new ChatWidget(); public ChatDialog() { initGUI(); addChat("Local", false); } /** * Sends the packet over to the server * @param evt */ private void chatTypeActionPerformed(ActionEvent evt) { if (m_inputBox.getText() != null && m_inputBox.getText().length() != 0) { if (m_possibleChats.getSelected().equalsIgnoreCase("local")){ if (m_inputBox.getText().charAt(0) == '/'){ ModerationManager.parseLine(m_inputBox.getText().substring(1)); } else { GameClient.getInstance().getPacketGenerator().writeTcpMessage("Cl" + m_inputBox.getText()); } } else { if (m_inputBox.getText().charAt(0) == '/') { ModerationManager.parseLine(m_inputBox.getText().substring(1)); } else { GameClient.getInstance().getPacketGenerator().writeTcpMessage( "Cp" + m_possibleChats.getSelected() + "," + m_inputBox.getText()); addWhisperLine(m_possibleChats.getSelected(), "<" + GameClient.getInstance().getOurPlayer().getUsername() + "> " + m_inputBox.getText()); } } } m_inputBox.setText(""); m_inputBox.grabFocus(); } /** * Returns the chat box * @return the chat box */ public TextField getChatBox() { return m_inputBox; } /** * Initializes the user interface */ private void initGUI() { // Hack to properly align the conten pane in a slick frame getContentPane().setX(getContentPane().getX() - 1); getContentPane().setY(getContentPane().getY() + 1); // Sets the frame's colors setBackground(m_backColor); setForeground(m_foreColor); // Chat Selection m_possibleChats.setForeground(m_foreColor); getContentPane().add(m_possibleChats); // Chat Widget m_chatWidget.setForeColor(m_foreColor); getContentPane().add(m_chatWidget); // Input box getContentPane().add(m_inputBox); m_inputBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { chatTypeActionPerformed(evt); } }); m_inputBox.grabFocus(); // Repositions UI dynamically when the user resizes the window getResizer().addMouseListener(new MouseAdapter() { public void mouseDragged(MouseEvent event) { repositionUI(); } }); setMinimumSize(80, 80); setSize(400, 195); } /** * Repositions UI elements */ public void repositionUI() { try { m_possibleChats.setSize(getWidth(), 15); m_possibleChats.setLocation(0, 0); m_chatWidget.setLocation(0, 15); m_chatWidget.setSize(getWidth(), getHeight() - getTitleBar().getHeight() - 40); m_inputBox.setSize(getWidth(), 25); m_inputBox.setLocation(0, getHeight() - m_inputBox.getHeight() - getTitleBar().getHeight()); } catch (Exception e) { } } /** * Drops focus */ public void dropFocus() { m_inputBox.releaseFocus(); } /** * Adds a line to a private chat, * creates the private chat if it doesn't exist * @param chat * @param line */ public void addWhisperLine(String chat, String line) { if (m_availableChats.containsKey(chat)) { m_availableChats.get(chat).add(line); m_chatWidget.addLine(); } else { addChat(chat, true); m_availableChats.get(chat).add(line); m_chatWidget.addLine(); } } /** * Adds a line to a chat channel, * creates the channel if it doesn't exist * @param chat * @param line */ public void addChatLine(int chat, String line) { try{ m_chatList.get(chat).add(line); m_chatWidget.addLine(); } catch (Exception e){} } /** * Adds a system message to your chat * @param message */ public void addSystemMessage(String message){ for (String s : m_availableChats.keySet()) m_availableChats.get(s).add('*' + message); m_chatWidget.addLine(); } /** * Adds a server announcement * @param message */ public void addAnnouncement(String message){ for (String s : m_availableChats.keySet()) m_availableChats.get(s).add('%' + message); m_chatWidget.addLine(); } /** * Creates a new private chat channel * @param chat */ public void addChat(String chat, boolean isWhisper) { if (!m_availableChats.containsKey(chat)){ m_availableChats.put(chat, new ArrayList<String>()); m_possibleChats.addElement(chat); m_possibleChats.setSelected(chat); if (!isWhisper) m_chatList.add(m_availableChats.get(chat)); } else { m_possibleChats.setSelected(chat); } } @Override public void setForeground(Color c){ super.setForeground(c); try{ m_chatWidget.setForeColor(c); } catch (Exception e) {} } @Override public void setSize(float width, float height) { super.setSize(width, height); repositionUI(); } @Override public void update(GUIContext container, int delta) { super.update(container, delta); if (!m_curChat.equalsIgnoreCase(m_possibleChats.getSelected())) { m_curChat = m_possibleChats.getSelected(); m_chatWidget.setContents(m_availableChats.get(m_possibleChats .getSelected())); setTitle("Chat: " + m_possibleChats.getSelected()); } } }