diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2016-10-13 10:45:45 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2016-10-13 11:16:13 +0000 |
commit | 17ec3b96dee28b148773aa1715634171deaa0297 (patch) | |
tree | 791f046375ebc44e79501e15d84fbfb66d535fc9 /editeng | |
parent | 703f697b22ddfdcceed955d37e75db2299f5b120 (diff) |
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@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'editeng')
-rw-r--r-- | editeng/source/outliner/outliner.cxx | 49 | ||||
-rw-r--r-- | editeng/source/outliner/outlundo.cxx | 5 | ||||
-rw-r--r-- | editeng/source/outliner/outlvw.cxx | 13 |
3 files changed, 25 insertions, 42 deletions
diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx index f385cee753d0..3bf14860bb17 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 a1475b565735..ab55e3a7a5db 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 2665497641b5..9d2a82b040d2 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; } |