mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2024-11-27 14:49:25 +00:00
refactoring
This commit is contained in:
parent
4859c81511
commit
319fe41e74
@ -1,11 +1,11 @@
|
|||||||
package com.bytezone.diskbrowser.applefile;
|
package com.bytezone.diskbrowser.applefile;
|
||||||
|
|
||||||
import com.bytezone.diskbrowser.utilities.HexFormatter;
|
import com.bytezone.diskbrowser.utilities.HexFormatter;
|
||||||
import com.bytezone.diskbrowser.visicalc.VisicalcSpreadsheet;
|
import com.bytezone.diskbrowser.visicalc.Sheet;
|
||||||
|
|
||||||
public class VisicalcFile extends AbstractFile
|
public class VisicalcFile extends AbstractFile
|
||||||
{
|
{
|
||||||
private VisicalcSpreadsheet sheet;
|
private Sheet sheet;
|
||||||
|
|
||||||
public VisicalcFile (String name, byte[] buffer)
|
public VisicalcFile (String name, byte[] buffer)
|
||||||
{
|
{
|
||||||
@ -16,7 +16,7 @@ public class VisicalcFile extends AbstractFile
|
|||||||
public String getText ()
|
public String getText ()
|
||||||
{
|
{
|
||||||
if (sheet == null)
|
if (sheet == null)
|
||||||
sheet = new VisicalcSpreadsheet (buffer);
|
sheet = new Sheet (buffer);
|
||||||
|
|
||||||
StringBuilder text = new StringBuilder ();
|
StringBuilder text = new StringBuilder ();
|
||||||
|
|
||||||
|
@ -3,25 +3,24 @@ package com.bytezone.diskbrowser.visicalc;
|
|||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
class VisicalcCell implements Comparable<VisicalcCell>
|
class Cell implements Comparable<Cell>
|
||||||
{
|
{
|
||||||
private static final Pattern cellContents =
|
private static final Pattern cellContents =
|
||||||
Pattern.compile ("([-+/*]?)(([A-Z]{1,2}[0-9]{1,3})|([0-9.]+)|(@[^-+/*]+))");
|
Pattern.compile ("([-+/*]?)(([A-Z]{1,2}[0-9]{1,3})|([0-9.]+)|(@[^-+/*]+))");
|
||||||
|
|
||||||
final Address address;
|
final Address address;
|
||||||
private final VisicalcSpreadsheet parent;
|
private final Sheet parent;
|
||||||
|
|
||||||
private String label;
|
private String label;
|
||||||
private double value;
|
private double value;
|
||||||
private String formula;
|
private String formula;
|
||||||
private char format = ' ';
|
private char format = ' ';
|
||||||
private int width;
|
private int width;
|
||||||
// private int columnWidth;
|
|
||||||
private char repeatingChar;
|
private char repeatingChar;
|
||||||
private String repeat = "";
|
private String repeat = "";
|
||||||
private boolean valid;
|
private boolean valid;
|
||||||
|
|
||||||
public VisicalcCell (VisicalcSpreadsheet parent, Address address)
|
public Cell (Sheet parent, Address address)
|
||||||
{
|
{
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.address = address;
|
this.address = address;
|
||||||
@ -159,7 +158,7 @@ class VisicalcCell implements Comparable<VisicalcCell>
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo (VisicalcCell o)
|
public int compareTo (Cell o)
|
||||||
{
|
{
|
||||||
return address.compareTo (o.address);
|
return address.compareTo (o.address);
|
||||||
}
|
}
|
27
src/com/bytezone/diskbrowser/visicalc/Count.java
Normal file
27
src/com/bytezone/diskbrowser/visicalc/Count.java
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package com.bytezone.diskbrowser.visicalc;
|
||||||
|
|
||||||
|
public class Count
|
||||||
|
{
|
||||||
|
Range range;
|
||||||
|
Sheet parent;
|
||||||
|
|
||||||
|
public Count (Sheet parent, String text)
|
||||||
|
{
|
||||||
|
this.parent = parent;
|
||||||
|
range = parent.getRange (text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getValue ()
|
||||||
|
{
|
||||||
|
double result = 0;
|
||||||
|
|
||||||
|
for (Address address : range)
|
||||||
|
{
|
||||||
|
Cell cell = parent.getCell (address);
|
||||||
|
if (cell.hasValue () && cell.getValue () != 0.0)
|
||||||
|
result += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
@ -3,11 +3,11 @@ package com.bytezone.diskbrowser.visicalc;
|
|||||||
public class Lookup
|
public class Lookup
|
||||||
{
|
{
|
||||||
Range range;
|
Range range;
|
||||||
VisicalcCell source;
|
Cell source;
|
||||||
VisicalcSpreadsheet parent;
|
Sheet parent;
|
||||||
boolean hasValue;
|
boolean hasValue;
|
||||||
|
|
||||||
public Lookup (VisicalcSpreadsheet parent, String text)
|
public Lookup (Sheet parent, String text)
|
||||||
{
|
{
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
|
|
||||||
|
26
src/com/bytezone/diskbrowser/visicalc/Max.java
Normal file
26
src/com/bytezone/diskbrowser/visicalc/Max.java
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package com.bytezone.diskbrowser.visicalc;
|
||||||
|
|
||||||
|
public class Max
|
||||||
|
{
|
||||||
|
Range range;
|
||||||
|
Sheet parent;
|
||||||
|
|
||||||
|
public Max (Sheet parent, String text)
|
||||||
|
{
|
||||||
|
this.parent = parent;
|
||||||
|
range = parent.getRange (text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getValue ()
|
||||||
|
{
|
||||||
|
double max = Double.MIN_VALUE;
|
||||||
|
for (Address address : range)
|
||||||
|
{
|
||||||
|
double value = parent.getCell (address).getValue ();
|
||||||
|
if (value > max)
|
||||||
|
max = value;
|
||||||
|
}
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
25
src/com/bytezone/diskbrowser/visicalc/Min.java
Normal file
25
src/com/bytezone/diskbrowser/visicalc/Min.java
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package com.bytezone.diskbrowser.visicalc;
|
||||||
|
|
||||||
|
public class Min
|
||||||
|
{
|
||||||
|
Range range;
|
||||||
|
Sheet parent;
|
||||||
|
|
||||||
|
public Min (Sheet parent, String text)
|
||||||
|
{
|
||||||
|
this.parent = parent;
|
||||||
|
range = parent.getRange (text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getValue ()
|
||||||
|
{
|
||||||
|
double min = Double.MAX_VALUE;
|
||||||
|
for (Address address : range)
|
||||||
|
{
|
||||||
|
double value = parent.getCell (address).getValue ();
|
||||||
|
if (value < min)
|
||||||
|
min = value;
|
||||||
|
}
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
}
|
@ -7,7 +7,7 @@ import java.util.regex.Pattern;
|
|||||||
|
|
||||||
import com.bytezone.diskbrowser.utilities.HexFormatter;
|
import com.bytezone.diskbrowser.utilities.HexFormatter;
|
||||||
|
|
||||||
public class VisicalcSpreadsheet implements Iterable<VisicalcCell>
|
public class Sheet implements Iterable<Cell>
|
||||||
{
|
{
|
||||||
private static final Pattern addressPattern =
|
private static final Pattern addressPattern =
|
||||||
Pattern.compile ("([A-B]?[A-Z])([0-9]{1,3}):");
|
Pattern.compile ("([A-B]?[A-Z])([0-9]{1,3}):");
|
||||||
@ -15,11 +15,11 @@ public class VisicalcSpreadsheet implements Iterable<VisicalcCell>
|
|||||||
.compile ("\\(([A-B]?[A-Z])([0-9]{1,3})\\.\\.\\.([A-B]?[A-Z])([0-9]{1,3})\\)?");
|
.compile ("\\(([A-B]?[A-Z])([0-9]{1,3})\\.\\.\\.([A-B]?[A-Z])([0-9]{1,3})\\)?");
|
||||||
private static final Pattern addressList = Pattern.compile ("\\(([^,]+(,[^,]+)*)\\)");
|
private static final Pattern addressList = Pattern.compile ("\\(([^,]+(,[^,]+)*)\\)");
|
||||||
|
|
||||||
private final Map<Integer, VisicalcCell> sheet = new TreeMap<Integer, VisicalcCell> ();
|
private final Map<Integer, Cell> sheet = new TreeMap<Integer, Cell> ();
|
||||||
private final Map<String, Double> functions = new HashMap<String, Double> ();
|
private final Map<String, Double> functions = new HashMap<String, Double> ();
|
||||||
|
|
||||||
final List<String> lines = new ArrayList<String> ();
|
final List<String> lines = new ArrayList<String> ();
|
||||||
VisicalcCell currentCell = null;
|
Cell currentCell = null;
|
||||||
char defaultFormat;
|
char defaultFormat;
|
||||||
|
|
||||||
private final Map<Integer, Integer> columnWidths = new TreeMap<Integer, Integer> ();
|
private final Map<Integer, Integer> columnWidths = new TreeMap<Integer, Integer> ();
|
||||||
@ -131,7 +131,7 @@ public class VisicalcSpreadsheet implements Iterable<VisicalcCell>
|
|||||||
/- REPEATING LABEL
|
/- REPEATING LABEL
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public VisicalcSpreadsheet (byte[] buffer)
|
public Sheet (byte[] buffer)
|
||||||
{
|
{
|
||||||
int last = buffer.length;
|
int last = buffer.length;
|
||||||
while (buffer[--last] == 0)
|
while (buffer[--last] == 0)
|
||||||
@ -154,7 +154,7 @@ public class VisicalcSpreadsheet implements Iterable<VisicalcCell>
|
|||||||
|
|
||||||
System.out.println ();
|
System.out.println ();
|
||||||
System.out.println ("Cells:");
|
System.out.println ("Cells:");
|
||||||
for (VisicalcCell cell : sheet.values ())
|
for (Cell cell : sheet.values ())
|
||||||
System.out.println (cell);
|
System.out.println (cell);
|
||||||
|
|
||||||
System.out.println ();
|
System.out.println ();
|
||||||
@ -196,7 +196,7 @@ public class VisicalcSpreadsheet implements Iterable<VisicalcCell>
|
|||||||
|
|
||||||
if (currentCell == null)
|
if (currentCell == null)
|
||||||
{
|
{
|
||||||
currentCell = new VisicalcCell (this, address);
|
currentCell = new Cell (this, address);
|
||||||
if (!command.startsWith ("/GCC"))
|
if (!command.startsWith ("/GCC"))
|
||||||
sheet.put (currentCell.address.sortValue, currentCell);
|
sheet.put (currentCell.address.sortValue, currentCell);
|
||||||
}
|
}
|
||||||
@ -286,51 +286,58 @@ public class VisicalcSpreadsheet implements Iterable<VisicalcCell>
|
|||||||
{
|
{
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (function.startsWith ("@LOOKUP("))
|
if (function.startsWith ("@LOOKUP("))
|
||||||
{
|
{
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Range range = getRange (function);
|
// Range range = getRange (function);
|
||||||
if (range == null)
|
// if (range == null)
|
||||||
return result;
|
// return result;
|
||||||
|
|
||||||
if (function.startsWith ("@SUM"))
|
if (function.startsWith ("@SUM("))
|
||||||
{
|
{
|
||||||
for (Address address : range)
|
// for (Address address : range)
|
||||||
result += getValue (address);
|
// result += getValue (address);
|
||||||
|
String text = function.substring (4, function.length () - 1);
|
||||||
|
Sum sum = new Sum (this, text);
|
||||||
|
result = sum.getValue ();
|
||||||
}
|
}
|
||||||
else if (function.startsWith ("@COUNT"))
|
else if (function.startsWith ("@COUNT("))
|
||||||
{
|
{
|
||||||
int count = 0;
|
// int count = 0;
|
||||||
for (Address address : range)
|
// for (Address address : range)
|
||||||
{
|
// {
|
||||||
VisicalcCell cell = getCell (address);
|
// VisicalcCell cell = getCell (address);
|
||||||
if (cell != null && cell.hasValue () && cell.getValue () != 0.0)
|
// if (cell != null && cell.hasValue () && cell.getValue () != 0.0)
|
||||||
++count;
|
// ++count;
|
||||||
}
|
// }
|
||||||
result = count;
|
// result = count;
|
||||||
|
String text = function.substring (7, function.length () - 1);
|
||||||
|
Count count = new Count (this, text);
|
||||||
|
result = count.getValue ();
|
||||||
}
|
}
|
||||||
else if (function.startsWith ("@MIN"))
|
else if (function.startsWith ("@MIN("))
|
||||||
{
|
{
|
||||||
double min = Double.MAX_VALUE;
|
// double min = Double.MAX_VALUE;
|
||||||
for (Address address : range)
|
// for (Address address : range)
|
||||||
if (min > getValue (address))
|
// if (min > getValue (address))
|
||||||
min = getValue (address);
|
// min = getValue (address);
|
||||||
result = min;
|
String text = function.substring (5, function.length () - 1);
|
||||||
|
Min min = new Min (this, text);
|
||||||
|
result = min.getValue ();
|
||||||
}
|
}
|
||||||
else if (function.startsWith ("@MAX"))
|
else if (function.startsWith ("@MAX("))
|
||||||
{
|
{
|
||||||
double max = Double.MIN_VALUE;
|
// double max = Double.MIN_VALUE;
|
||||||
for (Address address : range)
|
// for (Address address : range)
|
||||||
if (max < getValue (address))
|
// if (max < getValue (address))
|
||||||
max = getValue (address);
|
// max = getValue (address);
|
||||||
result = max;
|
// result = max;
|
||||||
}
|
String text = function.substring (5, function.length () - 1);
|
||||||
else if (function.startsWith ("@LOOKUP"))
|
Max max = new Max (this, text);
|
||||||
{
|
result = max.getValue ();
|
||||||
System.out.println ("Unfinished: " + function);
|
|
||||||
result = 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
System.out.println ("Unimplemented function: " + function);
|
System.out.println ("Unimplemented function: " + function);
|
||||||
@ -408,7 +415,7 @@ public class VisicalcSpreadsheet implements Iterable<VisicalcCell>
|
|||||||
|
|
||||||
public double getValue (Address address)
|
public double getValue (Address address)
|
||||||
{
|
{
|
||||||
VisicalcCell cell = sheet.get (address.sortValue);
|
Cell cell = sheet.get (address.sortValue);
|
||||||
return cell == null ? 0.0 : cell.getValue ();
|
return cell == null ? 0.0 : cell.getValue ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -418,7 +425,7 @@ public class VisicalcSpreadsheet implements Iterable<VisicalcCell>
|
|||||||
return getValue (address);
|
return getValue (address);
|
||||||
}
|
}
|
||||||
|
|
||||||
public VisicalcCell getCell (Address address)
|
public Cell getCell (Address address)
|
||||||
{
|
{
|
||||||
return sheet.get (address.sortValue);
|
return sheet.get (address.sortValue);
|
||||||
}
|
}
|
||||||
@ -429,7 +436,7 @@ public class VisicalcSpreadsheet implements Iterable<VisicalcCell>
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterator<VisicalcCell> iterator ()
|
public Iterator<Cell> iterator ()
|
||||||
{
|
{
|
||||||
return sheet.values ().iterator ();
|
return sheet.values ().iterator ();
|
||||||
}
|
}
|
||||||
@ -450,7 +457,7 @@ public class VisicalcSpreadsheet implements Iterable<VisicalcCell>
|
|||||||
int lastRow = 0;
|
int lastRow = 0;
|
||||||
int lastColumn = 0;
|
int lastColumn = 0;
|
||||||
|
|
||||||
for (VisicalcCell cell : sheet.values ())
|
for (Cell cell : sheet.values ())
|
||||||
{
|
{
|
||||||
while (lastRow < cell.address.row)
|
while (lastRow < cell.address.row)
|
||||||
{
|
{
|
23
src/com/bytezone/diskbrowser/visicalc/Sum.java
Normal file
23
src/com/bytezone/diskbrowser/visicalc/Sum.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package com.bytezone.diskbrowser.visicalc;
|
||||||
|
|
||||||
|
public class Sum
|
||||||
|
{
|
||||||
|
Range range;
|
||||||
|
Sheet parent;
|
||||||
|
|
||||||
|
public Sum (Sheet parent, String text)
|
||||||
|
{
|
||||||
|
this.parent = parent;
|
||||||
|
range = parent.getRange (text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getValue ()
|
||||||
|
{
|
||||||
|
double result = 0;
|
||||||
|
|
||||||
|
for (Address address : range)
|
||||||
|
result += parent.getCell (address).getValue ();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user