LCOV - code coverage report
Current view: top level - sc/source/core/data - documen3.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 537 1061 50.6 %
Date: 2012-08-25 Functions: 87 137 63.5 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 450 1614 27.9 %

           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 <com/sun/star/script/vba/XVBAEventProcessor.hpp>
      30                 :            : #include "scitems.hxx"
      31                 :            : #include <editeng/langitem.hxx>
      32                 :            : #include <svl/srchitem.hxx>
      33                 :            : #include <sfx2/linkmgr.hxx>
      34                 :            : #include <sfx2/bindings.hxx>
      35                 :            : #include <sfx2/objsh.hxx>
      36                 :            : #include <svl/zforlist.hxx>
      37                 :            : #include <svl/PasswordHelper.hxx>
      38                 :            : #include <vcl/svapp.hxx>
      39                 :            : #include "document.hxx"
      40                 :            : #include "attrib.hxx"
      41                 :            : #include "cell.hxx"
      42                 :            : #include "table.hxx"
      43                 :            : #include "rangenam.hxx"
      44                 :            : #include "dbdata.hxx"
      45                 :            : #include "pivot.hxx"
      46                 :            : #include "docpool.hxx"
      47                 :            : #include "poolhelp.hxx"
      48                 :            : #include "autoform.hxx"
      49                 :            : #include "rangelst.hxx"
      50                 :            : #include "chartarr.hxx"
      51                 :            : #include "chartlock.hxx"
      52                 :            : #include "refupdat.hxx"
      53                 :            : #include "docoptio.hxx"
      54                 :            : #include "viewopti.hxx"
      55                 :            : #include "scextopt.hxx"
      56                 :            : #include "brdcst.hxx"
      57                 :            : #include "bcaslot.hxx"
      58                 :            : #include "tablink.hxx"
      59                 :            : #include "externalrefmgr.hxx"
      60                 :            : #include "markdata.hxx"
      61                 :            : #include "validat.hxx"
      62                 :            : #include "dociter.hxx"
      63                 :            : #include "detdata.hxx"
      64                 :            : #include "detfunc.hxx"
      65                 :            : #include "inputopt.hxx"     // GetExpandRefs
      66                 :            : #include "chartlis.hxx"
      67                 :            : #include "sc.hrc"           // SID_LINK
      68                 :            : #include "hints.hxx"
      69                 :            : #include "dpobject.hxx"
      70                 :            : #include "drwlayer.hxx"
      71                 :            : #include "unoreflist.hxx"
      72                 :            : #include "listenercalls.hxx"
      73                 :            : #include "dpshttab.hxx"
      74                 :            : #include "dpcache.hxx"
      75                 :            : #include "tabprotection.hxx"
      76                 :            : #include "formulaparserpool.hxx"
      77                 :            : #include "clipparam.hxx"
      78                 :            : #include "sheetevents.hxx"
      79                 :            : #include "colorscale.hxx"
      80                 :            : #include "queryentry.hxx"
      81                 :            : 
      82                 :            : #include "globalnames.hxx"
      83                 :            : #include <memory>
      84                 :            : 
      85                 :            : using namespace com::sun::star;
      86                 :            : 
      87                 :            : namespace {
      88                 :            : 
      89                 :          0 : void sortAndRemoveDuplicates(std::vector<ScTypedStrData>& rStrings, bool bCaseSens)
      90                 :            : {
      91         [ #  # ]:          0 :     if (bCaseSens)
      92                 :            :     {
      93         [ #  # ]:          0 :         std::sort(rStrings.begin(), rStrings.end(), ScTypedStrData::LessCaseSensitive());
      94                 :            :         std::vector<ScTypedStrData>::iterator it =
      95         [ #  # ]:          0 :             std::unique(rStrings.begin(), rStrings.end(), ScTypedStrData::EqualCaseSensitive());
      96         [ #  # ]:          0 :         rStrings.erase(it, rStrings.end());
      97                 :            :     }
      98                 :            :     else
      99                 :            :     {
     100         [ #  # ]:          0 :         std::sort(rStrings.begin(), rStrings.end(), ScTypedStrData::LessCaseInsensitive());
     101                 :            :         std::vector<ScTypedStrData>::iterator it =
     102         [ #  # ]:          0 :             std::unique(rStrings.begin(), rStrings.end(), ScTypedStrData::EqualCaseInsensitive());
     103         [ #  # ]:          0 :         rStrings.erase(it, rStrings.end());
     104                 :            :     }
     105                 :          0 : }
     106                 :            : 
     107                 :            : }
     108                 :            : 
     109                 :          0 : void ScDocument::GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rNames) const
     110                 :            : {
     111         [ #  # ]:          0 :     ScRangeName::TabNameCopyMap aNames;
     112         [ #  # ]:          0 :     for (SCTAB i = 0; i < static_cast<SCTAB>(maTabs.size()); ++i)
     113                 :            :     {
     114         [ #  # ]:          0 :         if (!maTabs[i])
     115                 :            :             // no more tables to iterate through.
     116                 :            :             break;
     117                 :            : 
     118         [ #  # ]:          0 :         const ScRangeName* p = maTabs[i]->GetRangeName();
     119 [ #  # ][ #  # ]:          0 :         if (!p || p->empty())
         [ #  # ][ #  # ]
     120                 :            :             // ignore empty ones.
     121                 :          0 :             continue;
     122                 :            : 
     123         [ #  # ]:          0 :         aNames.insert(ScRangeName::TabNameCopyMap::value_type(i, p));
     124                 :            :     }
     125         [ #  # ]:          0 :     rNames.swap(aNames);
     126                 :          0 : }
     127                 :            : 
     128                 :          0 : void ScDocument::SetAllRangeNames( const boost::ptr_map<rtl::OUString, ScRangeName>& rRangeMap)
     129                 :            : {
     130         [ #  # ]:          0 :     rtl::OUString aGlobalStr(RTL_CONSTASCII_USTRINGPARAM(STR_GLOBAL_RANGE_NAME));
     131 [ #  # ][ #  # ]:          0 :     boost::ptr_map<rtl::OUString,ScRangeName>::const_iterator itr = rRangeMap.begin(), itrEnd = rRangeMap.end();
     132 [ #  # ][ #  # ]:          0 :     for (; itr!=itrEnd; ++itr)
                 [ #  # ]
     133                 :            :     {
     134 [ #  # ][ #  # ]:          0 :         if (itr->first == aGlobalStr)
     135                 :            :         {
     136 [ #  # ][ #  # ]:          0 :             delete pRangeName;
     137         [ #  # ]:          0 :             const ScRangeName* pName = itr->second;
     138 [ #  # ][ #  # ]:          0 :             if (pName->empty())
     139                 :          0 :                 pRangeName = NULL;
     140                 :            :             else
     141 [ #  # ][ #  # ]:          0 :                 pRangeName = new ScRangeName( *pName );
     142                 :            :         }
     143                 :            :         else
     144                 :            :         {
     145         [ #  # ]:          0 :             const ScRangeName* pName = itr->second;
     146                 :            :             SCTAB nTab;
     147 [ #  # ][ #  # ]:          0 :             GetTable(itr->first, nTab);
     148 [ #  # ][ #  # ]:          0 :             if (pName->empty())
     149         [ #  # ]:          0 :                 SetRangeName( nTab, NULL );
     150                 :            :             else
     151 [ #  # ][ #  # ]:          0 :                 SetRangeName( nTab, new ScRangeName( *pName ) );
                 [ #  # ]
     152                 :            :         }
     153                 :          0 :     }
     154                 :          0 : }
     155                 :            : 
     156                 :          0 : void ScDocument::GetTabRangeNameMap(std::map<rtl::OUString, ScRangeName*>& aRangeNameMap)
     157                 :            : {
     158         [ #  # ]:          0 :     for (SCTAB i = 0; i < static_cast<SCTAB>(maTabs.size()); ++i)
     159                 :            :     {
     160         [ #  # ]:          0 :         if (!maTabs[i])
     161                 :          0 :             continue;
     162         [ #  # ]:          0 :         ScRangeName* p = maTabs[i]->GetRangeName();
     163         [ #  # ]:          0 :         if (!p )
     164                 :            :         {
     165 [ #  # ][ #  # ]:          0 :             p = new ScRangeName();
     166         [ #  # ]:          0 :             SetRangeName(i, p);
     167                 :            :         }
     168                 :          0 :         rtl::OUString aTableName;
     169         [ #  # ]:          0 :         maTabs[i]->GetName(aTableName);
     170         [ #  # ]:          0 :         aRangeNameMap.insert(std::pair<rtl::OUString, ScRangeName*>(aTableName,p));
     171                 :          0 :     }
     172                 :          0 : }
     173                 :            : 
     174                 :          0 : void ScDocument::GetRangeNameMap(std::map<rtl::OUString, ScRangeName*>& aRangeNameMap)
     175                 :            : {
     176         [ #  # ]:          0 :     GetTabRangeNameMap(aRangeNameMap);
     177         [ #  # ]:          0 :     if (!pRangeName)
     178                 :            :     {
     179 [ #  # ][ #  # ]:          0 :         pRangeName = new ScRangeName();
     180                 :            :     }
     181         [ #  # ]:          0 :     rtl::OUString aGlobal(RTL_CONSTASCII_USTRINGPARAM(STR_GLOBAL_RANGE_NAME));
     182         [ #  # ]:          0 :     aRangeNameMap.insert(std::pair<rtl::OUString, ScRangeName*>(aGlobal, pRangeName));
     183                 :          0 : }
     184                 :            : 
     185                 :       1152 : ScRangeName* ScDocument::GetRangeName(SCTAB nTab) const
     186                 :            : {
     187 [ +  + ][ +  - ]:       1152 :     if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab])
         [ -  + ][ +  + ]
     188                 :          3 :         return NULL;
     189                 :            : 
     190                 :       1152 :     return maTabs[nTab]->GetRangeName();
     191                 :            : }
     192                 :            : 
     193                 :       1595 : ScRangeName* ScDocument::GetRangeName() const
     194                 :            : {
     195         [ +  + ]:       1595 :     if (!pRangeName)
     196         [ +  - ]:        282 :         pRangeName = new ScRangeName;
     197                 :       1595 :     return pRangeName;
     198                 :            : }
     199                 :            : 
     200                 :          3 : void ScDocument::SetRangeName(SCTAB nTab, ScRangeName* pNew)
     201                 :            : {
     202 [ +  - ][ +  - ]:          3 :     if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab])
         [ -  + ][ -  + ]
     203                 :          0 :         return;
     204                 :            : 
     205                 :          3 :     return maTabs[nTab]->SetRangeName(pNew);
     206                 :            : }
     207                 :            : 
     208                 :         51 : void ScDocument::SetRangeName( ScRangeName* pNewRangeName )
     209                 :            : {
     210         [ +  + ]:         51 :     delete pRangeName;
     211                 :         51 :     pRangeName = pNewRangeName;
     212                 :         51 : }
     213                 :            : 
     214                 :            : 
     215                 :        640 : const ScRangeData* ScDocument::GetRangeAtBlock( const ScRange& rBlock, rtl::OUString* pName ) const
     216                 :            : {
     217                 :        640 :     const ScRangeData* pData = NULL;
     218         [ +  + ]:        640 :     if ( pRangeName )
     219                 :            :     {
     220                 :        202 :         pData = pRangeName->findByRange( rBlock );
     221 [ #  # ][ -  + ]:        202 :         if (pData && pName)
     222                 :          0 :             *pName = pData->GetName();
     223                 :            :     }
     224                 :        640 :     return pData;
     225                 :            : }
     226                 :            : 
     227                 :       1496 : ScDBCollection* ScDocument::GetDBCollection() const
     228                 :            : {
     229                 :       1496 :     return pDBCollection;
     230                 :            : }
     231                 :            : 
     232                 :          3 : void ScDocument::SetDBCollection( ScDBCollection* pNewDBCollection, bool bRemoveAutoFilter )
     233                 :            : {
     234 [ +  - ][ -  + ]:          3 :     if (pDBCollection && bRemoveAutoFilter)
     235                 :            :     {
     236                 :            :         //  remove auto filter attribute if new db data don't contain auto filter flag
     237                 :            :         //  start position is also compared, so bRemoveAutoFilter must not be set from ref-undo!
     238                 :            : 
     239         [ #  # ]:          0 :         ScDBCollection::NamedDBs& rNamedDBs = pDBCollection->getNamedDBs();
     240 [ #  # ][ #  # ]:          0 :         ScDBCollection::NamedDBs::const_iterator itr = rNamedDBs.begin(), itrEnd = rNamedDBs.end();
         [ #  # ][ #  # ]
     241 [ #  # ][ #  # ]:          0 :         for (; itr != itrEnd; ++itr)
                 [ #  # ]
     242                 :            :         {
     243         [ #  # ]:          0 :             const ScDBData& rOldData = *itr;
     244         [ #  # ]:          0 :             if (!rOldData.HasAutoFilter())
     245                 :          0 :                 continue;
     246                 :            : 
     247                 :          0 :             ScRange aOldRange;
     248         [ #  # ]:          0 :             rOldData.GetArea(aOldRange);
     249                 :            : 
     250                 :          0 :             bool bFound = false;
     251         [ #  # ]:          0 :             if (pNewDBCollection)
     252                 :            :             {
     253 [ #  # ][ #  # ]:          0 :                 ScDBData* pNewData = pNewDBCollection->getNamedDBs().findByName(rOldData.GetName());
     254         [ #  # ]:          0 :                 if (pNewData)
     255                 :            :                 {
     256         [ #  # ]:          0 :                     if (pNewData->HasAutoFilter())
     257                 :            :                     {
     258                 :          0 :                         ScRange aNewRange;
     259         [ #  # ]:          0 :                         pNewData->GetArea(aNewRange);
     260         [ #  # ]:          0 :                         if (aOldRange.aStart == aNewRange.aStart)
     261                 :          0 :                             bFound = true;
     262                 :            :                     }
     263                 :            :                 }
     264                 :            :             }
     265                 :            : 
     266         [ #  # ]:          0 :             if (!bFound)
     267                 :            :             {
     268                 :          0 :                 aOldRange.aEnd.SetRow(aOldRange.aStart.Row());
     269                 :          0 :                 RemoveFlagsTab( aOldRange.aStart.Col(), aOldRange.aStart.Row(),
     270                 :          0 :                                 aOldRange.aEnd.Col(),   aOldRange.aEnd.Row(),
     271         [ #  # ]:          0 :                                 aOldRange.aStart.Tab(), SC_MF_AUTO );
     272         [ #  # ]:          0 :                 RepaintRange( aOldRange );
     273                 :            :             }
     274                 :            :         }
     275                 :            :     }
     276                 :            : 
     277         [ +  - ]:          3 :     delete pDBCollection;
     278                 :            : 
     279                 :          3 :     pDBCollection = pNewDBCollection;
     280                 :          3 : }
     281                 :            : 
     282                 :          0 : const ScDBData* ScDocument::GetDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, bool bStartOnly) const
     283                 :            : {
     284         [ #  # ]:          0 :     if (pDBCollection)
     285                 :          0 :         return pDBCollection->GetDBAtCursor(nCol, nRow, nTab, bStartOnly);
     286                 :            :     else
     287                 :          0 :         return NULL;
     288                 :            : }
     289                 :            : 
     290                 :          3 : ScDBData* ScDocument::GetDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, bool bStartOnly)
     291                 :            : {
     292         [ +  - ]:          3 :     if (pDBCollection)
     293                 :          3 :         return pDBCollection->GetDBAtCursor(nCol, nRow, nTab, bStartOnly);
     294                 :            :     else
     295                 :          3 :         return NULL;
     296                 :            : }
     297                 :            : 
     298                 :          0 : const ScDBData* ScDocument::GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const
     299                 :            : {
     300         [ #  # ]:          0 :     if (pDBCollection)
     301                 :          0 :         return pDBCollection->GetDBAtArea(nTab, nCol1, nRow1, nCol2, nRow2);
     302                 :            :     else
     303                 :          0 :         return NULL;
     304                 :            : }
     305                 :            : 
     306                 :         60 : ScDBData* ScDocument::GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
     307                 :            : {
     308         [ +  - ]:         60 :     if (pDBCollection)
     309                 :         60 :         return pDBCollection->GetDBAtArea(nTab, nCol1, nRow1, nCol2, nRow2);
     310                 :            :     else
     311                 :         60 :         return NULL;
     312                 :            : }
     313                 :            : 
     314                 :       1533 : ScDPCollection* ScDocument::GetDPCollection()
     315                 :            : {
     316         [ +  + ]:       1533 :     if (!pDPCollection)
     317         [ +  - ]:        158 :         pDPCollection = new ScDPCollection(this);
     318                 :       1533 :     return pDPCollection;
     319                 :            : }
     320                 :            : 
     321                 :        306 : ScDPObject* ScDocument::GetDPAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab) const
     322                 :            : {
     323         [ +  + ]:        306 :     if (!pDPCollection)
     324                 :        225 :         return NULL;
     325                 :            : 
     326         [ +  - ]:         81 :     sal_uInt16 nCount = pDPCollection->GetCount();
     327                 :         81 :     ScAddress aPos( nCol, nRow, nTab );
     328         [ +  + ]:        181 :     for (sal_uInt16 i=0; i<nCount; i++)
     329 [ +  - ][ +  + ]:        102 :         if ( (*pDPCollection)[i]->GetOutRange().In( aPos ) )
     330         [ +  - ]:          2 :             return (*pDPCollection)[i];
     331                 :            : 
     332                 :        306 :     return NULL;
     333                 :            : }
     334                 :            : 
     335                 :          0 : ScDPObject* ScDocument::GetDPAtBlock( const ScRange & rBlock ) const
     336                 :            : {
     337         [ #  # ]:          0 :     if (!pDPCollection)
     338                 :          0 :         return NULL;
     339                 :            : 
     340                 :            :     /* Walk the collection in reverse order to get something of an
     341                 :            :      * approximation of MS Excels 'most recent' effect. */
     342                 :          0 :     sal_uInt16 i = pDPCollection->GetCount();
     343         [ #  # ]:          0 :     while ( i-- > 0 )
     344         [ #  # ]:          0 :         if ( (*pDPCollection)[i]->GetOutRange().In( rBlock ) )
     345                 :          0 :             return (*pDPCollection)[i];
     346                 :            : 
     347                 :          0 :     return NULL;
     348                 :            : }
     349                 :            : 
     350                 :          0 : ScChartCollection* ScDocument::GetChartCollection() const
     351                 :            : {
     352                 :          0 :     return pChartCollection;
     353                 :            : }
     354                 :            : 
     355                 :          4 : void ScDocument::StopTemporaryChartLock()
     356                 :            : {
     357         [ +  - ]:          4 :     if( apTemporaryChartLock.get() )
     358                 :          4 :         apTemporaryChartLock->StopLocking();
     359                 :          4 : }
     360                 :            : 
     361                 :      15375 : ScChartListenerCollection* ScDocument::GetChartListenerCollection() const
     362                 :            : {
     363                 :      15375 :     return pChartListenerCollection;
     364                 :            : }
     365                 :            : 
     366                 :          0 : void ScDocument::SetChartListenerCollection(
     367                 :            :             ScChartListenerCollection* pNewChartListenerCollection,
     368                 :            :             bool bSetChartRangeLists )
     369                 :            : {
     370                 :          0 :     ScChartListenerCollection* pOld = pChartListenerCollection;
     371                 :          0 :     pChartListenerCollection = pNewChartListenerCollection;
     372         [ #  # ]:          0 :     if ( pChartListenerCollection )
     373                 :            :     {
     374         [ #  # ]:          0 :         if ( pOld )
     375                 :          0 :             pChartListenerCollection->SetDiffDirty( *pOld, bSetChartRangeLists );
     376                 :          0 :         pChartListenerCollection->StartAllListeners();
     377                 :            :     }
     378         [ #  # ]:          0 :     delete pOld;
     379                 :          0 : }
     380                 :            : 
     381                 :          1 : void ScDocument::SetScenario( SCTAB nTab, bool bFlag )
     382                 :            : {
     383 [ +  - ][ +  - ]:          1 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     384                 :          1 :         maTabs[nTab]->SetScenario(bFlag);
     385                 :          1 : }
     386                 :            : 
     387                 :       5611 : bool ScDocument::IsScenario( SCTAB nTab ) const
     388                 :            : {
     389 [ +  - ][ +  + ]:       5611 :     return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] &&maTabs[nTab]->IsScenario();
         [ +  - ][ +  + ]
     390                 :            : }
     391                 :            : 
     392                 :          1 : void ScDocument::SetScenarioData( SCTAB nTab, const rtl::OUString& rComment,
     393                 :            :                                         const Color& rColor, sal_uInt16 nFlags )
     394                 :            : {
     395 [ +  - ][ +  - ]:          1 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsScenario())
         [ +  - ][ +  - ]
                 [ +  - ]
     396                 :            :     {
     397                 :          1 :         maTabs[nTab]->SetScenarioComment( rComment );
     398                 :          1 :         maTabs[nTab]->SetScenarioColor( rColor );
     399                 :          1 :         maTabs[nTab]->SetScenarioFlags( nFlags );
     400                 :            :     }
     401                 :          1 : }
     402                 :            : 
     403                 :       1187 : Color ScDocument::GetTabBgColor( SCTAB nTab ) const
     404                 :            : {
     405 [ +  - ][ +  - ]:       1187 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     406                 :       1187 :         return maTabs[nTab]->GetTabBgColor();
     407                 :       1187 :     return Color(COL_AUTO);
     408                 :            : }
     409                 :            : 
     410                 :         25 : void ScDocument::SetTabBgColor( SCTAB nTab, const Color& rColor )
     411                 :            : {
     412 [ +  - ][ +  - ]:         25 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     413                 :         25 :         maTabs[nTab]->SetTabBgColor(rColor);
     414                 :         25 : }
     415                 :            : 
     416                 :        402 : bool ScDocument::IsDefaultTabBgColor( SCTAB nTab ) const
     417                 :            : {
     418 [ +  - ][ +  - ]:        402 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     419         [ +  - ]:        402 :         return maTabs[nTab]->GetTabBgColor() == COL_AUTO;
     420                 :        402 :     return true;
     421                 :            : }
     422                 :            : 
     423                 :          0 : void ScDocument::GetScenarioData( SCTAB nTab, rtl::OUString& rComment,
     424                 :            :                                         Color& rColor, sal_uInt16& rFlags ) const
     425                 :            : {
     426 [ #  # ][ #  # ]:          0 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsScenario())
         [ #  # ][ #  # ]
                 [ #  # ]
     427                 :            :     {
     428                 :          0 :         maTabs[nTab]->GetScenarioComment( rComment );
     429                 :          0 :         rColor = maTabs[nTab]->GetScenarioColor();
     430                 :          0 :         rFlags = maTabs[nTab]->GetScenarioFlags();
     431                 :            :     }
     432                 :          0 : }
     433                 :            : 
     434                 :          0 : void ScDocument::GetScenarioFlags( SCTAB nTab, sal_uInt16& rFlags ) const
     435                 :            : {
     436 [ #  # ][ #  # ]:          0 :     if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsScenario())
         [ #  # ][ #  # ]
                 [ #  # ]
     437                 :          0 :         rFlags = maTabs[nTab]->GetScenarioFlags();
     438                 :          0 : }
     439                 :            : 
     440                 :        824 : bool ScDocument::IsLinked( SCTAB nTab ) const
     441                 :            : {
     442 [ +  - ][ +  - ]:        824 :     return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsLinked();
         [ +  - ][ +  + ]
     443                 :            :     // euqivalent to
     444                 :            :     //if (ValidTab(nTab) && pTab[nTab])
     445                 :            :     //  return pTab[nTab]->IsLinked();
     446                 :            :     //return false;
     447                 :            : }
     448                 :            : 
     449                 :      40600 : formula::FormulaGrammar::AddressConvention ScDocument::GetAddressConvention() const
     450                 :            : {
     451                 :      40600 :     return formula::FormulaGrammar::extractRefConvention(eGrammar);
     452                 :            : }
     453                 :            : 
     454                 :      27866 : formula::FormulaGrammar::Grammar ScDocument::GetGrammar() const
     455                 :            : {
     456                 :      27866 :     return eGrammar;
     457                 :            : }
     458                 :            : 
     459                 :        412 : void ScDocument::SetGrammar( formula::FormulaGrammar::Grammar eGram )
     460                 :            : {
     461                 :        412 :     eGrammar = eGram;
     462                 :        412 : }
     463                 :            : 
     464                 :          6 : sal_uInt8 ScDocument::GetLinkMode( SCTAB nTab ) const
     465                 :            : {
     466 [ +  - ][ +  - ]:          6 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     467                 :          6 :         return maTabs[nTab]->GetLinkMode();
     468                 :          6 :     return SC_LINK_NONE;
     469                 :            : }
     470                 :            : 
     471                 :         22 : const rtl::OUString ScDocument::GetLinkDoc( SCTAB nTab ) const
     472                 :            : {
     473 [ +  - ][ +  - ]:         22 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     474                 :         22 :         return maTabs[nTab]->GetLinkDoc();
     475                 :         22 :     return rtl::OUString();
     476                 :            : }
     477                 :            : 
     478                 :          2 : const rtl::OUString ScDocument::GetLinkFlt( SCTAB nTab ) const
     479                 :            : {
     480 [ +  - ][ +  - ]:          2 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     481                 :          2 :         return maTabs[nTab]->GetLinkFlt();
     482                 :          2 :     return rtl::OUString();
     483                 :            : }
     484                 :            : 
     485                 :          2 : const rtl::OUString ScDocument::GetLinkOpt( SCTAB nTab ) const
     486                 :            : {
     487 [ +  - ][ +  - ]:          2 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     488                 :          2 :         return maTabs[nTab]->GetLinkOpt();
     489                 :          2 :     return rtl::OUString();
     490                 :            : }
     491                 :            : 
     492                 :          2 : const rtl::OUString ScDocument::GetLinkTab( SCTAB nTab ) const
     493                 :            : {
     494 [ +  - ][ +  - ]:          2 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     495                 :          2 :         return maTabs[nTab]->GetLinkTab();
     496                 :          2 :     return rtl::OUString();
     497                 :            : }
     498                 :            : 
     499                 :          2 : sal_uLong ScDocument::GetLinkRefreshDelay( SCTAB nTab ) const
     500                 :            : {
     501 [ +  - ][ +  - ]:          2 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     502                 :          2 :         return maTabs[nTab]->GetLinkRefreshDelay();
     503                 :          2 :     return 0;
     504                 :            : }
     505                 :            : 
     506                 :          6 : void ScDocument::SetLink( SCTAB nTab, sal_uInt8 nMode, const rtl::OUString& rDoc,
     507                 :            :                             const rtl::OUString& rFilter, const rtl::OUString& rOptions,
     508                 :            :                             const rtl::OUString& rTabName, sal_uLong nRefreshDelay )
     509                 :            : {
     510 [ +  - ][ +  - ]:          6 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     511 [ +  - ][ +  - ]:          6 :         maTabs[nTab]->SetLink( nMode, rDoc, rFilter, rOptions, rTabName, nRefreshDelay );
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
     512                 :          6 : }
     513                 :            : 
     514                 :          0 : bool ScDocument::HasLink( const rtl::OUString& rDoc,
     515                 :            :                             const rtl::OUString& rFilter, const rtl::OUString& rOptions ) const
     516                 :            : {
     517                 :          0 :     SCTAB nCount = static_cast<SCTAB>(maTabs.size());
     518         [ #  # ]:          0 :     for (SCTAB i=0; i<nCount; i++)
     519   [ #  #  #  #  :          0 :         if (maTabs[i]->IsLinked()
             #  #  #  # ]
                 [ #  # ]
     520                 :          0 :                 && maTabs[i]->GetLinkDoc() == rDoc
     521                 :          0 :                 && maTabs[i]->GetLinkFlt() == rFilter
     522                 :          0 :                 && maTabs[i]->GetLinkOpt() == rOptions)
     523                 :          0 :             return true;
     524                 :            : 
     525                 :          0 :     return false;
     526                 :            : }
     527                 :            : 
     528                 :          0 : bool ScDocument::LinkExternalTab( SCTAB& rTab, const rtl::OUString& aDocTab,
     529                 :            :         const rtl::OUString& aFileName, const rtl::OUString& aTabName )
     530                 :            : {
     531         [ #  # ]:          0 :     if ( IsClipboard() )
     532                 :            :     {
     533                 :            :         OSL_FAIL( "LinkExternalTab in Clipboard" );
     534                 :          0 :         return false;
     535                 :            :     }
     536                 :          0 :     rTab = 0;
     537                 :          0 :     rtl::OUString  aFilterName;        // wird vom Loader gefuellt
     538                 :          0 :     rtl::OUString  aOptions;       // Filter-Optionen
     539 [ #  # ][ #  # ]:          0 :     sal_uInt32 nLinkCnt = pExtDocOptions ? pExtDocOptions->GetDocSettings().mnLinkCnt : 0;
     540         [ #  # ]:          0 :     ScDocumentLoader aLoader( aFileName, aFilterName, aOptions, nLinkCnt + 1 );
     541 [ #  # ][ #  # ]:          0 :     if ( aLoader.IsError() )
     542                 :          0 :         return false;
     543         [ #  # ]:          0 :     ScDocument* pSrcDoc = aLoader.GetDocument();
     544                 :            : 
     545                 :            :     //  Tabelle kopieren
     546                 :            :     SCTAB nSrcTab;
     547 [ #  # ][ #  # ]:          0 :     if ( pSrcDoc->GetTable( aTabName, nSrcTab ) )
     548                 :            :     {
     549 [ #  # ][ #  # ]:          0 :         if ( !InsertTab( SC_TAB_APPEND, aDocTab, true ) )
     550                 :            :         {
     551                 :            :             OSL_FAIL("can't insert external document table");
     552                 :          0 :             return false;
     553                 :            :         }
     554         [ #  # ]:          0 :         rTab = GetTableCount() - 1;
     555                 :            :         // nicht neu einfuegen, nur Ergebnisse
     556         [ #  # ]:          0 :         TransferTab( pSrcDoc, nSrcTab, rTab, false, true );
     557                 :            :     }
     558                 :            :     else
     559                 :          0 :         return false;
     560                 :            : 
     561                 :          0 :     sal_uLong nRefreshDelay = 0;
     562                 :            : 
     563         [ #  # ]:          0 :     bool bWasThere = HasLink( aFileName, aFilterName, aOptions );
     564         [ #  # ]:          0 :     SetLink( rTab, SC_LINK_VALUE, aFileName, aFilterName, aOptions, aTabName, nRefreshDelay );
     565         [ #  # ]:          0 :     if ( !bWasThere )       // Link pro Quelldokument nur einmal eintragen
     566                 :            :     {
     567 [ #  # ][ #  # ]:          0 :         ScTableLink* pLink = new ScTableLink( pShell, aFileName, aFilterName, aOptions, nRefreshDelay );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     568                 :          0 :         pLink->SetInCreate( true );
     569         [ #  # ]:          0 :         String aFilName = aFilterName;
     570                 :            :         GetLinkManager()->InsertFileLink( *pLink, OBJECT_CLIENT_FILE, String(aFileName),
     571 [ #  # ][ #  # ]:          0 :                                         &aFilName );
         [ #  # ][ #  # ]
     572         [ #  # ]:          0 :         pLink->Update();
     573                 :          0 :         pLink->SetInCreate( false );
     574         [ #  # ]:          0 :         SfxBindings* pBindings = GetViewBindings();
     575         [ #  # ]:          0 :         if (pBindings)
     576 [ #  # ][ #  # ]:          0 :             pBindings->Invalidate( SID_LINKS );
     577                 :            :     }
     578         [ #  # ]:          0 :     return true;
     579                 :            : }
     580                 :            : 
     581                 :       2993 : ScExternalRefManager* ScDocument::GetExternalRefManager() const
     582                 :            : {
     583                 :       2993 :     ScDocument* pThis = const_cast<ScDocument*>(this);
     584         [ +  + ]:       2993 :     if (!pExternalRefMgr.get())
     585         [ +  - ]:        275 :         pThis->pExternalRefMgr.reset( new ScExternalRefManager( pThis));
     586                 :            : 
     587                 :       2993 :     return pExternalRefMgr.get();
     588                 :            : }
     589                 :            : 
     590                 :         45 : bool ScDocument::IsInExternalReferenceMarking() const
     591                 :            : {
     592 [ +  - ][ -  + ]:         45 :     return pExternalRefMgr.get() && pExternalRefMgr->isInReferenceMarking();
     593                 :            : }
     594                 :            : 
     595                 :          0 : void ScDocument::MarkUsedExternalReferences()
     596                 :            : {
     597         [ #  # ]:          0 :     if (!pExternalRefMgr.get())
     598                 :          0 :         return;
     599         [ #  # ]:          0 :     if (!pExternalRefMgr->hasExternalData())
     600                 :          0 :         return;
     601                 :            :     // Charts.
     602                 :          0 :     pExternalRefMgr->markUsedByLinkListeners();
     603                 :            :     // Formula cells.
     604                 :          0 :     pExternalRefMgr->markUsedExternalRefCells();
     605                 :            : 
     606                 :            :     /* NOTE: Conditional formats and validation objects are marked when
     607                 :            :      * collecting them during export. */
     608                 :            : }
     609                 :            : 
     610                 :          0 : ScFormulaParserPool& ScDocument::GetFormulaParserPool() const
     611                 :            : {
     612         [ #  # ]:          0 :     if( !mxFormulaParserPool.get() )
     613         [ #  # ]:          0 :         mxFormulaParserPool.reset( new ScFormulaParserPool( *this ) );
     614                 :          0 :     return *mxFormulaParserPool;
     615                 :            : }
     616                 :            : 
     617                 :        426 : const ScSheetEvents* ScDocument::GetSheetEvents( SCTAB nTab ) const
     618                 :            : {
     619 [ +  - ][ +  - ]:        426 :     if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     620                 :        426 :         return maTabs[nTab]->GetSheetEvents();
     621                 :        426 :     return NULL;
     622                 :            : }
     623                 :            : 
     624                 :         19 : void ScDocument::SetSheetEvents( SCTAB nTab, const ScSheetEvents* pNew )
     625                 :            : {
     626 [ +  - ][ +  - ]:         19 :     if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
     627                 :         19 :         maTabs[nTab]->SetSheetEvents( pNew );
     628                 :         19 : }
     629                 :            : 
     630                 :      27580 : bool ScDocument::HasSheetEventScript( SCTAB nTab, sal_Int32 nEvent, bool bWithVbaEvents ) const
     631                 :            : {
     632 [ +  - ][ +  - ]:      27580 :     if (nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
                 [ +  - ]
     633                 :            :     {
     634                 :            :         // check if any event handler script has been configured
     635                 :      27580 :         const ScSheetEvents* pEvents = maTabs[nTab]->GetSheetEvents();
     636 [ #  # ][ -  + ]:      27580 :         if ( pEvents && pEvents->GetScript( nEvent ) )
                 [ -  + ]
     637                 :          0 :             return true;
     638                 :            :         // check if VBA event handlers exist
     639 [ +  + ][ +  + ]:      27580 :         if (bWithVbaEvents && mxVbaEvents.is()) try
                 [ +  + ]
     640                 :            :         {
     641         [ +  - ]:         40 :             uno::Sequence< uno::Any > aArgs( 1 );
     642 [ +  - ][ +  - ]:         40 :             aArgs[ 0 ] <<= nTab;
     643 [ +  - ][ +  - ]:         40 :             if (mxVbaEvents->hasVbaEventHandler( ScSheetEvents::GetVbaSheetEventId( nEvent ), aArgs ) ||
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
     644 [ #  # ][ #  # ]:         40 :                 mxVbaEvents->hasVbaEventHandler( ScSheetEvents::GetVbaDocumentEventId( nEvent ), uno::Sequence< uno::Any >() ))
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ -  + ]
     645 [ #  # ][ #  # ]:         40 :                 return true;
                 [ -  + ]
     646                 :            :         }
     647                 :         40 :         catch( uno::Exception& )
     648                 :            :         {
     649                 :            :         }
     650                 :            :     }
     651                 :      27580 :     return false;
     652                 :            : }
     653                 :            : 
     654                 :      19160 : bool ScDocument::HasAnySheetEventScript( sal_Int32 nEvent, bool bWithVbaEvents ) const
     655                 :            : {
     656                 :      19160 :     SCTAB nSize = static_cast<SCTAB>(maTabs.size());
     657         [ +  + ]:      46740 :     for (SCTAB nTab = 0; nTab < nSize; nTab++)
     658         [ -  + ]:      27580 :         if (HasSheetEventScript( nTab, nEvent, bWithVbaEvents ))
     659                 :          0 :             return true;
     660                 :      19160 :     return false;
     661                 :            : }
     662                 :            : 
     663                 :         54 : bool ScDocument::HasAnyCalcNotification() const
     664                 :            : {
     665                 :         54 :     SCTAB nSize = static_cast<SCTAB>(maTabs.size());
     666         [ +  + ]:        170 :     for (SCTAB nTab = 0; nTab < nSize; nTab++)
     667 [ +  - ][ -  + ]:        116 :         if (maTabs[nTab] && maTabs[nTab]->GetCalcNotification())
                 [ -  + ]
     668                 :          0 :             return true;
     669                 :         54 :     return false;
     670                 :            : }
     671                 :            : 
     672                 :          0 : bool ScDocument::HasCalcNotification( SCTAB nTab ) const
     673                 :            : {
     674 [ #  # ][ #  # ]:          0 :     if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ #  # ][ #  # ]
     675                 :          0 :         return maTabs[nTab]->GetCalcNotification();
     676                 :          0 :     return false;
     677                 :            : }
     678                 :            : 
     679                 :          0 : void ScDocument::SetCalcNotification( SCTAB nTab )
     680                 :            : {
     681                 :            :     // set only if not set before
     682 [ #  # ][ #  # ]:          0 :     if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && !maTabs[nTab]->GetCalcNotification())
         [ #  # ][ #  # ]
                 [ #  # ]
     683                 :          0 :         maTabs[nTab]->SetCalcNotification(true);
     684                 :          0 : }
     685                 :            : 
     686                 :          0 : void ScDocument::ResetCalcNotifications()
     687                 :            : {
     688                 :          0 :     SCTAB nSize = static_cast<SCTAB>(maTabs.size());
     689         [ #  # ]:          0 :     for (SCTAB nTab = 0; nTab < nSize; nTab++)
     690 [ #  # ][ #  # ]:          0 :         if (maTabs[nTab] && maTabs[nTab]->GetCalcNotification())
                 [ #  # ]
     691                 :          0 :             maTabs[nTab]->SetCalcNotification(false);
     692                 :          0 : }
     693                 :            : 
     694                 :       6680 : ScOutlineTable* ScDocument::GetOutlineTable( SCTAB nTab, bool bCreate )
     695                 :            : {
     696                 :       6680 :     ScOutlineTable* pVal = NULL;
     697                 :            : 
     698 [ +  - ][ +  - ]:       6680 :     if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()))
                 [ +  - ]
     699         [ +  - ]:       6680 :         if (maTabs[nTab])
     700                 :            :         {
     701                 :       6680 :             pVal = maTabs[nTab]->GetOutlineTable();
     702         [ +  + ]:       6680 :             if (!pVal)
     703         [ +  + ]:       6299 :                 if (bCreate)
     704                 :            :                 {
     705                 :        165 :                     maTabs[nTab]->StartOutlineTable();
     706                 :        165 :                     pVal = maTabs[nTab]->GetOutlineTable();
     707                 :            :                 }
     708                 :            :         }
     709                 :            : 
     710                 :       6680 :     return pVal;
     711                 :            : }
     712                 :            : 
     713                 :          0 : bool ScDocument::SetOutlineTable( SCTAB nTab, const ScOutlineTable* pNewOutline )
     714                 :            : {
     715 [ #  # ][ #  # ]:          0 :     return VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->SetOutlineTable(pNewOutline);
         [ #  # ][ #  # ]
     716                 :            : }
     717                 :            : 
     718                 :          0 : void ScDocument::DoAutoOutline( SCCOL nStartCol, SCROW nStartRow,
     719                 :            :                                 SCCOL nEndCol, SCROW nEndRow, SCTAB nTab )
     720                 :            : {
     721 [ #  # ][ #  # ]:          0 :     if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ #  # ][ #  # ]
     722                 :          0 :         maTabs[nTab]->DoAutoOutline( nStartCol, nStartRow, nEndCol, nEndRow );
     723                 :          0 : }
     724                 :            : 
     725                 :          4 : bool ScDocument::TestRemoveSubTotals( SCTAB nTab, const ScSubTotalParam& rParam )
     726                 :            : {
     727 [ +  - ][ +  - ]:          4 :     return VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->TestRemoveSubTotals( rParam );
         [ +  - ][ -  + ]
     728                 :            : }
     729                 :            : 
     730                 :          4 : void ScDocument::RemoveSubTotals( SCTAB nTab, ScSubTotalParam& rParam )
     731                 :            : {
     732 [ +  - ][ +  - ]:          4 :     if ( VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
         [ +  - ][ +  - ]
     733                 :          4 :         maTabs[nTab]->RemoveSubTotals( rParam );
     734                 :          4 : }
     735                 :            : 
     736                 :          2 : bool ScDocument::DoSubTotals( SCTAB nTab, ScSubTotalParam& rParam )
     737                 :            : {
     738 [ +  - ][ +  - ]:          2 :     return VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->DoSubTotals( rParam );
         [ +  - ][ +  - ]
     739                 :            : }
     740                 :            : 
     741                 :          0 : bool ScDocument::HasSubTotalCells( const ScRange& rRange )
     742                 :            : {
     743         [ #  # ]:          0 :     ScCellIterator aIter( this, rRange );
     744         [ #  # ]:          0 :     ScBaseCell* pCell = aIter.GetFirst();
     745         [ #  # ]:          0 :     while (pCell)
     746                 :            :     {
     747 [ #  # ][ #  # ]:          0 :         if ( pCell->GetCellType() == CELLTYPE_FORMULA && ((ScFormulaCell*)pCell)->IsSubTotal() )
         [ #  # ][ #  # ]
     748                 :          0 :             return true;
     749                 :            : 
     750         [ #  # ]:          0 :         pCell = aIter.GetNext();
     751                 :            :     }
     752                 :          0 :     return false;   // none found
     753                 :            : }
     754                 :            : 
     755                 :            : //  kopiert aus diesem Dokument die Zellen von Positionen, an denen in pPosDoc
     756                 :            : //  auch Zellen stehen, nach pDestDoc
     757                 :            : 
     758                 :          0 : void ScDocument::CopyUpdated( ScDocument* pPosDoc, ScDocument* pDestDoc )
     759                 :            : {
     760                 :          0 :     SCTAB nCount = static_cast<SCTAB>(maTabs.size());
     761         [ #  # ]:          0 :     for (SCTAB nTab=0; nTab<nCount; nTab++)
     762 [ #  # ][ #  # ]:          0 :         if (maTabs[nTab] && pPosDoc->maTabs[nTab] && pDestDoc->maTabs[nTab])
         [ #  # ][ #  # ]
     763                 :          0 :             maTabs[nTab]->CopyUpdated( pPosDoc->maTabs[nTab], pDestDoc->maTabs[nTab] );
     764                 :          0 : }
     765                 :            : 
     766                 :          1 : void ScDocument::CopyScenario( SCTAB nSrcTab, SCTAB nDestTab, bool bNewScenario )
     767                 :            : {
     768 [ +  - ][ +  - ]:          4 :     if (ValidTab(nSrcTab) && ValidTab(nDestTab) && nSrcTab < static_cast<SCTAB>(maTabs.size())
           [ +  -  +  -  
             +  -  +  - ]
                 [ +  - ]
     769                 :          3 :                 && nDestTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nSrcTab] && maTabs[nDestTab])
     770                 :            :     {
     771                 :            :         //  Flags fuer aktive Szenarios richtig setzen
     772                 :            :         //  und aktuelle Werte in bisher aktive Szenarios zurueckschreiben
     773                 :            : 
     774 [ +  - ][ +  - ]:          1 :         ScRangeList aRanges = *maTabs[nSrcTab]->GetScenarioRanges();
     775                 :            : 
     776                 :            :         //  nDestTab ist die Zieltabelle
     777   [ +  +  +  -  :          6 :         for ( SCTAB nTab = nDestTab+1;
           +  - ][ +  + ]
     778                 :          4 :                 nTab< static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsScenario();
     779                 :            :                 nTab++ )
     780                 :            :         {
     781         [ -  + ]:          1 :             if ( maTabs[nTab]->IsActiveScenario() )     // auch wenn's dasselbe Szenario ist
     782                 :            :             {
     783                 :          0 :                 bool bTouched = false;
     784 [ #  # ][ #  # ]:          0 :                 for ( size_t nR=0, nRangeCount = aRanges.size(); nR < nRangeCount && !bTouched; nR++ )
         [ #  # ][ #  # ]
     785                 :            :                 {
     786         [ #  # ]:          0 :                     const ScRange* pRange = aRanges[ nR ];
     787 [ #  # ][ #  # ]:          0 :                     if ( maTabs[nTab]->HasScenarioRange( *pRange ) )
     788                 :          0 :                         bTouched = true;
     789                 :            :                 }
     790         [ #  # ]:          0 :                 if (bTouched)
     791                 :            :                 {
     792                 :          0 :                     maTabs[nTab]->SetActiveScenario(false);
     793         [ #  # ]:          0 :                     if ( maTabs[nTab]->GetScenarioFlags() & SC_SCENARIO_TWOWAY )
     794         [ #  # ]:          0 :                         maTabs[nTab]->CopyScenarioFrom( maTabs[nDestTab] );
     795                 :            :                 }
     796                 :            :             }
     797                 :            :         }
     798                 :            : 
     799                 :          1 :         maTabs[nSrcTab]->SetActiveScenario(true);       // da kommt's her...
     800         [ -  + ]:          1 :         if (!bNewScenario)                          // Daten aus dem ausgewaehlten Szenario kopieren
     801                 :            :         {
     802                 :          0 :             bool bOldAutoCalc = GetAutoCalc();
     803         [ #  # ]:          0 :             SetAutoCalc( false );   // Mehrfachberechnungen vermeiden
     804         [ #  # ]:          0 :             maTabs[nSrcTab]->CopyScenarioTo( maTabs[nDestTab] );
     805         [ #  # ]:          0 :             SetDirty();
     806         [ #  # ]:          0 :             SetAutoCalc( bOldAutoCalc );
     807         [ +  - ]:          1 :         }
     808                 :            :     }
     809                 :          1 : }
     810                 :            : 
     811                 :          0 : void ScDocument::MarkScenario( SCTAB nSrcTab, SCTAB nDestTab, ScMarkData& rDestMark,
     812                 :            :                                 bool bResetMark, sal_uInt16 nNeededBits ) const
     813                 :            : {
     814         [ #  # ]:          0 :     if (bResetMark)
     815                 :          0 :         rDestMark.ResetMark();
     816                 :            : 
     817 [ #  # ][ #  # ]:          0 :     if (ValidTab(nSrcTab) && nSrcTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nSrcTab])
         [ #  # ][ #  # ]
     818                 :          0 :         maTabs[nSrcTab]->MarkScenarioIn( rDestMark, nNeededBits );
     819                 :            : 
     820                 :          0 :     rDestMark.SetAreaTab( nDestTab );
     821                 :          0 : }
     822                 :            : 
     823                 :          0 : bool ScDocument::HasScenarioRange( SCTAB nTab, const ScRange& rRange ) const
     824                 :            : {
     825 [ #  # ][ #  # ]:          0 :     return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->HasScenarioRange( rRange );
         [ #  # ][ #  # ]
     826                 :            : }
     827                 :            : 
     828                 :          0 : const ScRangeList* ScDocument::GetScenarioRanges( SCTAB nTab ) const
     829                 :            : {
     830 [ #  # ][ #  # ]:          0 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ #  # ][ #  # ]
     831                 :          0 :         return maTabs[nTab]->GetScenarioRanges();
     832                 :            : 
     833                 :          0 :     return NULL;
     834                 :            : }
     835                 :            : 
     836                 :          0 : bool ScDocument::IsActiveScenario( SCTAB nTab ) const
     837                 :            : {
     838 [ #  # ][ #  # ]:          0 :     return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsActiveScenario(  );
         [ #  # ][ #  # ]
     839                 :            : }
     840                 :            : 
     841                 :          0 : void ScDocument::SetActiveScenario( SCTAB nTab, bool bActive )
     842                 :            : {
     843 [ #  # ][ #  # ]:          0 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ #  # ][ #  # ]
     844                 :          0 :         maTabs[nTab]->SetActiveScenario( bActive );
     845                 :          0 : }
     846                 :            : 
     847                 :          0 : bool ScDocument::TestCopyScenario( SCTAB nSrcTab, SCTAB nDestTab ) const
     848                 :            : {
     849 [ #  # ][ #  #  :          0 :     if (ValidTab(nSrcTab) && nSrcTab < static_cast<SCTAB>(maTabs.size())
             #  #  #  # ]
                 [ #  # ]
     850                 :          0 :                 && nDestTab < static_cast<SCTAB>(maTabs.size())&& ValidTab(nDestTab))
     851                 :          0 :         return maTabs[nSrcTab]->TestCopyScenarioTo( maTabs[nDestTab] );
     852                 :            : 
     853                 :            :     OSL_FAIL("falsche Tabelle bei TestCopyScenario");
     854                 :          0 :     return false;
     855                 :            : }
     856                 :            : 
     857                 :      27992 : void ScDocument::AddUnoObject( SfxListener& rObject )
     858                 :            : {
     859         [ +  + ]:      27992 :     if (!pUnoBroadcaster)
     860         [ +  - ]:        846 :         pUnoBroadcaster = new SfxBroadcaster;
     861                 :            : 
     862                 :      27992 :     rObject.StartListening( *pUnoBroadcaster );
     863                 :      27992 : }
     864                 :            : 
     865                 :      22100 : void ScDocument::RemoveUnoObject( SfxListener& rObject )
     866                 :            : {
     867         [ +  - ]:      22100 :     if (pUnoBroadcaster)
     868                 :            :     {
     869                 :      22100 :         rObject.EndListening( *pUnoBroadcaster );
     870                 :            : 
     871         [ -  + ]:      22100 :         if ( bInUnoBroadcast )
     872                 :            :         {
     873                 :            :             //  Broadcasts from ScDocument::BroadcastUno are the only way that
     874                 :            :             //  uno object methods are called without holding a reference.
     875                 :            :             //
     876                 :            :             //  If RemoveUnoObject is called from an object dtor in the finalizer thread
     877                 :            :             //  while the main thread is calling BroadcastUno, the dtor thread must wait
     878                 :            :             //  (or the object's Notify might try to access a deleted object).
     879                 :            :             //  The SolarMutex can't be locked here because if a component is called from
     880                 :            :             //  a VCL event, the main thread has the SolarMutex locked all the time.
     881                 :            :             //
     882                 :            :             //  This check is done after calling EndListening, so a later BroadcastUno call
     883                 :            :             //  won't touch this object.
     884                 :            : 
     885                 :          0 :             osl::SolarMutex& rSolarMutex = Application::GetSolarMutex();
     886         [ #  # ]:          0 :             if ( rSolarMutex.tryToAcquire() )
     887                 :            :             {
     888                 :            :                 //  BroadcastUno is always called with the SolarMutex locked, so if it
     889                 :            :                 //  can be acquired, this is within the same thread (should not happen)
     890                 :            :                 OSL_FAIL( "RemoveUnoObject called from BroadcastUno" );
     891                 :          0 :                 rSolarMutex.release();
     892                 :            :             }
     893                 :            :             else
     894                 :            :             {
     895                 :            :                 //  let the thread that called BroadcastUno continue
     896         [ #  # ]:          0 :                 while ( bInUnoBroadcast )
     897                 :            :                 {
     898                 :          0 :                     osl::Thread::yield();
     899                 :            :                 }
     900                 :            :             }
     901                 :            :         }
     902                 :            :     }
     903                 :            :     else
     904                 :            :     {
     905                 :            :         OSL_FAIL("No Uno broadcaster");
     906                 :            :     }
     907                 :      22100 : }
     908                 :            : 
     909                 :      17912 : void ScDocument::BroadcastUno( const SfxHint &rHint )
     910                 :            : {
     911         [ +  - ]:      17912 :     if (pUnoBroadcaster)
     912                 :            :     {
     913                 :      17912 :         bInUnoBroadcast = true;
     914                 :      17912 :         pUnoBroadcaster->Broadcast( rHint );
     915                 :      17912 :         bInUnoBroadcast = false;
     916                 :            : 
     917                 :            :         // During Broadcast notification, Uno objects can add to pUnoListenerCalls.
     918                 :            :         // The listener calls must be processed after completing the broadcast,
     919                 :            :         // because they can add or remove objects from pUnoBroadcaster.
     920                 :            : 
     921   [ #  #  #  # ]:      17912 :         if ( pUnoListenerCalls && rHint.ISA( SfxSimpleHint ) &&
         [ #  # ][ -  + ]
                 [ -  + ]
     922                 :          0 :                 ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DATACHANGED &&
     923                 :          0 :                 !bInUnoListenerCall )
     924                 :            :         {
     925                 :            :             // Listener calls may lead to BroadcastUno calls again. The listener calls
     926                 :            :             // are not nested, instead the calls are collected in the list, and the
     927                 :            :             // outermost call executes them all.
     928                 :            : 
     929         [ #  # ]:          0 :             ScChartLockGuard aChartLockGuard(this);
     930                 :          0 :             bInUnoListenerCall = true;
     931         [ #  # ]:          0 :             pUnoListenerCalls->ExecuteAndClear();
     932         [ #  # ]:          0 :             bInUnoListenerCall = false;
     933                 :            :         }
     934                 :            :     }
     935                 :      17912 : }
     936                 :            : 
     937                 :          0 : void ScDocument::AddUnoListenerCall( const uno::Reference<util::XModifyListener>& rListener,
     938                 :            :                                         const lang::EventObject& rEvent )
     939                 :            : {
     940                 :            :     OSL_ENSURE( bInUnoBroadcast, "AddUnoListenerCall is supposed to be called from BroadcastUno only" );
     941                 :            : 
     942         [ #  # ]:          0 :     if ( !pUnoListenerCalls )
     943         [ #  # ]:          0 :         pUnoListenerCalls = new ScUnoListenerCalls;
     944                 :          0 :     pUnoListenerCalls->Add( rListener, rEvent );
     945                 :          0 : }
     946                 :            : 
     947                 :         36 : void ScDocument::BeginUnoRefUndo()
     948                 :            : {
     949                 :            :     OSL_ENSURE( !pUnoRefUndoList, "BeginUnoRefUndo twice" );
     950         [ -  + ]:         36 :     delete pUnoRefUndoList;
     951                 :            : 
     952         [ +  - ]:         36 :     pUnoRefUndoList = new ScUnoRefList;
     953                 :         36 : }
     954                 :            : 
     955                 :         36 : ScUnoRefList* ScDocument::EndUnoRefUndo()
     956                 :            : {
     957                 :         36 :     ScUnoRefList* pRet = pUnoRefUndoList;
     958                 :         36 :     pUnoRefUndoList = NULL;
     959                 :         36 :     return pRet;                // must be deleted by caller!
     960                 :            : }
     961                 :            : 
     962                 :       1426 : void ScDocument::AddUnoRefChange( sal_Int64 nId, const ScRangeList& rOldRanges )
     963                 :            : {
     964         [ +  - ]:       1426 :     if ( pUnoRefUndoList )
     965                 :       1426 :         pUnoRefUndoList->Add( nId, rOldRanges );
     966                 :       1426 : }
     967                 :            : 
     968                 :      16365 : sal_Int64 ScDocument::GetNewUnoId()
     969                 :            : {
     970                 :      16365 :     return ++nUnoObjectId;
     971                 :            : }
     972                 :            : 
     973                 :         65 : void ScDocument::UpdateReference( UpdateRefMode eUpdateRefMode,
     974                 :            :                                     SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
     975                 :            :                                     SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
     976                 :            :                                     SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
     977                 :            :                                     ScDocument* pUndoDoc, bool bIncludeDraw,
     978                 :            :                                     bool bUpdateNoteCaptionPos )
     979                 :            : {
     980                 :         65 :     PutInOrder( nCol1, nCol2 );
     981                 :         65 :     PutInOrder( nRow1, nRow2 );
     982                 :         65 :     PutInOrder( nTab1, nTab2 );
     983 [ +  - ][ +  - ]:         65 :     if (VALIDTAB(nTab1) && VALIDTAB(nTab2))
                 [ +  - ]
     984                 :            :     {
     985                 :         65 :         bool bExpandRefsOld = IsExpandRefs();
     986 [ +  + ][ +  + ]:         65 :         if ( eUpdateRefMode == URM_INSDEL && (nDx > 0 || nDy > 0 || nDz > 0) )
         [ -  + ][ +  + ]
     987                 :         27 :             SetExpandRefs( SC_MOD()->GetInputOptions().GetExpandRefs() );
     988                 :            :         SCTAB i;
     989                 :            :         SCTAB iMax;
     990         [ +  + ]:         65 :         if ( eUpdateRefMode == URM_COPY )
     991                 :            :         {
     992                 :         25 :             i = nTab1;
     993                 :         25 :             iMax = nTab2;
     994                 :            :         }
     995                 :            :         else
     996                 :            :         {
     997                 :         40 :             ScRange aRange( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2 );
     998         [ +  - ]:         40 :             xColNameRanges->UpdateReference( eUpdateRefMode, this, aRange, nDx, nDy, nDz );
     999         [ +  - ]:         40 :             xRowNameRanges->UpdateReference( eUpdateRefMode, this, aRange, nDx, nDy, nDz );
    1000         [ +  - ]:         40 :             pDBCollection->UpdateReference( eUpdateRefMode, nCol1, nRow1, nTab1, nCol2, nRow2, nTab2, nDx, nDy, nDz );
    1001         [ +  + ]:         40 :             if (pRangeName)
    1002         [ +  - ]:         19 :                 pRangeName->UpdateReference( eUpdateRefMode, aRange, nDx, nDy, nDz );
    1003         [ +  + ]:         40 :             if ( pDPCollection )
    1004         [ +  - ]:         11 :                 pDPCollection->UpdateReference( eUpdateRefMode, aRange, nDx, nDy, nDz );
    1005         [ +  - ]:         40 :             UpdateChartRef( eUpdateRefMode, nCol1, nRow1, nTab1, nCol2, nRow2, nTab2, nDx, nDy, nDz );
    1006         [ +  - ]:         40 :             UpdateRefAreaLinks( eUpdateRefMode, aRange, nDx, nDy, nDz );
    1007         [ -  + ]:         40 :             if ( pValidationList )
    1008         [ #  # ]:          0 :                 pValidationList->UpdateReference( eUpdateRefMode, aRange, nDx, nDy, nDz );
    1009         [ -  + ]:         40 :             if ( pDetOpList )
    1010         [ #  # ]:          0 :                 pDetOpList->UpdateReference( this, eUpdateRefMode, aRange, nDx, nDy, nDz );
    1011         [ +  - ]:         40 :             if ( pUnoBroadcaster )
    1012                 :            :                 pUnoBroadcaster->Broadcast( ScUpdateRefHint(
    1013 [ +  - ][ +  - ]:         40 :                                     eUpdateRefMode, aRange, nDx, nDy, nDz ) );
                 [ +  - ]
    1014                 :         40 :             i = 0;
    1015                 :         40 :             iMax = static_cast<SCTAB>(maTabs.size())-1;
    1016                 :            :         }
    1017 [ +  + ][ +  - ]:        139 :         for ( ; i<=iMax && i < static_cast<SCTAB>(maTabs.size()); i++)
                 [ +  + ]
    1018         [ +  - ]:         74 :             if (maTabs[i])
    1019                 :         74 :                 maTabs[i]->UpdateReference(
    1020                 :            :                     eUpdateRefMode, nCol1, nRow1, nTab1, nCol2, nRow2, nTab2,
    1021                 :         74 :                     nDx, nDy, nDz, pUndoDoc, bIncludeDraw, bUpdateNoteCaptionPos );
    1022                 :            : 
    1023         [ -  + ]:         65 :         if ( bIsEmbedded )
    1024                 :            :         {
    1025                 :            :             SCCOL theCol1;
    1026                 :            :             SCROW theRow1;
    1027                 :            :             SCTAB theTab1;
    1028                 :            :             SCCOL theCol2;
    1029                 :            :             SCROW theRow2;
    1030                 :            :             SCTAB theTab2;
    1031                 :          0 :             theCol1 = aEmbedRange.aStart.Col();
    1032                 :          0 :             theRow1 = aEmbedRange.aStart.Row();
    1033                 :          0 :             theTab1 = aEmbedRange.aStart.Tab();
    1034                 :          0 :             theCol2 = aEmbedRange.aEnd.Col();
    1035                 :          0 :             theRow2 = aEmbedRange.aEnd.Row();
    1036                 :          0 :             theTab2 = aEmbedRange.aEnd.Tab();
    1037         [ #  # ]:          0 :             if ( ScRefUpdate::Update( this, eUpdateRefMode, nCol1,nRow1,nTab1, nCol2,nRow2,nTab2,
    1038         [ #  # ]:          0 :                                         nDx,nDy,nDz, theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 ) )
    1039                 :            :             {
    1040                 :          0 :                 aEmbedRange = ScRange( theCol1,theRow1,theTab1, theCol2,theRow2,theTab2 );
    1041                 :            :             }
    1042                 :            :         }
    1043                 :         65 :         SetExpandRefs( bExpandRefsOld );
    1044                 :            : 
    1045                 :            :         // after moving, no clipboard move ref-updates are possible
    1046 [ -  + ][ -  + ]:         65 :         if ( eUpdateRefMode != URM_COPY && IsClipboardSource() )
                 [ +  + ]
    1047                 :            :         {
    1048                 :          0 :             ScDocument* pClipDoc = SC_MOD()->GetClipDoc();
    1049         [ #  # ]:          0 :             if (pClipDoc)
    1050                 :          0 :                 pClipDoc->GetClipParam().mbCutMode = false;
    1051                 :            :         }
    1052                 :            :     }
    1053                 :         65 : }
    1054                 :            : 
    1055                 :          0 : void ScDocument::UpdateTranspose( const ScAddress& rDestPos, ScDocument* pClipDoc,
    1056                 :            :                                         const ScMarkData& rMark, ScDocument* pUndoDoc )
    1057                 :            : {
    1058                 :            :     OSL_ENSURE(pClipDoc->bIsClip, "UpdateTranspose: kein Clip");
    1059                 :            : 
    1060                 :          0 :     ScRange aSource;
    1061         [ #  # ]:          0 :     ScClipParam& rClipParam = GetClipParam();
    1062 [ #  # ][ #  # ]:          0 :     if (!rClipParam.maRanges.empty())
    1063         [ #  # ]:          0 :         aSource = *rClipParam.maRanges.front();
    1064                 :          0 :     ScAddress aDest = rDestPos;
    1065                 :            : 
    1066                 :          0 :     SCTAB nClipTab = 0;
    1067 [ #  # ][ #  # ]:          0 :     for (SCTAB nDestTab=0; nDestTab< static_cast<SCTAB>(maTabs.size()) && maTabs[nDestTab]; nDestTab++)
                 [ #  # ]
    1068 [ #  # ][ #  # ]:          0 :         if (rMark.GetTableSelect(nDestTab))
    1069                 :            :         {
    1070         [ #  # ]:          0 :             while (!pClipDoc->maTabs[nClipTab]) nClipTab = (nClipTab+1) % (MAXTAB+1);
    1071                 :          0 :             aSource.aStart.SetTab( nClipTab );
    1072                 :          0 :             aSource.aEnd.SetTab( nClipTab );
    1073                 :          0 :             aDest.SetTab( nDestTab );
    1074                 :            : 
    1075                 :            :             //  wie UpdateReference
    1076         [ #  # ]:          0 :             if (pRangeName)
    1077         [ #  # ]:          0 :                 pRangeName->UpdateTranspose( aSource, aDest );      // vor den Zellen!
    1078         [ #  # ]:          0 :             for (SCTAB i=0; i< static_cast<SCTAB>(maTabs.size()); i++)
    1079         [ #  # ]:          0 :                 if (maTabs[i])
    1080         [ #  # ]:          0 :                     maTabs[i]->UpdateTranspose( aSource, aDest, pUndoDoc );
    1081                 :            : 
    1082                 :          0 :             nClipTab = (nClipTab+1) % (MAXTAB+1);
    1083                 :            :         }
    1084                 :          0 : }
    1085                 :            : 
    1086                 :          0 : void ScDocument::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY )
    1087                 :            : {
    1088                 :            :     //! pDBCollection
    1089                 :            :     //! pPivotCollection
    1090                 :            :     //! UpdateChartRef
    1091                 :            : 
    1092         [ #  # ]:          0 :     if (pRangeName)
    1093                 :          0 :         pRangeName->UpdateGrow( rArea, nGrowX, nGrowY );
    1094                 :            : 
    1095 [ #  # ][ #  # ]:          0 :     for (SCTAB i=0; i< static_cast<SCTAB>(maTabs.size()) && maTabs[i]; i++)
                 [ #  # ]
    1096                 :          0 :         maTabs[i]->UpdateGrow( rArea, nGrowX, nGrowY );
    1097                 :          0 : }
    1098                 :            : 
    1099                 :         27 : void ScDocument::Fill(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScProgress* pProgress, const ScMarkData& rMark,
    1100                 :            :                         sal_uLong nFillCount, FillDir eFillDir, FillCmd eFillCmd, FillDateCmd eFillDateCmd,
    1101                 :            :                         double nStepValue, double nMaxValue)
    1102                 :            : {
    1103                 :         27 :     PutInOrder( nCol1, nCol2 );
    1104                 :         27 :     PutInOrder( nRow1, nRow2 );
    1105                 :         27 :     SCTAB nMax = maTabs.size();
    1106 [ +  - ][ +  - ]:         27 :     ScMarkData::const_iterator itr = rMark.begin(), itrEnd = rMark.end();
    1107 [ +  - ][ +  - ]:         54 :     for (; itr != itrEnd && *itr < nMax; ++itr)
         [ +  + ][ +  - ]
         [ +  - ][ +  + ]
    1108 [ +  - ][ +  - ]:         27 :         if (maTabs[*itr])
    1109         [ +  - ]:         27 :             maTabs[*itr]->Fill(nCol1, nRow1, nCol2, nRow2,
    1110                 :            :                             nFillCount, eFillDir, eFillCmd, eFillDateCmd,
    1111         [ +  - ]:         27 :                             nStepValue, nMaxValue, pProgress);
    1112                 :         27 : }
    1113                 :            : 
    1114                 :          0 : rtl::OUString ScDocument::GetAutoFillPreview( const ScRange& rSource, SCCOL nEndX, SCROW nEndY )
    1115                 :            : {
    1116                 :          0 :     SCTAB nTab = rSource.aStart.Tab();
    1117 [ #  # ][ #  # ]:          0 :     if (nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
                 [ #  # ]
    1118         [ #  # ]:          0 :         return maTabs[nTab]->GetAutoFillPreview( rSource, nEndX, nEndY );
    1119                 :            : 
    1120                 :          0 :     return rtl::OUString();
    1121                 :            : }
    1122                 :            : 
    1123                 :          0 : void ScDocument::AutoFormat( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
    1124                 :            :                                     sal_uInt16 nFormatNo, const ScMarkData& rMark )
    1125                 :            : {
    1126                 :          0 :     PutInOrder( nStartCol, nEndCol );
    1127                 :          0 :     PutInOrder( nStartRow, nEndRow );
    1128                 :          0 :     SCTAB nMax = maTabs.size();
    1129 [ #  # ][ #  # ]:          0 :     ScMarkData::const_iterator itr = rMark.begin(), itrEnd = rMark.end();
    1130 [ #  # ][ #  # ]:          0 :     for (; itr != itrEnd && *itr < nMax; ++itr)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1131 [ #  # ][ #  # ]:          0 :         if (maTabs[*itr])
    1132 [ #  # ][ #  # ]:          0 :             maTabs[*itr]->AutoFormat( nStartCol, nStartRow, nEndCol, nEndRow, nFormatNo );
    1133                 :          0 : }
    1134                 :            : 
    1135                 :          0 : void ScDocument::GetAutoFormatData(SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
    1136                 :            :                                     ScAutoFormatData& rData)
    1137                 :            : {
    1138 [ #  # ][ #  # ]:          0 :     if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()))
                 [ #  # ]
    1139                 :            :     {
    1140         [ #  # ]:          0 :         if (maTabs[nTab])
    1141                 :            :         {
    1142                 :          0 :             PutInOrder(nStartCol, nEndCol);
    1143                 :          0 :             PutInOrder(nStartRow, nEndRow);
    1144                 :          0 :             maTabs[nTab]->GetAutoFormatData(nStartCol, nStartRow, nEndCol, nEndRow, rData);
    1145                 :            :         }
    1146                 :            :     }
    1147                 :          0 : }
    1148                 :            : 
    1149                 :         54 : void ScDocument::GetSearchAndReplaceStart( const SvxSearchItem& rSearchItem,
    1150                 :            :         SCCOL& rCol, SCROW& rRow )
    1151                 :            : {
    1152                 :         54 :     sal_uInt16 nCommand = rSearchItem.GetCommand();
    1153                 :            :     bool bReplace = ( nCommand == SVX_SEARCHCMD_REPLACE ||
    1154 [ -  + ][ +  - ]:         54 :         nCommand == SVX_SEARCHCMD_REPLACE_ALL );
    1155         [ -  + ]:         54 :     if ( rSearchItem.GetBackward() )
    1156                 :            :     {
    1157         [ #  # ]:          0 :         if ( rSearchItem.GetRowDirection() )
    1158                 :            :         {
    1159         [ #  # ]:          0 :             if ( rSearchItem.GetPattern() )
    1160                 :            :             {
    1161                 :          0 :                 rCol = MAXCOL;
    1162                 :          0 :                 rRow = MAXROW+1;
    1163                 :            :             }
    1164         [ #  # ]:          0 :             else if ( bReplace )
    1165                 :            :             {
    1166                 :          0 :                 rCol = MAXCOL;
    1167                 :          0 :                 rRow = MAXROW;
    1168                 :            :             }
    1169                 :            :             else
    1170                 :            :             {
    1171                 :          0 :                 rCol = MAXCOL+1;
    1172                 :          0 :                 rRow = MAXROW;
    1173                 :            :             }
    1174                 :            :         }
    1175                 :            :         else
    1176                 :            :         {
    1177         [ #  # ]:          0 :             if ( rSearchItem.GetPattern() )
    1178                 :            :             {
    1179                 :          0 :                 rCol = MAXCOL+1;
    1180                 :          0 :                 rRow = MAXROW;
    1181                 :            :             }
    1182         [ #  # ]:          0 :             else if ( bReplace )
    1183                 :            :             {
    1184                 :          0 :                 rCol = MAXCOL;
    1185                 :          0 :                 rRow = MAXROW;
    1186                 :            :             }
    1187                 :            :             else
    1188                 :            :             {
    1189                 :          0 :                 rCol = MAXCOL;
    1190                 :          0 :                 rRow = MAXROW+1;
    1191                 :            :             }
    1192                 :            :         }
    1193                 :            :     }
    1194                 :            :     else
    1195                 :            :     {
    1196         [ -  + ]:         54 :         if ( rSearchItem.GetRowDirection() )
    1197                 :            :         {
    1198         [ #  # ]:          0 :             if ( rSearchItem.GetPattern() )
    1199                 :            :             {
    1200                 :          0 :                 rCol = 0;
    1201                 :          0 :                 rRow = (SCROW) -1;
    1202                 :            :             }
    1203         [ #  # ]:          0 :             else if ( bReplace )
    1204                 :            :             {
    1205                 :          0 :                 rCol = 0;
    1206                 :          0 :                 rRow = 0;
    1207                 :            :             }
    1208                 :            :             else
    1209                 :            :             {
    1210                 :          0 :                 rCol = (SCCOL) -1;
    1211                 :          0 :                 rRow = 0;
    1212                 :            :             }
    1213                 :            :         }
    1214                 :            :         else
    1215                 :            :         {
    1216         [ -  + ]:         54 :             if ( rSearchItem.GetPattern() )
    1217                 :            :             {
    1218                 :          0 :                 rCol = (SCCOL) -1;
    1219                 :          0 :                 rRow = 0;
    1220                 :            :             }
    1221         [ -  + ]:         54 :             else if ( bReplace )
    1222                 :            :             {
    1223                 :          0 :                 rCol = 0;
    1224                 :          0 :                 rRow = 0;
    1225                 :            :             }
    1226                 :            :             else
    1227                 :            :             {
    1228                 :         54 :                 rCol = 0;
    1229                 :         54 :                 rRow = (SCROW) -1;
    1230                 :            :             }
    1231                 :            :         }
    1232                 :            :     }
    1233                 :         54 : }
    1234                 :            : 
    1235                 :         64 : bool ScDocument::SearchAndReplace(
    1236                 :            :     const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, SCTAB& rTab,
    1237                 :            :     const ScMarkData& rMark, ScRangeList& rMatchedRanges,
    1238                 :            :     rtl::OUString& rUndoStr, ScDocument* pUndoDoc)
    1239                 :            : {
    1240                 :            :     //!     getrennte Markierungen pro Tabelle verwalten !!!!!!!!!!!!!
    1241                 :            : 
    1242                 :         64 :     bool bFound = false;
    1243                 :         64 :     if (rTab >= static_cast<SCTAB>(maTabs.size()))
    1244                 :            :         OSL_FAIL("table out of range");
    1245         [ +  - ]:         64 :     if (VALIDTAB(rTab))
    1246                 :            :     {
    1247                 :            :         SCCOL nCol;
    1248                 :            :         SCROW nRow;
    1249                 :            :         SCTAB nTab;
    1250                 :         64 :         sal_uInt16 nCommand = rSearchItem.GetCommand();
    1251 [ +  + ][ +  + ]:         64 :         if ( nCommand == SVX_SEARCHCMD_FIND_ALL ||
    1252                 :            :              nCommand == SVX_SEARCHCMD_REPLACE_ALL )
    1253                 :            :         {
    1254                 :         21 :             SCTAB nMax = maTabs.size();
    1255 [ +  - ][ +  - ]:         21 :             ScMarkData::const_iterator itr = rMark.begin(), itrEnd = rMark.end();
    1256 [ +  - ][ +  - ]:         42 :             for (; itr != itrEnd && *itr < nMax; ++itr)
         [ +  + ][ +  - ]
         [ +  - ][ +  + ]
    1257 [ +  - ][ +  - ]:         21 :                 if (maTabs[*itr])
    1258                 :            :                 {
    1259                 :         21 :                     nCol = 0;
    1260                 :         21 :                     nRow = 0;
    1261         [ +  - ]:         21 :                     bFound |= maTabs[*itr]->SearchAndReplace(
    1262         [ +  - ]:         21 :                         rSearchItem, nCol, nRow, rMark, rMatchedRanges, rUndoStr, pUndoDoc);
    1263                 :         21 :                 }
    1264                 :            : 
    1265                 :            :             //  Markierung wird innen schon komplett gesetzt
    1266                 :            :         }
    1267                 :            :         else
    1268                 :            :         {
    1269                 :         43 :             nCol = rCol;
    1270                 :         43 :             nRow = rRow;
    1271         [ -  + ]:         43 :             if (rSearchItem.GetBackward())
    1272                 :            :             {
    1273 [ #  # ][ #  # ]:          0 :                 for (nTab = rTab; ((SCsTAB)nTab >= 0) && !bFound; nTab--)
                 [ #  # ]
    1274         [ #  # ]:          0 :                     if (maTabs[nTab])
    1275                 :            :                     {
    1276 [ #  # ][ #  # ]:          0 :                         if (rMark.GetTableSelect(nTab))
    1277                 :            :                         {
    1278                 :          0 :                             bFound = maTabs[nTab]->SearchAndReplace(
    1279         [ #  # ]:          0 :                                 rSearchItem, nCol, nRow, rMark, rMatchedRanges, rUndoStr, pUndoDoc);
    1280         [ #  # ]:          0 :                             if (bFound)
    1281                 :            :                             {
    1282                 :          0 :                                 rCol = nCol;
    1283                 :          0 :                                 rRow = nRow;
    1284                 :          0 :                                 rTab = nTab;
    1285                 :            :                             }
    1286                 :            :                             else
    1287                 :            :                                 ScDocument::GetSearchAndReplaceStart(
    1288                 :          0 :                                     rSearchItem, nCol, nRow );
    1289                 :            :                         }
    1290                 :            :                     }
    1291                 :            :             }
    1292                 :            :             else
    1293                 :            :             {
    1294 [ +  + ][ +  + ]:        125 :                 for (nTab = rTab; (nTab < static_cast<SCTAB>(maTabs.size())) && !bFound; nTab++)
                 [ +  + ]
    1295         [ +  - ]:         61 :                     if (maTabs[nTab])
    1296                 :            :                     {
    1297 [ +  - ][ +  + ]:         61 :                         if (rMark.GetTableSelect(nTab))
    1298                 :            :                         {
    1299                 :         43 :                             bFound = maTabs[nTab]->SearchAndReplace(
    1300         [ +  - ]:         43 :                                 rSearchItem, nCol, nRow, rMark, rMatchedRanges, rUndoStr, pUndoDoc);
    1301         [ +  + ]:         43 :                             if (bFound)
    1302                 :            :                             {
    1303                 :         28 :                                 rCol = nCol;
    1304                 :         28 :                                 rRow = nRow;
    1305                 :         28 :                                 rTab = nTab;
    1306                 :            :                             }
    1307                 :            :                             else
    1308                 :            :                                 ScDocument::GetSearchAndReplaceStart(
    1309                 :         15 :                                     rSearchItem, nCol, nRow );
    1310                 :            :                         }
    1311                 :            :                     }
    1312                 :            :             }
    1313                 :            :         }
    1314                 :            :     }
    1315                 :         64 :     return bFound;
    1316                 :            : }
    1317                 :            : 
    1318                 :            : //  Outline anpassen
    1319                 :            : 
    1320                 :        333 : bool ScDocument::UpdateOutlineCol( SCCOL nStartCol, SCCOL nEndCol, SCTAB nTab, bool bShow )
    1321                 :            : {
    1322 [ +  - ][ +  - ]:        333 :     if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
         [ +  - ][ +  - ]
    1323                 :        333 :         return maTabs[nTab]->UpdateOutlineCol( nStartCol, nEndCol, bShow );
    1324                 :            : 
    1325                 :            :     OSL_FAIL("missing tab");
    1326                 :        333 :     return false;
    1327                 :            : }
    1328                 :            : 
    1329                 :         34 : bool ScDocument::UpdateOutlineRow( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bShow )
    1330                 :            : {
    1331 [ +  - ][ +  - ]:         34 :     if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
         [ +  - ][ +  - ]
    1332                 :         34 :         return maTabs[nTab]->UpdateOutlineRow( nStartRow, nEndRow, bShow );
    1333                 :            : 
    1334                 :            :     OSL_FAIL("missing tab");
    1335                 :         34 :     return false;
    1336                 :            : }
    1337                 :            : 
    1338                 :         10 : void ScDocument::Sort(SCTAB nTab, const ScSortParam& rSortParam, bool bKeepQuery)
    1339                 :            : {
    1340 [ +  - ][ +  - ]:         10 :     if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
         [ +  - ][ +  - ]
    1341                 :            :     {
    1342                 :         10 :         bool bOldDisableIdle = IsIdleDisabled();
    1343                 :         10 :         DisableIdle( true );
    1344                 :         10 :         maTabs[nTab]->Sort(rSortParam, bKeepQuery);
    1345                 :         10 :         DisableIdle( bOldDisableIdle );
    1346                 :            :     }
    1347                 :         10 : }
    1348                 :            : 
    1349                 :         16 : SCSIZE ScDocument::Query(SCTAB nTab, const ScQueryParam& rQueryParam, bool bKeepSub)
    1350                 :            : {
    1351 [ +  - ][ +  - ]:         16 :     if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
         [ +  - ][ +  - ]
    1352                 :         16 :         return maTabs[nTab]->Query((ScQueryParam&)rQueryParam, bKeepSub);
    1353                 :            : 
    1354                 :            :     OSL_FAIL("missing tab");
    1355                 :         16 :     return 0;
    1356                 :            : }
    1357                 :            : 
    1358                 :            : 
    1359                 :          0 : void ScDocument::GetUpperCellString(SCCOL nCol, SCROW nRow, SCTAB nTab, rtl::OUString& rStr)
    1360                 :            : {
    1361 [ #  # ][ #  # ]:          0 :     if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
         [ #  # ][ #  # ]
    1362                 :          0 :         maTabs[nTab]->GetUpperCellString( nCol, nRow, rStr );
    1363                 :            :     else
    1364                 :          0 :         rStr = rtl::OUString();
    1365                 :          0 : }
    1366                 :            : 
    1367                 :          2 : bool ScDocument::CreateQueryParam(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, SCTAB nTab, ScQueryParam& rQueryParam)
    1368                 :            : {
    1369 [ +  - ][ +  - ]:          2 :     if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
         [ +  - ][ +  - ]
    1370                 :          2 :         return maTabs[nTab]->CreateQueryParam(nCol1, nRow1, nCol2, nRow2, rQueryParam);
    1371                 :            : 
    1372                 :            :     OSL_FAIL("missing tab");
    1373                 :          2 :     return false;
    1374                 :            : }
    1375                 :            : 
    1376                 :          0 : bool ScDocument::HasAutoFilter( SCCOL nCurCol, SCROW nCurRow, SCTAB nCurTab )
    1377                 :            : {
    1378                 :          0 :     const ScDBData* pDBData = GetDBAtCursor( nCurCol, nCurRow, nCurTab );
    1379                 :          0 :     bool bHasAutoFilter = (pDBData != NULL);
    1380                 :            : 
    1381         [ #  # ]:          0 :     if ( pDBData )
    1382                 :            :     {
    1383         [ #  # ]:          0 :         if ( pDBData->HasHeader() )
    1384                 :            :         {
    1385                 :            :             SCCOL nCol;
    1386                 :            :             SCROW nRow;
    1387                 :            :             sal_Int16  nFlag;
    1388                 :            : 
    1389         [ #  # ]:          0 :             ScQueryParam aParam;
    1390         [ #  # ]:          0 :             pDBData->GetQueryParam( aParam );
    1391                 :          0 :             nRow = aParam.nRow1;
    1392                 :            : 
    1393 [ #  # ][ #  # ]:          0 :             for ( nCol=aParam.nCol1; nCol<=aParam.nCol2 && bHasAutoFilter; nCol++ )
                 [ #  # ]
    1394                 :            :             {
    1395                 :            :                 nFlag = ((ScMergeFlagAttr*)
    1396         [ #  # ]:          0 :                             GetAttr( nCol, nRow, nCurTab, ATTR_MERGE_FLAG ))->
    1397                 :          0 :                                 GetValue();
    1398                 :            : 
    1399         [ #  # ]:          0 :                 if ( (nFlag & SC_MF_AUTO) == 0 )
    1400                 :          0 :                     bHasAutoFilter = false;
    1401         [ #  # ]:          0 :             }
    1402                 :            :         }
    1403                 :            :         else
    1404                 :          0 :             bHasAutoFilter = false;
    1405                 :            :     }
    1406                 :            : 
    1407                 :          0 :     return bHasAutoFilter;
    1408                 :            : }
    1409                 :            : 
    1410                 :         14 : bool ScDocument::HasColHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
    1411                 :            :                                     SCTAB nTab )
    1412                 :            : {
    1413 [ +  - ][ +  - ]:         14 :     return VALIDTAB(nTab) && maTabs[nTab] && maTabs[nTab]->HasColHeader( nStartCol, nStartRow, nEndCol, nEndRow );
                 [ +  + ]
    1414                 :            : }
    1415                 :            : 
    1416                 :          0 : bool ScDocument::HasRowHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
    1417                 :            :                                     SCTAB nTab )
    1418                 :            : {
    1419 [ #  # ][ #  # ]:          0 :     return VALIDTAB(nTab) && maTabs[nTab] && maTabs[nTab]->HasRowHeader( nStartCol, nStartRow, nEndCol, nEndRow );
                 [ #  # ]
    1420                 :            : }
    1421                 :            : 
    1422                 :            : //
    1423                 :            : //  GetFilterEntries - Eintraege fuer AutoFilter-Listbox
    1424                 :            : //
    1425                 :            : 
    1426                 :          0 : bool ScDocument::GetFilterEntries(
    1427                 :            :     SCCOL nCol, SCROW nRow, SCTAB nTab, bool bFilter, std::vector<ScTypedStrData>& rStrings, bool& rHasDates)
    1428                 :            : {
    1429 [ #  # ][ #  # ]:          0 :     if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && pDBCollection )
         [ #  # ][ #  # ]
                 [ #  # ]
    1430                 :            :     {
    1431                 :          0 :         ScDBData* pDBData = pDBCollection->GetDBAtCursor(nCol, nRow, nTab, false);  //!??
    1432         [ #  # ]:          0 :         if (pDBData)
    1433                 :            :         {
    1434         [ #  # ]:          0 :             pDBData->ExtendDataArea(this);
    1435                 :            :             SCTAB nAreaTab;
    1436                 :            :             SCCOL nStartCol;
    1437                 :            :             SCROW nStartRow;
    1438                 :            :             SCCOL nEndCol;
    1439                 :            :             SCROW nEndRow;
    1440         [ #  # ]:          0 :             pDBData->GetArea( nAreaTab, nStartCol, nStartRow, nEndCol, nEndRow );
    1441                 :            : 
    1442         [ #  # ]:          0 :             if (pDBData->HasHeader())
    1443                 :          0 :                 ++nStartRow;
    1444                 :            : 
    1445         [ #  # ]:          0 :             ScQueryParam aParam;
    1446         [ #  # ]:          0 :             pDBData->GetQueryParam( aParam );
    1447                 :            : 
    1448                 :            :             // return all filter entries, if a filter condition is connected with a boolean OR
    1449         [ #  # ]:          0 :             if ( bFilter )
    1450                 :            :             {
    1451         [ #  # ]:          0 :                 SCSIZE nEntryCount = aParam.GetEntryCount();
    1452 [ #  # ][ #  # ]:          0 :                 for ( SCSIZE i = 0; i < nEntryCount && aParam.GetEntry(i).bDoQuery; ++i )
         [ #  # ][ #  # ]
    1453                 :            :                 {
    1454         [ #  # ]:          0 :                     ScQueryEntry& rEntry = aParam.GetEntry(i);
    1455         [ #  # ]:          0 :                     if ( rEntry.eConnect != SC_AND )
    1456                 :            :                     {
    1457                 :          0 :                         bFilter = false;
    1458                 :          0 :                         break;
    1459                 :            :                     }
    1460                 :            :                 }
    1461                 :            :             }
    1462                 :            : 
    1463         [ #  # ]:          0 :             if ( bFilter )
    1464                 :            :             {
    1465         [ #  # ]:          0 :                 maTabs[nTab]->GetFilteredFilterEntries( nCol, nStartRow, nEndRow, aParam, rStrings, rHasDates );
    1466                 :            :             }
    1467                 :            :             else
    1468                 :            :             {
    1469         [ #  # ]:          0 :                 maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rStrings, rHasDates );
    1470                 :            :             }
    1471                 :            : 
    1472         [ #  # ]:          0 :             sortAndRemoveDuplicates(rStrings, aParam.bCaseSens);
    1473         [ #  # ]:          0 :             return true;
    1474                 :            :         }
    1475                 :            :     }
    1476                 :            : 
    1477                 :          0 :     return false;
    1478                 :            : }
    1479                 :            : 
    1480                 :            : //
    1481                 :            : //  GetFilterEntriesArea - Eintraege fuer Filter-Dialog
    1482                 :            : //
    1483                 :            : 
    1484                 :          0 : bool ScDocument::GetFilterEntriesArea(
    1485                 :            :     SCCOL nCol, SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bCaseSens,
    1486                 :            :     std::vector<ScTypedStrData>& rStrings, bool& rHasDates)
    1487                 :            : {
    1488 [ #  # ][ #  # ]:          0 :     if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
         [ #  # ][ #  # ]
    1489                 :            :     {
    1490                 :          0 :         maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rStrings, rHasDates );
    1491                 :          0 :         sortAndRemoveDuplicates(rStrings, bCaseSens);
    1492                 :          0 :         return true;
    1493                 :            :     }
    1494                 :            : 
    1495                 :          0 :     return false;
    1496                 :            : }
    1497                 :            : 
    1498                 :            : //
    1499                 :            : //  GetDataEntries - Eintraege fuer Auswahlliste-Listbox (keine Zahlen / Formeln)
    1500                 :            : //
    1501                 :            : 
    1502                 :          0 : bool ScDocument::GetDataEntries(
    1503                 :            :     SCCOL nCol, SCROW nRow, SCTAB nTab, bool bCaseSens,
    1504                 :            :     std::vector<ScTypedStrData>& rStrings, bool bLimit )
    1505                 :            : {
    1506         [ #  # ]:          0 :     if( !bLimit )
    1507                 :            :     {
    1508                 :            :         /*  Try to generate the list from list validation. This part is skipped,
    1509                 :            :             if bLimit==true, because in that case this function is called to get
    1510                 :            :             cell values for auto completion on input. */
    1511         [ #  # ]:          0 :         sal_uInt32 nValidation = static_cast< const SfxUInt32Item* >( GetAttr( nCol, nRow, nTab, ATTR_VALIDDATA ) )->GetValue();
    1512         [ #  # ]:          0 :         if( nValidation )
    1513                 :            :         {
    1514         [ #  # ]:          0 :             const ScValidationData* pData = GetValidationEntry( nValidation );
    1515 [ #  # ][ #  # ]:          0 :             if( pData && pData->FillSelectionList( rStrings, ScAddress( nCol, nRow, nTab ) ) )
         [ #  # ][ #  # ]
           [ #  #  #  # ]
    1516                 :            :             {
    1517         [ #  # ]:          0 :                 if (pData->GetListType() == ValidListType::SORTEDASCENDING)
    1518         [ #  # ]:          0 :                     sortAndRemoveDuplicates(rStrings, bCaseSens);
    1519                 :            : 
    1520                 :          0 :                 return true;
    1521                 :            :             }
    1522                 :            :         }
    1523                 :            :     }
    1524                 :            : 
    1525 [ #  # ][ #  # ]:          0 :     if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()))
                 [ #  # ]
    1526                 :          0 :         return false;
    1527                 :            : 
    1528         [ #  # ]:          0 :     if (!maTabs[nTab])
    1529                 :          0 :         return false;
    1530                 :            : 
    1531         [ #  # ]:          0 :     std::set<ScTypedStrData> aStrings;
    1532         [ #  # ]:          0 :     bool bRet = maTabs[nTab]->GetDataEntries(nCol, nRow, aStrings, bLimit);
    1533         [ #  # ]:          0 :     rStrings.insert(rStrings.end(), aStrings.begin(), aStrings.end());
    1534         [ #  # ]:          0 :     sortAndRemoveDuplicates(rStrings, bCaseSens);
    1535                 :            : 
    1536                 :          0 :     return bRet;
    1537                 :            : }
    1538                 :            : 
    1539                 :            : //
    1540                 :            : //  GetFormulaEntries - Eintraege fuer Formel-AutoEingabe
    1541                 :            : //
    1542                 :            : 
    1543                 :          0 : bool ScDocument::GetFormulaEntries( ScTypedCaseStrSet& rStrings )
    1544                 :            : {
    1545                 :            :     //
    1546                 :            :     //  Bereichsnamen
    1547                 :            :     //
    1548                 :            : 
    1549         [ #  # ]:          0 :     if ( pRangeName )
    1550                 :            :     {
    1551 [ #  # ][ #  # ]:          0 :         ScRangeName::const_iterator itr = pRangeName->begin(), itrEnd = pRangeName->end();
         [ #  # ][ #  # ]
    1552 [ #  # ][ #  # ]:          0 :         for (; itr != itrEnd; ++itr)
                 [ #  # ]
    1553 [ #  # ][ #  # ]:          0 :             rStrings.insert(ScTypedStrData(itr->second->GetName(), 0.0, ScTypedStrData::Name));
                 [ #  # ]
    1554                 :            :     }
    1555                 :            : 
    1556                 :            :     //
    1557                 :            :     //  Datenbank-Bereiche
    1558                 :            :     //
    1559                 :            : 
    1560         [ #  # ]:          0 :     if ( pDBCollection )
    1561                 :            :     {
    1562         [ #  # ]:          0 :         const ScDBCollection::NamedDBs& rDBs = pDBCollection->getNamedDBs();
    1563 [ #  # ][ #  # ]:          0 :         ScDBCollection::NamedDBs::const_iterator itr = rDBs.begin(), itrEnd = rDBs.end();
    1564 [ #  # ][ #  # ]:          0 :         for (; itr != itrEnd; ++itr)
                 [ #  # ]
    1565 [ #  # ][ #  # ]:          0 :             rStrings.insert(ScTypedStrData(itr->GetName(), 0.0, ScTypedStrData::DbName));
                 [ #  # ]
    1566                 :            :     }
    1567                 :            : 
    1568                 :            :     //
    1569                 :            :     //  Inhalte von Beschriftungsbereichen
    1570                 :            :     //
    1571                 :            : 
    1572                 :            :     ScRangePairList* pLists[2];
    1573                 :          0 :     pLists[0] = GetColNameRanges();
    1574                 :          0 :     pLists[1] = GetRowNameRanges();
    1575         [ #  # ]:          0 :     for (sal_uInt16 nListNo=0; nListNo<2; nListNo++)
    1576                 :            :     {
    1577                 :          0 :         ScRangePairList* pList = pLists[ nListNo ];
    1578         [ #  # ]:          0 :         if (pList)
    1579 [ #  # ][ #  # ]:          0 :             for ( size_t i = 0, nPairs = pList->size(); i < nPairs; ++i )
    1580                 :            :             {
    1581         [ #  # ]:          0 :                 ScRangePair* pPair = (*pList)[i];
    1582                 :          0 :                 ScRange aRange = pPair->GetRange(0);
    1583         [ #  # ]:          0 :                 ScCellIterator aIter( this, aRange );
    1584 [ #  # ][ #  # ]:          0 :                 for ( ScBaseCell* pCell = aIter.GetFirst(); pCell; pCell = aIter.GetNext() )
                 [ #  # ]
    1585 [ #  # ][ #  # ]:          0 :                     if ( pCell->HasStringData() )
    1586                 :            :                     {
    1587         [ #  # ]:          0 :                         rtl::OUString aStr = pCell->GetStringData();
    1588 [ #  # ][ #  # ]:          0 :                         rStrings.insert(ScTypedStrData(aStr, 0.0, ScTypedStrData::Header));
    1589                 :            :                     }
    1590                 :            :             }
    1591                 :            :     }
    1592                 :            : 
    1593                 :          0 :     return true;
    1594                 :            : }
    1595                 :            : 
    1596                 :            : 
    1597                 :        567 : bool ScDocument::IsEmbedded() const
    1598                 :            : {
    1599                 :        567 :     return bIsEmbedded;
    1600                 :            : }
    1601                 :            : 
    1602                 :          0 : void ScDocument::GetEmbedded( ScRange& rRange ) const
    1603                 :            : {
    1604                 :          0 :     rRange = aEmbedRange;
    1605                 :          0 : }
    1606                 :            : 
    1607                 :          0 : Rectangle ScDocument::GetEmbeddedRect() const                       // 1/100 mm
    1608                 :            : {
    1609                 :          0 :     Rectangle aRect;
    1610                 :          0 :     ScTable* pTable = NULL;
    1611         [ #  # ]:          0 :     if ( aEmbedRange.aStart.Tab() < static_cast<SCTAB>(maTabs.size()) )
    1612                 :          0 :         pTable = maTabs[aEmbedRange.aStart.Tab()];
    1613                 :            :     else
    1614                 :            :         OSL_FAIL("table out of range");
    1615         [ #  # ]:          0 :     if (!pTable)
    1616                 :            :     {
    1617                 :            :         OSL_FAIL("GetEmbeddedRect ohne Tabelle");
    1618                 :            :     }
    1619                 :            :     else
    1620                 :            :     {
    1621                 :            :         SCCOL i;
    1622                 :            : 
    1623         [ #  # ]:          0 :         for (i=0; i<aEmbedRange.aStart.Col(); i++)
    1624                 :          0 :             aRect.Left() += pTable->GetColWidth(i);
    1625                 :          0 :         aRect.Top() += pTable->GetRowHeight( 0, aEmbedRange.aStart.Row() - 1);
    1626                 :          0 :         aRect.Right() = aRect.Left();
    1627         [ #  # ]:          0 :         for (i=aEmbedRange.aStart.Col(); i<=aEmbedRange.aEnd.Col(); i++)
    1628                 :          0 :             aRect.Right() += pTable->GetColWidth(i);
    1629                 :          0 :         aRect.Bottom() = aRect.Top();
    1630                 :          0 :         aRect.Bottom() += pTable->GetRowHeight( aEmbedRange.aStart.Row(), aEmbedRange.aEnd.Row());
    1631                 :            : 
    1632                 :          0 :         aRect.Left()   = (long) ( aRect.Left()   * HMM_PER_TWIPS );
    1633                 :          0 :         aRect.Right()  = (long) ( aRect.Right()  * HMM_PER_TWIPS );
    1634                 :          0 :         aRect.Top()    = (long) ( aRect.Top()    * HMM_PER_TWIPS );
    1635                 :          0 :         aRect.Bottom() = (long) ( aRect.Bottom() * HMM_PER_TWIPS );
    1636                 :            :     }
    1637                 :          0 :     return aRect;
    1638                 :            : }
    1639                 :            : 
    1640                 :          0 : void ScDocument::SetEmbedded( const ScRange& rRange )
    1641                 :            : {
    1642                 :          0 :     bIsEmbedded = true;
    1643                 :          0 :     aEmbedRange = rRange;
    1644                 :          0 : }
    1645                 :            : 
    1646                 :          0 : void ScDocument::ResetEmbedded()
    1647                 :            : {
    1648                 :          0 :     bIsEmbedded = false;
    1649                 :          0 :     aEmbedRange = ScRange();
    1650                 :          0 : }
    1651                 :            : 
    1652                 :            : 
    1653                 :            : /** Similar to ScViewData::AddPixelsWhile(), but add height twips and only
    1654                 :            :     while result is less than nStopTwips.
    1655                 :            :     @return true if advanced at least one row.
    1656                 :            :  */
    1657                 :         72 : bool lcl_AddTwipsWhile( long & rTwips, long nStopTwips, SCROW & rPosY, SCROW nEndRow, const ScTable * pTable )
    1658                 :            : {
    1659                 :         72 :     SCROW nRow = rPosY;
    1660                 :         72 :     bool bAdded = false;
    1661                 :         72 :     bool bStop = false;
    1662 [ +  - ][ +  - ]:        144 :     while (rTwips < nStopTwips && nRow <= nEndRow && !bStop)
         [ +  + ][ +  + ]
    1663                 :            :     {
    1664                 :            :         SCROW nHeightEndRow;
    1665         [ +  - ]:         72 :         sal_uInt16 nHeight = pTable->GetRowHeight( nRow, NULL, &nHeightEndRow);
    1666         [ -  + ]:         72 :         if (nHeightEndRow > nEndRow)
    1667                 :          0 :             nHeightEndRow = nEndRow;
    1668         [ -  + ]:         72 :         if (!nHeight)
    1669                 :          0 :             nRow = nHeightEndRow + 1;
    1670                 :            :         else
    1671                 :            :         {
    1672                 :         72 :             SCROW nRows = nHeightEndRow - nRow + 1;
    1673                 :         72 :             sal_Int64 nAdd = static_cast<sal_Int64>(nHeight) * nRows;
    1674         [ +  - ]:         72 :             if (nAdd + rTwips >= nStopTwips)
    1675                 :            :             {
    1676                 :         72 :                 sal_Int64 nDiff = nAdd + rTwips - nStopTwips;
    1677                 :         72 :                 nRows -= static_cast<SCROW>(nDiff / nHeight);
    1678                 :         72 :                 nAdd = nHeight * nRows;
    1679                 :            :                 // We're looking for a value that satisfies loop condition.
    1680         [ +  - ]:         72 :                 if (nAdd + rTwips >= nStopTwips)
    1681                 :            :                 {
    1682                 :         72 :                     --nRows;
    1683                 :         72 :                     nAdd -= nHeight;
    1684                 :            :                 }
    1685                 :         72 :                 bStop = true;
    1686                 :            :             }
    1687                 :         72 :             rTwips += static_cast<long>(nAdd);
    1688                 :         72 :             nRow += nRows;
    1689                 :            :         }
    1690                 :            :     }
    1691         [ +  + ]:         72 :     if (nRow > rPosY)
    1692                 :            :     {
    1693                 :         30 :         --nRow;
    1694                 :         30 :         bAdded = true;
    1695                 :            :     }
    1696                 :         72 :     rPosY = nRow;
    1697                 :         72 :     return bAdded;
    1698                 :            : }
    1699                 :            : 
    1700                 :         36 : ScRange ScDocument::GetRange( SCTAB nTab, const Rectangle& rMMRect ) const
    1701                 :            : {
    1702                 :         36 :     ScTable* pTable = NULL;
    1703         [ +  - ]:         36 :     if (nTab < static_cast<SCTAB>(maTabs.size()))
    1704                 :         36 :         pTable = maTabs[nTab];
    1705                 :            :     else
    1706                 :            :         OSL_FAIL("table out of range");
    1707         [ -  + ]:         36 :     if (!pTable)
    1708                 :            :     {
    1709                 :            :         OSL_FAIL("GetRange ohne Tabelle");
    1710                 :          0 :         return ScRange();
    1711                 :            :     }
    1712                 :            : 
    1713                 :         36 :     Rectangle aPosRect = rMMRect;
    1714 [ +  - ][ -  + ]:         36 :     if ( IsNegativePage( nTab ) )
    1715         [ #  # ]:          0 :         ScDrawLayer::MirrorRectRTL( aPosRect );         // always with positive (LTR) values
    1716                 :            : 
    1717                 :            :     long nSize;
    1718                 :            :     long nTwips;
    1719                 :            :     long nAdd;
    1720                 :            :     bool bEnd;
    1721                 :            : 
    1722                 :         36 :     nSize = 0;
    1723                 :         36 :     nTwips = (long) (aPosRect.Left() / HMM_PER_TWIPS);
    1724                 :            : 
    1725                 :         36 :     SCCOL nX1 = 0;
    1726                 :         36 :     bEnd = false;
    1727         [ +  + ]:        162 :     while (!bEnd)
    1728                 :            :     {
    1729         [ +  - ]:        126 :         nAdd = (long) pTable->GetColWidth(nX1);
    1730 [ +  + ][ +  - ]:        126 :         if (nSize+nAdd <= nTwips+1 && nX1<MAXCOL)
    1731                 :            :         {
    1732                 :         90 :             nSize += nAdd;
    1733                 :         90 :             ++nX1;
    1734                 :            :         }
    1735                 :            :         else
    1736                 :         36 :             bEnd = true;
    1737                 :            :     }
    1738                 :            : 
    1739                 :         36 :     nTwips = (long) (aPosRect.Right() / HMM_PER_TWIPS);
    1740                 :            : 
    1741                 :         36 :     SCCOL nX2 = nX1;
    1742                 :         36 :     bEnd = false;
    1743         [ +  + ]:         90 :     while (!bEnd)
    1744                 :            :     {
    1745         [ +  - ]:         54 :         nAdd = (long) pTable->GetColWidth(nX2);
    1746 [ +  + ][ +  - ]:         54 :         if (nSize+nAdd < nTwips && nX2<MAXCOL)
    1747                 :            :         {
    1748                 :         18 :             nSize += nAdd;
    1749                 :         18 :             ++nX2;
    1750                 :            :         }
    1751                 :            :         else
    1752                 :         36 :             bEnd = true;
    1753                 :            :     }
    1754                 :            : 
    1755                 :            : 
    1756                 :         36 :     nSize = 0;
    1757                 :         36 :     nTwips = (long) (aPosRect.Top() / HMM_PER_TWIPS);
    1758                 :            : 
    1759                 :         36 :     SCROW nY1 = 0;
    1760                 :            :     // Was if(nSize+nAdd<=nTwips+1) inside loop => if(nSize+nAdd<nTwips+2)
    1761 [ +  + ][ +  - ]:         36 :     if (lcl_AddTwipsWhile( nSize, nTwips+2, nY1, MAXROW, pTable) && nY1 < MAXROW)
         [ +  + ][ +  - ]
    1762                 :         20 :         ++nY1;  // original loop ended on last matched +1 unless that was MAXROW
    1763                 :            : 
    1764                 :         36 :     nTwips = (long) (aPosRect.Bottom() / HMM_PER_TWIPS);
    1765                 :            : 
    1766                 :         36 :     SCROW nY2 = nY1;
    1767                 :            :     // Was if(nSize+nAdd<nTwips) inside loop => if(nSize+nAdd<nTwips)
    1768 [ +  + ][ +  - ]:         36 :     if (lcl_AddTwipsWhile( nSize, nTwips, nY2, MAXROW, pTable) && nY2 < MAXROW)
         [ +  + ][ +  - ]
    1769                 :         10 :         ++nY2;  // original loop ended on last matched +1 unless that was MAXROW
    1770                 :            : 
    1771                 :         36 :     return ScRange( nX1,nY1,nTab, nX2,nY2,nTab );
    1772                 :            : }
    1773                 :            : 
    1774                 :          0 : void ScDocument::SetEmbedded( const Rectangle& rRect )          // aus VisArea (1/100 mm)
    1775                 :            : {
    1776                 :          0 :     bIsEmbedded = true;
    1777                 :          0 :     aEmbedRange = GetRange( nVisibleTab, rRect );
    1778                 :          0 : }
    1779                 :            : 
    1780                 :            : //  VisArea auf Zellgrenzen anpassen
    1781                 :            : 
    1782                 :        854 : void lcl_SnapHor( ScTable* pTable, long& rVal, SCCOL& rStartCol )
    1783                 :            : {
    1784                 :        854 :     SCCOL nCol = 0;
    1785                 :        854 :     long nTwips = (long) (rVal / HMM_PER_TWIPS);
    1786                 :        854 :     long nSnap = 0;
    1787         [ +  - ]:       2562 :     while ( nCol<MAXCOL )
    1788                 :            :     {
    1789                 :       2562 :         long nAdd = pTable->GetColWidth(nCol);
    1790 [ -  + ][ +  + ]:       2562 :         if ( nSnap + nAdd/2 < nTwips || nCol < rStartCol )
    1791                 :            :         {
    1792                 :       1708 :             nSnap += nAdd;
    1793                 :       1708 :             ++nCol;
    1794                 :            :         }
    1795                 :            :         else
    1796                 :        854 :             break;
    1797                 :            :     }
    1798                 :        854 :     rVal = (long) ( nSnap * HMM_PER_TWIPS );
    1799                 :        854 :     rStartCol = nCol;
    1800                 :        854 : }
    1801                 :            : 
    1802                 :        854 : void lcl_SnapVer( ScTable* pTable, long& rVal, SCROW& rStartRow )
    1803                 :            : {
    1804                 :        854 :     SCROW nRow = 0;
    1805                 :        854 :     long nTwips = (long) (rVal / HMM_PER_TWIPS);
    1806                 :        854 :     long nSnap = 0;
    1807                 :            : 
    1808                 :        854 :     bool bFound = false;
    1809         [ +  - ]:       6799 :     for (SCROW i = nRow; i <= MAXROW; ++i)
    1810                 :            :     {
    1811                 :            :         SCROW nLastRow;
    1812 [ +  - ][ +  + ]:       6799 :         if (pTable->RowHidden(i, NULL, &nLastRow))
    1813                 :            :         {
    1814                 :         15 :             i = nLastRow;
    1815                 :         15 :             continue;
    1816                 :            :         }
    1817                 :            : 
    1818                 :       6784 :         nRow = i;
    1819         [ +  - ]:       6784 :         long nAdd = pTable->GetRowHeight(i);
    1820 [ +  + ][ -  + ]:       6784 :         if ( nSnap + nAdd/2 < nTwips || nRow < rStartRow )
    1821                 :            :         {
    1822                 :       5930 :             nSnap += nAdd;
    1823                 :       5930 :             ++nRow;
    1824                 :            :         }
    1825                 :            :         else
    1826                 :            :         {
    1827                 :        854 :             bFound = true;
    1828                 :            :             break;
    1829                 :            :         }
    1830                 :            :     }
    1831         [ -  + ]:        854 :     if (!bFound)
    1832                 :          0 :         nRow = MAXROW;  // all hidden down to the bottom
    1833                 :            : 
    1834                 :        854 :     rVal = (long) ( nSnap * HMM_PER_TWIPS );
    1835                 :        854 :     rStartRow = nRow;
    1836                 :        854 : }
    1837                 :            : 
    1838                 :        427 : void ScDocument::SnapVisArea( Rectangle& rRect ) const
    1839                 :            : {
    1840                 :        427 :     ScTable* pTable = NULL;
    1841         [ +  - ]:        427 :     if (nVisibleTab < static_cast<SCTAB>(maTabs.size()))
    1842                 :        427 :         pTable = maTabs[nVisibleTab];
    1843                 :            :     else
    1844                 :            :         OSL_FAIL("table out of range");
    1845         [ +  - ]:        427 :     if (!pTable)
    1846                 :            :     {
    1847                 :            :         OSL_FAIL("SetEmbedded ohne Tabelle");
    1848                 :        427 :         return;
    1849                 :            :     }
    1850                 :            : 
    1851         [ +  - ]:        427 :     bool bNegativePage = IsNegativePage( nVisibleTab );
    1852         [ -  + ]:        427 :     if ( bNegativePage )
    1853         [ #  # ]:          0 :         ScDrawLayer::MirrorRectRTL( rRect );        // calculate with positive (LTR) values
    1854                 :            : 
    1855                 :        427 :     SCCOL nCol = 0;
    1856         [ +  - ]:        427 :     lcl_SnapHor( pTable, rRect.Left(), nCol );
    1857                 :        427 :     ++nCol;                                         // mindestens eine Spalte
    1858         [ +  - ]:        427 :     lcl_SnapHor( pTable, rRect.Right(), nCol );
    1859                 :            : 
    1860                 :        427 :     SCROW nRow = 0;
    1861         [ +  - ]:        427 :     lcl_SnapVer( pTable, rRect.Top(), nRow );
    1862                 :        427 :     ++nRow;                                         // mindestens eine Zeile
    1863         [ +  - ]:        427 :     lcl_SnapVer( pTable, rRect.Bottom(), nRow );
    1864                 :            : 
    1865         [ -  + ]:        427 :     if ( bNegativePage )
    1866         [ #  # ]:        427 :         ScDrawLayer::MirrorRectRTL( rRect );        // back to real rectangle
    1867                 :            : }
    1868                 :            : 
    1869                 :          3 : ScDocProtection* ScDocument::GetDocProtection() const
    1870                 :            : {
    1871                 :          3 :     return pDocProtection.get();
    1872                 :            : }
    1873                 :            : 
    1874                 :          5 : void ScDocument::SetDocProtection(const ScDocProtection* pProtect)
    1875                 :            : {
    1876         [ +  + ]:          5 :     if (pProtect)
    1877         [ +  - ]:          4 :         pDocProtection.reset(new ScDocProtection(*pProtect));
    1878                 :            :     else
    1879                 :          1 :         pDocProtection.reset(NULL);
    1880                 :          5 : }
    1881                 :            : 
    1882                 :         33 : bool ScDocument::IsDocProtected() const
    1883                 :            : {
    1884 [ +  + ][ +  - ]:         33 :     return pDocProtection.get() && pDocProtection->isProtected();
    1885                 :            : }
    1886                 :            : 
    1887                 :         21 : bool ScDocument::IsDocEditable() const
    1888                 :            : {
    1889                 :            :     // import into read-only document is possible
    1890 [ +  - ][ +  - ]:         21 :     return !IsDocProtected() && ( bImportingXML || mbChangeReadOnlyEnabled || !pShell || !pShell->IsReadOnly() );
         [ +  - ][ +  - ]
                 [ +  + ]
    1891                 :            : }
    1892                 :            : 
    1893                 :      18326 : bool ScDocument::IsTabProtected( SCTAB nTab ) const
    1894                 :            : {
    1895 [ +  - ][ +  - ]:      18326 :     if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
    1896                 :      18326 :         return maTabs[nTab]->IsProtected();
    1897                 :            : 
    1898                 :            :     OSL_FAIL("Falsche Tabellennummer");
    1899                 :      18326 :     return false;
    1900                 :            : }
    1901                 :            : 
    1902                 :         12 : ScTableProtection* ScDocument::GetTabProtection( SCTAB nTab ) const
    1903                 :            : {
    1904 [ +  - ][ +  - ]:         12 :     if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
         [ +  - ][ +  - ]
    1905                 :         12 :         return maTabs[nTab]->GetProtection();
    1906                 :            : 
    1907                 :         12 :     return NULL;
    1908                 :            : }
    1909                 :            : 
    1910                 :         33 : void ScDocument::SetTabProtection(SCTAB nTab, const ScTableProtection* pProtect)
    1911                 :            : {
    1912 [ +  - ][ -  + ]:         33 :     if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()))
                 [ -  + ]
    1913                 :         33 :         return;
    1914                 :            : 
    1915                 :         33 :     maTabs[nTab]->SetProtection(pProtect);
    1916                 :            : }
    1917                 :            : 
    1918                 :          0 : void ScDocument::CopyTabProtection(SCTAB nTabSrc, SCTAB nTabDest)
    1919                 :            : {
    1920 [ #  # ][ #  # ]:          0 :     if (!ValidTab(nTabSrc) || nTabSrc >= static_cast<SCTAB>(maTabs.size()) || nTabDest >= static_cast<SCTAB>(maTabs.size()) || !ValidTab(nTabDest))
         [ #  # ][ #  # ]
                 [ #  # ]
    1921                 :          0 :         return;
    1922                 :            : 
    1923                 :          0 :     maTabs[nTabDest]->SetProtection( maTabs[nTabSrc]->GetProtection() );
    1924                 :            : }
    1925                 :            : 
    1926                 :      14483 : const ScDocOptions& ScDocument::GetDocOptions() const
    1927                 :            : {
    1928                 :            :     OSL_ENSURE( pDocOptions, "No DocOptions! :-(" );
    1929                 :      14483 :     return *pDocOptions;
    1930                 :            : }
    1931                 :            : 
    1932                 :       1464 : void ScDocument::SetDocOptions( const ScDocOptions& rOpt )
    1933                 :            : {
    1934                 :            :     OSL_ENSURE( pDocOptions, "No DocOptions! :-(" );
    1935                 :            : 
    1936                 :       1464 :     *pDocOptions = rOpt;
    1937                 :       1464 :     xPoolHelper->SetFormTableOpt(rOpt);
    1938                 :       1464 : }
    1939                 :            : 
    1940                 :       3266 : const ScViewOptions& ScDocument::GetViewOptions() const
    1941                 :            : {
    1942                 :            :     OSL_ENSURE( pViewOptions, "No ViewOptions! :-(" );
    1943                 :       3266 :     return *pViewOptions;
    1944                 :            : }
    1945                 :            : 
    1946                 :       3392 : void ScDocument::SetViewOptions( const ScViewOptions& rOpt )
    1947                 :            : {
    1948                 :            :     OSL_ENSURE( pViewOptions, "No ViewOptions! :-(" );
    1949                 :       3392 :     *pViewOptions = rOpt;
    1950                 :       3392 : }
    1951                 :            : 
    1952                 :        751 : void ScDocument::GetLanguage( LanguageType& rLatin, LanguageType& rCjk, LanguageType& rCtl ) const
    1953                 :            : {
    1954                 :        751 :     rLatin = eLanguage;
    1955                 :        751 :     rCjk = eCjkLanguage;
    1956                 :        751 :     rCtl = eCtlLanguage;
    1957                 :        751 : }
    1958                 :            : 
    1959                 :       2490 : void ScDocument::SetLanguage( LanguageType eLatin, LanguageType eCjk, LanguageType eCtl )
    1960                 :            : {
    1961                 :       2490 :     eLanguage = eLatin;
    1962                 :       2490 :     eCjkLanguage = eCjk;
    1963                 :       2490 :     eCtlLanguage = eCtl;
    1964         [ +  + ]:       2490 :     if ( xPoolHelper.is() )
    1965                 :            :     {
    1966                 :       1555 :         ScDocumentPool* pPool = xPoolHelper->GetDocPool();
    1967         [ +  - ]:       1555 :         pPool->SetPoolDefaultItem( SvxLanguageItem( eLanguage, ATTR_FONT_LANGUAGE ) );
    1968         [ +  - ]:       1555 :         pPool->SetPoolDefaultItem( SvxLanguageItem( eCjkLanguage, ATTR_CJK_FONT_LANGUAGE ) );
    1969         [ +  - ]:       1555 :         pPool->SetPoolDefaultItem( SvxLanguageItem( eCtlLanguage, ATTR_CTL_FONT_LANGUAGE ) );
    1970                 :            :     }
    1971                 :            : 
    1972                 :       2490 :     UpdateDrawLanguages();      // set edit engine defaults in drawing layer pool
    1973                 :       2490 : }
    1974                 :            : 
    1975                 :        319 : void ScDocument::SetDrawDefaults()
    1976                 :            : {
    1977                 :        319 :     bSetDrawDefaults = true;
    1978                 :        319 :     UpdateDrawDefaults();
    1979                 :        319 : }
    1980                 :            : 
    1981                 :       1326 : Rectangle ScDocument::GetMMRect( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab ) const
    1982                 :            : {
    1983 [ +  - ][ +  - ]:       1326 :     if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab])
         [ -  + ][ -  + ]
    1984                 :            :     {
    1985                 :            :         OSL_FAIL("GetMMRect: falsche Tabelle");
    1986         [ #  # ]:          0 :         return Rectangle(0,0,0,0);
    1987                 :            :     }
    1988                 :            : 
    1989                 :            :     SCCOL i;
    1990         [ +  - ]:       1326 :     Rectangle aRect;
    1991                 :            : 
    1992         [ +  + ]:       1708 :     for (i=0; i<nStartCol; i++)
    1993         [ +  - ]:        382 :         aRect.Left() += GetColWidth(i,nTab);
    1994         [ +  - ]:       1326 :     aRect.Top() += GetRowHeight( 0, nStartRow-1, nTab);
    1995                 :            : 
    1996                 :       1326 :     aRect.Right()  = aRect.Left();
    1997                 :       1326 :     aRect.Bottom() = aRect.Top();
    1998                 :            : 
    1999         [ +  + ]:      77280 :     for (i=nStartCol; i<=nEndCol; i++)
    2000         [ +  - ]:      75954 :         aRect.Right() += GetColWidth(i,nTab);
    2001         [ +  - ]:       1326 :     aRect.Bottom() += GetRowHeight( nStartRow, nEndRow, nTab);
    2002                 :            : 
    2003                 :       1326 :     aRect.Left()    = (long)(aRect.Left()   * HMM_PER_TWIPS);
    2004                 :       1326 :     aRect.Right()   = (long)(aRect.Right()  * HMM_PER_TWIPS);
    2005                 :       1326 :     aRect.Top()     = (long)(aRect.Top()    * HMM_PER_TWIPS);
    2006                 :       1326 :     aRect.Bottom()  = (long)(aRect.Bottom() * HMM_PER_TWIPS);
    2007                 :            : 
    2008 [ -  + ][ +  - ]:       1326 :     if ( IsNegativePage( nTab ) )
    2009         [ #  # ]:          0 :         ScDrawLayer::MirrorRectRTL( aRect );
    2010                 :            : 
    2011                 :       1326 :     return aRect;
    2012                 :            : }
    2013                 :            : 
    2014                 :         55 : void ScDocument::SetExtDocOptions( ScExtDocOptions* pNewOptions )
    2015                 :            : {
    2016         [ -  + ]:         55 :     delete pExtDocOptions;
    2017                 :         55 :     pExtDocOptions = pNewOptions;
    2018                 :         55 : }
    2019                 :            : 
    2020                 :          0 : void ScDocument::DoMergeContents( SCTAB nTab, SCCOL nStartCol, SCROW nStartRow,
    2021                 :            :                                     SCCOL nEndCol, SCROW nEndRow )
    2022                 :            : {
    2023                 :          0 :     rtl::OUString aEmpty;
    2024                 :          0 :     rtl::OUStringBuffer aTotal;
    2025                 :          0 :     rtl::OUString aCellStr;
    2026                 :            :     SCCOL nCol;
    2027                 :            :     SCROW nRow;
    2028         [ #  # ]:          0 :     for (nRow=nStartRow; nRow<=nEndRow; nRow++)
    2029         [ #  # ]:          0 :         for (nCol=nStartCol; nCol<=nEndCol; nCol++)
    2030                 :            :         {
    2031         [ #  # ]:          0 :             GetString(nCol,nRow,nTab,aCellStr);
    2032         [ #  # ]:          0 :             if (!aCellStr.isEmpty())
    2033                 :            :             {
    2034         [ #  # ]:          0 :                 if (aTotal.getLength())
    2035         [ #  # ]:          0 :                     aTotal.append(' ');
    2036         [ #  # ]:          0 :                 aTotal.append(aCellStr);
    2037                 :            :             }
    2038 [ #  # ][ #  # ]:          0 :             if (nCol != nStartCol || nRow != nStartRow)
    2039         [ #  # ]:          0 :                 SetString(nCol,nRow,nTab,aEmpty);
    2040                 :            :         }
    2041                 :            : 
    2042 [ #  # ][ #  # ]:          0 :     SetString(nStartCol,nStartRow,nTab,aTotal.makeStringAndClear());
    2043                 :          0 : }
    2044                 :            : 
    2045                 :         72 : void ScDocument::DoMerge( SCTAB nTab, SCCOL nStartCol, SCROW nStartRow,
    2046                 :            :                                     SCCOL nEndCol, SCROW nEndRow, bool bDeleteCaptions )
    2047                 :            : {
    2048         [ +  - ]:         72 :     ScMergeAttr aAttr( nEndCol-nStartCol+1, nEndRow-nStartRow+1 );
    2049         [ +  - ]:         72 :     ApplyAttr( nStartCol, nStartRow, nTab, aAttr );
    2050                 :            : 
    2051         [ +  - ]:         72 :     if ( nEndCol > nStartCol )
    2052         [ +  - ]:         72 :         ApplyFlagsTab( nStartCol+1, nStartRow, nEndCol, nStartRow, nTab, SC_MF_HOR );
    2053         [ +  + ]:         72 :     if ( nEndRow > nStartRow )
    2054         [ +  - ]:         30 :         ApplyFlagsTab( nStartCol, nStartRow+1, nStartCol, nEndRow, nTab, SC_MF_VER );
    2055 [ +  - ][ +  + ]:         72 :     if ( nEndCol > nStartCol && nEndRow > nStartRow )
    2056         [ +  - ]:         30 :         ApplyFlagsTab( nStartCol+1, nStartRow+1, nEndCol, nEndRow, nTab, SC_MF_HOR | SC_MF_VER );
    2057                 :            : 
    2058                 :            :     // remove all covered notes (removed captions are collected by drawing undo if active)
    2059         [ +  + ]:         72 :     sal_uInt16 nDelFlag = IDF_NOTE | (bDeleteCaptions ? 0 : IDF_NOCAPTIONS);
    2060         [ +  - ]:         72 :     if( nStartCol < nEndCol )
    2061         [ +  - ]:         72 :         DeleteAreaTab( nStartCol + 1, nStartRow, nEndCol, nStartRow, nTab, nDelFlag );
    2062         [ +  + ]:         72 :     if( nStartRow < nEndRow )
    2063 [ +  - ][ +  - ]:         72 :         DeleteAreaTab( nStartCol, nStartRow + 1, nEndCol, nEndRow, nTab, nDelFlag );
    2064                 :         72 : }
    2065                 :            : 
    2066                 :          0 : void ScDocument::RemoveMerge( SCCOL nCol, SCROW nRow, SCTAB nTab )
    2067                 :            : {
    2068                 :            :     const ScMergeAttr* pAttr = (const ScMergeAttr*)
    2069                 :          0 :                                     GetAttr( nCol, nRow, nTab, ATTR_MERGE );
    2070                 :            : 
    2071 [ #  # ][ #  # ]:          0 :     if ( pAttr->GetColMerge() <= 1 && pAttr->GetRowMerge() <= 1 )
                 [ #  # ]
    2072                 :          0 :         return;
    2073                 :            : 
    2074                 :          0 :     SCCOL nEndCol = nCol + pAttr->GetColMerge() - 1;
    2075                 :          0 :     SCROW nEndRow = nRow + pAttr->GetRowMerge() - 1;
    2076                 :            : 
    2077                 :          0 :     RemoveFlagsTab( nCol, nRow, nEndCol, nEndRow, nTab, SC_MF_HOR | SC_MF_VER );
    2078                 :            : 
    2079                 :            :     const ScMergeAttr* pDefAttr = (const ScMergeAttr*)
    2080                 :          0 :                                         &xPoolHelper->GetDocPool()->GetDefaultItem( ATTR_MERGE );
    2081                 :          0 :     ApplyAttr( nCol, nRow, nTab, *pDefAttr );
    2082                 :            : }
    2083                 :            : 
    2084                 :         96 : void ScDocument::ExtendPrintArea( OutputDevice* pDev, SCTAB nTab,
    2085                 :            :                     SCCOL nStartCol, SCROW nStartRow, SCCOL& rEndCol, SCROW nEndRow ) const
    2086                 :            : {
    2087 [ +  - ][ +  - ]:         96 :     if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
         [ +  - ][ +  - ]
    2088                 :         96 :         maTabs[nTab]->ExtendPrintArea( pDev, nStartCol, nStartRow, rEndCol, nEndRow );
    2089                 :         96 : }
    2090                 :            : 
    2091                 :        330 : void ScDocument::IncSizeRecalcLevel( SCTAB nTab )
    2092                 :            : {
    2093 [ +  - ][ +  - ]:        330 :     if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
         [ +  - ][ +  - ]
    2094                 :        330 :         maTabs[nTab]->IncRecalcLevel();
    2095                 :        330 : }
    2096                 :            : 
    2097                 :        330 : void ScDocument::DecSizeRecalcLevel( SCTAB nTab, bool bUpdateNoteCaptionPos )
    2098                 :            : {
    2099 [ +  - ][ +  - ]:        330 :     if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
         [ +  - ][ +  - ]
    2100                 :        330 :         maTabs[nTab]->DecRecalcLevel( bUpdateNoteCaptionPos );
    2101 [ +  - ][ +  - ]:        483 : }
    2102                 :            : 
    2103                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10