From bbd59fa8d6d71ea3010728dc79e5da517de9a9c9 Mon Sep 17 00:00:00 2001 From: sultanax100 Date: Sun, 28 Sep 2025 12:00:06 +0300 Subject: [PATCH 01/16] singleton --- src/Calc/Calculator.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/Calc/Calculator.java b/src/Calc/Calculator.java index 7e2a37c..d5196d1 100644 --- a/src/Calc/Calculator.java +++ b/src/Calc/Calculator.java @@ -3,6 +3,7 @@ import java.awt.Color; import java.awt.event.*; import javax.swing.JButton; +import java.beans.Beans; /** * @@ -15,8 +16,26 @@ public final class Calculator extends javax.swing.JFrame { private String operation; private int x, y; + + // --- Singleton --- + private static Calculator INSTANCE; + + public static Calculator getInstance() { + if (INSTANCE == null) { + INSTANCE = new Calculator(); + } + return INSTANCE; + } public Calculator() { + + if (INSTANCE != null && !Beans.isDesignTime()) { + throw new IllegalStateException("Use Calculator.getInstance()"); + } + if (INSTANCE == null) { + INSTANCE = this; + } + initComponents(); getContentPane().setSize(400, 700); this.clear(); From 314ab90a6e39d597b7fee5b623a1352be94c7382 Mon Sep 17 00:00:00 2001 From: sultanax100 Date: Sun, 28 Sep 2025 22:58:59 +0300 Subject: [PATCH 02/16] singleton and factorial --- src/Calc/App.java | 6 ++++-- src/Calc/Calculator.java | 44 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/Calc/App.java b/src/Calc/App.java index 4101058..dc15a1d 100644 --- a/src/Calc/App.java +++ b/src/Calc/App.java @@ -7,8 +7,10 @@ public class App { - public static void main(String[] args) { - new Calculator().setVisible(true); + public static void main(String[] args) { + //deleting this line to test the singleton --> new Calculator().setVisible(true); + //testing the sigelton + Calculator.getInstance().setVisible(true); } } diff --git a/src/Calc/Calculator.java b/src/Calc/Calculator.java index d5196d1..bec9da6 100644 --- a/src/Calc/Calculator.java +++ b/src/Calc/Calculator.java @@ -17,7 +17,7 @@ public final class Calculator extends javax.swing.JFrame { private int x, y; - // --- Singleton --- + // --- Singleton Method --- private static Calculator INSTANCE; public static Calculator getInstance() { @@ -26,6 +26,29 @@ public static Calculator getInstance() { } return INSTANCE; } + + // --- Factory Method --- +@FunctionalInterface +private interface Operation {double apply(double a, double b); +} + +private Operation makeOperation(String symbol) { + switch (symbol) { + case "+" -> { + return (a, b) -> a + b; + } + case "-" -> { + return (a, b) -> a - b; + } + case "×", "*" -> { + return (a, b) -> a * b; + } + case "÷", "/" -> { + return (a, b) -> (b == 0) ? Double.NaN : a / b; + } + default -> throw new IllegalArgumentException("Unknown operation: " + symbol); + } +} public Calculator() { @@ -138,7 +161,9 @@ public void compute() { if (Float.isNaN(curr) || Float.isNaN(prev)) { return; } - + + //deleting the switch + /*.. switch (this.operation) { case "+" -> computation = prev + curr; @@ -158,6 +183,21 @@ public void compute() { return; } } +..*/ + + try { + if (("÷".equals(this.operation) || "/".equals(this.operation)) && curr == 0f) { + this.clear(); + this.currentOperand = "Error"; + return; + } + + Operation op = makeOperation(this.operation); + computation = (float) op.apply(prev, curr); + } catch (IllegalArgumentException ex) { + return; + } + this.currentOperand = (computation - (int) computation) != 0 ? Float.toString(computation) : Integer.toString((int) computation); this.previousOperand = ""; From 0699874870eb5b682cfedcf917aa5152eee5f7f1 Mon Sep 17 00:00:00 2001 From: sultanax100 Date: Mon, 29 Sep 2025 22:57:22 +0300 Subject: [PATCH 03/16] singleton and factorial --- src/Calc/App.java | 7 ++- src/Calc/Calculator.java | 99 +++++++++++++++++++++------------------- 2 files changed, 57 insertions(+), 49 deletions(-) diff --git a/src/Calc/App.java b/src/Calc/App.java index dc15a1d..75f9a61 100644 --- a/src/Calc/App.java +++ b/src/Calc/App.java @@ -10,7 +10,12 @@ public class App { public static void main(String[] args) { //deleting this line to test the singleton --> new Calculator().setVisible(true); //testing the sigelton - Calculator.getInstance().setVisible(true); + javax.swing.SwingUtilities.invokeLater(() -> { + Calculator calculator1 = Calculator.getInstance(); + Calculator calculator2 = Calculator.getInstance(); + System.out.println("same instance? " + (calculator1 == calculator2)); + calculator1.setVisible(true); + }); } } diff --git a/src/Calc/Calculator.java b/src/Calc/Calculator.java index bec9da6..a8561d8 100644 --- a/src/Calc/Calculator.java +++ b/src/Calc/Calculator.java @@ -3,7 +3,6 @@ import java.awt.Color; import java.awt.event.*; import javax.swing.JButton; -import java.beans.Beans; /** * @@ -14,7 +13,6 @@ public final class Calculator extends javax.swing.JFrame { private String currentOperand; private String previousOperand; private String operation; - private int x, y; // --- Singleton Method --- @@ -28,37 +26,48 @@ public static Calculator getInstance() { } // --- Factory Method --- -@FunctionalInterface -private interface Operation {double apply(double a, double b); + private interface Operation { float apply(float a, float b); } + + private static class AddOperation implements Operation { + @Override + public float apply(float a,float b){ + return a+b;} } -private Operation makeOperation(String symbol) { - switch (symbol) { - case "+" -> { - return (a, b) -> a + b; - } - case "-" -> { - return (a, b) -> a - b; - } - case "×", "*" -> { - return (a, b) -> a * b; - } - case "÷", "/" -> { - return (a, b) -> (b == 0) ? Double.NaN : a / b; + private static class SubOperation implements Operation { + @Override + public float apply(float a,float b){ + return a-b;} + } + + private static class MultOperation implements Operation { + @Override + public float apply(float a,float b){ + return a*b;} + } + + private static class DivOperation implements Operation { + @Override + public float apply(float a,float b){ + if (b == 0f) { + throw new ArithmeticException("Error! Division by zero is not accepted"); } - default -> throw new IllegalArgumentException("Unknown operation: " + symbol); + return a/b;} } -} - public Calculator() { - - if (INSTANCE != null && !Beans.isDesignTime()) { - throw new IllegalStateException("Use Calculator.getInstance()"); - } - if (INSTANCE == null) { - INSTANCE = this; + private static class OperationFactory { + static Operation getOperation(String op) { + switch (op) { + case "+": return new AddOperation(); + case "-": return new SubOperation(); + case "×": return new MultOperation(); + case "÷": return new DivOperation(); + default: throw new IllegalArgumentException("Unknown operation: " + op); + } } - + } + + private Calculator() { initComponents(); getContentPane().setSize(400, 700); this.clear(); @@ -151,18 +160,12 @@ public void chooseOperation(String operation) { } public void compute() { - float computation; + if (this.currentOperand.equals("") || this.previousOperand.equals("")) { return; } - - float curr = Float.parseFloat(this.currentOperand); - float prev = Float.parseFloat(this.previousOperand); - if (Float.isNaN(curr) || Float.isNaN(prev)) { - return; - } - //deleting the switch + //deleting the switch, we already have the operation interface /*.. switch (this.operation) { case "+" -> @@ -184,22 +187,22 @@ public void compute() { } } ..*/ - try { - if (("÷".equals(this.operation) || "/".equals(this.operation)) && curr == 0f) { - this.clear(); - this.currentOperand = "Error"; - return; - } - - Operation op = makeOperation(this.operation); - computation = (float) op.apply(prev, curr); - } catch (IllegalArgumentException ex) { + float curr = Float.parseFloat(this.currentOperand); + float prev = Float.parseFloat(this.previousOperand); + Operation op = OperationFactory.getOperation(this.operation); + float result = op.apply(prev, curr); + + this.currentOperand = (result - (int) result ) != 0 + ? Float.toString(result ) + : Integer.toString((int) result ); + + } catch (IllegalArgumentException | ArithmeticException ex) { + this.clear(); + this.currentOperand = "Error"; return; } - - - this.currentOperand = (computation - (int) computation) != 0 ? Float.toString(computation) : Integer.toString((int) computation); + this.previousOperand = ""; this.operation = ""; } From b43b5ca7d502904a88bc7c32a6e637db526a1ccb Mon Sep 17 00:00:00 2001 From: Leen Alghamdi Date: Wed, 5 Nov 2025 01:18:02 +0300 Subject: [PATCH 04/16] add the facade pattern class and the decorator --- src/Calc/CalculatorFacade.java | 46 ++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/Calc/CalculatorFacade.java diff --git a/src/Calc/CalculatorFacade.java b/src/Calc/CalculatorFacade.java new file mode 100644 index 0000000..2672add --- /dev/null +++ b/src/Calc/CalculatorFacade.java @@ -0,0 +1,46 @@ +package Calc; + +// Facade Pattern: Interface بسيطة للتحكم بحسابات الآلة فقط (بدون GUI) +public class CalculatorFacade { + + private final Calculator calculator; + + public CalculatorFacade() { + this.calculator = Calculator.getInstance(); // نستخدم Singleton + } + + // إدخال رقم أو نقطة + public void enterNumber(String number) { + calculator.appendNumber(number); + } + + // اختيار عملية (+, -, ×, ÷) + public void chooseOperation(String operation) { + calculator.chooseOperation(operation); + } + + // = (تنفيذ العملية وعرض الناتج) + public void calculate() { + calculator.compute(); + calculator.updateDisplay(); + } + + // C (مسح كل شيء) + public void clear() { + calculator.clear(); + } + + // نقرأ الرقم الظاهر حالياً + public String getCurrentDisplay() { + return calculator.getCurrentOperand(); // لازم نضيف getter بسيط إذا غير موجود + } + + // نقرأ الرقم السابق والعملية (مثلاً "5 +") + public String getPreviousDisplay() { + return calculator.getPreviousOperand(); // Getter بسيط أيضاً + } + // نعرض النافذة لو بغينا GUI (ما يمس الواجهة) + public void showUI() { + calculator.setVisible(true); + } +} From 9c5adc39a1177d1c9fbb27d4e1d355027e3b448d Mon Sep 17 00:00:00 2001 From: Leen Alghamdi Date: Wed, 5 Nov 2025 01:21:36 +0300 Subject: [PATCH 05/16] add the facade pattern class and the decorator calculator.java --- src/Calc/Calculator.java | 100 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/src/Calc/Calculator.java b/src/Calc/Calculator.java index a8561d8..476c7e9 100644 --- a/src/Calc/Calculator.java +++ b/src/Calc/Calculator.java @@ -27,6 +27,74 @@ public static Calculator getInstance() { // --- Factory Method --- private interface Operation { float apply(float a, float b); } + + + + + + + // --- Decorator Pattern (History) --- + +// 1) Abstract Decorator +private abstract static class OperationDecorator implements Operation { + protected Operation decoratedOperation; + + public OperationDecorator(Operation decoratedOperation) { + this.decoratedOperation = decoratedOperation; + } + + @Override + public float apply(float a, float b) { + return decoratedOperation.apply(a, b); + } +} + +// 2) Concrete Decorator - History +private static class HistoryOperation extends OperationDecorator { + + private static final java.util.List history = new java.util.ArrayList<>(); + + public HistoryOperation(Operation decoratedOperation) { + super(decoratedOperation); + } + + @Override + public float apply(float a, float b) { + float result = super.apply(a, b); + history.add(a + " " + getSymbol(decoratedOperation) + " " + b + " = " + result); + return result; + } + + private String getSymbol(Operation op) { + if (op instanceof AddOperation) return "+"; + if (op instanceof SubOperation) return "-"; + if (op instanceof MultOperation) return "×"; + if (op instanceof DivOperation) return "÷"; + return "?"; + } + + public static java.util.List getHistory() { + return history; + } +} + + + + + +// Getters needed for Facade +public String getCurrentOperand() { + return currentOperand; +} + +public String getPreviousOperand() { + return previousOperand; +} + + + + + private static class AddOperation implements Operation { @Override @@ -191,6 +259,21 @@ public void compute() { float curr = Float.parseFloat(this.currentOperand); float prev = Float.parseFloat(this.previousOperand); Operation op = OperationFactory.getOperation(this.operation); + + + + + + // نغلف العملية بالـ History Decorator + op = new HistoryOperation(op); + + + + + + + + float result = op.apply(prev, curr); this.currentOperand = (result - (int) result ) != 0 @@ -672,6 +755,23 @@ private void btnDivActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST: private void btnEqualActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEqualActionPerformed this.compute(); this.updateDisplay(); + + + + + System.out.println("---- History ----"); +for (String h : HistoryOperation.getHistory()) { + System.out.println(h); +} + + + + + + + + + if (this.currentOperand.equals("Error")) this.currentOperand = ""; }//GEN-LAST:event_btnEqualActionPerformed From 5ed564aa7106318db257624159430822cc7c2d88 Mon Sep 17 00:00:00 2001 From: Leen Alghamdi Date: Wed, 5 Nov 2025 01:22:09 +0300 Subject: [PATCH 06/16] add the facade pattern class and the decorator app.java --- src/Calc/App.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Calc/App.java b/src/Calc/App.java index 75f9a61..053537f 100644 --- a/src/Calc/App.java +++ b/src/Calc/App.java @@ -8,13 +8,16 @@ public class App { public static void main(String[] args) { - //deleting this line to test the singleton --> new Calculator().setVisible(true); - //testing the sigelton javax.swing.SwingUtilities.invokeLater(() -> { + + // اختبار الـ Singleton Calculator calculator1 = Calculator.getInstance(); Calculator calculator2 = Calculator.getInstance(); System.out.println("same instance? " + (calculator1 == calculator2)); - calculator1.setVisible(true); + + // بدل ما نستخدم calculator1.setVisible → نستخدم Facade + CalculatorFacade calc = new CalculatorFacade(); + calc.showUI(); // هذا يعرض الواجهة }); } From 2aacff7c57e08cbb7fb0fc66547067a160675244 Mon Sep 17 00:00:00 2001 From: Leen Alghamdi Date: Wed, 5 Nov 2025 15:29:43 +0300 Subject: [PATCH 07/16] rollback --- src/Calc/App.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Calc/App.java b/src/Calc/App.java index 053537f..598c9ac 100644 --- a/src/Calc/App.java +++ b/src/Calc/App.java @@ -15,9 +15,8 @@ public static void main(String[] args) { Calculator calculator2 = Calculator.getInstance(); System.out.println("same instance? " + (calculator1 == calculator2)); - // بدل ما نستخدم calculator1.setVisible → نستخدم Facade - CalculatorFacade calc = new CalculatorFacade(); - calc.showUI(); // هذا يعرض الواجهة + calculator1.setVisible(true); + }); } From 632d8914579da412744139d458d2dea480d0f1d3 Mon Sep 17 00:00:00 2001 From: Leen Alghamdi Date: Wed, 5 Nov 2025 15:29:59 +0300 Subject: [PATCH 08/16] rollback2 --- src/Calc/Calculator.java | 48 ++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/src/Calc/Calculator.java b/src/Calc/Calculator.java index 476c7e9..749ef06 100644 --- a/src/Calc/Calculator.java +++ b/src/Calc/Calculator.java @@ -26,7 +26,9 @@ public static Calculator getInstance() { } // --- Factory Method --- - private interface Operation { float apply(float a, float b); } + private interface Operation { + float apply(float a, float b); + } @@ -65,37 +67,19 @@ public float apply(float a, float b) { return result; } - private String getSymbol(Operation op) { - if (op instanceof AddOperation) return "+"; - if (op instanceof SubOperation) return "-"; - if (op instanceof MultOperation) return "×"; - if (op instanceof DivOperation) return "÷"; - return "?"; - } +private String getSymbol(Operation op) { + if (op instanceof AddOperation) return "+"; + if (op instanceof SubOperation) return "-"; + if (op instanceof MultOperation) return "×"; + if (op instanceof DivOperation) return "÷"; + return "?"; +} public static java.util.List getHistory() { return history; } } - - - - -// Getters needed for Facade -public String getCurrentOperand() { - return currentOperand; -} - -public String getPreviousOperand() { - return previousOperand; -} - - - - - - private static class AddOperation implements Operation { @Override public float apply(float a,float b){ @@ -135,12 +119,12 @@ static Operation getOperation(String op) { } } - private Calculator() { - initComponents(); +private Calculator() { + initComponents(); getContentPane().setSize(400, 700); - this.clear(); - this.addEvents(); - } + this.clear(); + this.addEvents(); +} public void addEvents() { JButton[] btns = { @@ -180,7 +164,7 @@ public void mouseExited(MouseEvent e) { } }); } - } + } public void clear() { this.currentOperand = ""; From d1077577336e8da3e866247c23bd29fe31674ec3 Mon Sep 17 00:00:00 2001 From: Leen Alghamdi Date: Wed, 5 Nov 2025 17:02:15 +0300 Subject: [PATCH 09/16] the facade pattern again --- src/Calc/App.java | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/Calc/App.java b/src/Calc/App.java index 598c9ac..a2cd664 100644 --- a/src/Calc/App.java +++ b/src/Calc/App.java @@ -1,23 +1,18 @@ package Calc; -/** - * - * @author youcefhmd - */ - public class App { - - public static void main(String[] args) { + public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(() -> { - // اختبار الـ Singleton - Calculator calculator1 = Calculator.getInstance(); - Calculator calculator2 = Calculator.getInstance(); - System.out.println("same instance? " + (calculator1 == calculator2)); + CalculatorFacade calcFacade = new CalculatorFacade(); - calculator1.setVisible(true); + // بدل ما نستدعي Calculator مباشرة: + calcFacade.showCalculator(); + // مثال تشغيل: + float result = calcFacade.performOperation("+", 5, 3); + System.out.println("Result = " + result); }); } - } + From 2d3ae729212dcedc84335b5433732b1c8b309b18 Mon Sep 17 00:00:00 2001 From: Leen Alghamdi Date: Wed, 5 Nov 2025 17:02:25 +0300 Subject: [PATCH 10/16] the facade pattern again2 --- src/Calc/Calculator.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Calc/Calculator.java b/src/Calc/Calculator.java index 749ef06..e04df33 100644 --- a/src/Calc/Calculator.java +++ b/src/Calc/Calculator.java @@ -26,7 +26,7 @@ public static Calculator getInstance() { } // --- Factory Method --- - private interface Operation { + public interface Operation { float apply(float a, float b); } @@ -52,7 +52,7 @@ public float apply(float a, float b) { } // 2) Concrete Decorator - History -private static class HistoryOperation extends OperationDecorator { +public static class HistoryOperation extends OperationDecorator { private static final java.util.List history = new java.util.ArrayList<>(); @@ -80,6 +80,7 @@ public static java.util.List getHistory() { } } + private static class AddOperation implements Operation { @Override public float apply(float a,float b){ @@ -107,7 +108,7 @@ public float apply(float a,float b){ return a/b;} } - private static class OperationFactory { + public static class OperationFactory { static Operation getOperation(String op) { switch (op) { case "+": return new AddOperation(); From dda6df296355a50fb27b790cc34a70f92c36e024 Mon Sep 17 00:00:00 2001 From: Leen Alghamdi Date: Wed, 5 Nov 2025 17:02:35 +0300 Subject: [PATCH 11/16] the facade pattern again3 --- src/Calc/CalculatorFacade.java | 46 +++++++++++++--------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/src/Calc/CalculatorFacade.java b/src/Calc/CalculatorFacade.java index 2672add..027afd8 100644 --- a/src/Calc/CalculatorFacade.java +++ b/src/Calc/CalculatorFacade.java @@ -1,46 +1,34 @@ package Calc; -// Facade Pattern: Interface بسيطة للتحكم بحسابات الآلة فقط (بدون GUI) public class CalculatorFacade { - private final Calculator calculator; + private Calculator calculator; public CalculatorFacade() { - this.calculator = Calculator.getInstance(); // نستخدم Singleton + calculator = Calculator.getInstance(); // Singleton } - // إدخال رقم أو نقطة - public void enterNumber(String number) { - calculator.appendNumber(number); - } - - // اختيار عملية (+, -, ×, ÷) - public void chooseOperation(String operation) { - calculator.chooseOperation(operation); + // تفتح واجهة الآلة الحاسبة + public void showCalculator() { + calculator.setVisible(true); } - // = (تنفيذ العملية وعرض الناتج) - public void calculate() { - calculator.compute(); - calculator.updateDisplay(); + // تنفّذ عملية رياضية وتُرجع الناتج + public float performOperation(String operation, float a, float b) { + Calculator.Operation op = Calculator.OperationFactory.getOperation(operation); + if (op == null) { + throw new IllegalArgumentException("Invalid operation: " + operation); + } + return op.apply(a, b); } - // C (مسح كل شيء) - public void clear() { + // تمسح كل شي من الشاشة (Clear) + public void clearCalculator() { calculator.clear(); } - // نقرأ الرقم الظاهر حالياً - public String getCurrentDisplay() { - return calculator.getCurrentOperand(); // لازم نضيف getter بسيط إذا غير موجود - } - - // نقرأ الرقم السابق والعملية (مثلاً "5 +") - public String getPreviousDisplay() { - return calculator.getPreviousOperand(); // Getter بسيط أيضاً - } - // نعرض النافذة لو بغينا GUI (ما يمس الواجهة) - public void showUI() { - calculator.setVisible(true); + // تعرض الـ History (من Decorator) + public java.util.List getHistory() { + return Calculator.HistoryOperation.getHistory(); } } From 6be6e0fa843e43a0904313dcd304f196913a267c Mon Sep 17 00:00:00 2001 From: Leen Alghamdi Date: Wed, 5 Nov 2025 17:18:00 +0300 Subject: [PATCH 12/16] new decorator --- src/Calc/Calculator.java | 119 +++++++++++++++++++-------------------- 1 file changed, 58 insertions(+), 61 deletions(-) diff --git a/src/Calc/Calculator.java b/src/Calc/Calculator.java index e04df33..c2cdc17 100644 --- a/src/Calc/Calculator.java +++ b/src/Calc/Calculator.java @@ -70,8 +70,8 @@ public float apply(float a, float b) { private String getSymbol(Operation op) { if (op instanceof AddOperation) return "+"; if (op instanceof SubOperation) return "-"; - if (op instanceof MultOperation) return "×"; - if (op instanceof DivOperation) return "÷"; + if (op instanceof MultOperation) return "*"; + if (op instanceof DivOperation) return "/"; return "?"; } @@ -81,6 +81,32 @@ public static java.util.List getHistory() { } + +// concrete Decorator – Logging +private static class LoggingOperation extends OperationDecorator { + + public LoggingOperation(Operation decoratedOperation) { + super(decoratedOperation); + } + + @Override + public float apply(float a, float b) { + float result = super.apply(a, b); + System.out.println("[LOG] " + a + " " + getSymbol(decoratedOperation) + " " + b + " = " + result); + return result; + } + + private String getSymbol(Operation op) { + if (op instanceof AddOperation) return "+"; + if (op instanceof SubOperation) return "-"; + if (op instanceof MultOperation) return "*"; + if (op instanceof DivOperation) return "/"; + return "?"; + } +} + + + private static class AddOperation implements Operation { @Override public float apply(float a,float b){ @@ -212,69 +238,40 @@ public void chooseOperation(String operation) { this.updateDisplay(); } - public void compute() { - - if (this.currentOperand.equals("") || this.previousOperand.equals("")) { - return; - } - - //deleting the switch, we already have the operation interface - /*.. - switch (this.operation) { - case "+" -> - computation = prev + curr; - case "-" -> - computation = prev - curr; - case "×" -> - computation = prev * curr; - case "÷" -> { - if (curr == 0) { - this.clear(); - this.currentOperand = "Error"; - return; - } - computation = prev / curr; - } - default -> { - return; - } - } -..*/ - try { - float curr = Float.parseFloat(this.currentOperand); - float prev = Float.parseFloat(this.previousOperand); - Operation op = OperationFactory.getOperation(this.operation); - - - - - - // نغلف العملية بالـ History Decorator - op = new HistoryOperation(op); - - - - - - - - - float result = op.apply(prev, curr); - - this.currentOperand = (result - (int) result ) != 0 +public void compute() { + + if (this.currentOperand.equals("") || this.previousOperand.equals("")) { + return; + } + + try { + float curr = Float.parseFloat(this.currentOperand); + float prev = Float.parseFloat(this.previousOperand); + + // نجيب العملية الأساسية من الفاكتوري + Operation op = OperationFactory.getOperation(this.operation); + + // نغلفها بـ History + Logging (Decorator Pattern) + op = new HistoryOperation(op); + op = new LoggingOperation(op); + + float result = op.apply(prev, curr); + + this.currentOperand = (result - (int) result) != 0 ? Float.toString(result ) : Integer.toString((int) result ); - - } catch (IllegalArgumentException | ArithmeticException ex) { - this.clear(); - this.currentOperand = "Error"; - return; - } - - this.previousOperand = ""; - this.operation = ""; + + } catch (IllegalArgumentException | ArithmeticException ex) { + this.clear(); + this.currentOperand = "Error"; + return; } + this.previousOperand = ""; + this.operation = ""; +} + + public void updateDisplay() { current.setText(this.currentOperand); previous.setText(previousOperand + " " + this.operation); From 654a34d16b842bc2b317dc8a6c5d2b487b8ec071 Mon Sep 17 00:00:00 2001 From: sultanax100 Date: Mon, 1 Dec 2025 20:18:06 +0300 Subject: [PATCH 13/16] seperation classes --- src/Calc/OperationFactory.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/Calc/OperationFactory.java diff --git a/src/Calc/OperationFactory.java b/src/Calc/OperationFactory.java new file mode 100644 index 0000000..6934a5d --- /dev/null +++ b/src/Calc/OperationFactory.java @@ -0,0 +1,26 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package Calc; + +/** + * + * @author Sulta + */ +public class OperationFactory { + public static Operation getOperation(String op) { + switch (op) { + case "+": + return new AddOperation(); + case "-": + return new SubOperation(); + case "×": + return new MultOperation(); + case "÷": + return new DivOperation(); + default: + throw new IllegalArgumentException("Unknown operation: " + op); + } + } +} From d85bb9c04b1370ada28c86ed2c9c0f6e1666f4af Mon Sep 17 00:00:00 2001 From: sultanax100 Date: Mon, 1 Dec 2025 21:33:12 +0300 Subject: [PATCH 14/16] seperation classes --- src/Calc/AddOperation.java | 16 ++++ src/Calc/Calculator.java | 131 +++---------------------------- src/Calc/CalculatorFacade.java | 8 +- src/Calc/DivOperation.java | 19 +++++ src/Calc/HistoryOperation.java | 34 ++++++++ src/Calc/LoggingOperation.java | 30 +++++++ src/Calc/MultOperation.java | 16 ++++ src/Calc/Operation.java | 13 +++ src/Calc/OperationDecorator.java | 22 ++++++ src/Calc/SubOperation.java | 16 ++++ 10 files changed, 182 insertions(+), 123 deletions(-) create mode 100644 src/Calc/AddOperation.java create mode 100644 src/Calc/DivOperation.java create mode 100644 src/Calc/HistoryOperation.java create mode 100644 src/Calc/LoggingOperation.java create mode 100644 src/Calc/MultOperation.java create mode 100644 src/Calc/Operation.java create mode 100644 src/Calc/OperationDecorator.java create mode 100644 src/Calc/SubOperation.java diff --git a/src/Calc/AddOperation.java b/src/Calc/AddOperation.java new file mode 100644 index 0000000..da08480 --- /dev/null +++ b/src/Calc/AddOperation.java @@ -0,0 +1,16 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package Calc; + +/** + * + * @author Sulta + */ +public class AddOperation implements Operation{ + @Override + public float apply(float a, float b) { + return a + b; + } +} diff --git a/src/Calc/Calculator.java b/src/Calc/Calculator.java index c2cdc17..72690b8 100644 --- a/src/Calc/Calculator.java +++ b/src/Calc/Calculator.java @@ -3,6 +3,16 @@ import java.awt.Color; import java.awt.event.*; import javax.swing.JButton; +import Calc.Operation; +import Calc.AddOperation; +import Calc.SubOperation; +import Calc.MultOperation; +import Calc.DivOperation; +import Calc.OperationFactory; +import Calc.OperationDecorator; +import Calc.HistoryOperation; +import Calc.LoggingOperation; + /** * @@ -24,127 +34,6 @@ public static Calculator getInstance() { } return INSTANCE; } - - // --- Factory Method --- - public interface Operation { - float apply(float a, float b); - } - - - - - - - // --- Decorator Pattern (History) --- - -// 1) Abstract Decorator -private abstract static class OperationDecorator implements Operation { - protected Operation decoratedOperation; - - public OperationDecorator(Operation decoratedOperation) { - this.decoratedOperation = decoratedOperation; - } - - @Override - public float apply(float a, float b) { - return decoratedOperation.apply(a, b); - } -} - -// 2) Concrete Decorator - History -public static class HistoryOperation extends OperationDecorator { - - private static final java.util.List history = new java.util.ArrayList<>(); - - public HistoryOperation(Operation decoratedOperation) { - super(decoratedOperation); - } - - @Override - public float apply(float a, float b) { - float result = super.apply(a, b); - history.add(a + " " + getSymbol(decoratedOperation) + " " + b + " = " + result); - return result; - } - -private String getSymbol(Operation op) { - if (op instanceof AddOperation) return "+"; - if (op instanceof SubOperation) return "-"; - if (op instanceof MultOperation) return "*"; - if (op instanceof DivOperation) return "/"; - return "?"; -} - - public static java.util.List getHistory() { - return history; - } -} - - - -// concrete Decorator – Logging -private static class LoggingOperation extends OperationDecorator { - - public LoggingOperation(Operation decoratedOperation) { - super(decoratedOperation); - } - - @Override - public float apply(float a, float b) { - float result = super.apply(a, b); - System.out.println("[LOG] " + a + " " + getSymbol(decoratedOperation) + " " + b + " = " + result); - return result; - } - - private String getSymbol(Operation op) { - if (op instanceof AddOperation) return "+"; - if (op instanceof SubOperation) return "-"; - if (op instanceof MultOperation) return "*"; - if (op instanceof DivOperation) return "/"; - return "?"; - } -} - - - - private static class AddOperation implements Operation { - @Override - public float apply(float a,float b){ - return a+b;} -} - - private static class SubOperation implements Operation { - @Override - public float apply(float a,float b){ - return a-b;} - } - - private static class MultOperation implements Operation { - @Override - public float apply(float a,float b){ - return a*b;} - } - - private static class DivOperation implements Operation { - @Override - public float apply(float a,float b){ - if (b == 0f) { - throw new ArithmeticException("Error! Division by zero is not accepted"); - } - return a/b;} - } - - public static class OperationFactory { - static Operation getOperation(String op) { - switch (op) { - case "+": return new AddOperation(); - case "-": return new SubOperation(); - case "×": return new MultOperation(); - case "÷": return new DivOperation(); - default: throw new IllegalArgumentException("Unknown operation: " + op); - } - } - } private Calculator() { initComponents(); diff --git a/src/Calc/CalculatorFacade.java b/src/Calc/CalculatorFacade.java index 027afd8..a3a7f36 100644 --- a/src/Calc/CalculatorFacade.java +++ b/src/Calc/CalculatorFacade.java @@ -1,5 +1,9 @@ package Calc; +import Calc.Operation; +import Calc.OperationFactory; +import java.util.List; +import Calc.HistoryOperation; public class CalculatorFacade { private Calculator calculator; @@ -15,7 +19,7 @@ public void showCalculator() { // تنفّذ عملية رياضية وتُرجع الناتج public float performOperation(String operation, float a, float b) { - Calculator.Operation op = Calculator.OperationFactory.getOperation(operation); + Operation op = OperationFactory.getOperation(operation); if (op == null) { throw new IllegalArgumentException("Invalid operation: " + operation); } @@ -29,6 +33,6 @@ public void clearCalculator() { // تعرض الـ History (من Decorator) public java.util.List getHistory() { - return Calculator.HistoryOperation.getHistory(); + return HistoryOperation.getHistory(); } } diff --git a/src/Calc/DivOperation.java b/src/Calc/DivOperation.java new file mode 100644 index 0000000..7bdca7f --- /dev/null +++ b/src/Calc/DivOperation.java @@ -0,0 +1,19 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package Calc; + +/** + * + * @author Sulta + */ +public class DivOperation implements Operation{ + @Override + public float apply(float a, float b) { + if (b == 0f) { + throw new ArithmeticException("Error! Division by zero is not accepted"); + } + return a / b; + } +} diff --git a/src/Calc/HistoryOperation.java b/src/Calc/HistoryOperation.java new file mode 100644 index 0000000..0a800c4 --- /dev/null +++ b/src/Calc/HistoryOperation.java @@ -0,0 +1,34 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package Calc; + +import java.util.ArrayList; +import java.util.List; +public class HistoryOperation extends OperationDecorator{ + private static final List history = new ArrayList<>(); + + public HistoryOperation(Operation decoratedOperation) { + super(decoratedOperation); + } + + @Override + public float apply(float a, float b) { + float result = super.apply(a, b); + history.add(a + " " + getSymbol(decoratedOperation) + " " + b + " = " + result); + return result; + } + + private String getSymbol(Operation op) { + if (op instanceof AddOperation) return "+"; + if (op instanceof SubOperation) return "-"; + if (op instanceof MultOperation) return "×"; + if (op instanceof DivOperation) return "÷"; + return "?"; + } + + public static List getHistory() { + return history; + } +} diff --git a/src/Calc/LoggingOperation.java b/src/Calc/LoggingOperation.java new file mode 100644 index 0000000..f0b3e0c --- /dev/null +++ b/src/Calc/LoggingOperation.java @@ -0,0 +1,30 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package Calc; + +/** + * + * @author Sulta + */ +public class LoggingOperation extends OperationDecorator{ + public LoggingOperation(Operation decoratedOperation) { + super(decoratedOperation); + } + + @Override + public float apply(float a, float b) { + float result = super.apply(a, b); + System.out.println("[LOG] " + a + " " + getSymbol(decoratedOperation) + " " + b + " = " + result); + return result; + } + + private String getSymbol(Operation op) { + if (op instanceof AddOperation) return "+"; + if (op instanceof SubOperation) return "-"; + if (op instanceof MultOperation) return "×"; + if (op instanceof DivOperation) return "÷"; + return "?"; + } +} diff --git a/src/Calc/MultOperation.java b/src/Calc/MultOperation.java new file mode 100644 index 0000000..158dfea --- /dev/null +++ b/src/Calc/MultOperation.java @@ -0,0 +1,16 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package Calc; + +/** + * + * @author Sulta + */ +public class MultOperation implements Operation{ + @Override + public float apply(float a, float b) { + return a * b; + } +} diff --git a/src/Calc/Operation.java b/src/Calc/Operation.java new file mode 100644 index 0000000..5d28fef --- /dev/null +++ b/src/Calc/Operation.java @@ -0,0 +1,13 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Interface.java to edit this template + */ +package Calc; + +/** + * + * @author Sulta + */ +public interface Operation { + float apply(float a, float b); +} diff --git a/src/Calc/OperationDecorator.java b/src/Calc/OperationDecorator.java new file mode 100644 index 0000000..49ee4f3 --- /dev/null +++ b/src/Calc/OperationDecorator.java @@ -0,0 +1,22 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package Calc; + +/** + * + * @author Sulta + */ +public class OperationDecorator implements Operation{ + protected Operation decoratedOperation; + + public OperationDecorator(Operation decoratedOperation) { + this.decoratedOperation = decoratedOperation; + } + + @Override + public float apply(float a, float b) { + return decoratedOperation.apply(a, b); + } +} diff --git a/src/Calc/SubOperation.java b/src/Calc/SubOperation.java new file mode 100644 index 0000000..aeee3b9 --- /dev/null +++ b/src/Calc/SubOperation.java @@ -0,0 +1,16 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package Calc; + +/** + * + * @author Sulta + */ +public class SubOperation implements Operation{ + @Override + public float apply(float a, float b) { + return a - b; + } +} From c95c6c301e37974dc71d5afcc34175b7171a982c Mon Sep 17 00:00:00 2001 From: Leen Alghamdi Date: Tue, 2 Dec 2025 01:54:04 +0300 Subject: [PATCH 15/16] state pattern --- src/Calc/App.java | 1 + src/Calc/Calculator.java | 124 ++++++++++++++++++++++++--- src/Calc/CalculatorFacade.java | 1 + src/Calc/CalculatorState.java | 16 ++++ src/Calc/IdleState.java | 26 ++++++ src/Calc/OperationSelectedState.java | 26 ++++++ src/Calc/ResultState.java | 28 ++++++ src/Calc/TypingState.java | 29 +++++++ 8 files changed, 238 insertions(+), 13 deletions(-) create mode 100644 src/Calc/CalculatorState.java create mode 100644 src/Calc/IdleState.java create mode 100644 src/Calc/OperationSelectedState.java create mode 100644 src/Calc/ResultState.java create mode 100644 src/Calc/TypingState.java diff --git a/src/Calc/App.java b/src/Calc/App.java index a2cd664..f658618 100644 --- a/src/Calc/App.java +++ b/src/Calc/App.java @@ -16,3 +16,4 @@ public static void main(String[] args) { } } +// \ No newline at end of file diff --git a/src/Calc/Calculator.java b/src/Calc/Calculator.java index 72690b8..7839983 100644 --- a/src/Calc/Calculator.java +++ b/src/Calc/Calculator.java @@ -35,6 +35,48 @@ public static Calculator getInstance() { return INSTANCE; } + + + + + + + // -------------------- State Pattern -------------------- +private CalculatorState state = new IdleState(); + +public void setState(CalculatorState newState) { + this.state = newState; +} + +// دوال هندل (واجهة واضحة تُنادى من الأزرار) +public void handleNumber(String digit) { + state.onNumber(this, digit); +} + +public void handleOperation(String op) { + state.onOperation(this, op); +} + +public void handleEquals() { + state.onEquals(this); +} + +public void handleClear() { + state.onClear(this); +} +// --------------------------------------------------------- + + + + + + + + + + + + private Calculator() { initComponents(); getContentPane().setSize(400, 700); @@ -42,6 +84,48 @@ private Calculator() { this.addEvents(); } + + + + + + +// --- Helper Methods used by States --- + +public void setDisplay(String value) { + this.currentOperand = value; + updateDisplay(); +} + +public void appendDigit(String digit) { + this.currentOperand += digit; + updateDisplay(); +} + +public void clearDisplay() { + this.currentOperand = ""; + this.previousOperand = ""; + updateDisplay(); +} + +public void saveFirstOperand() { + this.previousOperand = this.currentOperand; +} + +public void setOperation(String op) { + this.operation = op; + updateDisplay(); +} +// ---------------- END STATE PATTERN --------------- + + + + + + + + + public void addEvents() { JButton[] btns = { btn0, btn1, btn2, btn3, btn4, @@ -54,12 +138,27 @@ public void addEvents() { btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9 }; + + + + + + + + +for (JButton number : numbers) { + number.addActionListener((ActionEvent e) -> { + handleNumber(((JButton) e.getSource()).getText()); + }); +} + + + + + + + - for (JButton number : numbers) { - number.addActionListener((ActionEvent e) -> { - appendNumber(((JButton) e.getSource()).getText()); - }); - } for (JButton btn : btns) { btn.addMouseListener(new MouseAdapter() { @@ -597,7 +696,7 @@ private void btnDotActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST: }//GEN-LAST:event_btnDotActionPerformed private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnClearActionPerformed - clear(); + handleClear(); }//GEN-LAST:event_btnClearActionPerformed private void btnDelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDelActionPerformed @@ -608,25 +707,24 @@ private void btnDelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST: }//GEN-LAST:event_btnDelActionPerformed private void btnPlusActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPlusActionPerformed - chooseOperation("+"); + handleOperation("+"); }//GEN-LAST:event_btnPlusActionPerformed private void btnMultActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMultActionPerformed - chooseOperation("×"); + handleOperation("×"); }//GEN-LAST:event_btnMultActionPerformed private void btnSubActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSubActionPerformed - chooseOperation("-"); + handleOperation("-"); }//GEN-LAST:event_btnSubActionPerformed private void btnDivActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDivActionPerformed - chooseOperation("÷"); + handleOperation("÷"); }//GEN-LAST:event_btnDivActionPerformed private void btnEqualActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEqualActionPerformed - this.compute(); - this.updateDisplay(); - +handleEquals(); + diff --git a/src/Calc/CalculatorFacade.java b/src/Calc/CalculatorFacade.java index a3a7f36..a43218c 100644 --- a/src/Calc/CalculatorFacade.java +++ b/src/Calc/CalculatorFacade.java @@ -1,5 +1,6 @@ package Calc; + import Calc.Operation; import Calc.OperationFactory; import java.util.List; diff --git a/src/Calc/CalculatorState.java b/src/Calc/CalculatorState.java new file mode 100644 index 0000000..05bb85f --- /dev/null +++ b/src/Calc/CalculatorState.java @@ -0,0 +1,16 @@ +package Calc; + +/** + * واجهة تمثل حالة الآلة الحاسبة. + * كل حالة تحدد كيف تتصرف الآلة عند ضغط رقم / عملية / يساوي / مسح. + */ +public interface CalculatorState { + + void onNumber(Calculator calc, String digit); + + void onOperation(Calculator calc, String op); + + void onEquals(Calculator calc); + + void onClear(Calculator calc); +} diff --git a/src/Calc/IdleState.java b/src/Calc/IdleState.java new file mode 100644 index 0000000..6062c41 --- /dev/null +++ b/src/Calc/IdleState.java @@ -0,0 +1,26 @@ +package Calc; + +public class IdleState implements CalculatorState { + + @Override + public void onNumber(Calculator calc, String digit) { + calc.setDisplay(digit); + calc.setState(new TypingState()); + } + + @Override + public void onOperation(Calculator calc, String op) { + // لا يمكن اختيار عملية قبل كتابه اول رقم + } + + @Override + public void onEquals(Calculator calc) { + // ولا شي + } + + @Override + public void onClear(Calculator calc) { + calc.clear(); + calc.setState(new IdleState()); + } +} diff --git a/src/Calc/OperationSelectedState.java b/src/Calc/OperationSelectedState.java new file mode 100644 index 0000000..c9639fd --- /dev/null +++ b/src/Calc/OperationSelectedState.java @@ -0,0 +1,26 @@ +package Calc; + +public class OperationSelectedState implements CalculatorState { + + @Override + public void onNumber(Calculator calc, String digit) { + calc.setDisplay(digit); + calc.setState(new TypingState()); + } + + @Override + public void onOperation(Calculator calc, String op) { + calc.setOperation(op); + } + + @Override + public void onEquals(Calculator calc) { + // لا يوجد رقم ثاني → تجاهل فقط + } + + @Override + public void onClear(Calculator calc) { + calc.clear(); + calc.setState(new IdleState()); + } +} diff --git a/src/Calc/ResultState.java b/src/Calc/ResultState.java new file mode 100644 index 0000000..0cb289e --- /dev/null +++ b/src/Calc/ResultState.java @@ -0,0 +1,28 @@ +package Calc; + +public class ResultState implements CalculatorState { + + @Override + public void onNumber(Calculator calc, String digit) { + calc.setDisplay(digit); + calc.setState(new TypingState()); + } + + @Override + public void onOperation(Calculator calc, String op) { + calc.saveFirstOperand(); + calc.setOperation(op); + calc.setState(new OperationSelectedState()); + } + + @Override + public void onEquals(Calculator calc) { + // تجاهل + } + + @Override + public void onClear(Calculator calc) { + calc.clear(); + calc.setState(new IdleState()); + } +} diff --git a/src/Calc/TypingState.java b/src/Calc/TypingState.java new file mode 100644 index 0000000..921c2f5 --- /dev/null +++ b/src/Calc/TypingState.java @@ -0,0 +1,29 @@ +package Calc; + +public class TypingState implements CalculatorState { + + @Override + public void onNumber(Calculator calc, String digit) { + calc.appendDigit(digit); + } + + @Override + public void onOperation(Calculator calc, String op) { + calc.saveFirstOperand(); + calc.setOperation(op); + calc.setState(new OperationSelectedState()); + } + + @Override + public void onEquals(Calculator calc) { + calc.compute(); + calc.updateDisplay(); + calc.setState(new ResultState()); + } + + @Override + public void onClear(Calculator calc) { + calc.clear(); + calc.setState(new IdleState()); + } +} From 9c8da95fc33d52e230878e8c883129f0bcb73bef Mon Sep 17 00:00:00 2001 From: sultanax100 Date: Wed, 3 Dec 2025 02:47:43 +0300 Subject: [PATCH 16/16] Command Pattern --- build/classes/Calc/AddOperation.class | Bin 0 -> 508 bytes build/classes/Calc/App.class | Bin 463 -> 1716 bytes build/classes/Calc/Calculator$1.class | Bin 1343 -> 1428 bytes build/classes/Calc/Calculator$10.class | Bin 759 -> 759 bytes build/classes/Calc/Calculator$11.class | Bin 731 -> 758 bytes build/classes/Calc/Calculator$12.class | Bin 725 -> 758 bytes build/classes/Calc/Calculator$13.class | Bin 859 -> 731 bytes build/classes/Calc/Calculator$14.class | Bin 758 -> 725 bytes build/classes/Calc/Calculator$15.class | Bin 861 -> 859 bytes build/classes/Calc/Calculator$16.class | Bin 759 -> 758 bytes build/classes/Calc/Calculator$17.class | Bin 0 -> 861 bytes build/classes/Calc/Calculator$18.class | Bin 0 -> 759 bytes build/classes/Calc/Calculator$2.class | Bin 755 -> 755 bytes build/classes/Calc/Calculator$3.class | Bin 757 -> 757 bytes build/classes/Calc/Calculator$4.class | Bin 755 -> 755 bytes build/classes/Calc/Calculator$5.class | Bin 756 -> 756 bytes build/classes/Calc/Calculator$6.class | Bin 755 -> 755 bytes build/classes/Calc/Calculator$7.class | Bin 756 -> 756 bytes build/classes/Calc/Calculator$8.class | Bin 759 -> 759 bytes build/classes/Calc/Calculator$9.class | Bin 755 -> 755 bytes .../Calc/Calculator$AddOperation.class | Bin 0 -> 645 bytes .../Calc/Calculator$DivOperation.class | Bin 0 -> 808 bytes .../Calc/Calculator$HistoryOperation.class | Bin 0 -> 2216 bytes .../Calc/Calculator$LoggingOperation.class | Bin 0 -> 1958 bytes .../Calc/Calculator$MultOperation.class | Bin 0 -> 648 bytes build/classes/Calc/Calculator$Operation.class | Bin 0 -> 265 bytes .../Calc/Calculator$OperationDecorator.class | Bin 0 -> 817 bytes .../Calc/Calculator$SubOperation.class | Bin 0 -> 645 bytes build/classes/Calc/Calculator.class | Bin 17419 -> 21553 bytes build/classes/Calc/Calculator.form | 36 ++++++ build/classes/Calc/CalculatorFacade.class | Bin 0 -> 1830 bytes build/classes/Calc/CalculatorState.class | Bin 0 -> 349 bytes build/classes/Calc/Command.class | Bin 0 -> 139 bytes build/classes/Calc/ComputeCommand.class | Bin 0 -> 1873 bytes build/classes/Calc/DivOperation.class | Bin 0 -> 671 bytes build/classes/Calc/HistoryOperation.class | Bin 0 -> 2020 bytes build/classes/Calc/IdleState.class | Bin 0 -> 1143 bytes build/classes/Calc/LoggingOperation.class | Bin 0 -> 1616 bytes build/classes/Calc/MultOperation.class | Bin 0 -> 511 bytes build/classes/Calc/Operation.class | Bin 0 -> 170 bytes build/classes/Calc/OperationDecorator.class | Bin 0 -> 658 bytes build/classes/Calc/OperationFactory.class | Bin 0 -> 1466 bytes .../classes/Calc/OperationSelectedState.class | Bin 0 -> 1236 bytes build/classes/Calc/ResultState.class | Bin 0 -> 1293 bytes build/classes/Calc/SubOperation.class | Bin 0 -> 508 bytes build/classes/Calc/TypingState.class | Bin 0 -> 1356 bytes nbproject/private/private.properties | 2 +- nbproject/private/private.xml | 6 +- src/Calc/AddOperation.java | 5 +- src/Calc/Calculator.form | 36 ++++++ src/Calc/Calculator.java | 121 +++++++++++++++++- src/Calc/Command.java | 10 ++ src/Calc/ComputeCommand.java | 47 +++++++ src/Calc/DivOperation.java | 5 +- src/Calc/HistoryOperation.java | 11 +- src/Calc/LoggingOperation.java | 5 +- src/Calc/MultOperation.java | 5 +- src/Calc/Operation.java | 5 +- src/Calc/OperationDecorator.java | 5 +- src/Calc/OperationFactory.java | 5 +- src/Calc/SubOperation.java | 5 +- 61 files changed, 266 insertions(+), 43 deletions(-) create mode 100644 build/classes/Calc/AddOperation.class create mode 100644 build/classes/Calc/Calculator$17.class create mode 100644 build/classes/Calc/Calculator$18.class create mode 100644 build/classes/Calc/Calculator$AddOperation.class create mode 100644 build/classes/Calc/Calculator$DivOperation.class create mode 100644 build/classes/Calc/Calculator$HistoryOperation.class create mode 100644 build/classes/Calc/Calculator$LoggingOperation.class create mode 100644 build/classes/Calc/Calculator$MultOperation.class create mode 100644 build/classes/Calc/Calculator$Operation.class create mode 100644 build/classes/Calc/Calculator$OperationDecorator.class create mode 100644 build/classes/Calc/Calculator$SubOperation.class create mode 100644 build/classes/Calc/CalculatorFacade.class create mode 100644 build/classes/Calc/CalculatorState.class create mode 100644 build/classes/Calc/Command.class create mode 100644 build/classes/Calc/ComputeCommand.class create mode 100644 build/classes/Calc/DivOperation.class create mode 100644 build/classes/Calc/HistoryOperation.class create mode 100644 build/classes/Calc/IdleState.class create mode 100644 build/classes/Calc/LoggingOperation.class create mode 100644 build/classes/Calc/MultOperation.class create mode 100644 build/classes/Calc/Operation.class create mode 100644 build/classes/Calc/OperationDecorator.class create mode 100644 build/classes/Calc/OperationFactory.class create mode 100644 build/classes/Calc/OperationSelectedState.class create mode 100644 build/classes/Calc/ResultState.class create mode 100644 build/classes/Calc/SubOperation.class create mode 100644 build/classes/Calc/TypingState.class create mode 100644 src/Calc/Command.java create mode 100644 src/Calc/ComputeCommand.java diff --git a/build/classes/Calc/AddOperation.class b/build/classes/Calc/AddOperation.class new file mode 100644 index 0000000000000000000000000000000000000000..2d96ae15acfb9642e0e87b5f984e11c88425584d GIT binary patch literal 508 zcmZWm%TB^T6g^W4RWZ@9pSBYiQl?}WNc<@iS0*m}06)rj zThNfWn0tE9J?Hk$ov-hYPXISKEyF_2fn7x&1%~|@UvoF+YT}N9nFtL-;aVzbZW(gj z-q=Brp)urf=nkT2v=EvbnJ5QkhFV7daSZk_i3CI4mr6XW=7G@9Jcx;D`bo&+G1oH9 zx1?>Ra>>y0|8>7&$n(V_ej)67Ue9A-oKA`X&3rG+G>IO$=5t|$rY4<4Px?xjKybC} zKP4+23SX>6JWwhz*~p}7`#ZN?3$0}&=wIcH-jnI5jooYZQ$5b%(9#%6w80cwZLfEwzQ(eP*>mznR>N_5S1bUjVM+R~r*ZSx7rLfQ&%? zg?uTip7ftrm)2jXwid`-aeY@`6G)XSYXy2`9pqqB4hO!#Y`M}LJFN_SU#@$qX2Zdx zg((Nq$O{}bCcjmqS1yrT=6s}G&(*Gq1P;3X%V0w_rB#GNY-nt4`P45H>&7dv4H5s}_9zCXY*JXZo z^B;g35qi=c&cM?|&;E@^y$qkzXJ!vI>ASCVH|Q+OQ1%pCPs2%1_SQSHWME57)@B;* zxX0uyj%>mwo6j^dp^63`i5Cs}w1Pp{Rt?uwl4YS63|S0!GYE8~L)nkxMtNkWGq`P| ziiU$4GFjZA`^pe&{_4D-_9q+n(6n&h!2>J_oE(pOJhav3Fk?c>XR^(S+~hp7oU!yF z*^7}=oWULGcRUr9nnAEJ=+|~rn0VRYxVqU_N%Q}%j6?44n;gFpGCB8Ju2wZt^3cW# zS{7E#C_fS??V=-#FKdoqetWZ`Fl)4OWg zt78^^5jeiTDTgy|FHUgICb&L<6c+)vEzd70RrwYC9$0t>@rIWPe8tnKjp^4so!9{1 z;9E*Le1}W4GR~Jq&be(^z#lj`1~8kQsK_Fp0LkHd{J{6iMkgpBZ=2aCj=}39J#;Jm zi9=7`Vdmb#77i~I<_bp&N4N0lt+)96)HY57Td0gf%`yy_K$eS@Yaer%;)a|ahMgr| x7RPXf|2Cjz64!8@(Nb8XJb@dy$!~$TyL_wT7Jtjs|A;ld+q^x-6FkL{zX9Hdxsm_? delta 272 zcmYL?y-osA5Jt}h)?Mx{f{6b%c4Fc78VW+<3z(2Vw~{T^Yy#oO)@Lw2fX_f;B*DZ7 zpz(QZjNe@giaC=nGjry>_FcA{-}M*J;rzwMw?2WP-b?aP?6Am_`FLvaDLaG_5jBII zrSpC^%O3L7P`Mno`#$y8AM^HX@5hVjD80+vB{eonk0GHHTT#Rj$2vYy Mc}4;GPsI{vf5(6#=l}o! diff --git a/build/classes/Calc/Calculator$1.class b/build/classes/Calc/Calculator$1.class index a1176548e8e4c5da8039d94b628e02721c8662ea..8603d1c27e556fa5ea2f0b7a8138172eb42d074b 100644 GIT binary patch delta 280 zcmYj~y-EX75QV?HcUNIku4oy-#%fa;aMfs{#=ngbtSvTr3DK|%n`GNO#PuocENn!y z7c8{!58uN^#L>zr<~wtknRDl#m;C$h>sw%jgG>L)iRQAr8>VL1F-bZI53^BzY+_TG zemzaIVKVGx=|C|RpC(08=_hHo(k@J%_fCwxaU!*CKb@v(*_u965B5TbO4~QR;5{lb=IyJOyxa09N9xqgRrNui5A1unoELwVph$Z2#T4hb{JdW646Njd_ qKKhI5BwNz~%QAaP*5H4X%Z@k>yX*;F%EavdIc3_yk}qE!5mG;)=QuO~ delta 168 zcmbQjy`PKg)W2Q(7#J9A8T>YKZDpGLhsm7LZL$fo8>9E+YUXT4y~)p+^%$8Zi?Nup z8Zn477*7sh(O_p}aAdG!V4B>`QZH!Ez{+63V8&p{;LBjmkjP*=S(;VR$BDt2fr-Hd zXfhWA^B)E?b_Q25VFnu@pOulp9!Rk;xC2Qh1`h^LFi)Pri@^shA`dhOq>T|M3kCq? CYZ_bt diff --git a/build/classes/Calc/Calculator$10.class b/build/classes/Calc/Calculator$10.class index 49bdff6c4083adc8045f8051b53e3ae1cc096839..9419604528ddaa6fbf6634078a19c16b9dc4a59d 100644 GIT binary patch delta 25 hcmey)`ki%y2NM(1n#o>FA#6-#5Vr6!k5tTKoZODf3=%}dF5 zOfJdH&kIN`O3N?GO-*5Bkk{}5t4}O1(N8T)%`4G|C~*a`tu@2g8AKQvWU(so$t*5O z%}Xts_@F|cKM~zv=G3whMg|$|rcZ8Wv}9DCyqD3Wo{>SAfl)w!ft7&`=m#bs=4KED z(qcfC9gqfzaA|38Wnk3W&cMDAtVSG2vN13Mm2YQ|0J6m(su(00q<}o2da!AX4AMY0 zDWEtdu#z4)K k1!`eokOz`X3+ZX5`zj@gpWZLNOJ*|gPacp05(-mLI3~& delta 399 zcmeyydYhH&)W2Q(7#J9A8B`{6`6(%8C6*=XCzhA!rHLSdA!HQ#s+LaxzFW$N&w3nko&{!ona6B$*iG805h` WJ_ZE_C9nt|gEElj0xAc200;nEZb+X1 diff --git a/build/classes/Calc/Calculator$12.class b/build/classes/Calc/Calculator$12.class index 03ef14d545675834eb7c2913518b6cf5db1c72bb..037822f8fca86394ae49800584bfd57e80c1ff76 100644 GIT binary patch delta 431 zcmZvXJxjw-6o%guO=}|7_!Ykz>o=MXac~h)=-^gV9GqOz_EuVK0`U@EME^qQFA>y& zgQBCmi$BCsJV}F!^uoR8J%@+qa^BTXRe$?>d;+k8)kxnTF`91ZI%lqT>Ks&>qADY~ zabi}acO+_lsVW=3cPN6oAGAb`P*^J`yn7)X5eiQ_U1TrL+v~?!j1#P$NV#z?g(rgO zFUC6*=XCzhA!r$t=l9bxJG(O9T|978j?cFfzz#_+ZoM3Npi5Gi>753T>WTkWp|Q%&BE1j11CP zwN0MGXvwHJ`5L21Jp%)yfB*w40~^qZOhC-dAPl5MfGj&84HDtf(%#CzsI{GeeIrz; zAx9t$(!i;;g@I9f8w2k~Acu(oWGWX(g6T8^2h$lOlR4ogb23OX$XEhRgBmRj)WgCc e3)U~kAP?s8F(@!7fkpTjlz}uCP&vptAOHXfa4o3- delta 426 zcmZvY%TB^T7=_P_6lG|t77+yn6)&VLx^UqNqYIY!3Z`fmHL)g8(UrP&+4MY!LT@dlpjT|}-w@WaUMoSpam zxW8i;x>48(!XPcQ!^rQ&!+K4@!kmdBYytaM;xdT*SJDwyKxMv|~O)S#uJX0v6LelzeeYWeVIp-dt`G~^z)5hdk ilI{P=t-t6DRtb|>L!Fx8SFU3-tytKiDh}7FUC6*=XCzhA!r$t=l9bxJG(O9T|978j?cFfzz#_+ZoM3Npi5Gi>753T>WTkWp|Q%&BE1j11CP zwN0MGXvwHJ`5L21Jp%)yfB*w40~^qZOhC-dAPl5MfGj&84HDtf(%#CzsI{GeeIr;ihsjNHfR)4T72~4b;NIAPXd!7~~k_!8|?&1qLOs Q2p@wokmdp^2YCPp0IZiq{r~^~ delta 431 zcmZvX%SyvQ6o&s3O=}|7s5SM{Snp`MhzmC&3SGFXmz66wX`M=nokAR<8_`!NeG)+} zxbOkoyYWF>iYIAMkq*q9{~SKP;k@ggy7~6?@(N%N>mBoG!fN`F?_K)x!aJ@tMO}5& z)|p*X@-UD=rLKauJP~1|9k#?dp|nv=c>h{?A`()0edHj{yPKz3WhhdcX)v$=Aq|0F$tH~sXHLfP(@fLi(0e5Ll(EtDd diff --git a/build/classes/Calc/Calculator$15.class b/build/classes/Calc/Calculator$15.class index 0aa9102e02c637f5f55225046a54e8dbe2deebdc..01bab5c5d302957cf4f9ec0b23aef484a287113d 100644 GIT binary patch delta 61 zcmcc1cAIU&5)R>{l04tcyv&JfEjfgs?2Yf!7#SZ=4r2;seagVW^lb75AnOH?^%BU^ Jm~6zX4FJ^s7A61y delta 63 zcmcc3c9(6!5>An%l04^}{NmJ!Yb-g1VVsR`(-;|*CWkPEvZ^p}FsV*n2V|)OSsFl= J#$*F#Z2-X96D$A# diff --git a/build/classes/Calc/Calculator$16.class b/build/classes/Calc/Calculator$16.class index c65b9c98a6526d7dd34c5137f7daf5117da3fb63..562c020e9f98c4c3c3a0d0673fd37831e7f65488 100644 GIT binary patch delta 35 rcmey)`i*tMOb)T6l04tcyv&V@mNPQGp6taG%KDapgX!JmB}~Bp0zwU; delta 36 scmeyy`ki&cOiuBnl04^}{NmJ&3zsu8YEAZJ3T4${;9%07yqGB%0Q&|D#sB~S diff --git a/build/classes/Calc/Calculator$17.class b/build/classes/Calc/Calculator$17.class new file mode 100644 index 0000000000000000000000000000000000000000..f8aae67669ff9b35b33e55de69020b1567b5cf6d GIT binary patch literal 861 zcma))+iuf95QhJCoRecxHx0)^I5a?-N(8RB2vn-9Adu1u36%RyvTBW-b!Be?m%I`Z z2Z;+FfHy**!oNw?LO2LZ-kF`<{buIh{e1NC6M%1iU=SfJ7B|0zk&=Ibu7bsuLfbM05c ztH@YDz4cocn*#wiOvZ|J^dqhIrjwycpUYv)NUfiYWIT{*War00*GfXxGKzY21%h2= z4wCUxnaYV`-Q4LPBLcqpJ=VpFqT=SGF;B#a0%cY5L@qY=9KE$1?MYD&bOb)b YZeWAf<>PJQ);vR literal 0 HcmV?d00001 diff --git a/build/classes/Calc/Calculator$18.class b/build/classes/Calc/Calculator$18.class new file mode 100644 index 0000000000000000000000000000000000000000..0461dd79a2ff0117d1c4c83f22211c8a1dd33ba5 GIT binary patch literal 759 zcmaJ<+iuf95Iq|^aqODJ4W;GMP%Z%_sf6JTDNw1hia;`@Qc>PF&eCq>>>_&;Uil>? zE)oxX03U^zbs|6kVaapz*)uz5{Qbw*ZvdX+zKDuQ}fF^toL5K~64ABK&@Hpq{EPge)5SgLFPo$FOfWhex#sOMrdx%18 zqQlT$qhr{a7?tF@6o;9STAhgEjV@+l%COf@D{}tM#9|?oiIr|xGh$MI^ z%(;4EJ&K&|4qaYoa%XziD%N@q>^g6lLvN4svN0|l#=Rf*)haj zyMmULJJGYZT9Gi+y?HE3^IVtIFnpm%h9u`@DN5X;)i=R#87zwI`st6T(Yt{wT6=sKQgHFO>xJvQ%5`}BHP8s1VHijD%*BR>XBLeTDv!Xp*(fY%W zVEdnO={IX&nH&dA$NhuZ|HbU1iC? diff --git a/build/classes/Calc/Calculator$6.class b/build/classes/Calc/Calculator$6.class index f3df049874a473d9e80c6f269b265f175aeeb00c..0d871a748b3c0fd9330599f1e94353dcfee1d052 100644 GIT binary patch delta 25 gcmey&`k8fu3lkHQ$YeLB5H=<;1`a0i$qSf*0b0xj^#A|> delta 25 gcmey&`k8fu3lkG#z+^Y35H`jj1`fvH$qSf*0b#QSrT_o{ diff --git a/build/classes/Calc/Calculator$7.class b/build/classes/Calc/Calculator$7.class index be005d5cf4e312805a59fa4783fb558c088ca3ee..b307ae47c8e781b7d54989b1f313b9f9c7ed0dc5 100644 GIT binary patch delta 25 gcmeyu`h|6aD-#ow=VW)L5H==n1`Z~l$qSi+0by4LnE(I) delta 25 gcmeyu`h|6aD-#oA>tuJP5H`kk1`fuK$qSi+0cbu4N&o-= diff --git a/build/classes/Calc/Calculator$8.class b/build/classes/Calc/Calculator$8.class index e522a87bc57ee1c3a96fac811a6b3b68edcc8367..548a0092cd07b28b907e8d1c6fcf92bd1fe3d993 100644 GIT binary patch delta 25 gcmey)`ki%y2NM%h-DEGO5H_X;1`eji$xE1m0ceZ|M*si- delta 25 hcmey)`ki%y2NM(HuE}0ZA#99$7&sXBPF}(k3;=I)2lxO0 diff --git a/build/classes/Calc/Calculator$9.class b/build/classes/Calc/Calculator$9.class index c365a0003936bc3f9cbd03c8903bb076e6ac53cd..463211169ad9641cda4c313088409148fe05be75 100644 GIT binary patch delta 25 hcmey&`k8fu3lkI5?8$CSA#6-@8912cOxM0c}PBhi&P>-Aej~k)c18fYF)XzVZDjOPa*My z#6v%TkE(j?gc4Pj=XlPXneoj0z4>zu;2j1X1ZYGEV>HoHczmfBdQ@n0J~~Y=W$G1L zZ*!CT_X>@}qq7Jb3Oi$6Oh=WO7us8QaGYhQGjZDI)QugK6}H9J)0Fjh=-HO(L_OMz7?h%>a+L@ zn|;wvUx^pTdi&O$4~_U#v?+&Q?c7Zzk%bh;##mnuLe*BXwvL53muJFWouz(~SAX68 zzlUL^R@gX^(tot2kFc|fuPsX<{$z}}aiPmn*d$(`M4^4RDhv?uI;422fDbQ3?*Y9L zQ4yQ3e?$GM!!d0Y1`Hn3#!CSnp-YcTz!Nm;RjX~?3R>y|{D7)SgC&~KVuESX$Ju29Q@68Zb|BU#6OI4C z7k`9_Pfaw@cYl=e&O!=lCNpR5$DA|w=KlTn^EZI!Xcmxy<04%|23dy6IiK-%$knLb z_s>OO7_!f#lI8`2)7(FGkz?3iCLL;N#uviK;OKoICPqdohXTXik=Bvk^V^Zc%~Rg{-~Y1sxcYA)4EgKU!NWSu2aN>{ONtiF2w7FK+JuZS^YjYrM-skGrws!iQKPds zPrwH5ki~Ep_uwRt144&}&@LV&SjS_+DtXpX#}gDt Jua3QJ{y*6%vgZH* literal 0 HcmV?d00001 diff --git a/build/classes/Calc/Calculator$HistoryOperation.class b/build/classes/Calc/Calculator$HistoryOperation.class new file mode 100644 index 0000000000000000000000000000000000000000..fdf4946b603b1b141826c17680023487d5f7fcaa GIT binary patch literal 2216 zcmaJ?`%@cL6#i}q*(9U|)0Rr16$!L?SmLWH2B;8>)CMR9!M46`k}E7MyP3^~8ODD^ z{|N`RBV(O$#$WxT9KXBSrpu#DW^>Lx`<-*od;k6K`QHHMu$M#xeFmZ_^dlxPQI=Mt zsQ)^a^c;6`t)*P)nU1}r8V)(f6^PB6w&~3a+{#v8i7(|gwe5Hc2_yyjWvgW!l4dKF zTqS`NE*ZF-!XSnO#!p*WHru@Euy?tDvC|a^3{`jKfh=}B(<)XeENNru6t3W^K)Ts= zQ#C`nqZfFYr1EeI*YUbQVq1B&!~MEr2^233t?Pm%?d@XCb4`1@lx8|_q%evxf$RHn zPn8|JA-yfr+acHXr0ul@a@opRRVL)DZ~(XPhJo=E-o%8!<&!ZB^vPyZ;954MxmMp* z4X>1YVqj8W>~u~SnlEz_$87;oFpxb5SnJe#$%`XT;9Uc63EVtwaiwE=fXc>`~s zV{*wn2m#+Euo%btB=-$`AaLbnbPKL44|Q3SxQCB)SI#ilY;Kd~shQih^g6B*nC!;g zYl7KO9)gO@mjt3^r%Ci+)wI=WXTPr84OzD+NmreQv^J${>T@8BdTcVzz?pVA-Hx<8 zw4%Hnr};>_a$kAMrJj&{Dtzi35m&XD9f6GFZcp3Ft1D@@r)y5fZK$d`P}YKNJDxvT zRJ|HEFA6&@RSqNn63OXwHfpCQveaQ0L%O5MS!$cEkk0zZXYJOFm@SeACvQtipA zrBDik4hTt3C~h3K)H(2{A^eM33W)*}OpR4DJzbvE1KU<^*^=$HViD857Vqs!1K$aZ zoSvH=ju{H^L#Nw}H-v|l$M9&fGfoU3Ux&xcz_!5DnH-;&Is+zm`NdGSbT`l3M=9=g zK;VYn-lQM%6hVoz%KeTQ`B_TlNi{B(FC0Vs>SN~kufGZ)qMx6id2+*D6z<~_o`~0* zoR${I_j5OpFi%wL^UbwYbW@w%$sN#OXMO%kK$8ueZDJ+2m#@Ay7icnxWrqKN>;H3P z@i3I4LeJNNj}b&^N219@BJmN3`Y`Zm%nu2OGEe$4;a{e`2iAhhRT0MuW+>B9 zWc(O_fxmF?@i9L99Rs>}VZ|BdZk4hKO+51HI%=eGqBi+#;A@^1d5&Nm-$ax6mh}6W g{!*_)(!mUAow42_ZIBj7o1{fjMfwAFu#1uZ0UfUy(*OVf literal 0 HcmV?d00001 diff --git a/build/classes/Calc/Calculator$LoggingOperation.class b/build/classes/Calc/Calculator$LoggingOperation.class new file mode 100644 index 0000000000000000000000000000000000000000..82a802cb47f05eabb72dc0173191a676e3d257c1 GIT binary patch literal 1958 zcmaJ?ZEqVz5PsHne713$;HGIq+ax3o_=UujcW|4MIJhY|FW`{UhL*1F#kuBuXWgwM zMf?%?6DT0mO8tPuSAG=YIiGQ_PKd4BnVo%hcILU6y}$o?@h5=WXrvH9)IcnaF~kMt zE7EF~{Gn$_?YP^ znX6Xw)g;omVBlgJIg)go))-V>#vwjX~#8fUDvLXopKTx zTrx13#$`+i%#FrSbJ}gwZVy8j$h3m!RV!q?c24jq9&t5|X}lqjY%5(q?lc@rpmc7= zL9{_0ngO@V8M1smjT@K|xYCh_s^Zv9sqdTmfSRYJtv!K!u6lYac{*)OVGeH^m``H? zS%FJu&?8`UeX=Z@{N+x&$nP0=OW^t_Ypbo72;_ za^NUzd1d47aaV;G2k`xnhwa8w)zsy1)el^dAggX_pU(6>+g5JHlAfnXdS+NQ!~4m= zp1|~IEe>()=a4=zS{6JZ+z6b8%bjoXm7?ZyxO5FX7FayR@mbUvc*6Vhd?-sW;F(RI z;a%$gqTn5hIA)Q`4FE{n+j0)3}w!U_is*mxLi!X2uc!t@ zh4!R>W+8AfJad+xn-v~Ix46@f+`v_QPA%GxBN-t8Tmn}4#0g!ajQE!@M?c-4X!8>* z7XQNHFNkN}KB1QPwW6;r`C7@>Zu;8$Cz%gV2#@wTnPO5vi%BX>;z!J&jT{a_{1k_= z7E$T*v(6oH#8Sy*@;|OBG{x`*#|Wyp+m{>ok}|>QHu-#oI%jK~N3en2SPI`#-jDmA ftqpv~02V19Q06HgQZ7;MQ{JTfp7IfCl$ib(VyEVV literal 0 HcmV?d00001 diff --git a/build/classes/Calc/Calculator$MultOperation.class b/build/classes/Calc/Calculator$MultOperation.class new file mode 100644 index 0000000000000000000000000000000000000000..e02eb9629b76750f970d9242396b347b8de7d4d3 GIT binary patch literal 648 zcmZ8e+iuf95IyTSaT8KfLb;Ss8mWC~c}PBhiv*D(klYpt)c18VY8`ENqxB{dNc<8K zPe?rQ0elqV*a@YrEYI`CIGu~vA$K-GOJV1>9vI{#ru3J?A2Q7$9ehN zo&TE{lxl^I6Dh(wSA+yl*YRuXQfR-oR{Y55q7XLOyfKPG^J-b>BjJHa@mdid9*N!^ zdPAZj)}Q}?`d)?Gv}G9hf=$}?N`SlQ(Bl?x549@!ZFzNa@&3W=8!@8xU+&i`x4(+7 zbE!lZ_p5p_w)qv|0W+ErX^;ROt_wUO*6^4%!VaEP*uyTdOC~`N&(PvLJ?u4_e*v)s BhRXl| literal 0 HcmV?d00001 diff --git a/build/classes/Calc/Calculator$Operation.class b/build/classes/Calc/Calculator$Operation.class new file mode 100644 index 0000000000000000000000000000000000000000..da08fbf5bf98fd2c523aff69584288dd97143cba GIT binary patch literal 265 zcmYjMF>b;@5S%q&V+R5$=~F<1UqFRqB?SSA7c9<-fDWH^cSPcA6g+@OMOh<6Qp}7- zyPBQ7{+urWW_U>u5k_-1W!})yaIo%mS&QSavsHpNVYugS&J9=Fe7V_683-M&YjaW^ z7saH|m4$>a`?+Gr2MOXlfmpF2WNUkLr4&0Ogu&mDX_HFmeuxim)`tYo_xZmjgx-5q xiJKetUNkj*REsqpE&T!@E!jb=K2euO=r*EgAybafgc5Pf4iaqOC=gi<~VB_sio0Exu4fP{i9K%uP!%6*-zT34<&T5lrpr;w09 z2oC%JeiUNtM5dQ;@VuGXnK!%h{QJ+(UjSaSc+jH($nE_bS|fc zP<54QOIa9`u*>q z{^M_OzZ5ms*>1yT`-D56!ovW29PO>DaRWCw;=Y2F#bv)j9DwOrZf?!#-!bMSLH{e< zcIOAK*!aw`g?vDjYk_A4adTBy5(l`A{o*{p9rmnZglBOYoB-~w2@V)-++%B@iTee% U&|z$FriKp`x~_24YMm9bZ7 zyvod%jVq>*+NAN<18mjz$Vf^DQyuP@lx# z*vV(@^qqKdthaC7b>E0jMVq33Zf9;RiOePcV2t(EAXIH6E9;nxbJ;}LtF_RNvhuIn z|M$=@)e38;Qut$A_y{}8_{y>r;uB-U4Rc)-!Y1+RBnr*@RiTH7*CEAI1$=lRdXMN0 zh>BQ${R8TI6^?1kFyOIH8!rTSj5a+k0Z&n@l0TLwCl~G?Tzw-3)c(u;Qswp*@ntTR y=-^pZFT@7F0z79%GawBTz>8&pO=1mOv;ns9vcfK25j$iebg_#T=jmdv(fkXMRfSLh literal 0 HcmV?d00001 diff --git a/build/classes/Calc/Calculator.class b/build/classes/Calc/Calculator.class index 5b5e377c4bac5b80fff22a67c0035f45ed512348..36be56560db488c8e43bb76ffcf2e3c34bcee0d9 100644 GIT binary patch literal 21553 zcmcJ134B!5_5V5NP4Xs_mt>M*6=hM-5H`UD1UFVi!y-{M*s4P^z(~lXlLSHBi{dWU z6r$<4wN~p|TenuK^8229-@Lq;iNBx!|L6Y)lKbAd=biJt z=bn4+x%a-uQ(td;goqAu29}YK<5I+<5-Me?nx1TF8mGTHTaq1_EK_v$+=ip4&YeD! zsk*+Pc1jFSM?ET|7*pwi>DF||!Awr=$b~A_^QeL#?+^Fq!rqdY+X8T z-r|!}O&wEQ+J(upa5F1bBwL%yX&~+D(QXPgqKFjY5RZl$h}o16QRVOM(H=A$Y;B$G z%b518EtcPlN>#9@M|-IPH?=C&)Y*|z9V0!eqftziO`X|ns(VJv8p8y03XStk7?ZmkM_~JvW$xANM~BLANKQTf7M;l+18xw zNXq4xq_QCG8!kVCq-ckLZbx)Rb~MkPdR`V2=)=Lt)o~&NfW&hfM3- z&J~MOa19uyfM-f^lSVF7xzjwFu0qQ*t)?LgTIn-Anni~hsWZRVnQUp-{w$JeWz6>I z2<3G%t@Wc zuLh5fR(n;d+fL7{Xv?&sciOdTp-0Ekaj06FLQQK2=<}1UYPp=RB~R%Xr!~oRYbpyL zUPQ;c^c|1BODFhn#^td9b$hC#A$=-@l+@0iJ#wMyImx4>LMUmn?GbA7s97mx$>!#n zD-}--#_1A|mJ&R%|BB@D6x22)JC03vEW;Ig6g*6m!anLdQ!jl{OmgXDrbM3orge67 zWLnj6T0B}otr!T4J6iW<>T4bk>}>g_C}W#P-^($MS3yD&bs@&dU)dDdBvNF31rMP{KtXU95ys zv|vVhrIIf7=(2#6=}^+;9{oT`QE(YIRN|E$T@~=9T9kB+N7pLJ1>c;`7W3>zkFLwn z=C^dVE8h(s-Kew}_>|Vrxmd|Jd-TJcM4$8{k8V|xYBo+?Lrg#RXcPSeV?WuX<79p+ zyCjockwVCr(977ceX8D;QimBg)jU+6Zim|%-%QgT9^FZIA^O6r@~fG4_dVwu1&mzi z(mi;#V5kotAEUeJJ`Mhd#VAc(9z8%0GR2`|4&qfRhk$8Vk%~NqDI*s~shf%Sj?q?n z$fa!_ZKsDJ%FG2OtXr2xKc@UB(Kqbye$XGeC`yk&&RCW6Gmm~wzkp?%>@dY385DkI z`m$uU0n$>fO{pm(F|Pj$g1Q(zPcLfMyoAB+`%F*?d%N`e+@tlGrArYugW4FqOfQzxALuog{^-%4 z=+C(j8n7T>CEMCs0K24i)+}w~lk|p1f1x*F?hZ`#I+sCy?X2)L={F-rZ_(Q>{Z0Ab zfm`+T@oWUzr8=+lt)1P=gD$-XZw;}xw4|0MTc&20cCLWm&s^1%YSZE3(g#et_3%y2 zB2=zOb)=gDmMHxl*k@+5nXF6yfQhVc+g`_1p!q_KKBAA+gr6|A6c4+?&M1zo|92Ff z7~*u2hKtWV`WO9M-O(lvOat-*@X@JN9kbG@mS#*qJLo?yed*Cx^fjg_ZG8}@12#Je z>8;wh7@tYo;ET+vHk!*kYJg>l%aOu)R;R?47&{aNT6R5-av72`xCSQie58g|X9_O& z*i$wyn`%b{ZMQ-I-w3JlIBseen>i>~o3^zHkNcQld9s~)bf)2c9`{$G#^hscTE_!D z-X%v{fXq($cJ+8S6&>wJceJFYC9^IMDQr=Fa{z+{3xD1THEOIL=0Us5Hz^Y&!k&BV!S^epk94~ zJ~GAQ1Nk6iWq71MgRBC>#{`W0hY&E7`w)*0<*5(}Zdf|iltJ>Tvr?pXk>!}~@eJkg zz_B3Jo<23XSYgZx!bV&0dcKAq->lyi61)iUV^}^C@2AO(3 zBJ;c=0{=XZ=jZrmWwI&D@A3ks+DvxoxYkt1;#9J=eOya=vF2m&{A_aE)Wz+Y7KHcu zMHmZ>f2rL7t%m8Hew6^y>t#!ky*n>FkX zwjy(JW3eHRv$YWKGRF0o|J|&{p|ePgkxO%iv)VjNzOHt&-_M;MujErSRy3n`M~0db z?sU<0_xSDO&oinc* zEO^jZEzL(Ffnh}aG|!9j_krs#=dIVA=07n$kJq_;zQ-5vg-ip(!`B)nn8D*s*%XFD zJr)ExgO15-7~Fn}oz{A{u&Qry`I20sp+Kj1X4`eNT+ElL8Id5R`Erkcz*pF=v-M`p z6!@B@`7OK3nWj!eRCG+rwDnq#H>jKFc%F?cNhgNGl5H+u7ltsq71ij; zjf@3Xns4;@CcfEfpOefYb;#Fl*?sM&x%{JEGRFxqzJ>0K@{f_LO?MfYZc%c%PmDJy z%biT}*cO-X?uBRH7~iEl_bJacE_e09vtNwwSDwvKH8ILtP)v&QLnsc2@^%zsT>fb< z&+Q-MhxNIifo0z)Bah_$qWn0D{iFN@icv2As+Z>`#`sBn4(TF~kMgr9CPeu+DE5gm z@;_(PIA}!PR@CB2F@B!za~T<1Q5}5yMV0yr-5VQv=`98HZf}+7pLgg!9daLd{2~7x!6ujY&&lXC(v$t~ z6&eM0g<`V*d^Qtb{?VHz^zuhW6Ln!`#wf+Fc{)d9a1Q3v^w+;V{z9ExD#TZ z&urCr-0bpydJ_!S*rDyilv!*|^#50=6z;8ZVoXRYBfV8liix9@E+Tq3TpWhEtj(Wt zq*TfDsyT&l5-`UZK!gV2sJTR(H^jM;OsO|nN` z3Kmk|!#*VjBneOYNMB5{Hh|4fW|PRQTg(GY_4$)R?_%=9T9_wK8r1cd0j>=6WEUC4 zG~%1ullK(T3Ak1;F)$q(a;ShjMJJbUY;m4I)9T$k87!Ir!e@HsNWanknm8Ay!woXm z8s1>JVV>+Rdmxv#mb0tLj&w3-yHWmbQEzezn1N}8?CHv0YMNT6y}rpb1A~F?#O*T*-txCr~HMfES7n`{gJZDL{BE^iayeYY!bTyGTD?{%W|N?)sT_jSKB)=nlHf@no(luCnrjWMAv%dvcWO z_H3QmooX+W207Z5V?0?X$XLVsB&)IQvjRwv*}^fczI0~Xd@RX3umVpdS4@dYBj%Vf z_%qbsHyElnF*#noE;1P9&3MwL2LzE;5XyL_WIbsY7^LLb!)G5o6Be_EF)5a=M=<;vWThvkXg(B4 ztx6+F7Fq4dsY=ilmEAj*)8uql&hX?+?RS$7noKk_ubEw22!Tff4YJXd>pZz$t+b2Anou+B4x!(UGN5S4 zbY`2du1U*{p4=qJ{#;P)K0^NKOR&cya*HQFGNZ{lZtl#WtO2W#B$hzf2p?v9!E_|- z+qC>Zf9K!sz)U%K3dS5XA*aMPcN3mSz`F`EAMiw`XPQx2rMb7&bF@zUSb!O+bCPZT zeT^=1TNWm>X|4B(PSXl3LMroBLnzi~Shkdzoi0t2K+=sEIM19^$FfYbh9Yb$rLqB+ z=3Gn%_yIXQ%8SQ+F=gaJXwW?u1SCDz8d$XHWPA{F5Bj$?b&9!zOE;&Nrs3K#IH`Z; z1LDeLOD7CaZbR7&%i@`1hJY#Fo?MxlmCm;J97*ZIJqSMtY_0xDkAqzdpu=x8w%_pv zd~Q}d!aoOqS6KFTSCB7PH7(2J?_B6UK)i6@3`*=y5L%tW5ZN_km<64!9a!Q8+ji*c z*y0rS!c$n=!A$-Q7Ch*csI8d?%atXUpj(ve%5QW2ZMvgSqQ-82sXs8UQK2axTKB-J zcWiDmVXPev^%(OlQ(IdzI6FhW3%i7&H*~h4E8E+TO=erM8QKmZI0kK6mTFqAJ0^W$ z$r+grJJLe?`$IyLxs55I!DxEkNv%X@`>Hg46|*6!G@DL1A}dm06a#nR!9qVgp(ho+ zR_IYjQH4svAx5usoU|0t6_c60ifR~>!a!etZxWr373kDH;4ph(X7w-=i&%uSVACQL zzHGf7g&2bkvJTZ_s!%-wO1@MCeif=z-N?&VRg*{cS*@wz=ta#^ld6!Siaxm=NFyGu z+}^HA^T{)^$)!t`EUPdoWHmNERG@~KB7s_=5vr)7rX{&zadUDwQZEzE+lTLsNeFQv zW_@^8TBD>n^SAqmV|6M(*qDnY)SQ%_^1`p<(=wS3q%p}h8~ECz@&zC<$K~a!68Tc6 z%C9{6SYD3GPNW_@l&eY|jyd8uu7fuVmO3Rk(lE1(8HMTAm6_!!od4@N0Tw;jcnr2t zt_?>|pV6v4+$3M^!|OAd<(+Ne{ULwW2}O>)2ajIemgJ=kA&R|IPa!+n!fxEgCjWUbV4X zIA!%~1Ct;}nca#r#_26dxUf!xp@nEgUaIaoSihP>ncTDyim=1|bwP<=Ru!xxTnEcj zvskpfm4`ClEnKHRVnUIt<#`Z-zV#s*kCTmhoUhlS#5)?e5`F8!lz78JOHJNPi3|;8 zOka~hiQIxJiRD&PcN^~U9!cn4^oP2hju?PW#H8 zp!S2nzEmZ5$=&Ejh?aY_k8}EmLo@Q{Ui1$R^y4b0e}vIr-mCtJ5Hkt74uJm2(0|~! z(@%0QeGMb2DHr+e?^ic!Gu77BjNVLR&F}Gb-L$VZ*c#I|cq*Dbjmq)vO*PGc;+cU$ zG}|^)4IuZS!&vm`62^^6>5>P0l`T*i0jZCw99svCwRK}QQ?CjShr-!t(1^79p zn%7s$!`;+~n-lS~xX1K+LO9WCIM67#)M(m;7Sag3IW&^i;B~jt(5I)HD;(?fdFcBQX4TMhgg_hO9gK9CtdyH=f)dq^v#*mP*K*%G31@a7B5E-n2Z-9Ysgn@4gH9TzK zVkg%(;jDM^Lui!?o9`M={FKs-P8Th2XpD4GrlGNe6LFMu&ru9;rvN^R|T^SN}5{9Jy4Vf{26C6D1s%+xr7B0K2?Ds@R* zdEEZPaS76b-M+@Fm-0CCzi9{_OXj+fj`Cftf1dy999G~mcJ}%UaJ&gG{wv1ITbQQb z4mn}}zzMNu>&Mxr{9)Lnj$E_3o3?DAic$VW#;R@y%F;lrbT1S5QAxC zj>AP%ddzYuOD=r~f|YI61el%ZOB#R|igttcVd&T~=-sg#!JEV-bTC|HIx@W@IYviu zIUU1ZsAUU-mMzpbl`)9@mJRc&{FZ?ZAJg~k>=4I3eH4F*p4QgXE3`TIHGZyM`Hid6 zDs!FdxUKZWq=-`WqD1+((le7wx6|{D153Bi3wrsoxqL;3R{xUzk%#D2hbFmo{oVfV zMdvLkziI=O_jk9_>zk+yl&$nvMD9%#pByohQO$?AHBK@)vYkF^tQ!LjqehPz7}-Mq zoUAI#2bO5Ai7RA*pBjhpGqU^9S+%s5*1x#3jVEKg#rEuq2k zE6`lLL|ZPumZ!{I^0eQXCG>w>;Sc5Gc*R5pYnvxBR( z!PUCp>ZagoRdBT?xH==a+7Mi2f~#zB)frq}A6zXDt}Y3#)}u`Z{${S}x$N6>IiRPd zgK#+*O&z+KhxIUw=(((|EA8enbqOBd&HI3P|Hf+mG~T?0Cw24Wx=1%4T<3K2w7Lhm zbUV+)>>T&vec;#Kd_+L2jpMJOAxtRWQP9}X%}3)dW}ezTj=#ZEmUciKe}kt$>v@WH zLg#VnFy`sL@jmf>hVyt!`%YtmPl&{8w(v>atkaC)tEQ)`>4|E3(XcL6vfItewB&AH zu3#){rqRJZ$f5BGTljn3+yUZezP`_lzLD|0;-dq7p!xa+1o{kLHSM(j0)3zP`aTQk z11t2!C#b>$a|+?D#xzMt)mTkC6!EFuyvCAp_Cmf?0Q*cs%Cpj0 zK36{Ivq4SpIo-UrP{>w3x0^3A)QgdtZQ)D1c|C4ns4G#xF|IL{8(~Yw*}~U%^9_cu zsxdw*KFi?zp&{IY{D^NwBBiJeCDVuw?IU8_j9ji5K1hY|4ObETTM~SmfuAoV2Orch z{97#iTP%E3=EDaeA3g}16#nf2d{6*?Q5gP(#qdEYgm1Wt;9r>FI}H4MAvySI|qxJ%*R6Tk;015dg+jQ{Fl{2&$LH(W*duTJp227kVg9DY#4_^-D3 zueSJ6nU5cYeEcBXulOGb@PnfG-wxwH+u-jB67YVI3h^7RBK&73_(6l;3dxQ99DY#4 z_|LZZ&$jqcnU5cYFn;UrAR2#P)Z_1KivfdF2-t8H0bZNnZUfi~DFh5^81PyPc&!DD z%6z~e6axm)cz6i#x?;c}6#_O~MS#~Oc&hf&awIEY$bdU;LV7Q7}kV)`UrUh0=q0vDN zw;*F%kg+X5Wqu1lC^kBX*0JC2aqMg{Vvq_E8?GY6*#tjh5L+RIh(Qe_&RWD-ix`#p zh(Rbu45D@H5aP~a#2^(SHe5xBI}`kzL2QK-A_g^#xYHu;w1`oej~Ikv#31^P9fEv) zF=UVmAsenD$k!+Mw+6BmQV1E;Fy!kksOsMH5O(Bt9^J zIidjOncxG>cLlpNi2TJ2#>$b($ z-O{gHcFk3Q2|IqKQfjnvI5t|&+}SOt7}qWP)OE}L!Iodi{yYb}uQ<--6R97cgw5?F zjpoHPk(+2LH)B&fg$?Z`bRsXs7f;Ku^O~m9`DE<6E~m@6g|6cjbQ`zQy_}(kxQ!m; z@8MJ>OD}Ufy}=#yK6lb*_`;3wjaxb1`|XF%)`sz^_yBYbKFK_dr{NQ|!}v^|%V+Tk zd^R`nId}(dEo#o?_4wlKMm`@OGhKl1j4tFC@a@-Y_$cfjd?~&+xl9J}dVF$lxs2i; z$PB(x>iH@;iLb`X&DY39e63u;8{|6PD4Y3u`3>JFZ}Ls@Ip6F=_!hhx^CPE@Z*>mk z+nm|_W9LNP2~d9#CEtO&lHiVWth zkum&GWMAGEnZny6_55(;yZqD0a{fi+9DY1<75_5w6MiD{2tOHll7AKXBmX+`0Y4S_ zgrAP=;Acw8`Pq_P`MHuh{$0s5ezD{jeyL;`zg%(#|Gs1$zfy7ozglt^|DogoeywC1 z|FPt0{!__o{O6MQ_^+kHZYDZUU8hXRJ6*9iqoaFVy$E*aeD zcT2Y73F)YKMLH`!kd>7pr&N~9s>)%qx^izhwQ{1YsXSOttDGmNSDqwiRJO|ZE6uk_m3PUy%3sL&l~2h9m9NW%l^@APm7mMSm0!svRh4pS)eyO?YNA|Tb%gw&>br79 zRl8hSwMMS0x?HZVx>>HN+9cOj-6I>S9+iz%zm@B%{v2ZefozH=a;-AXH)t)?3 z-A^8^9wCocA0$syH_ET7SIDocPm|}WFOuI?Z;%(O@0ORUAD5S_pOfELzb>y-zay{W zyZhH_`p6$^YUNKghsd96X3Og}N68yCN%>1nTHdT#CGXd)lYi9QEFafAD4*2)NcFoCUJw4NZjW1N&E!YcY=P8(?8MW4Cp!FOFUqYMiMESEB__WgVj*qmXjPy$~S3msg-fPZS4|9A(ap@H(m<49Nyt;u9Pdh9%40vv||h2n_fSml@9QeW7> zI&z&+Aq~+$L$tRB{;^lV_x2)qECi4H_JaS^tKe>xv4bf(hY&NSM`si#AnIW*ImYv2yW3Fk<1 z(KHNVY zj}146UKxtiq zWm1vO6R3}KA`Ny<3h5jY=p53U&UXTxb9|kBA>S@UX2)m7=h_zcw9W>$CTMC7Y3Uni z>D!x@cmD@1p_UbDSqd%7zP*3#Bf{h-e8({a=Fe`+?M+H$@}evZ_!l zLblTu5*vO~)J`z^L@on0{RRm(@Xvaj6+t^G$}#Gq>s?S9as(Yn={=o;icfT^!g z!&-r+Ugyhy_A2$NLaA#Z_1teMH7@$u2}Y*A340hoD2yuYk!ycO>2A59TYgv|A0fFC z@2~Wrt_o0B$tRjxP((h37?IE9bCi2hjW`HPU-1t9h~MG2_;r4jU*zZcNq(5`=eu|l z-$HlGzrZ_y90XM4T}~-%x6g#@<%@p#s$ahDmv8yyJAV0*U+(bBuWYII(LbVbU&{(9bt(@Xh!3?(oho7{j-Z$LZ$`pn?Al2eq@* literal 17419 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 JtHoLx_&Q+)sc diff --git a/build/classes/Calc/Calculator.form b/build/classes/Calc/Calculator.form index bedbeaf..7ed5165 100644 --- a/build/classes/Calc/Calculator.form +++ b/build/classes/Calc/Calculator.form @@ -929,6 +929,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/classes/Calc/CalculatorFacade.class b/build/classes/Calc/CalculatorFacade.class new file mode 100644 index 0000000000000000000000000000000000000000..c099a4b7b4294ab156cdebf9bec44ba631b28945 GIT binary patch literal 1830 zcmaJ?ZFAd15PmL}BU_Q}#A$IuNgJA%Itj$QlosL;XiZHFPE&AjY58 zn10Mpc*Wsvr?PkOSXh!_a?5sYxy_I&ueJ?jkkw(Bn1abrsBy=ts9WFR((@UnIzl$w zKyud-4726c<~fsU7I_qOOq-ZNk>TRG_jPXZLvl5&A=H@>6h-8MiHmrJOamd?c3>Yk zDz9n8uL%AsyePP zTpQRm97lAxbKCFqyTX-szqdqB1u2rg3npI2HHK1`AB&pjT3kM`YaN@8ZUpVmo%Agc^b|NU`{op-9yYsrIGqRGMU5CH-rjDqo>#yW(EIdm#LM z9u}t9^r)n5?%Qe~A8PW*CK*cS>l<|e!R3P^?>m*uS%Xbe6~FcT?hvWc7)4Z;3|a52 z=EQcixD1TbMTYEvVZ!Ut2M{qy(1}8>CAoFH%X=~B>0Kd@yuZdYQ+}y_@K9J_ryCEm8iv{?o7UnABQE44Wn>7+&y$e zu+;Rt<9@F?n#j<}e;oIp^u!qRZ-(rnkwf3y2uYIGY1vYcNM^%zgmCBUo%|!e^Z)vQC=igo+cweZK38At)H`U%(V)!ZR=5l8@jgDF9m8gVbt}fouKkLf_7t-NAT^#r;WL;W0?8&IRcw)k zBJ=}=Ow)65{S>85ZBBcMnHQLUxc(ehfoE9!b52`Y{v9hR{6uD{kY|w?0wrQ{iFnS@ z?{XOCMg$dyAyE3O*behu#7FozB(;d!v`UfhJno=INS_c^2JCM&davUy?Q$t{1i65W zRnqk&>6^4uf@Du0F%(^d!o-M^_X3v@>Y+6&~Or=KcjB#jBG5 literal 0 HcmV?d00001 diff --git a/build/classes/Calc/CalculatorState.class b/build/classes/Calc/CalculatorState.class new file mode 100644 index 0000000000000000000000000000000000000000..5ecbc8d52f4205dc29a95ec0f770f5875502cf3a GIT binary patch literal 349 zcmZWkOHRW;41EqsQz)NS>KPDh$N?%=6|72&6sdbRwZc@>nKDc`919M>p%6|~2^2QA z{A|C^*Z0RKfO|}GB!ualZB?|Tu^fFUBS*=R62?1z=fbk9i`8Z)RU{0(TQ>WR1j6;r zqW3vl{63U17+243*Glsw@x^bSIq+Vhgf~K3sT?8On%XGq$h*}+0!QN=A@PS!=;5_t ztH;y-LM?6X-P{VRle5w{p^`^qL=&}dt{z_>QjDG-uiA)jz literal 0 HcmV?d00001 diff --git a/build/classes/Calc/Command.class b/build/classes/Calc/Command.class new file mode 100644 index 0000000000000000000000000000000000000000..4b7261d360fa38fbba74de082e3e430f60e50f47 GIT binary patch literal 139 zcmX^0Z`VEs1_oOOE_MbcMg|_|#GGV(=ltB<#Jm)C1{OvJfvm)`ME#t^ymWp4q^#8B z5=I90)QZ&P(vnn024)S-Fh&NJ(!7*>Mh33n{L-T2RJY6=pbQVx3_Xx`Hbw@ZTA(!y Y3`{^HSsB*>$cMOcW*1q=PD-cNDu^cP7ClD`|_EVTf%0Sx0J1_<2YSM01Yi_683lv31 zI&FbOi&lZzdh{y~JzEB@x1pmmCT4I!Amw(ICj-lMh#Gk|PA#Eh*2Ekx3Z$Frnd_+? zPxS?|^)rIIfoC}fq39@@-|mYtm1~i<&He!WjHMv{9px#)cim?fiJK+ zDRw+v8YPqsteIHXd~zY5Ez9Q>9>2aLRwdi*hfd%fYyK4zReW$t^?OHCy)^-D9Btg9 z%MtiUm-Df}_S%E9QCBvX)13| zHf>t6b+;w$ed$^HJTxYPLyPa08&W*i=Ns(X$0|5<+dI;e9mQs%tD$~YEe?aglItB* z92GQ`bo|P$+w)qguKLQp?>KG{c0Tmyc#G^E}@vVWne&ojj%V%R{ zIeqs?Rio*O+IUm8bnglLHrfkA#|UC80*n9e$|V@pg=<_OF%HKk zNFu9uAm=`-7g{K}uR_UP6iP0iP;%c;#u+z-&lvwXPrp+dl&j@GAZat$nEh2LBB*ov~_ zHa2)7PRLe-n&uk|HO)94YMOH*)HLgYx15Pg$Px@o?eq$%Hp4Xs4VA^8CEwejg8xDq7TrnBw6CR&q|o#JIK42j4CO*5hnnZlN8qf^ zy@^K)X^fgk?p;~t50!g*>;Bk%_e1ES!E57f@eUpG>e#l~8!!@M>Gd_}Di3e6bzz{4 z4%^x?0b6*$9^oM#!OM$dMvuA9ZuQ%D)NkQ`YOi0T`fF!b|6tyO(`w{7Ro1NW0~)zz su&i5YvH~9CN#3V}r+h2mSzb>~Z1ZKkz;SQ{c+SVY?gb+uU|T@RiDZOIoI(md#*}lSx3m3xP;3Bxn`JE6u4!))p7%+-9)a(2o&@^a0@b=)8u`*KgMxK2a* z+m^pesqIV0ZwnOim0nlk?Ntt794{G|F!3@b1umXNC(tLGP4beDd2ZC7s)k=Kd~RS` zU^t*`xp@jXjaveuWFUXCTkF)jgrrgA?rj6FlCQvby<_{a?OB1uU*8#c?ZkW4I*4t* zp|_9Ic#Bc)8hD!(Kh1gB^W>o}OBQ$Vu5OxnLdX}k$aKxxairhz6qydubc?tULl^P9 zR2E3CxJ_CQRxL+8?CjT-w<+s3HMy$WkoK1JEd3oRlRle-MG4D&zK0lYXkGccZu61! z3TVq^TvVl zJgcdANWyIiT&Vf7v9~T;QEF)x@xJ4GZ2L2njIe5Y`c=4}i-nE01+whY2oS;Nqc-Z& z$765xDF1`g^g_dqCN&#Et5}-Sk@JMj>Z+2od#>xZeNVPR_S$LaVu}g~MWJ3?P!1wWUlEj{({MqoEb< z;(dP6USEogv`o35W6Fh!JfeADkmD$E0VBjY zO88^EU#}ofG^Z4my1ACH7Ettn9w{WVnM~${t~IJM_z)jOIn8s`pa#fOF(l@EDQ@!2 z@!%XYG({EbbcqU34I)0oMilWzU<4!?QKv70^fez~Z-l+@2x)wbdFnJTQvoZ?;dk75 oe2jN~!GO*o?r4yOPpC_vhE1+%?r!t>6kqZyOX(|ogF3GM3*v0civR!s literal 0 HcmV?d00001 diff --git a/build/classes/Calc/IdleState.class b/build/classes/Calc/IdleState.class new file mode 100644 index 0000000000000000000000000000000000000000..1817216f3918db8c882140a78e2664a1a8fb864c GIT binary patch literal 1143 zcmZ{iU2hUW6o%hfpbM1pRa%Ol)oO)OK`*?*kC>{72^A9>jF-bQq1$YCaalRu=- z5ZHKWyLRweAX2V$l87T=BALP_QUaM1=~#8Wj2szwzCd!Qf_L_C;K(b1opSR=uO0Zd z+iz4lCej3jnP*o6`r3gER1#Z=X!%?Ud29>BsT7_Fl*-K|P89MuT&E z$QGtW%_$Am?77o)fy0%W8|#KaHUXAEZn;Iu#d>z%<`v{uGl@S{!MWG_EPZ*Y0_C%! z1JCc*TorVcbceOJH}WmjRAc45bzP4`wmp|og$1?NSoyx)Q-p1LZfl_YFiODi24Oqz zzm24$lUCcQbOcP#J<(I=#ZPe`Y(2L0d?+>j0Pp}szB7Sad~`8dzBR6QxU16&?LE4N z_|6{#ce(0gAcA{bQ_}$4$3Az0Vh?$ulfTeLXmi!$3C!wGY<;~(W`gXEP&y1SNsJ?l zL@2mFO_~WZ9S3+6LUMSFLzeJ_q6vd;&;gYB>53|}0!MTH8}2oKrSS9uN6b0ApczM? zy3DCk=U>h-o>E=+`GTLZjTW=ai7(D}+1wvw*_>%NuJ2h^(G^Y0(iBkucBrOhZaovZg4+D(w#>)=c9gwX4 zkhXuKa;qwq@=&SjTYps4v%A-08V(2B6MH(4_895j@$J`6`da<5H7FR7? z%VHLD0&`F0NLC!__A0Go->AMoTn~-FVk4B;y0Yilu4x%h$$mAB9Ijhf$YK#oR0;z( zbgyT-y>pNPxo(70btjl}mtkh;>_!$h@tQ!or%da(-`0*membEDOa#*qPp_I|x!%a) zO{}m;eR-s6+U-d5gKZ8;`9`|N7bq6$)21xLG&6%W+_Lai7VF5fsISOgz#0U#a9n0y zn08S-u<*9Pd{~t2?nUk?6a+-sLg`G}8n(|Xlft`{-nOvG!iBcGL&r>r-xG-a^RtBy z&a8Lr(S-P;Kzy3QC-ibpAW_p@B{18tUG;d_Z!2$KwjFYE4c(E>f%NR)JZ2`$q0Kri zN4>e+$tnkASD8cI-IJc|E2BIr3&~aIYI6!bfMPU?05e(^H2&7eVqcVBDc8&3`* zoPG+AnEaDQ^TCg6BK+>IiP!Oe2H$o^`bbqc;vB4KjOwz(OU6s{ z%VeL&iczG8((O9R&o{I_8V;%xiA9bkIWHOR9}m=|aIF4h!b7wDRCP>sa!kiAI3G^S zHbK#{k6c%IHAnis@-2KPurZa>tDsug7g+g!RW>%t3%7VlW4voX9DGBNe^uHbW0OOY17K$R!z2QLRb-61{0zH;O3r$Ib)t7(`ZZ?&|Z zKZRBQ16S5dr9UzM49oeA=Xf1>hSiPVs1n7yMnmu|voOcT&WABek&E+~t9)3u7=~_f zFGOzP2EHT}4{@YpQ~*W5Hdm6W_qoS{r-}a{-Ji${5-XSg#>THm=H59WRSc+dK-~_g zNP;K0cv(JgmtQlLAxCF!Kd0V};QRbbe8v@;TNrYGHkLXpuxBlTN44YE=sz ce#L(bbv)pnBC4;s9%7HD45@F?!uPoO9}4?^L;wH) literal 0 HcmV?d00001 diff --git a/build/classes/Calc/MultOperation.class b/build/classes/Calc/MultOperation.class new file mode 100644 index 0000000000000000000000000000000000000000..0fd7bc14548674a20c69fecffb70c6b2f7a11149 GIT binary patch literal 511 zcmZWmO-}+b5Pe-1mM=jOKTjGwfCu&m_>m~do)$6DaPKY+lq_9R3WxRgqoYld9A zGxShoX!Ljz`~78N26Lggk*V@fW~f>IhhuPi=}0itL#f2waux~w$fJaqMwrGt8FDQ% ze?z)vA{PwJ@PGLWhCH9olPAJ<5Oe|t#_41j(bRomCh6#&Yd#Z3XsXgm^|-5qi3C@R z?nAoNu?WRVBsWT>#?EYe{d(_8Xe~#AdX?AtfwZ&!d1yBi;1nM1jiE$K%#e0RwnCmy z$O!Z2uV61WTqT=@fg-lZR@Vurp-vu6j~(Q!_%{0t;@sBR^qJ71+;45gYERbjjg~Ue ez^<+5qDeOgd!#5iM1u%me^cOqkl~Q5gQG8lzhY?s literal 0 HcmV?d00001 diff --git a/build/classes/Calc/Operation.class b/build/classes/Calc/Operation.class new file mode 100644 index 0000000000000000000000000000000000000000..c6822e7720d74793d4dae90d37fbb52db74b87c1 GIT binary patch literal 170 zcmX|)K?=e^5CnUoNi>T14852acoOy|5q!ZU4w|qg%eo4F&4Ul{QR3{y!%Wk3Q~mkA z-T=0k=ST>P9owd?oOllH(B~KvmK{I1wA`P|s_vu-gp{4LPt}z%YonFDgv)R`u;;4; u@izjoUQH;D!`(MxS}ThGlQ$8XX$2#l2S|rfWa@Ku(*%qg?IkSc+y z^1ui1QK)AfWYIqC&YamZXGUlL{QdPCz#Hs#;i2K98K8x>VB<_J)ht)V$?P~j(@804 zA7({Xz7;e^<9P=U(DBg?&_f^?9;rN;9WS(1WoC-^Ix)d{^PK@WYb z``8HZ5CcK~?z5n!7K{8F<0uTrp=TG1?y2(=uemDv9@1ToU<~BOrr9+ zvYEsGip}ygyAV9Nr&RBLz&$_e^3j5ii@CIk zj`ULJ?~1~dl@sjPivII*sjbaYP3`WAA7*aBVQo%5e(JigOP@W^5uT>=n!n|63!98v zL?NTc*qvNMCi_3(Usaq(y!&YI?y)mK2W!|S+Fr3S#A71%RjTxXc}oaDdHw=ho%{zz zClXA4z~6g)gS7^}6MJw2+T?<4C%m)b)xrUu;#u_`;5jp|8qx7s1`EIo9w+dUQSgel Ghn-vCN`V>x literal 0 HcmV?d00001 diff --git a/build/classes/Calc/OperationFactory.class b/build/classes/Calc/OperationFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..45722d80a7eca0f3b62bc1926313b96af3efbec7 GIT binary patch literal 1466 zcmaJ>%Tg0T6g`~>6UPK_01-q41cXG0?*{=CqX-(rswkGaYLc!nW|)aH9h5(C=}z3a z)6$J@ph~KA;m#lMQ(S3zI}>0)%1)iWxqTmf&+YE{@#o7|029dR2qCN?5=Rsb49!pZ z3Qt?yE~V!epNfKHXc#wbQ%*93hlUq)#Be}^9>+n%ce&@KYuY7-*b?`avQAOd0%l`q zWMC;3*Br+o7?e;vt8&X@XdBAy-7YiyIEGe=7>VI9L+JbK7>+2pp`nxEP?lST^i;7p zUlA^sreo{qQ1u_%vgNCb0b7@{^)MKhnv&XJdy?CdxDE!n`n}2w2k6(A zbPV8>I*XA#?b!-h(2yomjn8(y)4U)ZcaDpa)9O+4ySNsHC3|ARiAJ}Evd2aVOTbE<3 zhcz`|O2>6%HQZ2#bdzZ8RA$;MPFbY=0{wH_?&VsLZQaq|Zid@MOL+Y`$0=7UnSYrE zR(1v6U#*CJ+@A#e{a3f^YSdFupRK$pg*um6+ZJxt;+`iw4KoY_|8Ux`R1LQoy8rJ= z@6+dnUX0SmL5&cY`aIBlnzS@YMlzb*0Q+1spP^ZqLC^dw&2irW=Ww311Gs>Tl!Ss= z9AWwa>&aYbBDD_fBPldEAwozIP7y{3V}zfC8Nx5ZLdr<2qv;LO;fZ%hri_-F)*B(M zD`m9Rw3aAojVYtOrbQbjx;{`SCe=hk?cGfnB#aU+ZldGS29AE(L>I|!lE+E*lI$bd zPjcW<@(WG^8%TYlh%gk}PT~vbcu8Dep%H6n##8q^T$Z(A?iD}Yw`gaSnxPy+rj67)M literal 0 HcmV?d00001 diff --git a/build/classes/Calc/OperationSelectedState.class b/build/classes/Calc/OperationSelectedState.class new file mode 100644 index 0000000000000000000000000000000000000000..7ce0e10113ae727327d4be551e73641de94f14c5 GIT binary patch literal 1236 zcmaizYi|-k6o%j7wv=uu^nS70S}#y4)Jy$>ni$k*f?`60@#6p!y3KYMm!(O6mS5UL z6Muj|%J|MMZd)Mn!_MrSGv|HIIWzP7&yQaKUgCKMF~kidOeB#K$eqYDS+S+lt2Ejt zs^bf!URaLhzY>TSimeRNm@$wsF$+^*z9#KXMGr$;`mQIC87TjaHR#*&Twu9SztU^^ zp5^qa#g>6AK|$ovd7rkXFMXB49O7C&Z(;$90%D6gH zWg?_?1oGpZqFl0T^(>y`!ek^5;-m79-R@`U$y4PkkLm5YUa#yZzpbP*C^y}q*HLwK zrtH^_;4z_rA1@7=7Cpq)}a@^sn!dYnR-X+9${={&Xqjm#v>~b{24Y-H< zT(Qk~NRJNw!a2@4U)sNbQTmCwua}s=K<-K?8*DI0Oe2SxKyW(@8VNES1r!5F9(yP; zg?)<7#ApT$z$1P-qcUf~l>hPH>j$ZQn!j`f)ejYXBS~bh0aFn$6#-K?7zZ9O^d|5z zo)Du8KIEsRCpxtla8^QR#1SKoE+?rM>vr3OpXCcA zn)n0!QO0j}>rz@0ALe$>obPgGe*gLL3&2b4q!2^gK*B^469VZY*_UNoI_>g)<484q zfr%ZX`n7+4lq4j`jgP1&@oS_3glp_rQ{ZfWdf(^k?muqrSc z)V*ujYH)Q$H}K9sOP^G?XNSTKtP5l>Q!bF$bz6!JtXhux&^vA@??5(eMlw~mDeb!S zEPWmX6aJyq)wuv{h@!$ixlRZmus+tO%4H8gc2YD2=11E~xMa&}TYUD+cqJ{qSN@^f z`Y1hltbFBB)0*qGOOEmzN;=(A&Fy(jRaJduzjhp#56gD*R(1$&zpp&cYAKRUyH4}~ z0x`D}*m?V{Cv9CcZl_QeFkEL>zXm^BNVjL{#-)eaQqtcJt61aj7P!l=p5)3O&iNis zWv)U;H_jlwa}z_JvrYqX6gZpV1#FDY9C_ zRcctGhU*tJWRPIt4Ch%Ym_wFIw6Rb}F4B>UbmXu-s$-i47j-Kz>hNC z7BnO-=APbj&$+#G=j;396Tmf2i?EP!V3(0aj$wbs*W8V`nz(~tCPKrIyOK(p8-`4~ zGjfn;sP%aiy2Dj4SP0FHjFp2TLnWpEI0m~Pj|D^3mr6XW=7G>pJcx*?`*Fyl5!W)w zx1?>Ra>>x}|8>7)$nwP^dLe9kUdLl#oKAuP&3rG+G#)>4&F8`hO-)*{p7fM3f#7P{ z8^$Xg3SX>6bgNWs(veBk^mlH%7Fx@(pnnxNdQT>!)^@MiOY}I0LrY^Q&;}Ev#ZfF# z<`Oc(Z1)}PEiIQRCS@RxJ&NUx02Ndzqv26QCN?rfA{h2OG~|`Tzg` literal 0 HcmV?d00001 diff --git a/build/classes/Calc/TypingState.class b/build/classes/Calc/TypingState.class new file mode 100644 index 0000000000000000000000000000000000000000..e01ac3193bf558096b5d7222a7e5b4b73ead3a3c GIT binary patch literal 1356 zcmah|YflqV5IwiAEoCXCv?vc1M6pn8eZLASf<%)l#u5@gncMD7S+eY|+ieqmmR}&z z#2?^~GS1wsr92Wp?7h45IOojF&hI}zegRm=n+#%z8%UT)A|;SJkUd#-q}#6UG!IlO z6iBVvt{uJ9neRbR8LbfxxKredStPcH5@hVyS)#*a!pL zZPy}@tch_=*pWT8Z3mrj$5(-LEoPW7k!N_bqat%?d#-_kz^o?Jp=@g?hcqgy5z0_y zFo`&)UomkN(*kKq*B*iCQvIA%?dXe{H8ICxjFxxkcNr;->n3inZLI5C1ioc=d`BJ` zSfD0psL!g?bt3!><|F1?CT??5vgIfl7`P*l)xqyANA*Q6alcpoq3j;{)D-P9uqsfv zOr}6$)3X%yyKcMcWB0JBf?e5k$da#nE$QsZz~=A1F%jjo`V zS3TuyxUNT2q@hw&VF+!fr-Hz?6p@X3?qKu+G0)fKy#3ad4kukKXL*l?>baXd4S`HV zw{3IdazkyY@K1^bEYmUwlxZ`Pbkjo6d6&MbbPKkwoIrf1ml!H^vKxq#8!)2)+{1nP z5_o`zR881V&}ql>E;p(q+^DjYb0ZyWZb+&#w5uoP$P=8!&6$uRFpfAQRvIy yCM1P!!dc>11LAt0I7g(5M7l(zr8A^i-JlsFou#Vhh6r;5!rcD|Uz3s;HvR%9p8zrd literal 0 HcmV?d00001 diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties index a6eba98..f778d18 100644 --- a/nbproject/private/private.properties +++ b/nbproject/private/private.properties @@ -5,4 +5,4 @@ do.jlink=true javac.debug=true javadoc.preview=true jlink.strip=false -user.properties.file=C:\\Users\\SasUke UtChiHa\\AppData\\Roaming\\NetBeans\\15\\build.properties +user.properties.file=C:\\Users\\Sulta\\AppData\\Roaming\\NetBeans\\27\\build.properties diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index 6807a2b..71b1334 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -2,6 +2,10 @@ - + + file:/C:/Users/Sulta/OneDrive/Documents/NetBeansProjects/calculator-java-swing-refactor/src/Calc/App.java + file:/C:/Users/Sulta/OneDrive/Documents/NetBeansProjects/calculator-java-swing-refactor/src/Calc/Calculator.java + file:/C:/Users/Sulta/OneDrive/Documents/NetBeansProjects/calculator-java-swing-refactor/src/Calc/CalculatorFacade.java + diff --git a/src/Calc/AddOperation.java b/src/Calc/AddOperation.java index da08480..0fdecce 100644 --- a/src/Calc/AddOperation.java +++ b/src/Calc/AddOperation.java @@ -1,7 +1,4 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ + package Calc; /** diff --git a/src/Calc/Calculator.form b/src/Calc/Calculator.form index bedbeaf..7ed5165 100644 --- a/src/Calc/Calculator.form +++ b/src/Calc/Calculator.form @@ -929,6 +929,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Calc/Calculator.java b/src/Calc/Calculator.java index 7839983..d9635ba 100644 --- a/src/Calc/Calculator.java +++ b/src/Calc/Calculator.java @@ -19,7 +19,7 @@ * @author youcefhmd */ public final class Calculator extends javax.swing.JFrame { - + private String currentOperand; private String previousOperand; private String operation; @@ -38,9 +38,50 @@ public static Calculator getInstance() { - - - + // -------------------- Command Pattern -------------------- + +public java.util.Stack undoStack = new java.util.Stack<>(); +public java.util.Stack redoStack = new java.util.Stack<>(); + +public void undoLast() { + if (!undoStack.isEmpty()) { + Command cmd = undoStack.pop(); + cmd.undo(); + redoStack.push(cmd); + } +} + +public void redoLast() { + if (!redoStack.isEmpty()) { + Command cmd = redoStack.pop(); + cmd.execute(); + undoStack.push(cmd); + } +} + + + +void applyRedo(String curr) { + this.currentOperand = curr; + this.previousOperand = ""; + this.operation = ""; + updateDisplay(); +} + +void applyUndo(String prev, String curr, String op) { + this.previousOperand = prev; + this.currentOperand = curr; + this.operation = op; + updateDisplay(); +} + + // --------------------END Command Pattern -------------------- + + + + + + // -------------------- State Pattern -------------------- private CalculatorState state = new IdleState(); @@ -227,6 +268,16 @@ public void chooseOperation(String operation) { } public void compute() { + + + +String beforePrev = this.previousOperand; +String beforeCurr = this.currentOperand; +String beforeOp = this.operation; + + + + if (this.currentOperand.equals("") || this.previousOperand.equals("")) { return; @@ -255,6 +306,33 @@ public void compute() { return; } + + + + + + //هنا تنفيذ الكوماند باترن + String afterCurr = this.currentOperand; + +Command cmd = new ComputeCommand( + this, + OperationFactory.getOperation(beforeOp), + beforePrev, + beforeCurr, + beforeOp, + afterCurr +); + +undoStack.push(cmd); +redoStack.clear(); + + + + + + + + this.previousOperand = ""; this.operation = ""; } @@ -293,6 +371,9 @@ private void initComponents() { btn0 = new javax.swing.JButton(); btnDot = new javax.swing.JButton(); btnEqual = new javax.swing.JButton(); + jButton1 = new javax.swing.JButton(); + btnUndo = new javax.swing.JButton(); + btnRedo = new javax.swing.JButton(); titleBar = new javax.swing.JPanel(); title = new javax.swing.JLabel(); btnMini = new javax.swing.JButton(); @@ -607,6 +688,25 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { }); buttonsPanel.add(btnEqual, new org.netbeans.lib.awtextra.AbsoluteConstraints(230, 300, -1, -1)); + jButton1.setText("jButton1"); + buttonsPanel.add(jButton1, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 50, -1, -1)); + + btnUndo.setText("Undo"); + btnUndo.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnUndoActionPerformed(evt); + } + }); + buttonsPanel.add(btnUndo, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 0, -1, 20)); + + btnRedo.setText("Redo"); + btnRedo.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnRedoActionPerformed(evt); + } + }); + buttonsPanel.add(btnRedo, new org.netbeans.lib.awtextra.AbsoluteConstraints(100, 0, -1, 20)); + app.add(buttonsPanel, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 140, 320, 390)); titleBar.setBackground(new java.awt.Color(21, 20, 22)); @@ -790,6 +890,16 @@ private void titleBarMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:ev this.setLocation(xx - x, yy - y); }//GEN-LAST:event_titleBarMouseDragged + private void btnUndoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnUndoActionPerformed + // TODO add your handling code here: + undoLast(); + }//GEN-LAST:event_btnUndoActionPerformed + + private void btnRedoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRedoActionPerformed + // TODO add your handling code here: + redoLast(); + }//GEN-LAST:event_btnRedoActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel app; private static javax.swing.JButton btn0; @@ -812,9 +922,12 @@ private void titleBarMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:ev private static javax.swing.JButton btnMult; private static javax.swing.JButton btnPlus; private static javax.swing.JButton btnPlusSub; + private javax.swing.JButton btnRedo; private static javax.swing.JButton btnSub; + private javax.swing.JButton btnUndo; private javax.swing.JPanel buttonsPanel; private javax.swing.JTextField current; + private javax.swing.JButton jButton1; private javax.swing.JTextField previous; private javax.swing.JPanel resultsPanel; private javax.swing.JLabel title; diff --git a/src/Calc/Command.java b/src/Calc/Command.java new file mode 100644 index 0000000..a798aed --- /dev/null +++ b/src/Calc/Command.java @@ -0,0 +1,10 @@ +package Calc; + +/** + * + * @author Sulta + */ +public interface Command { + void execute(); + void undo(); +} diff --git a/src/Calc/ComputeCommand.java b/src/Calc/ComputeCommand.java new file mode 100644 index 0000000..0b54b0e --- /dev/null +++ b/src/Calc/ComputeCommand.java @@ -0,0 +1,47 @@ +package Calc; +import javax.swing.JTextField; + +public class ComputeCommand implements Command{ + private final Calculator calc; + private final Operation operation; + + // قيم قبل العملية + private final String beforePrev; + private final String beforeCurr; + private final String beforeOp; + + // قيم بعد العملية (النتيجة) + private final String afterCurr; + + public ComputeCommand( + Calculator calc, + Operation operation, + String beforePrev, + String beforeCurr, + String beforeOp, + String afterCurr) { + + this.calc = calc; + this.operation = operation; + + this.beforePrev = beforePrev; + this.beforeCurr = beforeCurr; + this.beforeOp = beforeOp; + this.afterCurr = afterCurr; + } + + @Override + public void execute() { + calc.applyRedo(afterCurr); + HistoryOperation.addEntry("Redo : " + afterCurr); + + } + + @Override + public void undo() { + // إعادة حالة قبل العملية + calc.applyUndo(beforePrev, beforeCurr, beforeOp); + HistoryOperation.addEntry("Undo → " + + beforePrev + " " + beforeOp + " " + beforeCurr); + } +} diff --git a/src/Calc/DivOperation.java b/src/Calc/DivOperation.java index 7bdca7f..daa39a5 100644 --- a/src/Calc/DivOperation.java +++ b/src/Calc/DivOperation.java @@ -1,7 +1,4 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ + package Calc; /** diff --git a/src/Calc/HistoryOperation.java b/src/Calc/HistoryOperation.java index 0a800c4..69d7915 100644 --- a/src/Calc/HistoryOperation.java +++ b/src/Calc/HistoryOperation.java @@ -1,12 +1,9 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ + package Calc; import java.util.ArrayList; import java.util.List; -public class HistoryOperation extends OperationDecorator{ +public class HistoryOperation extends OperationDecorator { private static final List history = new ArrayList<>(); public HistoryOperation(Operation decoratedOperation) { @@ -27,6 +24,10 @@ private String getSymbol(Operation op) { if (op instanceof DivOperation) return "÷"; return "?"; } + //اضفنا الدالة عشان تتعامل مع الكوماند باترن + public static void addEntry(String entry) { + history.add(entry); +} public static List getHistory() { return history; diff --git a/src/Calc/LoggingOperation.java b/src/Calc/LoggingOperation.java index f0b3e0c..78e5fa5 100644 --- a/src/Calc/LoggingOperation.java +++ b/src/Calc/LoggingOperation.java @@ -1,7 +1,4 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ + package Calc; /** diff --git a/src/Calc/MultOperation.java b/src/Calc/MultOperation.java index 158dfea..b2489e9 100644 --- a/src/Calc/MultOperation.java +++ b/src/Calc/MultOperation.java @@ -1,7 +1,4 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ + package Calc; /** diff --git a/src/Calc/Operation.java b/src/Calc/Operation.java index 5d28fef..c1d5203 100644 --- a/src/Calc/Operation.java +++ b/src/Calc/Operation.java @@ -1,7 +1,4 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Interface.java to edit this template - */ + package Calc; /** diff --git a/src/Calc/OperationDecorator.java b/src/Calc/OperationDecorator.java index 49ee4f3..a977965 100644 --- a/src/Calc/OperationDecorator.java +++ b/src/Calc/OperationDecorator.java @@ -1,7 +1,4 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ + package Calc; /** diff --git a/src/Calc/OperationFactory.java b/src/Calc/OperationFactory.java index 6934a5d..ed4d114 100644 --- a/src/Calc/OperationFactory.java +++ b/src/Calc/OperationFactory.java @@ -1,7 +1,4 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ + package Calc; /** diff --git a/src/Calc/SubOperation.java b/src/Calc/SubOperation.java index aeee3b9..ea4b515 100644 --- a/src/Calc/SubOperation.java +++ b/src/Calc/SubOperation.java @@ -1,7 +1,4 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ + package Calc; /**