/* * ArenaMode.java * * Created on November 22, 2004, 12:08 AM */ package pt.jkaiui.ui.modes; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Vector; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import javax.swing.JTextField; import javax.swing.ListCellRenderer; import javax.swing.ListModel; import pt.jkaiui.JKaiUI; import pt.jkaiui.core.*; import pt.jkaiui.core.messages.*; import pt.jkaiui.tools.log.ConfigLog; /** * * @author pedro */ public class ArenaMode extends MainMode { private static final long serialVersionUID = 143414; private static final String NAME = java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_ArenaMode"); private MessengerModeListModel listModel; // current arena public static Arena arena; private JMenuItem jmiAddBuddy; private JMenuItem jmiEnterArena; private JMenuItem jmiParentArena; private JMenuItem jmiBookmark; private JMenuItem jmiBookmarkDelete; private JMenuItem jmiChat; private JMenuItem jmiUserProfile; private JMenuItem jmiBanUser; private JMenuItem jmiKickUser; private JMenuItem jmiDisconnectUser; private final ImageIcon GOBACK_ICON = new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/goback.png")); private final ImageIcon CREATE_ARENA_ICON = new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/create_arena.png")); private final ImageIcon PARENT_ARENA_ICON = new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/parent_arena.png")); private final ImageIcon BOOKMARK_ARENA_ICON = new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/bookmark_arena.png")); private final ImageIcon BOOKMARK_DELETE_ICON = new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/bookmark_delete.png")); private final ImageIcon KICK_USER_ICON = new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/kick_user.png")); private final ImageIcon BAN_USER_ICON = new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/ban_user.png")); private final ImageIcon DISCONNECT_USER_ICON = new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/disconnect_user.png")); private final ImageIcon ENTER_ARENA_ICON = new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/enter_arena.png")); private final ImageIcon ADD_BUDDY_ICON = new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/add_buddy.png")); private final ImageIcon USER_PROFILE_ICON = new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/user_profile.png")); private Vector components = new Vector(); private JButton goBackButton; private JButton createArenaButton; private JComboBox arenaModeComboBox; private final Integer[] arenaModeIntegers = {new Integer(0), new Integer(1), new Integer(2)}; private final ImageIcon[] arenaModeIcons = { new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/arena_mode_1.png")), new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/arena_mode_2.png")), new ImageIcon(getClass().getResource("/pt/jkaiui/ui/resources/arena_mode_3.png")) }; private final String[] arenaModeText = { java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("MSG_ArenaMode1"), java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("MSG_ArenaMode2"), java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("MSG_ArenaMode3"), }; /** Creates a new instance of GameMode */ public ArenaMode() { _logger = ConfigLog.getLogger(this.getClass().getName()); _logger.config("Initializing Game mode"); // TODO: Should this hoverToggle MouseAdapter object be applied to all the // other UI buttons that contain this same code? MouseAdapter hoverToggler = new MouseAdapter() { public void mouseEntered(MouseEvent me) { if(me.getSource() instanceof JButton) { JButton source = (JButton) me.getSource(); if(source.isEnabled()) { source.setBorderPainted(true); source.setContentAreaFilled(true); } } } public void mouseExited(MouseEvent me) { if(me.getSource() instanceof JButton) { JButton source = (JButton) me.getSource(); source.setBorderPainted(false); source.setContentAreaFilled(false); } } }; this.setModeName(NAME); // Init special components goBackButton = new JButton(GOBACK_ICON); goBackButton.addActionListener(this); goBackButton.setBorderPainted(true); goBackButton.setContentAreaFilled(true); goBackButton.setFocusable(false); goBackButton.setToolTipText(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_ParentArena")); goBackButton.setBorderPainted(false); goBackButton.setContentAreaFilled(false); goBackButton.addMouseListener(hoverToggler); components.add(goBackButton); createArenaButton = new JButton(CREATE_ARENA_ICON); createArenaButton.addActionListener(this); createArenaButton.setBorderPainted(true); createArenaButton.setContentAreaFilled(true); createArenaButton.setFocusable(false); createArenaButton.setEnabled(false); createArenaButton.setToolTipText(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_CreateArena")); createArenaButton.setBorderPainted(false); createArenaButton.setContentAreaFilled(false); createArenaButton.addMouseListener(hoverToggler); components.add(createArenaButton); arenaModeComboBox = new JComboBox(arenaModeIntegers); arenaModeComboBox.setSelectedIndex(0); ComboBoxRenderer renderer = new ComboBoxRenderer(); arenaModeComboBox.setRenderer(renderer); arenaModeComboBox.setSize(new Dimension(100, 32)); arenaModeComboBox.addActionListener(this); /* // Uncomment this block and comment out the following "components.add(arenaModeComboBox);" line // if you want to add the arena mode combobox to the toolbar instead of the header thing. // (For a permanent solution to adding it to the toolbar, it'd be better to add this code to the // toolbar's initialization code or something.) GridBagConstraints c = new GridBagConstraints(); c.gridx = 0; c.gridy = 0; c.weightx = 1.0; c.anchor = GridBagConstraints.WEST; c.insets = new Insets(0, 10, 0, 0); JKaiUI.getMainUI().getToolbarPanel().add(arenaModeComboBox, c); */ components.add(arenaModeComboBox); } public String getName(){ return NAME; } public void processMessage(Message message) throws ModeException { // Do nothing } public ListModel getListModel() { if(listModel == null) listModel = new MessengerModeListModel(); return listModel; } protected JPopupMenu getPopupMenu(KaiObject obj){ JPopupMenu popup = new JPopupMenu(); // check for preview mode boolean preview = JKaiUI.CURRENT_MODE != JKaiUI.ARENA_MODE; // Is it an arena? if(obj instanceof Arena){ jmiEnterArena = new JMenuItem(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_EnterArena")); jmiEnterArena.setIcon(ENTER_ARENA_ICON); if (!preview) { popup.add(jmiEnterArena); } jmiEnterArena.addActionListener(this); } else if( obj instanceof User){ if (((User)obj).getUser().equals("�@")) { return popup; } jmiUserProfile = new JMenuItem(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_UserProfile")); jmiUserProfile.setIcon(USER_PROFILE_ICON); popup.add(jmiUserProfile); jmiUserProfile.addActionListener(this); jmiAddBuddy = new JMenuItem(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_AddBuddy")); jmiAddBuddy.setIcon(ADD_BUDDY_ICON); popup.add(jmiAddBuddy); jmiAddBuddy.addActionListener(this); jmiChat = new JMenuItem(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_OpenChat")); jmiChat.setIcon(CHAT_ICON); if (!preview) { popup.add(jmiChat); } jmiChat.addActionListener(this); if (JKaiUI.MODERATORS.contains(JKaiUI.getConfig().getConfigString(KaiConfig.ConfigTag.TAG))) { popup.addSeparator(); jmiBanUser = new JMenuItem(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_BanUser")); jmiBanUser.setIcon(BAN_USER_ICON); popup.add(jmiBanUser); jmiBanUser.addActionListener(this); jmiKickUser = new JMenuItem(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_KickUser")); jmiKickUser.setIcon(KICK_USER_ICON); popup.add(jmiKickUser); jmiKickUser.addActionListener(this); jmiDisconnectUser = new JMenuItem(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_DisconnectUser")); jmiDisconnectUser.setIcon(DISCONNECT_USER_ICON); popup.add(jmiDisconnectUser); jmiDisconnectUser.addActionListener(this); popup.addSeparator(); } } if(!preview) { jmiParentArena = new JMenuItem(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_ParentArena")); jmiParentArena.setIcon(PARENT_ARENA_ICON); if(JKaiUI.ARENA.equals("Arena")){ jmiParentArena.setEnabled(false); } else { jmiParentArena.addActionListener(this); } popup.add(jmiParentArena); } Object currentlySelectedObject = list.getSelectedValue(); if(currentlySelectedObject instanceof Arena) { jmiBookmark = new JMenuItem(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_AddBookmark")); jmiBookmark.setIcon(BOOKMARK_ARENA_ICON); jmiBookmarkDelete = new JMenuItem(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_DeleteBookmark")); jmiBookmarkDelete.setIcon(BOOKMARK_DELETE_ICON); if(JKaiUI.getMainUI().isBookmark((Arena) currentlySelectedObject)) { jmiBookmark.setEnabled(false); jmiBookmarkDelete.addActionListener(this); } else { jmiBookmarkDelete.setEnabled(false); jmiBookmark.addActionListener(this); } popup.addSeparator(); popup.add(jmiBookmark); popup.add(jmiBookmarkDelete); } return popup; } public void actionPerformed(ActionEvent ev){ Object source = ev.getSource(); try { if (source == jmiAddBuddy){ User user = (User) list.getSelectedValue(); AddContactOut out = new AddContactOut(); out.setUser(new KaiString(user.getUser())); JKaiUI.getManager().getExecuter().execute(out); } else if (source == jmiEnterArena){ Arena arena = (Arena) list.getSelectedValue(); JKaiUI.getManager().enterArena(arena); this.arena = arena; } else if (source == jmiParentArena || source == goBackButton){ // since I know that parent arena never has password, // I can safelly send this message to Executor // if (JKaiUI.MODERATORS.contains(JKaiUI.getConfig().getConfigString("TAG"))) { // JKaiUI.MODERATORS.remove(JKaiUI.getConfig().getConfigString("TAG")); // } KaiVectorParent vector = new KaiVectorParent(); vector.setVector(new KaiString(JKaiUI.ARENA)); JKaiUI.getManager().getExecuter().execute(vector); } else if (source == jmiChat){ User user = (User) list.getSelectedValue(); JKaiUI.getChatManager().openChat(user); } else if (source == arenaModeComboBox){ // status start in 1 int status = arenaModeComboBox.getSelectedIndex()+1; ArenaStatusOut statusMsg = new ArenaStatusOut(); statusMsg.setStatus(status); statusMsg.setPlayers(1); // TODO: SUPPORT MORE LOCAL PLAYERS JKaiUI.getManager().getExecuter().execute(statusMsg); } else if (source == createArenaButton) createArenaPane(); else if (source == jmiUserProfile) { User user = (User) list.getSelectedValue(); JKaiUI.getManager().send(new GetUserProfile(user.getName())); } else if (source == jmiBanUser) { User user = (User) list.getSelectedValue(); JKaiUI.getManager().send(new BanUser(user.getName())); } else if (source == jmiKickUser) { User user = (User) list.getSelectedValue(); JKaiUI.getManager().send(new KickUser(user.getName())); } else if (source == jmiDisconnectUser) { User user = (User) list.getSelectedValue(); JKaiUI.getManager().send(new DisconnectUser(user.getName())); } else if (source == jmiBookmark){ Arena arena = (Arena) list.getSelectedValue(); JKaiUI.getMainUI().addBookmark(arena); } else if (source == jmiBookmarkDelete){ Arena arena = (Arena) list.getSelectedValue(); JKaiUI.getMainUI().deleteBookmark(arena); } } catch (Exception e) { System.out.println("ArenaMode:"+e); } } public Vector getSpecialComponents(){ return components; } class ComboBoxRenderer extends JLabel implements ListCellRenderer { public ComboBoxRenderer() { setOpaque(true); setHorizontalAlignment(CENTER); setVerticalAlignment(CENTER); } /* * This method finds the image and text corresponding * to the selected value and returns the label, set up * to display the text and image. */ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { //Get the selected index. (The index param isn't //always valid, so just use the value.) int selectedIndex = ((Integer)value).intValue(); if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } //Set the icon and text. If icon was null, say so. ImageIcon icon = arenaModeIcons[selectedIndex]; setIcon(icon); setText(arenaModeText[selectedIndex]); setHorizontalAlignment(LEFT); return this; } } public void resetArenaMode(){ arenaModeComboBox.setSelectedIndex(0); } public void enableCreateArena(boolean bool){ createArenaButton.setEnabled(bool); } public void enableGoParentArena(boolean bool){ goBackButton.setEnabled(bool); } private void createArenaPane(){ Object[] message = new Object[7]; message[0] = java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_Description"); JTextField descriptionTextField = new JTextField(); message[1] = descriptionTextField; message[2] = java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_MaxPlayers"); JTextField maxPlayersTextField = new JTextField(); message[3] = maxPlayersTextField; message[4] = java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_Password"); JTextField passwordTextField = new JTextField(); message[5] = passwordTextField; JCheckBox hostmodeCheckBox = new JCheckBox(java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_SwitchToHost")); hostmodeCheckBox.setSelected(true); message[6] = hostmodeCheckBox; String[] options = { java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("BTN_Ok"), java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("BTN_Cancel") }; int result = JOptionPane.showOptionDialog( null, // the parent that the dialog blocks message, // the dialog message array java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_CreateArena"), // the title of the dialog window JOptionPane.DEFAULT_OPTION, // option type JOptionPane.QUESTION_MESSAGE, // message type null, // optional icon, use null to use the default icon options, // options string array, will be made into buttons options[0] // option that should be made into a default button ); String description = ""; String password = ""; int maxPlayers = 16; String error = null; switch(result) { case 0: // ok -- Validating input! description = descriptionTextField.getText(); password = passwordTextField.getText(); String maxPlayersString = maxPlayersTextField.getText(); if(! maxPlayersString.matches("^\\d{0,4}$")){ error = java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("MSG_InvalidMaxPlayers"); break; } maxPlayers = Integer.parseInt(maxPlayersString.length()>0?maxPlayersString:"0"); if(! description.matches("^.{0,1000}$")){ error = java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("MSG_InvalidDescription"); break; } if(! password.matches("^.{0,100}$")){ error = java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("MSG_InvalidPassword"); break; } break; case 1: // no return; } if (error != null){ JOptionPane.showMessageDialog(null,error); return; } // Create vector CreateVectorOut out = new CreateVectorOut(); out.setDescription(new KaiString(description)); out.setPassword(new KaiString(password)); out.setMaxPlayers(maxPlayers); JKaiUI.getManager().getExecuter().execute(out); if (hostmodeCheckBox.isSelected()) { arenaModeComboBox.setSelectedIndex(1); } } public void setIndexArenaModeComboBox(int index) { arenaModeComboBox.setSelectedIndex(index); } public void clickgoBackButton(){ goBackButton.doClick(); } public void clickcreateArenaButton(){ createArenaButton.doClick(); } }