From 6b44dac1899a9f2276522bb8589cbd22ff617446 Mon Sep 17 00:00:00 2001 From: CarsenGafford2 Date: Mon, 30 Mar 2026 12:24:38 -0600 Subject: [PATCH] Extract keypad panels into separate classes Move scientific and basic keypad UI construction out of CalculatorView into new ScientificKeypadPanel and BasicKeypadPanel components. The panels encapsulate layout and button creation (append/wrap lists and control buttons) and expose getters for buttons; CalculatorView now instantiates these panels, aggregates their append/wrap button lists, and obtains references to AllClear/Del/Equals/Ans buttons from BasicKeypadPanel. This refactor reduces CalculatorView size and centralizes keypad layout logic with no functional behavior changes. --- .../main/java/kasio/view/CalculatorView.java | 99 ++++--------------- .../components/panels/BasicKeypadPanel.java | 85 ++++++++++++++++ .../panels/ScientificKeypadPanel.java | 68 +++++++++++++ 3 files changed, 173 insertions(+), 79 deletions(-) create mode 100644 app/src/main/java/kasio/view/components/panels/BasicKeypadPanel.java create mode 100644 app/src/main/java/kasio/view/components/panels/ScientificKeypadPanel.java diff --git a/app/src/main/java/kasio/view/CalculatorView.java b/app/src/main/java/kasio/view/CalculatorView.java index 588f73c..dd2aa82 100644 --- a/app/src/main/java/kasio/view/CalculatorView.java +++ b/app/src/main/java/kasio/view/CalculatorView.java @@ -3,8 +3,6 @@ import java.awt.AWTException; import java.awt.BorderLayout; import java.awt.Dimension; -import java.awt.Font; -import java.awt.GridLayout; import java.awt.Image; import java.awt.MenuItem; import java.awt.PopupMenu; @@ -23,7 +21,6 @@ import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; -import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.text.AbstractDocument; @@ -39,11 +36,13 @@ import kasio.view.components.buttons.DelButton; import kasio.view.components.buttons.EqualsButton; import kasio.view.components.buttons.WrapButton; +import kasio.view.components.panels.BasicKeypadPanel; +import kasio.view.components.panels.ScientificKeypadPanel; public class CalculatorView { private JFrame frame; - private JPanel scientificPanel; - private JPanel basicPanel; + private ScientificKeypadPanel scientificPanel; + private BasicKeypadPanel basicPanel; private MenuItem trayExitItem; final int contentWidth = 400; @@ -56,29 +55,13 @@ public class CalculatorView { private final JTextField textField; private final List appendButtons = new ArrayList<>(); private final List wrapButtons = new ArrayList<>(); - private final AllClearButton allClearButton = new AllClearButton(Fonts.KEYPAD_PRIMARY); - private final DelButton delButton = new DelButton(Fonts.KEYPAD_PRIMARY); - private final EqualsButton equalsButton = new EqualsButton(Fonts.KEYPAD_PRIMARY); - private final AnsButton ansButton = new AnsButton(Fonts.KEYPAD_PRIMARY); + private final AllClearButton allClearButton; + private final DelButton delButton; + private final EqualsButton equalsButton; + private final AnsButton ansButton; private boolean allowProgrammaticEdit = false; - private void addAppendBtn(JPanel panel, String text, Font font) { - addAppendBtn(panel, text, text, font); - } - - private void addAppendBtn(JPanel panel, String displayText, String evalText, Font font) { - AppendButton btn = new AppendButton(displayText, evalText, font); - appendButtons.add(btn); - panel.add(btn); - } - - private void addWrapBtn(JPanel panel, String text, String wrapPrefix, Font font) { - WrapButton btn = new WrapButton(text, wrapPrefix, font); - wrapButtons.add(btn); - panel.add(btn); - } - public CalculatorView() { frame = new JFrame("Calculator"); frame.setType(java.awt.Window.Type.UTILITY); @@ -202,63 +185,21 @@ public void remove(FilterBypass fb, int offset, int length) textField.setCaret(new RetroCaret()); textField.requestFocusInWindow(); - scientificPanel = new JPanel(); + scientificPanel = new ScientificKeypadPanel(); scientificPanel.setBounds(0, textFieldHeight, contentWidth, scientificPanelHeight); - scientificPanel.setBackground(Colors.SECONDARY); - scientificPanel.setLayout(new GridLayout(3, 6, 10, 10)); - scientificPanel.setBorder(BorderFactory.createMatteBorder(10, 10, 10, 10, Colors.SECONDARY)); - - addAppendBtn(scientificPanel, "SIN", "SIN(", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, "COS", "COS(", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, "TAN", "TAN(", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, "ASIN", "ASIN(", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, "ACOS", "ACOS(", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, "ATAN", "ATAN(", Fonts.KEYPAD_SECONDARY); - - addAppendBtn(scientificPanel, "X2", "∧2", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, "XY", "∧", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, "√", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, "!", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, "LOG", "LOG(", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, "LN", "LN(", Fonts.KEYPAD_SECONDARY); - - addWrapBtn(scientificPanel, "1/x", "1/", Fonts.KEYPAD_SECONDARY); - addWrapBtn(scientificPanel, "(x)", "", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, "e", Fonts.KEYPAD_SECONDARY); - addWrapBtn(scientificPanel, "±", "-", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, "(", Fonts.KEYPAD_SECONDARY); - addAppendBtn(scientificPanel, ")", Fonts.KEYPAD_SECONDARY); - - basicPanel = new JPanel(); + basicPanel = new BasicKeypadPanel(); basicPanel.setBounds( 0, textFieldHeight + scientificPanelHeight, contentWidth, basicPanelHeight); - basicPanel.setBackground(Colors.SECONDARY); - basicPanel.setLayout(new GridLayout(4, 5, 10, 10)); - basicPanel.setBorder(BorderFactory.createMatteBorder(0, 10, 10, 10, Colors.SECONDARY)); - - addAppendBtn(basicPanel, "7", Fonts.KEYPAD_PRIMARY); - addAppendBtn(basicPanel, "8", Fonts.KEYPAD_PRIMARY); - addAppendBtn(basicPanel, "9", Fonts.KEYPAD_PRIMARY); - basicPanel.add(delButton); - basicPanel.add(allClearButton); - - addAppendBtn(basicPanel, "4", Fonts.KEYPAD_PRIMARY); - addAppendBtn(basicPanel, "5", Fonts.KEYPAD_PRIMARY); - addAppendBtn(basicPanel, "6", Fonts.KEYPAD_PRIMARY); - addAppendBtn(basicPanel, "×", Fonts.KEYPAD_PRIMARY); - addAppendBtn(basicPanel, "÷", Fonts.KEYPAD_PRIMARY); - - addAppendBtn(basicPanel, "1", Fonts.KEYPAD_PRIMARY); - addAppendBtn(basicPanel, "2", Fonts.KEYPAD_PRIMARY); - addAppendBtn(basicPanel, "3", Fonts.KEYPAD_PRIMARY); - addAppendBtn(basicPanel, "+", Fonts.KEYPAD_PRIMARY); - addAppendBtn(basicPanel, "-", Fonts.KEYPAD_PRIMARY); - - addAppendBtn(basicPanel, "0", Fonts.KEYPAD_PRIMARY); - addAppendBtn(basicPanel, ".", Fonts.KEYPAD_PRIMARY); - addAppendBtn(basicPanel, "π", Fonts.KEYPAD_PRIMARY); - basicPanel.add(ansButton); - basicPanel.add(equalsButton); + + appendButtons.addAll(scientificPanel.getAppendButtons()); + appendButtons.addAll(basicPanel.getAppendButtons()); + wrapButtons.addAll(scientificPanel.getWrapButtons()); + wrapButtons.addAll(basicPanel.getWrapButtons()); + + allClearButton = basicPanel.getAllClearButton(); + delButton = basicPanel.getDelButton(); + equalsButton = basicPanel.getEqualsButton(); + ansButton = basicPanel.getAnsButton(); frame.setJMenuBar(menuBar); frame.add(textField); diff --git a/app/src/main/java/kasio/view/components/panels/BasicKeypadPanel.java b/app/src/main/java/kasio/view/components/panels/BasicKeypadPanel.java new file mode 100644 index 0000000..09e05d1 --- /dev/null +++ b/app/src/main/java/kasio/view/components/panels/BasicKeypadPanel.java @@ -0,0 +1,85 @@ +package kasio.view.components.panels; + +import java.awt.GridLayout; +import java.util.ArrayList; +import java.util.List; +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import kasio.view.components.Colors; +import kasio.view.components.Fonts; +import kasio.view.components.buttons.AllClearButton; +import kasio.view.components.buttons.AnsButton; +import kasio.view.components.buttons.AppendButton; +import kasio.view.components.buttons.DelButton; +import kasio.view.components.buttons.EqualsButton; +import kasio.view.components.buttons.WrapButton; + +public class BasicKeypadPanel extends JPanel { + + private final List appendButtons = new ArrayList<>(); + private final List wrapButtons = new ArrayList<>(); + private final AllClearButton allClearButton = new AllClearButton(Fonts.KEYPAD_PRIMARY); + private final DelButton delButton = new DelButton(Fonts.KEYPAD_PRIMARY); + private final EqualsButton equalsButton = new EqualsButton(Fonts.KEYPAD_PRIMARY); + private final AnsButton ansButton = new AnsButton(Fonts.KEYPAD_PRIMARY); + + public BasicKeypadPanel() { + setBackground(Colors.SECONDARY); + setLayout(new GridLayout(4, 5, 10, 10)); + setBorder(BorderFactory.createMatteBorder(0, 10, 10, 10, Colors.SECONDARY)); + + addAppendBtn("7"); + addAppendBtn("8"); + addAppendBtn("9"); + add(delButton); + add(allClearButton); + + addAppendBtn("4"); + addAppendBtn("5"); + addAppendBtn("6"); + addAppendBtn("×"); + addAppendBtn("÷"); + + addAppendBtn("1"); + addAppendBtn("2"); + addAppendBtn("3"); + addAppendBtn("+"); + addAppendBtn("-"); + + addAppendBtn("0"); + addAppendBtn("."); + addAppendBtn("π"); + add(ansButton); + add(equalsButton); + } + + private void addAppendBtn(String text) { + AppendButton button = new AppendButton(text, Fonts.KEYPAD_PRIMARY); + appendButtons.add(button); + add(button); + } + + public List getAppendButtons() { + return List.copyOf(appendButtons); + } + + public List getWrapButtons() { + return List.copyOf(wrapButtons); + } + + public AllClearButton getAllClearButton() { + return allClearButton; + } + + public DelButton getDelButton() { + return delButton; + } + + public EqualsButton getEqualsButton() { + return equalsButton; + } + + public AnsButton getAnsButton() { + return ansButton; + } +} diff --git a/app/src/main/java/kasio/view/components/panels/ScientificKeypadPanel.java b/app/src/main/java/kasio/view/components/panels/ScientificKeypadPanel.java new file mode 100644 index 0000000..4df29fe --- /dev/null +++ b/app/src/main/java/kasio/view/components/panels/ScientificKeypadPanel.java @@ -0,0 +1,68 @@ +package kasio.view.components.panels; + +import java.awt.GridLayout; +import java.util.ArrayList; +import java.util.List; +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import kasio.view.components.Colors; +import kasio.view.components.Fonts; +import kasio.view.components.buttons.AppendButton; +import kasio.view.components.buttons.WrapButton; + +public class ScientificKeypadPanel extends JPanel { + + private final List appendButtons = new ArrayList<>(); + private final List wrapButtons = new ArrayList<>(); + + public ScientificKeypadPanel() { + setBackground(Colors.SECONDARY); + setLayout(new GridLayout(3, 6, 10, 10)); + setBorder(BorderFactory.createMatteBorder(10, 10, 10, 10, Colors.SECONDARY)); + + addAppendBtn("SIN", "SIN("); + addAppendBtn("COS", "COS("); + addAppendBtn("TAN", "TAN("); + addAppendBtn("ASIN", "ASIN("); + addAppendBtn("ACOS", "ACOS("); + addAppendBtn("ATAN", "ATAN("); + + addAppendBtn("X2", "∧2"); + addAppendBtn("XY", "∧"); + addAppendBtn("√"); + addAppendBtn("!"); + addAppendBtn("LOG", "LOG("); + addAppendBtn("LN", "LN("); + + addWrapBtn("1/x", "1/"); + addWrapBtn("(x)", ""); + addAppendBtn("e"); + addWrapBtn("±", "-"); + addAppendBtn("("); + addAppendBtn(")"); + } + + private void addAppendBtn(String text) { + addAppendBtn(text, text); + } + + private void addAppendBtn(String displayText, String evalText) { + AppendButton button = new AppendButton(displayText, evalText, Fonts.KEYPAD_SECONDARY); + appendButtons.add(button); + add(button); + } + + private void addWrapBtn(String text, String wrapPrefix) { + WrapButton button = new WrapButton(text, wrapPrefix, Fonts.KEYPAD_SECONDARY); + wrapButtons.add(button); + add(button); + } + + public List getAppendButtons() { + return List.copyOf(appendButtons); + } + + public List getWrapButtons() { + return List.copyOf(wrapButtons); + } +}