diff options
-rw-r--r-- | sw/source/core/inc/layact.hxx | 27 | ||||
-rw-r--r-- | sw/source/core/layout/layact.cxx | 59 | ||||
-rw-r--r-- | sw/source/core/view/viewsh.cxx | 1 |
3 files changed, 36 insertions, 51 deletions
diff --git a/sw/source/core/inc/layact.hxx b/sw/source/core/inc/layact.hxx index 50335077694c..1707383b62d7 100644 --- a/sw/source/core/inc/layact.hxx +++ b/sw/source/core/inc/layact.hxx @@ -22,6 +22,7 @@ #include <sal/config.h> #include <vcl/inputtypes.hxx> +#include <vcl/TaskStopwatch.hxx> #include <tools/color.hxx> #include <ctime> @@ -56,6 +57,7 @@ class SwLayAction { SwRootFrame *m_pRoot; SwViewShellImp *m_pImp; // here the action logs in and off + TaskStopwatch* m_pWatch; // For the sake of optimization, so that the tables stick a bit better to // the Cursor when hitting return/backspace in front of one. @@ -74,7 +76,6 @@ class SwLayAction std::clock_t m_nStartTicks; // The Action's starting time; if too much time passes the // WaitCursor can be enabled via CheckWaitCursor() - VclInputFlags m_nInputType; // Which input should terminate processing sal_uInt16 m_nEndPage; // StatBar control sal_uInt16 m_nCheckPageNum; // CheckPageDesc() was delayed if != USHRT_MAX // check from this page onwards @@ -84,9 +85,8 @@ class SwLayAction bool m_bCalcLayout; // Complete reformatting? bool m_bAgain; // For the automatically repeated Action if Pages are deleted bool m_bNextCycle; // Reset on the first invalid Page - bool m_bInput; // For terminating processing on input - bool m_bIdle; // True if the LayAction was triggered by the Idler bool m_bReschedule; // Call Reschedule depending on Progress? + bool m_bInterrupt; // For termination the layouting bool m_bCheckPages; // Run CheckPageDescs() or delay it bool m_bUpdateExpFields; // Is set if, after Formatting, we need to do another round for ExpField bool m_bBrowseActionStop; // Terminate Action early (as per bInput) and leave the rest to the Idler @@ -119,33 +119,26 @@ class SwLayAction bool RemoveEmptyBrowserPages(); - inline void CheckIdleEnd(); - public: - SwLayAction( SwRootFrame *pRt, SwViewShellImp *pImp ); + SwLayAction(SwRootFrame *pRt, SwViewShellImp *pImp, TaskStopwatch* pWatch = nullptr); ~SwLayAction(); - void SetIdle ( bool bNew ) { m_bIdle = bNew; } void SetCheckPages ( bool bNew ) { m_bCheckPages = bNew; } void SetBrowseActionStop( bool bNew ) { m_bBrowseActionStop = bNew; } void SetNextCycle ( bool bNew ) { m_bNextCycle = bNew; } bool IsWaitAllowed() const { return m_bWaitAllowed; } bool IsNextCycle() const { return m_bNextCycle; } - bool IsInput() const { return m_bInput; } bool IsPaint() const { return m_bPaint; } - bool IsIdle() const { return m_bIdle; } bool IsReschedule() const { return m_bReschedule; } - bool IsPaintExtraData() const { return m_bPaintExtraData;} - bool IsInterrupt() const { return IsInput(); } - - VclInputFlags GetInputType() const { return m_nInputType; } + bool IsIdle() const { return m_pWatch != nullptr; } + bool IsPaintExtraData() const { return m_bPaintExtraData; } + bool IsInterrupt(); // adjusting Action to the wanted behaviour void SetPaint ( bool bNew ) { m_bPaint = bNew; } void SetComplete ( bool bNew ) { m_bComplete = bNew; } void SetStatBar ( bool bNew ); - void SetInputType ( VclInputFlags nNew ) { m_nInputType = nNew; } void SetCalcLayout ( bool bNew ) { m_bCalcLayout = bNew; } void SetReschedule ( bool bNew ) { m_bReschedule = bNew; } void SetWaitAllowed ( bool bNew ) { m_bWaitAllowed = bNew; } @@ -182,21 +175,19 @@ public: class SwLayIdle { - + TaskStopwatch m_aWatch; SwRootFrame *pRoot; SwViewShellImp *pImp; // The Idler registers and deregisters here SwContentNode *pContentNode; // The current cursor position is saved here sal_Int32 nTextPos; bool bPageValid; // Were we able to evaluate everything on the whole page? - #ifdef DBG_UTIL bool m_bIndicator; -#endif -#ifdef DBG_UTIL void ShowIdle( Color eName ); #endif + bool IsInterrupt(); enum IdleJobType{ ONLINE_SPELLING, AUTOCOMPLETE_WORDS, WORD_COUNT, SMART_TAGS }; bool DoIdleJob_( const SwContentFrame*, IdleJobType ); bool DoIdleJob( IdleJobType, bool bVisAreaOnly ); diff --git a/sw/source/core/layout/layact.cxx b/sw/source/core/layout/layact.cxx index 96796cca4662..abac3364efd2 100644 --- a/sw/source/core/layout/layact.cxx +++ b/sw/source/core/layout/layact.cxx @@ -89,13 +89,6 @@ void SwLayAction::CheckWaitCursor() } } -// Time over already? -inline void SwLayAction::CheckIdleEnd() -{ - if ( !IsInput() ) - m_bInput = bool(GetInputType()) && Application::AnyInput( GetInputType() ); -} - void SwLayAction::SetStatBar( bool bNew ) { if ( bNew ) @@ -253,19 +246,19 @@ void SwLayAction::PaintContent( const SwContentFrame *pCnt, } } -SwLayAction::SwLayAction( SwRootFrame *pRt, SwViewShellImp *pI ) : - m_pRoot( pRt ), +SwLayAction::SwLayAction(SwRootFrame *pRt, SwViewShellImp *pI, TaskStopwatch* pWatch) + : m_pRoot(pRt), m_pImp( pI ), + m_pWatch(pWatch), m_pOptTab( nullptr ), m_nPreInvaPage( USHRT_MAX ), m_nStartTicks( std::clock() ), - m_nInputType( VclInputFlags::NONE ), m_nEndPage( USHRT_MAX ), m_nCheckPageNum( USHRT_MAX ) { m_bPaintExtraData = ::IsExtraData( m_pImp->GetShell()->GetDoc() ); m_bPaint = m_bComplete = m_bWaitAllowed = m_bCheckPages = true; - m_bInput = m_bAgain = m_bNextCycle = m_bCalcLayout = m_bIdle = m_bReschedule = + m_bInterrupt = m_bAgain = m_bNextCycle = m_bCalcLayout = m_bReschedule = m_bUpdateExpFields = m_bBrowseActionStop = m_bActionInProgress = false; // init new flag <mbFormatContentOnInterrupt>. mbFormatContentOnInterrupt = false; @@ -280,14 +273,18 @@ SwLayAction::~SwLayAction() m_pImp->m_pLayAction = nullptr; // unregister } +bool SwLayAction::IsInterrupt() +{ + return m_bInterrupt || (m_pWatch && m_pWatch->exceededRuntime()); +} + void SwLayAction::Reset() { m_pOptTab = nullptr; m_nStartTicks = std::clock(); - m_nInputType = VclInputFlags::NONE; m_nEndPage = m_nPreInvaPage = m_nCheckPageNum = USHRT_MAX; m_bPaint = m_bComplete = m_bWaitAllowed = m_bCheckPages = true; - m_bInput = m_bAgain = m_bNextCycle = m_bCalcLayout = m_bIdle = m_bReschedule = + m_bInterrupt = m_bAgain = m_bNextCycle = m_bCalcLayout = m_bReschedule = m_bUpdateExpFields = m_bBrowseActionStop = false; } @@ -446,7 +443,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext) IDocumentLayoutAccess& rLayoutAccess = m_pRoot->GetFormat()->getIDocumentLayoutAccess(); bool bNoLoop = pPage && SwLayouter::StartLoopControl( m_pRoot->GetFormat()->GetDoc(), pPage ); sal_uInt16 nPercentPageNum = 0; - while ( (pPage && !IsInterrupt()) || m_nCheckPageNum != USHRT_MAX ) + while ((!IsInterrupt() && pPage) || (m_nCheckPageNum != USHRT_MAX)) { // note: this is the only place that consumes and resets m_nCheckPageNum if ((IsInterrupt() || !pPage) && m_nCheckPageNum != USHRT_MAX) @@ -570,7 +567,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext) pPage->InvalidateFlyLayout(); pPage->InvalidateFlyContent(); if ( IsBrowseActionStop() ) - m_bInput = true; + m_bInterrupt = true; } } if( bNoLoop ) @@ -588,7 +585,8 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext) pPage->ValidateFlyLayout(); pPage->ValidateFlyContent(); } - if ( !IsInterrupt() ) + + if (!IsInterrupt()) { SetNextCycle( false ); @@ -629,8 +627,8 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext) if( bNoLoop ) rLayoutAccess.GetLayouter()->LoopControl( pPage ); } - CheckIdleEnd(); } + if ( !pPage && !IsInterrupt() && (m_pRoot->IsSuperfluous() || m_pRoot->IsAssertFlyPages()) ) { @@ -656,6 +654,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext) pPage = static_cast<SwPageFrame*>(pPage->GetNext()); } } + if ( IsInterrupt() && pPage ) { // If we have input, we don't want to format content anymore, but @@ -684,7 +683,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext) pPg = pPg ? static_cast<SwPageFrame*>(pPg->GetPrev()) : pPage; // set flag for interrupt content formatting - mbFormatContentOnInterrupt = IsInput(); + mbFormatContentOnInterrupt = IsInterrupt(); long nBottom = rVis.Bottom(); // #i42586# - format current page, if idle action is active // This is an optimization for the case that the interrupt is created by @@ -778,7 +777,6 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext) bool SwLayAction::TurboAction_( const SwContentFrame *pCnt ) { - const SwPageFrame *pPage = nullptr; if ( !pCnt->isFrameAreaDefinitionValid() || pCnt->IsCompletePaint() || pCnt->IsRetouche() ) { @@ -839,10 +837,7 @@ bool SwLayAction::TurboAction() if ( m_pRoot->GetTurbo() ) { if ( !TurboAction_( m_pRoot->GetTurbo() ) ) - { - CheckIdleEnd(); bRet = false; - } m_pRoot->ResetTurbo(); } else @@ -1688,7 +1683,6 @@ bool SwLayAction::FormatContent(SwPageFrame *const pPage) // paragraph has been processed. if (!pTab || !bInValid) { - CheckIdleEnd(); // consider interrupt formatting. if ( ( IsInterrupt() && !mbFormatContentOnInterrupt ) || ( !bBrowse && pPage->IsInvalidLayout() ) || @@ -1781,7 +1775,6 @@ bool SwLayAction::FormatContent(SwPageFrame *const pPage) PaintContent( pContent, pPage, pContent->getFrameArea(), pContent->getFrameArea().Bottom()); if ( IsIdle() ) { - CheckIdleEnd(); // consider interrupt formatting. if ( IsInterrupt() && !mbFormatContentOnInterrupt ) return false; @@ -1877,7 +1870,6 @@ void SwLayAction::FormatFlyContent( const SwFlyFrame *pFly ) // If there's input, we interrupt processing. if ( !pFly->IsFlyInContentFrame() ) { - CheckIdleEnd(); // consider interrupt formatting. if ( IsInterrupt() && !mbFormatContentOnInterrupt ) return; @@ -1887,6 +1879,11 @@ void SwLayAction::FormatFlyContent( const SwFlyFrame *pFly ) CheckWaitCursor(); } +bool SwLayIdle::IsInterrupt() +{ + return m_aWatch.exceededRuntime(); +} + bool SwLayIdle::DoIdleJob_( const SwContentFrame *pCnt, IdleJobType eJob ) { OSL_ENSURE( pCnt->IsTextFrame(), "NoText neighbour of Text" ); @@ -1970,7 +1967,7 @@ bool SwLayIdle::DoIdleJob_( const SwContentFrame *pCnt, IdleJobType eJob ) bPageValid = bPageValid && (SwTextNode::WrongState::TODO != pTextNode->GetWrongDirty()); if ( aRepaint.HasArea() ) pImp->GetShell()->InvalidateWindows( aRepaint ); - if (Application::AnyInput(VCL_INPUT_ANY & VclInputFlags(~VclInputFlags::TIMER))) + if (IsInterrupt()) return true; break; } @@ -1978,7 +1975,7 @@ bool SwLayIdle::DoIdleJob_( const SwContentFrame *pCnt, IdleJobType eJob ) const_cast<SwTextFrame*>(pTextFrame)->CollectAutoCmplWrds(*pTextNode, nPos); // note: bPageValid remains true here even if the cursor // position is skipped, so no PENDING state needed currently - if (Application::AnyInput(VCL_INPUT_ANY & VclInputFlags(~VclInputFlags::TIMER))) + if (IsInterrupt()) return true; break; case WORD_COUNT : @@ -1986,7 +1983,7 @@ bool SwLayIdle::DoIdleJob_( const SwContentFrame *pCnt, IdleJobType eJob ) const sal_Int32 nEnd = pTextNode->GetText().getLength(); SwDocStat aStat; pTextNode->CountWords( aStat, 0, nEnd ); - if ( Application::AnyInput() ) + if (IsInterrupt()) return true; break; } @@ -2001,7 +1998,7 @@ bool SwLayIdle::DoIdleJob_( const SwContentFrame *pCnt, IdleJobType eJob ) // handle smarttag problems gracefully and provide diagnostics SAL_WARN( "sw.core", "SMART_TAGS: " << e); } - if (Application::AnyInput(VCL_INPUT_ANY & VclInputFlags(~VclInputFlags::TIMER))) + if (IsInterrupt()) return true; break; } @@ -2193,9 +2190,7 @@ SwLayIdle::SwLayIdle( SwRootFrame *pRt, SwViewShellImp *pI ) : bool bInterrupt(false); { - SwLayAction aAction( pRoot, pImp ); - aAction.SetInputType( VCL_INPUT_ANY ); - aAction.SetIdle( true ); + SwLayAction aAction(pRoot, pImp, &m_aWatch); aAction.SetWaitAllowed( false ); aAction.Action(pImp->GetShell()->GetOut()); bInterrupt = aAction.IsInterrupt(); diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx index 66775b933a8d..0095d134ba6d 100644 --- a/sw/source/core/view/viewsh.cxx +++ b/sw/source/core/view/viewsh.cxx @@ -291,7 +291,6 @@ void SwViewShell::ImplEndAction( const bool bIdleEnd ) aAction.SetComplete( false ); if ( mnLockPaint ) aAction.SetPaint( false ); - aAction.SetInputType( VclInputFlags::KEYBOARD ); aAction.Action(GetWin()); } |