diff --git a/src/main/java/com/loomcom/symon/Main.java b/src/main/java/com/loomcom/symon/Main.java index 78d7b59..a1b2096 100644 --- a/src/main/java/com/loomcom/symon/Main.java +++ b/src/main/java/com/loomcom/symon/Main.java @@ -40,9 +40,9 @@ public class Main { * * @param args */ - public static void main(String args[]) { + public static void main(String args[]) throws Exception { - Class machineClass = null; + Class machineClass = SymonMachine.class; for(int i = 0; i < args.length; ++i) { String arg = args[i].toLowerCase(Locale.ENGLISH); if(arg.equals("-machine") && (i+1) < args.length) { @@ -55,38 +55,46 @@ public class Main { } } - if(machineClass == null) { - Object[] possibilities = {"Symon", "Multicomp"}; - String s = (String)JOptionPane.showInputDialog( - null, - "Please choose the machine type to be emulated:", - "Machine selection", - JOptionPane.PLAIN_MESSAGE, - null, - possibilities, - "Symon"); - if(s.equals("Symon")) { - machineClass = SymonMachine.class; - } else { - machineClass = MulticompMachine.class; - } - } - - - final Class mClass = machineClass; - SwingUtilities.invokeLater(new Runnable() { - public void run() { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - // Create the main UI window - Simulator simulator = new Simulator(mClass); - simulator.createAndShowUi(); - } catch (Exception e) { - e.printStackTrace(); + while(true) { + if(machineClass == null) { + Object[] possibilities = {"Symon", "Multicomp"}; + String s = (String)JOptionPane.showInputDialog( + null, + "Please choose the machine type to be emulated:", + "Machine selection", + JOptionPane.PLAIN_MESSAGE, + null, + possibilities, + "Symon"); + if(s.equals("Symon")) { + machineClass = SymonMachine.class; + } else { + machineClass = MulticompMachine.class; } } - }); + final Simulator simulator = new Simulator(machineClass); + + SwingUtilities.invokeLater(new Runnable() { + public void run() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + // Create the main UI window + simulator.createAndShowUi(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + + Simulator.MAIN_CMD cmd = simulator.waitForCommand(); + if(cmd.equals(Simulator.MAIN_CMD.SELECTMACHINE)) { + machineClass = null; + } else { + break; + } + } } diff --git a/src/main/java/com/loomcom/symon/Simulator.java b/src/main/java/com/loomcom/symon/Simulator.java index b064d5b..161c9d4 100644 --- a/src/main/java/com/loomcom/symon/Simulator.java +++ b/src/main/java/com/loomcom/symon/Simulator.java @@ -116,6 +116,13 @@ public class Simulator { private JFileChooser fileChooser; private PreferencesDialog preferences; + private final Object commandMonitorObject = new Object(); + private MAIN_CMD command = MAIN_CMD.NONE; + public static enum MAIN_CMD { + NONE, + SELECTMACHINE + } + /** * The list of step counts that will appear in the "Step" drop-down. */ @@ -230,6 +237,18 @@ public class Simulator { console.requestFocus(); handleReset(); } + + public MAIN_CMD waitForCommand() { + synchronized(commandMonitorObject) { + try { + commandMonitorObject.wait(); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + } + return command; + } + private void handleStart() { // Shift focus to the console. @@ -543,6 +562,34 @@ public class Simulator { preferences.getDialog().setVisible(true); } } + + class SelectMachineAction extends AbstractAction { + Simulator simulator; + + public SelectMachineAction() { + super("Switch emulated machine...", null); + putValue(SHORT_DESCRIPTION, "Select the type of the machine to be emulated"); + putValue(MNEMONIC_KEY, KeyEvent.VK_M); + } + + public void actionPerformed(ActionEvent actionEvent) { + if(runLoop != null) { + runLoop.requestStop(); + } + + memoryWindow.dispose(); + traceLog.dispose(); + if(videoWindow != null) { + videoWindow.dispose(); + } + mainWindow.dispose(); + + command = MAIN_CMD.SELECTMACHINE; + synchronized(commandMonitorObject) { + commandMonitorObject.notifyAll(); + } + } + } class QuitAction extends AbstractAction { public QuitAction() { @@ -669,11 +716,13 @@ public class Simulator { loadProgramItem = new JMenuItem(new LoadProgramAction()); loadRomItem = new JMenuItem(new LoadRomAction()); JMenuItem prefsItem = new JMenuItem(new ShowPrefsAction()); + JMenuItem selectMachineItem = new JMenuItem(new SelectMachineAction()); JMenuItem quitItem = new JMenuItem(new QuitAction()); fileMenu.add(loadProgramItem); fileMenu.add(loadRomItem); fileMenu.add(prefsItem); + fileMenu.add(selectMachineItem); fileMenu.add(quitItem); add(fileMenu);