package de.uni_passau.fim.pkjab.view; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.text.DateFormat; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; import javax.swing.ImageIcon; import de.uni_passau.fim.pkjab.model.Contact; import de.uni_passau.fim.pkjab.model.messages.Message; import de.uni_passau.fim.pkjab.util.listener.ContactListener; import de.uni_passau.fim.pkjab.util.listener.ContactStateEvent; import de.uni_passau.fim.pkjab.util.listener.MessageReceivedEvent; public class MessageFrame extends JFrame implements ContactListener { protected static final String SUBMIT = "Senden"; protected static final String STATUS_IS = "Status: "; protected final Contact contact; protected final String userNick; protected JTextArea composingArea; private JTextArea historyArea; protected final JPanel bottomPanel = new JPanel(); MessageFrame(final Contact contact, final String userNick) { super(contact.getNick() + " (" + STATUS_IS + contact.getState() + ")"); this.contact = contact; this.userNick = userNick; contact.addContactListener(this); setupGui(); setupListeners(); setPreferredSize(new Dimension(500, 400)); setIconImage(((ImageIcon) PKjabToolkit.getStatusIcons().get(contact.getState())).getImage()); final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); setLocation((dim.width - 500) / 2, (dim.height - 400) / 2); setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); pack(); } private void setupGui() { setLayout(new BorderLayout()); final JButton submitButton = new JButton(SUBMIT); submitButton.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { if (!composingArea.getText().equals("")) { addToHistory(messageToText(false, contact.sendMessage(composingArea.getText()))); composingArea.setText(""); } } }); bottomPanel.setLayout(new BorderLayout(10, 1)); bottomPanel.add(submitButton, BorderLayout.LINE_END); composingArea = new JTextArea(); composingArea.setCaretColor(PKjabToolkit.getTheme().getForegroundColor()); composingArea.addKeyListener(new KeyAdapter() { public void keyPressed(final KeyEvent e) { if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_ENTER) submitButton.doClick(); } }); historyArea = new JTextArea(); historyArea.setEditable(false); historyArea.setText(DateFormat .getDateTimeInstance(DateFormat.LONG, DateFormat.LONG) .format(new java.util.Date())); final JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, new JScrollPane(historyArea), new JScrollPane(composingArea)); splitPane.setOneTouchExpandable(true); splitPane.setResizeWeight(0.8); getContentPane().add(splitPane, BorderLayout.CENTER); getContentPane().add(bottomPanel, BorderLayout.PAGE_END); } private void setupListeners() { addComponentListener(new ComponentAdapter() { public void componentShown(final ComponentEvent e) { composingArea.requestFocusInWindow(); } }); } public void contactStateChanged(final ContactStateEvent e) { setIconImage( ((ImageIcon) PKjabToolkit.getStatusIcons().get(e.getState())).getImage()); setTitle(contact.getNick() + " (" + STATUS_IS + e.getState() + ")"); } public void messageReceived(final MessageReceivedEvent e) { addToHistory(messageToText(true, e.getMessage())); } protected void addToHistory(String text) { historyArea.append(System.getProperty("line.separator") + text); historyArea.setCaretPosition(historyArea.getText().length()); } protected String messageToText(boolean incoming, Message message) { StringBuffer sb = new StringBuffer("<"); if (incoming) sb.append(contact.getNick() + "/" + message.getFrom().getResource()); else sb.append(userNick); sb.append("> "); sb.append(message.toString()); return sb.toString(); } }