From d037cc1d9795a414fc045da3505820215022d333 Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Thu, 17 Mar 2016 06:32:25 +1100 Subject: [PATCH] call calculate() --- .../bytezone/diskbrowser/visicalc/Cell.java | 14 +++- .../diskbrowser/visicalc/Condition.java | 6 ++ .../bytezone/diskbrowser/visicalc/Count.java | 2 +- .../diskbrowser/visicalc/Expression.java | 84 ++++++++++++------- .../diskbrowser/visicalc/Function.java | 17 ++-- src/com/bytezone/diskbrowser/visicalc/If.java | 18 +++- .../diskbrowser/visicalc/IsError.java | 6 +- .../bytezone/diskbrowser/visicalc/IsNa.java | 2 +- .../bytezone/diskbrowser/visicalc/Lookup.java | 17 ++-- .../bytezone/diskbrowser/visicalc/Max.java | 9 +- .../bytezone/diskbrowser/visicalc/Min.java | 9 +- .../bytezone/diskbrowser/visicalc/Npv.java | 5 +- .../bytezone/diskbrowser/visicalc/Number.java | 14 +++- .../bytezone/diskbrowser/visicalc/Sum.java | 6 +- .../bytezone/diskbrowser/visicalc/Value.java | 7 +- 15 files changed, 144 insertions(+), 72 deletions(-) diff --git a/src/com/bytezone/diskbrowser/visicalc/Cell.java b/src/com/bytezone/diskbrowser/visicalc/Cell.java index 78dea82..183f2d0 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Cell.java +++ b/src/com/bytezone/diskbrowser/visicalc/Cell.java @@ -18,6 +18,7 @@ class Cell implements Comparable, Value private String expressionText; private Value value; + private ValueType valueType; enum CellType { @@ -181,6 +182,12 @@ class Cell implements Comparable, Value return value.getValue (); } + @Override + public ValueType getValueType () + { + return valueType; + } + @Override public String getText () { @@ -210,12 +217,15 @@ class Cell implements Comparable, Value { System.out.printf ("%s null expression text %n", address); value = Function.getInstance (parent, "@ERROR"); + valueType = ValueType.ERROR; } else + { // should use Number or Cell for simple Values value = new Expression (parent, expressionText); - - value.calculate (); + value.calculate (); + valueType = value.getValueType (); + } } @Override diff --git a/src/com/bytezone/diskbrowser/visicalc/Condition.java b/src/com/bytezone/diskbrowser/visicalc/Condition.java index c137657..2a5e1ad 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Condition.java +++ b/src/com/bytezone/diskbrowser/visicalc/Condition.java @@ -49,8 +49,14 @@ class Condition { conditionExpression = new Expression (parent, conditionText); valueExpression = new Expression (parent, valueText); + + conditionExpression.calculate (); + valueExpression.calculate (); } + if (conditionExpression.isError () || valueExpression.isError ()) + return false; + double conditionResult = conditionExpression.getValue (); double valueResult = valueExpression.getValue (); diff --git a/src/com/bytezone/diskbrowser/visicalc/Count.java b/src/com/bytezone/diskbrowser/visicalc/Count.java index 43ff191..0a98a6b 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Count.java +++ b/src/com/bytezone/diskbrowser/visicalc/Count.java @@ -19,7 +19,7 @@ class Count extends Function Cell cell = parent.getCell (address); if (cell == null || cell.isError () || cell.isNaN ()) { - isError = true; + valueType = ValueType.ERROR; break; } diff --git a/src/com/bytezone/diskbrowser/visicalc/Expression.java b/src/com/bytezone/diskbrowser/visicalc/Expression.java index 780e023..99e4650 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Expression.java +++ b/src/com/bytezone/diskbrowser/visicalc/Expression.java @@ -32,7 +32,8 @@ class Expression implements Value private final List operators = new ArrayList (); private final List signs = new ArrayList (); - protected boolean isError; + // protected boolean isError; + private ValueType valueType; private double value; public Expression (Sheet parent, String text) @@ -118,34 +119,60 @@ class Expression implements Value @Override public void calculate () { - Value thisValue = values.get (0); - value = thisValue == null ? 0 : values.get (0).getValue (); - - String sign = signs.get (0); - if (sign.equals ("(-)")) - value *= -1; - - for (int i = 1; i < values.size (); i++) + try { - thisValue = values.get (i); - double nextValue = thisValue == null ? 0 : thisValue.getValue (); + Value thisValue = values.get (0); + thisValue.calculate (); + if (thisValue.isError ()) + { + valueType = ValueType.ERROR; + return; + } + value = thisValue.getValue (); - sign = signs.get (i); + String sign = signs.get (0); if (sign.equals ("(-)")) - nextValue *= -1; + value *= -1; - String operator = operators.get (i - 1); - if (operator.equals ("+")) - value += nextValue; - else if (operator.equals ("-")) - value -= nextValue; - else if (operator.equals ("*")) - value *= nextValue; - else if (operator.equals ("/")) - value /= nextValue; - else if (operator.equals ("^")) - value = Math.pow (value, nextValue); + for (int i = 1; i < values.size (); i++) + { + thisValue = values.get (i); + thisValue.calculate (); + if (thisValue.isError ()) + { + valueType = ValueType.ERROR; + return; + } + double nextValue = thisValue.getValue (); + + sign = signs.get (i); + if (sign.equals ("(-)")) + nextValue *= -1; + + String operator = operators.get (i - 1); + if (operator.equals ("+")) + value += nextValue; + else if (operator.equals ("-")) + value -= nextValue; + else if (operator.equals ("*")) + value *= nextValue; + else if (operator.equals ("/")) + value /= nextValue; + else if (operator.equals ("^")) + value = Math.pow (value, nextValue); + } + valueType = ValueType.VALUE; } + catch (Exception e) + { + valueType = ValueType.ERROR; + } + } + + @Override + public ValueType getValueType () + { + return valueType; } @Override @@ -157,22 +184,19 @@ class Expression implements Value @Override public String getText () { - if (isNaN ()) - return "NaN"; - if (isError ()) - return "Error"; - return ""; + return isNaN () ? "NaN" : isError () ? "Error" : ""; } @Override public boolean isError () { - return isError; + return valueType == ValueType.ERROR; } @Override public double getValue () { + assert valueType == ValueType.VALUE : "Expression ValueType = " + valueType; return value; } diff --git a/src/com/bytezone/diskbrowser/visicalc/Function.java b/src/com/bytezone/diskbrowser/visicalc/Function.java index e3ad8c0..555390c 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Function.java +++ b/src/com/bytezone/diskbrowser/visicalc/Function.java @@ -33,7 +33,7 @@ abstract class Function implements Value protected final Sheet parent; protected String functionText; - protected boolean isError; + protected ValueType valueType; protected double value; static Function getInstance (Sheet parent, String text) @@ -102,10 +102,16 @@ abstract class Function implements Value functionText = ""; } + @Override + public ValueType getValueType () + { + return valueType; + } + @Override public boolean isError () { - return isError; + return valueType == ValueType.ERROR; } @Override @@ -117,17 +123,14 @@ abstract class Function implements Value @Override public double getValue () { + assert valueType == ValueType.VALUE : "Function ValueType = " + valueType; return value; } @Override public String getText () { - if (isNaN ()) - return "NaN"; - if (isError ()) - return "Error"; - return ""; + return isNaN () ? "NaN" : isError () ? "Error" : ""; } protected Range getRange (String text) diff --git a/src/com/bytezone/diskbrowser/visicalc/If.java b/src/com/bytezone/diskbrowser/visicalc/If.java index 6121900..0e7bfea 100644 --- a/src/com/bytezone/diskbrowser/visicalc/If.java +++ b/src/com/bytezone/diskbrowser/visicalc/If.java @@ -25,17 +25,31 @@ class If extends Function @Override public void calculate () { + valueType = ValueType.VALUE; + if (condition.getResult ()) { if (expTrue == null) + { expTrue = new Expression (parent, textTrue); - value = expTrue.getValue (); + expTrue.calculate (); + } + if (expTrue.isError () || expTrue.isNaN ()) + valueType = expTrue.getValueType (); + else + value = expTrue.getValue (); } else { if (expFalse == null) + { expFalse = new Expression (parent, textFalse); - value = expFalse.getValue (); + expFalse.calculate (); + } + if (expFalse.isError () || expFalse.isNaN ()) + valueType = expFalse.getValueType (); + else + value = expFalse.getValue (); } } diff --git a/src/com/bytezone/diskbrowser/visicalc/IsError.java b/src/com/bytezone/diskbrowser/visicalc/IsError.java index 9f5ec12..8913180 100644 --- a/src/com/bytezone/diskbrowser/visicalc/IsError.java +++ b/src/com/bytezone/diskbrowser/visicalc/IsError.java @@ -13,7 +13,9 @@ class IsError extends Function @Override public void calculate () { - value = expression.getValue (); - isError = expression.isError (); + expression.calculate (); + // value = expression.getValue (); + valueType = expression.getValueType (); + value = isError () ? 1 : 0; } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/visicalc/IsNa.java b/src/com/bytezone/diskbrowser/visicalc/IsNa.java index 30dc907..5c3fd7a 100644 --- a/src/com/bytezone/diskbrowser/visicalc/IsNa.java +++ b/src/com/bytezone/diskbrowser/visicalc/IsNa.java @@ -14,6 +14,6 @@ public class IsNa extends Function public void calculate () { value = expression.getValue (); - isError = expression.isError (); + valueType = expression.getValueType (); } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/visicalc/Lookup.java b/src/com/bytezone/diskbrowser/visicalc/Lookup.java index 0793fda..708c28b 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Lookup.java +++ b/src/com/bytezone/diskbrowser/visicalc/Lookup.java @@ -3,7 +3,6 @@ package com.bytezone.diskbrowser.visicalc; class Lookup extends Function { Range range; - // boolean hasValue; String sourceText; String rangeText; Expression source; @@ -20,15 +19,15 @@ class Lookup extends Function range = getRange (rangeText); } - // need a mechanism to return NA and ERROR - // @Override - // public boolean hasValue () - // { - // return hasValue; - // } - + @Override public void calculate () { + source.calculate (); + if (source.isError () || source.isNaN ()) + { + valueType = source.getValueType (); + return; + } double sourceValue = source.getValue (); Address target = null; @@ -45,7 +44,5 @@ class Lookup extends Function value = parent.getCell (target.nextColumn ()).getValue (); else value = parent.getCell (target.nextRow ()).getValue (); - - // return 0; } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/visicalc/Max.java b/src/com/bytezone/diskbrowser/visicalc/Max.java index 863f4b8..96980a4 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Max.java +++ b/src/com/bytezone/diskbrowser/visicalc/Max.java @@ -14,7 +14,6 @@ class Max extends Function public void calculate () { value = Double.MIN_VALUE; - isError = false; int totalChecked = 0; for (Address address : range) @@ -25,8 +24,8 @@ class Max extends Function if (cell.isError () || cell.isNaN ()) { - isError = true; - break; + valueType = ValueType.ERROR; + return; } double temp = cell.getValue (); @@ -36,6 +35,8 @@ class Max extends Function } if (totalChecked == 0) - isError = true; + valueType = ValueType.ERROR; + else + valueType = ValueType.VALUE; } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/visicalc/Min.java b/src/com/bytezone/diskbrowser/visicalc/Min.java index 8763f58..120a38f 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Min.java +++ b/src/com/bytezone/diskbrowser/visicalc/Min.java @@ -14,7 +14,6 @@ class Min extends Function public void calculate () { value = Double.MAX_VALUE; - isError = false; int totalChecked = 0; for (Address address : range) @@ -25,8 +24,8 @@ class Min extends Function if (cell.isError () || cell.isNaN ()) { - isError = true; - break; + valueType = ValueType.ERROR; + return; } double temp = cell.getValue (); @@ -36,6 +35,8 @@ class Min extends Function } if (totalChecked == 0) - isError = true; + valueType = ValueType.ERROR; + else + valueType = ValueType.VALUE; } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/visicalc/Npv.java b/src/com/bytezone/diskbrowser/visicalc/Npv.java index 95ede29..2def280 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Npv.java +++ b/src/com/bytezone/diskbrowser/visicalc/Npv.java @@ -24,6 +24,7 @@ public class Npv extends Function public void calculate () { value = 0; + valueType = ValueType.VALUE; for (Address address : range) { @@ -33,8 +34,8 @@ public class Npv extends Function if (cell.isError () || cell.isNaN ()) { - isError = true; - break; + valueType = ValueType.VALUE; + return; } double temp = cell.getValue (); diff --git a/src/com/bytezone/diskbrowser/visicalc/Number.java b/src/com/bytezone/diskbrowser/visicalc/Number.java index e30fdfb..857c1b9 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Number.java +++ b/src/com/bytezone/diskbrowser/visicalc/Number.java @@ -2,8 +2,8 @@ package com.bytezone.diskbrowser.visicalc; class Number implements Value { - double value; - boolean isError; + private double value; + private ValueType valueType; public Number (String text) { @@ -13,14 +13,14 @@ class Number implements Value } catch (NumberFormatException e) { - isError = true; + valueType = ValueType.ERROR; } } @Override public boolean isError () { - return isError; + return valueType == ValueType.ERROR; } @Override @@ -51,4 +51,10 @@ class Number implements Value public void calculate () { } + + @Override + public ValueType getValueType () + { + return null; + } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/visicalc/Sum.java b/src/com/bytezone/diskbrowser/visicalc/Sum.java index 99b1478..5d2c878 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Sum.java +++ b/src/com/bytezone/diskbrowser/visicalc/Sum.java @@ -14,6 +14,8 @@ class Sum extends Function public void calculate () { value = 0; + valueType = ValueType.VALUE; + for (Address address : range) { Cell cell = parent.getCell (address); @@ -22,8 +24,8 @@ class Sum extends Function if (cell.isError () || cell.isNaN ()) { - isError = true; - break; + valueType = ValueType.ERROR; + return; } value += cell.getValue (); } diff --git a/src/com/bytezone/diskbrowser/visicalc/Value.java b/src/com/bytezone/diskbrowser/visicalc/Value.java index 06638c9..f8f05b8 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Value.java +++ b/src/com/bytezone/diskbrowser/visicalc/Value.java @@ -2,7 +2,12 @@ package com.bytezone.diskbrowser.visicalc; interface Value { - // public boolean hasValue (); + enum ValueType + { + VALUE, ERROR, NA + } + + public ValueType getValueType (); public double getValue ();