LCOV - code coverage report
Current view: top level - sc/source/core/data - markdata.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 236 298 79.2 %
Date: 2014-11-03 Functions: 33 40 82.5 %
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 "markdata.hxx"
      21             : #include "markarr.hxx"
      22             : #include "rangelst.hxx"
      23             : #include <columnspanset.hxx>
      24             : #include <fstalgorithm.hxx>
      25             : 
      26             : #include <mdds/flat_segment_tree.hpp>
      27             : 
      28             : // STATIC DATA -----------------------------------------------------------
      29             : 
      30       18658 : ScMarkData::ScMarkData() :
      31             :     maTabMarked(),
      32       18658 :     pMultiSel( NULL )
      33             : {
      34       18658 :     ResetMark();
      35       18658 : }
      36             : 
      37     4975509 : ScMarkData::ScMarkData(const ScMarkData& rData) :
      38             :     maTabMarked( rData.maTabMarked ),
      39             :     aMarkRange( rData.aMarkRange ),
      40             :     aMultiRange( rData.aMultiRange ),
      41     4975509 :     pMultiSel( NULL )
      42             : {
      43     4975509 :     bMarked      = rData.bMarked;
      44     4975509 :     bMultiMarked = rData.bMultiMarked;
      45     4975509 :     bMarking     = rData.bMarking;
      46     4975509 :     bMarkIsNeg   = rData.bMarkIsNeg;
      47             : 
      48     4975509 :     if (rData.pMultiSel)
      49             :     {
      50         462 :         pMultiSel = new ScMarkArray[MAXCOLCOUNT];
      51      473550 :         for (SCCOL j=0; j<MAXCOLCOUNT; j++)
      52      473088 :             rData.pMultiSel[j].CopyMarksTo( pMultiSel[j] );
      53             :     }
      54     4975509 : }
      55             : 
      56         294 : ScMarkData& ScMarkData::operator=(const ScMarkData& rData)
      57             : {
      58         294 :     if ( &rData == this )
      59           0 :         return *this;
      60             : 
      61         294 :     delete[] pMultiSel;
      62         294 :     pMultiSel = NULL;
      63             : 
      64         294 :     aMarkRange   = rData.aMarkRange;
      65         294 :     aMultiRange  = rData.aMultiRange;
      66         294 :     bMarked      = rData.bMarked;
      67         294 :     bMultiMarked = rData.bMultiMarked;
      68         294 :     bMarking     = rData.bMarking;
      69         294 :     bMarkIsNeg   = rData.bMarkIsNeg;
      70             : 
      71         294 :     maTabMarked = rData.maTabMarked;
      72             : 
      73         294 :     if (rData.pMultiSel)
      74             :     {
      75           2 :         pMultiSel = new ScMarkArray[MAXCOLCOUNT];
      76        2050 :         for (SCCOL j=0; j<MAXCOLCOUNT; j++)
      77        2048 :             rData.pMultiSel[j].CopyMarksTo( pMultiSel[j] );
      78             :     }
      79             : 
      80         294 :     return *this;
      81             : }
      82             : 
      83     9988234 : ScMarkData::~ScMarkData()
      84             : {
      85     4994117 :     delete[] pMultiSel;
      86     4994117 : }
      87             : 
      88       18846 : void ScMarkData::ResetMark()
      89             : {
      90       18846 :     delete[] pMultiSel;
      91       18846 :     pMultiSel = NULL;
      92             : 
      93       18846 :     bMarked = bMultiMarked = false;
      94       18846 :     bMarking = bMarkIsNeg = false;
      95       18846 : }
      96             : 
      97       21558 : void ScMarkData::SetMarkArea( const ScRange& rRange )
      98             : {
      99       21558 :     aMarkRange = rRange;
     100       21558 :     aMarkRange.Justify();
     101       21558 :     if ( !bMarked )
     102             :     {
     103             :         // Upon creation of a document ScFormatShell GetTextAttrState
     104             :         // may query (default) attributes although no sheet is marked yet.
     105             :         // => mark that one.
     106       21510 :         if ( !GetSelectCount() )
     107       12462 :             maTabMarked.insert( aMarkRange.aStart.Tab() );
     108       21510 :         bMarked = true;
     109             :     }
     110       21558 : }
     111             : 
     112       35959 : void ScMarkData::GetMarkArea( ScRange& rRange ) const
     113             : {
     114       35959 :     rRange = aMarkRange;        //! inline ?
     115       35959 : }
     116             : 
     117        1704 : void ScMarkData::GetMultiMarkArea( ScRange& rRange ) const
     118             : {
     119        1704 :     rRange = aMultiRange;
     120        1704 : }
     121             : 
     122        6624 : void ScMarkData::SetMultiMarkArea( const ScRange& rRange, bool bMark )
     123             : {
     124        6624 :     if (!pMultiSel)
     125             :     {
     126        1392 :         pMultiSel = new ScMarkArray[MAXCOL+1];
     127             : 
     128             :         // if simple mark range is set, copy to multi marks
     129        1392 :         if ( bMarked && !bMarkIsNeg )
     130             :         {
     131         746 :             bMarked = false;
     132         746 :             SetMultiMarkArea( aMarkRange, true );
     133             :         }
     134             :     }
     135             : 
     136        6624 :     SCCOL nStartCol = rRange.aStart.Col();
     137        6624 :     SCROW nStartRow = rRange.aStart.Row();
     138        6624 :     SCCOL nEndCol = rRange.aEnd.Col();
     139        6624 :     SCROW nEndRow = rRange.aEnd.Row();
     140        6624 :     PutInOrder( nStartRow, nEndRow );
     141        6624 :     PutInOrder( nStartCol, nEndCol );
     142             : 
     143             :     SCCOL nCol;
     144      357884 :     for (nCol=nStartCol; nCol<=nEndCol; nCol++)
     145      351260 :         pMultiSel[nCol].SetMarkArea( nStartRow, nEndRow, bMark );
     146             : 
     147        6624 :     if ( bMultiMarked )                 // aMultiRange updaten
     148             :     {
     149        5232 :         if ( nStartCol < aMultiRange.aStart.Col() )
     150         168 :             aMultiRange.aStart.SetCol( nStartCol );
     151        5232 :         if ( nStartRow < aMultiRange.aStart.Row() )
     152          22 :             aMultiRange.aStart.SetRow( nStartRow );
     153        5232 :         if ( nEndCol > aMultiRange.aEnd.Col() )
     154         570 :             aMultiRange.aEnd.SetCol( nEndCol );
     155        5232 :         if ( nEndRow > aMultiRange.aEnd.Row() )
     156        2198 :             aMultiRange.aEnd.SetRow( nEndRow );
     157             :     }
     158             :     else
     159             :     {
     160        1392 :         aMultiRange = rRange;           // neu
     161        1392 :         bMultiMarked = true;
     162             :     }
     163        6624 : }
     164             : 
     165           0 : void ScMarkData::SetAreaTab( SCTAB nTab )
     166             : {
     167           0 :     aMarkRange.aStart.SetTab(nTab);
     168           0 :     aMarkRange.aEnd.SetTab(nTab);
     169           0 :     aMultiRange.aStart.SetTab(nTab);
     170           0 :     aMultiRange.aEnd.SetTab(nTab);
     171           0 : }
     172             : 
     173       17770 : void ScMarkData::SelectTable( SCTAB nTab, bool bNew )
     174             : {
     175       17770 :     if ( bNew )
     176             :     {
     177       17646 :         maTabMarked.insert( nTab );
     178             :     }
     179             :     else
     180             :     {
     181         124 :         maTabMarked.erase( nTab );
     182             :     }
     183       17770 : }
     184             : 
     185       10464 : bool ScMarkData::GetTableSelect( SCTAB nTab ) const
     186             : {
     187       10464 :     return (maTabMarked.find( nTab ) != maTabMarked.end());
     188             : }
     189             : 
     190         860 : void ScMarkData::SelectOneTable( SCTAB nTab )
     191             : {
     192         860 :     maTabMarked.clear();
     193         860 :     maTabMarked.insert( nTab );
     194         860 : }
     195             : 
     196       27654 : SCTAB ScMarkData::GetSelectCount() const
     197             : {
     198       27654 :     return static_cast<SCTAB> ( maTabMarked.size() );
     199             : }
     200             : 
     201         808 : SCTAB ScMarkData::GetFirstSelected() const
     202             : {
     203         808 :     if (maTabMarked.size() > 0)
     204         808 :         return (*maTabMarked.begin());
     205             : 
     206             :     OSL_FAIL("GetFirstSelected: nothing selected");
     207           0 :     return 0;
     208             : }
     209             : 
     210          78 : SCTAB ScMarkData::GetLastSelected() const
     211             : {
     212          78 :     if (maTabMarked.size() > 0)
     213          78 :         return (*maTabMarked.rbegin());
     214             : 
     215             :     OSL_FAIL("GetLastSelected: nothing selected");
     216           0 :     return 0;
     217             : }
     218             : 
     219           0 : void ScMarkData::SetSelectedTabs(const MarkedTabsType& rTabs)
     220             : {
     221           0 :     MarkedTabsType aTabs(rTabs.begin(), rTabs.end());
     222           0 :     maTabMarked.swap(aTabs);
     223           0 : }
     224             : 
     225        4812 : void ScMarkData::MarkToMulti()
     226             : {
     227        4812 :     if ( bMarked && !bMarking )
     228             :     {
     229         704 :         SetMultiMarkArea( aMarkRange, !bMarkIsNeg );
     230         704 :         bMarked = false;
     231             : 
     232             :         //  check if all multi mark ranges have been removed
     233         704 :         if ( bMarkIsNeg && !HasAnyMultiMarks() )
     234           0 :             ResetMark();
     235             :     }
     236        4812 : }
     237             : 
     238         332 : void ScMarkData::MarkToSimple()
     239             : {
     240         332 :     if ( bMarking )
     241         332 :         return;
     242             : 
     243         332 :     if ( bMultiMarked && bMarked )
     244           0 :         MarkToMulti();                  // may result in bMarked and bMultiMarked reset
     245             : 
     246         332 :     if ( bMultiMarked )
     247             :     {
     248             :         OSL_ENSURE(pMultiSel, "bMultiMarked, but pMultiSel == 0");
     249             : 
     250          96 :         ScRange aNew = aMultiRange;
     251             : 
     252          96 :         bool bOk = false;
     253          96 :         SCCOL nStartCol = aNew.aStart.Col();
     254          96 :         SCCOL nEndCol   = aNew.aEnd.Col();
     255             : 
     256         192 :         while ( nStartCol < nEndCol && !pMultiSel[nStartCol].HasMarks() )
     257           0 :             ++nStartCol;
     258         192 :         while ( nStartCol < nEndCol && !pMultiSel[nEndCol].HasMarks() )
     259           0 :             --nEndCol;
     260             : 
     261             :         //  Zeilen werden nur aus MarkArray genommen
     262             :         SCROW nStartRow, nEndRow;
     263          96 :         if ( pMultiSel[nStartCol].HasOneMark( nStartRow, nEndRow ) )
     264             :         {
     265          96 :             bOk = true;
     266             :             SCROW nCmpStart, nCmpEnd;
     267         274 :             for (SCCOL nCol=nStartCol+1; nCol<=nEndCol && bOk; nCol++)
     268         356 :                 if ( !pMultiSel[nCol].HasOneMark( nCmpStart, nCmpEnd )
     269         178 :                         || nCmpStart != nStartRow || nCmpEnd != nEndRow )
     270          76 :                     bOk = false;
     271             :         }
     272             : 
     273          96 :         if (bOk)
     274             :         {
     275          20 :             aNew.aStart.SetCol(nStartCol);
     276          20 :             aNew.aStart.SetRow(nStartRow);
     277          20 :             aNew.aEnd.SetCol(nEndCol);
     278          20 :             aNew.aEnd.SetRow(nEndRow);
     279             : 
     280          20 :             ResetMark();
     281          20 :             aMarkRange = aNew;
     282          20 :             bMarked = true;
     283          20 :             bMarkIsNeg = false;
     284             :         }
     285             :     }
     286             : }
     287             : 
     288       26926 : bool ScMarkData::IsCellMarked( SCCOL nCol, SCROW nRow, bool bNoSimple ) const
     289             : {
     290       26926 :     if ( bMarked && !bNoSimple && !bMarkIsNeg )
     291       68237 :         if ( aMarkRange.aStart.Col() <= nCol && aMarkRange.aEnd.Col() >= nCol &&
     292       32042 :              aMarkRange.aStart.Row() <= nRow && aMarkRange.aEnd.Row() >= nRow )
     293        2220 :             return true;
     294             : 
     295       24706 :     if (bMultiMarked)
     296             :     {
     297             :         //! hier auf negative Markierung testen ?
     298             : 
     299             :         OSL_ENSURE(pMultiSel, "bMultiMarked, but pMultiSel == 0");
     300        5234 :         return pMultiSel[nCol].GetMark( nRow );
     301             :     }
     302             : 
     303       19472 :     return false;
     304             : }
     305             : 
     306           0 : bool ScMarkData::IsColumnMarked( SCCOL nCol ) const
     307             : {
     308             :     //  bMarkIsNeg inzwischen auch fuer Spaltenkoepfe
     309             :     //! GetMarkColumnRanges fuer komplett markierte Spalten
     310             : 
     311           0 :     if ( bMarked && !bMarkIsNeg &&
     312           0 :                     aMarkRange.aStart.Col() <= nCol && aMarkRange.aEnd.Col() >= nCol &&
     313           0 :                     aMarkRange.aStart.Row() == 0    && aMarkRange.aEnd.Row() == MAXROW )
     314           0 :         return true;
     315             : 
     316           0 :     if ( bMultiMarked && pMultiSel[nCol].IsAllMarked(0,MAXROW) )
     317           0 :         return true;
     318             : 
     319           0 :     return false;
     320             : }
     321             : 
     322           0 : bool ScMarkData::IsRowMarked( SCROW nRow ) const
     323             : {
     324             :     //  bMarkIsNeg inzwischen auch fuer Zeilenkoepfe
     325             :     //! GetMarkRowRanges fuer komplett markierte Zeilen
     326             : 
     327           0 :     if ( bMarked && !bMarkIsNeg &&
     328           0 :                     aMarkRange.aStart.Col() == 0    && aMarkRange.aEnd.Col() == MAXCOL &&
     329           0 :                     aMarkRange.aStart.Row() <= nRow && aMarkRange.aEnd.Row() >= nRow )
     330           0 :         return true;
     331             : 
     332           0 :     if ( bMultiMarked )
     333             :     {
     334             :         OSL_ENSURE(pMultiSel, "bMultiMarked, but pMultiSel == 0");
     335           0 :         for (SCCOL nCol=0; nCol<=MAXCOL; nCol++)
     336           0 :             if (!pMultiSel[nCol].GetMark(nRow))
     337           0 :                 return false;
     338           0 :         return true;
     339             :     }
     340             : 
     341           0 :     return false;
     342             : }
     343             : 
     344       12630 : void ScMarkData::MarkFromRangeList( const ScRangeList& rList, bool bReset )
     345             : {
     346       12630 :     if (bReset)
     347             :     {
     348           8 :         maTabMarked.clear();
     349           8 :         ResetMark();
     350             :     }
     351             : 
     352       12630 :     size_t nCount = rList.size();
     353       12630 :     if ( nCount == 1 && !bMarked && !bMultiMarked )
     354             :     {
     355       12036 :         const ScRange& rRange = *rList[ 0 ];
     356       12036 :         SetMarkArea( rRange );
     357       12036 :         SelectTable( rRange.aStart.Tab(), true );
     358             :     }
     359             :     else
     360             :     {
     361        5024 :         for (size_t i=0; i < nCount; i++)
     362             :         {
     363        4430 :             const ScRange& rRange = *rList[ i ];
     364        4430 :             SetMultiMarkArea( rRange, true );
     365        4430 :             SelectTable( rRange.aStart.Tab(), true );
     366             :         }
     367             :     }
     368       12630 : }
     369             : 
     370        2958 : void ScMarkData::FillRangeListWithMarks( ScRangeList* pList, bool bClear ) const
     371             : {
     372        2958 :     if (!pList)
     373        2958 :         return;
     374             : 
     375        2958 :     if (bClear)
     376          30 :         pList->RemoveAll();
     377             : 
     378             :     //!     bei mehreren selektierten Tabellen mehrere Ranges eintragen !!!
     379             : 
     380        2958 :     if ( bMultiMarked )
     381             :     {
     382             :         OSL_ENSURE(pMultiSel, "bMultiMarked, but pMultiSel == 0");
     383             : 
     384        1400 :         SCTAB nTab = aMultiRange.aStart.Tab();
     385             : 
     386        1400 :         SCCOL nStartCol = aMultiRange.aStart.Col();
     387        1400 :         SCCOL nEndCol = aMultiRange.aEnd.Col();
     388       32306 :         for (SCCOL nCol=nStartCol; nCol<=nEndCol; nCol++)
     389             :         {
     390       30906 :             if (pMultiSel[nCol].HasMarks())
     391             :             {
     392             :                 // Feeding column-wise fragments to ScRangeList::Join() is a
     393             :                 // huge bottleneck, speed this up for multiple columns
     394             :                 // consisting of identical row sets by building a column span
     395             :                 // first. This is usually the case for filtered data, for
     396             :                 // example.
     397        3920 :                 SCCOL nToCol = nCol+1;
     398       10754 :                 for ( ; nToCol <= nEndCol; ++nToCol)
     399             :                 {
     400        9402 :                     if (!pMultiSel[nCol].HasEqualRowsMarked( pMultiSel[nToCol]))
     401        2568 :                         break;
     402             :                 }
     403        3920 :                 --nToCol;
     404        3920 :                 ScRange aRange( nCol, 0, nTab, nToCol, 0, nTab );
     405             :                 SCROW nTop, nBottom;
     406        3920 :                 ScMarkArrayIter aMarkIter( &pMultiSel[nCol] );
     407       11788 :                 while ( aMarkIter.Next( nTop, nBottom ) )
     408             :                 {
     409        3948 :                     aRange.aStart.SetRow( nTop );
     410        3948 :                     aRange.aEnd.SetRow( nBottom );
     411        3948 :                     pList->Join( aRange );
     412             :                 }
     413        3920 :                 nCol = nToCol;
     414             :             }
     415             :         }
     416             :     }
     417             : 
     418        2958 :     if ( bMarked )
     419        1534 :         pList->Append( aMarkRange );
     420             : }
     421             : 
     422           0 : void ScMarkData::ExtendRangeListTables( ScRangeList* pList ) const
     423             : {
     424           0 :     if (!pList)
     425           0 :         return;
     426             : 
     427           0 :     ScRangeList aOldList(*pList);
     428           0 :     pList->RemoveAll();                 //! oder die vorhandenen unten weglassen
     429             : 
     430           0 :     std::set<SCTAB>::const_iterator it = maTabMarked.begin();
     431           0 :     for (; it != maTabMarked.end(); ++it)
     432           0 :         for ( size_t i=0, nCount = aOldList.size(); i<nCount; i++)
     433             :         {
     434           0 :             ScRange aRange = *aOldList[ i ];
     435           0 :             aRange.aStart.SetTab(*it);
     436           0 :             aRange.aEnd.SetTab(*it);
     437           0 :             pList->Append( aRange );
     438           0 :         }
     439             : }
     440             : 
     441        2576 : ScRangeList ScMarkData::GetMarkedRanges() const
     442             : {
     443        2576 :     ScRangeList aRet;
     444        2576 :     FillRangeListWithMarks(&aRet, false);
     445        2576 :     return aRet;
     446             : }
     447             : 
     448        1116 : std::vector<sc::ColRowSpan> ScMarkData::GetMarkedRowSpans() const
     449             : {
     450             :     typedef mdds::flat_segment_tree<SCCOLROW, bool> SpansType;
     451             : 
     452        1116 :     ScRangeList aRanges = GetMarkedRanges();
     453        2232 :     SpansType aSpans(0, MAXROW+1, false);
     454        1116 :     SpansType::const_iterator itPos = aSpans.begin();
     455             : 
     456        2238 :     for (size_t i = 0, n = aRanges.size(); i < n; ++i)
     457             :     {
     458        1122 :         const ScRange& r = *aRanges[i];
     459        1122 :         itPos = aSpans.insert(itPos, r.aStart.Row(), r.aEnd.Row()+1, true).first;
     460             :     }
     461             : 
     462        2232 :     return sc::toSpanArray<SCCOLROW,sc::ColRowSpan>(aSpans);
     463             : }
     464             : 
     465         130 : std::vector<sc::ColRowSpan> ScMarkData::GetMarkedColSpans() const
     466             : {
     467             :     typedef mdds::flat_segment_tree<SCCOLROW, bool> SpansType;
     468             : 
     469         130 :     ScRangeList aRanges = GetMarkedRanges();
     470         260 :     SpansType aSpans(0, MAXCOL+1, false);
     471         130 :     SpansType::const_iterator itPos = aSpans.begin();
     472             : 
     473         570 :     for (size_t i = 0, n = aRanges.size(); i < n; ++i)
     474             :     {
     475         440 :         const ScRange& r = *aRanges[i];
     476         440 :         itPos = aSpans.insert(itPos, r.aStart.Col(), r.aEnd.Col()+1, true).first;
     477             :     }
     478             : 
     479         260 :     return sc::toSpanArray<SCCOLROW,sc::ColRowSpan>(aSpans);
     480             : }
     481             : 
     482          66 : bool ScMarkData::IsAllMarked( const ScRange& rRange ) const
     483             : {
     484          66 :     if ( !bMultiMarked )
     485          38 :         return false;
     486             : 
     487             :     OSL_ENSURE(pMultiSel, "bMultiMarked, but pMultiSel == 0");
     488             : 
     489          28 :     SCCOL nStartCol = rRange.aStart.Col();
     490          28 :     SCROW nStartRow = rRange.aStart.Row();
     491          28 :     SCCOL nEndCol = rRange.aEnd.Col();
     492          28 :     SCROW nEndRow = rRange.aEnd.Row();
     493          28 :     bool bOk = true;
     494         100 :     for (SCCOL nCol=nStartCol; nCol<=nEndCol && bOk; nCol++)
     495          72 :         if ( !pMultiSel[nCol].IsAllMarked( nStartRow, nEndRow ) )
     496           0 :             bOk = false;
     497             : 
     498          28 :     return bOk;
     499             : }
     500             : 
     501           0 : SCsROW ScMarkData::GetNextMarked( SCCOL nCol, SCsROW nRow, bool bUp ) const
     502             : {
     503           0 :     if ( !bMultiMarked )
     504           0 :         return nRow;
     505             : 
     506             :     OSL_ENSURE(pMultiSel, "bMultiMarked, but pMultiSel == 0");
     507             : 
     508           0 :     return pMultiSel[nCol].GetNextMarked( nRow, bUp );
     509             : }
     510             : 
     511       45056 : bool ScMarkData::HasMultiMarks( SCCOL nCol ) const
     512             : {
     513       45056 :     if ( !bMultiMarked )
     514           0 :         return false;
     515             : 
     516             :     OSL_ENSURE(pMultiSel, "bMultiMarked, but pMultiSel == 0");
     517             : 
     518       45056 :     return pMultiSel[nCol].HasMarks();
     519             : }
     520             : 
     521           0 : bool ScMarkData::HasAnyMultiMarks() const
     522             : {
     523           0 :     if ( !bMultiMarked )
     524           0 :         return false;
     525             : 
     526             :     OSL_ENSURE(pMultiSel, "bMultiMarked, but pMultiSel == 0");
     527             : 
     528           0 :     for (SCCOL nCol=0; nCol<=MAXCOL; nCol++)
     529           0 :         if ( pMultiSel[nCol].HasMarks() )
     530           0 :             return true;
     531             : 
     532           0 :     return false;       // nix
     533             : }
     534             : 
     535          92 : void ScMarkData::InsertTab( SCTAB nTab )
     536             : {
     537          92 :     std::set<SCTAB> tabMarked(maTabMarked.begin(), maTabMarked.upper_bound(nTab));
     538          92 :     std::set<SCTAB>::iterator it = maTabMarked.upper_bound(nTab);
     539         110 :     for (; it != maTabMarked.end(); ++it)
     540          18 :         tabMarked.insert(*it + 1);
     541          92 :     maTabMarked.swap(tabMarked);
     542          92 : }
     543             : 
     544          36 : void ScMarkData::DeleteTab( SCTAB nTab )
     545             : {
     546          36 :     std::set<SCTAB> tabMarked(maTabMarked.begin(), maTabMarked.find(nTab));
     547          36 :     tabMarked.erase( nTab );
     548          36 :     std::set<SCTAB>::iterator it = maTabMarked.find(nTab);
     549          70 :     for (; it != maTabMarked.end(); ++it)
     550          34 :         tabMarked.insert(*it + 1);
     551          36 :     maTabMarked.swap(tabMarked);
     552          36 : }
     553             : 
     554             : //iterators
     555        2406 : ScMarkData::iterator ScMarkData::begin()
     556             : {
     557        2406 :     return maTabMarked.begin();
     558             : }
     559             : 
     560        2116 : ScMarkData::iterator ScMarkData::end()
     561             : {
     562        2116 :     return maTabMarked.end();
     563             : }
     564             : 
     565       30630 : ScMarkData::const_iterator ScMarkData::begin() const
     566             : {
     567       30630 :     return maTabMarked.begin();
     568             : }
     569             : 
     570       30526 : ScMarkData::const_iterator ScMarkData::end() const
     571             : {
     572       30526 :     return maTabMarked.end();
     573         228 : }
     574             : 
     575             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10