summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sw/source/core/inc/layact.hxx27
-rw-r--r--sw/source/core/layout/layact.cxx59
-rw-r--r--sw/source/core/view/viewsh.cxx1
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());
}