sc/source/core/data/documen8.cxx | 200 ++++++++++++++++++++++++--------------- 1 file changed, 128 insertions(+), 72 deletions(-)
New commits: commit 8b1143fafd20ba5f2d2090f582874a2ffb543d68 Author: Kohei Yoshida <[email protected]> Date: Wed Mar 13 15:22:50 2013 -0400 Move the style sheet pool handling too. Change-Id: Ia24e2effa8d6200eb0e9ad5e30fb5c9a4d8dd670 diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx index e6d1e38..541e709 100644 --- a/sc/source/core/data/documen8.cxx +++ b/sc/source/core/data/documen8.cxx @@ -449,10 +449,11 @@ class IdleCalcTextWidthScope { ScDocument& mrDoc; ScAddress& mrCalcPos; - sal_uInt16 mnOldSearchMask; - SfxStyleFamily meOldFamily; MapMode maOldMapMode; sal_uLong mnStartTime; + ScStyleSheetPool* mpStylePool; + sal_uInt16 mnOldSearchMask; + SfxStyleFamily meOldFamily; bool mbNeedMore; bool mbProgress; @@ -461,17 +462,18 @@ public: mrDoc(rDoc), mrCalcPos(rCalcPos), mnStartTime(Time::GetSystemTicks()), + mpStylePool(rDoc.GetStyleSheetPool()), + mnOldSearchMask(mpStylePool->GetSearchMask()), + meOldFamily(mpStylePool->GetSearchFamily()), mbNeedMore(false), mbProgress(false) { - mrDoc.EnableIdle(false); - // The old search mask / family flags must be restored so that e.g. // the styles dialog shows correct listing when it's opened in-between // the calls. - ScStyleSheetPool* pStylePool = mrDoc.GetStyleSheetPool(); - mnOldSearchMask = pStylePool->GetSearchMask(); - meOldFamily = pStylePool->GetSearchFamily(); + + mrDoc.EnableIdle(false); + mpStylePool->SetSearchMask(SFX_STYLE_FAMILY_PAGE, SFXSTYLEBIT_ALL); } ~IdleCalcTextWidthScope() @@ -483,8 +485,7 @@ public: if (mbProgress) ScProgress::DeleteInterpretProgress(); - ScStyleSheetPool* pStylePool = mrDoc.GetStyleSheetPool(); - pStylePool->SetSearchMask(meOldFamily, mnOldSearchMask); + mpStylePool->SetSearchMask(meOldFamily, mnOldSearchMask); mrDoc.EnableIdle(true); } @@ -514,6 +515,8 @@ public: } bool hasProgressBar() const { return mbProgress; } + + ScStyleSheetPool* getStylePool() { return mpStylePool; } }; } @@ -546,12 +549,8 @@ bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder vers if (!ValidTab(aScope.Tab()) || aScope.Tab() >= static_cast<SCTAB>(maTabs.size()) || !maTabs[aScope.Tab()]) aScope.setTab(0); - ScStyleSheetPool* pStylePool = xPoolHelper->GetStylePool(); - pTable = maTabs[aScope.Tab()]; - pStylePool->SetSearchMask( SFX_STYLE_FAMILY_PAGE, SFXSTYLEBIT_ALL ); - pStyle = (ScStyleSheet*)pStylePool->Find( pTable->aPageStyle, - SFX_STYLE_FAMILY_PAGE ); + pStyle = (ScStyleSheet*)aScope.getStylePool()->Find(pTable->aPageStyle, SFX_STYLE_FAMILY_PAGE); OSL_ENSURE( pStyle, "Missing StyleSheet :-/" ); @@ -636,8 +635,8 @@ bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder vers if ( bNewTab ) { pTable = maTabs[aScope.Tab()]; - pStyle = (ScStyleSheet*)pStylePool->Find( pTable->aPageStyle, - SFX_STYLE_FAMILY_PAGE ); + pStyle = (ScStyleSheet*)aScope.getStylePool()->Find( + pTable->aPageStyle, SFX_STYLE_FAMILY_PAGE); if ( pStyle ) { commit 452daf08e383c886e918a94c1e901cabb572b648 Author: Kohei Yoshida <[email protected]> Date: Wed Mar 13 15:05:26 2013 -0400 Move progress bar handling to the scope object too. Change-Id: Iff93958c5025e000f7e39eb71e3f91ff41db911a diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx index 5c4c6f6..e6d1e38 100644 --- a/sc/source/core/data/documen8.cxx +++ b/sc/source/core/data/documen8.cxx @@ -454,13 +454,15 @@ class IdleCalcTextWidthScope MapMode maOldMapMode; sal_uLong mnStartTime; bool mbNeedMore; + bool mbProgress; public: IdleCalcTextWidthScope(ScDocument& rDoc, ScAddress& rCalcPos) : mrDoc(rDoc), mrCalcPos(rCalcPos), mnStartTime(Time::GetSystemTicks()), - mbNeedMore(false) + mbNeedMore(false), + mbProgress(false) { mrDoc.EnableIdle(false); @@ -478,6 +480,9 @@ public: if (pDev) pDev->SetMapMode(maOldMapMode); + if (mbProgress) + ScProgress::DeleteInterpretProgress(); + ScStyleSheetPool* pStylePool = mrDoc.GetStyleSheetPool(); pStylePool->SetSearchMask(meOldFamily, mnOldSearchMask); mrDoc.EnableIdle(true); @@ -501,6 +506,14 @@ public: bool getNeedMore() const { return mbNeedMore; } sal_uLong getStartTime() const { return mnStartTime; } + + void createProgressBar() + { + ScProgress::CreateInterpretProgress(&mrDoc, false); + mbProgress = true; + } + + bool hasProgressBar() const { return mbProgress; } }; } @@ -542,8 +555,7 @@ bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder vers OSL_ENSURE( pStyle, "Missing StyleSheet :-/" ); - bool bProgress = false; - if ( pStyle && 0 == getScaleValue(*pStyle, ATTR_PAGE_SCALETOPAGES)) + if (pStyle && 0 == getScaleValue(*pStyle, ATTR_PAGE_SCALETOPAGES)) { sal_uInt16 nRestart = 0; sal_uInt16 nCount = 0; @@ -579,11 +591,11 @@ bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder vers nPPTX = aPix1000.X() / 1000.0; nPPTY = aPix1000.Y() / 1000.0; } - if ( !bProgress && pCell->GetCellType() == CELLTYPE_FORMULA - && ((ScFormulaCell*)pCell)->GetDirty() ) + + if (!aScope.hasProgressBar() && pCell->GetCellType() == CELLTYPE_FORMULA + && ((ScFormulaCell*)pCell)->GetDirty()) { - ScProgress::CreateInterpretProgress( this, false ); - bProgress = true; + aScope.createProgressBar(); } sal_uInt16 nNewWidth = (sal_uInt16)GetNeededSize( @@ -669,9 +681,6 @@ bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder vers else aScope.incTab(); // Move to the next sheet as the current one has scale-to-pages set. - if ( bProgress ) - ScProgress::DeleteInterpretProgress(); - delete pColIter; return aScope.getNeedMore(); commit 6be6bc72f1aeafb66f60170f89faefb41743b320 Author: Kohei Yoshida <[email protected]> Date: Wed Mar 13 14:59:50 2013 -0400 Use a scope object to avoid manual unwinding at the end of the call. Change-Id: Id2565dfa250b93ba4f70e596d6b66f3e5e55fb5f diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx index 4592d13..5c4c6f6 100644 --- a/sc/source/core/data/documen8.cxx +++ b/sc/source/core/data/documen8.cxx @@ -443,41 +443,99 @@ void ScDocument::InvalidateTextWidth( const ScAddress* pAdrFrom, const ScAddress #define CALCMAX 1000 // Berechnungen #define ABORT_EVENTS (VCL_INPUT_ANY & ~VCL_INPUT_TIMER & ~VCL_INPUT_OTHER) +namespace { + +class IdleCalcTextWidthScope +{ + ScDocument& mrDoc; + ScAddress& mrCalcPos; + sal_uInt16 mnOldSearchMask; + SfxStyleFamily meOldFamily; + MapMode maOldMapMode; + sal_uLong mnStartTime; + bool mbNeedMore; + +public: + IdleCalcTextWidthScope(ScDocument& rDoc, ScAddress& rCalcPos) : + mrDoc(rDoc), + mrCalcPos(rCalcPos), + mnStartTime(Time::GetSystemTicks()), + mbNeedMore(false) + { + mrDoc.EnableIdle(false); + + // The old search mask / family flags must be restored so that e.g. + // the styles dialog shows correct listing when it's opened in-between + // the calls. + ScStyleSheetPool* pStylePool = mrDoc.GetStyleSheetPool(); + mnOldSearchMask = pStylePool->GetSearchMask(); + meOldFamily = pStylePool->GetSearchFamily(); + } + + ~IdleCalcTextWidthScope() + { + SfxPrinter* pDev = mrDoc.GetPrinter(); + if (pDev) + pDev->SetMapMode(maOldMapMode); + + ScStyleSheetPool* pStylePool = mrDoc.GetStyleSheetPool(); + pStylePool->SetSearchMask(meOldFamily, mnOldSearchMask); + mrDoc.EnableIdle(true); + } + + SCTAB Tab() const { return mrCalcPos.Tab(); } + SCCOL Col() const { return mrCalcPos.Col(); } + SCROW Row() const { return mrCalcPos.Row(); } + + void setTab(SCTAB nTab) { mrCalcPos.SetTab(nTab); } + void setCol(SCCOL nCol) { mrCalcPos.SetCol(nCol); } + void setRow(SCROW nRow) { mrCalcPos.SetRow(nRow); } + + void incTab(SCTAB nInc=1) { mrCalcPos.IncTab(nInc); } + void incCol(SCCOL nInc=1) { mrCalcPos.IncCol(nInc); } + void incRow(SCROW nInc=1) { mrCalcPos.IncRow(nInc); } + + void setOldMapMode(const MapMode& rOldMapMode) { maOldMapMode = rOldMapMode; } + + void setNeedMore(bool b) { mbNeedMore = b; } + bool getNeedMore() const { return mbNeedMore; } + + sal_uLong getStartTime() const { return mnStartTime; } +}; + +} + bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder versuchen { // #i75610# if a printer hasn't been set or created yet, don't create one for this if (!mbIdleEnabled || IsInLinkUpdate() || GetPrinter(false) == NULL) return false; - mbIdleEnabled = false; + IdleCalcTextWidthScope aScope(*this, aCurTextWidthCalcPos); - const sal_uLong nStart = Time::GetSystemTicks(); OutputDevice* pDev = NULL; - MapMode aOldMap; ScStyleSheet* pStyle = NULL; ScColumnIterator* pColIter = NULL; ScTable* pTable = NULL; - SCTAB nTab = aCurTextWidthCalcPos.Tab(); - SCROW nRow = aCurTextWidthCalcPos.Row(); - SCsCOL nCol = aCurTextWidthCalcPos.Col(); - bool bNeedMore= false; - - if ( !ValidRow(nRow) ) - nRow = 0, nCol--; - if ( nCol < 0 ) - nCol = MAXCOL, nTab++; - if ( !ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab] ) - nTab = 0; - - // SearchMask/Family muss gemerkt werden, - // damit z.B. der Organizer nicht durcheinanderkommt, wenn zwischendurch eine - // Query-Box aufgemacht wird !!! + + if (!ValidRow(aScope.Row())) + { + aScope.setRow(0); + aScope.incCol(-1); + } + + if (aScope.Col() < 0) + { + aScope.setCol(MAXCOL); + aScope.incTab(); + } + + if (!ValidTab(aScope.Tab()) || aScope.Tab() >= static_cast<SCTAB>(maTabs.size()) || !maTabs[aScope.Tab()]) + aScope.setTab(0); ScStyleSheetPool* pStylePool = xPoolHelper->GetStylePool(); - sal_uInt16 nOldMask = pStylePool->GetSearchMask(); - SfxStyleFamily eOldFam = pStylePool->GetSearchFamily(); - pTable = maTabs[nTab]; + pTable = maTabs[aScope.Tab()]; pStylePool->SetSearchMask( SFX_STYLE_FAMILY_PAGE, SFXSTYLEBIT_ALL ); pStyle = (ScStyleSheet*)pStylePool->Find( pTable->aPageStyle, SFX_STYLE_FAMILY_PAGE ); @@ -495,14 +553,16 @@ bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder vers Fraction aZoomFract( nZoom, 100 ); // Start at specified cell position (nCol, nRow, nTab). - ScColumn* pColumn = &pTable->aCol[nCol]; - pColIter = new ScColumnIterator( pColumn, nRow, MAXROW ); + ScColumn* pColumn = &pTable->aCol[aScope.Col()]; + pColIter = new ScColumnIterator(pColumn, aScope.Row(), MAXROW); while ( (nZoom > 0) && (nCount < CALCMAX) && (nRestart < 2) ) { - if ( pColIter->Next( nRow, pCell ) ) + SCROW nRow; + if ( pColIter->Next(nRow, pCell) ) { // More cell in this column. + aScope.setRow(nRow); if ( TEXTWIDTH_DIRTY == pCell->GetTextWidth() ) { @@ -512,7 +572,7 @@ bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder vers if ( !pDev ) { pDev = GetPrinter(); - aOldMap = pDev->GetMapMode(); + aScope.setOldMapMode(pDev->GetMapMode()); pDev->SetMapMode( MAP_PIXEL ); // wichtig fuer GetNeededSize Point aPix1000 = pDev->LogicToPixel( Point(1000,1000), MAP_TWIP ); @@ -526,14 +586,12 @@ bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder vers bProgress = true; } - sal_uInt16 nNewWidth = (sal_uInt16)GetNeededSize( nCol, nRow, nTab, - pDev, nPPTX, nPPTY, - aZoomFract,aZoomFract, true, - true ); // bTotalSize + sal_uInt16 nNewWidth = (sal_uInt16)GetNeededSize( + aScope.Col(), aScope.Row(), aScope.Tab(), + pDev, nPPTX, nPPTY, aZoomFract,aZoomFract, true, true); // bTotalSize pCell->SetTextWidth( nNewWidth ); - - bNeedMore = true; + aScope.setNeedMore(true); } } else @@ -542,21 +600,21 @@ bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder vers bool bNewTab = false; - nRow = 0; - nCol--; + aScope.setRow(0); + aScope.incCol(-1); - if ( nCol < 0 ) + if (aScope.Col() < 0) { // No more column to the left. Move to the right-most column of the next sheet. - nCol = MAXCOL; - nTab++; + aScope.setCol(MAXCOL); + aScope.incTab(); bNewTab = true; } - if ( !ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab] ) + if (!ValidTab(aScope.Tab()) || aScope.Tab() >= static_cast<SCTAB>(maTabs.size()) || !maTabs[aScope.Tab()] ) { // Sheet doesn't exist at specified sheet position. Restart at sheet 0. - nTab = 0; + aScope.setTab(0); nRestart++; bNewTab = true; } @@ -565,7 +623,7 @@ bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder vers { if ( bNewTab ) { - pTable = maTabs[nTab]; + pTable = maTabs[aScope.Tab()]; pStyle = (ScStyleSheet*)pStylePool->Find( pTable->aPageStyle, SFX_STYLE_FAMILY_PAGE ); @@ -592,11 +650,11 @@ bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder vers { delete pColIter; - pColumn = &pTable->aCol[nCol]; - pColIter = new ScColumnIterator( pColumn, nRow, MAXROW ); + pColumn = &pTable->aCol[aScope.Col()]; + pColIter = new ScColumnIterator( pColumn, aScope.Row(), MAXROW ); } else - ++nTab; // Move to the next sheet as the current one has scale-to-pages set. + aScope.incTab(); // Move to the next sheet as the current one has scale-to-pages set. } } @@ -604,29 +662,19 @@ bool ScDocument::IdleCalcTextWidth() // true = demnaechst wieder vers // Quit if either 1) its duration exceeds 50 ms, or 2) there is // any pending event after processing 32 cells. - if ((50L < Time::GetSystemTicks() - nStart) || (nCount > 31 && Application::AnyInput(ABORT_EVENTS))) + if ((50L < Time::GetSystemTicks() - aScope.getStartTime()) || (nCount > 31 && Application::AnyInput(ABORT_EVENTS))) nCount = CALCMAX; } } else - ++nTab; // Move to the next sheet as the current one has scale-to-pages set. + aScope.incTab(); // Move to the next sheet as the current one has scale-to-pages set. if ( bProgress ) ScProgress::DeleteInterpretProgress(); delete pColIter; - if (pDev) - pDev->SetMapMode(aOldMap); - - aCurTextWidthCalcPos.SetTab( nTab ); - aCurTextWidthCalcPos.SetRow( nRow ); - aCurTextWidthCalcPos.SetCol( (SCCOL)nCol ); - - pStylePool->SetSearchMask( eOldFam, nOldMask ); - mbIdleEnabled = true; - - return bNeedMore; + return aScope.getNeedMore(); } //------------------------------------------------------------------------ _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
