package eu.irreality.age.swing.menu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JRadioButtonMenuItem; import javax.swing.SwingUtilities; import eu.irreality.age.GameEngineThread; import eu.irreality.age.i18n.UIMessages; import eu.irreality.age.observer.GameThreadObserver; import eu.irreality.age.windowing.AGEClientWindow; import eu.irreality.age.windowing.AGELoggingWindow; import eu.irreality.age.windowing.MenuMnemonicOnTheFly; /** * Handles the AGE server menu for a given AGE window and engine thread. * @author carlos * */ public class ServerMenuHandler implements GameThreadObserver { private AGELoggingWindow window; private GameEngineThread thread; /** * The server menu. */ private JMenu serverConfigurationMenu; public ServerMenuHandler ( AGELoggingWindow window ) { this.window = window; } /** * Initializes the server menu. Can be called from the event dispatch thread or from any other thread (in the latter * case, it uses invokeAndWait()). */ public void initServerMenu ( ) { if ( SwingUtilities.isEventDispatchThread() ) doInitServerMenu( ); else { try { SwingUtilities.invokeAndWait ( new Runnable() { public void run() { doInitServerMenu( ); window.repaint(); } } ); } catch ( Exception e ) { e.printStackTrace(); } } } /** * Removes the server menu from the window. Can be invoked from the event dispatch thread or from any other thread. */ public void uninitServerMenu ( ) { if ( SwingUtilities.isEventDispatchThread() ) doUninitServerMenu(); else { try { SwingUtilities.invokeAndWait ( new Runnable() { public void run() { doUninitServerMenu(); window.repaint(); } } ); } catch ( Exception e ) { e.printStackTrace(); } } } private void doInitServerMenu ( ) { doInitServerMenu( UIMessages.getInstance().getMessage("servermenu.gameoptions") ); } private void setJMenuBarAsNeeded ( final AGELoggingWindow window , JMenuBar mb ) { /* if ( window instanceof SwingAetheriaGameLoader ) ((SwingAetheriaGameLoader)window).setTheJMenuBar(mb); else window.setJMenuBar(mb); */ window.setTheJMenuBar(mb); } private JMenuBar getJMenuBarAsNeeded ( final AGELoggingWindow window ) { /* if ( window instanceof SwingAetheriaGameLoader ) return ((SwingAetheriaGameLoader)window).getTheJMenuBar(); else return window.getJMenuBar(); */ return window.getTheJMenuBar(); } private void doUninitServerMenu ( ) { JMenuBar menubar = window.getTheJMenuBar(); menubar.remove(serverConfigurationMenu); serverConfigurationMenu = null; } private void doInitServerMenu ( String menuName ) { serverConfigurationMenu = new JMenu( menuName ); JMenu timeConfigurationMenu = new JMenu( UIMessages.getInstance().getMessage("servermenu.gamemode") ); JMenuBar mb = getJMenuBarAsNeeded(window); if ( mb == null ) setJMenuBarAsNeeded ( window , mb = new JMenuBar() ); serverConfigurationMenu.add ( timeConfigurationMenu ); JRadioButtonMenuItem itemTurns = new JRadioButtonMenuItem(UIMessages.getInstance().getMessage("servermenu.gamemode.sync"),true); JRadioButtonMenuItem itemRealTime = new JRadioButtonMenuItem(UIMessages.getInstance().getMessage("servermenu.gamemode.async"),false); ButtonGroup bg = new ButtonGroup(); bg.add ( itemTurns ); bg.add ( itemRealTime ); if ( thread.isRealTimeEnabled() ) itemRealTime.setSelected(true); itemTurns.addActionListener ( new ActionListener() { public void actionPerformed ( ActionEvent evt ) { thread.setRealTimeEnabled(false); } } ); itemRealTime.addActionListener ( new ActionListener() { public void actionPerformed ( ActionEvent evt ) { thread.setRealTimeEnabled(true); //setRealTimeQuantum(DEFAULT_REAL_TIME_QUANTUM); } } ); timeConfigurationMenu.add ( itemTurns ); timeConfigurationMenu.add ( itemRealTime ); if ( window instanceof AGEClientWindow ) { JMenuItem reinitItem = new JMenuItem( UIMessages.getInstance().getMessage("servermenu.restart") ); reinitItem.addActionListener ( new ActionListener() { public void actionPerformed ( ActionEvent evt ) { ((AGEClientWindow)window).reinit(); } } ); serverConfigurationMenu.add(reinitItem); } mb.add ( serverConfigurationMenu ); MenuMnemonicOnTheFly.setMnemonics(mb); mb.revalidate(); window.repaint(); } public void onAttach(GameEngineThread thread) { this.thread = thread; initServerMenu(); } public void onDetach(GameEngineThread thread) { uninitServerMenu(); } }