[Libreoffice-commits] core.git: editeng/source include/editeng sd/source

Noel Grandin noel.grandin at collabora.co.uk
Thu Oct 13 11:19:26 UTC 2016


 editeng/source/outliner/outliner.cxx |   49 ++++++++++++-----------------------
 editeng/source/outliner/outlundo.cxx |    5 +--
 editeng/source/outliner/outlvw.cxx   |   13 +++------
 include/editeng/outliner.hxx         |   33 +++++++++++------------
 sd/source/ui/func/fuinsfil.cxx       |   12 ++++----
 sd/source/ui/inc/OutlineView.hxx     |    6 ++--
 sd/source/ui/inc/View.hxx            |    4 +-
 sd/source/ui/view/outlview.cxx       |   33 +++++++++++------------
 sd/source/ui/view/sdview.cxx         |   14 ++++------
 9 files changed, 74 insertions(+), 95 deletions(-)

New commits:
commit 17ec3b96dee28b148773aa1715634171deaa0297
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date:   Thu Oct 13 10:45:45 2016 +0200

    pass params to Outliner LINK callbacks on stack
    
    instead of yuck..cough... on itself, which is horribly vulnerable to re-
    entrancy
    
    Change-Id: I8f3d6d39ee50fd36b56b431978cf6c2499c375a6
    Reviewed-on: https://gerrit.libreoffice.org/29756
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx
index f385cee..3bf1486 100644
--- a/editeng/source/outliner/outliner.cxx
+++ b/editeng/source/outliner/outliner.cxx
@@ -89,10 +89,9 @@ Paragraph* Outliner::Insert(const OUString& rText, sal_Int32 nAbsPos, sal_Int16
         if( pPara->GetDepth() != nDepth )
         {
             nDepthChangedHdlPrevDepth = pPara->GetDepth();
-            mnDepthChangeHdlPrevFlags = pPara->nFlags;
+            ParaFlag nPrevFlags = pPara->nFlags;
             pPara->SetDepth( nDepth );
-            pHdlParagraph = pPara;
-            DepthChangedHdl();
+            DepthChangedHdl(pPara, nPrevFlags);
         }
         pPara->nFlags |= ParaFlag::HOLDDEPTH;
         SetText( rText, pPara );
@@ -107,8 +106,7 @@ Paragraph* Outliner::Insert(const OUString& rText, sal_Int32 nAbsPos, sal_Int16
         pEditEngine->InsertParagraph( nAbsPos, OUString() );
         DBG_ASSERT(pPara==pParaList->GetParagraph(nAbsPos),"Insert:Failed");
         ImplInitDepth( nAbsPos, nDepth, false );
-        pHdlParagraph = pPara;
-        ParagraphInsertedHdl();
+        ParagraphInsertedHdl(pPara);
         pPara->nFlags |= ParaFlag::HOLDDEPTH;
         SetText( rText, pPara );
         ImplBlockInsertionCallbacks( false );
@@ -151,8 +149,7 @@ void Outliner::ParagraphInserted( sal_Int32 nPara )
         if( !pEditEngine->IsInUndo() )
         {
             ImplCalcBulletText( nPara, true, false );
-            pHdlParagraph = pPara;
-            ParagraphInsertedHdl();
+            ParagraphInsertedHdl(pPara);
         }
     }
 }
@@ -171,8 +168,7 @@ void Outliner::ParagraphDeleted( sal_Int32 nPara )
 
     if( !pEditEngine->IsInUndo() )
     {
-        pHdlParagraph = pPara;
-        ParagraphRemovingHdl();
+        ParagraphRemovingHdl(pPara);
     }
 
     pParaList->Remove( nPara );
@@ -253,8 +249,7 @@ void Outliner::SetDepth( Paragraph* pPara, sal_Int16 nNewDepth )
     if ( nNewDepth != pPara->GetDepth() )
     {
         nDepthChangedHdlPrevDepth = pPara->GetDepth();
-        mnDepthChangeHdlPrevFlags = pPara->nFlags;
-        pHdlParagraph = pPara;
+        ParaFlag nPrevFlags = pPara->nFlags;
 
         sal_Int32 nPara = GetAbsPos( pPara );
         ImplInitDepth( nPara, nNewDepth, true );
@@ -263,7 +258,7 @@ void Outliner::SetDepth( Paragraph* pPara, sal_Int16 nNewDepth )
         if ( ImplGetOutlinerMode() == OutlinerMode::OutlineObject )
             ImplSetLevelDependendStyleSheet( nPara );
 
-        DepthChangedHdl();
+        DepthChangedHdl(pPara, nPrevFlags);
     }
 }
 
@@ -472,8 +467,7 @@ void Outliner::SetText( const OUString& rText, Paragraph* pPara )
             {
                 pParaList->Insert( pPara, nInsPos );
                 pEditEngine->InsertParagraph( nInsPos, aStr );
-                pHdlParagraph = pPara;
-                ParagraphInsertedHdl();
+                ParagraphInsertedHdl(pPara);
             }
             else
             {
@@ -777,7 +771,6 @@ bool Outliner::Expand( Paragraph* pPara )
             pUndo->pParas = nullptr;
             pUndo->nCount = pParaList->GetAbsPos( pPara );
         }
-        pHdlParagraph = pPara;
         pParaList->Expand( pPara );
         InvalidateBullet(pParaList->GetAbsPos(pPara));
         if( bUndo )
@@ -807,7 +800,6 @@ bool Outliner::Collapse( Paragraph* pPara )
             pUndo->nCount = pParaList->GetAbsPos( pPara );
         }
 
-        pHdlParagraph = pPara;
         pParaList->Collapse( pPara );
         InvalidateBullet(pParaList->GetAbsPos(pPara));
         if( bUndo )
@@ -1185,17 +1177,15 @@ void Outliner::ImpTextPasted( sal_Int32 nStartPara, sal_Int32 nCount )
         if( ImplGetOutlinerMode() != OutlinerMode::TextObject )
         {
             nDepthChangedHdlPrevDepth = pPara->GetDepth();
-            mnDepthChangeHdlPrevFlags = pPara->nFlags;
+            ParaFlag nPrevFlags = pPara->nFlags;
 
             ImpConvertEdtToOut( nStartPara );
 
-            pHdlParagraph = pPara;
-
             if( nStartPara == nStart )
             {
                 // the existing paragraph has changed depth or flags
-                if( (pPara->GetDepth() != nDepthChangedHdlPrevDepth) || (pPara->nFlags != mnDepthChangeHdlPrevFlags) )
-                    DepthChangedHdl();
+                if( (pPara->GetDepth() != nDepthChangedHdlPrevDepth) || (pPara->nFlags != nPrevFlags) )
+                    DepthChangedHdl(pPara, nPrevFlags);
             }
         }
         else // EditEngine mode
@@ -1254,10 +1244,8 @@ bool Outliner::ImpCanDeleteSelectedPages( OutlinerView* pCurView )
 }
 
 Outliner::Outliner(SfxItemPool* pPool, OutlinerMode nMode)
-    : pHdlParagraph(nullptr)
-    , mnFirstSelPage(0)
+    : mnFirstSelPage(0)
     , nDepthChangedHdlPrevDepth(0)
-    , mnDepthChangeHdlPrevFlags(ParaFlag::NONE)
     , nMaxDepth(9)
     , nMinDepth(-1)
     , nFirstPage(1)
@@ -1351,24 +1339,24 @@ size_t Outliner::GetViewCount() const
     return aViewList.size();
 }
 
-void Outliner::ParagraphInsertedHdl()
+void Outliner::ParagraphInsertedHdl(Paragraph* pPara)
 {
     if( !IsInUndo() )
-        aParaInsertedHdl.Call( this );
+        aParaInsertedHdl.Call( { this, pPara } );
 }
 
 
-void Outliner::ParagraphRemovingHdl()
+void Outliner::ParagraphRemovingHdl(Paragraph* pPara)
 {
     if( !IsInUndo() )
-        aParaRemovingHdl.Call( this );
+        aParaRemovingHdl.Call( { this, pPara } );
 }
 
 
-void Outliner::DepthChangedHdl()
+void Outliner::DepthChangedHdl(Paragraph* pPara, ParaFlag nPrevFlags)
 {
     if( !IsInUndo() )
-        aDepthChangedHdl.Call( this );
+        aDepthChangedHdl.Call( { this, pPara, nPrevFlags } );
 }
 
 
@@ -1744,7 +1732,6 @@ bool Outliner::ImpCanDeleteSelectedPages( OutlinerView* pCurView, sal_Int32 _nFi
 
     nDepthChangedHdlPrevDepth = nPages;
     mnFirstSelPage = _nFirstPage;
-    pHdlParagraph = nullptr;
     return RemovingPagesHdl( pCurView );
 }
 
diff --git a/editeng/source/outliner/outlundo.cxx b/editeng/source/outliner/outlundo.cxx
index a1475b5..ab55e3a 100644
--- a/editeng/source/outliner/outlundo.cxx
+++ b/editeng/source/outliner/outlundo.cxx
@@ -62,11 +62,10 @@ void OutlinerUndoChangeParaFlags::ImplChangeFlags( ParaFlag nFlags )
     if( pPara )
     {
         pOutliner->nDepthChangedHdlPrevDepth = pPara->GetDepth();
-        pOutliner->mnDepthChangeHdlPrevFlags = pPara->nFlags;
-        pOutliner->pHdlParagraph = pPara;
+        ParaFlag nPrevFlags = pPara->nFlags;
 
         pPara->nFlags = nFlags;
-        pOutliner->DepthChangedHdl();
+        pOutliner->DepthChangedHdl(pPara, nPrevFlags);
     }
 }
 
diff --git a/editeng/source/outliner/outlvw.cxx b/editeng/source/outliner/outlvw.cxx
index 2665497..9d2a82b 100644
--- a/editeng/source/outliner/outlvw.cxx
+++ b/editeng/source/outliner/outlvw.cxx
@@ -468,19 +468,18 @@ void OutlinerView::Indent( short nDiff )
             {
                             // Notify App
                 pOwner->nDepthChangedHdlPrevDepth = nOldDepth;
-                pOwner->mnDepthChangeHdlPrevFlags = pPara->nFlags;
-                pOwner->pHdlParagraph = pPara;
+                ParaFlag nPrevFlags = pPara->nFlags;
 
                 if( bPage )
                     pPara->RemoveFlag( ParaFlag::ISPAGE );
                 else
                     pPara->SetFlag( ParaFlag::ISPAGE );
 
-                pOwner->DepthChangedHdl();
+                pOwner->DepthChangedHdl(pPara, nPrevFlags);
                 pOwner->pEditEngine->QuickMarkInvalid( ESelection( nPara, 0, nPara, 0 ) );
 
                 if( bUndo )
-                    pOwner->InsertUndo( new OutlinerUndoChangeParaFlags( pOwner, nPara, pOwner->mnDepthChangeHdlPrevFlags, pPara->nFlags ) );
+                    pOwner->InsertUndo( new OutlinerUndoChangeParaFlags( pOwner, nPara, nPrevFlags, pPara->nFlags ) );
 
                 continue;
             }
@@ -532,8 +531,7 @@ void OutlinerView::Indent( short nDiff )
             }
 
             pOwner->nDepthChangedHdlPrevDepth = nOldDepth;
-            pOwner->mnDepthChangeHdlPrevFlags = pPara->nFlags;
-            pOwner->pHdlParagraph = pPara;
+            ParaFlag nPrevFlags = pPara->nFlags;
 
             pOwner->ImplInitDepth( nPara, nNewDepth, true );
             pOwner->ImplCalcBulletText( nPara, false, false );
@@ -542,7 +540,7 @@ void OutlinerView::Indent( short nDiff )
                 pOwner->ImplSetLevelDependendStyleSheet( nPara );
 
             // Notify App
-            pOwner->DepthChangedHdl();
+            pOwner->DepthChangedHdl(pPara, nPrevFlags);
         }
         else
         {
@@ -816,7 +814,6 @@ sal_Int32 OutlinerView::ImpCalcSelectedPages( bool bIncludeFirstSelected )
     if( nPages )
     {
         pOwner->nDepthChangedHdlPrevDepth = nPages;
-        pOwner->pHdlParagraph = nullptr;
         pOwner->mnFirstSelPage = nFirstPage;
     }
 
diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx
index 7290b66..bfe11fc 100644
--- a/include/editeng/outliner.hxx
+++ b/include/editeng/outliner.hxx
@@ -582,6 +582,10 @@ namespace o3tl
 
 class EDITENG_DLLPUBLIC Outliner : public SfxBroadcaster
 {
+public:
+    struct ParagraphHdlParam { Outliner* pOutliner; Paragraph* pPara; };
+    struct DepthChangeHdlParam { Outliner* pOutliner; Paragraph* pPara; ParaFlag nPrevFlags; };
+private:
     friend class OutlinerView;
     friend class OutlinerEditEng;
     friend class OutlinerParaObject;
@@ -597,13 +601,12 @@ class EDITENG_DLLPUBLIC Outliner : public SfxBroadcaster
     ParagraphList*      pParaList;
     ViewList            aViewList;
 
-    Paragraph*          pHdlParagraph;
     sal_Int32           mnFirstSelPage;
     Link<DrawPortionInfo*,void> aDrawPortionHdl;
     Link<DrawBulletInfo*,void>     aDrawBulletHdl;
-    Link<Outliner*,void>           aParaInsertedHdl;
-    Link<Outliner*,void>           aParaRemovingHdl;
-    Link<Outliner*,void>           aDepthChangedHdl;
+    Link<ParagraphHdlParam,void>   aParaInsertedHdl;
+    Link<ParagraphHdlParam,void>   aParaRemovingHdl;
+    Link<DepthChangeHdlParam,void> aDepthChangedHdl;
     Link<Outliner*,void>           aBeginMovingHdl;
     Link<Outliner*,void>           aEndMovingHdl;
     Link<OutlinerView*,bool>       aIndentingPagesHdl;
@@ -615,7 +618,6 @@ class EDITENG_DLLPUBLIC Outliner : public SfxBroadcaster
     Link<PasteOrDropInfos*,void>   maEndPasteOrDropHdl;
 
     sal_Int32           nDepthChangedHdlPrevDepth;
-    ParaFlag            mnDepthChangeHdlPrevFlags;
     sal_Int16           nMaxDepth;
     const sal_Int16     nMinDepth;
     sal_Int32           nFirstPage;
@@ -757,15 +759,13 @@ public:
     void            ClearModifyFlag();
     bool            IsModified() const;
 
-    Paragraph*      GetHdlParagraph() const { return pHdlParagraph; }
-
-    void            ParagraphInsertedHdl();
-    void            SetParaInsertedHdl(const Link<Outliner*,void>& rLink){aParaInsertedHdl=rLink;}
-    const Link<Outliner*,void>& GetParaInsertedHdl() const { return aParaInsertedHdl; }
+    void            ParagraphInsertedHdl(Paragraph*);
+    void            SetParaInsertedHdl(const Link<ParagraphHdlParam,void>& rLink){aParaInsertedHdl=rLink;}
+    const Link<ParagraphHdlParam,void>& GetParaInsertedHdl() const { return aParaInsertedHdl; }
 
-    void            ParagraphRemovingHdl();
-    void            SetParaRemovingHdl(const Link<Outliner*,void>& rLink){aParaRemovingHdl=rLink;}
-    const Link<Outliner*,void>& GetParaRemovingHdl() const { return aParaRemovingHdl; }
+    void            ParagraphRemovingHdl(Paragraph*);
+    void            SetParaRemovingHdl(const Link<ParagraphHdlParam,void>& rLink){aParaRemovingHdl=rLink;}
+    const Link<ParagraphHdlParam,void>& GetParaRemovingHdl() const { return aParaRemovingHdl; }
 
     NonOverflowingText *GetNonOverflowingText() const;
     OverflowingText *GetOverflowingText() const;
@@ -775,11 +775,10 @@ public:
     OutlinerParaObject *GetEmptyParaObject() const;
 
 
-    void            DepthChangedHdl();
-    void            SetDepthChangedHdl(const Link<Outliner*,void>& rLink){aDepthChangedHdl=rLink;}
-    const Link<Outliner*,void>& GetDepthChangedHdl() const { return aDepthChangedHdl; }
+    void            DepthChangedHdl(Paragraph*, ParaFlag nPrevFlags);
+    void            SetDepthChangedHdl(const Link<DepthChangeHdlParam,void>& rLink){aDepthChangedHdl=rLink;}
+    const Link<DepthChangeHdlParam,void>& GetDepthChangedHdl() const { return aDepthChangedHdl; }
     sal_Int16       GetPrevDepth() const { return static_cast<sal_Int16>(nDepthChangedHdlPrevDepth); }
-    ParaFlag        GetPrevFlags() const { return mnDepthChangeHdlPrevFlags; }
 
     bool            RemovingPagesHdl( OutlinerView* );
     void            SetRemovingPagesHdl(const Link<OutlinerView*,bool>& rLink){aRemovingPagesHdl=rLink;}
diff --git a/sd/source/ui/func/fuinsfil.cxx b/sd/source/ui/func/fuinsfil.cxx
index e634c92..993fc6b 100644
--- a/sd/source/ui/func/fuinsfil.cxx
+++ b/sd/source/ui/func/fuinsfil.cxx
@@ -688,12 +688,12 @@ bool FuInsertFile::InsSDDinOlMode(SfxMedium* pMedium)
         ::Outliner* pOutliner = pOlView->GetViewByWindow(mpWindow)->GetOutliner();
 
         // cut notification links temporarily
-        Link<::Outliner*,void> aOldParagraphInsertedHdl = pOutliner->GetParaInsertedHdl();
-        pOutliner->SetParaInsertedHdl( Link<::Outliner*,void>());
-        Link<::Outliner*,void> aOldParagraphRemovingHdl = pOutliner->GetParaRemovingHdl();
-        pOutliner->SetParaRemovingHdl( Link<::Outliner*,void>());
-        Link<::Outliner*,void> aOldDepthChangedHdl = pOutliner->GetDepthChangedHdl();
-        pOutliner->SetDepthChangedHdl( Link<::Outliner*,void>());
+        Link<Outliner::ParagraphHdlParam,void> aOldParagraphInsertedHdl = pOutliner->GetParaInsertedHdl();
+        pOutliner->SetParaInsertedHdl( Link<Outliner::ParagraphHdlParam,void>());
+        Link<Outliner::ParagraphHdlParam,void> aOldParagraphRemovingHdl = pOutliner->GetParaRemovingHdl();
+        pOutliner->SetParaRemovingHdl( Link<Outliner::ParagraphHdlParam,void>());
+        Link<Outliner::DepthChangeHdlParam,void> aOldDepthChangedHdl = pOutliner->GetDepthChangedHdl();
+        pOutliner->SetDepthChangedHdl( Link<::Outliner::DepthChangeHdlParam,void>());
         Link<::Outliner*,void> aOldBeginMovingHdl = pOutliner->GetBeginMovingHdl();
         pOutliner->SetBeginMovingHdl( Link<::Outliner*,void>());
         Link<::Outliner*,void> aOldEndMovingHdl = pOutliner->GetEndMovingHdl();
diff --git a/sd/source/ui/inc/OutlineView.hxx b/sd/source/ui/inc/OutlineView.hxx
index ddbf768..75e5282 100644
--- a/sd/source/ui/inc/OutlineView.hxx
+++ b/sd/source/ui/inc/OutlineView.hxx
@@ -95,9 +95,9 @@ public:
     void Paint (const Rectangle& rRect, ::sd::Window* pWin);
 
                     // Callbacks fuer LINKs
-    DECL_LINK( ParagraphInsertedHdl, ::Outliner *, void );
-    DECL_LINK( ParagraphRemovingHdl, ::Outliner *, void );
-    DECL_LINK( DepthChangedHdl, ::Outliner *, void );
+    DECL_LINK( ParagraphInsertedHdl, ::Outliner::ParagraphHdlParam, void );
+    DECL_LINK( ParagraphRemovingHdl, ::Outliner::ParagraphHdlParam, void );
+    DECL_LINK( DepthChangedHdl, ::Outliner::DepthChangeHdlParam, void );
     DECL_LINK( StatusEventHdl, EditStatus&, void );
     DECL_LINK( BeginMovingHdl, ::Outliner *, void );
     DECL_LINK( EndMovingHdl, ::Outliner *, void );
diff --git a/sd/source/ui/inc/View.hxx b/sd/source/ui/inc/View.hxx
index 126432f..512c4fb 100644
--- a/sd/source/ui/inc/View.hxx
+++ b/sd/source/ui/inc/View.hxx
@@ -229,8 +229,8 @@ public:
     SdrObject* GetSelectedSingleObject(SdPage* pPage);
 
 protected:
-    DECL_LINK( OnParagraphInsertedHdl, ::Outliner *, void );
-    DECL_LINK( OnParagraphRemovingHdl, ::Outliner *, void );
+    DECL_LINK( OnParagraphInsertedHdl, ::Outliner::ParagraphHdlParam, void );
+    DECL_LINK( OnParagraphRemovingHdl, ::Outliner::ParagraphHdlParam, void );
 
     virtual void OnBeginPasteOrDrop( PasteOrDropInfos* pInfo ) override;
     virtual void OnEndPasteOrDrop( PasteOrDropInfos* pInfo ) override;
diff --git a/sd/source/ui/view/outlview.cxx b/sd/source/ui/view/outlview.cxx
index 3288f7f..5f3c957 100644
--- a/sd/source/ui/view/outlview.cxx
+++ b/sd/source/ui/view/outlview.cxx
@@ -358,7 +358,7 @@ Paragraph* OutlineView::GetNextTitle(const Paragraph* pPara)
 /**
  * Handler for inserting pages (paragraphs)
  */
-IMPL_LINK( OutlineView, ParagraphInsertedHdl, ::Outliner *, pOutliner, void )
+IMPL_LINK( OutlineView, ParagraphInsertedHdl, Outliner::ParagraphHdlParam, aParam, void )
 {
     // we get calls to this handler during binary insert of drag and drop contents but
     // we ignore it here and handle it later in OnEndPasteOrDrop()
@@ -366,17 +366,15 @@ IMPL_LINK( OutlineView, ParagraphInsertedHdl, ::Outliner *, pOutliner, void )
     {
         OutlineViewPageChangesGuard aGuard(this);
 
-        Paragraph* pPara = pOutliner->GetHdlParagraph();
-
-        sal_Int32 nAbsPos = mrOutliner.GetAbsPos( pPara );
+        sal_Int32 nAbsPos = mrOutliner.GetAbsPos( aParam.pPara );
 
         UpdateParagraph( nAbsPos );
 
         if( (nAbsPos == 0) ||
-            ::Outliner::HasParaFlag(pPara,ParaFlag::ISPAGE) ||
+            ::Outliner::HasParaFlag(aParam.pPara, ParaFlag::ISPAGE) ||
             ::Outliner::HasParaFlag(mrOutliner.GetParagraph( nAbsPos-1 ), ParaFlag::ISPAGE) )
         {
-            InsertSlideForParagraph( pPara );
+            InsertSlideForParagraph( aParam.pPara );
         }
     }
 }
@@ -498,13 +496,13 @@ SdPage* OutlineView::InsertSlideForParagraph( Paragraph* pPara )
 /**
  * Handler for deleting pages (paragraphs)
  */
-IMPL_LINK( OutlineView, ParagraphRemovingHdl, ::Outliner *, pOutliner, void )
+IMPL_LINK( OutlineView, ParagraphRemovingHdl, ::Outliner::ParagraphHdlParam, aParam, void )
 {
     DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::ParagraphRemovingHdl(), model change without undo?!" );
 
     OutlineViewPageChangesGuard aGuard(this);
 
-    Paragraph* pPara = pOutliner->GetHdlParagraph();
+    Paragraph* pPara = aParam.pPara;
     if( ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) )
     {
         // how many titles are in front of the title paragraph in question?
@@ -547,7 +545,7 @@ IMPL_LINK( OutlineView, ParagraphRemovingHdl, ::Outliner *, pOutliner, void )
                 mnPagesProcessed = 0;
             }
         }
-        pOutliner->UpdateFields();
+        aParam.pOutliner->UpdateFields();
     }
 }
 
@@ -555,14 +553,15 @@ IMPL_LINK( OutlineView, ParagraphRemovingHdl, ::Outliner *, pOutliner, void )
  * Handler for changing the indentation depth of paragraphs (requires inserting
  * or deleting of pages in some cases)
  */
-IMPL_LINK( OutlineView, DepthChangedHdl, ::Outliner *, pOutliner, void )
+IMPL_LINK( OutlineView, DepthChangedHdl, ::Outliner::DepthChangeHdlParam, aParam, void )
 {
     DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::DepthChangedHdl(), no undo for model change?!" );
 
     OutlineViewPageChangesGuard aGuard(this);
 
-    Paragraph* pPara = pOutliner->GetHdlParagraph();
-    if( ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) && ((pOutliner->GetPrevFlags() & ParaFlag::ISPAGE) == ParaFlag::NONE) )
+    Paragraph* pPara = aParam.pPara;
+    ::Outliner* pOutliner = aParam.pOutliner;
+    if( ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) && ((aParam.nPrevFlags & ParaFlag::ISPAGE) == ParaFlag::NONE) )
     {
         // the current paragraph is transformed into a slide
 
@@ -603,7 +602,7 @@ IMPL_LINK( OutlineView, DepthChangedHdl, ::Outliner *, pOutliner, void )
             }
         }
 
-        ParagraphInsertedHdl(pOutliner);
+        ParagraphInsertedHdl( { aParam.pOutliner, aParam.pPara } );
 
         mnPagesProcessed++;
 
@@ -630,7 +629,7 @@ IMPL_LINK( OutlineView, DepthChangedHdl, ::Outliner *, pOutliner, void )
         }
         pOutliner->UpdateFields();
     }
-    else if( !::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) && ((pOutliner->GetPrevFlags() & ParaFlag::ISPAGE) != ParaFlag::NONE) )
+    else if( !::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) && ((aParam.nPrevFlags & ParaFlag::ISPAGE) != ParaFlag::NONE) )
     {
         // the paragraph was a page but now becomes a normal paragraph
 
@@ -1353,9 +1352,9 @@ void OutlineView::SetLinks()
  */
 void OutlineView::ResetLinks() const
 {
-    mrOutliner.SetParaInsertedHdl(Link<::Outliner*,void>());
-    mrOutliner.SetParaRemovingHdl(Link<::Outliner*,void>());
-    mrOutliner.SetDepthChangedHdl(Link<::Outliner*,void>());
+    mrOutliner.SetParaInsertedHdl(Link<::Outliner::ParagraphHdlParam,void>());
+    mrOutliner.SetParaRemovingHdl(Link<::Outliner::ParagraphHdlParam,void>());
+    mrOutliner.SetDepthChangedHdl(Link<::Outliner::DepthChangeHdlParam,void>());
     mrOutliner.SetBeginMovingHdl(Link<::Outliner*,void>());
     mrOutliner.SetEndMovingHdl(Link<::Outliner*,void>());
     mrOutliner.SetStatusEventHdl(Link<EditStatus&,void>());
diff --git a/sd/source/ui/view/sdview.cxx b/sd/source/ui/view/sdview.cxx
index 247fe71..1838126 100644
--- a/sd/source/ui/view/sdview.cxx
+++ b/sd/source/ui/view/sdview.cxx
@@ -1077,32 +1077,30 @@ void View::onAccessibilityOptionsChanged()
     }
 }
 
-IMPL_LINK( View, OnParagraphInsertedHdl, ::Outliner *, pOutliner, void )
+IMPL_LINK( View, OnParagraphInsertedHdl, ::Outliner::ParagraphHdlParam, aParam, void )
 {
-    Paragraph* pPara = pOutliner->GetHdlParagraph();
     SdrObject* pObj = GetTextEditObject();
 
-    if( pPara && pObj )
+    if( aParam.pPara && pObj )
     {
         SdPage* pPage = dynamic_cast< SdPage* >( pObj->GetPage() );
         if( pPage )
-            pPage->onParagraphInserted( pOutliner, pPara, pObj );
+            pPage->onParagraphInserted( aParam.pOutliner, aParam.pPara, pObj );
     }
 }
 
 /**
  * Handler for the deletion of the pages (paragraphs).
  */
-IMPL_LINK( View, OnParagraphRemovingHdl, ::Outliner *, pOutliner, void )
+IMPL_LINK( View, OnParagraphRemovingHdl, ::Outliner::ParagraphHdlParam, aParam, void )
 {
-    Paragraph* pPara = pOutliner->GetHdlParagraph();
     SdrObject* pObj = GetTextEditObject();
 
-    if( pPara && pObj )
+    if( aParam.pPara && pObj )
     {
         SdPage* pPage = dynamic_cast< SdPage* >( pObj->GetPage() );
         if( pPage )
-            pPage->onParagraphRemoving( pOutliner, pPara, pObj );
+            pPage->onParagraphRemoving( aParam.pOutliner, aParam.pPara, pObj );
     }
 }
 


More information about the Libreoffice-commits mailing list