diff options
Diffstat (limited to 'sw/source/core/inc/layact.hxx')
-rw-r--r-- | sw/source/core/inc/layact.hxx | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/sw/source/core/inc/layact.hxx b/sw/source/core/inc/layact.hxx new file mode 100644 index 000000000..990c0e4b8 --- /dev/null +++ b/sw/source/core/inc/layact.hxx @@ -0,0 +1,213 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#ifndef INCLUDED_SW_SOURCE_CORE_INC_LAYACT_HXX +#define INCLUDED_SW_SOURCE_CORE_INC_LAYACT_HXX + +#include <sal/config.h> + +#include <vcl/inputtypes.hxx> +#include <vcl/TaskStopwatch.hxx> +#include <tools/color.hxx> + +#include <ctime> +#include <memory> + +#include <swrect.hxx> + +class OutputDevice; +class SwRootFrame; +class SwLayoutFrame; +class SwPageFrame; +class SwFlyFrame; +class SwContentFrame; +class SwTabFrame; +class SwViewShellImp; +class SwContentNode; +class SwWait; + +/** + * The usage of LayAction is always the same: + * + * 1. Generation of the LayAction object. + * 2. Specifying the wanted behaviour via the Set-methods + * 3. Calling Action() + * 4. Soon after that the destruction of the object + * + * The object registers at the SwViewShellImp in the ctor and deregisters not until + * the dtor! + * It's a typical stack object. + */ +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. + // The first TabFrame that paints itself (per page) adds itself to the pointer. + // The ContentFrames beneath the page do not need to deregister at the Shell for + // painting. + const SwTabFrame *m_pOptTab; + + std::unique_ptr<SwWait> m_pWait; + + // If a paragraph (or anything else) moved more than one page when + // formatting, it adds its new page number here. + // The InternalAction can then take the appropriate steps. + sal_uInt16 m_nPreInvaPage; + + std::clock_t m_nStartTicks; // The Action's starting time; if too much time passes the + // WaitCursor can be enabled via CheckWaitCursor() + + sal_uInt16 m_nEndPage; // StatBar control + sal_uInt16 m_nCheckPageNum; // CheckPageDesc() was delayed if != USHRT_MAX + // check from this page onwards + + bool m_bPaint; // painting or only formatting? + bool m_bComplete; // Format everything or just the visible Area? + 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_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 + bool m_bWaitAllowed; // Waitcursor allowed? + bool m_bPaintExtraData; // Painting line numbers (or similar) enabled? + bool m_bActionInProgress; // Is set in Action() at the beginning and deleted at the end + + // OD 14.04.2003 #106346# - new flag for content formatting on interrupt. + bool mbFormatContentOnInterrupt; + + // for loop control by disabling in-row splitting within embedded tables + const SwPageFrame *m_pCurPage; + sal_uInt16 m_nTabLevel; // embedding level + sal_uInt32 m_nCallCount; // calling FormatLayoutTab on the same page + + void PaintContent( const SwContentFrame *, const SwPageFrame *, + const SwRect &rOldRect, long nOldBottom ); + bool PaintWithoutFlys( const SwRect &, const SwContentFrame *, + const SwPageFrame * ); + inline bool PaintContent_( const SwContentFrame *, const SwPageFrame *, + const SwRect & ); + + bool FormatLayout( OutputDevice* pRenderContext, SwLayoutFrame *, bool bAddRect = true ); + bool FormatLayoutTab( SwTabFrame *, bool bAddRect ); + bool FormatContent( const SwPageFrame* pPage ); + void FormatContent_( const SwContentFrame* pContent, + const SwPageFrame* pPage ); + bool IsShortCut( SwPageFrame *& ); + + bool TurboAction(); + bool TurboAction_( const SwContentFrame * ); + void InternalAction(OutputDevice* pRenderContext); + + static SwPageFrame *CheckFirstVisPage( SwPageFrame *pPage ); + + bool RemoveEmptyBrowserPages(); + +public: + SwLayAction(SwRootFrame *pRt, SwViewShellImp *pImp, TaskStopwatch* pWatch = nullptr); + ~SwLayAction(); + + 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 IsPaint() const { return m_bPaint; } + bool IsReschedule() const { return m_bReschedule; } + 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 SetCalcLayout ( bool bNew ) { m_bCalcLayout = bNew; } + void SetReschedule ( bool bNew ) { m_bReschedule = bNew; } + void SetWaitAllowed ( bool bNew ) { m_bWaitAllowed = bNew; } + + void SetAgain() { m_bAgain = true; } + void SetUpdateExpFields() {m_bUpdateExpFields = true; } + + inline void SetCheckPageNum( sal_uInt16 nNew ); + void SetCheckPageNumDirect( sal_uInt16 nNew ) { m_nCheckPageNum = nNew; } + + void Action(OutputDevice* pRenderContext); // here it begins + void Reset(); // back to CTor-defaults + + bool IsAgain() const { return m_bAgain; } + bool IsComplete() const { return m_bComplete; } + bool IsExpFields() const { return m_bUpdateExpFields; } + bool IsCalcLayout() const { return m_bCalcLayout; } + bool IsCheckPages() const { return m_bCheckPages; } + bool IsBrowseActionStop() const { return m_bBrowseActionStop; } + bool IsActionInProgress() const { return m_bActionInProgress; } + + sal_uInt16 GetCheckPageNum() const { return m_nCheckPageNum; } + + // others should be able to activate the WaitCursor, too + void CheckWaitCursor(); + + // #i28701# - method is now public; + // delete 2nd parameter, because it's not used; + void FormatLayoutFly( SwFlyFrame * ); + // #i28701# - method is now public + void FormatFlyContent( const SwFlyFrame * ); + +}; + +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; + + 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 ); + +public: + SwLayIdle( SwRootFrame *pRt, SwViewShellImp *pImp ); + ~SwLayIdle(); +}; + +inline void SwLayAction::SetCheckPageNum( sal_uInt16 nNew ) +{ + if ( nNew < m_nCheckPageNum ) + m_nCheckPageNum = nNew; +} + +#endif // INCLUDED_SW_SOURCE_CORE_INC_LAYACT_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |