[Libreoffice-commits] .: 3 commits - editeng/source

Kohei Yoshida kohei at kemper.freedesktop.org
Wed Mar 28 19:49:55 PDT 2012


 editeng/source/editeng/editdoc.hxx  |   39 +++++++-----
 editeng/source/editeng/editdoc2.cxx |  113 ++++++++++++++++++++++++++++--------
 editeng/source/editeng/editeng.cxx  |   16 ++---
 editeng/source/editeng/editundo.cxx |    1 
 editeng/source/editeng/editview.cxx |    2 
 editeng/source/editeng/impedit.cxx  |    5 -
 editeng/source/editeng/impedit.hxx  |   22 ++++---
 editeng/source/editeng/impedit2.cxx |  105 +++++++++++++++------------------
 editeng/source/editeng/impedit3.cxx |   36 +++++------
 editeng/source/editeng/impedit4.cxx |    4 -
 editeng/source/editeng/impedit5.cxx |    4 -
 11 files changed, 215 insertions(+), 132 deletions(-)

New commits:
commit 175dc9fcc6252177e03486952e867c7bd1f8e9de
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Wed Mar 28 22:49:34 2012 -0400

    pRightPortion no longer used.

diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx
index d7d1fa2..661d2c1 100644
--- a/editeng/source/editeng/impedit2.cxx
+++ b/editeng/source/editeng/impedit2.cxx
@@ -2275,10 +2275,7 @@ EditPaM ImpEditEngine::ImpConnectParagraphs( ContentNode* pLeft, ContentNode* pR
 
     // First search for Portions since pRight is gone after ConnectParagraphs.
     ParaPortion* pLeftPortion = FindParaPortion( pLeft );
-    ParaPortion* pRightPortion = FindParaPortion( pRight );
     OSL_ENSURE( pLeftPortion, "Blind Portion in ImpConnectParagraphs(1)" );
-    OSL_ENSURE( pRightPortion, "Blind Portion in ImpConnectParagraphs(2)" );
-    OSL_ENSURE( nParagraphTobeDeleted == GetParaPortions().GetPos( pRightPortion ), "NodePos != PortionPos?" );
 
     if ( GetStatus().DoOnlineSpelling() )
     {
commit 87d554e97332f418d570d69391c3f2bf95e8cbab
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Wed Mar 28 22:34:57 2012 -0400

    ParaPortionList no longer a child class of DummyParaPortionList.
    
    BTW, whoever originally wrote this code obviously didn't like using
    const keywords.

diff --git a/editeng/source/editeng/editdoc.hxx b/editeng/source/editeng/editdoc.hxx
index 9474ee9..2a78af7 100644
--- a/editeng/source/editeng/editdoc.hxx
+++ b/editeng/source/editeng/editdoc.hxx
@@ -438,7 +438,7 @@ public:
             ~TextPortionList();
 
     void    Reset();
-    sal_uInt16  FindPortion( sal_uInt16 nCharPos, sal_uInt16& rPortionStart, sal_Bool bPreferStartingPortion = sal_False );
+    sal_uInt16  FindPortion( sal_uInt16 nCharPos, sal_uInt16& rPortionStart, sal_Bool bPreferStartingPortion = sal_False ) const;
     sal_uInt16  GetStartPos( sal_uInt16 nPortion );
     void    DeleteFromPortion( sal_uInt16 nDelFrom );
 };
@@ -584,9 +584,10 @@ public:
                         ParaPortion( ContentNode* pNode );
                         ~ParaPortion();
 
-    sal_uInt16              GetLineNumber( sal_uInt16 nIndex );
+    sal_uInt16 GetLineNumber( sal_uInt16 nIndex ) const;
 
     EditLineList&       GetLines()                  { return aLineList; }
+    const EditLineList& GetLines() const { return aLineList; }
 
     sal_Bool                IsInvalid() const           { return bInvalid; }
     sal_Bool                IsSimpleInvalid()   const   { return bSimple; }
@@ -602,7 +603,7 @@ public:
     void                MarkSelectionInvalid( sal_uInt16 nStart, sal_uInt16 nEnd );
 
     void                SetVisible( sal_Bool bVisible );
-    sal_Bool                IsVisible()                 { return bVisible; }
+    bool                IsVisible() const { return bVisible; }
 
     sal_Bool            IsEmpty() { return GetTextPortions().Count() == 1 && GetTextPortions()[0]->GetLen() == 0; }
 
@@ -612,6 +613,7 @@ public:
 
     ContentNode*        GetNode() const             { return pNode; }
     TextPortionList&    GetTextPortions()           { return aTextPortionList; }
+    const TextPortionList& GetTextPortions() const { return aTextPortionList; }
 
     sal_uInt16              GetInvalidPosStart() const  { return nInvalidPosStart; }
     short               GetInvalidDiff() const      { return nInvalidDiff; }
@@ -622,27 +624,37 @@ public:
 #endif
 };
 
-typedef ParaPortion* ParaPortionPtr;
-SV_DECL_PTRARR( DummyParaPortionList, ParaPortionPtr, 0 )
-
 // -------------------------------------------------------------------------
 // class ParaPortionList
 // -------------------------------------------------------------------------
-class ParaPortionList : public DummyParaPortionList
+class ParaPortionList
 {
-    mutable sal_uInt16 nLastCache;
+    mutable size_t nLastCache;
+    boost::ptr_vector<ParaPortion> maPortions;
 public:
                     ParaPortionList();
                     ~ParaPortionList();
 
     void            Reset();
-    long            GetYOffset( ParaPortion* pPPortion );
+    long GetYOffset(const ParaPortion* pPPortion) const;
     sal_uInt16          FindParagraph( long nYOffset );
 
-    inline ParaPortion* SaveGetObject( sal_uInt16 nPos ) const
-        { return ( nPos < Count() ) ? GetObject( nPos ) : 0; }
+    inline const ParaPortion* SaveGetObject(size_t nPos) const
+        { return nPos < maPortions.size() ? &maPortions[nPos] : NULL; }
+
+    inline ParaPortion* SaveGetObject(size_t nPos)
+        { return nPos < maPortions.size() ? &maPortions[nPos] : NULL; }
+
+    sal_uInt16 GetPos(const ParaPortion* p) const;
+    ParaPortion* operator[](size_t nPos);
+    const ParaPortion* operator[](size_t nPos) const;
+
+    ParaPortion* Release(size_t nPos);
+    void Remove(size_t nPos);
+    void Insert(size_t nPos, ParaPortion* p);
+    void Append(ParaPortion* p);
+    size_t Count() const;
 
-    sal_uInt16 GetPos(ParaPortion* p) const;
 #if OSL_DEBUG_LEVEL > 2
     // temporary:
     void            DbgCheck( EditDoc& rDoc );
diff --git a/editeng/source/editeng/editdoc2.cxx b/editeng/source/editeng/editdoc2.cxx
index 51a22f3..52a815a 100644
--- a/editeng/source/editeng/editdoc2.cxx
+++ b/editeng/source/editeng/editdoc2.cxx
@@ -63,6 +63,8 @@
 
 #include <vcl/svapp.hxx>    // For AppWindow...
 
+#include <limits>
+
 DBG_NAME( EE_ParaPortion )
 
 SV_IMPL_VARARR( CharPosArray, sal_Int32 );
@@ -92,7 +94,7 @@ void TextPortionList::DeleteFromPortion( sal_uInt16 nDelFrom )
     Remove( nDelFrom, Count()-nDelFrom );
 }
 
-sal_uInt16 TextPortionList::FindPortion( sal_uInt16 nCharPos, sal_uInt16& nPortionStart, sal_Bool bPreferStartingPortion )
+sal_uInt16 TextPortionList::FindPortion( sal_uInt16 nCharPos, sal_uInt16& nPortionStart, sal_Bool bPreferStartingPortion ) const
 {
     // When nCharPos at portion limit, the left portion is found
     sal_uInt16 nTmpPos = 0;
@@ -227,7 +229,7 @@ void ParaPortion::MarkSelectionInvalid( sal_uInt16 nStart, sal_uInt16 /* nEnd */
     aWritingDirectionInfos.clear();
 }
 
-sal_uInt16 ParaPortion::GetLineNumber( sal_uInt16 nIndex )
+sal_uInt16 ParaPortion::GetLineNumber( sal_uInt16 nIndex ) const
 {
     DBG_ASSERTWARNING( aLineList.Count(), "Empty ParaPortion in GetLine!" );
     DBG_ASSERT( bVisible, "Why GetLine() on an invisible paragraph?" );
@@ -324,6 +326,40 @@ sal_uInt16 FastGetPos(
   return USHRT_MAX;
 }
 
+template<typename _Array, typename _Val>
+size_t FastGetPos(const _Array& rArray, const _Val* p, size_t& rLastPos)
+{
+    size_t nArrayLen = rArray.size();
+
+    // Through certain filter code-paths we do a lot of appends, which in
+    // turn call GetPos - creating some N^2 nightmares. If we have a
+    // non-trivially large list, do a few checks from the end first.
+    if (rLastPos > 16)
+    {
+        size_t nEnd;
+        if (rLastPos > nArrayLen - 2)
+            nEnd = nArrayLen;
+        else
+            nEnd = rLastPos + 2;
+
+        for (size_t nIdx = rLastPos - 2; nIdx < nEnd; ++nIdx)
+        {
+            if (&rArray[nIdx] == p)
+            {
+                rLastPos = nIdx;
+                return nIdx;
+            }
+        }
+    }
+    // The world's lamest linear search from svarray ...
+    for (size_t nIdx = 0; nIdx < nArrayLen; ++nIdx)
+        if (&rArray[nIdx] == p)
+            return rLastPos = nIdx;
+
+    // 0xFFFF is used to signify "not found" condition. We need to change this.
+    return std::numeric_limits<sal_uInt16>::max();
+}
+
 }
 
 ParaPortionList::ParaPortionList() : nLastCache( 0 )
@@ -332,12 +368,46 @@ ParaPortionList::ParaPortionList() : nLastCache( 0 )
 
 ParaPortionList::~ParaPortionList()
 {
-    Reset();
 }
 
-sal_uInt16 ParaPortionList::GetPos(ParaPortion* p) const
+sal_uInt16 ParaPortionList::GetPos(const ParaPortion* p) const
 {
-    return FastGetPos(GetData(), Count(), p, nLastCache);
+    return FastGetPos(maPortions, p, nLastCache);
+}
+
+ParaPortion* ParaPortionList::operator [](size_t nPos)
+{
+    return nPos < maPortions.size() ? &maPortions[nPos] : NULL;
+}
+
+const ParaPortion* ParaPortionList::operator [](size_t nPos) const
+{
+    return nPos < maPortions.size() ? &maPortions[nPos] : NULL;
+}
+
+ParaPortion* ParaPortionList::Release(size_t nPos)
+{
+    return maPortions.release(maPortions.begin()+nPos).release();
+}
+
+void ParaPortionList::Remove(size_t nPos)
+{
+    maPortions.erase(maPortions.begin()+nPos);
+}
+
+void ParaPortionList::Insert(size_t nPos, ParaPortion* p)
+{
+    maPortions.insert(maPortions.begin()+nPos, p);
+}
+
+void ParaPortionList::Append(ParaPortion* p)
+{
+    maPortions.push_back(p);
+}
+
+size_t ParaPortionList::Count() const
+{
+    return maPortions.size();
 }
 
 ContentList::ContentList() : DummyContentList( 0 ), nLastCache(0) {}
@@ -349,17 +419,15 @@ sal_uInt16 ContentList::GetPos(ContentNode* p) const
 
 void ParaPortionList::Reset()
 {
-    for ( sal_uInt16 nPortion = 0; nPortion < Count(); nPortion++ )
-        delete GetObject( nPortion );
-    Remove( 0, Count() );
+    maPortions.clear();
 }
 
-long ParaPortionList::GetYOffset( ParaPortion* pPPortion )
+long ParaPortionList::GetYOffset(const ParaPortion* pPPortion) const
 {
     long nHeight = 0;
-    for ( sal_uInt16 nPortion = 0; nPortion < Count(); nPortion++ )
+    for (size_t i = 0, n = maPortions.size(); i < n; ++i)
     {
-        ParaPortion* pTmpPortion = GetObject(nPortion);
+        const ParaPortion* pTmpPortion = &maPortions[i];
         if ( pTmpPortion == pPPortion )
             return nHeight;
         nHeight += pTmpPortion->GetHeight();
@@ -371,13 +439,13 @@ long ParaPortionList::GetYOffset( ParaPortion* pPPortion )
 sal_uInt16 ParaPortionList::FindParagraph( long nYOffset )
 {
     long nY = 0;
-    for ( sal_uInt16 nPortion = 0; nPortion < Count(); nPortion++ )
+    for (size_t i = 0, n = maPortions.size(); i < n; ++i)
     {
-        nY += GetObject(nPortion)->GetHeight(); // should also be correct even in bVisible!
+        nY += maPortions[i].GetHeight(); // should also be correct even in bVisible!
         if ( nY > nYOffset )
-            return nPortion;
+            return i;
     }
-    return 0xFFFF;  // Should be reachable through EE_PARA_NOT_FOUND!
+    return EE_PARA_NOT_FOUND;
 }
 
 #if OSL_DEBUG_LEVEL > 2
diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx
index 9fcd0a2..8a68f08 100644
--- a/editeng/source/editeng/editeng.cxx
+++ b/editeng/source/editeng/editeng.cxx
@@ -1345,7 +1345,7 @@ void EditEngine::RemoveParagraph( sal_uInt16 nPara )
         return;
 
     ContentNode* pNode = pImpEditEngine->GetEditDoc().SaveGetObject( nPara );
-    ParaPortion* pPortion = pImpEditEngine->GetParaPortions().SaveGetObject( nPara );
+    const ParaPortion* pPortion = pImpEditEngine->GetParaPortions().SaveGetObject( nPara );
     DBG_ASSERT( pPortion && pNode, "Paragraph not found: RemoveParagraph" );
     if ( pNode && pPortion )
     {
@@ -1557,7 +1557,7 @@ void EditEngine::GetPortions( sal_uInt16 nPara, std::vector<sal_uInt16>& rList )
     if ( !pImpEditEngine->IsFormatted() )
         pImpEditEngine->FormatFullDoc();
 
-    ParaPortion* pParaPortion = pImpEditEngine->GetParaPortions().SaveGetObject( nPara );
+    const ParaPortion* pParaPortion = pImpEditEngine->GetParaPortions().SaveGetObject( nPara );
     if ( pParaPortion )
     {
         sal_uInt16 nEnd = 0;
@@ -1639,8 +1639,8 @@ void EditEngine::SetControlWord( sal_uInt32 nWord )
                 for ( sal_uInt16 n = 0; n < nNodes; n++ )
                 {
                     ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( n );
-                    ParaPortion* pPortion = pImpEditEngine->GetParaPortions().GetObject( n );
-                    sal_Bool bWrongs = ( bSpellingChanged || ( nWord & EE_CNTRL_ONLINESPELLING ) ) ? !pNode->GetWrongList()->empty() : sal_False;
+                    const ParaPortion* pPortion = pImpEditEngine->GetParaPortions()[n];
+                    bool bWrongs = ( bSpellingChanged || ( nWord & EE_CNTRL_ONLINESPELLING ) ) ? !pNode->GetWrongList()->empty() : false;
                     if ( bSpellingChanged )
                         pNode->DestroyWrongList();
                     if ( bWrongs )
@@ -1669,13 +1669,13 @@ long EditEngine::GetFirstLineStartX( sal_uInt16 nParagraph )
     DBG_CHKTHIS( EditEngine, 0 );
 
     long nX = 0;
-    ParaPortion* pPPortion = pImpEditEngine->GetParaPortions().SaveGetObject( nParagraph );
+    const ParaPortion* pPPortion = pImpEditEngine->GetParaPortions().SaveGetObject( nParagraph );
     if ( pPPortion )
     {
         DBG_ASSERT( pImpEditEngine->IsFormatted() || !pImpEditEngine->IsFormatting(), "GetFirstLineStartX: Doc not formatted - unable to format!" );
         if ( !pImpEditEngine->IsFormatted() )
             pImpEditEngine->FormatDoc();
-        EditLine* pFirstLine = pPPortion->GetLines()[0];
+        const EditLine* pFirstLine = pPPortion->GetLines()[0];
         nX = pFirstLine->GetStartPosX();
     }
     return nX;
@@ -1695,7 +1695,7 @@ Point EditEngine::GetDocPos( const Point& rPaperPos ) const
 Point EditEngine::GetDocPosTopLeft( sal_uInt16 nParagraph )
 {
     DBG_CHKTHIS( EditEngine, 0 );
-    ParaPortion* pPPortion = pImpEditEngine->GetParaPortions().SaveGetObject( nParagraph );
+    const ParaPortion* pPPortion = pImpEditEngine->GetParaPortions().SaveGetObject( nParagraph );
     DBG_ASSERT( pPPortion, "Paragraph not found: GetWindowPosTopLeft" );
     Point aPoint;
     if ( pPPortion )
@@ -1758,7 +1758,7 @@ sal_Bool EditEngine::IsTextPos( const Point& rPaperPos, sal_uInt16 nBorder )
         EditPaM aPaM = pImpEditEngine->GetPaM( aDocPos, sal_False );
         if ( aPaM.GetNode() )
         {
-            ParaPortion* pParaPortion = pImpEditEngine->FindParaPortion( aPaM.GetNode() );
+            const ParaPortion* pParaPortion = pImpEditEngine->FindParaPortion( aPaM.GetNode() );
             DBG_ASSERT( pParaPortion, "ParaPortion?" );
 
             sal_uInt16 nLine = pParaPortion->GetLineNumber( aPaM.GetIndex() );
diff --git a/editeng/source/editeng/editundo.cxx b/editeng/source/editeng/editundo.cxx
index b59b71a..da8fbfd 100644
--- a/editeng/source/editeng/editundo.cxx
+++ b/editeng/source/editeng/editundo.cxx
@@ -208,7 +208,6 @@ void EditUndoDelContent::Redo()
     pContentNode = _pImpEE->GetEditDoc().SaveGetObject( nNode );
     DBG_ASSERT( pContentNode, "EditUndoDelContent::Redo(): Node?!" );
 
-    delete _pImpEE->GetParaPortions()[nNode];
     _pImpEE->GetParaPortions().Remove( nNode );
 
     // Do not delete node, depends on the undo!
diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx
index b7dfee8..e066f73 100644
--- a/editeng/source/editeng/editview.cxx
+++ b/editeng/source/editeng/editview.cxx
@@ -241,7 +241,7 @@ void EditView::SetSelection( const ESelection& rESel )
     PIMPEE->CheckIdleFormatter();
 
     // Selection may not start/end at an invisible paragraph:
-    ParaPortion* pPortion = PIMPEE->FindParaPortion( aNewSelection.Min().GetNode() );
+    const ParaPortion* pPortion = PIMPEE->FindParaPortion( aNewSelection.Min().GetNode() );
     if ( !pPortion->IsVisible() )
     {
         pPortion = PIMPEE->GetPrevVisPortion( pPortion );
diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx
index f63ab6a..811e96e 100644
--- a/editeng/source/editeng/impedit.cxx
+++ b/editeng/source/editeng/impedit.cxx
@@ -650,7 +650,8 @@ void ImpEditView::ShowCursor( sal_Bool bGotoCursor, sal_Bool bForceVisCursor, sa
     sal_uInt16 nPara = pEditEngine->pImpEditEngine->aEditDoc.GetPos( aPaM.GetNode() );
     if (nPara == USHRT_MAX) // #i94322
         return;
-    ParaPortion* pParaPortion = pEditEngine->pImpEditEngine->GetParaPortions().GetObject( nPara );
+
+    const ParaPortion* pParaPortion = pEditEngine->pImpEditEngine->GetParaPortions()[nPara];
 
     nShowCursorFlags |= nExtraCursorFlags;
 
@@ -1218,7 +1219,7 @@ sal_Bool ImpEditView::IsBulletArea( const Point& rPos, sal_uInt16* pPara )
         sal_uInt16 nPara = pEditEngine->pImpEditEngine->aEditDoc.GetPos( aPaM.GetNode() );
         Rectangle aBulletArea = pEditEngine->GetBulletArea( nPara );
         long nY = pEditEngine->GetDocPosTopLeft( nPara ).Y();
-        ParaPortion* pParaPortion = pEditEngine->pImpEditEngine->GetParaPortions().GetObject( nPara );
+        const ParaPortion* pParaPortion = pEditEngine->pImpEditEngine->GetParaPortions()[nPara];
         nY += pParaPortion->GetFirstLineOffset();
         if ( ( aDocPos.Y() > ( nY + aBulletArea.Top() ) ) &&
              ( aDocPos.Y() < ( nY + aBulletArea.Bottom() ) ) &&
diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx
index 5196703..3d4aaa0 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -536,10 +536,10 @@ private:
     EditPaM             GetPaM( Point aDocPos, sal_Bool bSmart = sal_True );
     EditPaM             GetPaM( ParaPortion* pPortion, Point aPos, sal_Bool bSmart = sal_True );
     long                GetXPos( ParaPortion* pParaPortion, EditLine* pLine, sal_uInt16 nIndex, sal_Bool bPreferPortionStart = sal_False );
-    long                GetPortionXOffset( ParaPortion* pParaPortion, EditLine* pLine, sal_uInt16 nTextPortion );
-    sal_uInt16              GetChar( ParaPortion* pParaPortion, EditLine* pLine, long nX, sal_Bool bSmart = sal_True );
+    long GetPortionXOffset(const ParaPortion* pParaPortion, EditLine* pLine, sal_uInt16 nTextPortion);
+    sal_uInt16 GetChar(const ParaPortion* pParaPortion, EditLine* pLine, long nX, bool bSmart = true);
     Range               GetInvalidYOffsets( ParaPortion* pPortion );
-    Range               GetLineXPosStartEnd( ParaPortion* pParaPortion, EditLine* pLine );
+    Range               GetLineXPosStartEnd( const ParaPortion* pParaPortion, EditLine* pLine ) const;
 
     void                SetParaAttrib( sal_uInt8 nFunc, EditSelection aSel, sal_uInt16 nValue );
     sal_uInt16          GetParaAttrib( sal_uInt8 nFunc, EditSelection aSel );
@@ -654,8 +654,8 @@ private:
     ContentNode*        GetPrevVisNode( ContentNode* pCurNode );
     ContentNode*        GetNextVisNode( ContentNode* pCurNode );
 
-    ParaPortion*        GetPrevVisPortion( ParaPortion* pCurPortion );
-    ParaPortion*        GetNextVisPortion( ParaPortion* pCurPortion );
+    const ParaPortion*  GetPrevVisPortion( const ParaPortion* pCurPortion ) const;
+    const ParaPortion*  GetNextVisPortion( const ParaPortion* pCurPortion ) const;
 
     void                SetBackgroundColor( const Color& rColor ) { maBackgroundColor = rColor; }
     Color               GetBackgroundColor() const { return maBackgroundColor; }
@@ -678,7 +678,8 @@ private:
 
     void                CheckIdleFormatter();
 
-    inline ParaPortion* FindParaPortion( ContentNode* pNode ) const;
+    inline const ParaPortion* FindParaPortion( ContentNode* pNode ) const;
+    inline ParaPortion* FindParaPortion( ContentNode* pNode );
 
     ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > CreateTransferable( const EditSelection& rSelection ) const;
 
@@ -1091,7 +1092,14 @@ inline EditUndoManager& ImpEditEngine::GetUndoManager()
     return *pUndoManager;
 }
 
-inline ParaPortion* ImpEditEngine::FindParaPortion( ContentNode* pNode ) const
+inline const ParaPortion* ImpEditEngine::FindParaPortion( ContentNode* pNode ) const
+{
+    sal_uInt16 nPos = aEditDoc.GetPos( pNode );
+    DBG_ASSERT( nPos < GetParaPortions().Count(), "Portionloser Node?" );
+    return GetParaPortions()[ nPos ];
+}
+
+inline ParaPortion* ImpEditEngine::FindParaPortion( ContentNode* pNode )
 {
     sal_uInt16 nPos = aEditDoc.GetPos( pNode );
     DBG_ASSERT( nPos < GetParaPortions().Count(), "Portionloser Node?" );
diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx
index 8d0c04c..d7d1fa2 100644
--- a/editeng/source/editeng/impedit2.cxx
+++ b/editeng/source/editeng/impedit2.cxx
@@ -256,7 +256,7 @@ void ImpEditEngine::InitDoc( sal_Bool bKeepParaAttribs )
     GetParaPortions().Reset();
 
     ParaPortion* pIniPortion = new ParaPortion( aEditDoc[0] );
-    GetParaPortions().Insert( pIniPortion, 0 );
+    GetParaPortions().Insert(0, pIniPortion);
 
     bFormatted = sal_False;
 
@@ -1319,7 +1319,7 @@ EditPaM ImpEditEngine::CursorUp( const EditPaM& rPaM, EditView* pView )
     }
     else    // previous paragraph
     {
-        ParaPortion* pPrevPortion = GetPrevVisPortion( pPPortion );
+        const ParaPortion* pPrevPortion = GetPrevVisPortion( pPPortion );
         if ( pPrevPortion )
         {
             pLine = pPrevPortion->GetLines().GetObject( pPrevPortion->GetLines().Count()-1 );
@@ -1361,7 +1361,7 @@ EditPaM ImpEditEngine::CursorDown( const EditPaM& rPaM, EditView* pView )
     }
     else    // next paragraph
     {
-        ParaPortion* pNextPortion = GetNextVisPortion( pPPortion );
+        const ParaPortion* pNextPortion = GetNextVisPortion( pPPortion );
         if ( pNextPortion )
         {
             EditLine* pLine = pNextPortion->GetLines().GetObject(0);
@@ -1815,12 +1815,12 @@ sal_uInt16 ImpEditEngine::GetScriptType( const EditPaM& rPaM, sal_uInt16* pEndPo
 
     if ( rPaM.GetNode()->Len() )
     {
-         sal_uInt16 nPara = GetEditDoc().GetPos( rPaM.GetNode() );
-        ParaPortion* pParaPortion = GetParaPortions().SaveGetObject( nPara );
+        sal_uInt16 nPara = GetEditDoc().GetPos( rPaM.GetNode() );
+        const ParaPortion* pParaPortion = GetParaPortions().SaveGetObject( nPara );
         if ( pParaPortion->aScriptInfos.empty() )
             ((ImpEditEngine*)this)->InitScriptTypes( nPara );
 
-        ScriptTypePosInfos& rTypes = pParaPortion->aScriptInfos;
+        const ScriptTypePosInfos& rTypes = pParaPortion->aScriptInfos;
         sal_uInt16 nPos = rPaM.GetIndex();
         for ( size_t n = 0; n < rTypes.size(); n++ )
         {
@@ -1848,11 +1848,11 @@ sal_uInt16 ImpEditEngine::GetScriptType( const EditSelection& rSel ) const
 
     for ( sal_uInt16 nPara = nStartPara; nPara <= nEndPara; nPara++ )
     {
-        ParaPortion* pParaPortion = GetParaPortions().SaveGetObject( nPara );
+        const ParaPortion* pParaPortion = GetParaPortions().SaveGetObject( nPara );
         if ( pParaPortion->aScriptInfos.empty() )
             ((ImpEditEngine*)this)->InitScriptTypes( nPara );
 
-        ScriptTypePosInfos& rTypes = pParaPortion->aScriptInfos;
+        const ScriptTypePosInfos& rTypes = pParaPortion->aScriptInfos;
 
         // find the first(!) script type position that holds the
         // complete selection. Thus it will work for selections as
@@ -1884,22 +1884,22 @@ sal_uInt16 ImpEditEngine::GetScriptType( const EditSelection& rSel ) const
 
 sal_Bool ImpEditEngine::IsScriptChange( const EditPaM& rPaM ) const
 {
-    sal_Bool bScriptChange = sal_False;
+    bool bScriptChange = false;
 
     if ( rPaM.GetNode()->Len() )
     {
         sal_uInt16 nPara = GetEditDoc().GetPos( rPaM.GetNode() );
-        ParaPortion* pParaPortion = GetParaPortions().SaveGetObject( nPara );
+        const ParaPortion* pParaPortion = GetParaPortions().SaveGetObject( nPara );
         if ( pParaPortion->aScriptInfos.empty() )
             ((ImpEditEngine*)this)->InitScriptTypes( nPara );
 
-        ScriptTypePosInfos& rTypes = pParaPortion->aScriptInfos;
+        const ScriptTypePosInfos& rTypes = pParaPortion->aScriptInfos;
         sal_uInt16 nPos = rPaM.GetIndex();
         for ( size_t n = 0; n < rTypes.size(); n++ )
         {
             if ( rTypes[n].nStartPos == nPos )
                {
-                bScriptChange = sal_True;
+                bScriptChange = true;
                 break;
             }
         }
@@ -1909,17 +1909,17 @@ sal_Bool ImpEditEngine::IsScriptChange( const EditPaM& rPaM ) const
 
 sal_Bool ImpEditEngine::HasScriptType( sal_uInt16 nPara, sal_uInt16 nType ) const
 {
-    sal_Bool bTypeFound = sal_False;
+    bool bTypeFound = false;
 
-    ParaPortion* pParaPortion = GetParaPortions().SaveGetObject( nPara );
+    const ParaPortion* pParaPortion = GetParaPortions().SaveGetObject( nPara );
     if ( pParaPortion->aScriptInfos.empty() )
         ((ImpEditEngine*)this)->InitScriptTypes( nPara );
 
-    ScriptTypePosInfos& rTypes = pParaPortion->aScriptInfos;
+    const ScriptTypePosInfos& rTypes = pParaPortion->aScriptInfos;
     for ( size_t n = rTypes.size(); n && !bTypeFound; )
     {
         if ( rTypes[--n].nScriptType == nType )
-                bTypeFound = sal_True;
+                bTypeFound = true;
     }
     return bTypeFound;
 }
@@ -2142,10 +2142,10 @@ EditSelection ImpEditEngine::ImpMoveParagraphs( Range aOldPositions, sal_uInt16
         return aSelection;
     }
 
-    sal_uLong nParaCount = GetParaPortions().Count();
+    size_t nParaCount = GetParaPortions().Count();
 
     if ( nNewPos >= nParaCount )
-        nNewPos = GetParaPortions().Count();
+        nNewPos = nParaCount;
 
     // Height may change when moving first or last Paragraph
     ParaPortion* pRecalc1 = NULL;
@@ -2155,26 +2155,25 @@ EditSelection ImpEditEngine::ImpMoveParagraphs( Range aOldPositions, sal_uInt16
 
     if ( nNewPos == 0 ) // Move to Start
     {
-        pRecalc1 = GetParaPortions().GetObject( 0 );
-        pRecalc2 = GetParaPortions().GetObject( (sal_uInt16)aOldPositions.Min() );
+        pRecalc1 = GetParaPortions()[0];
+        pRecalc2 = GetParaPortions()[aOldPositions.Min()];
 
     }
     else if ( nNewPos == nParaCount )
     {
-        pRecalc1 = GetParaPortions().GetObject( (sal_uInt16)(nParaCount-1) );
-        pRecalc2 = GetParaPortions().GetObject( (sal_uInt16)aOldPositions.Max() );
+        pRecalc1 = GetParaPortions()[nParaCount-1];
+        pRecalc2 = GetParaPortions()[aOldPositions.Max()];
     }
 
     if ( aOldPositions.Min() == 0 ) // Move from Start
     {
-        pRecalc3 = GetParaPortions().GetObject( 0 );
-        pRecalc4 = GetParaPortions().GetObject(
-            sal::static_int_cast< sal_uInt16 >( aOldPositions.Max()+1 ) );
+        pRecalc3 = GetParaPortions()[0];
+        pRecalc4 = GetParaPortions()[aOldPositions.Max()+1];
     }
     else if ( (sal_uInt16)aOldPositions.Max() == (nParaCount-1) )
     {
-        pRecalc3 = GetParaPortions().GetObject( (sal_uInt16)aOldPositions.Max() );
-        pRecalc4 = GetParaPortions().GetObject( (sal_uInt16)(aOldPositions.Min()-1) );
+        pRecalc3 = GetParaPortions()[aOldPositions.Max()];
+        pRecalc4 = GetParaPortions()[aOldPositions.Min()-1];
     }
 
     MoveParagraphsInfo aMoveParagraphsInfo( sal::static_int_cast< sal_uInt16 >(aOldPositions.Min()), sal::static_int_cast< sal_uInt16 >(aOldPositions.Max()), nNewPos );
@@ -2187,22 +2186,20 @@ EditSelection ImpEditEngine::ImpMoveParagraphs( Range aOldPositions, sal_uInt16
     ParaPortion* pDestPortion = GetParaPortions().SaveGetObject( nNewPos );
 
     ParaPortionList aTmpPortionList;
-    sal_uInt16 i;
-    for ( i = (sal_uInt16)aOldPositions.Min(); i <= (sal_uInt16)aOldPositions.Max(); i++  )
+    for (sal_uInt16 i = (sal_uInt16)aOldPositions.Min(); i <= (sal_uInt16)aOldPositions.Max(); i++  )
     {
         // always aOldPositions.Min(), since Remove().
-        ParaPortion* pTmpPortion = GetParaPortions().GetObject( (sal_uInt16)aOldPositions.Min() );
-        GetParaPortions().Remove( (sal_uInt16)aOldPositions.Min() );
+        ParaPortion* pTmpPortion = GetParaPortions().Release(aOldPositions.Min());
         aEditDoc.Remove( (sal_uInt16)aOldPositions.Min() );
-        aTmpPortionList.Insert( pTmpPortion, aTmpPortionList.Count() );
+        aTmpPortionList.Append(pTmpPortion);
     }
 
     sal_uInt16 nRealNewPos = pDestPortion ? GetParaPortions().GetPos( pDestPortion ) : GetParaPortions().Count();
     OSL_ENSURE( nRealNewPos != USHRT_MAX, "ImpMoveParagraphs: Invalid Position!" );
 
-    for ( i = 0; i < (sal_uInt16)aTmpPortionList.Count(); i++  )
+    for (size_t i = 0; i < aTmpPortionList.Count(); ++i)
     {
-        ParaPortion* pTmpPortion = aTmpPortionList.GetObject( i );
+        ParaPortion* pTmpPortion = aTmpPortionList[i];
         if ( i == 0 )
             aSelection.Min().SetNode( pTmpPortion->GetNode() );
 
@@ -2212,7 +2209,7 @@ EditSelection ImpEditEngine::ImpMoveParagraphs( Range aOldPositions, sal_uInt16
         ContentNode* pN = pTmpPortion->GetNode();
         aEditDoc.Insert( pN, nRealNewPos+i );
 
-        GetParaPortions().Insert( pTmpPortion, nRealNewPos+i );
+        GetParaPortions().Insert(nRealNewPos+i, pTmpPortion);
     }
 
     aEndMovingParagraphsHdl.Call( &aMoveParagraphsInfo );
@@ -2238,7 +2235,7 @@ EditSelection ImpEditEngine::ImpMoveParagraphs( Range aOldPositions, sal_uInt16
     if ( pRecalc4 )
         CalcHeight( pRecalc4 );
 
-    aTmpPortionList.Remove( 0, aTmpPortionList.Count() );   // important !
+    aTmpPortionList.Reset();
 
 #if OSL_DEBUG_LEVEL > 2
     GetParaPortions().DbgCheck(aEditDoc);
@@ -2307,7 +2304,6 @@ EditPaM ImpEditEngine::ImpConnectParagraphs( ContentNode* pLeft, ContentNode* pR
 
     EditPaM aPaM = aEditDoc.ConnectParagraphs( pLeft, pRight );
     GetParaPortions().Remove( nParagraphTobeDeleted );
-    delete pRightPortion;
 
     pLeftPortion->MarkSelectionInvalid( aPaM.GetIndex(), pLeft->Len() );
 
@@ -2319,7 +2315,7 @@ EditPaM ImpEditEngine::ImpConnectParagraphs( ContentNode* pLeft, ContentNode* pR
         // the change of the total text hight too late...
         for ( sal_uInt16 n = nParagraphTobeDeleted; n < GetParaPortions().Count(); n++ )
         {
-            ParaPortion* pPP = GetParaPortions().GetObject( n );
+            ParaPortion* pPP = GetParaPortions()[n];
             pPP->MarkSelectionInvalid( 0, pPP->GetNode()->Len() );
             pPP->GetLines().Reset();
         }
@@ -2889,7 +2885,7 @@ EditPaM ImpEditEngine::ImpInsertParaBreak( const EditPaM& rPaM, sal_Bool bKeepEn
     // Here, as in undo, but also in all other methods.
     sal_uInt16 nPos = GetParaPortions().GetPos( pPortion );
     ParaPortion* pNewPortion = new ParaPortion( aPaM.GetNode() );
-    GetParaPortions().Insert( pNewPortion, nPos + 1 );
+    GetParaPortions().Insert(nPos+1, pNewPortion);
     ParaAttribsChanged( pNewPortion->GetNode() );
     if ( IsCallParaInsertedOrDeleted() )
         GetEditEnginePtr()->ParagraphInserted( nPos+1 );
@@ -2922,7 +2918,7 @@ EditPaM ImpEditEngine::ImpFastInsertParagraph( sal_uInt16 nPara )
     aEditDoc.Insert( pNode, nPara );
 
     ParaPortion* pNewPortion = new ParaPortion( pNode );
-    GetParaPortions().Insert( pNewPortion, nPara );
+    GetParaPortions().Insert(nPara, pNewPortion);
     if ( IsCallParaInsertedOrDeleted() )
         GetEditEnginePtr()->ParagraphInserted( nPara );
 
@@ -3002,7 +2998,7 @@ sal_Bool ImpEditEngine::UpdateFields()
         if ( bChangesInPara )
         {
             // If possible be more precise when invalidate.
-            ParaPortion* pPortion = GetParaPortions().GetObject( nPara );
+            ParaPortion* pPortion = GetParaPortions()[nPara];
             OSL_ENSURE( pPortion, "NULL-Pointer in Doc" );
             pPortion->MarkSelectionInvalid( 0, pNode->Len() );
         }
@@ -3027,7 +3023,7 @@ Rectangle ImpEditEngine::PaMtoEditCursor( EditPaM aPaM, sal_uInt16 nFlags )
     long nY = 0;
     for ( sal_uInt16 nPortion = 0; nPortion < GetParaPortions().Count(); nPortion++ )
     {
-        ParaPortion* pPortion = GetParaPortions().GetObject(nPortion);
+        ParaPortion* pPortion = GetParaPortions()[nPortion];
         ContentNode* pNode = pPortion->GetNode();
         OSL_ENSURE( pNode, "Invalid Node in Portion!" );
         if ( pNode != aPaM.GetNode() )
@@ -3056,7 +3052,7 @@ EditPaM ImpEditEngine::GetPaM( Point aDocPos, sal_Bool bSmart )
     sal_uInt16 nPortion;
     for ( nPortion = 0; nPortion < GetParaPortions().Count(); nPortion++ )
     {
-        ParaPortion* pPortion = GetParaPortions().GetObject(nPortion);
+        ParaPortion* pPortion = GetParaPortions()[nPortion];
         nTmpHeight = pPortion->GetHeight();     // should also be correct for !bVisible!
         nY += nTmpHeight;
         if ( nY > aDocPos.Y() )
@@ -3111,7 +3107,7 @@ sal_uInt32 ImpEditEngine::CalcTextWidth( sal_Bool bIgnoreExtraSpace )
     sal_uInt16 nParas = GetParaPortions().Count();
     for ( sal_uInt16 nPara = 0; nPara < nParas; nPara++ )
     {
-        ParaPortion* pPortion = GetParaPortions().GetObject( nPara );
+        ParaPortion* pPortion = GetParaPortions()[nPara];
         if ( pPortion->IsVisible() )
         {
             const SvxLRSpaceItem& rLRItem = GetLRSpaceItem( pPortion->GetNode() );
@@ -3224,7 +3220,7 @@ sal_uInt32 ImpEditEngine::CalcTextHeight( sal_uInt32* pHeightNTP )
     sal_uInt32 nPH;
     sal_uInt32 nEmptyHeight = 0;
     for ( sal_uInt16 nPortion = 0; nPortion < GetParaPortions().Count(); nPortion++ ) {
-        ParaPortionPtr pPortion = GetParaPortions()[nPortion];
+        ParaPortion* pPortion = GetParaPortions()[nPortion];
         nPH = pPortion->GetHeight();
         nY += nPH;
         if( pHeightNTP ) {
@@ -3244,7 +3240,7 @@ sal_uInt32 ImpEditEngine::CalcTextHeight( sal_uInt32* pHeightNTP )
 sal_uInt16 ImpEditEngine::GetLineCount( sal_uInt16 nParagraph ) const
 {
     OSL_ENSURE( nParagraph < GetParaPortions().Count(), "GetLineCount: Out of range" );
-    ParaPortion* pPPortion = GetParaPortions().SaveGetObject( nParagraph );
+    const ParaPortion* pPPortion = GetParaPortions().SaveGetObject( nParagraph );
     OSL_ENSURE( pPPortion, "Paragraph not found: GetLineCount" );
     if ( pPPortion )
         return pPPortion->GetLines().Count();
@@ -3255,7 +3251,7 @@ sal_uInt16 ImpEditEngine::GetLineCount( sal_uInt16 nParagraph ) const
 xub_StrLen ImpEditEngine::GetLineLen( sal_uInt16 nParagraph, sal_uInt16 nLine ) const
 {
     OSL_ENSURE( nParagraph < GetParaPortions().Count(), "GetLineLen: Out of range" );
-    ParaPortion* pPPortion = GetParaPortions().SaveGetObject( nParagraph );
+    const ParaPortion* pPPortion = GetParaPortions().SaveGetObject( nParagraph );
     OSL_ENSURE( pPPortion, "Paragraph not found: GetLineLen" );
     if ( pPPortion && ( nLine < pPPortion->GetLines().Count() ) )
     {
@@ -3270,7 +3266,7 @@ xub_StrLen ImpEditEngine::GetLineLen( sal_uInt16 nParagraph, sal_uInt16 nLine )
 void ImpEditEngine::GetLineBoundaries( /*out*/sal_uInt16 &rStart, /*out*/sal_uInt16 &rEnd, sal_uInt16 nParagraph, sal_uInt16 nLine ) const
 {
     OSL_ENSURE( nParagraph < GetParaPortions().Count(), "GetLineCount: Out of range" );
-    ParaPortion* pPPortion = GetParaPortions().SaveGetObject( nParagraph );
+    const ParaPortion* pPPortion = GetParaPortions().SaveGetObject( nParagraph );
     OSL_ENSURE( pPPortion, "Paragraph not found: GetLineBoundaries" );
     rStart = rEnd = 0xFFFF;     // default values in case of error
     if ( pPPortion && ( nLine < pPPortion->GetLines().Count() ) )
@@ -3362,7 +3358,7 @@ void ImpEditEngine::UpdateSelections()
                 if ( !pPPortion ) // Last paragraph
                 {
                     nPara = GetParaPortions().Count()-1;
-                    pPPortion = GetParaPortions().GetObject( nPara );
+                    pPPortion = GetParaPortions()[nPara];
                 }
                 OSL_ENSURE( pPPortion, "Empty Document in UpdateSelections ?" );
                 // Do not end up from a hidden paragraph:
@@ -3726,7 +3722,8 @@ EditPaM ImpEditEngine::GetPaM( ParaPortion* pPortion, Point aDocPos, sal_Bool bS
     return aPaM;
 }
 
-sal_uInt16 ImpEditEngine::GetChar( ParaPortion* pParaPortion, EditLine* pLine, long nXPos, sal_Bool bSmart )
+sal_uInt16 ImpEditEngine::GetChar(
+    const ParaPortion* pParaPortion, EditLine* pLine, long nXPos, bool bSmart)
 {
     OSL_ENSURE( pLine, "No line received: GetChar" );
 
@@ -3836,7 +3833,7 @@ sal_uInt16 ImpEditEngine::GetChar( ParaPortion* pParaPortion, EditLine* pLine, l
     return nChar;
 }
 
-Range ImpEditEngine::GetLineXPosStartEnd( ParaPortion* pParaPortion, EditLine* pLine )
+Range ImpEditEngine::GetLineXPosStartEnd( const ParaPortion* pParaPortion, EditLine* pLine ) const
 {
     Range aLineXPosStartEnd;
 
@@ -3856,7 +3853,8 @@ Range ImpEditEngine::GetLineXPosStartEnd( ParaPortion* pParaPortion, EditLine* p
     return aLineXPosStartEnd;
 }
 
-long ImpEditEngine::GetPortionXOffset( ParaPortion* pParaPortion, EditLine* pLine, sal_uInt16 nTextPortion )
+long ImpEditEngine::GetPortionXOffset(
+    const ParaPortion* pParaPortion, EditLine* pLine, sal_uInt16 nTextPortion)
 {
     long nX = pLine->GetStartPosX();
 
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
index 110d5fb..507c700 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -389,7 +389,7 @@ void ImpEditEngine::FormatDoc()
     aInvalidRec = Rectangle();  // make empty
     for ( sal_uInt16 nPara = 0; nPara < GetParaPortions().Count(); nPara++ )
     {
-        ParaPortion* pParaPortion = GetParaPortions().GetObject( nPara );
+        ParaPortion* pParaPortion = GetParaPortions()[nPara];
         if ( pParaPortion->MustRepaint() || ( pParaPortion->IsInvalid() && pParaPortion->IsVisible() ) )
         {
             if ( pParaPortion->IsInvalid() )
@@ -410,7 +410,7 @@ void ImpEditEngine::FormatDoc()
                     // For a change in height all below must be reformatted ...
                     for ( sal_uInt16 n = nPara+1; n < GetParaPortions().Count(); n++ )
                     {
-                        ParaPortion* pPP = GetParaPortions().GetObject( n );
+                        ParaPortion* pPP = GetParaPortions()[n];
                         pPP->MarkSelectionInvalid( 0, pPP->GetNode()->Len() );
                         pPP->GetLines().Reset();
                     }
@@ -546,7 +546,7 @@ void ImpEditEngine::CheckAutoPageSize()
             {
                 // Only paragraphs which are not aligned to the left need to be
                 // reformatted, the height can not be changed here anymore.
-                ParaPortion* pParaPortion = GetParaPortions().GetObject( nPara );
+                ParaPortion* pParaPortion = GetParaPortions()[nPara];
                 ContentNode* pNode = pParaPortion->GetNode();
                 SvxAdjust eJustification = GetJustification( nPara );
                 if ( eJustification != SVX_ADJUST_LEFT )
@@ -587,7 +587,7 @@ static sal_Int32 ImplCalculateFontIndependentLineSpacing( const sal_Int32 nFontH
 
 sal_Bool ImpEditEngine::CreateLines( sal_uInt16 nPara, sal_uInt32 nStartPosY )
 {
-    ParaPortion* pParaPortion = GetParaPortions().GetObject( nPara );
+    ParaPortion* pParaPortion = GetParaPortions()[nPara];
 
     // sal_Bool: Changes in the height of paragraph Yes / No - sal_True/sal_False
     DBG_ASSERT( pParaPortion->GetNode(), "Portion without Node in CreateLines" );
@@ -2471,7 +2471,7 @@ void ImpEditEngine::SetTextRanger( TextRanger* pRanger )
 
         for ( sal_uInt16 nPara = 0; nPara < GetParaPortions().Count(); nPara++ )
         {
-            ParaPortion* pParaPortion = GetParaPortions().GetObject( nPara );
+            ParaPortion* pParaPortion = GetParaPortions()[nPara];
             pParaPortion->MarkSelectionInvalid( 0, pParaPortion->GetNode()->Len() );
             pParaPortion->GetLines().Reset();
         }
@@ -2479,7 +2479,7 @@ void ImpEditEngine::SetTextRanger( TextRanger* pRanger )
         FormatFullDoc();
         UpdateViews( GetActiveView() );
         if ( GetUpdateMode() && GetActiveView() )
-            pActiveView->ShowCursor( sal_False, sal_False );
+            pActiveView->ShowCursor(false, false);
     }
 }
 
@@ -2839,7 +2839,7 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, Rectangle aClipRec, Point aSta
     // --------------------------------------------------
     for ( sal_uInt16 n = 0; n < GetParaPortions().Count(); n++ )
     {
-        ParaPortion* pPortion = GetParaPortions().GetObject( n );
+        const ParaPortion* pPortion = GetParaPortions()[n];
         DBG_ASSERT( pPortion, "NULL-Pointer in TokenList in Paint" );
         // if when typing idle formatting,  asynchronous Paint.
         // Invisible Portions may be invalid.
@@ -3719,7 +3719,7 @@ void ImpEditEngine::InsertContent( ContentNode* pNode, sal_uInt16 nPos )
     DBG_ASSERT( pNode, "NULL-Pointer in InsertContent! " );
     DBG_ASSERT( IsInUndo(), "InsertContent only for Undo()!" );
     ParaPortion* pNew = new ParaPortion( pNode );
-    GetParaPortions().Insert( pNew, nPos );
+    GetParaPortions().Insert(nPos, pNew);
     aEditDoc.Insert( pNode, nPos );
     if ( IsCallParaInsertedOrDeleted() )
         GetEditEnginePtr()->ParagraphInserted( nPos );
@@ -3861,12 +3861,12 @@ void ImpEditEngine::InvalidateFromParagraph( sal_uInt16 nFirstInvPara )
     ParaPortion* pTmpPortion;
     if ( nFirstInvPara != 0 )
     {
-        pTmpPortion = GetParaPortions().GetObject( nFirstInvPara-1 );
+        pTmpPortion = GetParaPortions()[nFirstInvPara-1];
         pTmpPortion->MarkInvalid( pTmpPortion->GetNode()->Len(), 0 );
     }
     else
     {
-        pTmpPortion = GetParaPortions().GetObject( 0 );
+        pTmpPortion = GetParaPortions()[0];
         pTmpPortion->MarkSelectionInvalid( 0, pTmpPortion->GetNode()->Len() );
     }
     pTmpPortion->ResetHeight();
@@ -3894,7 +3894,7 @@ void ImpEditEngine::CallStatusHdl()
 
 ContentNode* ImpEditEngine::GetPrevVisNode( ContentNode* pCurNode )
 {
-    ParaPortion* pPortion = FindParaPortion( pCurNode );
+    const ParaPortion* pPortion = FindParaPortion( pCurNode );
     DBG_ASSERT( pPortion, "GetPrevVisibleNode: No matching portion!" );
     pPortion = GetPrevVisPortion( pPortion );
     if ( pPortion )
@@ -3904,7 +3904,7 @@ ContentNode* ImpEditEngine::GetPrevVisNode( ContentNode* pCurNode )
 
 ContentNode* ImpEditEngine::GetNextVisNode( ContentNode* pCurNode )
 {
-    ParaPortion* pPortion = FindParaPortion( pCurNode );
+    const ParaPortion* pPortion = FindParaPortion( pCurNode );
     DBG_ASSERT( pPortion, "GetNextVisibleNode: No matching portion!" );
     pPortion = GetNextVisPortion( pPortion );
     if ( pPortion )
@@ -3912,22 +3912,22 @@ ContentNode* ImpEditEngine::GetNextVisNode( ContentNode* pCurNode )
     return 0;
 }
 
-ParaPortion* ImpEditEngine::GetPrevVisPortion( ParaPortion* pCurPortion )
+const ParaPortion* ImpEditEngine::GetPrevVisPortion( const ParaPortion* pCurPortion ) const
 {
     sal_uInt16 nPara = GetParaPortions().GetPos( pCurPortion );
     DBG_ASSERT( nPara < GetParaPortions().Count() , "Portion not found: GetPrevVisPortion" );
-    ParaPortion* pPortion = nPara ? GetParaPortions()[--nPara] : 0;
+    const ParaPortion* pPortion = nPara ? GetParaPortions()[--nPara] : 0;
     while ( pPortion && !pPortion->IsVisible() )
         pPortion = nPara ? GetParaPortions()[--nPara] : 0;
 
     return pPortion;
 }
 
-ParaPortion* ImpEditEngine::GetNextVisPortion( ParaPortion* pCurPortion )
+const ParaPortion* ImpEditEngine::GetNextVisPortion( const ParaPortion* pCurPortion ) const
 {
     sal_uInt16 nPara = GetParaPortions().GetPos( pCurPortion );
     DBG_ASSERT( nPara < GetParaPortions().Count() , "Portion not found: GetPrevVisNode" );
-    ParaPortion* pPortion = GetParaPortions().SaveGetObject( ++nPara );
+    const ParaPortion* pPortion = GetParaPortions().SaveGetObject( ++nPara );
     while ( pPortion && !pPortion->IsVisible() )
         pPortion = GetParaPortions().SaveGetObject( ++nPara );
 
@@ -3947,7 +3947,7 @@ long ImpEditEngine::CalcVertLineSpacing(Point& rStartPos) const
             // All paragraphs must have the block justification set.
             return 0;
 
-        ParaPortion* pPortion = rParaPortions.GetObject(i);
+        const ParaPortion* pPortion = rParaPortions[i];
         nTotalOccupiedHeight += pPortion->GetFirstLineOffset();
 
         const SvxLineSpacingItem& rLSItem = (const SvxLineSpacingItem&)pPortion->GetNode()->GetContentAttribs().GetItem(EE_PARA_SBL);
@@ -3957,7 +3957,7 @@ long ImpEditEngine::CalcVertLineSpacing(Point& rStartPos) const
         const SvxULSpaceItem& rULItem = (const SvxULSpaceItem&)pPortion->GetNode()->GetContentAttribs().GetItem(EE_PARA_ULSPACE);
         long nUL = GetYValue( rULItem.GetLower() );
 
-        EditLineList& rLines = pPortion->GetLines();
+        const EditLineList& rLines = pPortion->GetLines();
         sal_uInt16 nLineCount = rLines.Count();
         nTotalLineCount += nLineCount;
         for (sal_uInt16 j = 0; j < nLineCount; ++j)
diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx
index 405a4d0..4bce12f 100644
--- a/editeng/source/editeng/impedit4.cxx
+++ b/editeng/source/editeng/impedit4.cxx
@@ -1062,7 +1062,7 @@ EditTextObject* ImpEditEngine::CreateBinTextObject( EditSelection aSel, SfxItemP
 
         if ( bOnlyFullParagraphs )
         {
-            ParaPortion* pParaPortion = GetParaPortions()[nNode];
+            const ParaPortion* pParaPortion = GetParaPortions()[nNode];
             nTextPortions += pParaPortion->GetTextPortions().Count();
         }
 
@@ -1138,7 +1138,7 @@ EditTextObject* ImpEditEngine::CreateBinTextObject( EditSelection aSel, SfxItemP
         pTxtObj->SetPortionInfo( pXList );
         for ( nNode = nStartNode; nNode <= nEndNode; nNode++  )
         {
-            ParaPortion* pParaPortion = GetParaPortions()[nNode];
+            const ParaPortion* pParaPortion = GetParaPortions()[nNode];
             XParaPortion* pX = new XParaPortion;
             pXList->Insert( pX, pXList->Count() );
 
diff --git a/editeng/source/editeng/impedit5.cxx b/editeng/source/editeng/impedit5.cxx
index b59ad86..2401d2c 100644
--- a/editeng/source/editeng/impedit5.cxx
+++ b/editeng/source/editeng/impedit5.cxx
@@ -527,7 +527,7 @@ void ImpEditEngine::SetAttribs( EditSelection aSel, const SfxItemSet& rSet, sal_
         sal_Bool bCharAttribFound = sal_False;
 
         ContentNode* pNode = aEditDoc.GetObject( nNode );
-        ParaPortion* pPortion = GetParaPortions().GetObject( nNode );
+        ParaPortion* pPortion = GetParaPortions()[nNode];
 
         DBG_ASSERT( aEditDoc.SaveGetObject( nNode ), "Node not founden: SetAttribs" );
         DBG_ASSERT( GetParaPortions().GetObject( nNode ), "Portion not found: SetAttribs" );
@@ -614,7 +614,7 @@ void ImpEditEngine::RemoveCharAttribs( EditSelection aSel, sal_Bool bRemoveParaA
     for ( sal_uInt16 nNode = nStartNode; nNode <= nEndNode; nNode++ )
     {
         ContentNode* pNode = aEditDoc.GetObject( nNode );
-        ParaPortion* pPortion = GetParaPortions().GetObject( nNode );
+        ParaPortion* pPortion = GetParaPortions()[nNode];
 
         DBG_ASSERT( aEditDoc.SaveGetObject( nNode ), "Node not found: SetAttribs" );
         DBG_ASSERT( GetParaPortions().SaveGetObject( nNode ), "Portion not found: SetAttribs" );
commit cc7bacc506d3613ad45b0443df1151eb92b1f9b4
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Wed Mar 28 15:49:47 2012 -0400

    template over 3 different types of casts all in one line.

diff --git a/editeng/source/editeng/editdoc.hxx b/editeng/source/editeng/editdoc.hxx
index 7f760f3..9474ee9 100644
--- a/editeng/source/editeng/editdoc.hxx
+++ b/editeng/source/editeng/editdoc.hxx
@@ -298,8 +298,7 @@ SV_DECL_PTRARR( DummyContentList, ContentNodePtr, 0 )
 
 class ContentList : public DummyContentList
 {
-    sal_uInt16 nLastCache;
-
+    mutable sal_uInt16 nLastCache;
 public:
     ContentList();
     sal_uInt16 GetPos(ContentNode* p) const;
@@ -631,7 +630,7 @@ SV_DECL_PTRARR( DummyParaPortionList, ParaPortionPtr, 0 )
 // -------------------------------------------------------------------------
 class ParaPortionList : public DummyParaPortionList
 {
-    sal_uInt16 nLastCache;
+    mutable sal_uInt16 nLastCache;
 public:
                     ParaPortionList();
                     ~ParaPortionList();
@@ -643,7 +642,7 @@ public:
     inline ParaPortion* SaveGetObject( sal_uInt16 nPos ) const
         { return ( nPos < Count() ) ? GetObject( nPos ) : 0; }
 
-    sal_uInt16                  GetPos( const ParaPortionPtr &rPtr ) const;
+    sal_uInt16 GetPos(ParaPortion* p) const;
 #if OSL_DEBUG_LEVEL > 2
     // temporary:
     void            DbgCheck( EditDoc& rDoc );
diff --git a/editeng/source/editeng/editdoc2.cxx b/editeng/source/editeng/editdoc2.cxx
index 68da6aa..51a22f3 100644
--- a/editeng/source/editeng/editdoc2.cxx
+++ b/editeng/source/editeng/editdoc2.cxx
@@ -291,8 +291,11 @@ void ParaPortion::CorrectValuesBehindLastFormattedLine( sal_uInt16 nLastFormatte
 
 // Shared reverse lookup acceleration pieces ...
 
-static sal_uInt16 FastGetPos( const VoidPtr *pPtrArray, sal_uInt16 nPtrArrayLen,
-                          VoidPtr pPtr, sal_uInt16 &rLastPos )
+namespace {
+
+template<typename T>
+sal_uInt16 FastGetPos(
+    T const* pPtrArray, sal_uInt16 nPtrArrayLen, T pPtr, sal_uInt16 &rLastPos)
 {
   // Through certain filter code-paths we do a lot of appends, which in
   // turn call GetPos - creating some N^2 nightmares. If we have a
@@ -321,6 +324,8 @@ static sal_uInt16 FastGetPos( const VoidPtr *pPtrArray, sal_uInt16 nPtrArrayLen,
   return USHRT_MAX;
 }
 
+}
+
 ParaPortionList::ParaPortionList() : nLastCache( 0 )
 {
 }
@@ -330,20 +335,16 @@ ParaPortionList::~ParaPortionList()
     Reset();
 }
 
-sal_uInt16 ParaPortionList::GetPos( const ParaPortionPtr &rPtr ) const
+sal_uInt16 ParaPortionList::GetPos(ParaPortion* p) const
 {
-    return FastGetPos( reinterpret_cast<const VoidPtr *>( GetData() ),
-                       Count(), static_cast<VoidPtr>( rPtr ),
-                       ((ParaPortionList *)this)->nLastCache );
+    return FastGetPos(GetData(), Count(), p, nLastCache);
 }
 
 ContentList::ContentList() : DummyContentList( 0 ), nLastCache(0) {}
 
 sal_uInt16 ContentList::GetPos(ContentNode* p) const
 {
-    return FastGetPos( reinterpret_cast<const VoidPtr *>( GetData() ),
-                       Count(), static_cast<VoidPtr>(p),
-                       ((ContentList *)this)->nLastCache );
+    return FastGetPos(GetData(), Count(), p, nLastCache);
 }
 
 void ParaPortionList::Reset()


More information about the Libreoffice-commits mailing list