import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.JTextArea; import javax.swing.JScrollPane; import java.awt.BorderLayout; import java.awt.event.KeyEvent; import org.jdom.DocType; import org.jdom.Document; import org.jdom.Element; import org.jdom.Attribute; import org.jdom.input.SAXBuilder; import java.io.File; import java.util.Map; import java.util.HashMap; import java.util.List; import java.util.Iterator; /** * Grafiskt användargränssnitt och några xtra finesser i form av snabbmeddelanden. * För snabbmeddelanden testa att trycka F1 - F3, snabmeddelanden kan * definieras/editeras i filen quickmessages.xml * * @author Henrik Johansson */ public class XMLChatClientGUI extends JFrame { private XMLChatClient xmlChatClient; private Map qMessages; private boolean qMessagesLoaded = false; private javax.swing.JPanel jContentPane = null; private JPanel jPanel = null; private JTextField messageField = null; private JButton sendButton = null; private JScrollPane jScrollPane = null; private JTextArea messagesTextArea = null; /** * konstruktor * * @param xmlChatClient * chatklienten som söter logiken. */ public XMLChatClientGUI(XMLChatClient xmlChatClient) { super(); this.xmlChatClient = xmlChatClient; initialize(); } /** * Skickar meddelande från meddelandefältet (messageField) * vidare till chatklienten (xmlChatClient) som i sin tur * skickar detta vidare till chat-servern. */ private void sendMessage() { xmlChatClient.send(getMessageField().getText()); getMessageField().setText(""); } /** * skickar snabbmeddelande till chatklienten (xmlChatClient). * Om snabbmeddelanden ännu inte laddats försöker funktionen ladda dessa * från filen quickmessages.xml som skall peka på dtd:n quickmessages.dtd. * * @param key */ private void sendQuickMessage(int key) { if(! qMessagesLoaded) { qMessagesLoaded = true; qMessages = new HashMap(); File file = new File("quickmessages.xml"); if(file.exists()) { try { SAXBuilder builder = new SAXBuilder(true); Document document = builder.build(file); List messages = document.getRootElement().getChildren("message"); Iterator children = messages.iterator(); while(children.hasNext()) { Element message = (Element) children.next(); int fn = Integer.parseInt(message.getAttribute("functionkey").getValue().substring(1)) + KeyEvent.VK_F1 - 1; qMessages.put(fn, message.getText()); } } catch(Exception e) { this.addMessage("ERROR: Misslyckades med att ladda snabbmeddelanden"); System.err.println("ERROR: Misslyckades med att ladda snabbmeddelanden"); e.printStackTrace(); } } } String msg = qMessages.get(key); if(msg != null) { xmlChatClient.send(msg); } } /** * Lägger till ett meddelande till visningsutrymmet ( * messagesTextArea). * * @param message */ public void addMessage(String message) { getMessagesTextArea().append('\n' + message); } /** * Denna metod initierar this * */ private void initialize() { this.setSize(300,200); this.setContentPane(getJContentPane()); this.setTitle("XMLChatClient"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } /** * Denna metod initierar jContentPane * * @return javax.swing.JPanel */ private javax.swing.JPanel getJContentPane() { if(jContentPane == null) { jContentPane = new javax.swing.JPanel(); jContentPane.setLayout(new java.awt.BorderLayout()); jContentPane.add(getJPanel(), java.awt.BorderLayout.NORTH); jContentPane.add(getJScrollPane(), java.awt.BorderLayout.CENTER); } return jContentPane; } /** * Denna metod initierar jPanel * * @return javax.swing.JPanel */ private JPanel getJPanel() { if (jPanel == null) { jPanel = new JPanel(); jPanel.setLayout(new BorderLayout()); jPanel.add(getMessageField(), java.awt.BorderLayout.CENTER); jPanel.add(getSendButton(), java.awt.BorderLayout.EAST); } return jPanel; } /** * Denna metod initierar messageField * * @return javax.swing.JTextField */ private JTextField getMessageField() { if (messageField == null) { messageField = new JTextField(); messageField.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(KeyEvent e) { if(e.getKeyCode() >= KeyEvent.VK_F1 && e.getKeyCode() <= KeyEvent.VK_F24) { sendQuickMessage(e.getKeyCode()); } } }); messageField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { sendMessage(); } }); } return messageField; } /** * Denna metod initierar sendButton * * @return javax.swing.JButton */ private JButton getSendButton() { if (sendButton == null) { sendButton = new JButton(); sendButton.setText("send"); sendButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { sendMessage(); } }); } return sendButton; } /** * Denna metod initierar jScrollPane * * @return javax.swing.JScrollPane */ private JScrollPane getJScrollPane() { if (jScrollPane == null) { jScrollPane = new JScrollPane(); jScrollPane.setViewportView(getMessagesTextArea()); } return jScrollPane; } /** * Denna metod initierar messagesTextArea * * @return javax.swing.JTextArea */ private JTextArea getMessagesTextArea() { if (messagesTextArea == null) { messagesTextArea = new JTextArea(); } return messagesTextArea; } }