LCOV - code coverage report
Current view: top level - libreoffice/sc/source/core/data - markdata.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 159 341 46.6 %
Date: 2012-12-27 Functions: 23 38 60.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             : 
      24             : // STATIC DATA -----------------------------------------------------------
      25             : 
      26             : //------------------------------------------------------------------------
      27             : 
      28         357 : ScMarkData::ScMarkData() :
      29             :     maTabMarked(),
      30         357 :     pMultiSel( NULL )
      31             : {
      32         357 :     ResetMark();
      33         357 : }
      34             : 
      35           4 : ScMarkData::ScMarkData(const ScMarkData& rData) :
      36             :     maTabMarked( rData.maTabMarked ),
      37             :     aMarkRange( rData.aMarkRange ),
      38             :     aMultiRange( rData.aMultiRange ),
      39           4 :     pMultiSel( NULL )
      40             : {
      41           4 :     bMarked      = rData.bMarked;
      42           4 :     bMultiMarked = rData.bMultiMarked;
      43           4 :     bMarking     = rData.bMarking;
      44           4 :     bMarkIsNeg   = rData.bMarkIsNeg;
      45             : 
      46           4 :     if (rData.pMultiSel)
      47             :     {
      48           0 :         pMultiSel = new ScMarkArray[MAXCOLCOUNT];
      49           0 :         for (SCCOL j=0; j<MAXCOLCOUNT; j++)
      50           0 :             rData.pMultiSel[j].CopyMarksTo( pMultiSel[j] );
      51             :     }
      52           4 : }
      53             : 
      54           1 : ScMarkData& ScMarkData::operator=(const ScMarkData& rData)
      55             : {
      56           1 :     if ( &rData == this )
      57           0 :         return *this;
      58             : 
      59           1 :     delete[] pMultiSel;
      60           1 :     pMultiSel = NULL;
      61             : 
      62           1 :     aMarkRange   = rData.aMarkRange;
      63           1 :     aMultiRange  = rData.aMultiRange;
      64           1 :     bMarked      = rData.bMarked;
      65           1 :     bMultiMarked = rData.bMultiMarked;
      66           1 :     bMarking     = rData.bMarking;
      67           1 :     bMarkIsNeg   = rData.bMarkIsNeg;
      68             : 
      69           1 :     maTabMarked = rData.maTabMarked;
      70             : 
      71           1 :     if (rData.pMultiSel)
      72             :     {
      73           0 :         pMultiSel = new ScMarkArray[MAXCOLCOUNT];
      74           0 :         for (SCCOL j=0; j<MAXCOLCOUNT; j++)
      75           0 :             rData.pMultiSel[j].CopyMarksTo( pMultiSel[j] );
      76             :     }
      77             : 
      78           1 :     return *this;
      79             : }
      80             : 
      81         720 : ScMarkData::~ScMarkData()
      82             : {
      83         360 :     delete[] pMultiSel;
      84         360 : }
      85             : 
      86         359 : void ScMarkData::ResetMark()
      87             : {
      88         359 :     delete[] pMultiSel;
      89         359 :     pMultiSel = NULL;
      90             : 
      91         359 :     bMarked = bMultiMarked = false;
      92         359 :     bMarking = bMarkIsNeg = false;
      93         359 : }
      94             : 
      95         280 : void ScMarkData::SetMarkArea( const ScRange& rRange )
      96             : {
      97         280 :     aMarkRange = rRange;
      98         280 :     aMarkRange.Justify();
      99         280 :     if ( !bMarked )
     100             :     {
     101             :         // Upon creation of a document ScFormatShell GetTextAttrState
     102             :         // may query (default) attributes although no sheet is marked yet.
     103             :         // => mark that one.
     104         280 :         if ( !GetSelectCount() )
     105         278 :             maTabMarked.insert( aMarkRange.aStart.Tab() );
     106         280 :         bMarked = true;
     107             :     }
     108         280 : }
     109             : 
     110         850 : void ScMarkData::GetMarkArea( ScRange& rRange ) const
     111             : {
     112         850 :     rRange = aMarkRange;        //! inline ?
     113         850 : }
     114             : 
     115          70 : void ScMarkData::GetMultiMarkArea( ScRange& rRange ) const
     116             : {
     117          70 :     rRange = aMultiRange;
     118          70 : }
     119             : 
     120         405 : void ScMarkData::SetMultiMarkArea( const ScRange& rRange, bool bMark )
     121             : {
     122         405 :     if (!pMultiSel)
     123             :     {
     124          78 :         pMultiSel = new ScMarkArray[MAXCOL+1];
     125             : 
     126             :         // if simple mark range is set, copy to multi marks
     127          78 :         if ( bMarked && !bMarkIsNeg )
     128             :         {
     129          11 :             bMarked = false;
     130          11 :             SetMultiMarkArea( aMarkRange, true );
     131             :         }
     132             :     }
     133             : 
     134         405 :     SCCOL nStartCol = rRange.aStart.Col();
     135         405 :     SCROW nStartRow = rRange.aStart.Row();
     136         405 :     SCCOL nEndCol = rRange.aEnd.Col();
     137         405 :     SCROW nEndRow = rRange.aEnd.Row();
     138         405 :     PutInOrder( nStartRow, nEndRow );
     139         405 :     PutInOrder( nStartCol, nEndCol );
     140             : 
     141             :     SCCOL nCol;
     142        1834 :     for (nCol=nStartCol; nCol<=nEndCol; nCol++)
     143        1429 :         pMultiSel[nCol].SetMarkArea( nStartRow, nEndRow, bMark );
     144             : 
     145         405 :     if ( bMultiMarked )                 // aMultiRange updaten
     146             :     {
     147         327 :         if ( nStartCol < aMultiRange.aStart.Col() )
     148          17 :             aMultiRange.aStart.SetCol( nStartCol );
     149         327 :         if ( nStartRow < aMultiRange.aStart.Row() )
     150           0 :             aMultiRange.aStart.SetRow( nStartRow );
     151         327 :         if ( nEndCol > aMultiRange.aEnd.Col() )
     152          43 :             aMultiRange.aEnd.SetCol( nEndCol );
     153         327 :         if ( nEndRow > aMultiRange.aEnd.Row() )
     154         236 :             aMultiRange.aEnd.SetRow( nEndRow );
     155             :     }
     156             :     else
     157             :     {
     158          78 :         aMultiRange = rRange;           // neu
     159          78 :         bMultiMarked = true;
     160             :     }
     161         405 : }
     162             : 
     163           0 : void ScMarkData::SetAreaTab( SCTAB nTab )
     164             : {
     165           0 :     aMarkRange.aStart.SetTab(nTab);
     166           0 :     aMarkRange.aEnd.SetTab(nTab);
     167           0 :     aMultiRange.aStart.SetTab(nTab);
     168           0 :     aMultiRange.aEnd.SetTab(nTab);
     169           0 : }
     170             : 
     171         635 : void ScMarkData::SelectTable( SCTAB nTab, bool bNew )
     172             : {
     173         635 :     if ( bNew )
     174             :     {
     175         635 :         maTabMarked.insert( nTab );
     176             :     }
     177             :     else
     178             :     {
     179           0 :         maTabMarked.erase( nTab );
     180             :     }
     181         635 : }
     182             : 
     183          50 : bool ScMarkData::GetTableSelect( SCTAB nTab ) const
     184             : {
     185          50 :     return (maTabMarked.find( nTab ) != maTabMarked.end());
     186             : }
     187             : 
     188           4 : void ScMarkData::SelectOneTable( SCTAB nTab )
     189             : {
     190           4 :     maTabMarked.clear();
     191           4 :     maTabMarked.insert( nTab );
     192           4 : }
     193             : 
     194         281 : SCTAB ScMarkData::GetSelectCount() const
     195             : {
     196         281 :     return static_cast<SCTAB> ( maTabMarked.size() );
     197             : }
     198             : 
     199           4 : SCTAB ScMarkData::GetFirstSelected() const
     200             : {
     201           4 :     if (maTabMarked.size() > 0)
     202           4 :         return (*maTabMarked.begin());
     203             : 
     204             :     OSL_FAIL("GetFirstSelected: keine markiert");
     205           0 :     return 0;
     206             : }
     207             : 
     208           3 : SCTAB ScMarkData::GetLastSelected() const
     209             : {
     210           3 :     if (maTabMarked.size() > 0)
     211           3 :         return (*maTabMarked.rbegin());
     212             : 
     213             :     OSL_FAIL("GetLastSelected: keine markiert");
     214           0 :     return 0;
     215             : }
     216             : 
     217           0 : const ScMarkData::MarkedTabsType& ScMarkData::GetSelectedTabs() const
     218             : {
     219           0 :     return maTabMarked;
     220             : }
     221             : 
     222           0 : void ScMarkData::SetSelectedTabs(const MarkedTabsType& rTabs)
     223             : {
     224           0 :     MarkedTabsType aTabs(rTabs.begin(), rTabs.end());
     225           0 :     maTabMarked.swap(aTabs);
     226           0 : }
     227             : 
     228          11 : void ScMarkData::MarkToMulti()
     229             : {
     230          11 :     if ( bMarked && !bMarking )
     231             :     {
     232          11 :         SetMultiMarkArea( aMarkRange, !bMarkIsNeg );
     233          11 :         bMarked = false;
     234             : 
     235             :         //  check if all multi mark ranges have been removed
     236          11 :         if ( bMarkIsNeg && !HasAnyMultiMarks() )
     237           0 :             ResetMark();
     238             :     }
     239          11 : }
     240             : 
     241           4 : void ScMarkData::MarkToSimple()
     242             : {
     243           4 :     if ( bMarking )
     244           4 :         return;
     245             : 
     246           4 :     if ( bMultiMarked && bMarked )
     247           0 :         MarkToMulti();                  // may result in bMarked and bMultiMarked reset
     248             : 
     249           4 :     if ( bMultiMarked )
     250             :     {
     251             :         OSL_ENSURE(pMultiSel, "bMultiMarked, aber pMultiSel == 0");
     252             : 
     253           2 :         ScRange aNew = aMultiRange;
     254             : 
     255           2 :         bool bOk = false;
     256           2 :         SCCOL nStartCol = aNew.aStart.Col();
     257           2 :         SCCOL nEndCol   = aNew.aEnd.Col();
     258             : 
     259           4 :         while ( nStartCol < nEndCol && !pMultiSel[nStartCol].HasMarks() )
     260           0 :             ++nStartCol;
     261           4 :         while ( nStartCol < nEndCol && !pMultiSel[nEndCol].HasMarks() )
     262           0 :             --nEndCol;
     263             : 
     264             :         //  Zeilen werden nur aus MarkArray genommen
     265             :         SCROW nStartRow, nEndRow;
     266           2 :         if ( pMultiSel[nStartCol].HasOneMark( nStartRow, nEndRow ) )
     267             :         {
     268           2 :             bOk = true;
     269             :             SCROW nCmpStart, nCmpEnd;
     270           6 :             for (SCCOL nCol=nStartCol+1; nCol<=nEndCol && bOk; nCol++)
     271           4 :                 if ( !pMultiSel[nCol].HasOneMark( nCmpStart, nCmpEnd )
     272             :                         || nCmpStart != nStartRow || nCmpEnd != nEndRow )
     273           0 :                     bOk = false;
     274             :         }
     275             : 
     276           2 :         if (bOk)
     277             :         {
     278           2 :             aNew.aStart.SetCol(nStartCol);
     279           2 :             aNew.aStart.SetRow(nStartRow);
     280           2 :             aNew.aEnd.SetCol(nEndCol);
     281           2 :             aNew.aEnd.SetRow(nEndRow);
     282             : 
     283           2 :             ResetMark();
     284           2 :             aMarkRange = aNew;
     285           2 :             bMarked = true;
     286           2 :             bMarkIsNeg = false;
     287             :         }
     288             :     }
     289             : }
     290             : 
     291           0 : bool ScMarkData::IsCellMarked( SCCOL nCol, SCROW nRow, bool bNoSimple ) const
     292             : {
     293           0 :     if ( bMarked && !bNoSimple && !bMarkIsNeg )
     294           0 :         if ( aMarkRange.aStart.Col() <= nCol && aMarkRange.aEnd.Col() >= nCol &&
     295           0 :              aMarkRange.aStart.Row() <= nRow && aMarkRange.aEnd.Row() >= nRow )
     296           0 :             return true;
     297             : 
     298           0 :     if (bMultiMarked)
     299             :     {
     300             :         //! hier auf negative Markierung testen ?
     301             : 
     302             :         OSL_ENSURE(pMultiSel, "bMultiMarked, aber pMultiSel == 0");
     303           0 :         return pMultiSel[nCol].GetMark( nRow );
     304             :     }
     305             : 
     306           0 :     return false;
     307             : }
     308             : 
     309           0 : bool ScMarkData::IsColumnMarked( SCCOL nCol ) const
     310             : {
     311             :     //  bMarkIsNeg inzwischen auch fuer Spaltenkoepfe
     312             :     //! GetMarkColumnRanges fuer komplett markierte Spalten
     313             : 
     314           0 :     if ( bMarked && !bMarkIsNeg &&
     315           0 :                     aMarkRange.aStart.Col() <= nCol && aMarkRange.aEnd.Col() >= nCol &&
     316           0 :                     aMarkRange.aStart.Row() == 0    && aMarkRange.aEnd.Row() == MAXROW )
     317           0 :         return true;
     318             : 
     319           0 :     if ( bMultiMarked && pMultiSel[nCol].IsAllMarked(0,MAXROW) )
     320           0 :         return true;
     321             : 
     322           0 :     return false;
     323             : }
     324             : 
     325           0 : bool ScMarkData::IsRowMarked( SCROW nRow ) const
     326             : {
     327             :     //  bMarkIsNeg inzwischen auch fuer Zeilenkoepfe
     328             :     //! GetMarkRowRanges fuer komplett markierte Zeilen
     329             : 
     330           0 :     if ( bMarked && !bMarkIsNeg &&
     331           0 :                     aMarkRange.aStart.Col() == 0    && aMarkRange.aEnd.Col() == MAXCOL &&
     332           0 :                     aMarkRange.aStart.Row() <= nRow && aMarkRange.aEnd.Row() >= nRow )
     333           0 :         return true;
     334             : 
     335           0 :     if ( bMultiMarked )
     336             :     {
     337             :         OSL_ENSURE(pMultiSel, "bMultiMarked, aber pMultiSel == 0");
     338           0 :         for (SCCOL nCol=0; nCol<=MAXCOL; nCol++)
     339           0 :             if (!pMultiSel[nCol].GetMark(nRow))
     340           0 :                 return false;
     341           0 :         return true;
     342             :     }
     343             : 
     344           0 :     return false;
     345             : }
     346             : 
     347         293 : void ScMarkData::MarkFromRangeList( const ScRangeList& rList, bool bReset )
     348             : {
     349         293 :     if (bReset)
     350             :     {
     351           0 :         maTabMarked.clear();
     352           0 :         ResetMark();
     353             :     }
     354             : 
     355         293 :     size_t nCount = rList.size();
     356         293 :     if ( nCount == 1 && !bMarked && !bMultiMarked )
     357             :     {
     358         224 :         ScRange aRange = *rList[ 0 ];
     359         224 :         SetMarkArea( aRange );
     360         224 :         SelectTable( aRange.aStart.Tab(), true );
     361             :     }
     362             :     else
     363             :     {
     364         452 :         for (size_t i=0; i < nCount; i++)
     365             :         {
     366         383 :             ScRange aRange = *rList[ i ];
     367         383 :             SetMultiMarkArea( aRange, true );
     368         383 :             SelectTable( aRange.aStart.Tab(), true );
     369             :         }
     370             :     }
     371         293 : }
     372             : 
     373           2 : void ScMarkData::FillRangeListWithMarks( ScRangeList* pList, bool bClear ) const
     374             : {
     375           2 :     if (!pList)
     376           2 :         return;
     377             : 
     378           2 :     if (bClear)
     379           0 :         pList->RemoveAll();
     380             : 
     381             :     //!     bei mehreren selektierten Tabellen mehrere Ranges eintragen !!!
     382             : 
     383           2 :     if ( bMultiMarked )
     384             :     {
     385             :         OSL_ENSURE(pMultiSel, "bMultiMarked, aber pMultiSel == 0");
     386             : 
     387           2 :         SCTAB nTab = aMultiRange.aStart.Tab();
     388             : 
     389           2 :         SCCOL nStartCol = aMultiRange.aStart.Col();
     390           2 :         SCCOL nEndCol = aMultiRange.aEnd.Col();
     391           8 :         for (SCCOL nCol=nStartCol; nCol<=nEndCol; nCol++)
     392           6 :             if (pMultiSel[nCol].HasMarks())
     393             :             {
     394             :                 SCROW nTop, nBottom;
     395           6 :                 ScRange aRange( nCol, 0, nTab );
     396           6 :                 ScMarkArrayIter aMarkIter( &pMultiSel[nCol] );
     397          18 :                 while ( aMarkIter.Next( nTop, nBottom ) )
     398             :                 {
     399           6 :                     aRange.aStart.SetRow( nTop );
     400           6 :                     aRange.aEnd.SetRow( nBottom );
     401           6 :                     pList->Join( aRange );
     402           6 :                 }
     403             :             }
     404             :     }
     405             : 
     406           2 :     if ( bMarked )
     407           0 :         pList->Append( aMarkRange );
     408             : }
     409             : 
     410           0 : void ScMarkData::ExtendRangeListTables( ScRangeList* pList ) const
     411             : {
     412           0 :     if (!pList)
     413           0 :         return;
     414             : 
     415           0 :     ScRangeList aOldList(*pList);
     416           0 :     pList->RemoveAll();                 //! oder die vorhandenen unten weglassen
     417             : 
     418           0 :     std::set<SCTAB>::const_iterator it = maTabMarked.begin();
     419           0 :     for (; it != maTabMarked.end(); ++it)
     420           0 :         for ( size_t i=0, nCount = aOldList.size(); i<nCount; i++)
     421             :         {
     422           0 :             ScRange aRange = *aOldList[ i ];
     423           0 :             aRange.aStart.SetTab(*it);
     424           0 :             aRange.aEnd.SetTab(*it);
     425           0 :             pList->Append( aRange );
     426           0 :         }
     427             : }
     428             : 
     429           0 : SCCOLROW ScMarkData::GetMarkColumnRanges( SCCOLROW* pRanges )
     430             : {
     431           0 :     if (bMarked)
     432           0 :         MarkToMulti();
     433             : 
     434           0 :     if (!bMultiMarked)
     435           0 :         return 0;
     436             : 
     437             :     OSL_ENSURE(pMultiSel, "bMultiMarked, but pMultiSel == 0");
     438             : 
     439           0 :     const SCCOLROW nMultiStart = aMultiRange.aStart.Col();
     440           0 :     const SCCOLROW nMultiEnd = aMultiRange.aEnd.Col();
     441           0 :     if (nMultiStart == 0 && nMultiEnd == MAXCOL)
     442             :     {
     443             :         // One or more entire rows.
     444           0 :         pRanges[0] = 0;
     445           0 :         pRanges[1] = MAXCOL;
     446           0 :         return 1;
     447             :     }
     448             : 
     449           0 :     SCCOLROW nRangeCnt = 0;
     450           0 :     SCCOLROW nStart = nMultiStart;
     451           0 :     while (nStart <= nMultiEnd)
     452             :     {
     453           0 :         while (nStart < nMultiEnd && !pMultiSel[nStart].HasMarks())
     454           0 :             ++nStart;
     455           0 :         if (pMultiSel[nStart].HasMarks())
     456             :         {
     457           0 :             SCCOLROW nEnd = nStart;
     458           0 :             while (nEnd < nMultiEnd && pMultiSel[nEnd].HasMarks())
     459           0 :                 ++nEnd;
     460           0 :             if (!pMultiSel[nEnd].HasMarks())
     461           0 :                 --nEnd;
     462           0 :             pRanges[2*nRangeCnt  ] = nStart;
     463           0 :             pRanges[2*nRangeCnt+1] = nEnd;
     464           0 :             ++nRangeCnt;
     465           0 :             nStart = nEnd+1;
     466             :         }
     467             :         else
     468           0 :             nStart = nMultiEnd+1;
     469             :     }
     470             : 
     471           0 :     return nRangeCnt;
     472             : }
     473             : 
     474           0 : SCCOLROW ScMarkData::GetMarkRowRanges( SCCOLROW* pRanges )
     475             : {
     476           0 :     if (bMarked)
     477           0 :         MarkToMulti();
     478             : 
     479           0 :     if (!bMultiMarked)
     480           0 :         return 0;
     481             : 
     482             :     OSL_ENSURE(pMultiSel, "bMultiMarked, but pMultiSel == 0");
     483             : 
     484             :     // Which rows are marked?
     485             : 
     486             :     // Optimized to not loop over MAXCOL*MAXROW as worst case, i.e. Ctrl+A
     487             : 
     488           0 :     const SCCOLROW nMultiStart = aMultiRange.aStart.Row();
     489           0 :     const SCCOLROW nMultiEnd = aMultiRange.aEnd.Row();
     490             : 
     491           0 :     bool*   bRowMarked = new bool[MAXROWCOUNT];
     492           0 :     memset( bRowMarked, 0, sizeof(bool) * MAXROWCOUNT);
     493             :     SCROW  nRow;
     494             :     SCCOL  nCol;
     495             : 
     496           0 :     SCROW nTop = -1, nBottom = -1;
     497           0 :     for (nCol = aMultiRange.aStart.Col(); nCol <= aMultiRange.aEnd.Col(); ++nCol)
     498             :     {
     499           0 :         ScMarkArrayIter aMarkIter( &pMultiSel[nCol] );
     500           0 :         while (aMarkIter.Next( nTop, nBottom ))
     501           0 :             for (nRow=nTop; nRow<=nBottom; nRow++)
     502           0 :                 bRowMarked[nRow] = true;
     503           0 :         if (nTop == nMultiStart && nBottom == nMultiEnd)
     504             :             break;  // for, all relevant rows marked
     505           0 :     }
     506             : 
     507           0 :     if (nTop == nMultiStart && nBottom == nMultiEnd)
     508             :     {
     509           0 :         pRanges[0] = nTop;
     510           0 :         pRanges[1] = nBottom;
     511           0 :         delete[] bRowMarked;
     512           0 :         return 1;
     513             :     }
     514             : 
     515             :     // Combine to ranges of rows.
     516             : 
     517           0 :     SCCOLROW nRangeCnt = 0;
     518           0 :     SCCOLROW nStart = nMultiStart;
     519           0 :     while (nStart <= nMultiEnd)
     520             :     {
     521           0 :         while (nStart < nMultiEnd && !bRowMarked[nStart])
     522           0 :             ++nStart;
     523           0 :         if (bRowMarked[nStart])
     524             :         {
     525           0 :             SCCOLROW nEnd = nStart;
     526           0 :             while (nEnd < nMultiEnd && bRowMarked[nEnd])
     527           0 :                 ++nEnd;
     528           0 :             if (!bRowMarked[nEnd])
     529           0 :                 --nEnd;
     530           0 :             pRanges[2*nRangeCnt  ] = nStart;
     531           0 :             pRanges[2*nRangeCnt+1] = nEnd;
     532           0 :             ++nRangeCnt;
     533           0 :             nStart = nEnd+1;
     534             :         }
     535             :         else
     536           0 :             nStart = nMultiEnd+1;
     537             :     }
     538             : 
     539           0 :     delete[] bRowMarked;
     540           0 :     return nRangeCnt;
     541             : }
     542             : 
     543           0 : bool ScMarkData::IsAllMarked( const ScRange& rRange ) const
     544             : {
     545           0 :     if ( !bMultiMarked )
     546           0 :         return false;
     547             : 
     548             :     OSL_ENSURE(pMultiSel, "bMultiMarked, aber pMultiSel == 0");
     549             : 
     550           0 :     SCCOL nStartCol = rRange.aStart.Col();
     551           0 :     SCROW nStartRow = rRange.aStart.Row();
     552           0 :     SCCOL nEndCol = rRange.aEnd.Col();
     553           0 :     SCROW nEndRow = rRange.aEnd.Row();
     554           0 :     bool bOk = true;
     555           0 :     for (SCCOL nCol=nStartCol; nCol<=nEndCol && bOk; nCol++)
     556           0 :         if ( !pMultiSel[nCol].IsAllMarked( nStartRow, nEndRow ) )
     557           0 :             bOk = false;
     558             : 
     559           0 :     return bOk;
     560             : }
     561             : 
     562           0 : SCsROW ScMarkData::GetNextMarked( SCCOL nCol, SCsROW nRow, bool bUp ) const
     563             : {
     564           0 :     if ( !bMultiMarked )
     565           0 :         return nRow;
     566             : 
     567             :     OSL_ENSURE(pMultiSel, "bMultiMarked, aber pMultiSel == 0");
     568             : 
     569           0 :     return pMultiSel[nCol].GetNextMarked( nRow, bUp );
     570             : }
     571             : 
     572           0 : bool ScMarkData::HasMultiMarks( SCCOL nCol ) const
     573             : {
     574           0 :     if ( !bMultiMarked )
     575           0 :         return false;
     576             : 
     577             :     OSL_ENSURE(pMultiSel, "bMultiMarked, aber pMultiSel == 0");
     578             : 
     579           0 :     return pMultiSel[nCol].HasMarks();
     580             : }
     581             : 
     582           0 : bool ScMarkData::HasAnyMultiMarks() const
     583             : {
     584           0 :     if ( !bMultiMarked )
     585           0 :         return false;
     586             : 
     587             :     OSL_ENSURE(pMultiSel, "bMultiMarked, aber pMultiSel == 0");
     588             : 
     589           0 :     for (SCCOL nCol=0; nCol<=MAXCOL; nCol++)
     590           0 :         if ( pMultiSel[nCol].HasMarks() )
     591           0 :             return true;
     592             : 
     593           0 :     return false;       // nix
     594             : }
     595             : 
     596           0 : void ScMarkData::InsertTab( SCTAB nTab )
     597             : {
     598           0 :     std::set<SCTAB> tabMarked(maTabMarked.begin(), maTabMarked.upper_bound(nTab));
     599           0 :     std::set<SCTAB>::iterator it = maTabMarked.upper_bound(nTab);
     600           0 :     for (; it != maTabMarked.end(); ++it)
     601           0 :         tabMarked.insert(*it + 1);
     602           0 :     maTabMarked.swap(tabMarked);
     603           0 : }
     604             : 
     605           0 : void ScMarkData::DeleteTab( SCTAB nTab )
     606             : {
     607           0 :     std::set<SCTAB> tabMarked(maTabMarked.begin(), maTabMarked.find(nTab));
     608           0 :     tabMarked.erase( nTab );
     609           0 :     std::set<SCTAB>::iterator it = maTabMarked.find(nTab);
     610           0 :     for (; it != maTabMarked.end(); ++it)
     611           0 :         tabMarked.insert(*it + 1);
     612           0 :     maTabMarked.swap(tabMarked);
     613           0 : }
     614             : 
     615             : //iterators
     616           6 : ScMarkData::iterator ScMarkData::begin()
     617             : {
     618           6 :     return maTabMarked.begin();
     619             : }
     620             : 
     621           3 : ScMarkData::iterator ScMarkData::end()
     622             : {
     623           3 :     return maTabMarked.end();
     624             : }
     625             : 
     626         790 : ScMarkData::const_iterator ScMarkData::begin() const
     627             : {
     628         790 :     return maTabMarked.begin();
     629             : }
     630             : 
     631         731 : ScMarkData::const_iterator ScMarkData::end() const
     632             : {
     633         731 :     return maTabMarked.end();
     634             : }
     635             : 
     636             : 
     637             : 
     638             : 
     639             : 
     640             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10