Hi, New version of the patch. I have added a method : IDocumentStatistic::GetUpdatedDocStat wich check state before returning. I left some UpdateDocStat but I will continue it later.
Sorry for the first patch. 2011/8/19 Caolán McNamara <caol...@redhat.com> > On Wed, 2011-08-17 at 21:04 +0200, Arnaud Versini wrote: > > Hi > > > > This patch remove unnecessary parameter SwDocStat& rStat to the method > > IDocumentStatistics::UpdateDocStat and also limit copy of SwDocStat > > during file saving and statistic dialog. > > There's a bug in the last hunk anyway, > > { > SwDocStat aStat(pDocShell->GetDoc()->GetDocStat()); > if(aStat.bModified) > - pDocShell->GetDoc()->UpdateDocStat( aStat ); > + pDocShell->GetDoc()->UpdateDocStat(); > > i.e. the "aStat" is a copy so after the UpdateDocStat is called, it's an > unchanged copy, not a reference to an updated SwDocStat like it used to > be, so a line or two later nValue = aStat.nChar will be wrong. > > Is there a specific problem you're trying to fix here ? > This is only for refactoring, I've seen some things to change when I have patched fdo#36931. > > Looking through the DocStat stuff it looks a bit messy. Seems of it > appears to want to give access to the document statistics for a fast > query by some code that the stats need to be updated, and by other code > just to get the stats. And some bits fail to check for bModified and > force an update and some do. And the awesome rtf filter const_casts the > document doc stat and updates it directly. > This rtf filter will be replaced with GSoC? > > If we want to refactor this then I suggest... > > a) move "bModified" out of the SwDocStat and add something like bool > areStatsStale/statsNeedUpdating to IDocumentStatistics instead to query > this fact > I will do this for shells I think > b) have IDocumentStatistics::GetDocStat always return updated document > stats instead of having to get them, find out if they are stale and > update them if they are. > Done with a new method > > That would probably avoid the problems of needing to directly call > UpdateDocStat for the general case where someone just wants to get > up-to-date stats, but allow any special cases of calling UpdateDocStat > when areStatsStale is true in order to force update of fields that > display the doc stats. > > C. > > Thanks -- Arnaud Versini
From 96575b8208b60b2cec24879bff0c0e893b798dbc Mon Sep 17 00:00:00 2001 From: Arnaud Versini <arnaud.vers...@gmail.com> Date: Wed, 17 Aug 2011 20:27:25 +0200 Subject: [PATCH] Remove unecessary parameter to IDocumentStatistics::UpdateDocStat() --- sw/inc/IDocumentStatistics.hxx | 4 ++- sw/inc/doc.hxx | 3 +- sw/inc/editsh.hxx | 2 +- sw/source/core/doc/doc.cxx | 54 ++++++++++++++++++++--------------- sw/source/core/edit/editsh.cxx | 6 ++-- sw/source/core/unocore/unofield.cxx | 3 +- sw/source/filter/html/swhtml.cxx | 3 +- sw/source/filter/xml/xmlexp.cxx | 13 +-------- sw/source/ui/app/docsh.cxx | 3 +- sw/source/ui/dialog/docstdlg.cxx | 3 +- sw/source/ui/shells/annotsh.cxx | 3 +- sw/source/ui/shells/basesh.cxx | 3 +- sw/source/ui/shells/drawsh.cxx | 4 +- sw/source/ui/shells/drwtxtex.cxx | 4 +- sw/source/ui/shells/frmsh.cxx | 4 +- sw/source/ui/shells/textsh1.cxx | 4 +- sw/source/ui/uno/unotxdoc.cxx | 4 +-- 17 files changed, 56 insertions(+), 64 deletions(-) diff --git a/sw/inc/IDocumentStatistics.hxx b/sw/inc/IDocumentStatistics.hxx index 152d382..8bdebba 100644 --- a/sw/inc/IDocumentStatistics.hxx +++ b/sw/inc/IDocumentStatistics.hxx @@ -46,9 +46,11 @@ */ virtual const SwDocStat &GetDocStat() const = 0; + virtual const SwDocStat &GetUpdatedDocStat() = 0; + virtual void SetDocStat(const SwDocStat& rStat) = 0; - virtual void UpdateDocStat(SwDocStat& rStat) = 0; + virtual void UpdateDocStat() = 0; protected: virtual ~IDocumentStatistics() {}; diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx index 9e8f3a9..ead098d 100644 --- a/sw/inc/doc.hxx +++ b/sw/inc/doc.hxx @@ -899,8 +899,9 @@ public: */ virtual void DocInfoChgd(); virtual const SwDocStat &GetDocStat() const; + virtual const SwDocStat &GetUpdatedDocStat(); virtual void SetDocStat(const SwDocStat& rStat); - virtual void UpdateDocStat(SwDocStat& rStat); + virtual void UpdateDocStat(); /** IDocumentState */ diff --git a/sw/inc/editsh.hxx b/sw/inc/editsh.hxx index 14ea40e..6666efb 100644 --- a/sw/inc/editsh.hxx +++ b/sw/inc/editsh.hxx @@ -374,7 +374,7 @@ public: void SetUndoNoResetModified(); // Document - Statistics - void UpdateDocStat( SwDocStat& rStat ); + void UpdateDocStat(); void Insert(const SwTOXMark& rMark); diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx index 8b1c82f..34d7a96 100644 --- a/sw/source/core/doc/doc.cxx +++ b/sw/source/core/doc/doc.cxx @@ -1073,6 +1073,15 @@ const SwDocStat& SwDoc::GetDocStat() const return *pDocStat; } +const SwDocStat& SwDoc::GetUpdatedDocStat() +{ + if (pDocStat->bModified) + { + UpdateDocStat(); + } + return *pDocStat; +} + struct _PostItFld : public _SetGetExpFld { _PostItFld( const SwNodeIndex& rNdIdx, const SwTxtFld* pFld, const SwIndex* pIdx = 0 ) @@ -1707,14 +1716,14 @@ void SwDoc::CalculatePagePairsForProspectPrinting( } /************************************************************************* - * void UpdateDocStat( const SwDocStat& rStat ); + * void UpdateDocStat(); *************************************************************************/ -void SwDoc::UpdateDocStat( SwDocStat& rStat ) +void SwDoc::UpdateDocStat() { - if( rStat.bModified ) + if( pDocStat->bModified ) { - rStat.Reset(); - rStat.nPara = 0; // Default ist auf 1 !! + pDocStat->Reset(); + pDocStat->nPara = 0; // Default ist auf 1 !! SwNode* pNd; for( sal_uLong i = GetNodes().Count(); i; ) @@ -1722,11 +1731,11 @@ void SwDoc::UpdateDocStat( SwDocStat& rStat ) switch( ( pNd = GetNodes()[ --i ])->GetNodeType() ) { case ND_TEXTNODE: - ((SwTxtNode*)pNd)->CountWords( rStat, 0, ((SwTxtNode*)pNd)->GetTxt().Len() ); + ((SwTxtNode*)pNd)->CountWords( *pDocStat, 0, ((SwTxtNode*)pNd)->GetTxt().Len() ); break; - case ND_TABLENODE: ++rStat.nTbl; break; - case ND_GRFNODE: ++rStat.nGrf; break; - case ND_OLENODE: ++rStat.nOLE; break; + case ND_TABLENODE: ++pDocStat->nTbl; break; + case ND_GRFNODE: ++pDocStat->nGrf; break; + case ND_OLENODE: ++pDocStat->nOLE; break; case ND_SECTIONNODE: break; } } @@ -1741,36 +1750,35 @@ void SwDoc::UpdateDocStat( SwDocStat& rStat ) { SwPostItField const * const pField( static_cast<SwPostItField const*>(pFmtFld->GetFld())); - rStat.nAllPara += pField->GetNumberOfParagraphs(); + pDocStat->nAllPara += pField->GetNumberOfParagraphs(); } } } - rStat.nPage = GetCurrentLayout() ? GetCurrentLayout()->GetPageNum() : 0; //swmod 080218 - rStat.bModified = sal_False; - SetDocStat( rStat ); + pDocStat->nPage = GetCurrentLayout() ? GetCurrentLayout()->GetPageNum() : 0; //swmod 080218 + pDocStat->bModified = sal_False; - com::sun::star::uno::Sequence < com::sun::star::beans::NamedValue > aStat( rStat.nPage ? 8 : 7); + com::sun::star::uno::Sequence < com::sun::star::beans::NamedValue > aStat( pDocStat->nPage ? 8 : 7); sal_Int32 n=0; aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TableCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nTbl; + aStat[n++].Value <<= (sal_Int32)pDocStat->nTbl; aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImageCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nGrf; + aStat[n++].Value <<= (sal_Int32)pDocStat->nGrf; aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ObjectCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nOLE; - if ( rStat.nPage ) + aStat[n++].Value <<= (sal_Int32)pDocStat->nOLE; + if ( pDocStat->nPage ) { aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PageCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nPage; + aStat[n++].Value <<= (sal_Int32)pDocStat->nPage; } aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParagraphCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nPara; + aStat[n++].Value <<= (sal_Int32)pDocStat->nPara; aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("WordCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nWord; + aStat[n++].Value <<= (sal_Int32)pDocStat->nWord; aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CharacterCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nChar; + aStat[n++].Value <<= (sal_Int32)pDocStat->nChar; aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NonWhitespaceCharacterCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nCharExcludingSpaces; + aStat[n++].Value <<= (sal_Int32)pDocStat->nCharExcludingSpaces; // For e.g. autotext documents there is no pSwgInfo (#i79945) SfxObjectShell * const pObjShell( GetDocShell() ); diff --git a/sw/source/core/edit/editsh.cxx b/sw/source/core/edit/editsh.cxx index 7968ef4..d13c8af 100644 --- a/sw/source/core/edit/editsh.cxx +++ b/sw/source/core/edit/editsh.cxx @@ -489,14 +489,14 @@ String SwEditShell::GetCurWord() } /**************************************************************************** - * void SwEditShell::UpdateDocStat( SwDocStat& rStat ) + * void SwEditShell::UpdateDocStat() ****************************************************************************/ -void SwEditShell::UpdateDocStat( SwDocStat& rStat ) +void SwEditShell::UpdateDocStat( ) { StartAllAction(); - GetDoc()->UpdateDocStat( rStat ); + GetDoc()->UpdateDocStat( ); EndAllAction(); } diff --git a/sw/source/core/unocore/unofield.cxx b/sw/source/core/unocore/unofield.cxx index 5ffd6f3..4206c76 100644 --- a/sw/source/core/unocore/unofield.cxx +++ b/sw/source/core/unocore/unofield.cxx @@ -2662,8 +2662,7 @@ void SwXTextFieldTypes::refresh(void) throw( uno::RuntimeException ) if(!IsValid()) throw uno::RuntimeException(); UnoActionContext aContext(GetDoc()); - SwDocStat aDocStat; - GetDoc()->UpdateDocStat(aDocStat); + GetDoc()->UpdateDocStat(); GetDoc()->UpdateFlds(0, sal_False); // call refresh listeners diff --git a/sw/source/filter/html/swhtml.cxx b/sw/source/filter/html/swhtml.cxx index 45c7f95..9a8d77a 100644 --- a/sw/source/filter/html/swhtml.cxx +++ b/sw/source/filter/html/swhtml.cxx @@ -869,8 +869,7 @@ if( pSttNdIdx->GetIndex()+1 == pPam->GetBound( sal_False ).nNode.GetIndex() ) if( bUpdateDocStat ) { - SwDocStat aStat( pDoc->GetDocStat() ); - pDoc->UpdateDocStat( aStat ); + pDoc->UpdateDocStat(); } } diff --git a/sw/source/filter/xml/xmlexp.cxx b/sw/source/filter/xml/xmlexp.cxx index 5f8fd91..d30528f 100644 --- a/sw/source/filter/xml/xmlexp.cxx +++ b/sw/source/filter/xml/xmlexp.cxx @@ -279,14 +279,8 @@ sal_uInt32 SwXMLExport::exportDoc( enum XMLTokenEnum eClass ) SetExtended( bExtended ); - SwDocStat aDocStat( pDoc->GetDocStat() ); if( (getExportFlags() & EXPORT_META) != 0 ) { - // Update doc stat, so that correct values are exported and - // the progress works correctly. - if( aDocStat.bModified ) - pDoc->UpdateDocStat( aDocStat ); - SfxObjectShell* pObjSh = pDoc->GetDocShell(); if( pObjSh ) pObjSh->UpdateDocInfoForSave(); // update information @@ -305,11 +299,6 @@ sal_uInt32 SwXMLExport::exportDoc( enum XMLTokenEnum eClass ) // - page styles: 2 (TODO: not now!) + 2 for each paragraph // - paragraph: 2 (1 for automatic styles and one for content) - // If required, update doc stat, so that - // the progress works correctly. - if( aDocStat.bModified ) - pDoc->UpdateDocStat( aDocStat ); - // count each item once, and then multiply by two to reach the // figures given above // The styles in pDoc also count the default style that never @@ -320,7 +309,7 @@ sal_uInt32 SwXMLExport::exportDoc( enum XMLTokenEnum eClass ) nRef += pDoc->GetTxtFmtColls()->Count() - 1; nRef *= 2; // for the above styles, xmloff will increment by 2! // #i93174#: count all paragraphs for the progress bar - nRef += aDocStat.nAllPara; // 1: only content, no autostyle + nRef += pDoc->GetUpdatedDocStat().nAllPara; // 1: only content, no autostyle pProgress->SetReference( nRef ); pProgress->SetValue( 0 ); } diff --git a/sw/source/ui/app/docsh.cxx b/sw/source/ui/app/docsh.cxx index 0b3bec5..793b912 100644 --- a/sw/source/ui/app/docsh.cxx +++ b/sw/source/ui/app/docsh.cxx @@ -606,8 +606,7 @@ sal_Bool SwDocShell::ConvertTo( SfxMedium& rMedium ) } // #i76360# Update document statistics - SwDocStat aDocStat( pDoc->GetDocStat() );; - pDoc->UpdateDocStat( aDocStat ); + pDoc->UpdateDocStat(); CalcLayoutForOLEObjects(); // format for OLE objets // #i62875# diff --git a/sw/source/ui/dialog/docstdlg.cxx b/sw/source/ui/dialog/docstdlg.cxx index 2b199b4..5dafb36 100644 --- a/sw/source/ui/dialog/docstdlg.cxx +++ b/sw/source/ui/dialog/docstdlg.cxx @@ -149,8 +149,7 @@ void SwDocStatPage::Update() SwWait aWait( *pSh->GetDoc()->GetDocShell(), sal_True ); pSh->StartAction(); - aDocStat = pSh->GetDoc()->GetDocStat(); - pSh->GetDoc()->UpdateDocStat( aDocStat ); + aDocStat = pSh->GetDoc()->GetUpdatedDocStat(); pSh->EndAction(); SetData(aDocStat); diff --git a/sw/source/ui/shells/annotsh.cxx b/sw/source/ui/shells/annotsh.cxx index 1753f9b..eeb6c77 100644 --- a/sw/source/ui/shells/annotsh.cxx +++ b/sw/source/ui/shells/annotsh.cxx @@ -412,12 +412,11 @@ void SwAnnotationShell::Exec( SfxRequest &rReq ) { SwWrtShell &rSh = rView.GetWrtShell(); SwDocStat aCurr; - SwDocStat aDocStat( rSh.getIDocumentStatistics()->GetDocStat() ); + const SwDocStat& aDocStat( rSh.getIDocumentStatistics()->GetDocStat() ); { SwWait aWait( *rView.GetDocShell(), sal_True ); rSh.StartAction(); rSh.CountWords( aCurr ); - rSh.UpdateDocStat( aDocStat ); rSh.EndAction(); } diff --git a/sw/source/ui/shells/basesh.cxx b/sw/source/ui/shells/basesh.cxx index 6bb2f67..4659fac 100644 --- a/sw/source/ui/shells/basesh.cxx +++ b/sw/source/ui/shells/basesh.cxx @@ -603,8 +603,7 @@ void SwBaseShell::Execute(SfxRequest &rReq) break; case FN_UPDATE_FIELDS: { - SwDocStat aDocStat; - rSh.UpdateDocStat(aDocStat); + rSh.UpdateDocStat(); rSh.EndAllTblBoxEdit(); rSh.ViewShell::UpdateFlds(sal_True); diff --git a/sw/source/ui/shells/drawsh.cxx b/sw/source/ui/shells/drawsh.cxx index dcf352b..a4565d8 100644 --- a/sw/source/ui/shells/drawsh.cxx +++ b/sw/source/ui/shells/drawsh.cxx @@ -233,12 +233,12 @@ void SwDrawShell::Execute(SfxRequest &rReq) case FN_WORDCOUNT_DIALOG: { SwDocStat aCurr; - SwDocStat aDocStat( rSh.getIDocumentStatistics()->GetDocStat() ); + const SwDocStat& aDocStat( rSh.getIDocumentStatistics()->GetDocStat() ); { SwWait aWait( *GetView().GetDocShell(), sal_True ); rSh.StartAction(); rSh.CountWords( aCurr ); - rSh.UpdateDocStat( aDocStat ); + rSh.UpdateDocStat(); rSh.EndAction(); } diff --git a/sw/source/ui/shells/drwtxtex.cxx b/sw/source/ui/shells/drwtxtex.cxx index 0deab44..c514f40 100644 --- a/sw/source/ui/shells/drwtxtex.cxx +++ b/sw/source/ui/shells/drwtxtex.cxx @@ -347,12 +347,12 @@ void SwDrawTextShell::Execute( SfxRequest &rReq ) case FN_WORDCOUNT_DIALOG: { SwDocStat aCurr; - SwDocStat aDocStat( rSh.getIDocumentStatistics()->GetDocStat() ); + const SwDocStat& aDocStat( rSh.getIDocumentStatistics()->GetDocStat() ); { SwWait aWait( *GetView().GetDocShell(), sal_True ); rSh.StartAction(); rSh.CountWords( aCurr ); - rSh.UpdateDocStat( aDocStat ); + rSh.UpdateDocStat(); rSh.EndAction(); } diff --git a/sw/source/ui/shells/frmsh.cxx b/sw/source/ui/shells/frmsh.cxx index 9763e08..489466a 100644 --- a/sw/source/ui/shells/frmsh.cxx +++ b/sw/source/ui/shells/frmsh.cxx @@ -419,12 +419,12 @@ void SwFrameShell::Execute(SfxRequest &rReq) case FN_WORDCOUNT_DIALOG: { SwDocStat aCurr; - SwDocStat aDocStat( rSh.getIDocumentStatistics()->GetDocStat() ); + const SwDocStat& aDocStat( rSh.getIDocumentStatistics()->GetDocStat() ); { SwWait aWait( *GetView().GetDocShell(), sal_True ); rSh.StartAction(); rSh.CountWords( aCurr ); - rSh.UpdateDocStat( aDocStat ); + rSh.UpdateDocStat(); rSh.EndAction(); } diff --git a/sw/source/ui/shells/textsh1.cxx b/sw/source/ui/shells/textsh1.cxx index a7ff278..058c7c8 100644 --- a/sw/source/ui/shells/textsh1.cxx +++ b/sw/source/ui/shells/textsh1.cxx @@ -1280,12 +1280,12 @@ void SwTextShell::Execute(SfxRequest &rReq) { SwWrtShell &rSh = GetShell(); SwDocStat aCurr; - SwDocStat aDocStat( rSh.getIDocumentStatistics()->GetDocStat() ); + const SwDocStat& aDocStat( rSh.getIDocumentStatistics()->GetDocStat() ); { SwWait aWait( *GetView().GetDocShell(), sal_True ); rSh.StartAction(); rSh.CountWords( aCurr ); - rSh.UpdateDocStat( aDocStat ); + rSh.UpdateDocStat(); rSh.EndAction(); } diff --git a/sw/source/ui/uno/unotxdoc.cxx b/sw/source/ui/uno/unotxdoc.cxx index 418dbf0..18b8994 100644 --- a/sw/source/ui/uno/unotxdoc.cxx +++ b/sw/source/ui/uno/unotxdoc.cxx @@ -2020,9 +2020,7 @@ Any SwXTextDocument::getPropertyValue(const OUString& rPropertyName) case WID_DOC_PARA_COUNT : case WID_DOC_WORD_COUNT : { - SwDocStat aStat(pDocShell->GetDoc()->GetDocStat()); - if(aStat.bModified) - pDocShell->GetDoc()->UpdateDocStat( aStat ); + const SwDocStat& aStat(pDocShell->GetDoc()->GetUpdatedDocStat()); sal_Int32 nValue; switch(pEntry->nWID) { -- 1.7.5.4
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice