diff options
Diffstat (limited to 'kspread/kspread_functions_information.cpp')
-rw-r--r-- | kspread/kspread_functions_information.cpp | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/kspread/kspread_functions_information.cpp b/kspread/kspread_functions_information.cpp new file mode 100644 index 00000000..30d64263 --- /dev/null +++ b/kspread/kspread_functions_information.cpp @@ -0,0 +1,285 @@ +/* This file is part of the KDE project + Copyright (C) 1998-2002 The KSpread Team + www.koffice.org/kspread + Copyright (C) 2005 Tomas Mecir <mecirt@gmail.com> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +// built-in information functions + + +#include <config.h> +#include <sys/utsname.h> + +#include <tqdir.h> +#include <kdebug.h> +#include <tdelocale.h> + +#include "functions.h" +#include "valuecalc.h" +#include "valueconverter.h" + +#include "kspread_doc.h" +#include "kspread_sheet.h" + +using namespace KSpread; + +// prototypes (sorted alphabetically) +Value func_filename (valVector args, ValueCalc *calc, FuncExtra *); +Value func_info (valVector args, ValueCalc *calc, FuncExtra *); +Value func_isblank (valVector args, ValueCalc *calc, FuncExtra *); +Value func_isdate (valVector args, ValueCalc *calc, FuncExtra *); +Value func_iserr (valVector args, ValueCalc *calc, FuncExtra *); +Value func_iserror (valVector args, ValueCalc *calc, FuncExtra *); +Value func_iseven (valVector args, ValueCalc *calc, FuncExtra *); +Value func_islogical (valVector args, ValueCalc *calc, FuncExtra *); +Value func_isna (valVector args, ValueCalc *calc, FuncExtra *); +Value func_isnottext (valVector args, ValueCalc *calc, FuncExtra *); +Value func_isnum (valVector args, ValueCalc *calc, FuncExtra *); +Value func_isodd (valVector args, ValueCalc *calc, FuncExtra *); +Value func_isref (valVector args, ValueCalc *calc, FuncExtra *); +Value func_istext (valVector args, ValueCalc *calc, FuncExtra *); +Value func_istime (valVector args, ValueCalc *calc, FuncExtra *); +Value func_n (valVector args, ValueCalc *calc, FuncExtra *); +Value func_type (valVector args, ValueCalc *calc, FuncExtra *); +Value func_version (valVector args, ValueCalc *calc, FuncExtra *); + +// registers all information functions +void RegisterInformationFunctions() +{ + FunctionRepository* repo = FunctionRepository::self(); + Function *f; + + f = new Function ("FILENAME", func_filename); + f->setParamCount (0); + repo->add (f); + f = new Function ("INFO", func_info); + repo->add (f); + f = new Function ("ISBLANK", func_isblank); + repo->add (f); + f = new Function ("ISDATE", func_isdate); + repo->add (f); + f = new Function ("ISERR", func_iserr); + repo->add (f); + f = new Function ("ISERROR", func_iserror); + repo->add (f); + f = new Function ("ISEVEN", func_iseven); + repo->add (f); + f = new Function ("ISLOGICAL", func_islogical); + repo->add (f); + f = new Function ("ISNA", func_isna); + repo->add (f); + f = new Function ("ISNONTEXT", func_isnottext); + repo->add (f); + f = new Function ("ISNOTTEXT", func_isnottext); + repo->add (f); + f = new Function ("ISNUM", func_isnum); + repo->add (f); + f = new Function ("ISNUMBER", func_isnum); + repo->add (f); + f = new Function ("ISODD", func_isodd); + repo->add (f); + f = new Function ("ISREF", func_isref); + f->setNeedsExtra (true); + repo->add (f); + f = new Function ("ISTEXT", func_istext); + repo->add (f); + f = new Function ("ISTIME", func_istime); + repo->add (f); + f = new Function ("N", func_n); + repo->add (f); + f = new Function ("TYPE", func_type); + f->setAcceptArray (); + repo->add (f); +} + +// Function: INFO +Value func_info (valVector args, ValueCalc *calc, FuncExtra *) +{ + TQString type = calc->conv()->asString (args[0]).asString().lower(); + + if (type == "directory") + return Value (TQDir::currentDirPath()); + + if (type == "release") + return Value (TQString (VERSION)); + + if ( type == "numfile" ) + return Value ((int) Doc::documents().count()); + + if (type == "recalc") + { + TQString result; + if (calc->doc()) { + if (calc->doc()->delayCalculation()) + result = i18n ("Manual"); + else + result = i18n ("Automatic"); + } + return Value (result); + } + + if (type == "memavail") + // not supported + return Value::errorVALUE(); + if (type == "memused") + // not supported + return Value::errorVALUE(); + if (type == "origin") + // not supported + return Value::errorVALUE(); + + if (type == "system") { + struct utsname name; + if (uname (&name) >= 0) + return Value (TQString (name.sysname)); + } + + if (type == "totmem") + // not supported + return Value::errorVALUE(); + + if (type == "osversion") + { + struct utsname name; + if (uname (&name) >= 0) + { + TQString os = TQString("%1 %2 (%3)").arg( name.sysname ). + arg( name.release ).arg( name.machine ); + return Value (os); + } + } + + return Value::errorVALUE(); +} + +// Function: ISBLANK +Value func_isblank (valVector args, ValueCalc *, FuncExtra *) +{ + return Value (args[0].isEmpty()); +} + +// Function: ISLOGICAL +Value func_islogical (valVector args, ValueCalc *, FuncExtra *) +{ + return Value (args[0].isBoolean()); +} + +// Function: ISTEXT +Value func_istext (valVector args, ValueCalc *, FuncExtra *) +{ + return Value (args[0].isString()); +} + +// Function: ISREF +Value func_isref (valVector, ValueCalc */*calc*/, FuncExtra *e) +{ + // no reference ? + if ((e == 0) || (e->ranges[0].col1 == -1) || (e->ranges[0].row1 == -1)) + return Value (false); + // if we are here, it is a reference (cell/range) + return Value (true); +} + +// Function: ISNOTTEXT +Value func_isnottext (valVector args, ValueCalc *, FuncExtra *) +{ + return Value (args[0].isString() ? false : true); +} + +// Function: ISNUM +Value func_isnum (valVector args, ValueCalc *, FuncExtra *) +{ + return Value (args[0].isNumber()); +} + +// Function: ISTIME +Value func_istime (valVector args, ValueCalc *, FuncExtra *) +{ + return Value ((args[0].format() == Value::fmt_Time) + || (args[0].format() == Value::fmt_DateTime)); +} + +// Function: ISDATE +Value func_isdate (valVector args, ValueCalc *, FuncExtra *) +{ + return Value ((args[0].format() == Value::fmt_Date) + || (args[0].format() == Value::fmt_DateTime)); +} + +// Function: ISODD +Value func_isodd (valVector args, ValueCalc *calc, FuncExtra *) +{ + return Value (calc->isEven(args[0]) ? false : true); +} + +// Function: ISEVEN +Value func_iseven (valVector args, ValueCalc *calc, FuncExtra *) +{ + return Value (calc->isEven(args[0])); +} + +// Function: ISERR +Value func_iserr (valVector args, ValueCalc *, FuncExtra *) +{ + return (args[0].isError() && + (args[0].errorMessage() != Value::errorNA().errorMessage())); +} + +// Function: ISERROR +Value func_iserror (valVector args, ValueCalc *, FuncExtra *) +{ + return args[0].isError(); +} + +// Function: ISNA +Value func_isna (valVector args, ValueCalc *, FuncExtra *) +{ + return (args[0].isError() && + (args[0].errorMessage() == Value::errorNA().errorMessage())); +} + +// Function: TYPE +Value func_type (valVector args, ValueCalc *, FuncExtra *) +{ + // Returns 1 for numbers, 2 for text, 4 for boolean, 16 for error, + // 64 for arrays + if (args[0].isArray()) + return Value (64); + if (args[0].isNumber()) + return Value (1); + if (args[0].isString()) + return Value (2); + if (args[0].isBoolean()) + return Value (4); + if (args[0].isError()) + return Value (16); + + // something else ? + return Value (0); +} + +Value func_filename (valVector, ValueCalc *calc, FuncExtra *) +{ + return Value (calc->doc()->url().prettyURL()); +} + +// Function: N +Value func_n (valVector args, ValueCalc *calc, FuncExtra *) +{ + return calc->conv()->asFloat (args[0]); +} |