summaryrefslogtreecommitdiffstats
path: root/sw/inc/frmfmt.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/inc/frmfmt.hxx')
-rw-r--r--sw/inc/frmfmt.hxx422
1 files changed, 422 insertions, 0 deletions
diff --git a/sw/inc/frmfmt.hxx b/sw/inc/frmfmt.hxx
new file mode 100644
index 000000000..bc0944fa3
--- /dev/null
+++ b/sw/inc/frmfmt.hxx
@@ -0,0 +1,422 @@
+/* -*- 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_INC_FRMFMT_HXX
+#define INCLUDED_SW_INC_FRMFMT_HXX
+
+#include <memory>
+#include <com/sun/star/text/PositionLayoutDir.hpp>
+#include <cppuhelper/weakref.hxx>
+#include <tools/gen.hxx>
+#include "format.hxx"
+#include "hintids.hxx"
+#include "swdllapi.h"
+#include <list>
+#include "textboxhelper.hxx"
+
+class SwFlyFrame;
+class SwFlyDrawContact;
+class SwAnchoredObject;
+class Graphic;
+class ImageMap;
+class IMapObject;
+class SwRect;
+class SdrObject;
+class SwRootFrame;
+class SwTableBox;
+
+namespace sw
+{
+ class DocumentLayoutManager;
+ // This is cheating: we are not really decoupling much with this hint.
+ // SwDrawFrameFormat should probably bookkeep its SdrObject (and
+ // SwDrawFrameFormat too) as members
+ struct SW_DLLPUBLIC FindSdrObjectHint final : SfxHint
+ {
+ SdrObject*& m_rpObject;
+ FindSdrObjectHint(SdrObject*& rpObject) : m_rpObject(rpObject) {};
+ virtual ~FindSdrObjectHint() override;
+ };
+}
+class SwFrameFormats;
+
+/// Style of a layout element.
+class SW_DLLPUBLIC SwFrameFormat
+ : public SwFormat
+{
+ friend class SwDoc;
+ friend class SwPageDesc; ///< Is allowed to call protected CTor.
+ friend class ::sw::DocumentLayoutManager; ///< Is allowed to call protected CTor.
+ friend class SwFrameFormats; ///< Is allowed to update the list backref.
+ friend class SwTextBoxHelper;
+ friend class SwUndoFlyBase; ///< calls SetOtherTextBoxFormat
+
+ css::uno::WeakReference<css::uno::XInterface> m_wXObject;
+
+ // DrawingLayer FillAttributes in a preprocessed form for primitive usage
+ drawinglayer::attribute::SdrAllFillAttributesHelperPtr maFillAttributes;
+
+ // The assigned SwFrmFmt list.
+ SwFrameFormats *m_ffList;
+
+ std::shared_ptr< SwTextBoxNode > m_pOtherTextBoxFormats;
+
+ struct change_name
+ {
+ change_name(const OUString &rName) : mName(rName) {}
+ void operator()(SwFormat *pFormat) { pFormat->m_aFormatName = mName; }
+ const OUString &mName;
+ };
+
+protected:
+ SwFrameFormat(
+ SwAttrPool& rPool,
+ const char* pFormatNm,
+ SwFrameFormat *pDrvdFrame,
+ sal_uInt16 nFormatWhich = RES_FRMFMT,
+ const WhichRangesContainer& pWhichRange = aFrameFormatSetRange);
+
+ SwFrameFormat(
+ SwAttrPool& rPool,
+ const OUString &rFormatNm,
+ SwFrameFormat *pDrvdFrame,
+ sal_uInt16 nFormatWhich = RES_FRMFMT,
+ const WhichRangesContainer& pWhichRange = aFrameFormatSetRange);
+
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+
+public:
+
+ const std::shared_ptr< SwTextBoxNode >& GetOtherTextBoxFormats() const { return m_pOtherTextBoxFormats; };
+ void SetOtherTextBoxFormats(const std::shared_ptr<SwTextBoxNode>& rNew) { m_pOtherTextBoxFormats = rNew; };
+
+ virtual ~SwFrameFormat() override;
+
+ SwFrameFormat(SwFrameFormat const &) = default;
+ SwFrameFormat(SwFrameFormat &&) = default;
+ SwFrameFormat & operator =(SwFrameFormat const &) = default;
+ SwFrameFormat & operator =(SwFrameFormat &&) = default;
+
+ /// Destroys all Frames in aDepend (Frames are identified via dynamic_cast).
+ virtual void DelFrames();
+
+ /// Creates the views.
+ virtual void MakeFrames();
+
+ virtual Graphic MakeGraphic( ImageMap* pMap = nullptr, const sal_uInt32 nMaximumQuadraticPixels = 500000, const std::optional<Size>& rTargetDPI = std::nullopt );
+
+ /** @return the IMapObject defined at format (Fly)
+ in the ImageMap at position Point.
+ rPoint - test on DocPosition.
+ pFly - optional FlyFrame, in case it is already known. */
+ IMapObject* GetIMapObject( const Point& rPoint,
+ const SwFlyFrame *pFly = nullptr ) const;
+
+ /** @return the real size of the frame - or an empty rectangle
+ if no layout exists.
+ If pPoint is given, look for the frame closest to it. */
+ SwRect FindLayoutRect( const bool bPrtArea = false,
+ const Point* pPoint = nullptr ) const;
+
+ /** @return the SdrObject, that is connected to the ContactObject.
+ Only DrawFrameFormats are connected to the "real SdrObject". FlyFrameFormats
+ are connected to a Master and all FlyFrames has the "real SdrObject".
+ "Real SdrObject" has position and a Z-order. */
+ SdrObject* FindSdrObject()
+ {
+ SdrObject* pObject(nullptr);
+ CallSwClientNotify(sw::FindSdrObjectHint(pObject));
+ return pObject;
+ }
+ const SdrObject *FindSdrObject() const
+ { return const_cast<SwFrameFormat*>(this)->FindSdrObject(); }
+
+ SdrObject *FindRealSdrObject();
+ const SdrObject *FindRealSdrObject() const
+ { return const_cast<SwFrameFormat*>(this)->FindRealSdrObject(); }
+
+ bool IsLowerOf( const SwFrameFormat& rFormat ) const;
+
+ enum tLayoutDir
+ {
+ HORI_L2R,
+ HORI_R2L,
+ VERT_R2L
+ };
+
+ virtual SwFrameFormat::tLayoutDir GetLayoutDir() const;
+ virtual void SetLayoutDir( const SwFrameFormat::tLayoutDir _eLayoutDir );
+
+ virtual sal_Int16 GetPositionLayoutDir() const;
+ virtual void SetPositionLayoutDir( const sal_Int16 _nPositionLayoutDir );
+
+ virtual OUString GetDescription() const;
+
+ SAL_DLLPRIVATE css::uno::WeakReference<css::uno::XInterface> const& GetXObject() const
+ { return m_wXObject; }
+ SAL_DLLPRIVATE void SetXObject(css::uno::Reference<css::uno::XInterface> const& xObject)
+ { m_wXObject = xObject; }
+
+ void RegisterToFormat( SwFormat& rFormat );
+
+ // Access to DrawingLayer FillAttributes in a preprocessed form for primitive usage
+ virtual drawinglayer::attribute::SdrAllFillAttributesHelperPtr getSdrAllFillAttributesHelper() const override;
+ virtual bool supportsFullDrawingLayerFillAttributeSet() const override;
+
+ void dumpAsXml(xmlTextWriterPtr pWriter) const;
+
+ virtual void SetName( const OUString& rNewName, bool bBroadcast=false ) override;
+ void MoveTableBox(SwTableBox& rTableBox, const SwFrameFormat* pOldFormat);
+};
+
+// The FlyFrame-Format
+
+class SW_DLLPUBLIC SwFlyFrameFormat final : public SwFrameFormat
+{
+ friend class SwDoc;
+ OUString msTitle;
+ OUString msDesc;
+ /// A tooltip has priority over an SwFormatURL and is not persisted to files.
+ OUString msTooltip;
+
+ /** Both not existent.
+ it stores the previous position of Prt rectangle from RequestObjectResize
+ so it can be used to move frames of non-resizable objects to align them correctly
+ when they get borders (this is done in SwWrtShell::CalcAndGetScale) */
+ Point m_aLastFlyFramePrtRectPos;
+ std::unique_ptr<SwFlyDrawContact> m_pContact;
+
+ SwFlyFrameFormat( const SwFlyFrameFormat &rCpy ) = delete;
+ SwFlyFrameFormat &operator=( const SwFlyFrameFormat &rCpy ) = delete;
+
+ SwFlyFrameFormat( SwAttrPool& rPool, const OUString &rFormatNm, SwFrameFormat *pDrvdFrame );
+
+public:
+ virtual ~SwFlyFrameFormat() override;
+
+ /// Creates the views.
+ virtual void MakeFrames() override;
+
+ SwFlyFrame* GetFrame( const Point* pDocPos = nullptr ) const;
+
+ SwAnchoredObject* GetAnchoredObj() const;
+
+ virtual Graphic MakeGraphic( ImageMap* pMap = nullptr, const sal_uInt32 nMaximumQuadraticPixels = 500000, const std::optional<Size>& rTargetDPI = std::nullopt ) override;
+
+ virtual bool GetInfo( SfxPoolItem& rInfo ) const override;
+
+ OUString GetObjTitle() const;
+ void SetObjTitle( const OUString& rTitle, bool bBroadcast = false );
+
+ const OUString & GetObjTooltip() const;
+ void SetObjTooltip(const OUString& rTooltip);
+
+ OUString GetObjDescription() const;
+ void SetObjDescription( const OUString& rDescription, bool bBroadcast = false );
+
+ /** SwFlyFrameFormat::IsBackgroundTransparent
+
+ Override virtual method and its default implementation,
+ because format of fly frame provides transparent backgrounds.
+ Method determines, if background of fly frame is transparent.
+
+ @return true, if background color is transparent, but not "no fill"
+ or an existing background graphic is transparent.
+ */
+ virtual bool IsBackgroundTransparent() const override;
+
+ /** SwFlyFrameFormat::IsBackgroundBrushInherited
+
+ Method to determine, if the brush for drawing the
+ background is "inherited" from its parent/grandparent.
+ This is the case, if no background graphic is set and the background
+ color is "no fill"/"auto fill"
+
+ @return true, if background brush is "inherited" from parent/grandparent
+ */
+ bool IsBackgroundBrushInherited() const;
+
+ const Point & GetLastFlyFramePrtRectPos() const { return m_aLastFlyFramePrtRectPos; }
+ void SetLastFlyFramePrtRectPos( const Point &rPoint ) { m_aLastFlyFramePrtRectPos = rPoint; }
+
+ SwFlyDrawContact* GetOrCreateContact();
+};
+
+//The DrawFrame-Format
+
+
+class SwDrawFrameFormat;
+class SwDrawContact;
+class SdrTextObj;
+
+namespace sw
+{
+ enum class DrawFrameFormatHintId {
+ DYING,
+ PREPPASTING,
+ PREP_INSERT_FLY,
+ PREP_DELETE_FLY,
+ PAGE_OUT_OF_BOUNDS,
+ MAKE_FRAMES,
+ DELETE_FRAMES,
+ POST_RESTORE_FLY_ANCHOR,
+ };
+ struct DrawFrameFormatHint final: SfxHint
+ {
+ DrawFrameFormatHintId m_eId;
+ DrawFrameFormatHint(DrawFrameFormatHintId eId) : m_eId(eId) {};
+ virtual ~DrawFrameFormatHint() override;
+ };
+ struct CheckDrawFrameFormatLayerHint final: SfxHint
+ {
+ bool* m_bCheckControlLayer;
+ CheckDrawFrameFormatLayerHint(bool* bCheckControlLayer) : m_bCheckControlLayer(bCheckControlLayer) {};
+ virtual ~CheckDrawFrameFormatLayerHint() override;
+ };
+ struct ContactChangedHint final: SfxHint
+ {
+ SdrObject** m_ppObject;
+ ContactChangedHint(SdrObject** ppObject) : m_ppObject(ppObject) {};
+ virtual ~ContactChangedHint() override;
+ };
+ struct DrawFormatLayoutCopyHint final : SfxHint
+ {
+ SwDrawFrameFormat& m_rDestFormat;
+ SwDoc& m_rDestDoc;
+ DrawFormatLayoutCopyHint(SwDrawFrameFormat& rDestFormat, SwDoc& rDestDoc) : m_rDestFormat(rDestFormat), m_rDestDoc(rDestDoc) {};
+ virtual ~DrawFormatLayoutCopyHint() override;
+ };
+ enum class WW8AnchorConv
+ {
+ NO_CONV,
+ CONV2PG,
+ CONV2COL_OR_PARA,
+ CONV2CHAR,
+ CONV2LINE,
+ RELTOTABLECELL
+ };
+ struct WW8AnchorConvResult final
+ {
+ WW8AnchorConv m_eHoriConv;
+ WW8AnchorConv m_eVertConv;
+ bool m_bConverted;
+ Point m_aPos;
+ WW8AnchorConvResult(WW8AnchorConv eHoriConv, WW8AnchorConv eVertConv) : m_eHoriConv(eHoriConv), m_eVertConv(eVertConv), m_bConverted(false) {};
+ };
+ struct SW_DLLPUBLIC WW8AnchorConvHint final : SfxHint
+ {
+ WW8AnchorConvResult& m_rResult;
+ WW8AnchorConvHint(WW8AnchorConvResult& rResult) : m_rResult(rResult) {};
+ virtual ~WW8AnchorConvHint() override;
+ };
+ struct RestoreFlyAnchorHint final : SfxHint
+ {
+ const Point m_aPos;
+ RestoreFlyAnchorHint(Point aPos) : m_aPos(aPos) {};
+ virtual ~RestoreFlyAnchorHint() override;
+ };
+ struct CreatePortionHint final : SfxHint
+ {
+ SwDrawContact** m_ppContact;
+ CreatePortionHint(SwDrawContact** ppContact) : m_ppContact(ppContact) {};
+ virtual ~CreatePortionHint() override;
+ };
+ struct CollectTextObjectsHint final : SfxHint
+ {
+ std::list<SdrTextObj*>& m_rTextObjects;
+ CollectTextObjectsHint(std::list<SdrTextObj*>& rTextObjects) : m_rTextObjects(rTextObjects) {};
+ virtual ~CollectTextObjectsHint() override;
+ };
+ struct GetZOrderHint final : SfxHint
+ {
+ sal_uInt32& m_rnZOrder;
+ GetZOrderHint(sal_uInt32& rnZOrder) : m_rnZOrder(rnZOrder) {};
+ virtual ~GetZOrderHint() override;
+ };
+ struct GetObjectConnectedHint final : SfxHint
+ {
+ bool& m_risConnected;
+ const SwRootFrame* m_pRoot;
+ GetObjectConnectedHint(bool& risConnected, const SwRootFrame* pRoot) : m_risConnected(risConnected), m_pRoot(pRoot) {};
+ virtual ~GetObjectConnectedHint() override;
+ };
+}
+
+class SW_DLLPUBLIC SwDrawFrameFormat final : public SwFrameFormat
+{
+ friend class SwDoc;
+
+ mutable const SdrObject * m_pSdrObjectCached;
+ mutable OUString m_sSdrObjectCachedComment;
+
+ SwDrawFrameFormat( const SwDrawFrameFormat &rCpy ) = delete;
+ SwDrawFrameFormat &operator=( const SwDrawFrameFormat &rCpy ) = delete;
+
+ SwFrameFormat::tLayoutDir meLayoutDir;
+
+ sal_Int16 mnPositionLayoutDir;
+
+ bool mbPosAttrSet;
+
+ SwDrawFrameFormat( SwAttrPool& rPool, const OUString &rFormatNm,
+ SwFrameFormat *pDrvdFrame )
+ : SwFrameFormat( rPool, rFormatNm, pDrvdFrame, RES_DRAWFRMFMT ),
+ m_pSdrObjectCached(nullptr),
+ meLayoutDir( SwFrameFormat::HORI_L2R ),
+
+ mnPositionLayoutDir( css::text::PositionLayoutDir::PositionInLayoutDirOfAnchor ),
+
+ mbPosAttrSet( false )
+ {}
+
+public:
+ virtual ~SwDrawFrameFormat() override;
+
+ /** DrawObjects are removed from the arrays at the layout.
+ The DrawObjects are marked as deleted. */
+ virtual void DelFrames() override;
+
+ /** Register DrawObjects in the arrays at layout.
+ Reset delete marks. */
+ virtual void MakeFrames() override;
+
+ virtual Graphic MakeGraphic( ImageMap* pMap = nullptr, const sal_uInt32 nMaximumQuadraticPixels = 500000, const std::optional<Size>& rTargetDPI = std::nullopt ) override;
+
+ virtual SwFrameFormat::tLayoutDir GetLayoutDir() const override;
+ virtual void SetLayoutDir( const SwFrameFormat::tLayoutDir _eLayoutDir ) override;
+
+ virtual sal_Int16 GetPositionLayoutDir() const override;
+ virtual void SetPositionLayoutDir( const sal_Int16 _nPositionLayoutDir ) override;
+
+ bool IsPosAttrSet() const { return mbPosAttrSet; }
+ void PosAttrSet() { mbPosAttrSet = true; }
+
+ virtual OUString GetDescription() const override;
+};
+
+namespace sw {
+
+SW_DLLPUBLIC bool IsFlyFrameFormatInHeader(const SwFrameFormat& rFormat);
+
+void CheckAnchoredFlyConsistency(SwDoc const& rDoc);
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */