diff --git a/src/com/bytezone/diskbrowser/visicalc/Abs.java b/src/com/bytezone/diskbrowser/visicalc/Abs.java index 09239ad..16d398c 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Abs.java +++ b/src/com/bytezone/diskbrowser/visicalc/Abs.java @@ -16,6 +16,7 @@ public class Abs extends Function { source = new Expression (parent, functionText); values.add (source); + source.calculate (); } value = Math.abs (source.getValue ()); diff --git a/src/com/bytezone/diskbrowser/visicalc/Average.java b/src/com/bytezone/diskbrowser/visicalc/Average.java index a4693a3..dde7ca5 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Average.java +++ b/src/com/bytezone/diskbrowser/visicalc/Average.java @@ -7,7 +7,7 @@ public class Average extends Function public Average (Sheet parent, String text) { super (parent, text); - range = new Range (text); + range = new Range (parent, text); } @Override diff --git a/src/com/bytezone/diskbrowser/visicalc/Cell.java b/src/com/bytezone/diskbrowser/visicalc/Cell.java index 2fc47a9..465f7c5 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Cell.java +++ b/src/com/bytezone/diskbrowser/visicalc/Cell.java @@ -81,6 +81,7 @@ class Cell extends AbstractValue implements Comparable { expressionText = command; cellType = CellType.VALUE; + value = new Expression (parent, expressionText).reduce (); } // FUTURE.VC @@ -144,7 +145,10 @@ class Cell extends AbstractValue implements Comparable case VALUE: if (!isValueType (ValueType.VALUE)) - return Format.justify (value.getText (), colWidth, 'R'); + { + char fmt = cellFormat != ' ' ? cellFormat : globalFormat; + return Format.justify (value.getText (), colWidth, fmt); + } char formatChar = cellFormat != ' ' ? cellFormat : globalFormat; return " " + Format.format (value, formatChar, colWidth - 1); @@ -158,8 +162,10 @@ class Cell extends AbstractValue implements Comparable @Override public double getValue () { - if (value == null) - calculate (); + // if (value == null) + // calculate (); + if (cellType != CellType.VALUE) + return 0; return value.getValue (); } @@ -167,14 +173,21 @@ class Cell extends AbstractValue implements Comparable @Override public ValueType getValueType () { + // if (value == null) + // calculate (); + if (cellType == CellType.EMPTY) + return ValueType.NA; + return value.getValueType (); } @Override public String getText () { - if (value == null) - calculate (); + // if (value == null) + // calculate (); + if (cellType == CellType.EMPTY) + return ""; return value.getText (); } @@ -182,9 +195,15 @@ class Cell extends AbstractValue implements Comparable @Override public boolean isValueType (ValueType type) { - if (value == null) - calculate (); + // if (value == null || value.getValueType () != ValueType.VALUE) + // calculate (); + if (cellType == CellType.LABEL || cellType == CellType.REPEATING_CHARACTER) + return type == ValueType.VALUE; + if (cellType == CellType.EMPTY) + return type == ValueType.NA; + + assert value != null : "bollocks " + address; return value.isValueType (type); } @@ -196,20 +215,15 @@ class Cell extends AbstractValue implements Comparable @Override public void calculate () { - if (value != null && value.isValueType (ValueType.VALUE)) - return; + // if (value != null && value.isValueType (ValueType.VALUE)) + // return; + // + // if (expressionText == null) + // expressionText = ""; - if (value == null) - { - if (expressionText == null) - expressionText = ""; - - value = new Expression (parent, expressionText).reduce (); - } - - value.calculate (); - - return; + // value = new Expression (parent, expressionText).reduce (); + if (value != null) + value.calculate (); } public String getDebugText () diff --git a/src/com/bytezone/diskbrowser/visicalc/Choose.java b/src/com/bytezone/diskbrowser/visicalc/Choose.java index 2f40660..f5eaa00 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Choose.java +++ b/src/com/bytezone/diskbrowser/visicalc/Choose.java @@ -14,7 +14,7 @@ public class Choose extends Function int pos = text.indexOf (','); sourceText = text.substring (8, pos); rangeText = text.substring (pos + 1, text.length () - 1); - range = new Range (rangeText); + range = new Range (parent, rangeText); source = new Number (sourceText); } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/visicalc/Count.java b/src/com/bytezone/diskbrowser/visicalc/Count.java index d80d912..5211bfd 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Count.java +++ b/src/com/bytezone/diskbrowser/visicalc/Count.java @@ -7,7 +7,7 @@ class Count extends Function public Count (Sheet parent, String text) { super (parent, text); - range = new Range (text); + range = new Range (parent, text); } @Override diff --git a/src/com/bytezone/diskbrowser/visicalc/Expression.java b/src/com/bytezone/diskbrowser/visicalc/Expression.java index b335a19..8d04b13 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Expression.java +++ b/src/com/bytezone/diskbrowser/visicalc/Expression.java @@ -74,9 +74,9 @@ class Expression extends AbstractValue implements Iterable bracketText.substring (1, bracketText.length () - 1))); break; - case '#': + case '#': // no idea System.out.printf ("Hash character [%s] in [%s]%n", ch, line); - ptr++; // no idea + ptr++; break; default: @@ -93,8 +93,9 @@ class Expression extends AbstractValue implements Iterable Cell cell = parent.getCell (addressText); if (cell == null) { - System.out.println ("adding NA"); - values.add (Function.getInstance (parent, "@NA")); + // should this (or parent) create a new empty cell? + // cell = parent.addCell (addressText); + values.add (new Number ("0")); } else values.add (parent.getCell (addressText)); @@ -154,17 +155,18 @@ class Expression extends AbstractValue implements Iterable try { Value thisValue = values.get (0); - thisValue.calculate (); + if (thisValue != null) // || thisValue.getValueType () != ValueType.VALUE) + thisValue.calculate (); value = 0; - if (thisValue.isValueType (ValueType.VALUE)) - value = thisValue.getValue (); - else + if (!thisValue.isValueType (ValueType.VALUE)) { valueType = thisValue.getValueType (); return; } + value = thisValue.getValue (); + String sign = signs.get (0); if (sign.equals ("(-)")) value *= -1; @@ -172,17 +174,18 @@ class Expression extends AbstractValue implements Iterable for (int i = 1; i < values.size (); i++) { thisValue = values.get (i); - thisValue.calculate (); + if (thisValue != null) // || thisValue.getValueType () != ValueType.VALUE) + thisValue.calculate (); - double nextValue = 0; - if (thisValue.isValueType (ValueType.VALUE)) - nextValue = thisValue.getValue (); - else + if (!thisValue.isValueType (ValueType.VALUE)) + // if (thisValue.isValueType (ValueType.ERROR)) { valueType = thisValue.getValueType (); return; } + double nextValue = thisValue.getValue (); + sign = signs.get (i); if (sign.equals ("(-)")) nextValue *= -1; diff --git a/src/com/bytezone/diskbrowser/visicalc/Int.java b/src/com/bytezone/diskbrowser/visicalc/Int.java index 30a504b..e847a08 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Int.java +++ b/src/com/bytezone/diskbrowser/visicalc/Int.java @@ -2,17 +2,21 @@ package com.bytezone.diskbrowser.visicalc; public class Int extends Function { + Expression source; Int (Sheet parent, String text) { super (parent, text); + + source = new Expression (parent, functionText); + values.add (source); } @Override public void calculate () { - Expression exp = new Expression (parent, functionText); - value = (int) exp.getValue (); - valueType = exp.getValueType (); + source.calculate (); + value = (int) source.getValue (); + valueType = source.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 5cbdfcd..29bfe80 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Lookup.java +++ b/src/com/bytezone/diskbrowser/visicalc/Lookup.java @@ -13,26 +13,29 @@ class Lookup extends Function int pos = text.indexOf (','); sourceText = text.substring (8, pos); + source = new Expression (parent, sourceText); + values.add (source); rangeText = text.substring (pos + 1, text.length () - 1); - range = new Range (rangeText); + range = new Range (parent, rangeText); } @Override public void calculate () { - if (source == null) - { - source = new Expression (parent, sourceText); - values.add (source); - } - source.calculate (); + if (!source.isValueType (ValueType.VALUE)) { valueType = source.getValueType (); return; } + if (range.size () == 0) + { + valueType = ValueType.NA; + return; + } + double sourceValue = source.getValue (); Address target = null; @@ -44,15 +47,26 @@ class Lookup extends Function target = address; } + // System.out.printf ("*****-----**** %s%n", target); if (target == null) valueType = ValueType.NA; else { Address adjacentAddress = range.isVertical () ? target.nextColumn () : target.nextRow (); - Cell adjacentCell = parent.getCell (adjacentAddress); - value = adjacentCell.getValue (); - valueType = ValueType.VALUE; + + if (parent.cellExists (adjacentAddress)) + { + Cell adjacentCell = parent.getCell (adjacentAddress); + if (adjacentCell != null) + value = adjacentCell.getValue (); + valueType = ValueType.VALUE; + } + else + { + value = 0; + valueType = ValueType.VALUE; + } } } diff --git a/src/com/bytezone/diskbrowser/visicalc/Max.java b/src/com/bytezone/diskbrowser/visicalc/Max.java index a9afee6..e698492 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Max.java +++ b/src/com/bytezone/diskbrowser/visicalc/Max.java @@ -7,7 +7,7 @@ class Max extends Function public Max (Sheet parent, String text) { super (parent, text); - range = new Range (text); + range = new Range (parent, text); } @Override diff --git a/src/com/bytezone/diskbrowser/visicalc/Min.java b/src/com/bytezone/diskbrowser/visicalc/Min.java index d80c4ce..b7ef5d2 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Min.java +++ b/src/com/bytezone/diskbrowser/visicalc/Min.java @@ -7,7 +7,7 @@ class Min extends Function public Min (Sheet parent, String text) { super (parent, text); - range = new Range (text); + range = new Range (parent, text); } @Override diff --git a/src/com/bytezone/diskbrowser/visicalc/Npv.java b/src/com/bytezone/diskbrowser/visicalc/Npv.java index 83d706a..9ae69ea 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Npv.java +++ b/src/com/bytezone/diskbrowser/visicalc/Npv.java @@ -11,7 +11,7 @@ public class Npv extends Function Npv (Sheet parent, String text) { super (parent, text); - range = new Range (text); + range = new Range (parent, text); // int pos = text.indexOf (','); // valueText = text.substring (8, pos); diff --git a/src/com/bytezone/diskbrowser/visicalc/Range.java b/src/com/bytezone/diskbrowser/visicalc/Range.java index b8574b1..70f95b2 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Range.java +++ b/src/com/bytezone/diskbrowser/visicalc/Range.java @@ -15,24 +15,41 @@ class Range implements Iterable
Address from, to; List
range = new ArrayList
(); + Sheet parent; - public Range (String rangeText) + public Range (Sheet parent, String rangeText) { + this.parent = parent; setRange (rangeText); + + createCells (); } - public Range (Address from, Address to) + public Range (Sheet parent, Address from, Address to) { this.from = from; this.to = to; + this.parent = parent; addRange (); + + createCells (); } - public Range (String[] cells) + public Range (Sheet parent, String[] cells) { + this.parent = parent; + for (String s : cells) range.add (new Address (s)); + + createCells (); + } + + private void createCells () + { + for (Address address : range) + parent.getCell (address); } private void addRange () @@ -54,6 +71,7 @@ class Range implements Iterable
} else throw new InvalidParameterException (); + from = tempFrom; } @@ -77,6 +95,17 @@ class Range implements Iterable
return range.iterator (); } + public int size () + { + int total = 0; + + for (Address address : range) + if (parent.getCell (address) != null) + ++total; + + return total; + } + private void setRange (String text) { Matcher m = rangePattern.matcher (text); diff --git a/src/com/bytezone/diskbrowser/visicalc/Sheet.java b/src/com/bytezone/diskbrowser/visicalc/Sheet.java index fd39181..41f985f 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Sheet.java +++ b/src/com/bytezone/diskbrowser/visicalc/Sheet.java @@ -164,6 +164,7 @@ public class Sheet ptr += length + 1; // +1 for end-of-line token } + System.out.println ("** Start of calculation **"); // might have to keep recalculating until nothing changes?? if (recalculation == 'A') // auto { @@ -260,6 +261,7 @@ public class Sheet private void addCell (Cell cell) { + // System.out.printf ("Adding: %s%n", cell); rowOrderCells.put (cell.getAddress ().rowKey, cell); columnOrderCells.put (cell.getAddress ().columnKey, cell); @@ -274,7 +276,19 @@ public class Sheet Cell getCell (Address address) { - return rowOrderCells.get (address.rowKey); + Cell cell = rowOrderCells.get (address.rowKey); + if (cell == null) + { + // System.out.printf ("cell not found, creating: %s%n", address); + cell = new Cell (this, address); + addCell (cell); + } + return cell; + } + + boolean cellExists (Address address) + { + return rowOrderCells.get (address.rowKey) != null; } public int size () diff --git a/src/com/bytezone/diskbrowser/visicalc/Sum.java b/src/com/bytezone/diskbrowser/visicalc/Sum.java index ecac450..5b4d4eb 100644 --- a/src/com/bytezone/diskbrowser/visicalc/Sum.java +++ b/src/com/bytezone/diskbrowser/visicalc/Sum.java @@ -7,7 +7,7 @@ class Sum extends Function public Sum (Sheet parent, String text) { super (parent, text); - range = new Range (text); + range = new Range (parent, text); } @Override