summaryrefslogtreecommitdiffstats
path: root/sw/source/core/inc/viewimp.hxx
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:54:39 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:54:39 +0000
commit267c6f2ac71f92999e969232431ba04678e7437e (patch)
tree358c9467650e1d0a1d7227a21dac2e3d08b622b2 /sw/source/core/inc/viewimp.hxx
parentInitial commit. (diff)
downloadlibreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz
libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sw/source/core/inc/viewimp.hxx')
-rw-r--r--sw/source/core/inc/viewimp.hxx317
1 files changed, 317 insertions, 0 deletions
diff --git a/sw/source/core/inc/viewimp.hxx b/sw/source/core/inc/viewimp.hxx
new file mode 100644
index 0000000000..4b249154c2
--- /dev/null
+++ b/sw/source/core/inc/viewimp.hxx
@@ -0,0 +1,317 @@
+/* -*- 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_VIEWIMP_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_VIEWIMP_HXX
+
+#include <tools/color.hxx>
+#include <svx/svdtypes.hxx>
+#include <swrect.hxx>
+#include <swregion.hxx>
+#include <memory>
+#include <optional>
+#include <vector>
+
+class OutputDevice;
+class SwViewShell;
+class SwFlyFrame;
+class SwViewOption;
+class SwFrame;
+class SwLayAction;
+class SwLayIdle;
+class SwDrawView;
+class SdrPageView;
+class SwPageFrame;
+class SwAccessibleMap;
+class SdrObject;
+class Fraction;
+class SwPrintData;
+class SwPagePreviewLayout;
+struct PreviewPage;
+class SwTextFrame;
+// --> OD #i76669#
+namespace sdr::contact { class ViewObjectContactRedirector; }
+// <--
+
+class SwViewShellImp
+{
+ friend class SwViewShell;
+
+ friend class SwLayAction; // Lay- and IdleAction register and deregister
+ friend class SwLayIdle;
+
+ // for paint of page preview
+ friend class SwPagePreviewLayout;
+
+ SwViewShell *m_pShell; // If someone passes an Imp, but needs a SwViewShell, we
+ // keep a backlink here
+
+ std::unique_ptr<SwDrawView> m_pDrawView; // Our DrawView
+ SdrPageView *m_pSdrPageView; // Exactly one Page for our DrawView
+
+ SwPageFrame *m_pFirstVisiblePage; // Always points to the first visible Page
+ std::optional<SwRegionRects> m_oPaintRegion; // Collector of Paintrects from the LayAction
+
+ std::vector<SwRect> m_pendingLOKInvalidations;
+
+ SwLayAction *m_pLayAction; // Is set if an Action object exists
+ // Is registered by the SwLayAction ctor and deregistered by the dtor
+ SwLayIdle *m_pIdleAct; // The same as SwLayAction for SwLayIdle
+
+ /// note: the map is *uniquely* owned here - the shared_ptr is only
+ /// used so that SwAccessibleContext can check via weak_ptr that it's alive
+ std::shared_ptr<SwAccessibleMap> m_pAccessibleMap;
+
+ bool m_bFirstPageInvalid : 1; // Pointer to the first Page invalid?
+ bool m_bResetHdlHiddenPaint : 1; // Ditto
+ bool m_bSmoothUpdate : 1; // For SmoothScroll
+ bool m_bStopSmooth : 1;
+
+ sal_uInt16 m_nRestoreActions ; // Count for the Action that need to be restored (UNO)
+ SwRect m_aSmoothRect;
+
+ std::unique_ptr<SwPagePreviewLayout> m_pPagePreviewLayout;
+
+ void SetFirstVisPage(OutputDevice const * pRenderContext); // Recalculate the first visible Page
+
+ void StartAction(); // Show handle and hide
+ void EndAction(); // Called by SwViewShell::ImplXXXAction
+ void LockPaint(); // Ditto; called by SwViewShell::ImplLockPaint
+ void UnlockPaint();
+
+private:
+
+ SwAccessibleMap *CreateAccessibleMap();
+
+ /** invalidate CONTENT_FLOWS_FROM/_TO relation for paragraphs
+
+ #i27138#
+ implementation for wrapper method
+ <SwViewShell::InvalidateAccessibleParaFlowRelation(..)>
+
+ @param _pFromTextFrame
+ input parameter - paragraph frame, for which the relation CONTENT_FLOWS_FROM
+ has to be invalidated.
+ If NULL, no CONTENT_FLOWS_FROM relation has to be invalidated
+
+ @param _pToTextFrame
+ input parameter - paragraph frame, for which the relation CONTENT_FLOWS_TO
+ has to be invalidated.
+ If NULL, no CONTENT_FLOWS_TO relation has to be invalidated
+ */
+ void InvalidateAccessibleParaFlowRelation_( const SwTextFrame* _pFromTextFrame,
+ const SwTextFrame* _pToTextFrame );
+
+ /** invalidate text selection for paragraphs
+
+ #i27301#
+ implementation for wrapper method
+ <SwViewShell::InvalidateAccessibleParaTextSelection(..)>
+ */
+ void InvalidateAccessibleParaTextSelection_();
+
+ /** invalidate attributes for paragraphs and paragraph's characters
+
+ #i88069#
+ implementation for wrapper method
+ <SwViewShell::InvalidateAccessibleParaAttrs(..)>
+ */
+ void InvalidateAccessibleParaAttrs_( const SwTextFrame& rTextFrame );
+
+public:
+ SwViewShellImp( SwViewShell * );
+ ~SwViewShellImp();
+ void Init( const SwViewOption * ); /// Only for SwViewShell::Init()
+
+ const SwViewShell *GetShell() const { return m_pShell; }
+ SwViewShell *GetShell() { return m_pShell; }
+
+ Color GetRetoucheColor() const;
+
+ /// Management of the first visible Page
+ const SwPageFrame *GetFirstVisPage(OutputDevice const * pRenderContext) const;
+ SwPageFrame *GetFirstVisPage(OutputDevice const * pRenderContext);
+ void SetFirstVisPageInvalid() { m_bFirstPageInvalid = true; }
+
+ const SwPageFrame* GetLastVisPage(const OutputDevice* pRenderContext) const;
+
+ bool AddPaintRect( const SwRect &rRect );
+ bool HasPaintRegion() { return m_oPaintRegion.has_value(); }
+ std::optional<SwRegionRects> TakePaintRegion() { auto ret = std::move(m_oPaintRegion); m_oPaintRegion.reset(); return ret; }
+ const std::optional<SwRegionRects>& GetPaintRegion() { return m_oPaintRegion; }
+ void DeletePaintRegion() { m_oPaintRegion.reset(); }
+
+ void AddPendingLOKInvalidation( const SwRect& rRect );
+ std::vector<SwRect> TakePendingLOKInvalidations();
+
+ /// New Interface for StarView Drawing
+ bool HasDrawView() const { return nullptr != m_pDrawView; }
+ SwDrawView* GetDrawView() { return m_pDrawView.get(); }
+ const SwDrawView* GetDrawView() const { return m_pDrawView.get(); }
+ SdrPageView*GetPageView() { return m_pSdrPageView; }
+ const SdrPageView*GetPageView() const { return m_pSdrPageView; }
+ void MakeDrawView();
+
+ /**
+ * @param _pPageBackgrdColor for setting this color as the background color
+ * at the outliner of the draw view for painting layers "hell" and "heaven"
+ *
+ * @param _bIsPageRightToLeft for the horizontal text direction of the page
+ * in order to set the default horizontal text direction at the outliner of
+ * the draw view for painting layers "hell" and "heaven"
+ */
+ void PaintLayer( const SdrLayerID _nLayerID,
+ SwPrintData const*const pPrintData,
+ SwPageFrame const& rPageFrame,
+ const SwRect& _rRect,
+ const Color* _pPageBackgrdColor,
+ const bool _bIsPageRightToLeft,
+ sdr::contact::ViewObjectContactRedirector* pRedirector );
+
+ /**
+ * Is passed to the DrawEngine as a Link and decides what is painted
+ * or not and in what way
+ */
+
+ // Interface Drawing
+ bool IsDragPossible( const Point &rPoint );
+ void NotifySizeChg( const Size &rNewSz );
+
+ /// SS for the Lay-/IdleAction and relatives
+ bool IsAction() const { return m_pLayAction != nullptr; }
+ bool IsIdleAction() const { return m_pIdleAct != nullptr; }
+ SwLayAction &GetLayAction() { return *m_pLayAction; }
+ const SwLayAction &GetLayAction() const { return *m_pLayAction; }
+
+ /**
+ * If an Action is running we ask it to check whether it's time
+ * to enable the WaitCursor
+ */
+ void CheckWaitCursor();
+
+ /// Asks the LayAction if present
+ bool IsCalcLayoutProgress() const;
+
+ /**
+ * @returns true if a LayAction is running
+ *
+ * There we also set the Flag for ExpressionFields
+ */
+ bool IsUpdateExpFields();
+
+ void SetRestoreActions(sal_uInt16 nSet){m_nRestoreActions = nSet;}
+ sal_uInt16 GetRestoreActions() const{return m_nRestoreActions;}
+
+ void InitPagePreviewLayout();
+
+ SwPagePreviewLayout* PagePreviewLayout()
+ {
+ return m_pPagePreviewLayout.get();
+ }
+
+ /// Is this view accessible?
+ bool IsAccessible() const { return m_pAccessibleMap != nullptr; }
+
+ inline SwAccessibleMap& GetAccessibleMap();
+
+ /// Update (this) accessible view
+ void UpdateAccessible();
+
+ /// Remove a frame from the accessible view
+ void DisposeAccessible( const SwFrame *pFrame, const SdrObject *pObj,
+ bool bRecursive, bool bCanSkipInvisible );
+ inline void DisposeAccessibleFrame( const SwFrame *pFrame,
+ bool bRecursive = false );
+ inline void DisposeAccessibleObj( const SdrObject *pObj, bool bCanSkipInvisible );
+
+ /// Move a frame's position in the accessible view
+ void MoveAccessible( const SwFrame *pFrame, const SdrObject *pObj,
+ const SwRect& rOldFrame );
+ inline void MoveAccessibleFrame( const SwFrame *pFrame, const SwRect& rOldFrame );
+
+ /// Add a frame in the accessible view
+ inline void AddAccessibleFrame( const SwFrame *pFrame );
+
+ inline void AddAccessibleObj( const SdrObject *pObj );
+
+ /// Invalidate accessible frame's content
+ void InvalidateAccessibleFrameContent( const SwFrame *pFrame );
+
+ /// Invalidate accessible frame's cursor position
+ void InvalidateAccessibleCursorPosition( const SwFrame *pFrame );
+
+ /// Invalidate editable state for all accessible frames
+ void InvalidateAccessibleEditableState( bool bAllShells,
+ const SwFrame *pFrame=nullptr );
+
+ /// Invalidate frame's relation set (for chained frames)
+ void InvalidateAccessibleRelationSet( const SwFlyFrame *pMaster,
+ const SwFlyFrame *pFollow );
+
+ /// update data for accessible preview
+ /// change method signature due to new page preview functionality
+ void UpdateAccessiblePreview( const std::vector<std::unique_ptr<PreviewPage>>& _rPreviewPages,
+ const Fraction& _rScale,
+ const SwPageFrame* _pSelectedPageFrame,
+ const Size& _rPreviewWinSize );
+
+ void InvalidateAccessiblePreviewSelection( sal_uInt16 nSelPage );
+
+ /// Fire all accessible events that have been collected so far
+ void FireAccessibleEvents();
+};
+
+inline SwAccessibleMap& SwViewShellImp::GetAccessibleMap()
+{
+ if( !m_pAccessibleMap )
+ CreateAccessibleMap();
+
+ return *m_pAccessibleMap;
+}
+
+inline void SwViewShellImp::DisposeAccessibleFrame( const SwFrame *pFrame,
+ bool bRecursive )
+{
+ DisposeAccessible( pFrame, nullptr, bRecursive, true );
+}
+
+inline void SwViewShellImp::DisposeAccessibleObj( const SdrObject *pObj, bool bCanSkipInvisible )
+{
+ DisposeAccessible( nullptr, pObj, false, bCanSkipInvisible );
+}
+
+inline void SwViewShellImp::MoveAccessibleFrame( const SwFrame *pFrame,
+ const SwRect& rOldFrame )
+{
+ MoveAccessible( pFrame, nullptr, rOldFrame );
+}
+
+inline void SwViewShellImp::AddAccessibleFrame( const SwFrame *pFrame )
+{
+ SwRect aEmptyRect;
+ MoveAccessible( pFrame, nullptr, aEmptyRect );
+}
+
+inline void SwViewShellImp::AddAccessibleObj( const SdrObject *pObj )
+{
+ SwRect aEmptyRect;
+ MoveAccessible( nullptr, pObj, aEmptyRect );
+}
+#endif // INCLUDED_SW_SOURCE_CORE_INC_VIEWIMP_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */