LCOV - code coverage report
Current view: top level - libreoffice/sc/inc - funcdesc.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 5 8 62.5 %
Date: 2012-12-27 Functions: 3 6 50.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #ifndef SC_FUNCDESC_HXX
      21             : #define SC_FUNCDESC_HXX
      22             : 
      23             : /* Function descriptions for function wizard / autopilot */
      24             : 
      25             : #include "scfuncs.hrc"
      26             : 
      27             : #include <formula/IFunctionDescription.hxx>
      28             : #include <sal/types.h>
      29             : #include <rtl/ustring.hxx>
      30             : 
      31             : #define MAX_FUNCCAT 12  /* maximum number of categories for functions */
      32             : #define LRU_MAX 10 /* maximal number of last recently used functions */
      33             : 
      34             : class ScFuncDesc;
      35             : class ScFunctionList;
      36             : class ScFunctionCategory;
      37             : class ScFunctionMgr;
      38             : 
      39             : /**
      40             :   Stores and generates human readable descriptions for spreadsheet-functions,
      41             :   e.g.\ functions used in formulas in calc
      42             : */
      43             : class ScFuncDesc : public formula::IFunctionDescription
      44             : {
      45             : public:
      46             :     ScFuncDesc();
      47             :     virtual ~ScFuncDesc();
      48             : 
      49             :     /**
      50             :       Clears the object
      51             : 
      52             :       Deletes all objets referenced by the pointers in the class,
      53             :       sets pointers to NULL, and all numerical variables to 0
      54             :     */
      55             :     void Clear();
      56             : 
      57             :     /**
      58             :       Fills a mapping with indexes for non-suppressed arguments
      59             : 
      60             :       Fills mapping from visible arguments to real arguments, e.g. if of 4
      61             :       parameters the second one is suppressed {0,2,3}. For VAR_ARGS
      62             :       parameters only one element is added to the end of the sequence.
      63             : 
      64             :       @param _rArgumens
      65             :       Vector, which the indices are written to
      66             :     */
      67             :     virtual void fillVisibleArgumentMapping(::std::vector<sal_uInt16>& _rArguments) const ;
      68             : 
      69             :     /**
      70             :       Returns the category of the function
      71             : 
      72             :       @return    the category of the function
      73             :     */
      74             :     virtual const formula::IFunctionCategory* getCategory() const ;
      75             : 
      76             :     /**
      77             :       Returns the description of the function
      78             : 
      79             :       @return    the description of the function, or an empty OUString if there is no description
      80             :     */
      81             :     virtual ::rtl::OUString getDescription() const ;
      82             : 
      83             :     /**
      84             :       Returns the function signature with parameters from the passed string array.
      85             : 
      86             :       @return    function signature with parameters
      87             :     */
      88             :     virtual ::rtl::OUString getFormula(const ::std::vector< ::rtl::OUString >& _aArguments) const ;
      89             : 
      90             :     /**
      91             :       Returns the name of the function
      92             : 
      93             :       @return    the name of the function, or an empty OUString if there is no name
      94             :     */
      95             :     virtual ::rtl::OUString getFunctionName() const ;
      96             : 
      97             :     /**
      98             :       Returns the help id of the function
      99             : 
     100             :       @return   help id of the function
     101             :     */
     102             :     virtual ::rtl::OString getHelpId() const ;
     103             : 
     104             :     /**
     105             :       Returns number of arguments
     106             : 
     107             :       @return   help id of the function
     108             :     */
     109             :     virtual sal_uInt32 getParameterCount() const ;
     110             : 
     111             :     /**
     112             :       Returns description of parameter at given position
     113             : 
     114             :       @param _nPos
     115             :       Position of the parameter
     116             : 
     117             :       @return   OUString description of the parameter
     118             :     */
     119             :     virtual ::rtl::OUString getParameterDescription(sal_uInt32 _nPos) const ;
     120             : 
     121             :     /**
     122             :       Returns name of parameter at given position
     123             : 
     124             :       @param _nPos
     125             :       Position of the parameter
     126             : 
     127             :       @return   OUString name of the parameter
     128             :     */
     129             :     virtual ::rtl::OUString getParameterName(sal_uInt32 _nPos) const ;
     130             : 
     131             :     /**
     132             :       Returns list of all parameter names
     133             : 
     134             :       @return OUString containing separated list of all parameter names
     135             :     */
     136             :     ::rtl::OUString GetParamList() const;
     137             : 
     138             :     /**
     139             :       Returns the full function signature
     140             : 
     141             :       @return   OUString of the form "FUNCTIONNAME( parameter list )"
     142             :     */
     143             :     virtual ::rtl::OUString getSignature() const ;
     144             : 
     145             :     /**
     146             :       Returns the number of non-suppressed arguments
     147             : 
     148             :       In case there are variable arguments the number of fixed non-suppressed
     149             :       arguments plus VAR_ARGS, same as for nArgCount (variable arguments can't
     150             :       be suppressed). The two functions are equal apart from return type and
     151             :       name.
     152             : 
     153             :       @return    number of non-suppressed arguments
     154             :     */
     155             :     sal_uInt16  GetSuppressedArgCount() const;
     156             :     virtual xub_StrLen getSuppressedArgumentCount() const ;
     157             : 
     158             :     /**
     159             :       Requests function data from AddInCollection
     160             : 
     161             :       Logs error message on failure for debugging purposes
     162             :     */
     163             :     virtual void initArgumentInfo()  const;
     164             : 
     165             :     /**
     166             :       Returns true if parameter at given position is optional
     167             : 
     168             :       @param _nPos
     169             :       Position of the parameter
     170             : 
     171             :       @return   true if optional, false if not optional
     172             :     */
     173             :     virtual bool isParameterOptional(sal_uInt32 _nPos) const ;
     174             : 
     175             :     /**
     176             :       Compares functions by name, respecting special characters
     177             : 
     178             :       @param a
     179             :       pointer to first function descriptor
     180             : 
     181             :       @param b
     182             :       pointer to second function descriptor
     183             : 
     184             :       @return "(a < b)"
     185             :     */
     186             :     static bool compareByName(const ScFuncDesc* a, const ScFuncDesc* b);
     187             : 
     188             :     /**
     189             :       Stores whether a parameter is optional or suppressed
     190             :     */
     191             :     struct ParameterFlags
     192             :     {
     193             :         bool    bOptional   :1;     /**< Parameter is optional */
     194             :         bool    bSuppress   :1;     /**< Suppress parameter in UI because not implemented yet */
     195             : 
     196         593 :         ParameterFlags() : bOptional(false), bSuppress(false) {}
     197             :     };
     198             : 
     199             : 
     200             : 
     201             :     ::rtl::OUString      *pFuncName;              /**< Function name */
     202             :     ::rtl::OUString      *pFuncDesc;              /**< Description of function */
     203             :     ::rtl::OUString     **ppDefArgNames;          /**< Parameter name(s) */
     204             :     ::rtl::OUString     **ppDefArgDescs;          /**< Description(s) of parameter(s) */
     205             :     ParameterFlags       *pDefArgFlags;           /**< Flags for each parameter */
     206             :     sal_uInt16            nFIndex;                /**< Unique function index */
     207             :     sal_uInt16            nCategory;              /**< Function category */
     208             :     sal_uInt16            nArgCount;              /**< All parameter count, suppressed and unsuppressed */
     209             :     rtl::OString          sHelpId;                /**< HelpId of function */
     210             :     bool                  bIncomplete         :1; /**< Incomplete argument info (set for add-in info from configuration) */
     211             :     bool                  bHasSuppressedArgs  :1; /**< Whether there is any suppressed parameter. */
     212             : };
     213             : 
     214             : /**
     215             :   List of spreadsheet functions.
     216             :   Generated by retrieving functions from resources, AddIns and StarOne AddIns,
     217             :   and storing these in one linked list. Functions can be retrieved by index and
     218             :   by iterating through the list, starting at the First element, and retrieving
     219             :   the Next elements one by one.
     220             : 
     221             :   The length of the longest function name can be retrieved for easier
     222             :   processing (i.e printing a function list).
     223             : */
     224             : class ScFunctionList
     225             : {
     226             : public:
     227             :     ScFunctionList();
     228             :     ~ScFunctionList();
     229             : 
     230           1 :     sal_uInt32 GetCount() const
     231           1 :                { return aFunctionList.size(); }
     232             : 
     233             :     const ScFuncDesc* First();
     234             : 
     235             :     const ScFuncDesc* Next();
     236             : 
     237             :     const ScFuncDesc* GetFunction( sal_uInt32 nIndex ) const;
     238             : 
     239           0 :     xub_StrLen GetMaxFuncNameLen() const
     240           0 :                { return nMaxFuncNameLen; }
     241             : 
     242             : private:
     243             :     ::std::vector<const ScFuncDesc*> aFunctionList; /**< List of functions */
     244             :     ::std::vector<const ScFuncDesc*>::iterator aFunctionListIter; /**< position in function list */
     245             :     xub_StrLen  nMaxFuncNameLen; /**< Length of longest function name */
     246             : };
     247             : 
     248             : /**
     249             :   Category of spreadsheet functions.
     250             : 
     251             :   Contains the name, index and function manager of a category,
     252             :   as well as a list of functions in the category
     253             : */
     254             : class ScFunctionCategory : public formula::IFunctionCategory
     255             : {
     256             : public:
     257          11 :     ScFunctionCategory(ScFunctionMgr* _pMgr,::std::vector<const ScFuncDesc*>* _pCategory,sal_uInt32 _nCategory)
     258          11 :             : m_pMgr(_pMgr),m_pCategory(_pCategory),m_nCategory(_nCategory){}
     259           0 :     virtual ~ScFunctionCategory(){}
     260             : 
     261             :     /**
     262             :       @return count of functions in this category
     263             :     */
     264             :     virtual sal_uInt32 getCount() const;
     265             :     virtual const formula::IFunctionManager* getFunctionManager() const;
     266             : 
     267             :     /**
     268             :       Gives the _nPos'th function in this category.
     269             : 
     270             :       @param _nPos
     271             :       position of function in this category.
     272             : 
     273             :       @return function at the _nPos postion in this category, null if _nPos out of bounds.
     274             :     */
     275             :     virtual const formula::IFunctionDescription* getFunction(sal_uInt32 _nPos) const;
     276             : 
     277             :     /**
     278             :       @return index number of this category.
     279             :     */
     280             :     virtual sal_uInt32 getNumber() const;
     281             :     virtual ::rtl::OUString getName() const;
     282             : 
     283             : private:
     284             :     ScFunctionMgr* m_pMgr; /**< function manager for this category */
     285             :     ::std::vector<const ScFuncDesc*>* m_pCategory; /**< list of functions in this category */
     286             :     mutable ::rtl::OUString m_sName; /**< name of this category */
     287             :     sal_uInt32 m_nCategory; /**< index number of this category */
     288             : };
     289             : 
     290             : #define SC_FUNCGROUP_COUNT  ID_FUNCTION_GRP_ADDINS
     291             : /**
     292             :   Stores spreadsheet functions in categories, including a cumulative ('All') category and makes them accessible.
     293             : */
     294             : class ScFunctionMgr : public formula::IFunctionManager
     295             : {
     296             : public:
     297             :     /**
     298             :       Retrieves all calc functions, generates cumulative ('All') category, and the categories.
     299             : 
     300             :       The function lists of the categories are sorted by (case insensitive) function name
     301             :     */
     302             :             ScFunctionMgr();
     303             :     virtual ~ScFunctionMgr();
     304             : 
     305             :     /**
     306             :       Returns name of category.
     307             : 
     308             :       @param _nCategoryNumber
     309             :       index of category
     310             : 
     311             :       @return name of the category specified by _nCategoryNumber, empty string if _nCategoryNumber out of bounds
     312             :     */
     313             :     static ::rtl::OUString GetCategoryName(sal_uInt32 _nCategoryNumber );
     314             : 
     315             :     /**
     316             :       Returns function by name.
     317             : 
     318             :       Searches for a function with the function name rFName, while ignoring case.
     319             : 
     320             :       @param rFName
     321             :       name of the function
     322             : 
     323             :       @return pointer to function with the name rFName, null if no such function was found.
     324             :     */
     325             :     const ScFuncDesc* Get( const ::rtl::OUString& rFName ) const;
     326             : 
     327             :     /**
     328             :       Returns function by index.
     329             : 
     330             :       Searches for a function with the function index nFIndex.
     331             : 
     332             :       @param nFIndex
     333             :       index of the function
     334             : 
     335             :       @return pointer to function with the index nFIndex, null if no such function was found.
     336             :     */
     337             :     const ScFuncDesc* Get( sal_uInt16 nFIndex ) const;
     338             : 
     339             :     /**
     340             :       Returns the first function in category nCategory.
     341             : 
     342             :       Selects nCategory as current category and returns first element of this.
     343             : 
     344             :       @param nCategory
     345             :       index of requested category
     346             : 
     347             :       @return pointer to first element in current category, null if nCategory out of bounds
     348             :     */
     349             :     const ScFuncDesc* First( sal_uInt16 nCategory = 0 ) const;
     350             : 
     351             :     /**
     352             :       Returns the next function of the current category.
     353             : 
     354             :       @return pointer to the next function in current category, null if current category not set.
     355             :     */
     356             :     const ScFuncDesc* Next() const;
     357             : 
     358             :     /**
     359             :       @return number of categories, not counting the cumulative category ('All')
     360             :     */
     361             :     virtual sal_uInt32 getCount() const;
     362             : 
     363             :     /**
     364             :       Returns a category.
     365             : 
     366             :       Creates an IFunctionCategory object from a category specified by nPos.
     367             : 
     368             :       @param nPos
     369             :       the index of the category, note that 0 maps to the first category not the cumulative ('All') category.
     370             : 
     371             :       @return pointer to an IFunctionCategory object, null if nPos out of bounds.
     372             :     */
     373             :     virtual const formula::IFunctionCategory* getCategory(sal_uInt32 nPos) const;
     374             : 
     375             :     /**
     376             :       Appends the last recently used functions.
     377             : 
     378             :       Takes the last recently used functions, but maximal LRU_MAX, and appends them to the given vector _rLastRUFunctions.
     379             : 
     380             :       @param _rLastRUFunctions
     381             :       a vector of pointer to IFunctionDescription, by reference.
     382             :     */
     383             :     virtual void fillLastRecentlyUsedFunctions(::std::vector< const formula::IFunctionDescription*>& _rLastRUFunctions) const;
     384             : 
     385             :     /**
     386             :       Implemented because of inheritance \see ScFunctionMgr::Get(const ::rtl::OUString&) const
     387             :     */
     388             :     virtual const formula::IFunctionDescription* getFunctionByName(const ::rtl::OUString& _sFunctionName) const;
     389             : 
     390             :     /**
     391             :       Maps Etoken to character
     392             : 
     393             :       Used for retrieving characters for parantheses and separators.
     394             : 
     395             :       @param _eToken
     396             :       token for which, the corresponding character is retrieved
     397             : 
     398             :       @return character
     399             :     */
     400             :     virtual sal_Unicode getSingleToken(const formula::IFunctionManager::EToken _eToken) const;
     401             : 
     402             : private:
     403             :     ScFunctionList* pFuncList; /**< list of all calc functions */
     404             :     ::std::vector<const ScFuncDesc*>* aCatLists[MAX_FUNCCAT]; /**< array of all categories, 0 is the cumulative ('All') category */
     405             :     mutable ::std::vector<const ScFuncDesc*>::iterator pCurCatListIter; /**< position in current category */
     406             :     mutable ::std::vector<const ScFuncDesc*>::iterator pCurCatListEnd; /**< end of current category */
     407             : };
     408             : 
     409             : #endif // SC_FUNCDESC_HXX
     410             : 
     411             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10