LCOV - code coverage report
Current view: top level - sc/source/core/data - global.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 314 540 58.1 %
Date: 2012-08-25 Functions: 39 58 67.2 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 280 636 44.0 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*************************************************************************
       3                 :            :  *
       4                 :            :  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       5                 :            :  *
       6                 :            :  * Copyright 2000, 2010 Oracle and/or its affiliates.
       7                 :            :  *
       8                 :            :  * OpenOffice.org - a multi-platform office productivity suite
       9                 :            :  *
      10                 :            :  * This file is part of OpenOffice.org.
      11                 :            :  *
      12                 :            :  * OpenOffice.org is free software: you can redistribute it and/or modify
      13                 :            :  * it under the terms of the GNU Lesser General Public License version 3
      14                 :            :  * only, as published by the Free Software Foundation.
      15                 :            :  *
      16                 :            :  * OpenOffice.org is distributed in the hope that it will be useful,
      17                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      18                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19                 :            :  * GNU Lesser General Public License version 3 for more details
      20                 :            :  * (a copy is included in the LICENSE file that accompanied this code).
      21                 :            :  *
      22                 :            :  * You should have received a copy of the GNU Lesser General Public License
      23                 :            :  * version 3 along with OpenOffice.org.  If not, see
      24                 :            :  * <http://www.openoffice.org/license.html>
      25                 :            :  * for a copy of the LGPLv3 License.
      26                 :            :  *
      27                 :            :  ************************************************************************/
      28                 :            : 
      29                 :            : #include <vcl/svapp.hxx>
      30                 :            : #include "scitems.hxx"
      31                 :            : #include <svx/algitem.hxx>
      32                 :            : #include <editeng/brshitem.hxx>
      33                 :            : #include <editeng/editobj.hxx>
      34                 :            : #include <editeng/scripttypeitem.hxx>
      35                 :            : #include <svl/srchitem.hxx>
      36                 :            : #include <editeng/langitem.hxx>
      37                 :            : #include <sfx2/docfile.hxx>
      38                 :            : #include <sfx2/dispatch.hxx>
      39                 :            : #include <sfx2/objsh.hxx>
      40                 :            : #include <sfx2/viewfrm.hxx>
      41                 :            : #include <sfx2/viewsh.hxx>
      42                 :            : #include <svl/stritem.hxx>
      43                 :            : #include <svl/zforlist.hxx>
      44                 :            : #include <svl/zformat.hxx>
      45                 :            : #include <vcl/image.hxx>
      46                 :            : #include <vcl/virdev.hxx>
      47                 :            : #include <sal/macros.h>
      48                 :            : #include <tools/rcid.h>
      49                 :            : #include <unotools/charclass.hxx>
      50                 :            : #include <stdlib.h>
      51                 :            : #include <time.h>
      52                 :            : #include <ctype.h>
      53                 :            : #include <numeric>
      54                 :            : 
      55                 :            : 
      56                 :            : #include <i18npool/mslangid.hxx>
      57                 :            : #include <com/sun/star/lang/Locale.hpp>
      58                 :            : #include <comphelper/processfactory.hxx>
      59                 :            : #include <unotools/calendarwrapper.hxx>
      60                 :            : #include <unotools/collatorwrapper.hxx>
      61                 :            : #include <com/sun/star/i18n/CollatorOptions.hpp>
      62                 :            : #include <unotools/intlwrapper.hxx>
      63                 :            : #include <unotools/syslocale.hxx>
      64                 :            : #include <unotools/transliterationwrapper.hxx>
      65                 :            : 
      66                 :            : #include "global.hxx"
      67                 :            : #include "scresid.hxx"
      68                 :            : #include "autoform.hxx"
      69                 :            : #include "document.hxx"
      70                 :            : #include "patattr.hxx"
      71                 :            : #include "addincol.hxx"
      72                 :            : #include "adiasync.hxx"
      73                 :            : #include "userlist.hxx"
      74                 :            : #include "interpre.hxx"
      75                 :            : #include "strload.hxx"
      76                 :            : #include "docpool.hxx"
      77                 :            : #include "unitconv.hxx"
      78                 :            : #include "compiler.hxx"
      79                 :            : #include "parclass.hxx"
      80                 :            : #include "funcdesc.hxx"
      81                 :            : #include "globstr.hrc"
      82                 :            : #include "scfuncs.hrc"
      83                 :            : #include "sc.hrc"
      84                 :            : #include "scmod.hxx"
      85                 :            : #include "appoptio.hxx"
      86                 :            : 
      87                 :            : // -----------------------------------------------------------------------
      88                 :            : 
      89                 :            : using ::rtl::OUString;
      90                 :            : using ::rtl::OUStringBuffer;
      91                 :            : 
      92                 :            : ScDocShellRef*  ScGlobal::pDrawClipDocShellRef = NULL;
      93                 :            : SvxSearchItem*  ScGlobal::pSearchItem = NULL;
      94                 :            : ScAutoFormat*   ScGlobal::pAutoFormat = NULL;
      95                 :            : FuncCollection* ScGlobal::pFuncCollection = NULL;
      96                 :            : ScUnoAddInCollection* ScGlobal::pAddInCollection = NULL;
      97                 :            : ScUserList*     ScGlobal::pUserList = NULL;
      98                 :            : String**        ScGlobal::ppRscString = NULL;
      99                 :            : LanguageType    ScGlobal::eLnge = LANGUAGE_SYSTEM;
     100                 :            : ::com::sun::star::lang::Locale*     ScGlobal::pLocale = NULL;
     101                 :            : SvtSysLocale*   ScGlobal::pSysLocale = NULL;
     102                 :            : const CharClass*  ScGlobal::pCharClass = NULL;
     103                 :            : const LocaleDataWrapper*  ScGlobal::pLocaleData = NULL;
     104                 :            : CalendarWrapper* ScGlobal::pCalendar = NULL;
     105                 :            : CollatorWrapper* ScGlobal::pCollator = NULL;
     106                 :            : CollatorWrapper* ScGlobal::pCaseCollator = NULL;
     107                 :            : ::utl::TransliterationWrapper* ScGlobal::pTransliteration = NULL;
     108                 :            : ::utl::TransliterationWrapper* ScGlobal::pCaseTransliteration = NULL;
     109                 :         51 : ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XOrdinalSuffix> ScGlobal::xOrdinalSuffix = NULL;
     110                 :            : IntlWrapper*    ScGlobal::pScIntlWrapper = NULL;
     111                 :            : sal_Unicode     ScGlobal::cListDelimiter = ',';
     112                 :            : String*         ScGlobal::pEmptyString = NULL;
     113                 :            : ::rtl::OUString*       ScGlobal::pEmptyOUString = NULL;
     114                 :            : String*         ScGlobal::pStrClipDocName = NULL;
     115                 :            : 
     116                 :            : SvxBrushItem*   ScGlobal::pEmptyBrushItem = NULL;
     117                 :            : SvxBrushItem*   ScGlobal::pButtonBrushItem = NULL;
     118                 :            : SvxBrushItem*   ScGlobal::pEmbeddedBrushItem = NULL;
     119                 :            : SvxBrushItem*   ScGlobal::pProtectedBrushItem = NULL;
     120                 :            : 
     121                 :            : ImageList*      ScGlobal::pOutlineBitmaps = NULL;
     122                 :            : 
     123                 :            : ScFunctionList* ScGlobal::pStarCalcFunctionList = NULL;
     124                 :            : ScFunctionMgr*  ScGlobal::pStarCalcFunctionMgr  = NULL;
     125                 :            : 
     126                 :            : ScUnitConverter* ScGlobal::pUnitConverter = NULL;
     127                 :            : SvNumberFormatter* ScGlobal::pEnglishFormatter = NULL;
     128                 :            : 
     129                 :            : double          ScGlobal::nScreenPPTX           = 96.0;
     130                 :            : double          ScGlobal::nScreenPPTY           = 96.0;
     131                 :            : 
     132                 :            : sal_uInt16          ScGlobal::nDefFontHeight        = 225;
     133                 :            : sal_uInt16          ScGlobal::nStdRowHeight         = 256;
     134                 :            : 
     135                 :            : long            ScGlobal::nLastRowHeightExtra   = 0;
     136                 :            : long            ScGlobal::nLastColWidthExtra    = STD_EXTRA_WIDTH;
     137                 :            : 
     138                 :            : static sal_uInt16 nPPTZoom = 0;     // ScreenZoom used to determine nScreenPPTX/Y
     139                 :            : 
     140                 :            : 
     141                 :            : class SfxViewShell;
     142                 :            : SfxViewShell* pScActiveViewShell = NULL;            //! als Member !!!!!
     143                 :            : sal_uInt16 nScClickMouseModifier = 0;                   //! dito
     144                 :            : sal_uInt16 nScFillModeMouseModifier = 0;                //! dito
     145                 :            : 
     146                 :            : // Hack: ScGlobal::GetUserList() muss InitAppOptions in der UI aufrufen,
     147                 :            : //       damit UserList aus Cfg geladen wird
     148                 :            : 
     149                 :            : void global_InitAppOptions();
     150                 :            : 
     151                 :            : //========================================================================
     152                 :            : //
     153                 :            : //      statische Funktionen
     154                 :            : //
     155                 :            : //========================================================================
     156                 :            : 
     157                 :    3112088 : sal_Bool ScGlobal::HasAttrChanged( const SfxItemSet&  rNewAttrs,
     158                 :            :                                const SfxItemSet&  rOldAttrs,
     159                 :            :                                const sal_uInt16       nWhich )
     160                 :            : {
     161                 :    3112088 :     sal_Bool                bInvalidate = false;
     162                 :    3112088 :     const SfxItemState  eNewState   = rNewAttrs.GetItemState( nWhich );
     163                 :    3112088 :     const SfxItemState  eOldState   = rOldAttrs.GetItemState( nWhich );
     164                 :            : 
     165                 :            :     //----------------------------------------------------------
     166                 :            : 
     167         [ +  + ]:    3112088 :     if ( eNewState == eOldState )
     168                 :            :     {
     169                 :            :         // beide Items gesetzt
     170                 :            :         // PoolItems, d.h. Pointer-Vergleich zulaessig
     171         [ +  + ]:    3107253 :         if ( SFX_ITEM_SET == eOldState )
     172                 :    1057695 :             bInvalidate = (&rNewAttrs.Get( nWhich ) != &rOldAttrs.Get( nWhich ));
     173                 :            :     }
     174                 :            :     else
     175                 :            :     {
     176                 :            :         // ein Default-Item dabei
     177                 :            :         // PoolItems, d.h. Item-Vergleich noetig
     178                 :            : 
     179                 :            :         const SfxPoolItem& rOldItem = ( SFX_ITEM_SET == eOldState )
     180                 :        556 :                     ? rOldAttrs.Get( nWhich )
     181         [ +  + ]:       4835 :                     : rOldAttrs.GetPool()->GetDefaultItem( nWhich );
     182                 :            : 
     183                 :            :         const SfxPoolItem& rNewItem = ( SFX_ITEM_SET == eNewState )
     184                 :       4279 :                     ? rNewAttrs.Get( nWhich )
     185         [ +  + ]:       4835 :                     : rNewAttrs.GetPool()->GetDefaultItem( nWhich );
     186                 :            : 
     187                 :       4835 :         bInvalidate = sal::static_int_cast<sal_Bool>(rNewItem != rOldItem);
     188                 :            :     }
     189                 :            : 
     190                 :    3112088 :     return bInvalidate;
     191                 :            : }
     192                 :            : 
     193                 :        257 : sal_uLong ScGlobal::GetStandardFormat( SvNumberFormatter& rFormatter,
     194                 :            :         sal_uLong nFormat, short nType )
     195                 :            : {
     196                 :        257 :     const SvNumberformat* pFormat = rFormatter.GetEntry( nFormat );
     197         [ +  - ]:        257 :     if ( pFormat )
     198                 :        257 :         return rFormatter.GetStandardFormat( nFormat, nType, pFormat->GetLanguage() );
     199                 :        257 :     return rFormatter.GetStandardFormat( nType, eLnge );
     200                 :            : }
     201                 :            : 
     202                 :       1512 : sal_uLong ScGlobal::GetStandardFormat( double fNumber, SvNumberFormatter& rFormatter,
     203                 :            :         sal_uLong nFormat, short nType )
     204                 :            : {
     205                 :       1512 :     const SvNumberformat* pFormat = rFormatter.GetEntry( nFormat );
     206         [ +  - ]:       1512 :     if ( pFormat )
     207                 :            :         return rFormatter.GetStandardFormat( fNumber, nFormat, nType,
     208                 :       1512 :             pFormat->GetLanguage() );
     209                 :       1512 :     return rFormatter.GetStandardFormat( nType, eLnge );
     210                 :            : }
     211                 :            : 
     212                 :            : 
     213                 :         51 : SvNumberFormatter* ScGlobal::GetEnglishFormatter()
     214                 :            : {
     215         [ +  + ]:         51 :     if ( !pEnglishFormatter )
     216                 :            :     {
     217                 :            :         pEnglishFormatter = new SvNumberFormatter(
     218 [ +  - ][ +  - ]:          1 :             ::comphelper::getProcessServiceFactory(), LANGUAGE_ENGLISH_US );
     219                 :          1 :         pEnglishFormatter->SetEvalDateFormat( NF_EVALDATEFORMAT_INTL_FORMAT );
     220                 :            :     }
     221                 :         51 :     return pEnglishFormatter;
     222                 :            : }
     223                 :            : 
     224                 :            : 
     225                 :            : //------------------------------------------------------------------------
     226                 :            : 
     227                 :     133943 : sal_Bool ScGlobal::CheckWidthInvalidate( bool& bNumFormatChanged,
     228                 :            :                                      const SfxItemSet& rNewAttrs,
     229                 :            :                                      const SfxItemSet& rOldAttrs )
     230                 :            : {
     231                 :            :     // Ueberpruefen, ob Attributaenderungen in rNewAttrs gegnueber
     232                 :            :     // rOldAttrs die Textbreite an einer Zelle ungueltig machen
     233                 :            : 
     234                 :            :     bNumFormatChanged =
     235                 :     133943 :             HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_VALUE_FORMAT );
     236                 :            :     return ( bNumFormatChanged
     237                 :     132114 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_LANGUAGE_FORMAT )
     238                 :     132114 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT )
     239                 :     131659 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CJK_FONT )
     240                 :     131238 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CTL_FONT )
     241                 :     130975 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_HEIGHT )
     242                 :     130934 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CJK_FONT_HEIGHT )
     243                 :     130856 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CTL_FONT_HEIGHT )
     244                 :     130793 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_WEIGHT )
     245                 :     128816 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CJK_FONT_WEIGHT )
     246                 :     128778 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CTL_FONT_WEIGHT )
     247                 :     128741 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_POSTURE )
     248                 :     128700 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CJK_FONT_POSTURE )
     249                 :     128662 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_CTL_FONT_POSTURE )
     250                 :     128625 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_UNDERLINE )
     251                 :     128514 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_OVERLINE )
     252                 :     128460 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_CROSSEDOUT )
     253                 :     128381 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_CONTOUR )
     254                 :     128346 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_FONT_SHADOWED )
     255                 :     128311 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_STACKED )
     256                 :     128311 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_ROTATE_VALUE )
     257                 :     128279 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_ROTATE_MODE )
     258                 :     128279 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_LINEBREAK )
     259                 :     128259 :         || HasAttrChanged( rNewAttrs, rOldAttrs, ATTR_MARGIN )
     260   [ +  +  +  -  :    3112088 :         );
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          -  +  +  +  -  
             +  +  +  + ]
     261                 :            : }
     262                 :            : 
     263                 :          0 : const SvxSearchItem& ScGlobal::GetSearchItem()
     264                 :            : {
     265         [ #  # ]:          0 :     if (!pSearchItem)
     266                 :            :     {
     267         [ #  # ]:          0 :         pSearchItem = new SvxSearchItem( SID_SEARCH_ITEM );
     268                 :          0 :         pSearchItem->SetAppFlag( SVX_SEARCHAPP_CALC );
     269                 :            :     }
     270                 :          0 :     return *pSearchItem;
     271                 :            : }
     272                 :            : 
     273                 :          0 : void ScGlobal::SetSearchItem( const SvxSearchItem& rNew )
     274                 :            : {
     275                 :            :     // Hier waere ein Zuweisungsoperator ganz nett:
     276         [ #  # ]:          0 :     delete pSearchItem;
     277                 :          0 :     pSearchItem = (SvxSearchItem*)rNew.Clone();
     278                 :            : 
     279                 :          0 :     pSearchItem->SetWhich( SID_SEARCH_ITEM );
     280                 :          0 :     pSearchItem->SetAppFlag( SVX_SEARCHAPP_CALC );
     281                 :          0 : }
     282                 :            : 
     283                 :          0 : void ScGlobal::ClearAutoFormat()
     284                 :            : {
     285         [ #  # ]:          0 :     if (pAutoFormat!=NULL)
     286                 :            :     {
     287         [ #  # ]:          0 :         delete pAutoFormat;
     288                 :          0 :         pAutoFormat=NULL;
     289                 :            :     }
     290                 :          0 : }
     291                 :            : 
     292                 :         25 : ScAutoFormat* ScGlobal::GetAutoFormat()
     293                 :            : {
     294                 :         25 :     return pAutoFormat;
     295                 :            : }
     296                 :            : 
     297                 :        432 : ScAutoFormat* ScGlobal::GetOrCreateAutoFormat()
     298                 :            : {
     299         [ +  + ]:        432 :     if ( !pAutoFormat )
     300                 :            :     {
     301         [ +  - ]:          1 :         pAutoFormat = new ScAutoFormat;
     302                 :          1 :         pAutoFormat->Load();
     303                 :            :     }
     304                 :            : 
     305                 :        432 :     return pAutoFormat;
     306                 :            : }
     307                 :            : 
     308                 :       2297 : FuncCollection* ScGlobal::GetFuncCollection()
     309                 :            : {
     310         [ +  + ]:       2297 :     if (!pFuncCollection)
     311         [ +  - ]:         13 :         pFuncCollection = new FuncCollection();
     312                 :       2297 :     return pFuncCollection;
     313                 :            : }
     314                 :            : 
     315                 :       2326 : ScUnoAddInCollection* ScGlobal::GetAddInCollection()
     316                 :            : {
     317         [ +  + ]:       2326 :     if (!pAddInCollection)
     318         [ +  - ]:         24 :         pAddInCollection = new ScUnoAddInCollection();
     319                 :       2326 :     return pAddInCollection;
     320                 :            : }
     321                 :            : 
     322                 :         14 : ScUserList* ScGlobal::GetUserList()
     323                 :            : {
     324                 :            :     // Hack: Cfg-Item an der App ggF. laden
     325                 :            : 
     326                 :         14 :     global_InitAppOptions();
     327                 :            : 
     328         [ -  + ]:         14 :     if (!pUserList)
     329         [ #  # ]:          0 :         pUserList = new ScUserList();
     330                 :         14 :     return pUserList;
     331                 :            : }
     332                 :            : 
     333                 :         51 : void ScGlobal::SetUserList( const ScUserList* pNewList )
     334                 :            : {
     335         [ +  - ]:         51 :     if ( pNewList )
     336                 :            :     {
     337         [ +  - ]:         51 :         if ( !pUserList )
     338         [ +  - ]:         51 :             pUserList = new ScUserList( *pNewList );
     339                 :            :         else
     340                 :          0 :             *pUserList = *pNewList;
     341                 :            :     }
     342                 :            :     else
     343                 :            :     {
     344         [ #  # ]:          0 :         delete pUserList;
     345                 :          0 :         pUserList = NULL;
     346                 :            :     }
     347                 :         51 : }
     348                 :            : 
     349                 :      31034 : const String& ScGlobal::GetRscString( sal_uInt16 nIndex )
     350                 :            : {
     351                 :            :     OSL_ENSURE( nIndex < STR_COUNT, "ScGlobal::GetRscString - invalid string index");
     352         [ +  + ]:      31034 :     if( !ppRscString[ nIndex ] )
     353                 :            :     {
     354                 :        966 :         OpCode eOp = ocNone;
     355                 :            :         // Map former globstr.src strings moved to compiler.src
     356   [ -  -  +  -  :        966 :         switch (nIndex)
             -  +  +  + ]
     357                 :            :         {
     358                 :            :             case STR_NULL_ERROR:
     359                 :          0 :                 eOp = ocErrNull;
     360                 :          0 :                 break;
     361                 :            :             case STR_DIV_ZERO:
     362                 :          0 :                 eOp = ocErrDivZero;
     363                 :          0 :                 break;
     364                 :            :             case STR_NO_VALUE:
     365                 :          3 :                 eOp = ocErrValue;
     366                 :          3 :                 break;
     367                 :            :             case STR_NOREF_STR:
     368                 :          0 :                 eOp = ocErrRef;
     369                 :          0 :                 break;
     370                 :            :             case STR_NO_NAME_REF:
     371                 :          0 :                 eOp = ocErrName;
     372                 :          0 :                 break;
     373                 :            :             case STR_NUM_ERROR:
     374                 :          1 :                 eOp = ocErrNum;
     375                 :          1 :                 break;
     376                 :            :             case STR_NV_STR:
     377                 :          6 :                 eOp = ocErrNA;
     378                 :          6 :                 break;
     379                 :            :             default:
     380                 :            :                 ;   // nothing
     381                 :            :         }
     382         [ +  + ]:        966 :         if (eOp != ocNone)
     383                 :         10 :             ppRscString[ nIndex ] = new String(
     384         [ +  - ]:         10 :                     ScCompiler::GetNativeSymbol( eOp));
     385                 :            :         else
     386                 :        956 :             ppRscString[ nIndex ] = new String(
     387 [ +  - ][ +  - ]:        956 :                     ScRscStrLoader( RID_GLOBSTR, nIndex ).GetString());
     388                 :            :     }
     389                 :      31034 :     return *ppRscString[ nIndex ];
     390                 :            : }
     391                 :            : 
     392                 :        190 : String ScGlobal::GetErrorString(sal_uInt16 nErrNumber)
     393                 :            : {
     394                 :        190 :     String sResStr;
     395   [ +  +  -  -  :        190 :     switch (nErrNumber)
          -  +  -  -  +  
                      + ]
     396                 :            :     {
     397                 :         36 :         case NOTAVAILABLE          : nErrNumber = STR_NV_STR; break;
     398                 :         24 :         case errNoRef              : nErrNumber = STR_NO_REF_TABLE; break;
     399                 :          0 :         case errNoName             : nErrNumber = STR_NO_NAME_REF; break;
     400                 :          0 :         case errNoAddin            : nErrNumber = STR_NO_ADDIN; break;
     401                 :          0 :         case errNoMacro            : nErrNumber = STR_NO_MACRO; break;
     402                 :            :         case errDoubleRef          :
     403                 :         12 :         case errNoValue            : nErrNumber = STR_NO_VALUE; break;
     404                 :          0 :         case errNoCode             : nErrNumber = STR_NULL_ERROR; break;
     405                 :          0 :         case errDivisionByZero     : nErrNumber = STR_DIV_ZERO; break;
     406                 :         81 :         case errIllegalFPOperation : nErrNumber = STR_NUM_ERROR; break;
     407                 :            : 
     408 [ +  - ][ +  - ]:         37 :         default          : sResStr = GetRscString(STR_ERROR_STR);
     409 [ +  - ][ +  - ]:         37 :                            sResStr += String::CreateFromInt32( nErrNumber );
                 [ +  - ]
     410                 :         37 :                            nErrNumber = 0;
     411                 :         37 :                            break;
     412                 :            :     }
     413         [ +  + ]:        190 :     if( nErrNumber )
     414 [ +  - ][ +  - ]:        153 :         sResStr = GetRscString( nErrNumber );
     415                 :        190 :     return sResStr;
     416                 :            : }
     417                 :            : 
     418                 :          0 : String ScGlobal::GetLongErrorString(sal_uInt16 nErrNumber)
     419                 :            : {
     420   [ #  #  #  #  :          0 :     switch (nErrNumber)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     421                 :            :     {
     422                 :            :         case 0:
     423                 :          0 :             break;
     424                 :            :         case 1:
     425                 :            :         case errIllegalArgument:
     426                 :          0 :             nErrNumber = STR_LONG_ERR_ILL_ARG;
     427                 :          0 :         break;
     428                 :            :         case 2:
     429                 :            :         case 3:
     430                 :            :         case 4:
     431                 :            :         case 5:
     432                 :            :         case errIllegalFPOperation:
     433                 :          0 :             nErrNumber = STR_LONG_ERR_ILL_FPO;
     434                 :          0 :         break;
     435                 :            :         case errIllegalChar:
     436                 :          0 :             nErrNumber = STR_LONG_ERR_ILL_CHAR;
     437                 :          0 :         break;
     438                 :            :         case errIllegalParameter:
     439                 :          0 :             nErrNumber = STR_LONG_ERR_ILL_PAR;
     440                 :          0 :         break;
     441                 :            :         case errSeparator:
     442                 :          0 :             nErrNumber = STR_LONG_ERR_ILL_SEP;
     443                 :          0 :         break;
     444                 :            :         case errPair:
     445                 :            :         case errPairExpected:
     446                 :          0 :             nErrNumber = STR_LONG_ERR_PAIR;
     447                 :          0 :         break;
     448                 :            :         case errOperatorExpected:
     449                 :          0 :             nErrNumber = STR_LONG_ERR_OP_EXP;
     450                 :          0 :         break;
     451                 :            :         case errVariableExpected:
     452                 :            :         case errParameterExpected:
     453                 :          0 :             nErrNumber = STR_LONG_ERR_VAR_EXP;
     454                 :          0 :         break;
     455                 :            :         case errCodeOverflow:
     456                 :          0 :             nErrNumber = STR_LONG_ERR_CODE_OVF;
     457                 :          0 :         break;
     458                 :            :         case errStringOverflow:
     459                 :          0 :             nErrNumber = STR_LONG_ERR_STR_OVF;
     460                 :          0 :         break;
     461                 :            :         case errStackOverflow:
     462                 :            :         case errInterpOverflow:
     463                 :          0 :             nErrNumber = STR_LONG_ERR_STACK_OVF;
     464                 :          0 :         break;
     465                 :            :         case errIllegalJump:
     466                 :            :         case errUnknownState:
     467                 :            :         case errUnknownVariable:
     468                 :            :         case errUnknownOpCode:
     469                 :            :         case errUnknownStackVariable:
     470                 :            :         case errUnknownToken:
     471                 :            :         case errNoCode:
     472                 :            :         case errDoubleRef:
     473                 :          0 :             nErrNumber = STR_LONG_ERR_SYNTAX;
     474                 :          0 :         break;
     475                 :            :         case errCircularReference:
     476                 :          0 :             nErrNumber = STR_LONG_ERR_CIRC_REF;
     477                 :          0 :         break;
     478                 :            :         case errNoConvergence:
     479                 :          0 :             nErrNumber = STR_LONG_ERR_NO_CONV;
     480                 :          0 :         break;
     481                 :            :         case errNoRef:
     482                 :          0 :             nErrNumber = STR_LONG_ERR_NO_REF;
     483                 :          0 :         break;
     484                 :            :         case errNoName:
     485                 :          0 :             nErrNumber = STR_LONG_ERR_NO_NAME;
     486                 :          0 :         break;
     487                 :            :         case errNoAddin:
     488                 :          0 :             nErrNumber = STR_LONG_ERR_NO_ADDIN;
     489                 :          0 :         break;
     490                 :            :         case errNoMacro:
     491                 :          0 :             nErrNumber = STR_LONG_ERR_NO_MACRO;
     492                 :          0 :         break;
     493                 :            :         case errDivisionByZero:
     494                 :          0 :             nErrNumber = STR_LONG_ERR_DIV_ZERO;
     495                 :          0 :         break;
     496                 :            :         case errNestedArray:
     497                 :          0 :             nErrNumber = STR_ERR_LONG_NESTED_ARRAY;
     498                 :          0 :         break;
     499                 :            :         case errNoValue:
     500                 :          0 :             nErrNumber = STR_LONG_ERR_NO_VALUE;
     501                 :          0 :         break;
     502                 :            :         case NOTAVAILABLE:
     503                 :          0 :             nErrNumber = STR_LONG_ERR_NV;
     504                 :          0 :         break;
     505                 :            :         default:
     506                 :          0 :             nErrNumber = STR_ERROR_STR;
     507                 :          0 :         break;
     508                 :            :     }
     509                 :          0 :     String aRes( GetRscString( nErrNumber ) );
     510                 :          0 :     return aRes;
     511                 :            : }
     512                 :            : 
     513                 :          0 : SvxBrushItem* ScGlobal::GetButtonBrushItem()
     514                 :            : {
     515                 :          0 :     pButtonBrushItem->SetColor( Application::GetSettings().GetStyleSettings().GetFaceColor() );
     516                 :          0 :     return pButtonBrushItem;
     517                 :            : }
     518                 :            : 
     519                 :      61677 : const String& ScGlobal::GetEmptyString()
     520                 :            : {
     521                 :      61677 :     return *pEmptyString;
     522                 :            : }
     523                 :            : 
     524                 :       2292 : const ::rtl::OUString& ScGlobal::GetEmptyOUString()
     525                 :            : {
     526                 :       2292 :     return *pEmptyOUString;
     527                 :            : }
     528                 :            : 
     529                 :          2 : ImageList* ScGlobal::GetOutlineSymbols()
     530                 :            : {
     531                 :          2 :     ImageList*& rpImageList = pOutlineBitmaps;
     532         [ +  + ]:          2 :     if( !rpImageList )
     533 [ +  - ][ +  - ]:          1 :         rpImageList = new ImageList( ScResId( RID_OUTLINEBITMAPS ) );
     534                 :          2 :     return rpImageList;
     535                 :            : }
     536                 :            : 
     537                 :         51 : void ScGlobal::Init()
     538                 :            : {
     539         [ +  - ]:         51 :     pEmptyString = new String;
     540                 :         51 :     pEmptyOUString = new ::rtl::OUString;
     541                 :            : 
     542                 :            :     //  Die Default-Sprache fuer Zahlenformate (ScGlobal::eLnge)
     543                 :            :     //  muss immer LANGUAGE_SYSTEM sein
     544                 :            :     //! Dann kann auch die Variable raus
     545                 :         51 :     eLnge = LANGUAGE_SYSTEM;
     546                 :            : 
     547                 :            :     //! Wenn Sortierung etc. von der Sprache der installierten Offfice-Version
     548                 :            :     //! abhaengen sollen, hier "Application::GetSettings().GetUILanguage()"
     549         [ +  - ]:         51 :     pSysLocale = new SvtSysLocale;
     550                 :         51 :     pCharClass = pSysLocale->GetCharClassPtr();
     551                 :         51 :     pLocaleData = pSysLocale->GetLocaleDataPtr();
     552                 :            : 
     553                 :         51 :     ppRscString = new String *[ STR_COUNT ];
     554         [ +  + ]:      24378 :     for( sal_uInt16 nC = 0 ; nC < STR_COUNT ; nC++ ) ppRscString[ nC ] = NULL;
     555                 :            : 
     556 [ +  - ][ +  - ]:         51 :     pEmptyBrushItem = new SvxBrushItem( Color( COL_TRANSPARENT ), ATTR_BACKGROUND );
     557 [ +  - ][ +  - ]:         51 :     pButtonBrushItem = new SvxBrushItem( Color(), ATTR_BACKGROUND );
     558 [ +  - ][ +  - ]:         51 :     pEmbeddedBrushItem = new SvxBrushItem( Color( COL_LIGHTCYAN ), ATTR_BACKGROUND );
     559 [ +  - ][ +  - ]:         51 :     pProtectedBrushItem = new SvxBrushItem( Color( COL_LIGHTGRAY ), ATTR_BACKGROUND );
     560                 :            : 
     561                 :         51 :     UpdatePPT(NULL);
     562                 :            :     //ScCompiler::InitSymbolsNative();
     563                 :            :     // ScParameterClassification _after_ Compiler, needs function resources if
     564                 :            :     // arguments are to be merged in, which in turn need strings of function
     565                 :            :     // names from the compiler.
     566                 :         51 :     ScParameterClassification::Init();
     567                 :         51 :     srand( (unsigned) time( NULL ) );       // Random Seed Init fuer Interpreter
     568                 :            : 
     569                 :         51 :     InitAddIns();
     570                 :            : 
     571 [ +  - ][ +  - ]:         51 :     pStrClipDocName = new String( ScResId( SCSTR_NONAME ) );
     572                 :         51 :     *pStrClipDocName += '1';
     573                 :            : 
     574                 :            :     //  ScDocumentPool::InitVersionMaps() ist schon vorher gerufen worden
     575                 :         51 : }
     576                 :            : 
     577                 :         51 : void ScGlobal::UpdatePPT( OutputDevice* pDev )
     578                 :            : {
     579                 :         51 :     sal_uInt16 nCurrentZoom = Application::GetSettings().GetStyleSettings().GetScreenZoom();
     580         [ +  - ]:         51 :     if ( nCurrentZoom != nPPTZoom )
     581                 :            :     {
     582                 :            :         //  Screen PPT values must be updated when ScreenZoom has changed.
     583                 :            :         //  If called from Window::DataChanged, the window is passed as pDev,
     584                 :            :         //  to make sure LogicToPixel uses a device which already uses the new zoom.
     585                 :            :         //  For the initial settings, NULL is passed and GetDefaultDevice used.
     586                 :            : 
     587         [ +  - ]:         51 :         if ( !pDev )
     588         [ +  - ]:         51 :             pDev = Application::GetDefaultDevice();
     589 [ +  - ][ +  - ]:         51 :         Point aPix1000 = pDev->LogicToPixel( Point(1000,1000), MAP_TWIP );
                 [ +  - ]
     590                 :         51 :         nScreenPPTX = aPix1000.X() / 1000.0;
     591                 :         51 :         nScreenPPTY = aPix1000.Y() / 1000.0;
     592                 :         51 :         nPPTZoom = nCurrentZoom;
     593                 :            :     }
     594                 :         51 : }
     595                 :            : 
     596                 :          0 : const String& ScGlobal::GetClipDocName()
     597                 :            : {
     598                 :          0 :     return *pStrClipDocName;
     599                 :            : }
     600                 :            : 
     601                 :          0 : void ScGlobal::SetClipDocName( const String& rNew )
     602                 :            : {
     603                 :          0 :     *pStrClipDocName = rNew;
     604                 :          0 : }
     605                 :            : 
     606                 :            : 
     607                 :         51 : void ScGlobal::InitTextHeight(SfxItemPool* pPool)
     608                 :            : {
     609         [ +  - ]:         51 :     if (!pPool)
     610                 :            :     {
     611                 :            :         OSL_FAIL("kein Pool bei ScGlobal::InitTextHeight");
     612                 :            :         return;
     613                 :            :     }
     614                 :            : 
     615         [ +  - ]:         51 :     const ScPatternAttr* pPattern = (const ScPatternAttr*)&pPool->GetDefaultItem(ATTR_PATTERN);
     616         [ +  - ]:         51 :     if (!pPattern)
     617                 :            :     {
     618                 :            :         OSL_FAIL("kein Default-Pattern bei ScGlobal::InitTextHeight");
     619                 :            :         return;
     620                 :            :     }
     621                 :            : 
     622         [ +  - ]:         51 :     OutputDevice* pDefaultDev = Application::GetDefaultDevice();
     623         [ +  - ]:         51 :     VirtualDevice aVirtWindow( *pDefaultDev );
     624 [ +  - ][ +  - ]:         51 :     aVirtWindow.SetMapMode(MAP_PIXEL);
                 [ +  - ]
     625         [ +  - ]:         51 :     Font aDefFont;
     626         [ +  - ]:         51 :     pPattern->GetFont(aDefFont, SC_AUTOCOL_BLACK, &aVirtWindow);        // font color doesn't matter here
     627         [ +  - ]:         51 :     aVirtWindow.SetFont(aDefFont);
     628                 :            :     sal_uInt16 nTest = static_cast<sal_uInt16>(
     629 [ +  - ][ +  - ]:         51 :         aVirtWindow.PixelToLogic(Size(0, aVirtWindow.GetTextHeight()), MAP_TWIP).Height());
         [ +  - ][ +  - ]
     630                 :            : 
     631         [ -  + ]:         51 :     if (nTest > nDefFontHeight)
     632                 :          0 :         nDefFontHeight = nTest;
     633                 :            : 
     634         [ +  - ]:         51 :     const SvxMarginItem* pMargin = (const SvxMarginItem*)&pPattern->GetItem(ATTR_MARGIN);
     635                 :            : 
     636                 :            :     nTest = static_cast<sal_uInt16>(
     637                 :         51 :         nDefFontHeight + pMargin->GetTopMargin() + pMargin->GetBottomMargin() - STD_ROWHEIGHT_DIFF);
     638                 :            : 
     639         [ -  + ]:         51 :     if (nTest > nStdRowHeight)
     640 [ +  - ][ +  - ]:         51 :         nStdRowHeight = nTest;
     641                 :            : }
     642                 :            : 
     643                 :         18 : void ScGlobal::Clear()
     644                 :            : {
     645                 :            :     // asyncs _vor_ ExitExternalFunc zerstoeren!
     646         [ -  + ]:         18 :     for( ScAddInAsyncs::iterator it = theAddInAsyncTbl.begin(); it != theAddInAsyncTbl.end(); ++it )
     647                 :            :     {
     648 [ #  # ][ #  # ]:          0 :         delete *it;
     649                 :            :     }
     650                 :         18 :     theAddInAsyncTbl.clear();
     651                 :         18 :     ExitExternalFunc();
     652         [ +  + ]:         18 :     DELETEZ(pAutoFormat);
     653         [ -  + ]:         18 :     DELETEZ(pSearchItem);
     654         [ +  + ]:         18 :     DELETEZ(pFuncCollection);
     655         [ +  + ]:         18 :     DELETEZ(pAddInCollection);
     656         [ +  - ]:         18 :     DELETEZ(pUserList);
     657                 :            : 
     658         [ +  + ]:       8604 :     for( sal_uInt16 nC = 0 ; nC < STR_COUNT ; nC++ )
     659 [ +  - ][ +  + ]:       8586 :         if( ppRscString ) delete ppRscString[ nC ];
     660         [ +  - ]:         18 :     delete[] ppRscString;
     661                 :         18 :     ppRscString = NULL;
     662                 :            : 
     663         [ -  + ]:         18 :     DELETEZ(pStarCalcFunctionList);     // vor ResMgr zerstoeren!
     664         [ -  + ]:         18 :     DELETEZ(pStarCalcFunctionMgr);
     665                 :         18 :     ScParameterClassification::Exit();
     666                 :         18 :     ScCompiler::DeInit();
     667                 :         18 :     ScInterpreter::GlobalExit();            // statischen Stack loeschen
     668                 :            : 
     669         [ +  - ]:         18 :     DELETEZ(pEmptyBrushItem);
     670         [ +  - ]:         18 :     DELETEZ(pButtonBrushItem);
     671         [ +  - ]:         18 :     DELETEZ(pEmbeddedBrushItem);
     672         [ +  - ]:         18 :     DELETEZ(pProtectedBrushItem);
     673         [ +  + ]:         18 :     DELETEZ(pOutlineBitmaps);
     674         [ +  + ]:         18 :     DELETEZ(pEnglishFormatter);
     675         [ -  + ]:         18 :     DELETEZ(pCaseTransliteration);
     676         [ +  + ]:         18 :     DELETEZ(pTransliteration);
     677         [ -  + ]:         18 :     DELETEZ(pCaseCollator);
     678         [ +  + ]:         18 :     DELETEZ(pCollator);
     679         [ -  + ]:         18 :     DELETEZ(pCalendar);
     680                 :            :     //! do NOT delete pCharClass since it is a pointer to the single SvtSysLocale instance
     681                 :         18 :     pCharClass = NULL;
     682                 :            :     //! do NOT delete pLocaleData since it is a pointer to the single SvtSysLocale instance
     683                 :         18 :     pLocaleData = NULL;
     684         [ +  - ]:         18 :     DELETEZ(pSysLocale);
     685         [ +  - ]:         18 :     DELETEZ(pLocale);
     686         [ -  + ]:         18 :     DELETEZ(pScIntlWrapper);
     687         [ +  - ]:         18 :     DELETEZ(pStrClipDocName);
     688                 :            : 
     689         [ -  + ]:         18 :     DELETEZ(pUnitConverter);
     690                 :            : 
     691                 :         18 :     ScDocumentPool::DeleteVersionMaps();
     692                 :            : 
     693         [ +  - ]:         18 :     DELETEZ(pEmptyString);
     694         [ +  - ]:         18 :     DELETEZ(pEmptyOUString);
     695                 :         18 : }
     696                 :            : 
     697                 :            : //------------------------------------------------------------------------
     698                 :            : 
     699                 :          0 : CharSet ScGlobal::GetCharsetValue( const String& rCharSet )
     700                 :            : {
     701                 :            :     // new TextEncoding values
     702         [ #  # ]:          0 :     if ( CharClass::isAsciiNumeric( rCharSet ) )
     703                 :            :     {
     704                 :          0 :         sal_Int32 nVal = rCharSet.ToInt32();
     705 [ #  # ][ #  # ]:          0 :         if ( !nVal || nVal == RTL_TEXTENCODING_DONTKNOW )
     706                 :          0 :             return osl_getThreadTextEncoding();
     707                 :          0 :         return (CharSet) nVal;
     708                 :            :     }
     709                 :            :     // old CharSet values for compatibility
     710         [ #  # ]:          0 :     else if (rCharSet.EqualsIgnoreCaseAscii("ANSI")     ) return RTL_TEXTENCODING_MS_1252;
     711         [ #  # ]:          0 :     else if (rCharSet.EqualsIgnoreCaseAscii("MAC")      ) return RTL_TEXTENCODING_APPLE_ROMAN;
     712         [ #  # ]:          0 :     else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC")    ) return RTL_TEXTENCODING_IBM_850;
     713         [ #  # ]:          0 :     else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC_437")) return RTL_TEXTENCODING_IBM_437;
     714         [ #  # ]:          0 :     else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC_850")) return RTL_TEXTENCODING_IBM_850;
     715         [ #  # ]:          0 :     else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC_860")) return RTL_TEXTENCODING_IBM_860;
     716         [ #  # ]:          0 :     else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC_861")) return RTL_TEXTENCODING_IBM_861;
     717         [ #  # ]:          0 :     else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC_863")) return RTL_TEXTENCODING_IBM_863;
     718         [ #  # ]:          0 :     else if (rCharSet.EqualsIgnoreCaseAscii("IBMPC_865")) return RTL_TEXTENCODING_IBM_865;
     719                 :          0 :     else return osl_getThreadTextEncoding();
     720                 :            : }
     721                 :            : 
     722                 :            : //------------------------------------------------------------------------
     723                 :            : 
     724                 :          0 : String ScGlobal::GetCharsetString( CharSet eVal )
     725                 :            : {
     726                 :            :     const sal_Char* pChar;
     727   [ #  #  #  #  :          0 :     switch ( eVal )
          #  #  #  #  #  
                      # ]
     728                 :            :     {
     729                 :            :         // old CharSet strings for compatibility
     730                 :          0 :         case RTL_TEXTENCODING_MS_1252:      pChar = "ANSI";         break;
     731                 :          0 :         case RTL_TEXTENCODING_APPLE_ROMAN:  pChar = "MAC";          break;
     732                 :            :         // IBMPC == IBMPC_850
     733                 :          0 :         case RTL_TEXTENCODING_IBM_437:      pChar = "IBMPC_437";    break;
     734                 :          0 :         case RTL_TEXTENCODING_IBM_850:      pChar = "IBMPC_850";    break;
     735                 :          0 :         case RTL_TEXTENCODING_IBM_860:      pChar = "IBMPC_860";    break;
     736                 :          0 :         case RTL_TEXTENCODING_IBM_861:      pChar = "IBMPC_861";    break;
     737                 :          0 :         case RTL_TEXTENCODING_IBM_863:      pChar = "IBMPC_863";    break;
     738                 :          0 :         case RTL_TEXTENCODING_IBM_865:      pChar = "IBMPC_865";    break;
     739                 :          0 :         case RTL_TEXTENCODING_DONTKNOW:     pChar = "SYSTEM";       break;
     740                 :            :         // new string of TextEncoding value
     741                 :            :         default:
     742                 :          0 :             return String::CreateFromInt32( eVal );
     743                 :            :     }
     744         [ #  # ]:          0 :     return rtl::OUString::createFromAscii(pChar);
     745                 :            : }
     746                 :            : 
     747                 :            : //------------------------------------------------------------------------
     748                 :            : 
     749                 :          0 : bool ScGlobal::HasStarCalcFunctionList()
     750                 :            : {
     751                 :          0 :     return ( pStarCalcFunctionList != NULL );
     752                 :            : }
     753                 :            : 
     754                 :        812 : ScFunctionList* ScGlobal::GetStarCalcFunctionList()
     755                 :            : {
     756         [ +  + ]:        812 :     if ( !pStarCalcFunctionList )
     757         [ +  - ]:          5 :         pStarCalcFunctionList = new ScFunctionList;
     758                 :            : 
     759                 :        812 :     return pStarCalcFunctionList;
     760                 :            : }
     761                 :            : 
     762                 :            : //------------------------------------------------------------------------
     763                 :            : 
     764                 :          3 : ScFunctionMgr* ScGlobal::GetStarCalcFunctionMgr()
     765                 :            : {
     766         [ +  - ]:          3 :     if ( !pStarCalcFunctionMgr )
     767         [ +  - ]:          3 :         pStarCalcFunctionMgr = new ScFunctionMgr;
     768                 :            : 
     769                 :          3 :     return pStarCalcFunctionMgr;
     770                 :            : }
     771                 :            : 
     772                 :        412 : void ScGlobal::ResetFunctionList()
     773                 :            : {
     774                 :            :     // FunctionMgr has pointers into FunctionList, must also be updated
     775                 :            : 
     776         [ +  + ]:        412 :     DELETEZ( pStarCalcFunctionMgr );
     777         [ +  + ]:        412 :     DELETEZ( pStarCalcFunctionList );
     778                 :        412 : }
     779                 :            : 
     780                 :            : //------------------------------------------------------------------------
     781                 :            : 
     782                 :          0 : ScUnitConverter* ScGlobal::GetUnitConverter()
     783                 :            : {
     784         [ #  # ]:          0 :     if ( !pUnitConverter )
     785         [ #  # ]:          0 :         pUnitConverter = new ScUnitConverter;
     786                 :            : 
     787                 :          0 :     return pUnitConverter;
     788                 :            : }
     789                 :            : 
     790                 :            : 
     791                 :            : //------------------------------------------------------------------------
     792                 :            : 
     793                 :      15210 : const sal_Unicode* ScGlobal::UnicodeStrChr( const sal_Unicode* pStr,
     794                 :            :             sal_Unicode c )
     795                 :            : {
     796         [ -  + ]:      15210 :     if ( !pStr )
     797                 :          0 :         return NULL;
     798         [ +  + ]:      28302 :     while ( *pStr )
     799                 :            :     {
     800         [ +  + ]:      17058 :         if ( *pStr == c )
     801                 :       3966 :             return pStr;
     802                 :      13092 :         pStr++;
     803                 :            :     }
     804                 :      15210 :     return NULL;
     805                 :            : }
     806                 :            : 
     807                 :            : // ----------------------------------------------------------------------------
     808                 :            : 
     809                 :          0 : void ScGlobal::AddToken( String& rTokenList, const String& rToken, sal_Unicode cSep, xub_StrLen nSepCount, bool bForceSep )
     810                 :            : {
     811 [ #  # ][ #  # ]:          0 :     if( bForceSep || (rToken.Len() && rTokenList.Len()) )
         [ #  # ][ #  # ]
     812                 :          0 :         rTokenList.Expand( rTokenList.Len() + nSepCount, cSep );
     813                 :          0 :     rTokenList.Append( rToken );
     814                 :          0 : }
     815                 :            : 
     816                 :          0 : bool ScGlobal::IsQuoted( const String& rString, sal_Unicode cQuote )
     817                 :            : {
     818 [ #  # ][ #  # ]:          0 :     return (rString.Len() >= 2) && (rString.GetChar( 0 ) == cQuote) && (rString.GetChar( rString.Len() - 1 ) == cQuote);
                 [ #  # ]
     819                 :            : }
     820                 :            : 
     821                 :          0 : void ScGlobal::AddQuotes( String& rString, sal_Unicode cQuote, bool bEscapeEmbedded )
     822                 :            : {
     823         [ #  # ]:          0 :     if (bEscapeEmbedded)
     824                 :            :     {
     825                 :            :         sal_Unicode pQ[3];
     826                 :          0 :         pQ[0] = pQ[1] = cQuote;
     827                 :          0 :         pQ[2] = 0;
     828                 :          0 :         rtl::OUString aQuotes( pQ );
     829 [ #  # ][ #  # ]:          0 :         rString.SearchAndReplaceAll( rtl::OUString(cQuote), aQuotes);
         [ #  # ][ #  # ]
                 [ #  # ]
     830                 :            :     }
     831                 :          0 :     rString.Insert( cQuote, 0 ).Append( cQuote );
     832                 :          0 : }
     833                 :            : 
     834                 :          0 : void ScGlobal::EraseQuotes( String& rString, sal_Unicode cQuote, bool bUnescapeEmbedded )
     835                 :            : {
     836         [ #  # ]:          0 :     if ( IsQuoted( rString, cQuote ) )
     837                 :            :     {
     838                 :          0 :         rString.Erase( rString.Len() - 1 ).Erase( 0, 1 );
     839         [ #  # ]:          0 :         if (bUnescapeEmbedded)
     840                 :            :         {
     841                 :            :             sal_Unicode pQ[3];
     842                 :          0 :             pQ[0] = pQ[1] = cQuote;
     843                 :          0 :             pQ[2] = 0;
     844                 :          0 :             rtl::OUString aQuotes( pQ );
     845 [ #  # ][ #  # ]:          0 :             rString.SearchAndReplaceAll( aQuotes, rtl::OUString(cQuote));
         [ #  # ][ #  # ]
                 [ #  # ]
     846                 :            :         }
     847                 :            :     }
     848                 :          0 : }
     849                 :            : 
     850                 :       4582 : xub_StrLen ScGlobal::FindUnquoted( const String& rString, sal_Unicode cChar, xub_StrLen nStart, sal_Unicode cQuote )
     851                 :            : {
     852                 :       4582 :     const sal_Unicode* const pStart = rString.GetBuffer();
     853                 :       4582 :     const sal_Unicode* const pStop = pStart + rString.Len();
     854                 :       4582 :     const sal_Unicode* p = pStart + nStart;
     855                 :       4582 :     bool bQuoted = false;
     856         [ +  + ]:      27272 :     while (p < pStop)
     857                 :            :     {
     858 [ +  + ][ +  + ]:      24665 :         if (*p == cChar && !bQuoted)
     859                 :       1975 :             return sal::static_int_cast< xub_StrLen >( p - pStart );
     860         [ +  + ]:      22690 :         else if (*p == cQuote)
     861                 :            :         {
     862         [ +  + ]:         40 :             if (!bQuoted)
     863                 :         20 :                 bQuoted = true;
     864 [ +  - ][ -  + ]:         20 :             else if (p < pStop-1 && *(p+1) == cQuote)
     865                 :          0 :                 ++p;
     866                 :            :             else
     867                 :         40 :                 bQuoted = false;
     868                 :            :         }
     869                 :      22690 :         ++p;
     870                 :            :     }
     871                 :       4582 :     return STRING_NOTFOUND;
     872                 :            : }
     873                 :            : 
     874                 :       7681 : const sal_Unicode* ScGlobal::FindUnquoted( const sal_Unicode* pString, sal_Unicode cChar, sal_Unicode cQuote )
     875                 :            : {
     876                 :       7681 :     const sal_Unicode* p = pString;
     877                 :       7681 :     bool bQuoted = false;
     878         [ +  + ]:      49221 :     while (*p)
     879                 :            :     {
     880 [ +  + ][ +  - ]:      45706 :         if (*p == cChar && !bQuoted)
     881                 :       4166 :             return p;
     882         [ +  + ]:      41540 :         else if (*p == cQuote)
     883                 :            :         {
     884         [ +  + ]:         24 :             if (!bQuoted)
     885                 :         12 :                 bQuoted = true;
     886         [ -  + ]:         12 :             else if (*(p+1) == cQuote)
     887                 :          0 :                 ++p;
     888                 :            :             else
     889                 :         12 :                 bQuoted = false;
     890                 :            :         }
     891                 :      41540 :         ++p;
     892                 :            :     }
     893                 :       7681 :     return NULL;
     894                 :            : }
     895                 :            : 
     896                 :            : //------------------------------------------------------------------------
     897                 :            : 
     898                 :       7976 : sal_Bool ScGlobal::EETextObjEqual( const EditTextObject* pObj1,
     899                 :            :                                const EditTextObject* pObj2 )
     900                 :            : {
     901         [ +  + ]:       7976 :     if ( pObj1 == pObj2 )               // both empty or the same object
     902                 :       1202 :         return sal_True;
     903                 :            : 
     904 [ +  + ][ +  + ]:       6774 :     if ( pObj1 && pObj2 )
     905                 :            :     {
     906                 :            :         //  first test for equal text content
     907         [ +  - ]:       3176 :         sal_uInt16 nParCount = pObj1->GetParagraphCount();
     908 [ +  - ][ +  + ]:       3176 :         if ( nParCount != pObj2->GetParagraphCount() )
     909                 :          2 :             return false;
     910         [ +  + ]:       4977 :         for (sal_uInt16 nPar=0; nPar<nParCount; nPar++)
     911 [ +  - ][ +  - ]:       3174 :             if ( pObj1->GetText(nPar) != pObj2->GetText(nPar) )
         [ +  - ][ +  - ]
         [ +  - ][ +  + ]
     912                 :       1371 :                 return false;
     913                 :            : 
     914         [ +  - ]:       1803 :         SvMemoryStream  aStream1;
     915         [ +  - ]:       1803 :         SvMemoryStream  aStream2;
     916         [ +  - ]:       1803 :         pObj1->Store( aStream1 );
     917         [ +  - ]:       1803 :         pObj2->Store( aStream2 );
     918                 :       1803 :         sal_uLong nSize = aStream1.Tell();
     919         [ +  + ]:       1803 :         if ( aStream2.Tell() == nSize )
     920 [ +  - ][ +  - ]:       1689 :             if ( !memcmp( aStream1.GetData(), aStream2.GetData(), (sal_uInt16) nSize ) )
                 [ +  + ]
     921 [ +  - ][ +  + ]:       3176 :                 return sal_True;
         [ +  - ][ +  + ]
     922                 :            :     }
     923                 :            : 
     924                 :       7976 :     return false;
     925                 :            : }
     926                 :            : 
     927                 :          0 : void ScGlobal::OpenURL( const String& rURL, const String& rTarget )
     928                 :            : {
     929                 :            :     //  OpenURL wird immer ueber irgendwelche Umwege durch Mausklicks im GridWindow
     930                 :            :     //  aufgerufen, darum stimmen pScActiveViewShell und nScClickMouseModifier.
     931                 :            : 
     932         [ #  # ]:          0 :     SfxStringItem aUrl( SID_FILE_NAME, rURL );
     933         [ #  # ]:          0 :     SfxStringItem aTarget( SID_TARGETNAME, rTarget );
     934                 :            : 
     935         [ #  # ]:          0 :     if ( nScClickMouseModifier & KEY_MOD1 )     // control-click -> into new window
     936 [ #  # ][ #  # ]:          0 :         aTarget.SetValue(rtl::OUString("_blank"));
                 [ #  # ]
     937                 :            : 
     938                 :          0 :     SfxViewFrame* pFrame = NULL;
     939         [ #  # ]:          0 :     String aReferName;
     940         [ #  # ]:          0 :     if ( pScActiveViewShell )
     941                 :            :     {
     942                 :          0 :         pFrame = pScActiveViewShell->GetViewFrame();
     943         [ #  # ]:          0 :         SfxMedium* pMed = pFrame->GetObjectShell()->GetMedium();
     944         [ #  # ]:          0 :         if (pMed)
     945 [ #  # ][ #  # ]:          0 :             aReferName = pMed->GetName();
     946                 :            :     }
     947                 :            : 
     948         [ #  # ]:          0 :     SfxFrameItem aFrm( SID_DOCFRAME, pFrame );
     949         [ #  # ]:          0 :     SfxStringItem aReferer( SID_REFERER, aReferName );
     950                 :            : 
     951         [ #  # ]:          0 :     SfxBoolItem aNewView( SID_OPEN_NEW_VIEW, false );
     952         [ #  # ]:          0 :     SfxBoolItem aBrowsing( SID_BROWSE, sal_True );
     953                 :            : 
     954                 :            :     //  kein SID_SILENT mehr
     955                 :            : 
     956         [ #  # ]:          0 :     SfxViewFrame* pViewFrm = SfxViewFrame::Current();
     957         [ #  # ]:          0 :     if (pViewFrm)
     958                 :            :         pViewFrm->GetDispatcher()->Execute( SID_OPENDOC,
     959                 :            :                                     SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD,
     960                 :            :                                     &aUrl, &aTarget,
     961                 :            :                                     &aFrm, &aReferer,
     962                 :            :                                     &aNewView, &aBrowsing,
     963 [ #  # ][ #  # ]:          0 :                                     0L );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     964                 :          0 : }
     965                 :            : 
     966                 :            : //------------------------------------------------------------------------
     967                 :            : 
     968                 :       1495 : sal_Bool ScGlobal::IsSystemRTL()
     969                 :            : {
     970                 :       1495 :     return MsLangId::isRightToLeft( Application::GetSettings().GetLanguage() );
     971                 :            : }
     972                 :            : 
     973                 :    1844334 : sal_uInt8 ScGlobal::GetDefaultScriptType()
     974                 :            : {
     975                 :            :     //  Used when text contains only WEAK characters.
     976                 :            :     //  Script type of office language is used then (same as GetEditDefaultLanguage,
     977                 :            :     //  to get consistent behavior of text in simple cells and EditEngine,
     978                 :            :     //  also same as GetAppLanguage() in Writer)
     979                 :            : 
     980                 :    1844334 :     return (sal_uInt8) SvtLanguageOptions::GetScriptTypeOfLanguage( Application::GetSettings().GetLanguage() );
     981                 :            : }
     982                 :            : 
     983                 :       7149 : LanguageType ScGlobal::GetEditDefaultLanguage()
     984                 :            : {
     985                 :            :     //  used for EditEngine::SetDefaultLanguage
     986                 :            : 
     987                 :       7149 :     return Application::GetSettings().GetLanguage();
     988                 :            : }
     989                 :            : 
     990                 :          0 : sal_uInt16 ScGlobal::GetScriptedWhichID( sal_uInt8 nScriptType, sal_uInt16 nWhich )
     991                 :            : {
     992         [ #  # ]:          0 :     switch ( nScriptType )
     993                 :            :     {
     994                 :            :         case SCRIPTTYPE_LATIN:
     995                 :            :         case SCRIPTTYPE_ASIAN:
     996                 :            :         case SCRIPTTYPE_COMPLEX:
     997                 :          0 :         break;      // take exact matches
     998                 :            :         default:    // prefer one, first COMPLEX, then ASIAN
     999         [ #  # ]:          0 :             if ( nScriptType & SCRIPTTYPE_COMPLEX )
    1000                 :          0 :                 nScriptType = SCRIPTTYPE_COMPLEX;
    1001         [ #  # ]:          0 :             else if ( nScriptType & SCRIPTTYPE_ASIAN )
    1002                 :          0 :                 nScriptType = SCRIPTTYPE_ASIAN;
    1003                 :            :     }
    1004      [ #  #  # ]:          0 :     switch ( nScriptType )
    1005                 :            :     {
    1006                 :            :         case SCRIPTTYPE_COMPLEX:
    1007                 :            :         {
    1008   [ #  #  #  #  :          0 :             switch ( nWhich )
                      # ]
    1009                 :            :             {
    1010                 :            :                 case ATTR_FONT:
    1011                 :            :                 case ATTR_CJK_FONT:
    1012                 :          0 :                     nWhich = ATTR_CTL_FONT;
    1013                 :          0 :                 break;
    1014                 :            :                 case ATTR_FONT_HEIGHT:
    1015                 :            :                 case ATTR_CJK_FONT_HEIGHT:
    1016                 :          0 :                     nWhich = ATTR_CTL_FONT_HEIGHT;
    1017                 :          0 :                 break;
    1018                 :            :                 case ATTR_FONT_WEIGHT:
    1019                 :            :                 case ATTR_CJK_FONT_WEIGHT:
    1020                 :          0 :                     nWhich = ATTR_CTL_FONT_WEIGHT;
    1021                 :          0 :                 break;
    1022                 :            :                 case ATTR_FONT_POSTURE:
    1023                 :            :                 case ATTR_CJK_FONT_POSTURE:
    1024                 :          0 :                     nWhich = ATTR_CTL_FONT_POSTURE;
    1025                 :          0 :                 break;
    1026                 :            :             }
    1027                 :            :         }
    1028                 :          0 :         break;
    1029                 :            :         case SCRIPTTYPE_ASIAN:
    1030                 :            :         {
    1031   [ #  #  #  #  :          0 :             switch ( nWhich )
                      # ]
    1032                 :            :             {
    1033                 :            :                 case ATTR_FONT:
    1034                 :            :                 case ATTR_CTL_FONT:
    1035                 :          0 :                     nWhich = ATTR_CJK_FONT;
    1036                 :          0 :                 break;
    1037                 :            :                 case ATTR_FONT_HEIGHT:
    1038                 :            :                 case ATTR_CTL_FONT_HEIGHT:
    1039                 :          0 :                     nWhich = ATTR_CJK_FONT_HEIGHT;
    1040                 :          0 :                 break;
    1041                 :            :                 case ATTR_FONT_WEIGHT:
    1042                 :            :                 case ATTR_CTL_FONT_WEIGHT:
    1043                 :          0 :                     nWhich = ATTR_CJK_FONT_WEIGHT;
    1044                 :          0 :                 break;
    1045                 :            :                 case ATTR_FONT_POSTURE:
    1046                 :            :                 case ATTR_CTL_FONT_POSTURE:
    1047                 :          0 :                     nWhich = ATTR_CJK_FONT_POSTURE;
    1048                 :          0 :                 break;
    1049                 :            :             }
    1050                 :            :         }
    1051                 :          0 :         break;
    1052                 :            :         default:
    1053                 :            :         {
    1054   [ #  #  #  #  :          0 :             switch ( nWhich )
                      # ]
    1055                 :            :             {
    1056                 :            :                 case ATTR_CTL_FONT:
    1057                 :            :                 case ATTR_CJK_FONT:
    1058                 :          0 :                     nWhich = ATTR_FONT;
    1059                 :          0 :                 break;
    1060                 :            :                 case ATTR_CTL_FONT_HEIGHT:
    1061                 :            :                 case ATTR_CJK_FONT_HEIGHT:
    1062                 :          0 :                     nWhich = ATTR_FONT_HEIGHT;
    1063                 :          0 :                 break;
    1064                 :            :                 case ATTR_CTL_FONT_WEIGHT:
    1065                 :            :                 case ATTR_CJK_FONT_WEIGHT:
    1066                 :          0 :                     nWhich = ATTR_FONT_WEIGHT;
    1067                 :          0 :                 break;
    1068                 :            :                 case ATTR_CTL_FONT_POSTURE:
    1069                 :            :                 case ATTR_CJK_FONT_POSTURE:
    1070                 :          0 :                     nWhich = ATTR_FONT_POSTURE;
    1071                 :          0 :                 break;
    1072                 :            :             }
    1073                 :            :         }
    1074                 :            :     }
    1075                 :          0 :     return nWhich;
    1076                 :            : }
    1077                 :            : 
    1078                 :            : //------------------------------------------------------------------------
    1079                 :            : 
    1080                 :        507 : void ScGlobal::AddLanguage( SfxItemSet& rSet, SvNumberFormatter& rFormatter )
    1081                 :            : {
    1082                 :            :     OSL_ENSURE( rSet.GetItemState( ATTR_LANGUAGE_FORMAT, false ) == SFX_ITEM_DEFAULT,
    1083                 :            :         "ScGlobal::AddLanguage - language already added");
    1084                 :            : 
    1085                 :            :     const SfxPoolItem* pHardItem;
    1086 [ +  - ][ +  - ]:        507 :     if ( rSet.GetItemState( ATTR_VALUE_FORMAT, false, &pHardItem ) == SFX_ITEM_SET )
    1087                 :            :     {
    1088                 :            :         const SvNumberformat* pHardFormat = rFormatter.GetEntry(
    1089         [ +  - ]:        507 :             ((const SfxUInt32Item*)pHardItem)->GetValue() );
    1090                 :            : 
    1091                 :        507 :         sal_uLong nParentFmt = 0;   // pool default
    1092                 :        507 :         const SfxItemSet* pParent = rSet.GetParent();
    1093         [ -  + ]:        507 :         if ( pParent )
    1094         [ #  # ]:          0 :             nParentFmt = ((const SfxUInt32Item&)pParent->Get( ATTR_VALUE_FORMAT )).GetValue();
    1095         [ +  - ]:        507 :         const SvNumberformat* pParFormat = rFormatter.GetEntry( nParentFmt );
    1096                 :            : 
    1097         [ +  - ]:       1014 :         if ( pHardFormat && pParFormat &&
           [ +  -  -  + ]
                 [ -  + ]
    1098                 :        507 :                 (pHardFormat->GetLanguage() != pParFormat->GetLanguage()) )
    1099 [ #  # ][ #  # ]:          0 :             rSet.Put( SvxLanguageItem( pHardFormat->GetLanguage(), ATTR_LANGUAGE_FORMAT ) );
                 [ #  # ]
    1100                 :            :     }
    1101                 :        507 : }
    1102                 :            : 
    1103                 :            : 
    1104                 :            : //--------------------------------------------------------------------
    1105                 :            : 
    1106                 :            : 
    1107                 :            : 
    1108                 :            : //------------------------------------------------------------------------
    1109                 :            : 
    1110                 :       4764 : utl::TransliterationWrapper* ScGlobal::GetpTransliteration()
    1111                 :            : {
    1112         [ +  + ]:       4764 :     if ( !pTransliteration )
    1113                 :            :     {
    1114                 :         34 :         const LanguageType eOfficeLanguage = Application::GetSettings().GetLanguage();
    1115                 :            :         pTransliteration = new ::utl::TransliterationWrapper(
    1116 [ +  - ][ +  - ]:         34 :             ::comphelper::getProcessServiceFactory(), SC_TRANSLITERATION_IGNORECASE );
    1117                 :         34 :         pTransliteration->loadModuleIfNeeded( eOfficeLanguage );
    1118                 :            :     }
    1119                 :            :     OSL_ENSURE(
    1120                 :            :         pTransliteration,
    1121                 :            :         "ScGlobal::GetpTransliteration() called before ScGlobal::Init()");
    1122                 :       4764 :     return pTransliteration;
    1123                 :            : }
    1124                 :            : 
    1125                 :        548 : const LocaleDataWrapper* ScGlobal::GetpLocaleData()
    1126                 :            : {
    1127                 :            :     OSL_ENSURE(
    1128                 :            :         pLocaleData,
    1129                 :            :         "ScGlobal::GetpLocaleData() called before ScGlobal::Init()");
    1130                 :        548 :     return pLocaleData;
    1131                 :            : }
    1132                 :         78 : CalendarWrapper*     ScGlobal::GetCalendar()
    1133                 :            : {
    1134         [ +  + ]:         78 :     if ( !pCalendar )
    1135                 :            :     {
    1136 [ +  - ][ +  - ]:          3 :         pCalendar = new CalendarWrapper( ::comphelper::getProcessServiceFactory() );
    1137                 :          3 :         pCalendar->loadDefaultCalendar( *GetLocale() );
    1138                 :            :     }
    1139                 :         78 :     return pCalendar;
    1140                 :            : }
    1141                 :       2697 : CollatorWrapper*        ScGlobal::GetCollator()
    1142                 :            : {
    1143         [ +  + ]:       2697 :     if ( !pCollator )
    1144                 :            :     {
    1145 [ +  - ][ +  - ]:         15 :         pCollator = new CollatorWrapper( ::comphelper::getProcessServiceFactory() );
    1146                 :         15 :         pCollator->loadDefaultCollator( *GetLocale(), SC_COLLATOR_IGNORES );
    1147                 :            :     }
    1148                 :       2697 :     return pCollator;
    1149                 :            : }
    1150                 :       8523 : CollatorWrapper*        ScGlobal::GetCaseCollator()
    1151                 :            : {
    1152         [ +  + ]:       8523 :     if ( !pCaseCollator )
    1153                 :            :     {
    1154 [ +  - ][ +  - ]:          6 :         pCaseCollator = new CollatorWrapper( ::comphelper::getProcessServiceFactory() );
    1155                 :          6 :         pCaseCollator->loadDefaultCollator( *GetLocale(), 0 );
    1156                 :            :     }
    1157                 :       8523 :     return pCaseCollator;
    1158                 :            : }
    1159                 :          0 : ::utl::TransliterationWrapper* ScGlobal::GetCaseTransliteration()
    1160                 :            : {
    1161         [ #  # ]:          0 :     if ( !pCaseTransliteration )
    1162                 :            :     {
    1163                 :          0 :         const LanguageType eOfficeLanguage = Application::GetSettings().GetLanguage();
    1164 [ #  # ][ #  # ]:          0 :         pCaseTransliteration = new ::utl::TransliterationWrapper(::comphelper::getProcessServiceFactory(), SC_TRANSLITERATION_CASESENSE );
    1165                 :          0 :         pCaseTransliteration->loadModuleIfNeeded( eOfficeLanguage );
    1166                 :            :     }
    1167                 :          0 :     return pCaseTransliteration;
    1168                 :            : }
    1169                 :          0 : IntlWrapper*         ScGlobal::GetScIntlWrapper()
    1170                 :            : {
    1171         [ #  # ]:          0 :     if ( !pScIntlWrapper )
    1172                 :            :     {
    1173 [ #  # ][ #  # ]:          0 :         pScIntlWrapper = new IntlWrapper( ::comphelper::getProcessServiceFactory(), *GetLocale() );
                 [ #  # ]
    1174                 :            :     }
    1175                 :          0 :     return pScIntlWrapper;
    1176                 :            : }
    1177                 :        196 : ::com::sun::star::lang::Locale*     ScGlobal::GetLocale()
    1178                 :            : {
    1179         [ +  + ]:        196 :     if ( !pLocale )
    1180                 :            :     {
    1181                 :         51 :         pLocale = new ::com::sun::star::lang::Locale( Application::GetSettings().GetLocale());
    1182                 :            :     }
    1183                 :        196 :     return pLocale;
    1184 [ +  - ][ +  - ]:        153 : }
    1185                 :            : 
    1186                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10