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

181 lines
3.8 KiB
Java
Raw Normal View History

2016-03-07 04:37:01 +00:00
package com.bytezone.diskbrowser.visicalc;
2016-03-07 12:16:11 +00:00
import java.util.regex.Matcher;
import java.util.regex.Pattern;
// http://www.bricklin.com/history/refcard1.htm
// Functions:
// @AVERAGE
// @NPV
// @LOOKUP(v,range)
// @NA
// @ERROR
// @PI
// @ABS
// @INT
// @EXP
// @SQRT
// @LN
// @LOG10
// @SIN
// @ASIN
// @COS
// @ACOS
// @TAN
// @ATAN
2016-03-11 01:52:22 +00:00
abstract class Function implements Value
2016-03-07 04:37:01 +00:00
{
2016-03-11 01:52:22 +00:00
private static final Pattern rangePattern = Pattern
2016-03-07 12:16:11 +00:00
.compile ("\\(([A-B]?[A-Z])([0-9]{1,3})\\.\\.\\.([A-B]?[A-Z])([0-9]{1,3})\\)?");
private static final Pattern addressList = Pattern.compile ("\\(([^,]+(,[^,]+)*)\\)");
2016-03-14 08:58:54 +00:00
protected final Sheet parent;
protected String functionText;
2016-03-16 06:15:39 +00:00
2016-03-16 19:32:25 +00:00
protected ValueType valueType;
2016-03-16 06:15:39 +00:00
protected double value;
2016-03-09 10:38:53 +00:00
2016-03-07 04:37:01 +00:00
static Function getInstance (Sheet parent, String text)
{
if (text.startsWith ("@LOOKUP("))
return new Lookup (parent, text);
if (text.startsWith ("@COUNT("))
return new Count (parent, text);
if (text.startsWith ("@MIN("))
return new Min (parent, text);
if (text.startsWith ("@MAX("))
return new Max (parent, text);
if (text.startsWith ("@SUM("))
return new Sum (parent, text);
2016-03-09 10:38:53 +00:00
if (text.startsWith ("@IF("))
return new If (parent, text);
2016-03-10 09:21:47 +00:00
if (text.startsWith ("@OR("))
return new Or (parent, text);
if (text.startsWith ("@AND("))
return new And (parent, text);
2016-03-15 04:40:57 +00:00
if (text.startsWith ("@NPV("))
return new Npv (parent, text);
if (text.startsWith ("@ABS("))
return new Abs (parent, text);
if (text.startsWith ("@INT("))
return new Int (parent, text);
2016-03-10 02:39:23 +00:00
if (text.startsWith ("@ISERROR("))
return new IsError (parent, text);
2016-03-15 04:40:57 +00:00
if (text.startsWith ("@ISNA("))
return new IsNa (parent, text);
if (text.startsWith ("@PI"))
return new Pi (parent, text);
if (text.startsWith ("@ERROR"))
2016-03-11 01:52:22 +00:00
return new Error (parent, text);
2016-03-14 08:58:54 +00:00
if (text.equals ("@NA"))
2016-03-15 04:40:57 +00:00
return new Na (parent, text);
2016-03-14 08:58:54 +00:00
System.out.printf ("Unknown function: [%s]%n", text);
2016-03-15 04:40:57 +00:00
return new Error (parent, "@ERROR");
2016-03-07 04:37:01 +00:00
}
2016-03-11 01:52:22 +00:00
Function (Sheet parent, String text)
2016-03-09 10:38:53 +00:00
{
this.parent = parent;
2016-03-11 01:52:22 +00:00
// get function's parameter string
2016-03-10 02:39:23 +00:00
int pos = text.indexOf ('(');
2016-03-14 08:58:54 +00:00
if (pos >= 0)
2016-03-16 06:15:39 +00:00
functionText = text.substring (pos + 1, text.length () - 1);
else
functionText = "";
}
2016-03-16 19:32:25 +00:00
@Override
public ValueType getValueType ()
{
return valueType;
}
2016-03-16 06:15:39 +00:00
@Override
public boolean isError ()
{
2016-03-16 19:32:25 +00:00
return valueType == ValueType.ERROR;
2016-03-16 06:15:39 +00:00
}
@Override
public boolean isNaN ()
{
return Double.isNaN (value);
2016-03-09 10:38:53 +00:00
}
2016-03-07 12:16:11 +00:00
2016-03-11 21:56:02 +00:00
@Override
2016-03-16 06:15:39 +00:00
public double getValue ()
2016-03-11 21:56:02 +00:00
{
2016-03-16 19:32:25 +00:00
assert valueType == ValueType.VALUE : "Function ValueType = " + valueType;
2016-03-16 06:15:39 +00:00
return value;
2016-03-11 21:56:02 +00:00
}
@Override
2016-03-16 06:15:39 +00:00
public String getText ()
2016-03-11 21:56:02 +00:00
{
2016-03-16 19:32:25 +00:00
return isNaN () ? "NaN" : isError () ? "Error" : "";
2016-03-11 21:56:02 +00:00
}
2016-03-11 01:52:22 +00:00
protected Range getRange (String text)
2016-03-07 12:16:11 +00:00
{
Range range = null;
2016-03-11 01:52:22 +00:00
Matcher m = rangePattern.matcher (text);
if (m.find ())
2016-03-07 12:16:11 +00:00
{
Address fromAddress = new Address (m.group (1), m.group (2));
Address toAddress = new Address (m.group (3), m.group (4));
range = new Range (fromAddress, toAddress);
}
if (range != null)
return range;
m = addressList.matcher (text);
2016-03-11 01:52:22 +00:00
if (m.find ())
2016-03-07 12:16:11 +00:00
{
String[] cells = m.group (1).split (",");
range = new Range (cells);
}
if (range != null)
return range;
int pos = text.indexOf ("...");
if (pos > 0)
{
String from = text.substring (0, pos);
String to = text.substring (pos + 3);
Address fromAddress = new Address (from);
Address toAddress = new Address (to);
range = new Range (fromAddress, toAddress);
}
2016-03-10 09:21:47 +00:00
if (range == null)
2016-03-11 01:52:22 +00:00
System.out.printf ("null range [%s]%n", text);
2016-03-07 12:16:11 +00:00
return range;
}
2016-03-09 10:38:53 +00:00
@Override
public String toString ()
{
2016-03-10 02:39:23 +00:00
return String.format ("Function: %s", functionText);
2016-03-09 10:38:53 +00:00
}
2016-03-07 04:37:01 +00:00
}