From 3636e78435a876b4f3161f820b073a11c08acc64 Mon Sep 17 00:00:00 2001 From: Seth Morabito Date: Sun, 30 Dec 2012 12:14:30 -0800 Subject: [PATCH] Cleanup and Bug Fixes - Fixed a bug that left View menu items checked after the associated windows closed. - Cleaned up UI init code for several components. --- .../java/com/loomcom/symon/Simulator.java | 33 +++++++---- .../com/loomcom/symon/ui/MemoryWindow.java | 4 +- .../loomcom/symon/ui/PreferencesDialog.java | 5 +- .../com/loomcom/symon/ui/StatusPanel.java | 59 ++++++++++--------- .../java/com/loomcom/symon/ui/TraceLog.java | 35 +++-------- 5 files changed, 67 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/loomcom/symon/Simulator.java b/src/main/java/com/loomcom/symon/Simulator.java index 1ffe79d..13cfdf8 100644 --- a/src/main/java/com/loomcom/symon/Simulator.java +++ b/src/main/java/com/loomcom/symon/Simulator.java @@ -36,9 +36,7 @@ import com.loomcom.symon.ui.Console; import javax.swing.*; import javax.swing.border.EmptyBorder; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; +import java.awt.event.*; import java.io.*; import java.util.Observable; import java.util.Observer; @@ -170,10 +168,6 @@ public class Simulator implements Observer { mainWindow.setResizable(false); mainWindow.getContentPane().setLayout(new BorderLayout()); - // The Menu - menuBar = new SimulatorMenu(); - mainWindow.setJMenuBar(menuBar); - // UI components used for I/O. this.console = new com.loomcom.symon.ui.Console(80, 25, DEFAULT_FONT); this.statusPane = new StatusPanel(); @@ -239,6 +233,11 @@ public class Simulator implements Observer { mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + // The Menu. This comes last, because it relies on other components having + // already been initialized. + menuBar = new SimulatorMenu(); + mainWindow.setJMenuBar(menuBar); + console.requestFocus(); mainWindow.pack(); @@ -719,10 +718,24 @@ public class Simulator implements Observer { makeFontSizeMenuItem(20, fontSubMenu, fontSizeGroup); viewMenu.add(fontSubMenu); - JRadioButtonMenuItem showTraceLog = new JRadioButtonMenuItem(new ToggleTraceWindowAction()); + final JCheckBoxMenuItem showTraceLog = new JCheckBoxMenuItem(new ToggleTraceWindowAction()); + // Un-check the menu item if the user closes the window directly + traceLog.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + showTraceLog.setSelected(false); + } + }); viewMenu.add(showTraceLog); - JRadioButtonMenuItem showMemoryTable = new JRadioButtonMenuItem(new ToggleMemoryWindowAction()); + final JCheckBoxMenuItem showMemoryTable = new JCheckBoxMenuItem(new ToggleMemoryWindowAction()); + // Un-check the menu item if the user closes the window directly + memoryWindow.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + showMemoryTable.setSelected(false); + } + }); viewMenu.add(showMemoryTable); add(viewMenu); @@ -731,7 +744,7 @@ public class Simulator implements Observer { private void makeFontSizeMenuItem(int size, JMenu fontSubMenu, ButtonGroup group) { Action action = new SetFontAction(size); - JRadioButtonMenuItem item = new JRadioButtonMenuItem(action); + JCheckBoxMenuItem item = new JCheckBoxMenuItem(action); item.setSelected(size == DEFAULT_FONT_SIZE); fontSubMenu.add(item); group.add(item); diff --git a/src/main/java/com/loomcom/symon/ui/MemoryWindow.java b/src/main/java/com/loomcom/symon/ui/MemoryWindow.java index 26fb928..d8cb0e7 100644 --- a/src/main/java/com/loomcom/symon/ui/MemoryWindow.java +++ b/src/main/java/com/loomcom/symon/ui/MemoryWindow.java @@ -45,11 +45,11 @@ public class MemoryWindow extends JFrame implements ActionListener { private JTable memoryTable; private JTextField pageNumberTextField; - private static final Dimension MINIMUM_SIZE = new Dimension(400, 450); + private static final Dimension MINIMUM_SIZE = new Dimension(380, 580); public MemoryWindow(Bus bus) { this.memoryTableModel = new MemoryTableModel(bus); - this.createUi(); + createUi(); } /** diff --git a/src/main/java/com/loomcom/symon/ui/PreferencesDialog.java b/src/main/java/com/loomcom/symon/ui/PreferencesDialog.java index dc4ad58..863bae1 100644 --- a/src/main/java/com/loomcom/symon/ui/PreferencesDialog.java +++ b/src/main/java/com/loomcom/symon/ui/PreferencesDialog.java @@ -48,7 +48,8 @@ public class PreferencesDialog extends Observable implements Preferences { public PreferencesDialog(Frame parent, boolean modal) { this.dialog = new JDialog(parent, modal); - initComponents(); + + createUi(); updateUi(); } @@ -59,7 +60,7 @@ public class PreferencesDialog extends Observable implements Preferences { /** * TODO: Validation of input. */ - private void initComponents() { + private void createUi() { dialog.setTitle("Preferences"); Container contents = dialog.getContentPane(); diff --git a/src/main/java/com/loomcom/symon/ui/StatusPanel.java b/src/main/java/com/loomcom/symon/ui/StatusPanel.java index aefe5f8..46d2e34 100644 --- a/src/main/java/com/loomcom/symon/ui/StatusPanel.java +++ b/src/main/java/com/loomcom/symon/ui/StatusPanel.java @@ -34,29 +34,29 @@ import java.awt.*; */ public class StatusPanel extends JPanel { - private final ImageIcon carryOn; - private final ImageIcon carryOff; - private final ImageIcon zeroOn; - private final ImageIcon zeroOff; - private final ImageIcon irqOn; - private final ImageIcon irqOff; - private final ImageIcon decimalOn; - private final ImageIcon decimalOff; - private final ImageIcon breakOn; - private final ImageIcon breakOff; - private final ImageIcon overflowOn; - private final ImageIcon overflowOff; - private final ImageIcon negativeOn; - private final ImageIcon negativeOff; + private ImageIcon carryOn; + private ImageIcon carryOff; + private ImageIcon zeroOn; + private ImageIcon zeroOff; + private ImageIcon irqOn; + private ImageIcon irqOff; + private ImageIcon decimalOn; + private ImageIcon decimalOff; + private ImageIcon breakOn; + private ImageIcon breakOff; + private ImageIcon overflowOn; + private ImageIcon overflowOff; + private ImageIcon negativeOn; + private ImageIcon negativeOff; - private final JLabel statusFlagsLabel; - private final JLabel carryFlagLabel; - private final JLabel zeroFlagLabel; - private final JLabel irqDisableFlagLabel; - private final JLabel decimalModeFlagLabel; - private final JLabel breakFlagLabel; - private final JLabel overflowFlagLabel; - private final JLabel negativeFlagLabel; + private JLabel statusFlagsLabel; + private JLabel carryFlagLabel; + private JLabel zeroFlagLabel; + private JLabel irqDisableFlagLabel; + private JLabel decimalModeFlagLabel; + private JLabel breakFlagLabel; + private JLabel overflowFlagLabel; + private JLabel negativeFlagLabel; private JTextField opcodeField; private JTextField pcField; @@ -65,12 +65,12 @@ public class StatusPanel extends JPanel { private JTextField xField; private JTextField yField; - private final JLabel opcodeLabel; - private final JLabel pcLabel; - private final JLabel spLabel; - private final JLabel aLabel; - private final JLabel xLabel; - private final JLabel yLabel; + private JLabel opcodeLabel; + private JLabel pcLabel; + private JLabel spLabel; + private JLabel aLabel; + private JLabel xLabel; + private JLabel yLabel; private static final int EMPTY_BORDER = 10; private static final Border LABEL_BORDER = BorderFactory.createEmptyBorder(0, 5, 0, 0); @@ -80,7 +80,10 @@ public class StatusPanel extends JPanel { public StatusPanel() { super(); + createUi(); + } + private void createUi() { Border emptyBorder = BorderFactory.createEmptyBorder(EMPTY_BORDER, EMPTY_BORDER, EMPTY_BORDER, EMPTY_BORDER); Border etchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED); diff --git a/src/main/java/com/loomcom/symon/ui/TraceLog.java b/src/main/java/com/loomcom/symon/ui/TraceLog.java index 9641fa9..f4b0a37 100644 --- a/src/main/java/com/loomcom/symon/ui/TraceLog.java +++ b/src/main/java/com/loomcom/symon/ui/TraceLog.java @@ -34,10 +34,9 @@ import java.awt.*; * This frame displays a trace of CPU execution. The most recent TRACE_LENGTH lines * are captured in a buffer and rendered to the JFrame's main text area upon request. */ -public class TraceLog { +public class TraceLog extends JFrame { private FifoRingBuffer traceLog; - private JFrame traceLogFrame; private JTextArea traceLogTextArea; private static final Dimension MIN_SIZE = new Dimension(320, 200); @@ -46,13 +45,12 @@ public class TraceLog { public TraceLog() { traceLog = new FifoRingBuffer(MAX_LOG_LENGTH); - traceLogFrame = new JFrame(); - traceLogFrame.setMinimumSize(MIN_SIZE); - traceLogFrame.setPreferredSize(PREFERRED_SIZE); - traceLogFrame.setResizable(true); - traceLogFrame.setTitle("Trace Log"); + setMinimumSize(MIN_SIZE); + setPreferredSize(PREFERRED_SIZE); + setResizable(true); + setTitle("Trace Log"); - traceLogFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); + setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); traceLogTextArea = new JTextArea(); traceLogTextArea.setFont(new Font(Font.MONOSPACED, Font.BOLD, 12)); @@ -60,9 +58,8 @@ public class TraceLog { JScrollPane scrollableView = new JScrollPane(traceLogTextArea); - traceLogFrame.getContentPane().add(scrollableView); - traceLogFrame.pack(); - // Don't show the frame. That action is controlled by the Simulator. + getContentPane().add(scrollableView); + pack(); } /** @@ -110,20 +107,4 @@ public class TraceLog { traceLogTextArea.setEnabled(true); } - /** - * Returns true if the Trace Log window is currently visible. - * @return ture if the Trace Log window is currently visible. - */ - public boolean isVisible() { - return traceLogFrame.isVisible(); - } - - /** - * Sets the visibility of the Trace Log window. - * - * @param b True to make the Trace Log window visible, false to hide it. - */ - public void setVisible(boolean b) { - traceLogFrame.setVisible(b); - } }