dmolony-DiskBrowser/src/com/bytezone/diskbrowser/visicalc/Cell.java

168 lines
3.8 KiB
Java
Raw Normal View History

2016-03-04 03:56:28 +00:00
package com.bytezone.diskbrowser.visicalc;
2016-03-09 10:38:53 +00:00
class Cell implements Comparable<Cell>, Value
2016-03-04 03:56:28 +00:00
{
final Address address;
2016-03-06 08:05:32 +00:00
private final Sheet parent;
2016-03-04 03:56:28 +00:00
2016-03-05 21:53:29 +00:00
private char format = ' ';
2016-03-04 03:56:28 +00:00
private char repeatingChar;
private String repeat = "";
2016-03-09 10:38:53 +00:00
2016-03-11 21:56:02 +00:00
private String label;
2016-03-09 10:38:53 +00:00
private String expressionText;
2016-03-11 21:56:02 +00:00
private Value value;
// private boolean hasValue;
2016-03-04 03:56:28 +00:00
2016-03-06 08:05:32 +00:00
public Cell (Sheet parent, Address address)
2016-03-04 03:56:28 +00:00
{
this.parent = parent;
this.address = address;
}
2016-03-08 09:39:35 +00:00
void format (String format)
{
// /FG - general
// /FD - default
// /FI - integer
// /F$ - dollars and cents
// /FL - left justified
// /FR - right justified
2016-03-10 02:39:23 +00:00
// /F* - graph (histogram)
2016-03-08 09:39:35 +00:00
if (format.startsWith ("/F"))
this.format = format.charAt (2);
else if (format.startsWith ("/-"))
{
repeatingChar = format.charAt (2);
for (int i = 0; i < 20; i++)
repeat += repeatingChar;
}
else
System.out.printf ("Unexpected format [%s]%n", format);
}
2016-03-11 21:56:02 +00:00
void setValue (String command)
2016-03-04 03:56:28 +00:00
{
2016-03-04 05:27:14 +00:00
switch (command.charAt (0))
2016-03-04 03:56:28 +00:00
{
2016-03-04 05:27:14 +00:00
case '"':
label = command.substring (1);
break;
default:
2016-03-09 10:38:53 +00:00
expressionText = command;
2016-03-04 03:56:28 +00:00
}
2016-03-09 10:38:53 +00:00
// FUTURE.VC
2016-03-10 09:21:47 +00:00
if (false)
if (address.sortValue == 67)
expressionText = "1000";
else if (address.sortValue == 131)
expressionText = "10.5";
else if (address.sortValue == 195)
expressionText = "12";
else if (address.sortValue == 259)
expressionText = "8";
// IRA.VC
if (false)
if (address.sortValue == 66)
expressionText = "10";
else if (address.sortValue == 130)
expressionText = "30";
else if (address.sortValue == 194)
expressionText = "65";
else if (address.sortValue == 258)
expressionText = "1000";
else if (address.sortValue == 386)
expressionText = "15";
2016-03-11 01:52:22 +00:00
// CARLOAN.VC
if (false)
if (address.sortValue == 67)
expressionText = "9375";
else if (address.sortValue == 131)
expressionText = "4500";
else if (address.sortValue == 195)
expressionText = "24";
else if (address.sortValue == 259)
expressionText = "11.9";
else if (address.sortValue == 579)
expressionText = "D9*G5/(1-((1+G5)^-D4))";
2016-03-04 03:56:28 +00:00
}
2016-03-05 21:53:29 +00:00
char getFormat ()
{
return format;
}
2016-03-11 21:56:02 +00:00
// this should be called by Sheet when drawing, so do all formatting here
2016-03-09 10:38:53 +00:00
String getText ()
2016-03-04 03:56:28 +00:00
{
2016-03-09 10:38:53 +00:00
if (label != null)
return label;
if (repeatingChar > 0)
return repeat;
2016-03-11 01:52:22 +00:00
return "?";
2016-03-09 10:38:53 +00:00
}
2016-03-05 02:25:15 +00:00
2016-03-11 21:56:02 +00:00
@Override
public boolean hasValue ()
{
if (label != null || repeatingChar > 0)
return false;
if (value == null)
createValue ();
return value.hasValue ();
}
// this should be called when doing calculations
2016-03-09 10:38:53 +00:00
@Override
public double getValue ()
{
2016-03-11 21:56:02 +00:00
if (value == null)
createValue ();
return value.getValue ();
}
@Override
public String getError ()
{
if (value == null)
createValue ();
return hasValue () ? "" : "@NA";
}
private void createValue ()
{
if (expressionText == null)
2016-03-10 02:39:23 +00:00
{
2016-03-11 21:56:02 +00:00
System.out.printf ("%s null expression text %n", address);
value = Function.getInstance (parent, "@ERROR()");
2016-03-10 02:39:23 +00:00
}
2016-03-11 21:56:02 +00:00
else
// System.out.printf ("%s Instantiating [%s]%n", address, expressionText);
value = new Expression (parent, expressionText);
2016-03-04 03:56:28 +00:00
}
@Override
public String toString ()
{
2016-03-09 10:38:53 +00:00
String contents = "";
if (label != null)
contents = "Labl: " + label;
else if (repeatingChar != 0)
contents = "Rept: " + repeatingChar;
else if (expressionText != null)
contents = "Exp : " + expressionText;
return String.format ("[Cell:%5s %s]", address, contents);
2016-03-04 03:56:28 +00:00
}
@Override
2016-03-06 08:05:32 +00:00
public int compareTo (Cell o)
2016-03-04 03:56:28 +00:00
{
return address.compareTo (o.address);
}
}