From 46afa81261dd20fd9d9326a4d97767bdf7b78371 Mon Sep 17 00:00:00 2001 From: GiannisKarampinis <80476980+GiannisKarampinis@users.noreply.github.com> Date: Sun, 10 Dec 2023 02:11:06 +0200 Subject: [PATCH] Add an OOP approach of Simple Java Calculator --- src/simplejavacalculator/AbsCalc.java | 7 + src/simplejavacalculator/AddCalc.java | 9 + src/simplejavacalculator/BinaryCommand.java | 23 + src/simplejavacalculator/Buffer.java | 19 + src/simplejavacalculator/Calculator.java | 136 +----- src/simplejavacalculator/ClearCommand.java | 19 + src/simplejavacalculator/Command.java | 27 + src/simplejavacalculator/CosCalc.java | 8 + src/simplejavacalculator/DivideCalc.java | 11 + src/simplejavacalculator/EqualCommand.java | 21 + src/simplejavacalculator/LnCalc.java | 10 + src/simplejavacalculator/LogCalc.java | 11 + src/simplejavacalculator/MinusCalc.java | 8 + src/simplejavacalculator/MultiplyCalc.java | 10 + src/simplejavacalculator/NumberCommand.java | 49 ++ src/simplejavacalculator/OneDivideByCalc.java | 8 + src/simplejavacalculator/RateCalc.java | 10 + .../SimpleJavaCalculator.java | 1 - src/simplejavacalculator/SinCalc.java | 8 + src/simplejavacalculator/SquareCalc.java | 10 + src/simplejavacalculator/SquareRootCalc.java | 10 + src/simplejavacalculator/TanCalc.java | 19 + src/simplejavacalculator/UI.java | 462 +++++++----------- src/simplejavacalculator/UnaryCommand.java | 20 + src/simplejavacalculator/XpowerofyCalc.java | 8 + 25 files changed, 500 insertions(+), 424 deletions(-) create mode 100644 src/simplejavacalculator/AbsCalc.java create mode 100644 src/simplejavacalculator/AddCalc.java create mode 100644 src/simplejavacalculator/BinaryCommand.java create mode 100644 src/simplejavacalculator/Buffer.java create mode 100644 src/simplejavacalculator/ClearCommand.java create mode 100644 src/simplejavacalculator/Command.java create mode 100644 src/simplejavacalculator/CosCalc.java create mode 100644 src/simplejavacalculator/DivideCalc.java create mode 100644 src/simplejavacalculator/EqualCommand.java create mode 100644 src/simplejavacalculator/LnCalc.java create mode 100644 src/simplejavacalculator/LogCalc.java create mode 100644 src/simplejavacalculator/MinusCalc.java create mode 100644 src/simplejavacalculator/MultiplyCalc.java create mode 100644 src/simplejavacalculator/NumberCommand.java create mode 100644 src/simplejavacalculator/OneDivideByCalc.java create mode 100644 src/simplejavacalculator/RateCalc.java create mode 100644 src/simplejavacalculator/SinCalc.java create mode 100644 src/simplejavacalculator/SquareCalc.java create mode 100644 src/simplejavacalculator/SquareRootCalc.java create mode 100644 src/simplejavacalculator/TanCalc.java create mode 100644 src/simplejavacalculator/UnaryCommand.java create mode 100644 src/simplejavacalculator/XpowerofyCalc.java diff --git a/src/simplejavacalculator/AbsCalc.java b/src/simplejavacalculator/AbsCalc.java new file mode 100644 index 0000000..2b3e1b4 --- /dev/null +++ b/src/simplejavacalculator/AbsCalc.java @@ -0,0 +1,7 @@ +package simplejavacalculator; + +public class AbsCalc implements Calculator { + public double calculate(Buffer buffer) { + return Math.abs(buffer.num1); + } +} diff --git a/src/simplejavacalculator/AddCalc.java b/src/simplejavacalculator/AddCalc.java new file mode 100644 index 0000000..1d2b292 --- /dev/null +++ b/src/simplejavacalculator/AddCalc.java @@ -0,0 +1,9 @@ +package simplejavacalculator; + +public class AddCalc implements Calculator { + + public double calculate(Buffer buffer) { + + return buffer.num1 + buffer.num2; + } +} diff --git a/src/simplejavacalculator/BinaryCommand.java b/src/simplejavacalculator/BinaryCommand.java new file mode 100644 index 0000000..96381a5 --- /dev/null +++ b/src/simplejavacalculator/BinaryCommand.java @@ -0,0 +1,23 @@ +package simplejavacalculator; + +import javax.swing.JTextArea; + +import simplejavacalculator.Buffer.PreviouslyPressed; + +public class BinaryCommand extends Command { + + public void execute(Buffer buffer, String label) { + this.sub = CommandSubtype.COM_BINARY; + Buffer.pp = PreviouslyPressed.PRESSED_BINARY; + // Calculation with an abstraction manner + } + + public void show(JTextArea text, Buffer buffer, Calculator calc, String label) { + buffer.c = calc; // save the pointer globally + text.setText(label); + if (buffer.c != null && (buffer.num1 != null && buffer.num2 != null)) { + buffer.num1 = (calc.calculate(buffer)); + writer(buffer.num1, text); + } + } +} diff --git a/src/simplejavacalculator/Buffer.java b/src/simplejavacalculator/Buffer.java new file mode 100644 index 0000000..d4b324a --- /dev/null +++ b/src/simplejavacalculator/Buffer.java @@ -0,0 +1,19 @@ +package simplejavacalculator; + +public class Buffer { + public Double num1 = null, num2 = null; + public Double buffered_res = null; + + public enum PreviouslyPressed { + PRESSED_NONE, + PRESSED_NUMBER, + PRESSED_UNARY, + PRESSED_BINARY, + PRESSED_EQUAL, + PRESSED_CLEAR + }; + + public static PreviouslyPressed pp = PreviouslyPressed.PRESSED_NONE; + public Object c = null; + +} diff --git a/src/simplejavacalculator/Calculator.java b/src/simplejavacalculator/Calculator.java index f76e879..c564ab8 100644 --- a/src/simplejavacalculator/Calculator.java +++ b/src/simplejavacalculator/Calculator.java @@ -1,130 +1,6 @@ -/** - * @name Simple Java Calculator - * @package ph.calculator - * @file Main.java - * @author SORIA Pierre-Henry - * @email pierrehs@hotmail.com - * @link http://github.com/pH-7 - * @copyright Copyright Pierre-Henry SORIA, All Rights Reserved. - * @license Apache (http://www.apache.org/licenses/LICENSE-2.0) - */ - -package simplejavacalculator; - -import static java.lang.Double.NaN; -import static java.lang.Math.log; -import static java.lang.Math.log10; -import static java.lang.Math.pow; - -public class Calculator { - - public enum BiOperatorModes { - normal, add, minus, multiply, divide , xpowerofy - } - - public enum MonoOperatorModes { - square, squareRoot, oneDividedBy, cos, sin, tan, log, rate, abs, ln, - } - - private Double num1, num2; - private BiOperatorModes mode = BiOperatorModes.normal; - - private Double calculateBiImpl() { - if (mode == BiOperatorModes.normal) { - return num2; - } - if (mode == BiOperatorModes.add) { - if (num2 != 0) { - return num1 + num2; - } - - return num1; - } - if (mode == BiOperatorModes.minus) { - return num1 - num2; - } - if (mode == BiOperatorModes.multiply) { - return num1 * num2; - } - if (mode == BiOperatorModes.divide) { - return num1 / num2; - } - if (mode == BiOperatorModes.xpowerofy) { - return pow(num1,num2); - } - - // never reach - throw new Error(); - } - - public Double calculateBi(BiOperatorModes newMode, Double num) { - if (mode == BiOperatorModes.normal) { - num2 = 0.0; - num1 = num; - mode = newMode; - return NaN; - } else { - num2 = num; - num1 = calculateBiImpl(); - mode = newMode; - return num1; - } - } - - public Double calculateEqual(Double num) { - return calculateBi(BiOperatorModes.normal, num); - } - - public Double reset() { - num2 = 0.0; - num1 = 0.0; - mode = BiOperatorModes.normal; - - return NaN; - } - - - public Double calculateMono(MonoOperatorModes newMode, Double num) { - if (newMode == MonoOperatorModes.square) { - return num * num; - } - if (newMode == MonoOperatorModes.squareRoot) { - return Math.sqrt(num); - } - if (newMode == MonoOperatorModes.oneDividedBy) { - return 1 / num; - } - if (newMode == MonoOperatorModes.cos) { - return Math.cos(Math.toRadians(num)); - } - if (newMode == MonoOperatorModes.sin) { - return Math.sin(Math.toRadians(num)); - } - if (newMode == MonoOperatorModes.tan) { - if (num == 0 || num % 180 == 0) { - return 0.0; - } - if (num % 90 == 0 && num % 180 != 0) { - return NaN; - } - - return Math.tan(Math.toRadians(num)); - } - if (newMode == MonoOperatorModes.log) { - return log10(num); - } - if (newMode == MonoOperatorModes.ln) { - return log(num); - } - if (newMode == MonoOperatorModes.rate) { - return num / 100; - } - if (newMode == MonoOperatorModes.abs){ - return Math.abs(num); - } - - // never reach - throw new Error(); - } - -} +package simplejavacalculator; + +public interface Calculator { + public abstract double calculate(Buffer buffer); + +} diff --git a/src/simplejavacalculator/ClearCommand.java b/src/simplejavacalculator/ClearCommand.java new file mode 100644 index 0000000..6f68cb5 --- /dev/null +++ b/src/simplejavacalculator/ClearCommand.java @@ -0,0 +1,19 @@ +package simplejavacalculator; + +import javax.swing.JTextArea; + +import simplejavacalculator.Buffer.PreviouslyPressed; + +public class ClearCommand extends Command{ + public void execute(Buffer buffer, String label) { + this.sub = CommandSubtype.COM_CLEAR; + + Buffer.pp = PreviouslyPressed.PRESSED_NONE; + buffer.num1 = null; + buffer.num2 = null; + } + + public void show(JTextArea text, Buffer buffer, Calculator calc, String label) { + writer(Double.NaN, text); + } +} diff --git a/src/simplejavacalculator/Command.java b/src/simplejavacalculator/Command.java new file mode 100644 index 0000000..bd9945b --- /dev/null +++ b/src/simplejavacalculator/Command.java @@ -0,0 +1,27 @@ +package simplejavacalculator; + +import javax.swing.JTextArea; + +public abstract class Command { + + public enum CommandSubtype { + COM_NUMBER, + COM_UNARY, + COM_BINARY, + COM_EQUAL, + COM_CLEAR + } + + public CommandSubtype sub; + + public abstract void execute(Buffer buffer, String label); + public abstract void show(JTextArea text, Buffer buffer, Calculator calc, String label); + + public static void writer(final Double num, JTextArea text) { + if (Double.isNaN(num)) { + text.setText(""); + } else { + text.setText(Double.toString(num)); + } + } +} diff --git a/src/simplejavacalculator/CosCalc.java b/src/simplejavacalculator/CosCalc.java new file mode 100644 index 0000000..ec979f3 --- /dev/null +++ b/src/simplejavacalculator/CosCalc.java @@ -0,0 +1,8 @@ +package simplejavacalculator; + +public class CosCalc implements Calculator { + public double calculate(Buffer buffer) { + + return Math.cos(Math.toRadians(buffer.num1)); + } +} diff --git a/src/simplejavacalculator/DivideCalc.java b/src/simplejavacalculator/DivideCalc.java new file mode 100644 index 0000000..17205f6 --- /dev/null +++ b/src/simplejavacalculator/DivideCalc.java @@ -0,0 +1,11 @@ +package simplejavacalculator; + +public class DivideCalc implements Calculator { + + public double calculate(Buffer buffer) { + + // FIXME + return buffer.num1 / buffer.num2; + } + +} diff --git a/src/simplejavacalculator/EqualCommand.java b/src/simplejavacalculator/EqualCommand.java new file mode 100644 index 0000000..fbc83f7 --- /dev/null +++ b/src/simplejavacalculator/EqualCommand.java @@ -0,0 +1,21 @@ +package simplejavacalculator; + +import javax.swing.JTextArea; + +import simplejavacalculator.Buffer.PreviouslyPressed; + +public class EqualCommand extends Command { + public void execute(Buffer buffer, String label) { + this.sub = CommandSubtype.COM_EQUAL; + Buffer.pp = PreviouslyPressed.PRESSED_EQUAL; + } + + public void show(JTextArea text, Buffer buffer, Calculator calc, String label) { + if (buffer.c != null && (buffer.num1 != null && buffer.num2 != null)) { + buffer.num1 = ((Calculator)(buffer.c)).calculate(buffer); + writer(buffer.num1, text); + buffer.num2 = null; + + } + } +} \ No newline at end of file diff --git a/src/simplejavacalculator/LnCalc.java b/src/simplejavacalculator/LnCalc.java new file mode 100644 index 0000000..b5e56e2 --- /dev/null +++ b/src/simplejavacalculator/LnCalc.java @@ -0,0 +1,10 @@ +package simplejavacalculator; +import static java.lang.Math.log; + +public class LnCalc implements Calculator { + + public double calculate(Buffer buffer) { + + return log(buffer.num1); + } +} diff --git a/src/simplejavacalculator/LogCalc.java b/src/simplejavacalculator/LogCalc.java new file mode 100644 index 0000000..8953f90 --- /dev/null +++ b/src/simplejavacalculator/LogCalc.java @@ -0,0 +1,11 @@ +package simplejavacalculator; + +import static java.lang.Math.log10; + +public class LogCalc implements Calculator { + + public double calculate(Buffer buffer) { + + return log10(buffer.num1); + } +} diff --git a/src/simplejavacalculator/MinusCalc.java b/src/simplejavacalculator/MinusCalc.java new file mode 100644 index 0000000..4b60dd6 --- /dev/null +++ b/src/simplejavacalculator/MinusCalc.java @@ -0,0 +1,8 @@ +package simplejavacalculator; + +public class MinusCalc implements Calculator { + public double calculate(Buffer buffer) { + + return buffer.num1 - buffer.num2; + } +} diff --git a/src/simplejavacalculator/MultiplyCalc.java b/src/simplejavacalculator/MultiplyCalc.java new file mode 100644 index 0000000..f6652c1 --- /dev/null +++ b/src/simplejavacalculator/MultiplyCalc.java @@ -0,0 +1,10 @@ +package simplejavacalculator; + +public class MultiplyCalc implements Calculator { + + public double calculate(Buffer buffer) { + + return buffer.num1 * buffer.num2; + } + +} diff --git a/src/simplejavacalculator/NumberCommand.java b/src/simplejavacalculator/NumberCommand.java new file mode 100644 index 0000000..3fe2758 --- /dev/null +++ b/src/simplejavacalculator/NumberCommand.java @@ -0,0 +1,49 @@ +package simplejavacalculator; + +import javax.swing.JTextArea; + +import simplejavacalculator.Buffer.PreviouslyPressed; + +public class NumberCommand extends Command { + + private double get_new_buff_after_num_pressed(Double buffer, Double new_num) + { + Double res = null; + + Double temp2 = (double)(buffer * 10 + new_num); + + if (temp2 < Integer.MAX_VALUE) { + res = temp2; + } + return res; + } + + public void execute(Buffer buffer, String label) { + + this.sub = CommandSubtype.COM_NUMBER; + + Double temp1 = Double.parseDouble(label); + + if (Buffer.pp == PreviouslyPressed.PRESSED_NONE || Buffer.pp == PreviouslyPressed.PRESSED_EQUAL) { + buffer.num1 = temp1; + Buffer.pp = PreviouslyPressed.PRESSED_NUMBER; + } else if (Buffer.pp == PreviouslyPressed.PRESSED_NUMBER) { + if (buffer.num2 != null) { + buffer.num2 = get_new_buff_after_num_pressed(buffer.num2, temp1); + } else { + buffer.num1 = get_new_buff_after_num_pressed(buffer.num1, temp1); + } + } else if (Buffer.pp == PreviouslyPressed.PRESSED_BINARY) { + buffer.num2 = temp1; + Buffer.pp = PreviouslyPressed.PRESSED_NUMBER; + } + } + + public void show(JTextArea text, Buffer buffer, Calculator calc, String label) { + if (buffer.num2 != null) { + writer((double)buffer.num2, text); + } else { + writer((double)buffer.num1, text); + } + } +} diff --git a/src/simplejavacalculator/OneDivideByCalc.java b/src/simplejavacalculator/OneDivideByCalc.java new file mode 100644 index 0000000..6b6060c --- /dev/null +++ b/src/simplejavacalculator/OneDivideByCalc.java @@ -0,0 +1,8 @@ +package simplejavacalculator; + +public class OneDivideByCalc implements Calculator { + public double calculate(Buffer buffer) { + + return 1 / buffer.num1; + } +} diff --git a/src/simplejavacalculator/RateCalc.java b/src/simplejavacalculator/RateCalc.java new file mode 100644 index 0000000..38fc969 --- /dev/null +++ b/src/simplejavacalculator/RateCalc.java @@ -0,0 +1,10 @@ +package simplejavacalculator; + +public class RateCalc implements Calculator { + + public double calculate(Buffer buffer) { + + return buffer.num1/100; + } + +} diff --git a/src/simplejavacalculator/SimpleJavaCalculator.java b/src/simplejavacalculator/SimpleJavaCalculator.java index cd11787..3e7dd69 100644 --- a/src/simplejavacalculator/SimpleJavaCalculator.java +++ b/src/simplejavacalculator/SimpleJavaCalculator.java @@ -21,7 +21,6 @@ public class SimpleJavaCalculator { public static void main(String[] args) { try { UI uiCal = new UI(); - uiCal.init(); } catch (Exception e) { System.out.println(e.getMessage()); diff --git a/src/simplejavacalculator/SinCalc.java b/src/simplejavacalculator/SinCalc.java new file mode 100644 index 0000000..bfaa1be --- /dev/null +++ b/src/simplejavacalculator/SinCalc.java @@ -0,0 +1,8 @@ +package simplejavacalculator; + +public class SinCalc implements Calculator { + public double calculate(Buffer buffer) { + + return Math.sin(Math.toRadians(buffer.num1)); + } +} diff --git a/src/simplejavacalculator/SquareCalc.java b/src/simplejavacalculator/SquareCalc.java new file mode 100644 index 0000000..fb1c9f5 --- /dev/null +++ b/src/simplejavacalculator/SquareCalc.java @@ -0,0 +1,10 @@ +package simplejavacalculator; + +public class SquareCalc implements Calculator { + + public double calculate(Buffer buffer) { + + return buffer.num1 * buffer.num1; + } + +} diff --git a/src/simplejavacalculator/SquareRootCalc.java b/src/simplejavacalculator/SquareRootCalc.java new file mode 100644 index 0000000..8b88f68 --- /dev/null +++ b/src/simplejavacalculator/SquareRootCalc.java @@ -0,0 +1,10 @@ +package simplejavacalculator; + +public class SquareRootCalc implements Calculator { + + public double calculate(Buffer buffer) { + + return Math.sqrt(buffer.num1); + } + +} diff --git a/src/simplejavacalculator/TanCalc.java b/src/simplejavacalculator/TanCalc.java new file mode 100644 index 0000000..2b3810a --- /dev/null +++ b/src/simplejavacalculator/TanCalc.java @@ -0,0 +1,19 @@ +package simplejavacalculator; + +import static java.lang.Double.NaN; + +public class TanCalc implements Calculator { + + public double calculate(Buffer buffer) { + + if (buffer.num1 == 0 || buffer.num1 % 180 == 0) { + return 0.0; + } + + if (buffer.num1 % 90 == 0 && buffer.num1 % 180 != 0) { + return NaN; + } + + return Math.tan(Math.toRadians(buffer.num1)); + } +} diff --git a/src/simplejavacalculator/UI.java b/src/simplejavacalculator/UI.java index 087bfb1..a94803b 100644 --- a/src/simplejavacalculator/UI.java +++ b/src/simplejavacalculator/UI.java @@ -17,11 +17,9 @@ */ package simplejavacalculator; - import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; - import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; @@ -29,311 +27,189 @@ import java.awt.Font; import javax.swing.Box; import javax.swing.BoxLayout; - -import java.awt.Image; import javax.swing.ImageIcon; import java.io.*; +import java.util.HashMap; +import java.util.Map; public class UI implements ActionListener { + + private final JFrame frame; + private final JPanel panel, panelSub1, panelSub2, panelSub3, panelSub4, panelSub5, + panelSub6, panelSub7, panelSub8; + private final JTextArea text; + private final JButton butZero, butOne, butTwo, butThree, butFour, butFive, butSix, + butSeven, butEight, butNine, + butAdd, butMinus, butMultiply, butDivide, + butEqual, butCancel, butSquareRoot, butSquare, butOneDividedBy, + butCos, butSin, butTan, butxpowerofy, butlog, butrate, butabs, + butBinary, butln; + private final Font font; + private final Font textFont; + private ImageIcon image; + private BufferedImageCustom imageReturn; - private final JFrame frame; - - private final JPanel panel; - private final JPanel panelSub1; - private final JPanel panelSub2; - private final JPanel panelSub3; - private final JPanel panelSub4; - private final JPanel panelSub5; - private final JPanel panelSub6; - private final JPanel panelSub7; - private final JPanel panelSub8; - - private final JTextArea text; - - private final JButton but[], butAdd, butMinus, butMultiply, butDivide, - butEqual, butCancel, butSquareRoot, butSquare, butOneDividedBy, - butCos, butSin, butTan, butxpowerofy, butlog, butrate, butabs, butBinary, butln; - private final Calculator calc; + public Map ButtonCommandMap = new HashMap(); + public Map ButtonLabelMap = new HashMap(); + public Map ButtonCalcMap = new HashMap(); + + public Buffer buffer = new Buffer(); - private final String[] buttonValue = {"0", "1", "2", "3", "4", "5", "6", - "7", "8", "9"}; + //CONSTRUCTOR + public UI() throws IOException { + + frame = new JFrame("Calculator PH"); + imageReturn = new BufferedImageCustom(); + image = new ImageIcon(imageReturn.imageReturn()); + + panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panelSub1 = new JPanel(new FlowLayout()); + panelSub2 = new JPanel(new FlowLayout()); + panelSub3 = new JPanel(new FlowLayout()); + panelSub4 = new JPanel(new FlowLayout()); + panelSub5 = new JPanel(new FlowLayout()); + panelSub6 = new JPanel(new FlowLayout()); + panelSub7 = new JPanel(new FlowLayout()); + panelSub8 = new JPanel(new FlowLayout()); + + font = new Font("Consolas",Font.PLAIN, 18); + text = new JTextArea(1, 30); + textFont = new Font("Consolas",Font.BOLD, 24); + + //MAPPED ACTION BUTTONS: + butZero = newJButton_map_variable("0", new NumberCommand(), null); + butOne = newJButton_map_variable("1", new NumberCommand(), null); + butTwo = newJButton_map_variable("2", new NumberCommand(), null); + butThree = newJButton_map_variable("3", new NumberCommand(), null); + butFour = newJButton_map_variable("4", new NumberCommand(), null); + butFive = newJButton_map_variable("5", new NumberCommand(), null); + butSix = newJButton_map_variable("6", new NumberCommand(), null); + butSeven = newJButton_map_variable("7", new NumberCommand(), null); + butEight = newJButton_map_variable("8", new NumberCommand(), null); + butNine = newJButton_map_variable("9", new NumberCommand(), null); + butAdd = newJButton_map_variable("+", new BinaryCommand(), new AddCalc()); + butMinus = newJButton_map_variable("-", new BinaryCommand(), new MinusCalc()); + butMultiply = newJButton_map_variable("*", new BinaryCommand(), new MultiplyCalc()); + butDivide = newJButton_map_variable("/", new BinaryCommand(), new DivideCalc()); + butEqual = newJButton_map_variable("=", new EqualCommand(), null); + butSquareRoot = newJButton_map_variable("sqrt", new UnaryCommand(), new SquareRootCalc()); + butSquare = newJButton_map_variable("x*x", new UnaryCommand(), new SquareCalc()); + butOneDividedBy = newJButton_map_variable("1/x", new UnaryCommand(), new OneDivideByCalc()); + butCos = newJButton_map_variable("Cos", new UnaryCommand(), new CosCalc()); + butSin = newJButton_map_variable("Sin", new UnaryCommand(), new SinCalc()); + butTan = newJButton_map_variable("Tan", new UnaryCommand(), new TanCalc()); + butln = newJButton_map_variable("ln", new UnaryCommand(), new LnCalc()); + butxpowerofy = newJButton_map_variable("x^y", new UnaryCommand(), new XpowerofyCalc()); + butlog = newJButton_map_variable("log10(x)", new UnaryCommand(), new LogCalc()); + butrate = newJButton_map_variable("x%", new UnaryCommand(), new RateCalc()); + butabs = newJButton_map_variable("abs(x)", new UnaryCommand(), new AbsCalc()); + butCancel = newJButton_map_variable("C", new ClearCommand(), null); + butBinary = newJButton_map_variable("Bin", null, null); + + this.emplace_widgets(); // Discussion ?? + } - - private final Font font; - private final Font textFont; - private ImageIcon image; - private BufferedImageCustom imageReturn; + //MAPPER: + private JButton newJButton_map_variable(String label, Command op, Calculator calc) + { + JButton button = new JButton(label); + + ButtonCommandMap.put(button, op); + ButtonLabelMap.put(button, label); + ButtonCalcMap.put(button, calc); + + button.setFont(font); + button.addActionListener(this); + + return button; + } - public UI() throws IOException { - frame = new JFrame("Calculator PH"); - - imageReturn = new BufferedImageCustom(); - image = new ImageIcon(imageReturn.imageReturn()); - - panel = new JPanel(); - panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); - panelSub1 = new JPanel(new FlowLayout()); - panelSub2 = new JPanel(new FlowLayout()); - panelSub3 = new JPanel(new FlowLayout()); - panelSub4 = new JPanel(new FlowLayout()); - panelSub5 = new JPanel(new FlowLayout()); - panelSub6 = new JPanel(new FlowLayout()); - panelSub7 = new JPanel(new FlowLayout()); - panelSub8 = new JPanel(new FlowLayout()); - - font = new Font("Consolas",Font.PLAIN, 18); - - text = new JTextArea(1, 30); - - textFont = new Font("Consolas",Font.BOLD, 24); - - but = new JButton[10]; - for (int i = 0; i < 10; i++) { - but[i] = new JButton(String.valueOf(i)); - } - butAdd = new JButton("+"); - butMinus = new JButton("-"); - butMultiply = new JButton("*"); - butDivide = new JButton("/"); - butEqual = new JButton("="); - butSquareRoot = new JButton("sqrt"); - butSquare = new JButton("x*x"); - butOneDividedBy = new JButton("1/x"); - butCos = new JButton("Cos"); - butSin = new JButton("Sin"); - butTan = new JButton("Tan"); - butln = new JButton("ln"); - butxpowerofy = new JButton("x^y"); - butlog = new JButton("log10(x)"); - butrate = new JButton("x%"); - butabs = new JButton("abs(x)"); - butCancel = new JButton("C"); - butBinary = new JButton("Bin"); - - calc = new Calculator(); - + //J-TEXT-AREA METHODS: + private void parsetoBinary() { + try { + text.setText("" + Long.toBinaryString(Long.parseLong(text.getText()))); + } catch (NumberFormatException ex) { + System.err.println("Error while parse to binary." + ex.toString()); + } } - public void init() { - frame.setSize(450, 450); - frame.setLocationRelativeTo(null); - frame.setResizable(false); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setIconImage(image.getImage()); - - text.setFont(textFont); - text.setEditable(false); - - for (int i = 0; i < 10; i++) { - but[i].setFont(font); - } - butAdd.setFont(font); - butMinus.setFont(font); - butMultiply.setFont(font); - butDivide.setFont(font); - butEqual.setFont(font); - butSquareRoot.setFont(font); - butSquare.setFont(font); - butOneDividedBy.setFont(font); - butCos.setFont(font); - butSin.setFont(font); - butTan.setFont(font); - butln.setFont(font); - butxpowerofy.setFont(font); - butlog.setFont(font); - butrate.setFont(font); - butabs.setFont(font); - butCancel.setFont(font); - butBinary.setFont(font); - - panel.add(Box.createHorizontalStrut(100)); - panelSub1.add(text); - panel.add(panelSub1); - - panelSub2.add(but[1]); - panelSub2.add(but[2]); - panelSub2.add(but[3]); - panelSub2.add(Box.createHorizontalStrut(15)); - panelSub2.add(butAdd); - panelSub2.add(butMinus); - panel.add(panelSub2); - - panelSub3.add(but[4]); - panelSub3.add(but[5]); - panelSub3.add(but[6]); - panelSub3.add(Box.createHorizontalStrut(15)); - panelSub3.add(butMultiply); - panelSub3.add(butDivide); - panel.add(panelSub3); - - panelSub4.add(but[7]); - panelSub4.add(but[8]); - panelSub4.add(but[9]); - panelSub4.add(Box.createHorizontalStrut(15)); - panelSub4.add(butEqual); - panelSub4.add(butCancel); - panel.add(panelSub4); - - panelSub5.add(Box.createHorizontalStrut(92)); - panelSub5.add(but[0]); - panelSub5.add(butln); - panelSub5.add(Box.createHorizontalStrut(210)); - panel.add(panelSub5); - - panelSub6.add(butSquare); - panelSub6.add(butSquareRoot); - panelSub6.add(butOneDividedBy); - panelSub6.add(butxpowerofy); - panel.add(panelSub6); - - panelSub7.add(butCos); - panelSub7.add(butSin); - panelSub7.add(butTan); - panel.add(panelSub7); - - panelSub8.add(butlog); - panelSub8.add(butrate); - panelSub8.add(butabs); - panelSub8.add(butBinary); - panel.add(panelSub8); - - for (int i = 0; i < 10; i++) { - but[i].addActionListener(this); - } - butAdd.addActionListener(this); - butMinus.addActionListener(this); - butMultiply.addActionListener(this); - butDivide.addActionListener(this); - butSquare.addActionListener(this); - butSquareRoot.addActionListener(this); - butOneDividedBy.addActionListener(this); - butCos.addActionListener(this); - butSin.addActionListener(this); - butTan.addActionListener(this); - butln.addActionListener(this); - butxpowerofy.addActionListener(this); - butlog.addActionListener(this); - butrate.addActionListener(this); - butabs.addActionListener(this); - butBinary.addActionListener(this); - - butEqual.addActionListener(this); - butCancel.addActionListener(this); - - frame.add(panel); - frame.setVisible(true); + public void emplace_widgets() { + frame.setSize(450, 450); + frame.setLocationRelativeTo(null); + frame.setResizable(false); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setIconImage(image.getImage()); + text.setFont(textFont); + text.setEditable(false); + + panel.add(Box.createHorizontalStrut(100)); + panelSub1.add(text); + panel.add(panelSub1); + + panelSub2.add(butOne); + panelSub2.add(butTwo); + panelSub2.add(butThree); + panelSub2.add(Box.createHorizontalStrut(15)); + panelSub2.add(butAdd); + panelSub2.add(butMinus); + panel.add(panelSub2); + + panelSub3.add(butFour); + panelSub3.add(butFive); + panelSub3.add(butSix); + panelSub3.add(Box.createHorizontalStrut(15)); + panelSub3.add(butMultiply); + panelSub3.add(butDivide); + panel.add(panelSub3); + + panelSub4.add(butSeven); + panelSub4.add(butEight); + panelSub4.add(butNine); + panelSub4.add(Box.createHorizontalStrut(15)); + panelSub4.add(butEqual); + panelSub4.add(butCancel); + panel.add(panelSub4); + + panelSub5.add(Box.createHorizontalStrut(92)); + panelSub5.add(butZero); + panelSub5.add(butln); + panelSub5.add(Box.createHorizontalStrut(210)); + panel.add(panelSub5); + + panelSub6.add(butSquare); + panelSub6.add(butSquareRoot); + panelSub6.add(butOneDividedBy); + panelSub6.add(butxpowerofy); + panel.add(panelSub6); + + panelSub7.add(butCos); + panelSub7.add(butSin); + panelSub7.add(butTan); + panel.add(panelSub7); + + panelSub8.add(butlog); + panelSub8.add(butrate); + panelSub8.add(butabs); + panelSub8.add(butBinary); + panel.add(panelSub8); + + frame.add(panel); + frame.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { - final Object source = e.getSource(); - Double checkNum = null; - - for (int i = 0; i < 10; i++) { - if (source == but[i]) { - text.replaceSelection(buttonValue[i]); - return; - } - } - - - try { - checkNum = Double.parseDouble(text.getText()); - } catch(NumberFormatException k) { - - } - - if (checkNum != null || source == butCancel) { - if (source == butAdd) { - writer(calc.calculateBi(Calculator.BiOperatorModes.add, reader())); - text.replaceSelection(butAdd.getText()); - } - - if (source == butMinus) { - writer(calc.calculateBi(Calculator.BiOperatorModes.minus, reader())); - text.replaceSelection(butMinus.getText()); - } - - if (source == butMultiply) { - writer(calc.calculateBi(Calculator.BiOperatorModes.multiply, reader())); - text.replaceSelection(butMultiply.getText()); - } - - if (source == butDivide) { - writer(calc.calculateBi(Calculator.BiOperatorModes.divide, reader())); - text.replaceSelection(butDivide.getText()); - } - - if (source == butxpowerofy) { - writer(calc.calculateBi(Calculator.BiOperatorModes.xpowerofy, reader())); - } - - if (source == butSquare) { - writer(calc.calculateMono(Calculator.MonoOperatorModes.square, reader())); - } - - if (source == butSquareRoot) - writer(calc.calculateMono(Calculator.MonoOperatorModes.squareRoot, reader())); - - if (source == butOneDividedBy) - writer(calc.calculateMono(Calculator.MonoOperatorModes.oneDividedBy, reader())); - - if (source == butCos) - writer(calc.calculateMono(Calculator.MonoOperatorModes.cos, reader())); - - if (source == butSin) - writer(calc.calculateMono(Calculator.MonoOperatorModes.sin, reader())); + final Object button = e.getSource(); + String label = (ButtonLabelMap.get(button)); + Command cm = (ButtonCommandMap.get(button)); + Calculator calc = (ButtonCalcMap.get(button)); - if (source == butTan) - writer(calc.calculateMono(Calculator.MonoOperatorModes.tan, reader())); + + Command.writer(Double.NaN, text); // CLEAR SCREEN IN EVERY ACTION - if (source == butlog) - writer(calc.calculateMono(Calculator.MonoOperatorModes.log, reader())); - - if (source == butln) - writer(calc.calculateMono(Calculator.MonoOperatorModes.ln, reader())); - - if (source == butrate) - writer(calc.calculateMono(Calculator.MonoOperatorModes.rate, reader())); - - if (source == butabs) - writer(calc.calculateMono(Calculator.MonoOperatorModes.abs, reader())); - - if (source == butEqual) - writer(calc.calculateEqual(reader())); - - if (source == butCancel) - writer(calc.reset()); - - if (source == butBinary) - parsetoBinary(); - } - - text.selectAll(); - } - - private void parsetoBinary() { - try { - text.setText("" + Long.toBinaryString(Long.parseLong(text.getText()))); - } catch (NumberFormatException ex) { - System.err.println("Error while parse to binary." + ex.toString()); - } - } - - public Double reader() { - Double num; - String str; - str = text.getText(); - num = Double.valueOf(str); - - return num; - } - - public void writer(final Double num) { - if (Double.isNaN(num)) { - text.setText(""); - } else { - text.setText(Double.toString(num)); - } + cm.execute(buffer, label); // POLYMORPHIC EXECUTE COMMAND + + cm.show(text, buffer, calc, label); // POLYMORPHIC SHOW COMMAND } -} +} \ No newline at end of file diff --git a/src/simplejavacalculator/UnaryCommand.java b/src/simplejavacalculator/UnaryCommand.java new file mode 100644 index 0000000..ba91b99 --- /dev/null +++ b/src/simplejavacalculator/UnaryCommand.java @@ -0,0 +1,20 @@ +package simplejavacalculator; + +import javax.swing.JTextArea; + +import simplejavacalculator.Buffer.PreviouslyPressed; + +public class UnaryCommand extends Command { + + public void execute(Buffer buffer, String label) { + this.sub = CommandSubtype.COM_UNARY; + Buffer.pp = PreviouslyPressed.PRESSED_UNARY; + } + + public void show(JTextArea text, Buffer buffer, Calculator calc, String label) { + if (calc != null) { + buffer.num1 = calc.calculate(buffer); + writer(buffer.num1, text); + } + } +} diff --git a/src/simplejavacalculator/XpowerofyCalc.java b/src/simplejavacalculator/XpowerofyCalc.java new file mode 100644 index 0000000..7118a41 --- /dev/null +++ b/src/simplejavacalculator/XpowerofyCalc.java @@ -0,0 +1,8 @@ +package simplejavacalculator; +import static java.lang.Math.pow; + +public class XpowerofyCalc implements Calculator { + public double calculate(Buffer buffer) { + return pow(buffer.num1, buffer.num2); + } +} \ No newline at end of file