LCOV - code coverage report
Current view: top level - usr/local/src/libreoffice/sc/source/core/data - table5.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 489 642 76.2 %
Date: 2013-07-09 Functions: 54 60 90.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "scitems.hxx"
      21             : #include "attrib.hxx"
      22             : #include "patattr.hxx"
      23             : #include "docpool.hxx"
      24             : #include "formulacell.hxx"
      25             : #include "table.hxx"
      26             : #include "column.hxx"
      27             : #include "document.hxx"
      28             : #include "drwlayer.hxx"
      29             : #include "olinetab.hxx"
      30             : #include "userlist.hxx"
      31             : #include "stlsheet.hxx"
      32             : #include "global.hxx"
      33             : #include "rechead.hxx"
      34             : #include "stlpool.hxx"
      35             : #include "brdcst.hxx"
      36             : #include "tabprotection.hxx"
      37             : #include "globstr.hrc"
      38             : #include "segmenttree.hxx"
      39             : #include "columniterator.hxx"
      40             : #include "globalnames.hxx"
      41             : 
      42             : #include <com/sun/star/sheet/TablePageBreakData.hpp>
      43             : 
      44             : #include <algorithm>
      45             : #include <limits>
      46             : 
      47             : using ::com::sun::star::uno::Sequence;
      48             : using ::com::sun::star::sheet::TablePageBreakData;
      49             : using ::std::set;
      50             : 
      51             : // STATIC DATA -----------------------------------------------------------
      52             : 
      53             : #define GET_SCALEVALUE(set,id)  ((const SfxUInt16Item&)(set.Get( id ))).GetValue()
      54             : 
      55             : 
      56         901 : void ScTable::UpdatePageBreaks( const ScRange* pUserArea )
      57             : {
      58         901 :     if ( pDocument->IsImportingXML() )
      59        1552 :         return;
      60             : 
      61             :     // pUserArea != NULL -> print area is specified.  We need to force-update
      62             :     // the page breaks.
      63             : 
      64         210 :     if (!pUserArea)
      65             :     {
      66         208 :         if (!bPageSizeValid)
      67          66 :             return;
      68             : 
      69         142 :         if (mbPageBreaksValid)
      70         104 :             return;
      71             :     }
      72             : 
      73          40 :     SfxStyleSheetBase* pStyle = pDocument->GetStyleSheetPool()->
      74          40 :                                     Find( aPageStyle, SFX_STYLE_FAMILY_PAGE );
      75          40 :     if ( !pStyle )
      76             :     {
      77             :         OSL_FAIL("UpdatePageBreaks: Style not found");
      78           0 :         return;
      79             :     }
      80          40 :     SfxItemSet* pStyleSet = &pStyle->GetItemSet();
      81             :     const SfxPoolItem* pItem;
      82             : 
      83             :     SCCOL nX;
      84          40 :     SCCOL nStartCol = 0;
      85          40 :     SCROW nStartRow = 0;
      86          40 :     SCCOL nEndCol = MAXCOL;
      87          40 :     SCROW nEndRow = MAXROW;
      88          40 :     if (pUserArea)
      89             :     {
      90           2 :         nStartCol = pUserArea->aStart.Col();
      91           2 :         nStartRow = pUserArea->aStart.Row();
      92           2 :         nEndCol = pUserArea->aEnd.Col();
      93           2 :         nEndRow = pUserArea->aEnd.Row();
      94             :     }
      95             :     else
      96             :     {
      97          38 :         sal_uInt16 nAreaCount = GetPrintRangeCount();
      98          38 :         if ( nAreaCount > 1 )
      99             :         {
     100             :             //  bei mehreren Bereichen nichts anzeigen:
     101             : 
     102           0 :             for (nX=0; nX<MAXCOL; nX++)
     103           0 :                 RemoveColBreak(nX, true, false);
     104             : 
     105           0 :             RemoveRowPageBreaks(0, MAXROW-1);
     106             : 
     107           0 :             return;
     108             :         }
     109          38 :         else if ( nAreaCount == 1 )
     110             :         {
     111           4 :             const ScRange* pArea = GetPrintRange( 0 );
     112           4 :             if (pArea)
     113             :             {
     114           4 :                 nStartCol = pArea->aStart.Col();
     115           4 :                 nStartRow = pArea->aStart.Row();
     116           4 :                 nEndCol = pArea->aEnd.Col();
     117           4 :                 nEndRow = pArea->aEnd.Row();
     118             :             }
     119             :         }           // sonst alles
     120             :     }
     121             : 
     122             :     // get bSkipColBreaks/bSkipRowBreaks flags:
     123             : 
     124          40 :     bool bSkipColBreaks = false;
     125          40 :     bool bSkipRowBreaks = false;
     126             : 
     127          40 :     if ( pStyleSet->GetItemState( ATTR_PAGE_SCALETOPAGES, false, &pItem ) == SFX_ITEM_SET )
     128             :     {
     129             :         OSL_ENSURE( pItem->ISA(SfxUInt16Item), "invalid Item" );
     130           0 :         bSkipColBreaks = bSkipRowBreaks = ( ((const SfxUInt16Item*)pItem)->GetValue() > 0 );
     131             :     }
     132             : 
     133          40 :     if ( !bSkipColBreaks && pStyleSet->GetItemState(ATTR_PAGE_SCALETO, false, &pItem) == SFX_ITEM_SET )
     134             :     {
     135             :         // #i54993# when fitting to width or height, ignore only manual breaks in that direction
     136           0 :         const ScPageScaleToItem* pScaleToItem = static_cast<const ScPageScaleToItem*>(pItem);
     137           0 :         if ( pScaleToItem->GetWidth() > 0 )
     138           0 :             bSkipColBreaks = true;
     139           0 :         if ( pScaleToItem->GetHeight() > 0 )
     140           0 :             bSkipRowBreaks = true;
     141             :     }
     142             : 
     143             :     //--------------------------------------------------------------------------
     144             : 
     145          40 :     long nPageSizeX = aPageSizeTwips.Width();
     146          40 :     long nPageSizeY = aPageSizeTwips.Height();
     147             : 
     148             :         //  Anfang: Breaks loeschen
     149             : 
     150          40 :     for (nX=0; nX<nStartCol; nX++)
     151           0 :         RemoveColBreak(nX, true, false);
     152          40 :     RemoveRowPageBreaks(0, nStartRow-1);
     153             : 
     154          40 :     if (nStartCol > 0)
     155           0 :         SetColBreak(nStartCol, true, false);  // AREABREAK
     156          40 :     if (nStartRow > 0)
     157           0 :         SetRowBreak(nStartRow, true, false);  // AREABREAK
     158             : 
     159             :         //  Mittelteil: Breaks verteilen
     160             : 
     161          40 :     bool bRepeatCol = ( nRepeatStartX != SCCOL_REPEAT_NONE );
     162          40 :     bool bColFound = false;
     163          40 :     long nSizeX = 0;
     164       34944 :     for (nX=nStartCol; nX<=nEndCol; nX++)
     165             :     {
     166       34904 :         bool bStartOfPage = false;
     167       34904 :         long nThisX = ColHidden(nX) ? 0 : pColWidth[nX];
     168       34904 :         bool bManualBreak = HasColManualBreak(nX);
     169       34904 :         if ( (nSizeX+nThisX > nPageSizeX) || (bManualBreak && !bSkipColBreaks) )
     170             :         {
     171        5055 :             SetColBreak(nX, true, false);
     172        5055 :             nSizeX = 0;
     173        5055 :             bStartOfPage = true;
     174             :         }
     175       29849 :         else if (nX != nStartCol)
     176       29809 :             RemoveColBreak(nX, true, false);
     177             :         else
     178          40 :             bStartOfPage = true;
     179             : 
     180       34904 :         if ( bStartOfPage && bRepeatCol && nX>nRepeatStartX && !bColFound )
     181             :         {
     182             :             // subtract size of repeat columns from page size
     183          12 :             for (SCCOL i=nRepeatStartX; i<=nRepeatEndX; i++)
     184           6 :                 nPageSizeX -= ColHidden(i) ? 0 : pColWidth[i];
     185          12 :             while (nX<=nRepeatEndX)
     186           0 :                 RemoveColBreak(++nX, true, false);
     187           6 :             bColFound = true;
     188             :         }
     189             : 
     190       34904 :         nSizeX += nThisX;
     191             :     }
     192             : 
     193             :     // Remove all page breaks in range.
     194          40 :     RemoveRowPageBreaks(nStartRow+1, nEndRow);
     195             : 
     196             :     // And set new page breaks.
     197          40 :     bool bRepeatRow = ( nRepeatStartY != SCROW_REPEAT_NONE );
     198          40 :     bool bRowFound = false;
     199          40 :     long nSizeY = 0;
     200          40 :     ScFlatBoolRowSegments::ForwardIterator aIterHidden(*mpHiddenRows);
     201          40 :     ScFlatUInt16RowSegments::ForwardIterator aIterHeights(*mpRowHeights);
     202          40 :     SCROW nNextManualBreak = GetNextManualBreak(nStartRow); // -1 => no more manual breaks
     203      675148 :     for (SCROW nY = nStartRow; nY <= nEndRow; ++nY)
     204             :     {
     205      675108 :         bool bStartOfPage = false;
     206      675108 :         bool bThisRowHidden = false;
     207      675108 :         aIterHidden.getValue(nY, bThisRowHidden);
     208      675108 :         long nThisY = 0;
     209      675108 :         if (!bThisRowHidden)
     210             :         {
     211             :             sal_uInt16 nTmp;
     212      675096 :             aIterHeights.getValue(nY, nTmp);
     213      675096 :             nThisY = static_cast<long>(nTmp);
     214             :         }
     215             : 
     216      675108 :         bool bManualBreak = false;
     217      675108 :         if (nNextManualBreak >= 0)
     218             :         {
     219           8 :             bManualBreak = (nY == nNextManualBreak);
     220           8 :             if (nY >= nNextManualBreak)
     221             :                 // Query the next menual break position.
     222           2 :                 nNextManualBreak = GetNextManualBreak(nY+1);
     223             :         }
     224             : 
     225      675108 :         if ( (nSizeY+nThisY > nPageSizeY) || (bManualBreak && !bSkipRowBreaks) )
     226             :         {
     227      674946 :             SetRowBreak(nY, true, false);
     228      674946 :             nSizeY = 0;
     229      674946 :             bStartOfPage = true;
     230             :         }
     231         162 :         else if (nY != nStartRow)
     232             :             ; // page break already removed
     233             :         else
     234          40 :             bStartOfPage = true;
     235             : 
     236      675108 :         if ( bStartOfPage && bRepeatRow && nY>nRepeatStartY && !bRowFound )
     237             :         {
     238             :             // subtract size of repeat rows from page size
     239           3 :             unsigned long nHeights = GetTotalRowHeight(nRepeatStartY, nRepeatEndY);
     240             : #if OSL_DEBUG_LEVEL > 0
     241             :             if (nHeights == ::std::numeric_limits<unsigned long>::max())
     242             :                 OSL_FAIL("ScTable::UpdatePageBreaks: row heights overflow");
     243             : #endif
     244           3 :             nPageSizeY -= nHeights;
     245           3 :             if (nY <= nRepeatEndY)
     246           0 :                 RemoveRowPageBreaks(nY, nRepeatEndY);
     247           3 :             bRowFound = true;
     248             :         }
     249             : 
     250      675108 :         if (bThisRowHidden)
     251             :         {
     252             :             // Hidden row range.  Skip them unless there is a manual break.
     253          12 :             SCROW nLastCommon = aIterHidden.getLastPos();
     254          12 :             if (nNextManualBreak >= 0)
     255           0 :                 nLastCommon = ::std::min(nLastCommon, nNextManualBreak-1);
     256          12 :             nY = nLastCommon;
     257             :         }
     258             :         else
     259             :         {
     260             :             // Visible row range.
     261             : 
     262      675096 :             SCROW nLastHidden = aIterHidden.getLastPos();
     263      675096 :             SCROW nLastHeight = aIterHeights.getLastPos();
     264      675096 :             SCROW nLastCommon = ::std::min(nLastHidden, nLastHeight);
     265      675096 :             if (nNextManualBreak >= 0)
     266           6 :                 nLastCommon = ::std::min(nLastCommon, nNextManualBreak-1);
     267             : 
     268      675096 :             if (nLastCommon > nY)
     269             :             {
     270      675013 :                 long nMaxMultiple = static_cast<long>(nLastCommon - nY);
     271      675013 :                 long nMultiple = (nPageSizeY - nSizeY) / nThisY;
     272      675013 :                 if (nMultiple > nMaxMultiple)
     273          63 :                     nMultiple = nMaxMultiple;
     274      675013 :                 if (nMultiple > 1)
     275             :                 {
     276      675011 :                     nSizeY += nThisY * (nMultiple - 1);
     277      675011 :                     nY += nMultiple - 1;
     278             :                 }
     279             :             }
     280             :         }
     281             : 
     282      675108 :         nSizeY += nThisY;
     283             :     }
     284             : 
     285             :         //  Ende: Breaks loeschen
     286             : 
     287          40 :     if (nEndCol < MAXCOL)
     288             :     {
     289           6 :         SetColBreak(nEndCol+1, true, false);  // AREABREAK
     290        6056 :         for (nX=nEndCol+2; nX<=MAXCOL; nX++)
     291        6050 :             RemoveColBreak(nX, true, false);
     292             :     }
     293          40 :     if (nEndRow < MAXROW)
     294             :     {
     295           6 :         SetRowBreak(nEndRow+1, true, false);  // AREABREAK
     296           6 :         if (nEndRow+2 <= MAXROW)
     297           6 :             RemoveRowPageBreaks(nEndRow+2, MAXROW);
     298             :     }
     299          40 :     mbPageBreaksValid = !pUserArea;     // #i116881# the valid flag can only apply to the "no user area" case
     300             : }
     301             : 
     302           0 : void ScTable::RemoveManualBreaks()
     303             : {
     304           0 :     maRowManualBreaks.clear();
     305           0 :     maColManualBreaks.clear();
     306           0 :     InvalidatePageBreaks();
     307             : 
     308           0 :     if (IsStreamValid())
     309           0 :         SetStreamValid(false);
     310           0 : }
     311             : 
     312           0 : bool ScTable::HasManualBreaks() const
     313             : {
     314           0 :     return !maRowManualBreaks.empty() || !maColManualBreaks.empty();
     315             : }
     316             : 
     317         111 : void ScTable::SetRowManualBreaks( const ::std::set<SCROW>& rBreaks )
     318             : {
     319         111 :     maRowManualBreaks = rBreaks;
     320         111 :     InvalidatePageBreaks();
     321         111 :     if (IsStreamValid())
     322           0 :         SetStreamValid(false);
     323         111 : }
     324             : 
     325          92 : void ScTable::SetColManualBreaks( const ::std::set<SCCOL>& rBreaks )
     326             : {
     327          92 :     maColManualBreaks = rBreaks;
     328          92 :     InvalidatePageBreaks();
     329          92 :     if (IsStreamValid())
     330           0 :         SetStreamValid(false);
     331          92 : }
     332             : 
     333          14 : void ScTable::GetAllRowBreaks(set<SCROW>& rBreaks, bool bPage, bool bManual) const
     334             : {
     335          14 :     if (bPage)
     336           0 :         rBreaks = maRowPageBreaks;
     337             : 
     338          14 :     if (bManual)
     339             :     {
     340             :         using namespace std;
     341          14 :         copy(maRowManualBreaks.begin(), maRowManualBreaks.end(), inserter(rBreaks, rBreaks.begin()));
     342             :     }
     343          14 : }
     344             : 
     345          14 : void ScTable::GetAllColBreaks(set<SCCOL>& rBreaks, bool bPage, bool bManual) const
     346             : {
     347          14 :     if (bPage)
     348           0 :         rBreaks = maColPageBreaks;
     349             : 
     350          14 :     if (bManual)
     351             :     {
     352             :         using namespace std;
     353          14 :         copy(maColManualBreaks.begin(), maColManualBreaks.end(), inserter(rBreaks, rBreaks.begin()));
     354             :     }
     355          14 : }
     356             : 
     357       18580 : bool ScTable::HasRowPageBreak(SCROW nRow) const
     358             : {
     359       18580 :     if (!ValidRow(nRow))
     360           0 :         return false;
     361             : 
     362       18580 :     return maRowPageBreaks.find(nRow) != maRowPageBreaks.end();
     363             : }
     364             : 
     365       29827 : bool ScTable::HasColPageBreak(SCCOL nCol) const
     366             : {
     367       29827 :     if (!ValidCol(nCol))
     368           0 :         return false;
     369             : 
     370       29827 :     return maColPageBreaks.find(nCol) != maColPageBreaks.end();
     371             : }
     372             : 
     373       18602 : bool ScTable::HasRowManualBreak(SCROW nRow) const
     374             : {
     375       18602 :     if (!ValidRow(nRow))
     376           0 :         return false;
     377             : 
     378       18602 :     return maRowManualBreaks.find(nRow) != maRowManualBreaks.end();
     379             : }
     380             : 
     381       64731 : bool ScTable::HasColManualBreak(SCCOL nCol) const
     382             : {
     383       64731 :     if (!ValidCol(nCol))
     384           0 :         return false;
     385             : 
     386       64731 :     return maColManualBreaks.find(nCol) != maColManualBreaks.end();
     387             : }
     388             : 
     389          42 : SCROW ScTable::GetNextManualBreak(SCROW nRow) const
     390             : {
     391          42 :     set<SCROW>::const_iterator itr = maRowManualBreaks.lower_bound(nRow);
     392          42 :     return itr == maRowManualBreaks.end() ? -1 : *itr;
     393             : }
     394             : 
     395          86 : void ScTable::RemoveRowPageBreaks(SCROW nStartRow, SCROW nEndRow)
     396             : {
     397             :     using namespace std;
     398             : 
     399          86 :     if (!ValidRow(nStartRow) || !ValidRow(nEndRow))
     400         126 :         return;
     401             : 
     402          46 :     set<SCROW>::iterator low  = maRowPageBreaks.lower_bound(nStartRow);
     403          46 :     set<SCROW>::iterator high = maRowPageBreaks.upper_bound(nEndRow);
     404          46 :     maRowPageBreaks.erase(low, high);
     405             : }
     406             : 
     407           4 : void ScTable::RemoveRowBreak(SCROW nRow, bool bPage, bool bManual)
     408             : {
     409           4 :     if (!ValidRow(nRow))
     410           4 :         return;
     411             : 
     412           4 :     if (bPage)
     413           0 :         maRowPageBreaks.erase(nRow);
     414             : 
     415           4 :     if (bManual)
     416             :     {
     417           4 :         maRowManualBreaks.erase(nRow);
     418           4 :         InvalidatePageBreaks();
     419             :     }
     420             : }
     421             : 
     422       35860 : void ScTable::RemoveColBreak(SCCOL nCol, bool bPage, bool bManual)
     423             : {
     424       35860 :     if (!ValidCol(nCol))
     425       35860 :         return;
     426             : 
     427       35860 :     if (bPage)
     428       35859 :         maColPageBreaks.erase(nCol);
     429             : 
     430       35860 :     if (bManual)
     431             :     {
     432           1 :         maColManualBreaks.erase(nCol);
     433           1 :         InvalidatePageBreaks();
     434             :     }
     435             : }
     436             : 
     437      674953 : void ScTable::SetRowBreak(SCROW nRow, bool bPage, bool bManual)
     438             : {
     439      674953 :     if (!ValidRow(nRow))
     440      674953 :         return;
     441             : 
     442      674953 :     if (bPage)
     443      674952 :         maRowPageBreaks.insert(nRow);
     444             : 
     445      674953 :     if (bManual)
     446             :     {
     447           1 :         maRowManualBreaks.insert(nRow);
     448           1 :         InvalidatePageBreaks();
     449             :     }
     450             : }
     451             : 
     452        5062 : void ScTable::SetColBreak(SCCOL nCol, bool bPage, bool bManual)
     453             : {
     454        5062 :     if (!ValidCol(nCol))
     455        5062 :         return;
     456             : 
     457        5062 :     if (bPage)
     458        5061 :         maColPageBreaks.insert(nCol);
     459             : 
     460        5062 :     if (bManual)
     461             :     {
     462           1 :         maColManualBreaks.insert(nCol);
     463           1 :         InvalidatePageBreaks();
     464             :     }
     465             : }
     466             : 
     467           6 : Sequence<TablePageBreakData> ScTable::GetRowBreakData() const
     468             : {
     469             :     using ::std::copy;
     470             :     using ::std::inserter;
     471             : 
     472           6 :     set<SCROW> aRowBreaks = maRowPageBreaks;
     473           6 :     copy(maRowManualBreaks.begin(), maRowManualBreaks.end(), inserter(aRowBreaks, aRowBreaks.begin()));
     474             : 
     475           6 :     set<SCROW>::const_iterator itr = aRowBreaks.begin(), itrEnd = aRowBreaks.end();
     476           6 :     Sequence<TablePageBreakData> aSeq(aRowBreaks.size());
     477             : 
     478          28 :     for (sal_Int32 i = 0; itr != itrEnd; ++itr, ++i)
     479             :     {
     480          22 :         SCROW nRow = *itr;
     481          22 :         TablePageBreakData aData;
     482          22 :         aData.Position = nRow;
     483          22 :         aData.ManualBreak = HasRowManualBreak(nRow);
     484          22 :         aSeq[i] = aData;
     485             :     }
     486             : 
     487           6 :     return aSeq;
     488             : }
     489             : 
     490     8573726 : bool ScTable::RowHidden(SCROW nRow, SCROW* pFirstRow, SCROW* pLastRow) const
     491             : {
     492     8573726 :     if (!ValidRow(nRow))
     493             :     {
     494           1 :         if (pFirstRow)
     495           1 :             *pFirstRow = nRow;
     496           1 :         if (pLastRow)
     497           0 :             *pLastRow = nRow;
     498           1 :         return true;
     499             :     }
     500             : 
     501             :     ScFlatBoolRowSegments::RangeData aData;
     502     8573725 :     if (!mpHiddenRows->getRangeData(nRow, aData))
     503             :     {
     504             :         // search failed.
     505           0 :         if (pFirstRow)
     506           0 :             *pFirstRow = nRow;
     507           0 :         if (pLastRow)
     508           0 :             *pLastRow = nRow;
     509           0 :         return true;
     510             :     }
     511             : 
     512     8573725 :     if (pFirstRow)
     513     3145861 :         *pFirstRow = aData.mnRow1;
     514     8573725 :     if (pLastRow)
     515     7392529 :         *pLastRow = aData.mnRow2;
     516             : 
     517     8573725 :     return aData.mbValue;
     518             : }
     519             : 
     520         113 : bool ScTable::RowHiddenLeaf(SCROW nRow, SCROW* pFirstRow, SCROW* pLastRow) const
     521             : {
     522         113 :     if (!ValidRow(nRow))
     523             :     {
     524           0 :         if (pFirstRow)
     525           0 :             *pFirstRow = nRow;
     526           0 :         if (pLastRow)
     527           0 :             *pLastRow = nRow;
     528           0 :         return true;
     529             :     }
     530             : 
     531             :     ScFlatBoolRowSegments::RangeData aData;
     532         113 :     if (!mpHiddenRows->getRangeDataLeaf(nRow, aData))
     533             :     {
     534             :         // search failed.
     535           0 :         if (pFirstRow)
     536           0 :             *pFirstRow = nRow;
     537           0 :         if (pLastRow)
     538           0 :             *pLastRow = nRow;
     539           0 :         return true;
     540             :     }
     541             : 
     542         113 :     if (pFirstRow)
     543           0 :         *pFirstRow = aData.mnRow1;
     544         113 :     if (pLastRow)
     545         113 :         *pLastRow = aData.mnRow2;
     546             : 
     547         113 :     return aData.mbValue;
     548             : }
     549             : 
     550           0 : bool ScTable::HasHiddenRows(SCROW nStartRow, SCROW nEndRow) const
     551             : {
     552           0 :     SCROW nRow = nStartRow;
     553           0 :     while (nRow <= nEndRow)
     554             :     {
     555           0 :         SCROW nLastRow = -1;
     556           0 :         bool bHidden = RowHidden(nRow, NULL, &nLastRow);
     557           0 :         if (bHidden)
     558           0 :             return true;
     559             : 
     560           0 :         nRow = nLastRow + 1;
     561             :     }
     562           0 :     return false;
     563             : }
     564             : 
     565     1846646 : bool ScTable::ColHidden(SCCOL nCol, SCCOL* pFirstCol, SCCOL* pLastCol) const
     566             : {
     567     1846646 :     if (!ValidCol(nCol))
     568           0 :         return true;
     569             : 
     570             :     ScFlatBoolColSegments::RangeData aData;
     571     1846646 :     if (!mpHiddenCols->getRangeData(nCol, aData))
     572           0 :         return true;
     573             : 
     574     1846646 :     if (pFirstCol)
     575          10 :         *pFirstCol = aData.mnCol1;
     576     1846646 :     if (pLastCol)
     577       23751 :         *pLastCol = aData.mnCol2;
     578             : 
     579     1846646 :     return aData.mbValue;
     580             : }
     581             : 
     582         384 : bool ScTable::SetRowHidden(SCROW nStartRow, SCROW nEndRow, bool bHidden)
     583             : {
     584         384 :     bool bChanged = false;
     585         384 :     if (bHidden)
     586         146 :         bChanged = mpHiddenRows->setTrue(nStartRow, nEndRow);
     587             :     else
     588         238 :         bChanged = mpHiddenRows->setFalse(nStartRow, nEndRow);
     589             : 
     590         384 :     if (bChanged)
     591             :     {
     592         131 :         if (IsStreamValid())
     593           0 :             SetStreamValid(false);
     594             :     }
     595             : 
     596         384 :     return bChanged;
     597             : }
     598             : 
     599       38518 : bool ScTable::SetColHidden(SCCOL nStartCol, SCCOL nEndCol, bool bHidden)
     600             : {
     601       38518 :     bool bChanged = false;
     602       38518 :     if (bHidden)
     603         327 :         bChanged = mpHiddenCols->setTrue(nStartCol, nEndCol);
     604             :     else
     605       38191 :         bChanged = mpHiddenCols->setFalse(nStartCol, nEndCol);
     606             : 
     607       38518 :     if (bChanged)
     608             :     {
     609         417 :         if (IsStreamValid())
     610           1 :             SetStreamValid(false);
     611             :     }
     612             : 
     613       38518 :     return bChanged;
     614             : }
     615             : 
     616          19 : void ScTable::CopyColHidden(ScTable& rTable, SCCOL nStartCol, SCCOL nEndCol)
     617             : {
     618          19 :     SCCOL nCol = nStartCol;
     619          57 :     while (nCol <= nEndCol)
     620             :     {
     621             :         SCCOL nLastCol;
     622          19 :         bool bHidden = rTable.ColHidden(nCol, NULL, &nLastCol);
     623          19 :         if (nLastCol > nEndCol)
     624          19 :             nLastCol = nEndCol;
     625             : 
     626          19 :         SetColHidden(nCol, nLastCol, bHidden);
     627          19 :         nCol = nLastCol + 1;
     628             :     }
     629          19 : }
     630             : 
     631          19 : void ScTable::CopyRowHidden(ScTable& rTable, SCROW nStartRow, SCROW nEndRow)
     632             : {
     633          19 :     SCROW nRow = nStartRow;
     634          57 :     while (nRow <= nEndRow)
     635             :     {
     636          19 :         SCROW nLastRow = -1;
     637          19 :         bool bHidden = rTable.RowHidden(nRow, NULL, &nLastRow);
     638          19 :         if (nLastRow > nEndRow)
     639          19 :             nLastRow = nEndRow;
     640          19 :         SetRowHidden(nRow, nLastRow, bHidden);
     641          19 :         nRow = nLastRow + 1;
     642             :     }
     643          19 : }
     644             : 
     645         130 : void ScTable::CopyRowHeight(ScTable& rSrcTable, SCROW nStartRow, SCROW nEndRow, SCROW nSrcOffset)
     646             : {
     647         130 :     SCROW nRow = nStartRow;
     648             :     ScFlatUInt16RowSegments::RangeData aSrcData;
     649         539 :     while (nRow <= nEndRow)
     650             :     {
     651         279 :         if (!rSrcTable.mpRowHeights->getRangeData(nRow + nSrcOffset, aSrcData))
     652             :             // Something is wrong !
     653           0 :             return;
     654             : 
     655         279 :         SCROW nLastRow = aSrcData.mnRow2 - nSrcOffset;
     656         279 :         if (nLastRow > nEndRow)
     657          69 :             nLastRow = nEndRow;
     658             : 
     659         279 :         mpRowHeights->setValue(nRow, nLastRow, aSrcData.mnValue);
     660         279 :         nRow = nLastRow + 1;
     661             :     }
     662             : }
     663             : 
     664         176 : SCROW ScTable::FirstVisibleRow(SCROW nStartRow, SCROW nEndRow) const
     665             : {
     666         176 :     SCROW nRow = nStartRow;
     667             :     ScFlatBoolRowSegments::RangeData aData;
     668         470 :     while (nRow <= nEndRow)
     669             :     {
     670         294 :         if (!ValidRow(nRow))
     671           0 :             break;
     672             : 
     673         294 :         if (!mpHiddenRows->getRangeData(nRow, aData))
     674             :             // failed to get range data.
     675           0 :             break;
     676             : 
     677         294 :         if (!aData.mbValue)
     678             :             // visible row found
     679         176 :             return nRow;
     680             : 
     681         118 :         nRow = aData.mnRow2 + 1;
     682             :     }
     683             : 
     684           0 :     return ::std::numeric_limits<SCROW>::max();
     685             : }
     686             : 
     687           0 : SCROW ScTable::LastVisibleRow(SCROW nStartRow, SCROW nEndRow) const
     688             : {
     689           0 :     SCROW nRow = nEndRow;
     690             :     ScFlatBoolRowSegments::RangeData aData;
     691           0 :     while (nRow >= nStartRow)
     692             :     {
     693           0 :         if (!ValidRow(nRow))
     694           0 :             break;
     695             : 
     696           0 :         if (!mpHiddenRows->getRangeData(nRow, aData))
     697             :             // failed to get range data.
     698           0 :             break;
     699             : 
     700           0 :         if (!aData.mbValue)
     701             :             // visible row found
     702           0 :             return nRow;
     703             : 
     704           0 :         nRow = aData.mnRow1 - 1;
     705             :     }
     706             : 
     707           0 :     return ::std::numeric_limits<SCROW>::max();
     708             : }
     709             : 
     710          40 : SCROW ScTable::CountVisibleRows(SCROW nStartRow, SCROW nEndRow) const
     711             : {
     712          40 :     SCROW nCount = 0;
     713          40 :     SCROW nRow = nStartRow;
     714             :     ScFlatBoolRowSegments::RangeData aData;
     715         120 :     while (nRow <= nEndRow)
     716             :     {
     717          40 :         if (!mpHiddenRows->getRangeData(nRow, aData))
     718           0 :             break;
     719             : 
     720          40 :         if (aData.mnRow2 > nEndRow)
     721          40 :             aData.mnRow2 = nEndRow;
     722             : 
     723          40 :         if (!aData.mbValue)
     724          40 :             nCount += aData.mnRow2 - nRow + 1;
     725             : 
     726          40 :         nRow = aData.mnRow2 + 1;
     727             :     }
     728          40 :     return nCount;
     729             : }
     730             : 
     731        1588 : sal_uInt32 ScTable::GetTotalRowHeight(SCROW nStartRow, SCROW nEndRow, bool bHiddenAsZero ) const
     732             : {
     733        1588 :     sal_uInt32 nHeight = 0;
     734        1588 :     SCROW nRow = nStartRow;
     735             :     ScFlatBoolRowSegments::RangeData aData;
     736        4966 :     while (nRow <= nEndRow)
     737             :     {
     738        1790 :         if (!mpHiddenRows->getRangeData(nRow, aData))
     739           0 :             break;
     740             : 
     741        1790 :         if (aData.mnRow2 > nEndRow)
     742         890 :             aData.mnRow2 = nEndRow;
     743             : 
     744        1790 :         if ( !( bHiddenAsZero && aData.mbValue ) )
     745             :             // visible row range.
     746        1667 :             nHeight += mpRowHeights->getSumValue(nRow, aData.mnRow2);
     747             : 
     748        1790 :         nRow = aData.mnRow2 + 1;
     749             :     }
     750             : 
     751        1588 :     return nHeight;
     752             : }
     753             : 
     754           0 : SCCOLROW ScTable::LastHiddenColRow(SCCOLROW nPos, bool bCol) const
     755             : {
     756           0 :     if (bCol)
     757             :     {
     758           0 :         SCCOL nCol = static_cast<SCCOL>(nPos);
     759           0 :         if (ColHidden(nCol))
     760             :         {
     761           0 :             for (SCCOL i = nCol+1; i <= MAXCOL; ++i)
     762             :             {
     763           0 :                 if (!ColHidden(nCol))
     764           0 :                     return nCol - 1;
     765             :             }
     766             :         }
     767             :     }
     768             :     else
     769             :     {
     770           0 :         SCROW nRow = static_cast<SCROW>(nPos);
     771             :         SCROW nLastRow;
     772           0 :         if (RowHidden(nRow, NULL, &nLastRow))
     773           0 :             return static_cast<SCCOLROW>(nLastRow);
     774             :     }
     775           0 :     return ::std::numeric_limits<SCCOLROW>::max();
     776             : }
     777             : 
     778     3148231 : bool ScTable::RowFiltered(SCROW nRow, SCROW* pFirstRow, SCROW* pLastRow) const
     779             : {
     780     3148231 :     if (!ValidRow(nRow))
     781           0 :         return false;
     782             : 
     783             :     ScFlatBoolRowSegments::RangeData aData;
     784     3148231 :     if (!mpFilteredRows->getRangeData(nRow, aData))
     785             :         // search failed.
     786           0 :         return false;
     787             : 
     788     3148231 :     if (pFirstRow)
     789     3145745 :         *pFirstRow = aData.mnRow1;
     790     3148231 :     if (pLastRow)
     791     3148195 :         *pLastRow = aData.mnRow2;
     792             : 
     793     3148231 :     return aData.mbValue;
     794             : }
     795             : 
     796          33 : bool ScTable::ColFiltered(SCCOL nCol, SCCOL* pFirstCol, SCCOL* pLastCol) const
     797             : {
     798          33 :     if (!ValidCol(nCol))
     799           0 :         return false;
     800             : 
     801             :     ScFlatBoolColSegments::RangeData aData;
     802          33 :     if (!mpFilteredCols->getRangeData(nCol, aData))
     803             :         // search failed.
     804           0 :         return false;
     805             : 
     806          33 :     if (pFirstCol)
     807           0 :         *pFirstCol = aData.mnCol1;
     808          33 :     if (pLastCol)
     809          19 :         *pLastCol = aData.mnCol2;
     810             : 
     811          33 :     return aData.mbValue;
     812             : }
     813             : 
     814         912 : bool ScTable::HasFilteredRows(SCROW nStartRow, SCROW nEndRow) const
     815             : {
     816         912 :     SCROW nRow = nStartRow;
     817        2736 :     while (nRow <= nEndRow)
     818             :     {
     819         912 :         SCROW nLastRow = nRow;
     820         912 :         bool bFiltered = RowFiltered(nRow, NULL, &nLastRow);
     821         912 :         if (bFiltered)
     822           0 :             return true;
     823             : 
     824         912 :         nRow = nLastRow + 1;
     825             :     }
     826         912 :     return false;
     827             : }
     828             : 
     829          19 : void ScTable::CopyColFiltered(ScTable& rTable, SCCOL nStartCol, SCCOL nEndCol)
     830             : {
     831          19 :     SCCOL nCol = nStartCol;
     832          57 :     while (nCol <= nEndCol)
     833             :     {
     834             :         SCCOL nLastCol;
     835          19 :         bool bFiltered = rTable.ColFiltered(nCol, NULL, &nLastCol);
     836          19 :         if (nLastCol > nEndCol)
     837          19 :             nLastCol = nEndCol;
     838             : 
     839          19 :         SetColFiltered(nCol, nLastCol, bFiltered);
     840          19 :         nCol = nLastCol + 1;
     841             :     }
     842          19 : }
     843             : 
     844          19 : void ScTable::CopyRowFiltered(ScTable& rTable, SCROW nStartRow, SCROW nEndRow)
     845             : {
     846          19 :     SCROW nRow = nStartRow;
     847          57 :     while (nRow <= nEndRow)
     848             :     {
     849          19 :         SCROW nLastRow = -1;
     850          19 :         bool bFiltered = rTable.RowFiltered(nRow, NULL, &nLastRow);
     851          19 :         if (nLastRow > nEndRow)
     852          19 :             nLastRow = nEndRow;
     853          19 :         SetRowFiltered(nRow, nLastRow, bFiltered);
     854          19 :         nRow = nLastRow + 1;
     855             :     }
     856          19 : }
     857             : 
     858         330 : void ScTable::SetRowFiltered(SCROW nStartRow, SCROW nEndRow, bool bFiltered)
     859             : {
     860         330 :     if (bFiltered)
     861          89 :         mpFilteredRows->setTrue(nStartRow, nEndRow);
     862             :     else
     863         241 :         mpFilteredRows->setFalse(nStartRow, nEndRow);
     864         330 : }
     865             : 
     866          19 : void ScTable::SetColFiltered(SCCOL nStartCol, SCCOL nEndCol, bool bFiltered)
     867             : {
     868          19 :     if (bFiltered)
     869           0 :         mpFilteredCols->setTrue(nStartCol, nEndCol);
     870             :     else
     871          19 :         mpFilteredCols->setFalse(nStartCol, nEndCol);
     872          19 : }
     873             : 
     874          34 : SCROW ScTable::FirstNonFilteredRow(SCROW nStartRow, SCROW nEndRow) const
     875             : {
     876          34 :     SCROW nRow = nStartRow;
     877             :     ScFlatBoolRowSegments::RangeData aData;
     878          68 :     while (nRow <= nEndRow)
     879             :     {
     880          34 :         if (!ValidRow(nRow))
     881           0 :             break;
     882             : 
     883          34 :         if (!mpFilteredRows->getRangeData(nRow, aData))
     884             :             // failed to get range data.
     885           0 :             break;
     886             : 
     887          34 :         if (!aData.mbValue)
     888             :             // non-filtered row found
     889          34 :             return nRow;
     890             : 
     891           0 :         nRow = aData.mnRow2 + 1;
     892             :     }
     893             : 
     894           0 :     return ::std::numeric_limits<SCROW>::max();
     895             : }
     896             : 
     897           0 : SCROW ScTable::LastNonFilteredRow(SCROW nStartRow, SCROW nEndRow) const
     898             : {
     899           0 :     SCROW nRow = nEndRow;
     900             :     ScFlatBoolRowSegments::RangeData aData;
     901           0 :     while (nRow >= nStartRow)
     902             :     {
     903           0 :         if (!ValidRow(nRow))
     904           0 :             break;
     905             : 
     906           0 :         if (!mpFilteredRows->getRangeData(nRow, aData))
     907             :             // failed to get range data.
     908           0 :             break;
     909             : 
     910           0 :         if (!aData.mbValue)
     911             :             // non-filtered row found
     912           0 :             return nRow;
     913             : 
     914           0 :         nRow = aData.mnRow1 - 1;
     915             :     }
     916             : 
     917           0 :     return ::std::numeric_limits<SCROW>::max();
     918             : }
     919             : 
     920          64 : SCROW ScTable::CountNonFilteredRows(SCROW nStartRow, SCROW nEndRow) const
     921             : {
     922          64 :     SCROW nCount = 0;
     923          64 :     SCROW nRow = nStartRow;
     924             :     ScFlatBoolRowSegments::RangeData aData;
     925         192 :     while (nRow <= nEndRow)
     926             :     {
     927          64 :         if (!mpFilteredRows->getRangeData(nRow, aData))
     928           0 :             break;
     929             : 
     930          64 :         if (aData.mnRow2 > nEndRow)
     931          64 :             aData.mnRow2 = nEndRow;
     932             : 
     933          64 :         if (!aData.mbValue)
     934          64 :             nCount += aData.mnRow2 - nRow + 1;
     935             : 
     936          64 :         nRow = aData.mnRow2 + 1;
     937             :     }
     938          64 :     return nCount;
     939             : }
     940             : 
     941           7 : bool ScTable::IsManualRowHeight(SCROW nRow) const
     942             : {
     943           7 :     return (pRowFlags->GetValue(nRow) & CR_MANUALSIZE) != 0;
     944             : }
     945             : 
     946             : namespace {
     947             : 
     948          22 : void lcl_syncFlags(ScFlatBoolColSegments& rColSegments, ScFlatBoolRowSegments& rRowSegments,
     949             :     sal_uInt8* pColFlags, ScBitMaskCompressedArray< SCROW, sal_uInt8>* pRowFlags, const sal_uInt8 nFlagMask)
     950             : {
     951             :     using ::sal::static_int_cast;
     952             : 
     953          22 :     sal_uInt8 nFlagMaskComplement = static_int_cast<sal_uInt8>(~nFlagMask);
     954             : 
     955          22 :     pRowFlags->AndValue(0, MAXROW, nFlagMaskComplement);
     956       22550 :     for (SCCOL i = 0; i <= MAXCOL; ++i)
     957       22528 :         pColFlags[i] &= nFlagMaskComplement;
     958             : 
     959             :     {
     960             :         // row hidden flags.
     961             : 
     962          22 :         SCROW nRow = 0;
     963             :         ScFlatBoolRowSegments::RangeData aData;
     964          66 :         while (nRow <= MAXROW)
     965             :         {
     966          22 :             if (!rRowSegments.getRangeData(nRow, aData))
     967           0 :                 break;
     968             : 
     969          22 :             if (aData.mbValue)
     970           0 :                 pRowFlags->OrValue(nRow, aData.mnRow2, nFlagMask);
     971             : 
     972          22 :             nRow = aData.mnRow2 + 1;
     973             :         }
     974             :     }
     975             : 
     976             :     {
     977             :         // column hidden flags.
     978             : 
     979          22 :         SCCOL nCol = 0;
     980             :         ScFlatBoolColSegments::RangeData aData;
     981          66 :         while (nCol <= MAXCOL)
     982             :         {
     983          22 :             if (!rColSegments.getRangeData(nCol, aData))
     984           0 :                 break;
     985             : 
     986          22 :             if (aData.mbValue)
     987             :             {
     988           0 :                 for (SCCOL i = nCol; i <= aData.mnCol2; ++i)
     989           0 :                     pColFlags[i] |= nFlagMask;
     990             :             }
     991             : 
     992          22 :             nCol = aData.mnCol2 + 1;
     993             :         }
     994             :     }
     995          22 : }
     996             : 
     997             : }
     998             : 
     999          11 : void ScTable::SyncColRowFlags()
    1000             : {
    1001             :     using ::sal::static_int_cast;
    1002             : 
    1003          11 :     sal_uInt8 nManualBreakComplement = static_int_cast<sal_uInt8>(~CR_MANUALBREAK);
    1004             : 
    1005             :     // Manual breaks.
    1006          11 :     pRowFlags->AndValue(0, MAXROW, nManualBreakComplement);
    1007       11275 :     for (SCCOL i = 0; i <= MAXCOL; ++i)
    1008       11264 :         pColFlags[i] &= nManualBreakComplement;
    1009             : 
    1010          11 :     if (!maRowManualBreaks.empty())
    1011             :     {
    1012           0 :         for (set<SCROW>::const_iterator itr = maRowManualBreaks.begin(), itrEnd = maRowManualBreaks.end();
    1013             :               itr != itrEnd; ++itr)
    1014           0 :             pRowFlags->OrValue(*itr, CR_MANUALBREAK);
    1015             :     }
    1016             : 
    1017          11 :     if (!maColManualBreaks.empty())
    1018             :     {
    1019           0 :         for (set<SCCOL>::const_iterator itr = maColManualBreaks.begin(), itrEnd = maColManualBreaks.end();
    1020             :               itr != itrEnd; ++itr)
    1021           0 :             pColFlags[*itr] |= CR_MANUALBREAK;
    1022             :     }
    1023             : 
    1024             :     // Hidden flags.
    1025          11 :     lcl_syncFlags(*mpHiddenCols, *mpHiddenRows, pColFlags, pRowFlags, CR_HIDDEN);
    1026          11 :     lcl_syncFlags(*mpFilteredCols, *mpFilteredRows, pColFlags, pRowFlags, CR_FILTERED);
    1027          11 : }
    1028             : 
    1029         248 : void ScTable::SetPageSize( const Size& rSize )
    1030             : {
    1031         248 :     if ( rSize.Width() != 0 && rSize.Height() != 0 )
    1032             :     {
    1033         248 :         if (aPageSizeTwips != rSize)
    1034          91 :             InvalidatePageBreaks();
    1035             : 
    1036         248 :         bPageSizeValid = true;
    1037         248 :         aPageSizeTwips = rSize;
    1038             :     }
    1039             :     else
    1040           0 :         bPageSizeValid = false;
    1041         248 : }
    1042             : 
    1043       29803 : bool ScTable::IsProtected() const
    1044             : {
    1045       29803 :     return pTabProtection.get() && pTabProtection->isProtected();
    1046             : }
    1047             : 
    1048          11 : void ScTable::SetProtection(const ScTableProtection* pProtect)
    1049             : {
    1050          11 :     if (pProtect)
    1051          11 :         pTabProtection.reset(new ScTableProtection(*pProtect));
    1052             :     else
    1053           0 :         pTabProtection.reset(NULL);
    1054             : 
    1055          11 :     if (IsStreamValid())
    1056           0 :         SetStreamValid(false);
    1057          11 : }
    1058             : 
    1059          46 : ScTableProtection* ScTable::GetProtection()
    1060             : {
    1061          46 :     return pTabProtection.get();
    1062             : }
    1063             : 
    1064        1362 : Size ScTable::GetPageSize() const
    1065             : {
    1066        1362 :     if ( bPageSizeValid )
    1067          88 :         return aPageSizeTwips;
    1068             :     else
    1069        1274 :         return Size();  // leer
    1070             : }
    1071             : 
    1072         202 : void ScTable::SetRepeatArea( SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCROW nEndRow )
    1073             : {
    1074             :     // #i117952# page break calculation uses these values (set from ScPrintFunc), not pRepeatColRange/pRepeatRowRange
    1075         202 :     if ( nStartCol != nRepeatStartX || nEndCol != nRepeatEndX || nStartRow != nRepeatStartY || nEndRow != nRepeatEndY )
    1076          12 :         InvalidatePageBreaks();
    1077             : 
    1078         202 :     nRepeatStartX = nStartCol;
    1079         202 :     nRepeatEndX   = nEndCol;
    1080         202 :     nRepeatStartY = nStartRow;
    1081         202 :     nRepeatEndY   = nEndRow;
    1082         202 : }
    1083             : 
    1084        5650 : void ScTable::StartListening( const ScAddress& rAddress, SvtListener* pListener )
    1085             : {
    1086        5650 :     if (!ValidCol(rAddress.Col()))
    1087        5650 :         return;
    1088             : 
    1089        5650 :     aCol[rAddress.Col()].StartListening( *pListener, rAddress.Row() );
    1090             : }
    1091             : 
    1092         276 : void ScTable::EndListening( const ScAddress& rAddress, SvtListener* pListener )
    1093             : {
    1094         276 :     if (!ValidCol(rAddress.Col()))
    1095         276 :         return;
    1096             : 
    1097         276 :     aCol[rAddress.Col()].EndListening( *pListener, rAddress.Row() );
    1098             : }
    1099             : 
    1100          12 : void ScTable::StartListening( sc::StartListeningContext& rCxt, SCCOL nCol, SCROW nRow, SvtListener& rListener )
    1101             : {
    1102          12 :     if (!ValidCol(nCol))
    1103          12 :         return;
    1104             : 
    1105          12 :     aCol[nCol].StartListening(rCxt, nRow, rListener);
    1106             : }
    1107             : 
    1108          38 : void ScTable::EndListening( sc::EndListeningContext& rCxt, SCCOL nCol, SCROW nRow, SvtListener& rListener )
    1109             : {
    1110          38 :     if (!ValidCol(nCol))
    1111          38 :         return;
    1112             : 
    1113          38 :     aCol[nCol].EndListening(rCxt, nRow, rListener);
    1114             : }
    1115             : 
    1116         211 : void ScTable::SetPageStyle( const OUString& rName )
    1117             : {
    1118         211 :     if ( aPageStyle != rName )
    1119             :     {
    1120         207 :         OUString           aStrNew    = rName;
    1121         207 :         SfxStyleSheetBasePool*  pStylePool = pDocument->GetStyleSheetPool();
    1122         207 :         SfxStyleSheetBase*      pNewStyle  = pStylePool->Find( aStrNew, SFX_STYLE_FAMILY_PAGE );
    1123             : 
    1124         207 :         if ( !pNewStyle )
    1125             :         {
    1126           0 :             aStrNew = ScGlobal::GetRscString(STR_STYLENAME_STANDARD);
    1127           0 :             pNewStyle = pStylePool->Find( aStrNew, SFX_STYLE_FAMILY_PAGE );
    1128             :         }
    1129             : 
    1130         207 :         if ( aPageStyle != aStrNew )
    1131             :         {
    1132         207 :             SfxStyleSheetBase* pOldStyle = pStylePool->Find( aPageStyle, SFX_STYLE_FAMILY_PAGE );
    1133             : 
    1134         207 :             if ( pOldStyle && pNewStyle )
    1135             :             {
    1136         207 :                 SfxItemSet&  rOldSet          = pOldStyle->GetItemSet();
    1137         207 :                 SfxItemSet&  rNewSet          = pNewStyle->GetItemSet();
    1138         207 :                 const sal_uInt16 nOldScale        = GET_SCALEVALUE(rOldSet,ATTR_PAGE_SCALE);
    1139         207 :                 const sal_uInt16 nOldScaleToPages = GET_SCALEVALUE(rOldSet,ATTR_PAGE_SCALETOPAGES);
    1140         207 :                 const sal_uInt16 nNewScale        = GET_SCALEVALUE(rNewSet,ATTR_PAGE_SCALE);
    1141         207 :                 const sal_uInt16 nNewScaleToPages = GET_SCALEVALUE(rNewSet,ATTR_PAGE_SCALETOPAGES);
    1142             : 
    1143         207 :                 if ( (nOldScale != nNewScale) || (nOldScaleToPages != nNewScaleToPages) )
    1144           0 :                     InvalidateTextWidth(NULL, NULL, false, false);
    1145             :             }
    1146             : 
    1147         207 :             if ( pNewStyle )            // auch ohne den alten (fuer UpdateStdNames)
    1148         207 :                 aPageStyle = aStrNew;
    1149             : 
    1150         207 :             if (IsStreamValid())
    1151           0 :                 SetStreamValid(false);
    1152         207 :         }
    1153             :     }
    1154         211 : }
    1155             : 
    1156          75 : void ScTable::PageStyleModified( const String& rNewName )
    1157             : {
    1158          75 :     aPageStyle = rNewName;
    1159          75 :     InvalidateTextWidth(NULL, NULL, false, false);      // don't know what was in the style before
    1160          75 : }
    1161             : 
    1162        5740 : void ScTable::InvalidateTextWidth( const ScAddress* pAdrFrom, const ScAddress* pAdrTo,
    1163             :                                    bool bNumFormatChanged, bool bBroadcast )
    1164             : {
    1165        5740 :     if ( pAdrFrom && !pAdrTo )
    1166             :     {
    1167             :         // Special case: only process the "from" cell.
    1168           0 :         SCCOL nCol = pAdrFrom->Col();
    1169           0 :         SCROW nRow = pAdrFrom->Row();
    1170           0 :         ScColumn& rCol = aCol[nCol];
    1171           0 :         ScRefCellValue aCell = rCol.GetCellValue(nRow);
    1172           0 :         if (aCell.isEmpty())
    1173           0 :             return;
    1174             : 
    1175           0 :         rCol.SetTextWidth(nRow, TEXTWIDTH_DIRTY);
    1176             : 
    1177           0 :         if ( bNumFormatChanged )
    1178           0 :             rCol.SetScriptType(nRow, SC_SCRIPTTYPE_UNKNOWN);
    1179             : 
    1180           0 :         if ( bBroadcast )
    1181             :         {   // nur bei CalcAsShown
    1182           0 :             switch (aCell.meType)
    1183             :             {
    1184             :                 case CELLTYPE_VALUE :
    1185           0 :                     pDocument->Broadcast(ScHint(SC_HINT_DATACHANGED, ScAddress(nCol, nRow, nTab)));
    1186           0 :                     break;
    1187             :                 case CELLTYPE_FORMULA :
    1188           0 :                     aCell.mpFormula->SetDirty();
    1189           0 :                     break;
    1190             :                 default:
    1191             :                 {
    1192             :                     // added to avoid warnings
    1193             :                 }
    1194             :             }
    1195             :         }
    1196             : 
    1197           0 :         return;
    1198             :     }
    1199             : 
    1200        5740 :     const SCCOL nCol1 = pAdrFrom ? pAdrFrom->Col() : 0;
    1201        5740 :     const SCROW nRow1 = pAdrFrom ? pAdrFrom->Row() : 0;
    1202        5740 :     const SCCOL nCol2 = pAdrTo   ? pAdrTo->Col()   : MAXCOL;
    1203        5740 :     const SCROW nRow2 = pAdrTo   ? pAdrTo->Row()   : MAXROW;
    1204             : 
    1205      127079 :     for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol)
    1206             :     {
    1207      121339 :         ScColumnTextWidthIterator aIter(aCol[nCol], nRow1, nRow2);
    1208             : 
    1209      123374 :         for (; aIter.hasCell(); aIter.next())
    1210             :         {
    1211        2035 :             SCROW nRow = aIter.getPos();
    1212        2035 :             aIter.setValue(TEXTWIDTH_DIRTY);
    1213        2035 :             ScRefCellValue aCell = aCol[nCol].GetCellValue(nRow);
    1214        2035 :             if (aCell.isEmpty())
    1215           0 :                 continue;
    1216             : 
    1217        2035 :             if ( bNumFormatChanged )
    1218         285 :                 aCol[nCol].SetScriptType(nRow, SC_SCRIPTTYPE_UNKNOWN);
    1219             : 
    1220        2035 :             if ( bBroadcast )
    1221             :             {   // nur bei CalcAsShown
    1222           0 :                 switch (aCell.meType)
    1223             :                 {
    1224             :                     case CELLTYPE_VALUE :
    1225             :                         pDocument->Broadcast(
    1226           0 :                             ScHint(SC_HINT_DATACHANGED, ScAddress(nCol, nRow, nTab)));
    1227           0 :                         break;
    1228             :                     case CELLTYPE_FORMULA :
    1229           0 :                         aCell.mpFormula->SetDirty();
    1230           0 :                         break;
    1231             :                     default:
    1232             :                     {
    1233             :                         // added to avoid warnings
    1234             :                     }
    1235             :                 }
    1236             :             }
    1237        2035 :         }
    1238      121339 :     }
    1239          93 : }
    1240             : 
    1241             : 
    1242             : 
    1243             : 
    1244             : 
    1245             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10