LCOV - code coverage report
Current view: top level - sw/source/core/text - wrong.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 132 331 39.9 %
Date: 2014-11-03 Functions: 15 26 57.7 %
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 "swtypes.hxx"
      21             : 
      22             : #include "SwGrammarMarkUp.hxx"
      23             : 
      24          14 : SwWrongArea::SwWrongArea( const rtl::OUString& rType, WrongListType listType,
      25             :         com::sun::star::uno::Reference< com::sun::star::container::XStringKeyMap > xPropertyBag,
      26             :         sal_Int32 nPos,
      27             :         sal_Int32 nLen)
      28          14 : : maType(rType), mxPropertyBag(xPropertyBag), mnPos(nPos), mnLen(nLen), mpSubList(0)
      29             : {
      30          14 :     mColor =  getWrongAreaColor(listType, xPropertyBag);
      31          14 :     mLineType = getWrongAreaLineType(listType, xPropertyBag);
      32          14 : }
      33             : 
      34           0 : SwWrongArea::SwWrongArea( const rtl::OUString& rType,
      35             :         com::sun::star::uno::Reference< com::sun::star::container::XStringKeyMap > xPropertyBag,
      36             :         sal_Int32 nPos,
      37             :         sal_Int32 nLen,
      38             :         SwWrongList* pSubList)
      39           0 : : maType(rType), mxPropertyBag(xPropertyBag), mnPos(nPos), mnLen(nLen), mpSubList(pSubList), mLineType(WRONGAREA_NONE)
      40             : {
      41           0 :     if (pSubList != 0)
      42             :     {
      43           0 :         mColor =  getWrongAreaColor(pSubList->GetWrongListType(), xPropertyBag);
      44           0 :         mLineType = getWrongAreaLineType(pSubList->GetWrongListType(), xPropertyBag);
      45             :     }
      46           0 : }
      47             : 
      48          57 : SwWrongList::SwWrongList( WrongListType eType ) :
      49             :     meType       (eType),
      50             :     nBeginInvalid(COMPLETE_STRING),  // everything correct... (the invalid area starts beyond the string)
      51          57 :     nEndInvalid  (COMPLETE_STRING)
      52             : {
      53          57 :     maList.reserve( 5 );
      54          57 : }
      55             : 
      56         168 : SwWrongList::~SwWrongList()
      57             : {
      58          56 :     ClearList();
      59         112 : }
      60             : 
      61           0 : SwWrongList* SwWrongList::Clone()
      62             : {
      63           0 :     SwWrongList* pClone = new SwWrongList( meType );
      64           0 :     pClone->CopyFrom( *this );
      65           0 :     return pClone;
      66             : }
      67             : 
      68           0 : void SwWrongList::CopyFrom( const SwWrongList& rCopy )
      69             : {
      70           0 :     maList = rCopy.maList;
      71           0 :     meType = rCopy.meType;
      72           0 :     nBeginInvalid = rCopy.nBeginInvalid;
      73           0 :     nEndInvalid = rCopy.nEndInvalid;
      74           0 :     for( size_t i = 0; i < maList.size(); ++i )
      75             :     {
      76           0 :         if( maList[i].mpSubList )
      77           0 :             maList[i].mpSubList = maList[i].mpSubList->Clone();
      78             :     }
      79           0 : }
      80             : 
      81          56 : void SwWrongList::ClearList()
      82             : {
      83          70 :     for ( size_t i = 0; i < maList.size(); ++i)
      84             :     {
      85          14 :         if (maList[i].mpSubList)
      86           0 :             delete maList[i].mpSubList;
      87          14 :         maList[i].mpSubList = NULL;
      88             :     }
      89          56 :     maList.clear();
      90          56 : }
      91             : 
      92             : /** If a word is incorrectly selected, this method returns begin and length of it.
      93             : 
      94             :     @param[in,out] rChk starting position of the word to check
      95             :     @param[out]    rLn  length of the word
      96             : 
      97             :     @return <true> if incorrectly selected, <false> otherwise
      98             :  */
      99           0 : bool SwWrongList::InWrongWord( sal_Int32 &rChk, sal_Int32 &rLn ) const
     100             : {
     101           0 :     const sal_uInt16 nPos = GetWrongPos( rChk );
     102           0 :     if ( nPos >= Count() )
     103           0 :         return false;
     104           0 :     const sal_Int32 nWrPos = Pos( nPos );
     105           0 :     if ( nWrPos <= rChk )
     106             :     {
     107           0 :         rLn = Len( nPos );
     108           0 :         if( nWrPos + rLn <= rChk )
     109           0 :             return false;
     110           0 :         rChk = nWrPos;
     111           0 :         return true;
     112             :     }
     113           0 :     return false;
     114             : }
     115             : 
     116             : /** Calculate first incorrectly selected area.
     117             : 
     118             :     @param[in,out] rChk starting position of the word to check
     119             :     @param[in,out] rLn  length of the word
     120             : 
     121             :     @return <true> if incorrectly selected area was found, <false> otherwise
     122             :  */
     123        7842 : bool SwWrongList::Check( sal_Int32 &rChk, sal_Int32 &rLn ) const
     124             : {
     125        7842 :     sal_uInt16 nPos = GetWrongPos( rChk );
     126        7842 :     rLn += rChk;
     127             : 
     128        7842 :     if( nPos == Count() )
     129        7828 :         return false;
     130             : 
     131          14 :     sal_Int32 nWrPos = Pos( nPos );
     132          14 :     sal_Int32 nEnd = nWrPos + Len( nPos );
     133          14 :     if( nEnd == rChk )
     134             :     {
     135           4 :         ++nPos;
     136           4 :         if( nPos == Count() )
     137           4 :             return false;
     138             : 
     139           0 :         nWrPos = Pos( nPos );
     140           0 :         nEnd = nWrPos + Len( nPos );
     141             :     }
     142          10 :     if( nEnd > rChk && nWrPos < rLn )
     143             :     {
     144           8 :         if( nWrPos > rChk )
     145           4 :             rChk = nWrPos;
     146           8 :         if( nEnd < rLn )
     147           4 :             rLn = nEnd;
     148           8 :         rLn -= rChk;
     149           8 :         return 0 != rLn;
     150             :     }
     151           2 :     return false;
     152             : }
     153             : 
     154             : /** Find next incorrectly selected position.
     155             : 
     156             :     @param[in] rChk starting position of the word to check
     157             : 
     158             :     @return starting position of incorrectly selected area, <COMPLETE_STRING> otherwise
     159             :  */
     160           0 : sal_Int32 SwWrongList::NextWrong( sal_Int32 nChk ) const
     161             : {
     162           0 :     sal_Int32 nRet = COMPLETE_STRING;
     163           0 :     sal_uInt16 nPos = GetWrongPos( nChk );
     164           0 :     if( nPos < Count() )
     165             :     {
     166           0 :         nRet = Pos( nPos );
     167           0 :         if( nRet < nChk && nRet + Len( nPos ) <= nChk )
     168             :         {
     169           0 :             if( ++nPos < Count() )
     170           0 :                 nRet = Pos( nPos );
     171             :             else
     172           0 :                 nRet = COMPLETE_STRING;
     173             :         }
     174             :     }
     175           0 :     if( nRet > GetBeginInv() && nChk < GetEndInv() )
     176           0 :         nRet = nChk > GetBeginInv() ? nChk : GetBeginInv();
     177           0 :     return nRet;
     178             : }
     179             : 
     180             : /** Find the first position that is greater or equal to the given value.
     181             : 
     182             :     @note Resulting position might be behind the last element of the array.
     183             :     @param[in] nValue value for comparison
     184             : 
     185             :     @return first position that is greater or equal to the given value
     186             :  */
     187       10139 : sal_uInt16 SwWrongList::GetWrongPos( sal_Int32 nValue ) const
     188             : {
     189       10139 :     sal_uInt16 nMax = Count();
     190       10139 :     sal_uInt16 nMin = 0;
     191             : 
     192       10139 :     if( nMax > 0 )
     193             :     {
     194             :         // For smart tag lists, we may not use a binary search. We return the
     195             :         // position of the first smart tag which coveres nValue
     196          24 :         if ( !maList[0].maType.isEmpty() || maList[0].mpSubList )
     197             :         {
     198           0 :             for (std::vector<SwWrongArea>::const_iterator aIter(maList.begin()), aEnd(maList.end()); aIter != aEnd; ++aIter)
     199             :             {
     200           0 :                 const sal_Int32 nSTPos = (*aIter).mnPos;
     201           0 :                 const sal_Int32 nSTLen = (*aIter).mnLen;
     202           0 :                 if ( nSTPos <= nValue && nValue < nSTPos + nSTLen )
     203           0 :                     break;
     204           0 :                 if ( nSTPos > nValue )
     205           0 :                     break;
     206             : 
     207           0 :                 ++nMin;
     208             :             }
     209           0 :             return nMin;
     210             :         }
     211             : 
     212          24 :         --nMax;
     213          24 :         sal_uInt16 nMid = 0;
     214          50 :         while( nMin <= nMax )
     215             :         {
     216          24 :             nMid = nMin + ( nMax - nMin ) / 2;
     217          24 :             const sal_Int32 nTmp = Pos( nMid );
     218          24 :             if( nTmp == nValue )
     219             :             {
     220          12 :                 nMin = nMid;
     221          12 :                 break;
     222             :             }
     223          12 :             else if( nTmp < nValue )
     224             :             {
     225           6 :                 if( nTmp + Len( nMid ) >= nValue )
     226             :                 {
     227           4 :                     nMin = nMid;
     228           4 :                     break;
     229             :                 }
     230           2 :                 nMin = nMid + 1;
     231             :             }
     232           6 :             else if( nMid == 0 )
     233             :             {
     234           6 :                 break;
     235             :             }
     236             :             else
     237           0 :                 nMax = nMid - 1;
     238             :         }
     239             :     }
     240             : 
     241             :     // nMin now points to an index i into the wrong list which
     242             :     // 1. nValue is inside [ Area[i].pos, Area[i].pos + Area[i].len ] (inclusive!!!)
     243             :     // 2. nValue < Area[i].pos
     244             : 
     245       10139 :     return nMin;
     246             : }
     247             : 
     248        1470 : void SwWrongList::_Invalidate( sal_Int32 nBegin, sal_Int32 nEnd )
     249             : {
     250        1470 :     if ( nBegin < GetBeginInv() )
     251           4 :         nBeginInvalid = nBegin;
     252        1470 :     if ( nEnd > GetEndInv() )
     253         764 :         nEndInvalid = nEnd;
     254        1470 : }
     255             : 
     256         920 : void SwWrongList::SetInvalid( sal_Int32 nBegin, sal_Int32 nEnd )
     257             : {
     258         920 :     nBeginInvalid = nBegin;
     259         920 :     nEndInvalid = nEnd;
     260         920 : }
     261             : 
     262             : /** Change all values after the given position.
     263             : 
     264             :    Needed after insert/deletion of characters.
     265             : 
     266             :    @param nPos  position after that everything should be changed
     267             :    @param nDiff amount how much the positions should be moved
     268             :  */
     269        1448 : void SwWrongList::Move( sal_Int32 nPos, sal_Int32 nDiff )
     270             : {
     271        1448 :     sal_uInt16 i = GetWrongPos( nPos );
     272        1448 :     if( nDiff < 0 )
     273             :     {
     274         660 :         const sal_Int32 nEnd = nPos - nDiff;
     275         660 :         sal_uInt16 nLst = i;
     276         660 :         bool bJump = false;
     277        1320 :         while( nLst < Count() && Pos( nLst ) < nEnd )
     278           0 :             ++nLst;
     279         660 :         if( nLst > i )
     280             :         {
     281           0 :             const sal_Int32 nWrPos = Pos( nLst - 1 );
     282           0 :             if ( nWrPos <= nPos )
     283             :             {
     284           0 :                 sal_Int32 nWrLen = Len( nLst - 1 );
     285             :                 // calculate new length of word
     286           0 :                 nWrLen = ( nEnd > nWrPos + nWrLen ) ?
     287             :                         nPos - nWrPos :
     288           0 :                         nWrLen + nDiff;
     289           0 :                 if( nWrLen )
     290             :                 {
     291           0 :                     maList[--nLst].mnLen = nWrLen;
     292           0 :                     bJump = true;
     293             :                 }
     294             :             }
     295             :         }
     296         660 :         Remove( i, nLst - i );
     297             : 
     298         660 :         if ( bJump )
     299           0 :             ++i;
     300         660 :         if( COMPLETE_STRING == GetBeginInv() )
     301           0 :             SetInvalid( nPos ? nPos - 1 : nPos, nPos + 1 );
     302             :         else
     303             :         {
     304         660 :             ShiftLeft( nBeginInvalid, nPos, nEnd );
     305         660 :             ShiftLeft( nEndInvalid, nPos, nEnd );
     306         660 :             _Invalidate( nPos ? nPos - 1 : nPos, nPos + 1 );
     307             :         }
     308             :     }
     309             :     else
     310             :     {
     311         788 :         const sal_Int32 nEnd = nPos + nDiff;
     312         788 :         if( COMPLETE_STRING != GetBeginInv() )
     313             :         {
     314         788 :             if( nBeginInvalid > nPos )
     315           0 :                 nBeginInvalid += nDiff;
     316         788 :             if( nEndInvalid >= nPos )
     317         684 :                 nEndInvalid += nDiff;
     318             :         }
     319             :         // If the pointer is in the middle of a wrong word,
     320             :         // invalidation must happen from the beginning of that word.
     321         788 :         if( i < Count() )
     322             :         {
     323           0 :             const sal_Int32 nWrPos = Pos( i );
     324           0 :             if (nPos >= nWrPos)
     325             :             {
     326           0 :                 Invalidate( nWrPos, nEnd );
     327           0 :                 const sal_Int32 nWrLen = Len( i ) + nDiff;
     328           0 :                 maList[i++].mnLen = nWrLen;
     329           0 :                 Invalidate( nWrPos, nWrPos + nWrLen );
     330             :             }
     331             :         }
     332             :         else
     333         788 :             Invalidate( nPos, nEnd );
     334             :     }
     335        2896 :     while( i < Count() )
     336             :     {
     337           0 :         maList[i++].mnPos += nDiff;
     338             :     }
     339        1448 : }
     340             : 
     341             : // TODO: Complete documentation
     342             : /** Remove given range of entries
     343             : 
     344             :    For a given range [nPos, nPos + nLen[ and an index nIndex, this function
     345             :    basically counts the number of SwWrongArea entries starting with nIndex
     346             :    up to nPos + nLen. All these entries are removed.
     347             : 
     348             :    @param rStart     ???
     349             :    @param rEnd       ???
     350             :    @param nPos       starting position of the range
     351             :    @param nLen       length of the range
     352             :    @param nIndex     index to start lookup at
     353             :    @param nCursorPos ???
     354             : 
     355             :    @return <true> if ???
     356             :  */
     357        1708 : bool SwWrongList::Fresh( sal_Int32 &rStart, sal_Int32 &rEnd, sal_Int32 nPos,
     358             :                              sal_Int32 nLen, sal_uInt16 nIndex, sal_Int32 nCursorPos )
     359             : {
     360             :     // length of word must be greater than 0 and cursor position must be outside the word
     361        1708 :     bool bRet = nLen && ( nCursorPos > nPos + nLen || nCursorPos < nPos );
     362             : 
     363        1708 :     sal_Int32 nWrPos = 0;
     364        1708 :     sal_Int32 nWrEnd = rEnd;
     365        1708 :     sal_uInt16 nCnt = nIndex;
     366        1708 :     if( nCnt < Count() )
     367             :     {
     368           0 :         nWrPos = Pos( nCnt );
     369           0 :         if( nWrPos < nPos && rStart > nWrPos )
     370           0 :             rStart = nWrPos;
     371             :     }
     372             : 
     373        3416 :     while( nCnt < Count() )
     374             :     {
     375           0 :         nWrPos = Pos( nCnt );
     376           0 :         if ( nWrPos >= nPos )
     377           0 :             break;
     378           0 :         nWrEnd = nWrPos + Len( nCnt++ );
     379             :     }
     380             : 
     381        1708 :     if( nCnt < Count() && nWrPos == nPos && Len( nCnt ) == nLen )
     382             :     {
     383           0 :         ++nCnt;
     384           0 :         bRet = true;
     385             :     }
     386             :     else
     387             :     {
     388        1708 :         if( bRet )
     389             :         {
     390          14 :             if( rStart > nPos )
     391          14 :                 rStart = nPos;
     392          14 :             nWrEnd = nPos + nLen;
     393             :         }
     394             :     }
     395             : 
     396        1708 :     nPos += nLen;
     397             : 
     398        1708 :     if( nCnt < Count() )
     399             :     {
     400           0 :         nWrPos = Pos( nCnt );
     401           0 :         if( nWrPos < nPos && rStart > nWrPos )
     402           0 :             rStart = nWrPos;
     403             :     }
     404             : 
     405        3416 :     while( nCnt < Count() )
     406             :     {
     407           0 :         nWrPos = Pos( nCnt );
     408           0 :         if ( nWrPos >= nPos )
     409           0 :             break;
     410           0 :         nWrEnd = nWrPos + Len( nCnt++ );
     411             :     }
     412             : 
     413        1708 :     if( rEnd < nWrEnd )
     414          14 :         rEnd = nWrEnd;
     415             : 
     416        1708 :     Remove( nIndex, nCnt - nIndex );
     417             : 
     418        1708 :     return bRet;
     419             : }
     420             : 
     421         810 : void SwWrongList::Invalidate( sal_Int32 nBegin, sal_Int32 nEnd )
     422             : {
     423         810 :     if (COMPLETE_STRING == GetBeginInv())
     424           0 :         SetInvalid( nBegin, nEnd );
     425             :     else
     426         810 :         _Invalidate( nBegin, nEnd );
     427         810 : }
     428             : 
     429           0 : bool SwWrongList::InvalidateWrong( )
     430             : {
     431           0 :     if( Count() )
     432             :     {
     433           0 :         const sal_Int32 nFirst = Pos( 0 );
     434           0 :         const sal_Int32 nLast = Pos( Count() - 1 ) + Len( Count() - 1 );
     435           0 :         Invalidate( nFirst, nLast );
     436           0 :         return true;
     437             :     }
     438           0 :     return false;
     439             : }
     440             : 
     441           0 : SwWrongList* SwWrongList::SplitList( sal_Int32 nSplitPos )
     442             : {
     443           0 :     SwWrongList *pRet = NULL;
     444           0 :     sal_uInt16 nLst = 0;
     445           0 :     while( nLst < Count() && Pos( nLst ) < nSplitPos )
     446           0 :         ++nLst;
     447           0 :     if( nLst )
     448             :     {
     449           0 :         sal_Int32 nWrPos = Pos( nLst - 1 );
     450           0 :         sal_Int32 nWrLen = Len( nLst - 1 );
     451           0 :         if ( nWrPos+nWrLen > nSplitPos )
     452             :         {
     453           0 :             nWrLen += nWrPos - nSplitPos;
     454           0 :             maList[--nLst].mnPos = nSplitPos;
     455           0 :             maList[nLst].mnLen = nWrLen;
     456             :         }
     457             :     }
     458           0 :     if( nLst )
     459             :     {
     460           0 :         if( WRONGLIST_GRAMMAR == GetWrongListType() )
     461           0 :             pRet = new SwGrammarMarkUp();
     462             :         else
     463           0 :             pRet = new SwWrongList( GetWrongListType() );
     464           0 :         pRet->Insert(0, maList.begin(), ( nLst >= maList.size() ? maList.end() : maList.begin() + nLst ) );
     465           0 :         pRet->SetInvalid( GetBeginInv(), GetEndInv() );
     466           0 :         pRet->_Invalidate( nSplitPos ? nSplitPos - 1 : nSplitPos, nSplitPos );
     467           0 :         Remove( 0, nLst );
     468             :     }
     469           0 :     if( COMPLETE_STRING == GetBeginInv() )
     470           0 :         SetInvalid( 0, 1 );
     471             :     else
     472             :     {
     473           0 :         ShiftLeft( nBeginInvalid, 0, nSplitPos );
     474           0 :         ShiftLeft( nEndInvalid, 0, nSplitPos );
     475           0 :         _Invalidate( 0, 1 );
     476             :     }
     477           0 :     for (nLst = 0; nLst < Count(); ++nLst )
     478             :     {
     479           0 :         maList[nLst].mnPos -= nSplitPos;
     480             :     }
     481           0 :     return pRet;
     482             : }
     483             : 
     484           8 : void SwWrongList::JoinList( SwWrongList* pNext, sal_Int32 nInsertPos )
     485             : {
     486             :     if (pNext)
     487             :     {
     488             :         OSL_ENSURE( GetWrongListType() == pNext->GetWrongListType(), "type mismatch with next list" );
     489             :     }
     490           8 :     if( pNext )
     491             :     {
     492           8 :         sal_uInt16 nCnt = Count();
     493           8 :         pNext->Move( 0, nInsertPos );
     494           8 :         Insert(nCnt, pNext->maList.begin(), pNext->maList.end());
     495             : 
     496           8 :         Invalidate( pNext->GetBeginInv(), pNext->GetEndInv() );
     497           8 :         if( nCnt && Count() > nCnt )
     498             :         {
     499           0 :             sal_Int32 nWrPos = Pos( nCnt );
     500           0 :             sal_Int32 nWrLen = Len( nCnt );
     501           0 :             if( !nWrPos )
     502             :             {
     503           0 :                 nWrPos += nInsertPos;
     504           0 :                 nWrLen -= nInsertPos;
     505           0 :                 maList[nCnt].mnPos = nWrPos;
     506           0 :                 maList[nCnt].mnLen = nWrLen;
     507             :             }
     508           0 :             if( nWrPos == Pos( nCnt - 1 ) + Len( nCnt - 1 ) )
     509             :             {
     510           0 :                 nWrLen += Len( nCnt - 1 );
     511           0 :                 maList[nCnt - 1].mnLen = nWrLen;
     512           0 :                 Remove( nCnt, 1 );
     513             :             }
     514             :         }
     515             :     }
     516           8 :     Invalidate( nInsertPos ? nInsertPos - 1 : nInsertPos, nInsertPos + 1 );
     517           8 : }
     518             : 
     519           0 : void SwWrongList::InsertSubList( sal_Int32 nNewPos, sal_Int32 nNewLen, sal_uInt16 nWhere, SwWrongList* pSubList )
     520             : {
     521             :     if (pSubList)
     522             :     {
     523             :         OSL_ENSURE( GetWrongListType() == pSubList->GetWrongListType(), "type mismatch with sub list" );
     524             :     }
     525           0 :     std::vector<SwWrongArea>::iterator i = maList.begin();
     526           0 :     if ( nWhere >= maList.size() )
     527           0 :         i = maList.end(); // robust
     528             :     else
     529           0 :         i += nWhere;
     530           0 :     maList.insert(i, SwWrongArea( OUString(), 0, nNewPos, nNewLen, pSubList ) );
     531           0 : }
     532             : 
     533             : // New functions: Necessary because SwWrongList has been changed to use std::vector
     534           8 : void SwWrongList::Insert(sal_uInt16 nWhere, std::vector<SwWrongArea>::iterator startPos, std::vector<SwWrongArea>::iterator endPos)
     535             : {
     536           8 :     std::vector<SwWrongArea>::iterator i = maList.begin();
     537           8 :     if ( nWhere >= maList.size() )
     538           8 :         i = maList.end(); // robust
     539             :     else
     540           0 :         i += nWhere;
     541           8 :     maList.insert(i, startPos, endPos); // insert [startPos, endPos[ before i
     542             : 
     543             :     // ownership of the sublist is passed to maList, therefore we have to set the
     544             :     // pSubList-Pointers to 0
     545          16 :     while ( startPos != endPos )
     546             :     {
     547           0 :         (*startPos).mpSubList = 0;
     548           0 :         ++startPos;
     549             :     }
     550           8 : }
     551             : 
     552        2368 : void SwWrongList::Remove(sal_uInt16 nIdx, sal_uInt16 nLen )
     553             : {
     554        4736 :     if ( nIdx >= maList.size() ) return;
     555           0 :     std::vector<SwWrongArea>::iterator i1 = maList.begin();
     556           0 :     i1 += nIdx;
     557             : 
     558           0 :     std::vector<SwWrongArea>::iterator i2 = i1;
     559           0 :     if ( nIdx + nLen >= static_cast<sal_uInt16>(maList.size()) )
     560           0 :         i2 = maList.end(); // robust
     561             :     else
     562           0 :         i2 += nLen;
     563             : 
     564           0 :     std::vector<SwWrongArea>::iterator iLoop = i1;
     565           0 :     while ( iLoop != i2 )
     566             :     {
     567           0 :         if ( (*iLoop).mpSubList )
     568           0 :             delete (*iLoop).mpSubList;
     569           0 :         ++iLoop;
     570             :     }
     571             : 
     572             : #if OSL_DEBUG_LEVEL > 0
     573             :     const int nOldSize = Count();
     574             :     (void) nOldSize;
     575             : #endif
     576             : 
     577           0 :     maList.erase(i1, i2);
     578             : 
     579             : #if OSL_DEBUG_LEVEL > 0
     580             :     OSL_ENSURE( Count() + nLen == nOldSize, "SwWrongList::Remove() trouble" );
     581             : #endif
     582             : }
     583             : 
     584           0 : void SwWrongList::RemoveEntry( sal_Int32 nBegin, sal_Int32 nEnd ) {
     585           0 :     sal_uInt16 nDelPos = 0;
     586           0 :     sal_uInt16 nDel = 0;
     587           0 :     std::vector<SwWrongArea>::const_iterator aIter(maList.begin()), aEnd(maList.end());
     588           0 :     while( aIter != aEnd && (*aIter).mnPos < nBegin )
     589             :     {
     590           0 :         ++aIter;
     591           0 :         ++nDelPos;
     592             :     }
     593           0 :     if( WRONGLIST_GRAMMAR == GetWrongListType() )
     594             :     {
     595           0 :         while( aIter != aEnd && nBegin < nEnd && nEnd > (*aIter).mnPos )
     596             :         {
     597           0 :             ++aIter;
     598           0 :             ++nDel;
     599             :         }
     600             :     }
     601             :     else
     602             :     {
     603           0 :         while( aIter != aEnd && nBegin == (*aIter).mnPos && nEnd == (*aIter).mnPos +(*aIter).mnLen )
     604             :         {
     605           0 :             ++aIter;
     606           0 :             ++nDel;
     607             :         }
     608             :     }
     609           0 :     if( nDel )
     610           0 :         Remove( nDelPos, nDel );
     611           0 : }
     612             : 
     613           0 : bool SwWrongList::LookForEntry( sal_Int32 nBegin, sal_Int32 nEnd ) {
     614           0 :     std::vector<SwWrongArea>::iterator aIter = maList.begin();
     615           0 :     while( aIter != maList.end() && (*aIter).mnPos < nBegin )
     616           0 :         ++aIter;
     617           0 :     if( aIter != maList.end() && nBegin == (*aIter).mnPos && nEnd == (*aIter).mnPos +(*aIter).mnLen )
     618           0 :         return true;
     619           0 :     return false;
     620             : }
     621             : 
     622           0 : void SwWrongList::Insert( const OUString& rType,
     623             :                           com::sun::star::uno::Reference< com::sun::star::container::XStringKeyMap > xPropertyBag,
     624             :                           sal_Int32 nNewPos, sal_Int32 nNewLen )
     625             : {
     626           0 :     std::vector<SwWrongArea>::iterator aIter = maList.begin();
     627             : 
     628           0 :     while ( aIter != maList.end() )
     629             :     {
     630           0 :         const sal_Int32 nSTPos = (*aIter).mnPos;
     631             : 
     632           0 :         if ( nNewPos < nSTPos )
     633             :         {
     634             :             // insert at current position
     635           0 :             break;
     636             :         }
     637           0 :         else if ( nNewPos == nSTPos )
     638             :         {
     639           0 :             while ( aIter != maList.end() && (*aIter).mnPos == nSTPos )
     640             :             {
     641           0 :                 if ( nNewLen < (*aIter).mnLen )
     642             :                 {
     643             :                     // insert at current position
     644           0 :                     break;
     645             :                 }
     646           0 :                 ++aIter;
     647             :             }
     648           0 :             break;
     649             :         }
     650           0 :         ++aIter;
     651             :     }
     652             : 
     653           0 :     maList.insert(aIter, SwWrongArea( rType, meType, xPropertyBag, nNewPos, nNewLen) );
     654           0 : }
     655             : 
     656             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10