/* * * Copyright (c) 2000-2007 by Rodney Kinney * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.chat.messageboard; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URL; import java.util.Arrays; import java.util.Collections; import java.util.concurrent.ExecutionException; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.WindowConstants; import org.jdesktop.swingworker.SwingWorker; import VASSAL.i18n.Resources; import VASSAL.tools.ErrorDialog; import VASSAL.tools.menu.MenuManager; /** * UI controls for posting and retrieving messages from a * message board. */ public class MessageBoardControls { private MessageBoard server; private String serverName; private Action checkMessagesAction; private Action postMessageAction; private MessageViewer viewer; private JFrame msgFrame; private JFrame msgComposer; public MessageBoardControls() { initComponents(); setServer(null, null); } public void setServer(MessageBoard msgSvr, String name) { server = msgSvr; serverName = name; checkMessagesAction.setEnabled(server != null); postMessageAction.setEnabled(server != null); } public void showMessages(Message[] m) { viewer.setMessages( Collections.enumeration( Collections.unmodifiableList((Arrays.asList(m))))); } private void initComponents() { viewer = new MessageViewer(); msgFrame = new JFrame(Resources.getString("Chat.message_board")); //$NON-NLS-1$ msgFrame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); msgFrame.setLayout( new BoxLayout(msgFrame.getContentPane(), BoxLayout.Y_AXIS)); msgFrame.setJMenuBar(MenuManager.getInstance().getMenuBarFor(msgFrame)); msgFrame.add(viewer); Box box = Box.createHorizontalBox(); final JButton refresh = new JButton( Resources.getString("Chat.refresh")); //$NON-NLS-1$ refresh.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { refresh.setEnabled(false); new SwingWorker<Message[],Void>() { @Override protected Message[] doInBackground() { return server.getMessages(); } @Override protected void done() { try { showMessages(get()); } catch (InterruptedException e) { ErrorDialog.bug(e); } catch (ExecutionException e) { ErrorDialog.bug(e); } msgFrame.setTitle(serverName != null ? Resources.getString("Chat.message_board_title", serverName) : Resources.getString("Chat.message_board")); //$NON-NLS-1$ refresh.setEnabled(true); } }.execute(); } }); box.add(refresh); final JButton b = new JButton(Resources.getString(Resources.CLOSE)); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { msgFrame.setVisible(false); } }); box.add(b); msgFrame.add(box); msgComposer = new Comp(); checkMessagesAction = new AbstractAction( Resources.getString("Chat.check_messages")) { //$NON-NLS-1$ private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent evt) { setEnabled(false); new SwingWorker<Message[],Void>() { @Override protected Message[] doInBackground() { return server.getMessages(); } @Override protected void done() { try { showMessages(get()); } catch (InterruptedException e) { ErrorDialog.bug(e); } catch (ExecutionException e) { ErrorDialog.bug(e); } msgFrame.setTitle(serverName != null ? Resources.getString("Chat.message_board_title", serverName) : Resources.getString("Chat.message_board")); //$NON-NLS-1$ msgFrame.setVisible(true); setEnabled(true); } }.execute(); } }; URL imageURL = getClass().getResource("/images/getMessages.gif"); //$NON-NLS-1$ if (imageURL != null) { checkMessagesAction.putValue(Action.SHORT_DESCRIPTION, checkMessagesAction.getValue(Action.NAME)); checkMessagesAction.putValue(Action.NAME, ""); //$NON-NLS-1$ checkMessagesAction.putValue(Action.SMALL_ICON, new ImageIcon(imageURL)); } postMessageAction = new AbstractAction( Resources.getString("Chat.post_message")) { //$NON-NLS-1$ private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent evt) { msgComposer.setVisible(true); } }; imageURL = getClass().getResource("/images/postMessage.gif"); //$NON-NLS-1$ if (imageURL != null) { postMessageAction.putValue(Action.SHORT_DESCRIPTION, postMessageAction.getValue(Action.NAME)); postMessageAction.putValue(Action.NAME, ""); //$NON-NLS-1$ postMessageAction.putValue(Action.SMALL_ICON, new ImageIcon(imageURL)); } msgFrame.pack(); msgFrame.setLocation(java.awt.Toolkit.getDefaultToolkit().getScreenSize().width / 2 - msgFrame.getSize().width / 2, 0); } public Action getCheckMessagesAction() { return checkMessagesAction; } public Action getPostMessageAction() { return postMessageAction; } private class Comp extends JFrame { private static final long serialVersionUID = 1L; private Comp() { super(Resources.getString("Chat.message_composer")); //$NON-NLS-1$ setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); setJMenuBar(MenuManager.getInstance().getMenuBarFor(this)); final JTextArea msgArea = new JTextArea(15, 60); Box b = Box.createHorizontalBox(); final JButton okButton = new JButton(Resources.getString("Chat.send")); //$NON-NLS-1$ okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { okButton.setEnabled(false); msgArea.setEnabled(false); new SwingWorker<Void,Void>() { @Override protected Void doInBackground() { server.postMessage(msgArea.getText()); return null; } @Override protected void done() { setVisible(false); okButton.setEnabled(true); msgArea.setText(""); //$NON-NLS-1$ msgArea.setEnabled(true); } }.execute(); } }); // FIXME: Cancel does not cancel sending a message! JButton cancelButton = new JButton(Resources.getString(Resources.CANCEL)); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { setVisible(false); msgArea.setText(""); //$NON-NLS-1$ } }); b.add(okButton); b.add(cancelButton); add(new JScrollPane(msgArea)); add(b); pack(); setLocation(java.awt.Toolkit.getDefaultToolkit().getScreenSize().width / 2 - getSize().width / 2, 0); } } }