diff options
Diffstat (limited to 'sw/source/core/inc/flyfrm.hxx')
-rw-r--r-- | sw/source/core/inc/flyfrm.hxx | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/sw/source/core/inc/flyfrm.hxx b/sw/source/core/inc/flyfrm.hxx new file mode 100644 index 000000000..467407d16 --- /dev/null +++ b/sw/source/core/inc/flyfrm.hxx @@ -0,0 +1,313 @@ +/* -*- 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_FLYFRM_HXX +#define INCLUDED_SW_SOURCE_CORE_INC_FLYFRM_HXX + +#include "layfrm.hxx" +#include <vector> +#include <frmfmt.hxx> +#include <anchoredobject.hxx> +#include <swdllapi.h> + +class SwFormatAnchor; +class SwPageFrame; +class SwFormatFrameSize; +struct SwCursorMoveState; +class SwBorderAttrs; +class SwVirtFlyDrawObj; +class SwAttrSetChg; +namespace tools { class PolyPolygon; } +class SwFormat; +class SwViewShell; +class SwFEShell; +class SwWrtShell; + + +/** search an anchor for paragraph bound frames starting from pOldAnch + + needed for dragging of objects bound to a paragraph for showing an anchor + indicator as well as for changing the anchor. + + implemented in layout/flycnt.cxx + */ +const SwContentFrame *FindAnchor( const SwFrame *pOldAnch, const Point &rNew, + const bool bBody = false ); + +/** calculate rectangle in that the object can be moved or rather be resized */ +bool CalcClipRect( const SdrObject *pSdrObj, SwRect &rRect, bool bMove = true ); + +enum class SwFlyFrameInvFlags : sal_uInt8 +{ + NONE = 0x00, + InvalidatePos = 0x01, + InvalidateSize = 0x02, + InvalidatePrt = 0x04, + SetNotifyBack = 0x08, + SetCompletePaint = 0x10, + InvalidateBrowseWidth = 0x20, + ClearContourCache = 0x40, + UpdateObjInSortedList = 0x80, +}; + +namespace o3tl { + template<> struct typed_flags<SwFlyFrameInvFlags> : is_typed_flags<SwFlyFrameInvFlags, 0x00ff> {}; +} + + +/** general base class for all free-flowing frames + + #i26791# - inherit also from <SwAnchoredFlyFrame> +*/ +class SW_DLLPUBLIC SwFlyFrame : public SwLayoutFrame, public SwAnchoredObject +{ + // is allowed to lock, implemented in frmtool.cxx + friend void AppendObj(SwFrame *const pFrame, SwPageFrame *const pPage, SwFrameFormat *const pFormat, const SwFormatAnchor & rAnch); + friend void Notify( SwFlyFrame *, SwPageFrame *pOld, const SwRect &rOld, + const SwRect* pOldPrt ); + + void InitDrawObj(SwFrame const&); // these to methods are called in the + void FinitDrawObj(); // constructors + + void UpdateAttr_( const SfxPoolItem*, const SfxPoolItem*, SwFlyFrameInvFlags &, + SwAttrSetChg *pa = nullptr, SwAttrSetChg *pb = nullptr ); + + using SwLayoutFrame::CalcRel; + +protected: + // Predecessor/Successor for chaining with text flow + SwFlyFrame *m_pPrevLink, *m_pNextLink; + static const SwFormatAnchor* GetAnchorFromPoolItem(const SfxPoolItem& rItem); + +private: + // It must be possible to block Content-bound flys so that they will be not + // formatted; in this case MakeAll() returns immediately. This is necessary + // for page changes during formatting. In addition, it is needed during + // the constructor call of the root object since otherwise the anchor will + // be formatted before the root is anchored correctly to a shell and + // because too much would be formatted as a result. + bool m_bLocked :1; + // true if the background of NotifyDTor needs to be notified at the end + // of a MakeAll() call. + bool m_bNotifyBack :1; + +protected: + // Pos, PrtArea or SSize have been invalidated - they will be evaluated + // again immediately because they have to be valid _at all time_. + // The invalidation is tracked here so that LayAction knows about it and + // can handle it properly. Exceptions prove the rule. + bool m_bInvalid :1; + + // true if the proposed height of an attribute is a minimal height + // (this means that the frame can grow higher if needed) + bool m_bMinHeight :1; + // true if the fly frame could not format position/size based on its + // attributes, e.g. because there was not enough space. + bool m_bHeightClipped :1; + bool m_bWidthClipped :1; + // If true then call only the format after adjusting the width (CheckClip); + // but the width will not be re-evaluated based on the attributes. + bool m_bFormatHeightOnly :1; + + bool m_bInCnt :1; ///< RndStdIds::FLY_AS_CHAR, anchored as character + bool m_bAtCnt :1; ///< RndStdIds::FLY_AT_PARA, anchored at paragraph + ///< or RndStdIds::FLY_AT_CHAR + bool m_bLayout :1; ///< RndStdIds::FLY_AT_PAGE, RndStdIds::FLY_AT_FLY, at page or at frame + bool m_bAutoPosition :1; ///< RndStdIds::FLY_AT_CHAR, anchored at character + bool m_bDeleted :1; ///< Anchored to a tracked deletion + size_t m_nAuthor; ///< Redline author index for colored crossing out + + friend class SwNoTextFrame; // is allowed to call NotifyBackground + + Point m_aContentPos; // content area's position relatively to Frame + bool m_bValidContentPos; + + virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override; + void MakePrtArea( const SwBorderAttrs &rAttrs ); + void MakeContentPos( const SwBorderAttrs &rAttrs ); + + void Lock() { m_bLocked = true; } + void Unlock() { m_bLocked = false; } + + Size CalcRel( const SwFormatFrameSize &rSz ) const; + + SwFlyFrame( SwFlyFrameFormat*, SwFrame*, SwFrame *pAnchor ); + + virtual void DestroyImpl() override; + virtual ~SwFlyFrame() override; + + /** method to assure that anchored object is registered at the correct + page frame + */ + virtual void RegisterAtCorrectPage() override; + virtual void RegisterAtPage(SwPageFrame &) override; + + virtual bool SetObjTop_( const SwTwips _nTop ) override; + virtual bool SetObjLeft_( const SwTwips _nLeft ) override; + + virtual SwRect GetObjBoundRect() const override; + virtual void SwClientNotify(const SwModify& rMod, const SfxHint& rHint) override; + + virtual const IDocumentDrawModelAccess& getIDocumentDrawModelAccess( ) override; + + SwTwips CalcContentHeight(const SwBorderAttrs *pAttrs, const SwTwips nMinHeight, const SwTwips nUL); + +public: + // #i26791# + + // get client information + virtual bool GetInfo( SfxPoolItem& ) const override; + virtual void PaintSwFrame( vcl::RenderContext& rRenderContext, SwRect const&, + SwPrintData const*const pPrintData = nullptr ) const override; + virtual Size ChgSize( const Size& aNewSize ) override; + virtual bool GetModelPositionForViewPoint( SwPosition *, Point&, + SwCursorMoveState* = nullptr, bool bTestBackground = false ) const override; + + virtual void CheckDirection( bool bVert ) override; + virtual void Cut() override; +#ifdef DBG_UTIL + virtual void Paste( SwFrame* pParent, SwFrame* pSibling = nullptr ) override; +#endif + + SwTwips Shrink_( SwTwips, bool bTst ); + SwTwips Grow_ ( SwTwips, bool bTst ); + void Invalidate_( SwPageFrame const *pPage = nullptr ); + + bool FrameSizeChg( const SwFormatFrameSize & ); + + SwFlyFrame *GetPrevLink() const { return m_pPrevLink; } + SwFlyFrame *GetNextLink() const { return m_pNextLink; } + + static void ChainFrames( SwFlyFrame *pMaster, SwFlyFrame *pFollow ); + static void UnchainFrames( SwFlyFrame *pMaster, SwFlyFrame *pFollow ); + + SwFlyFrame *FindChainNeighbour( SwFrameFormat const &rFormat, SwFrame *pAnch = nullptr ); + + // #i26791# + const SwVirtFlyDrawObj* GetVirtDrawObj() const; + SwVirtFlyDrawObj *GetVirtDrawObj(); + void NotifyDrawObj(); + + void ChgRelPos( const Point &rAbsPos ); + bool IsInvalid() const { return m_bInvalid; } + void Invalidate() const { const_cast<SwFlyFrame*>(this)->m_bInvalid = true; } + void Validate() const { const_cast<SwFlyFrame*>(this)->m_bInvalid = false; } + + bool IsMinHeight() const { return m_bMinHeight; } + bool IsLocked() const { return m_bLocked; } + bool IsAutoPos() const { return m_bAutoPosition; } + bool IsFlyInContentFrame() const { return m_bInCnt; } + bool IsFlyFreeFrame() const { return m_bAtCnt || m_bLayout; } + bool IsFlyLayFrame() const { return m_bLayout; } + bool IsFlyAtContentFrame() const { return m_bAtCnt; } + bool IsDeleted() const { return m_bDeleted; } + void SetDeleted(bool bDeleted) { m_bDeleted = bDeleted; } + void SetAuthor( size_t nAuthor ) { m_nAuthor = nAuthor; } + size_t GetAuthor() const { return m_nAuthor; } + + bool IsNotifyBack() const { return m_bNotifyBack; } + void SetNotifyBack() { m_bNotifyBack = true; } + void ResetNotifyBack() { m_bNotifyBack = false; } + + bool IsClipped() const { return m_bHeightClipped || m_bWidthClipped; } + bool IsHeightClipped() const { return m_bHeightClipped; } + + bool IsLowerOf( const SwLayoutFrame* pUpper ) const; + bool IsUpperOf( const SwFlyFrame& _rLower ) const + { + return _rLower.IsLowerOf( this ); + } + + SwFrame *FindLastLower(); + + // #i13147# - add parameter <_bForPaint> to avoid load of + // the graphic during paint. Default value: false + bool GetContour( tools::PolyPolygon& rContour, + const bool _bForPaint = false ) const; + + // Paint on this shell (consider Preview, print flag, etc. recursively)? + static bool IsPaint( SdrObject *pObj, const SwViewShell *pSh ); + + /** SwFlyFrame::IsBackgroundTransparent + + determines if background of fly frame has to be drawn transparently + + definition found in /core/layout/paintfrm.cxx + + @return true, if background color is transparent or an existing background + graphic is transparent. + */ + bool IsBackgroundTransparent() const; + + void Chain( SwFrame* _pAnchor ); + void Unchain(); + void InsertCnt(); + void DeleteCnt(); + void InsertColumns(); + + // #i26791# - pure virtual methods of base class <SwAnchoredObject> + virtual void MakeObjPos() override; + virtual void InvalidateObjPos() override; + + virtual SwFrameFormat& GetFrameFormat() override; + virtual const SwFrameFormat& GetFrameFormat() const override; + + virtual SwRect GetObjRect() const override; + + /** method to determine if a format on the Writer fly frame is possible + + #i28701# + refine 'IsFormatPossible'-conditions of method + <SwAnchoredObject::IsFormatPossible()> by: + format isn't possible, if Writer fly frame is locked resp. col-locked. + */ + virtual bool IsFormatPossible() const override; + static void GetAnchoredObjects( std::vector<SwAnchoredObject*>&, const SwFormat& rFormat ); + + // overwriting "SwFrameFormat *SwLayoutFrame::GetFormat" to provide the correct derived return type. + // (This is in order to skip on the otherwise necessary casting of the result to + // 'SwFlyFrameFormat *' after calls to this function. The casting is now done in this function.) + virtual const SwFlyFrameFormat *GetFormat() const override; + virtual SwFlyFrameFormat *GetFormat() override; + + virtual void dumpAsXml( xmlTextWriterPtr writer ) const override { SwLayoutFrame::dumpAsXml( writer ); }; + + virtual void Calc(vcl::RenderContext* pRenderContext) const override; + + const Point& ContentPos() const { return m_aContentPos; } + Point& ContentPos() { return m_aContentPos; } + + void InvalidateContentPos(); + + void SelectionHasChanged(SwFEShell* pShell); + bool IsShowUnfloatButton(SwWrtShell* pWrtSh) const; + + // For testing only (see uiwriter) + void ActiveUnfloatButton(SwWrtShell* pWrtSh); + + virtual const SwFlyFrame* DynCastFlyFrame() const override; + virtual SwFlyFrame* DynCastFlyFrame() override; + +private: + void UpdateUnfloatButton(SwWrtShell* pWrtSh, bool bShow) const; + void PaintDecorators() const; +}; +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |