2016-03-07 04:37:01 +00:00
|
|
|
package com.bytezone.diskbrowser.visicalc;
|
|
|
|
|
2017-02-25 03:56:22 +00:00
|
|
|
import java.util.Iterator;
|
|
|
|
|
2016-03-07 12:16:11 +00:00
|
|
|
// 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
|
|
|
|
|
2017-02-25 03:56:22 +00:00
|
|
|
abstract class Function extends AbstractValue implements Iterable<Value>
|
2016-03-07 04:37:01 +00:00
|
|
|
{
|
2016-03-14 08:58:54 +00:00
|
|
|
protected final Sheet parent;
|
2016-03-17 04:40:43 +00:00
|
|
|
protected String functionName;
|
2016-03-14 08:58:54 +00:00
|
|
|
protected String functionText;
|
2017-02-25 03:56:22 +00:00
|
|
|
protected String fullText;
|
2016-03-16 06:15:39 +00:00
|
|
|
|
2016-03-07 04:37:01 +00:00
|
|
|
static Function getInstance (Sheet parent, String text)
|
|
|
|
{
|
2016-04-16 05:33:31 +00:00
|
|
|
if (text.charAt (0) != '@')
|
|
|
|
{
|
|
|
|
System.out.printf ("Unknown function: [%s]%n", text);
|
|
|
|
return new Error (parent, "@ERROR");
|
|
|
|
}
|
|
|
|
|
2017-02-26 10:44:10 +00:00
|
|
|
if (text.startsWith ("@ABS("))
|
|
|
|
return new Abs (parent, text);
|
|
|
|
|
|
|
|
if (text.startsWith ("@AND("))
|
|
|
|
return new And (parent, text);
|
|
|
|
|
|
|
|
if (text.startsWith ("@AVERAGE("))
|
|
|
|
return new Average (parent, text);
|
2016-03-07 04:37:01 +00:00
|
|
|
|
|
|
|
if (text.startsWith ("@COUNT("))
|
|
|
|
return new Count (parent, text);
|
|
|
|
|
2017-02-26 10:44:10 +00:00
|
|
|
if (text.startsWith ("@CHOOSE("))
|
|
|
|
return new Choose (parent, text);
|
2016-03-07 04:37:01 +00:00
|
|
|
|
2017-02-26 10:44:10 +00:00
|
|
|
if (text.startsWith ("@ERROR"))
|
|
|
|
return new Error (parent, text);
|
2016-03-07 04:37:01 +00:00
|
|
|
|
2016-03-09 10:38:53 +00:00
|
|
|
if (text.startsWith ("@IF("))
|
|
|
|
return new If (parent, text);
|
|
|
|
|
2016-03-15 04:40:57 +00:00
|
|
|
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);
|
|
|
|
|
2017-02-26 10:44:10 +00:00
|
|
|
if (text.startsWith ("@LOOKUP("))
|
|
|
|
return new Lookup (parent, text);
|
2016-03-15 04:40:57 +00:00
|
|
|
|
2017-02-26 10:44:10 +00:00
|
|
|
if (text.startsWith ("@MIN("))
|
|
|
|
return new Min (parent, text);
|
|
|
|
|
|
|
|
if (text.startsWith ("@MAX("))
|
|
|
|
return new Max (parent, text);
|
2016-03-11 01:52:22 +00:00
|
|
|
|
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
|
|
|
|
2017-02-26 10:44:10 +00:00
|
|
|
if (text.startsWith ("@NPV("))
|
|
|
|
return new Npv (parent, text);
|
|
|
|
|
|
|
|
if (text.startsWith ("@OR("))
|
|
|
|
return new Or (parent, text);
|
|
|
|
|
|
|
|
if (text.startsWith ("@PI"))
|
|
|
|
return new Pi (parent, text);
|
|
|
|
|
|
|
|
if (text.startsWith ("@SUM("))
|
|
|
|
return new Sum (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
|
|
|
{
|
2017-02-25 03:56:22 +00:00
|
|
|
super ("Function");
|
2016-03-09 10:38:53 +00:00
|
|
|
this.parent = parent;
|
2017-02-25 03:56:22 +00:00
|
|
|
fullText = text;
|
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-17 04:40:43 +00:00
|
|
|
{
|
|
|
|
functionName = text.substring (0, pos);
|
2016-03-16 06:15:39 +00:00
|
|
|
functionText = text.substring (pos + 1, text.length () - 1);
|
2016-03-17 04:40:43 +00:00
|
|
|
}
|
2016-03-16 06:15:39 +00:00
|
|
|
else
|
2016-03-17 04:40:43 +00:00
|
|
|
{
|
|
|
|
functionName = "";
|
2016-03-16 06:15:39 +00:00
|
|
|
functionText = "";
|
2016-03-17 04:40:43 +00:00
|
|
|
}
|
2016-03-16 06:15:39 +00:00
|
|
|
}
|
|
|
|
|
2017-02-25 03:56:22 +00:00
|
|
|
@Override
|
|
|
|
public Iterator<Value> iterator ()
|
|
|
|
{
|
|
|
|
return values.iterator ();
|
|
|
|
}
|
|
|
|
|
2016-03-09 10:38:53 +00:00
|
|
|
@Override
|
|
|
|
public String toString ()
|
|
|
|
{
|
2016-03-17 04:40:43 +00:00
|
|
|
return String.format ("Function: %s %s", functionName, functionText);
|
2016-03-09 10:38:53 +00:00
|
|
|
}
|
2016-03-07 04:37:01 +00:00
|
|
|
}
|