summaryrefslogtreecommitdiffstats
path: root/sw/source/core/inc
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
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')
-rw-r--r--sw/source/core/inc/AccessibilityCheck.hxx59
-rw-r--r--sw/source/core/inc/AccessibilityIssue.hxx89
-rw-r--r--sw/source/core/inc/DateFormFieldButton.hxx47
-rw-r--r--sw/source/core/inc/DocumentChartDataProviderManager.hxx65
-rw-r--r--sw/source/core/inc/DocumentContentOperationsManager.hxx190
-rw-r--r--sw/source/core/inc/DocumentDeviceManager.hxx81
-rw-r--r--sw/source/core/inc/DocumentDrawModelManager.hxx86
-rw-r--r--sw/source/core/inc/DocumentExternalDataManager.hxx44
-rw-r--r--sw/source/core/inc/DocumentFieldsManager.hxx111
-rw-r--r--sw/source/core/inc/DocumentLayoutManager.hxx76
-rw-r--r--sw/source/core/inc/DocumentLinksAdministrationManager.hxx86
-rw-r--r--sw/source/core/inc/DocumentListItemsManager.hxx71
-rw-r--r--sw/source/core/inc/DocumentListsManager.hxx74
-rw-r--r--sw/source/core/inc/DocumentOutlineNodesManager.hxx65
-rw-r--r--sw/source/core/inc/DocumentRedlineManager.hxx189
-rw-r--r--sw/source/core/inc/DocumentSettingManager.hxx227
-rw-r--r--sw/source/core/inc/DocumentStateManager.hxx62
-rw-r--r--sw/source/core/inc/DocumentStatisticsManager.hxx69
-rw-r--r--sw/source/core/inc/DocumentStylePoolManager.hxx61
-rw-r--r--sw/source/core/inc/DocumentTimerManager.hxx87
-rw-r--r--sw/source/core/inc/DropDownFormFieldButton.hxx41
-rw-r--r--sw/source/core/inc/FormFieldButton.hxx52
-rw-r--r--sw/source/core/inc/GraphicSizeCheck.hxx111
-rw-r--r--sw/source/core/inc/MarkManager.hxx168
-rw-r--r--sw/source/core/inc/ModelTraverser.hxx51
-rw-r--r--sw/source/core/inc/SearchResultLocator.hxx71
-rw-r--r--sw/source/core/inc/SwGrammarMarkUp.hxx71
-rw-r--r--sw/source/core/inc/SwPortionHandler.hxx98
-rw-r--r--sw/source/core/inc/SwUndoFmt.hxx257
-rw-r--r--sw/source/core/inc/SwUndoPageDesc.hxx88
-rw-r--r--sw/source/core/inc/SwUndoTOXChange.hxx45
-rw-r--r--sw/source/core/inc/SwXMLBlockExport.hxx63
-rw-r--r--sw/source/core/inc/SwXMLBlockImport.hxx126
-rw-r--r--sw/source/core/inc/SwXMLTextBlocks.hxx98
-rw-r--r--sw/source/core/inc/SwXTextDefaults.hxx65
-rw-r--r--sw/source/core/inc/TextFrameIndex.hxx26
-rw-r--r--sw/source/core/inc/ThemeColorChanger.hxx33
-rw-r--r--sw/source/core/inc/UndoAttribute.hxx269
-rw-r--r--sw/source/core/inc/UndoBookmark.hxx157
-rw-r--r--sw/source/core/inc/UndoCore.hxx297
-rw-r--r--sw/source/core/inc/UndoDelete.hxx112
-rw-r--r--sw/source/core/inc/UndoDraw.hxx134
-rw-r--r--sw/source/core/inc/UndoInsert.hxx228
-rw-r--r--sw/source/core/inc/UndoManager.hxx143
-rw-r--r--sw/source/core/inc/UndoNumbering.hxx142
-rw-r--r--sw/source/core/inc/UndoOverwrite.hxx93
-rw-r--r--sw/source/core/inc/UndoRedline.hxx148
-rw-r--r--sw/source/core/inc/UndoSection.hxx101
-rw-r--r--sw/source/core/inc/UndoSort.hxx76
-rw-r--r--sw/source/core/inc/UndoSplitMove.hxx85
-rw-r--r--sw/source/core/inc/UndoTable.hxx429
-rw-r--r--sw/source/core/inc/UndoThemeChange.hxx35
-rw-r--r--sw/source/core/inc/acorrect.hxx121
-rw-r--r--sw/source/core/inc/anchoredobjectposition.hxx447
-rw-r--r--sw/source/core/inc/annotationmark.hxx48
-rw-r--r--sw/source/core/inc/ascharanchoredobjectposition.hxx160
-rw-r--r--sw/source/core/inc/attrhint.hxx31
-rw-r--r--sw/source/core/inc/bodyfrm.hxx42
-rw-r--r--sw/source/core/inc/bookmark.hxx367
-rw-r--r--sw/source/core/inc/cellfrm.hxx78
-rw-r--r--sw/source/core/inc/cntfrm.hxx147
-rw-r--r--sw/source/core/inc/colfrm.hxx42
-rw-r--r--sw/source/core/inc/contentcontrolbutton.hxx53
-rw-r--r--sw/source/core/inc/crossrefbookmark.hxx88
-rw-r--r--sw/source/core/inc/datecontentcontrolbutton.hxx41
-rw-r--r--sw/source/core/inc/dbg_lay.hxx105
-rw-r--r--sw/source/core/inc/dflyobj.hxx154
-rw-r--r--sw/source/core/inc/dialoghelp.hxx30
-rw-r--r--sw/source/core/inc/docedt.hxx31
-rw-r--r--sw/source/core/inc/docfld.hxx188
-rw-r--r--sw/source/core/inc/docredln.hxx35
-rw-r--r--sw/source/core/inc/docsort.hxx152
-rw-r--r--sw/source/core/inc/doctxm.hxx114
-rw-r--r--sw/source/core/inc/drawfont.hxx639
-rw-r--r--sw/source/core/inc/dropdowncontentcontrolbutton.hxx39
-rw-r--r--sw/source/core/inc/dumpfilter.hxx59
-rw-r--r--sw/source/core/inc/dview.hxx125
-rw-r--r--sw/source/core/inc/environmentofanchoredobject.hxx94
-rw-r--r--sw/source/core/inc/fefly.hxx30
-rw-r--r--sw/source/core/inc/fieldhint.hxx44
-rw-r--r--sw/source/core/inc/flowfrm.hxx280
-rw-r--r--sw/source/core/inc/flyfrm.hxx316
-rw-r--r--sw/source/core/inc/flyfrms.hxx254
-rw-r--r--sw/source/core/inc/fntcache.hxx146
-rw-r--r--sw/source/core/inc/fntcap.hxx37
-rw-r--r--sw/source/core/inc/frame.hxx1446
-rw-r--r--sw/source/core/inc/frminf.hxx75
-rw-r--r--sw/source/core/inc/frmtool.hxx626
-rw-r--r--sw/source/core/inc/ftnboss.hxx131
-rw-r--r--sw/source/core/inc/ftnfrm.hxx171
-rw-r--r--sw/source/core/inc/hffrm.hxx68
-rw-r--r--sw/source/core/inc/ifinishedthreadlistener.hxx46
-rw-r--r--sw/source/core/inc/layact.hxx235
-rw-r--r--sw/source/core/inc/laycache.hxx69
-rw-r--r--sw/source/core/inc/layfrm.hxx225
-rw-r--r--sw/source/core/inc/layouter.hxx146
-rw-r--r--sw/source/core/inc/movedfwdfrmsbyobjpos.hxx58
-rw-r--r--sw/source/core/inc/mvsave.hxx201
-rw-r--r--sw/source/core/inc/node2lay.hxx90
-rw-r--r--sw/source/core/inc/noteurl.hxx32
-rw-r--r--sw/source/core/inc/notxtfrm.hxx116
-rw-r--r--sw/source/core/inc/objectformatter.hxx175
-rw-r--r--sw/source/core/inc/observablethread.hxx87
-rw-r--r--sw/source/core/inc/pagedeschint.hxx40
-rw-r--r--sw/source/core/inc/pagefrm.hxx468
-rw-r--r--sw/source/core/inc/paintfrm.hxx37
-rw-r--r--sw/source/core/inc/pamtyp.hxx122
-rw-r--r--sw/source/core/inc/prevwpage.hxx53
-rw-r--r--sw/source/core/inc/ptqueue.hxx57
-rw-r--r--sw/source/core/inc/retrievedinputstreamdata.hxx90
-rw-r--r--sw/source/core/inc/retrieveinputstream.hxx55
-rw-r--r--sw/source/core/inc/retrieveinputstreamconsumer.hxx59
-rw-r--r--sw/source/core/inc/rolbck.hxx443
-rw-r--r--sw/source/core/inc/rootfrm.hxx489
-rw-r--r--sw/source/core/inc/rowfrm.hxx131
-rw-r--r--sw/source/core/inc/scriptinfo.hxx398
-rw-r--r--sw/source/core/inc/sectfrm.hxx189
-rw-r--r--sw/source/core/inc/sortedobjs.hxx100
-rw-r--r--sw/source/core/inc/swblocks.hxx129
-rw-r--r--sw/source/core/inc/swcache.hxx268
-rw-r--r--sw/source/core/inc/swfntcch.hxx76
-rw-r--r--sw/source/core/inc/swfont.hxx1010
-rw-r--r--sw/source/core/inc/swselectionlist.hxx91
-rw-r--r--sw/source/core/inc/swthreadjoiner.hxx42
-rw-r--r--sw/source/core/inc/swthreadmanager.hxx78
-rw-r--r--sw/source/core/inc/tabfrm.hxx265
-rw-r--r--sw/source/core/inc/tblrwcl.hxx197
-rw-r--r--sw/source/core/inc/textapi.hxx66
-rw-r--r--sw/source/core/inc/threadlistener.hxx55
-rw-r--r--sw/source/core/inc/tocntntanchoredobjectposition.hxx93
-rw-r--r--sw/source/core/inc/tolayoutanchoredobjectposition.hxx52
-rw-r--r--sw/source/core/inc/txmsrt.hxx310
-rw-r--r--sw/source/core/inc/txtfly.hxx389
-rw-r--r--sw/source/core/inc/txtfrm.hxx1060
-rw-r--r--sw/source/core/inc/txttypes.hxx98
-rw-r--r--sw/source/core/inc/undoflystrattr.hxx66
-rw-r--r--sw/source/core/inc/unobookmark.hxx240
-rw-r--r--sw/source/core/inc/unocontentcontrol.hxx170
-rw-r--r--sw/source/core/inc/unoevent.hxx95
-rw-r--r--sw/source/core/inc/unofield.hxx229
-rw-r--r--sw/source/core/inc/unoflatpara.hxx138
-rw-r--r--sw/source/core/inc/unofldmid.h58
-rw-r--r--sw/source/core/inc/unofootnote.hxx136
-rw-r--r--sw/source/core/inc/unoidx.hxx214
-rw-r--r--sw/source/core/inc/unolinebreak.hxx86
-rw-r--r--sw/source/core/inc/unometa.hxx265
-rw-r--r--sw/source/core/inc/unoparaframeenum.hxx79
-rw-r--r--sw/source/core/inc/unoport.hxx314
-rw-r--r--sw/source/core/inc/unorefmark.hxx108
-rw-r--r--sw/source/core/inc/unosection.hxx155
-rw-r--r--sw/source/core/inc/unotextmarkup.hxx103
-rw-r--r--sw/source/core/inc/viewimp.hxx317
-rw-r--r--sw/source/core/inc/visiturl.hxx40
-rw-r--r--sw/source/core/inc/vprint.hxx34
-rw-r--r--sw/source/core/inc/wrong.hxx413
155 files changed, 24556 insertions, 0 deletions
diff --git a/sw/source/core/inc/AccessibilityCheck.hxx b/sw/source/core/inc/AccessibilityCheck.hxx
new file mode 100644
index 0000000000..caaff19448
--- /dev/null
+++ b/sw/source/core/inc/AccessibilityCheck.hxx
@@ -0,0 +1,59 @@
+/* -*- 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/.
+ *
+ */
+
+#pragma once
+
+#include <sfx2/AccessibilityCheck.hxx>
+#include <doc.hxx>
+#include <node.hxx>
+
+namespace sw
+{
+/** Base class for accessibility checks */
+class BaseCheck
+{
+protected:
+ sfx::AccessibilityIssueCollection& m_rIssueCollection;
+
+public:
+ BaseCheck(sfx::AccessibilityIssueCollection& rIssueCollection)
+ : m_rIssueCollection(rIssueCollection)
+ {
+ }
+ virtual ~BaseCheck() {}
+};
+
+class SW_DLLPUBLIC AccessibilityCheck final : public sfx::AccessibilityCheck
+{
+private:
+ SwDoc* m_pDoc;
+
+ std::vector<std::shared_ptr<BaseCheck>> m_aDocumentChecks;
+ std::vector<std::shared_ptr<BaseCheck>> m_aNodeChecks;
+
+ AccessibilityCheck() = delete;
+
+ void init();
+
+public:
+ AccessibilityCheck(SwDoc* pDoc)
+ : m_pDoc(pDoc)
+ {
+ }
+
+ void check() override;
+ void checkObject(SwNode* pNode, SdrObject* pObject);
+ void checkNode(SwNode* pNode);
+ void checkDocumentProperties();
+};
+
+} // end sw namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/AccessibilityIssue.hxx b/sw/source/core/inc/AccessibilityIssue.hxx
new file mode 100644
index 0000000000..5fe9857b99
--- /dev/null
+++ b/sw/source/core/inc/AccessibilityIssue.hxx
@@ -0,0 +1,89 @@
+/* -*- 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/.
+ *
+ */
+
+#ifndef INCLUDED_SW_SOURCE_CORE_ACCESSIBILITYISSUE_HXX
+#define INCLUDED_SW_SOURCE_CORE_ACCESSIBILITYISSUE_HXX
+
+#include <sfx2/AccessibilityIssue.hxx>
+#include <doc.hxx>
+#include <txtftn.hxx>
+
+namespace sw
+{
+enum class IssueObject
+{
+ UNKNOWN,
+ GRAPHIC,
+ OLE,
+ SHAPE,
+ FORM,
+ TABLE,
+ TEXT,
+ DOCUMENT_TITLE,
+ DOCUMENT_BACKGROUND,
+ LANGUAGE_NOT_SET,
+ FOOTENDNOTE,
+ TEXTFRAME,
+ LINKED,
+};
+
+class SW_DLLPUBLIC AccessibilityIssue final : public sfx::AccessibilityIssue
+{
+private:
+ IssueObject m_eIssueObject;
+ SwDoc* m_pDoc;
+ OUString m_sObjectID;
+ std::vector<OUString> m_aIssueAdditionalInfo;
+ SwNode* m_pNode;
+ SwTextFootnote* m_pTextFootnote;
+
+ sal_Int32 m_nStart;
+ sal_Int32 m_nEnd;
+
+public:
+ AccessibilityIssue(sfx::AccessibilityIssueID eIssueID = sfx::AccessibilityIssueID::UNSPECIFIED);
+ AccessibilityIssue(AccessibilityIssue const&) = default;
+
+ void setIssueObject(IssueObject eIssueObject);
+ void setDoc(SwDoc& rDoc);
+ void setObjectID(OUString const& rID);
+ void setNode(SwNode* pNode) { m_pNode = pNode; }
+ void setTextFootnote(SwTextFootnote* pTextFootnote) { m_pTextFootnote = pTextFootnote; }
+
+ void setStart(sal_Int32 nStart) { m_nStart = nStart; }
+
+ void setEnd(sal_Int32 nEnd) { m_nEnd = nEnd; }
+
+ std::vector<OUString> const& getAdditionalInfo() const { return m_aIssueAdditionalInfo; }
+
+ void setAdditionalInfo(std::vector<OUString>&& rIssueAdditionalInfo)
+ {
+ m_aIssueAdditionalInfo = std::move(rIssueAdditionalInfo);
+ }
+
+ bool canGotoIssue() const override;
+ void gotoIssue() const override;
+
+ bool canQuickFixIssue() const override;
+ void quickFixIssue() const override;
+
+ sal_Int32 getStart() { return m_nStart; }
+ sal_Int32 getEnd() { return m_nEnd; }
+ SwNode* getNode() { return m_pNode; }
+ SwTextFootnote* getTextFootnote() { return m_pTextFootnote; }
+
+ AccessibilityIssue& operator=(const AccessibilityIssue&) = default;
+};
+
+} // end sw namespace
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DateFormFieldButton.hxx b/sw/source/core/inc/DateFormFieldButton.hxx
new file mode 100644
index 0000000000..3d74706a8a
--- /dev/null
+++ b/sw/source/core/inc/DateFormFieldButton.hxx
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#ifndef INCLUDED_SW_SOURCE_CORE_TEXT_DATEFORMEFIELDBUTTO_HXX
+#define INCLUDED_SW_SOURCE_CORE_TEXT_DATEFORMEFIELDBUTTO_HXX
+
+#include "FormFieldButton.hxx"
+
+class SwEditWin;
+class SvNumberFormatter;
+namespace sw::mark
+{
+class DateFieldmark;
+}
+
+/**
+ * This button is shown when the cursor is on a date form field.
+ * The user can select a date from a date picker while filling in a form.
+ */
+class DateFormFieldButton final : public FormFieldButton
+{
+private:
+ SvNumberFormatter* m_pNumberFormatter;
+ sw::mark::DateFieldmark* m_pDateFieldmark;
+
+ std::unique_ptr<weld::Calendar> m_xCalendar;
+
+ DECL_LINK(ImplSelectHdl, weld::Calendar&, void);
+
+public:
+ DateFormFieldButton(SwEditWin* pEditWin, sw::mark::DateFieldmark& rFieldMark,
+ SvNumberFormatter* pNumberFormatter);
+ virtual ~DateFormFieldButton() override;
+
+ virtual void LaunchPopup() override;
+ virtual void DestroyPopup() override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sw/source/core/inc/DocumentChartDataProviderManager.hxx b/sw/source/core/inc/DocumentChartDataProviderManager.hxx
new file mode 100644
index 0000000000..f887702bb5
--- /dev/null
+++ b/sw/source/core/inc/DocumentChartDataProviderManager.hxx
@@ -0,0 +1,65 @@
+/* -*- 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_DOCUMENTCHARTDATAPROVIDEMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTCHARTDATAPROVIDEMANAGER_HXX
+
+#include <IDocumentChartDataProviderAccess.hxx>
+#include <rtl/ref.hxx>
+#include <memory>
+
+class SwTable;
+class SwChartDataProvider;
+class SwChartLockController_Helper;
+class SwDoc;
+
+
+namespace sw {
+
+class DocumentChartDataProviderManager final : public IDocumentChartDataProviderAccess
+{
+
+public:
+
+ DocumentChartDataProviderManager( SwDoc& i_rSwdoc );
+
+ SwChartDataProvider * GetChartDataProvider( bool bCreate = false ) const override;
+
+ void CreateChartInternalDataProviders( const SwTable *pTable ) override;
+
+ SwChartLockController_Helper & GetChartControllerHelper() override;
+
+ virtual ~DocumentChartDataProviderManager() override;
+
+private:
+
+ DocumentChartDataProviderManager(DocumentChartDataProviderManager const&) = delete;
+ DocumentChartDataProviderManager& operator=(DocumentChartDataProviderManager const&) = delete;
+
+ SwDoc& m_rDoc;
+
+ mutable rtl::Reference<SwChartDataProvider> maChartDataProviderImplRef;
+ std::unique_ptr<SwChartLockController_Helper> mpChartControllerHelper;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentContentOperationsManager.hxx b/sw/source/core/inc/DocumentContentOperationsManager.hxx
new file mode 100644
index 0000000000..8332cf34bf
--- /dev/null
+++ b/sw/source/core/inc/DocumentContentOperationsManager.hxx
@@ -0,0 +1,190 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <IDocumentContentOperations.hxx>
+#include <ndarr.hxx> //Only for lcl_RstTxtAttr
+
+class SwDoc;
+class SwNoTextNode;
+class SwFormatColl;
+class SwHistory;
+
+namespace sw
+{
+
+class DocumentContentOperationsManager final : public IDocumentContentOperations
+{
+public:
+ DocumentContentOperationsManager( SwDoc& i_rSwdoc );
+
+ //Interface methods:
+ bool CopyRange(SwPaM&, SwPosition&, SwCopyFlags, sal_uInt32 nMovedID = 0) const override;
+
+ void DeleteSection(SwNode* pNode) override;
+
+ void DeleteRange(SwPaM&) override;
+
+ bool DelFullPara(SwPaM&) override;
+
+ bool DeleteAndJoin(SwPaM&, SwDeleteFlags flags = SwDeleteFlags::Default) override;
+
+ bool MoveRange(SwPaM&, SwPosition&, SwMoveFlags) override;
+
+ bool MoveNodeRange(SwNodeRange&, SwNode&, SwMoveFlags) override;
+
+ void MoveAndJoin(SwPaM&, SwPosition&) override;
+
+ bool Overwrite(const SwPaM &rRg, const OUString& rStr) override;
+
+ bool InsertString(const SwPaM &rRg, const OUString&,
+ const SwInsertFlags nInsertMode = SwInsertFlags::EMPTYEXPAND ) override;
+
+ void SetIME(bool bIME) override;
+
+ bool GetIME() const override;
+
+ void TransliterateText(const SwPaM& rPaM, utl::TransliterationWrapper&) override;
+
+ SwFlyFrameFormat* InsertGraphic(const SwPaM &rRg, const OUString& rGrfName, const OUString& rFltName, const Graphic* pGraphic,
+ const SfxItemSet* pFlyAttrSet, const SfxItemSet* pGrfAttrSet, SwFrameFormat*) override;
+
+ void ReRead(SwPaM&, const OUString& rGrfName, const OUString& rFltName, const Graphic* pGraphic) override;
+
+ SwDrawFrameFormat* InsertDrawObj( const SwPaM &rRg, SdrObject& rDrawObj, const SfxItemSet& rFlyAttrSet ) override;
+
+ SwFlyFrameFormat* InsertEmbObject(const SwPaM &rRg, const svt::EmbeddedObjectRef& xObj, SfxItemSet* pFlyAttrSet) override;
+
+ SwFlyFrameFormat* InsertOLE(const SwPaM &rRg, const OUString& rObjName, sal_Int64 nAspect, const SfxItemSet* pFlyAttrSet,
+ const SfxItemSet* pGrfAttrSet) override;
+
+ bool SplitNode(const SwPosition &rPos, bool bChkTableStart) override;
+
+ bool AppendTextNode(SwPosition& rPos) override;
+
+ bool ReplaceRange(SwPaM& rPam, const OUString& rNewStr,
+ const bool bRegExReplace) override;
+
+ // Add a para for the char attribute exp...
+ bool InsertPoolItem(const SwPaM &rRg, const SfxPoolItem&,
+ const SetAttrMode nFlags = SetAttrMode::DEFAULT,
+ SwRootFrame const* pLayout = nullptr,
+ SwTextAttr **ppNewTextAttr = nullptr) override;
+
+ void InsertItemSet (const SwPaM &rRg, const SfxItemSet&,
+ const SetAttrMode nFlags = SetAttrMode::DEFAULT,
+ SwRootFrame const* pLayout = nullptr) override;
+
+ void RemoveLeadingWhiteSpace(const SwPosition & rPos ) override;
+ void RemoveLeadingWhiteSpace(SwPaM& rPaM) override;
+
+
+ //Non-Interface methods
+
+ void DeleteDummyChar(SwPosition const& rPos, sal_Unicode cDummy);
+
+ void CopyWithFlyInFly( const SwNodeRange& rRg,
+ SwNode& rInsPos,
+ const std::pair<const SwPaM&, const SwPosition&> * pCopiedPaM = nullptr,
+ bool bMakeNewFrames = true,
+ bool bDelRedlines = true,
+ bool bCopyFlyAtFly = false,
+ SwCopyFlags flags = SwCopyFlags::Default) const;
+ void CopyFlyInFlyImpl( const SwNodeRange& rRg,
+ SwPaM const*const pCopiedPaM,
+ SwNode& rStartIdx,
+ const bool bCopyFlyAtFly = false,
+ SwCopyFlags flags = SwCopyFlags::Default) const;
+
+ /// Parameters for _Rst and lcl_SetTextFormatColl
+ //originallyfrom docfmt.cxx
+ struct ParaRstFormat
+ {
+ SwTextFormatColl* pFormatColl;
+ SwHistory* pHistory;
+ const SwPosition *pSttNd, *pEndNd;
+ const SfxItemSet* pDelSet;
+ SwRootFrame const*const pLayout;
+ sal_uInt16 nWhich;
+ bool bReset;
+ bool bResetListAttrs; // #i62575#
+ bool bResetAll;
+ bool bInclRefToxMark;
+ /// From the attributes included in the range, delete only the ones which have exactly same range. Don't delete the ones which are simply included in the range.
+ bool bExactRange;
+
+ ParaRstFormat(const SwPosition* pStt, const SwPosition* pEnd,
+ SwHistory* pHst, const SfxItemSet* pSet = nullptr,
+ SwRootFrame const*const pLay = nullptr)
+ : pFormatColl(nullptr)
+ , pHistory(pHst)
+ , pSttNd(pStt)
+ , pEndNd(pEnd)
+ , pDelSet(pSet)
+ , pLayout(pLay)
+ , nWhich(0)
+ , bReset(false) // #i62675#
+ , bResetListAttrs(false)
+ , bResetAll(true)
+ , bInclRefToxMark(false)
+ , bExactRange(false)
+ {
+ }
+ };
+ static bool lcl_RstTextAttr( SwNode* pNd, void* pArgs ); //originally from docfmt.cxx
+
+
+ virtual ~DocumentContentOperationsManager() override;
+
+private:
+ SwDoc& m_rDoc;
+
+ bool m_bIME = false;
+
+ bool DeleteAndJoinImpl(SwPaM &, SwDeleteFlags);
+ bool DeleteAndJoinWithRedlineImpl(SwPaM &, SwDeleteFlags);
+ bool DeleteRangeImpl(SwPaM &, SwDeleteFlags);
+ bool DeleteRangeImplImpl(SwPaM &, SwDeleteFlags);
+ bool ReplaceRangeImpl(SwPaM&, OUString const&, const bool);
+ SwFlyFrameFormat* InsNoTextNode( const SwPosition&rPos, SwNoTextNode*,
+ const SfxItemSet* pFlyAttrSet,
+ const SfxItemSet* pGrfAttrSet,
+ SwFrameFormat* );
+ /* Copy a range within the same or to another document.
+ Position may not lie within range! */
+ bool CopyImpl( SwPaM&, SwPosition&,
+ SwCopyFlags flags, SwPaM *const pCpyRng /*= 0*/) const;
+ bool CopyImplImpl(SwPaM&, SwPosition&,
+ SwCopyFlags flags, SwPaM *const pCpyRng /*= 0*/) const;
+
+ DocumentContentOperationsManager(DocumentContentOperationsManager const&) = delete;
+ DocumentContentOperationsManager& operator=(DocumentContentOperationsManager const&) = delete;
+};
+
+
+void CopyBookmarks(const SwPaM& rPam, const SwPosition& rTarget,
+ SwCopyFlags flags = SwCopyFlags::Default);
+
+void CalcBreaks(std::vector<std::pair<SwNodeOffset, sal_Int32>> & rBreaks,
+ SwPaM const & rPam, bool const isOnlyFieldmarks = false);
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentDeviceManager.hxx b/sw/source/core/inc/DocumentDeviceManager.hxx
new file mode 100644
index 0000000000..e99c54c100
--- /dev/null
+++ b/sw/source/core/inc/DocumentDeviceManager.hxx
@@ -0,0 +1,81 @@
+/* -*- 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_DOCUMENTDEVICEMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTDEVICEMANAGER_HXX
+
+#include <IDocumentDeviceAccess.hxx>
+#include <vcl/vclptr.hxx>
+#include <memory>
+
+class SwDoc;
+class SfxPrinter;
+class VirtualDevice;
+class OutputDevice;
+class JobSetup;
+class SwPrintData;
+
+namespace sw
+{
+class DocumentDeviceManager final : public IDocumentDeviceAccess
+{
+public:
+ DocumentDeviceManager(SwDoc& i_rSwdoc);
+
+ SfxPrinter* getPrinter(/*[in]*/ bool bCreate) const override;
+
+ void setPrinter(/*[in]*/ SfxPrinter* pP, /*[in]*/ bool bDeleteOld,
+ /*[in]*/ bool bCallPrtDataChanged) override;
+
+ VirtualDevice* getVirtualDevice(/*[in]*/ bool bCreate) const override;
+
+ void setVirtualDevice(/*[in]*/ VirtualDevice* pVd) override;
+
+ OutputDevice* getReferenceDevice(/*[in]*/ bool bCreate) const override;
+
+ void setReferenceDeviceType(/*[in]*/ bool bNewVirtual, /*[in]*/ bool bNewHiRes) override;
+
+ const JobSetup* getJobsetup() const override;
+
+ void setJobsetup(/*[in]*/ const JobSetup& rJobSetup) override;
+
+ const SwPrintData& getPrintData() const override;
+
+ void setPrintData(/*[in]*/ const SwPrintData& rPrtData) override;
+
+ virtual ~DocumentDeviceManager() override;
+
+private:
+ DocumentDeviceManager(DocumentDeviceManager const&) = delete;
+ DocumentDeviceManager& operator=(DocumentDeviceManager const&) = delete;
+
+ VirtualDevice& CreateVirtualDevice_() const;
+ SfxPrinter& CreatePrinter_() const;
+ void PrtDataChanged(); /**< Printer or JobSetup altered.
+ Care has to be taken of the necessary
+ invalidations and notifications. */
+
+ SwDoc& m_rDoc;
+ VclPtr<SfxPrinter> mpPrt;
+ VclPtr<VirtualDevice> mpVirDev;
+ std::unique_ptr<SwPrintData> mpPrtData;
+};
+}
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentDrawModelManager.hxx b/sw/source/core/inc/DocumentDrawModelManager.hxx
new file mode 100644
index 0000000000..26fd603a67
--- /dev/null
+++ b/sw/source/core/inc/DocumentDrawModelManager.hxx
@@ -0,0 +1,86 @@
+/* -*- 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_DOCUMENTDRAWMODELMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTDRAWMODELMANAGER_HXX
+
+#include <IDocumentDrawModelAccess.hxx>
+#include <svx/svdtypes.hxx>
+#include <memory>
+#include <drawdoc.hxx>
+
+class SdrPageView;
+class SwDoc;
+
+namespace sw
+{
+class DocumentDrawModelManager final : public IDocumentDrawModelAccess
+{
+public:
+ DocumentDrawModelManager(SwDoc& i_rSwdoc);
+
+ void InitDrawModel();
+ void ReleaseDrawModel();
+ void DrawNotifyUndoHdl();
+
+ //IDocumentDrawModelAccess
+ virtual const SwDrawModel* GetDrawModel() const override;
+ virtual SwDrawModel* GetDrawModel() override;
+ virtual SwDrawModel* MakeDrawModel_() override;
+ virtual SwDrawModel* GetOrCreateDrawModel() override;
+ virtual SdrLayerID GetHeavenId() const override;
+ virtual SdrLayerID GetHellId() const override;
+ virtual SdrLayerID GetControlsId() const override;
+ virtual SdrLayerID GetInvisibleHeavenId() const override;
+ virtual SdrLayerID GetInvisibleHellId() const override;
+ virtual SdrLayerID GetInvisibleControlsId() const override;
+
+ virtual void NotifyInvisibleLayers(SdrPageView& _rSdrPageView) override;
+
+ virtual bool IsVisibleLayerId(SdrLayerID _nLayerId) const override;
+
+ virtual SdrLayerID GetInvisibleLayerIdByVisibleOne(SdrLayerID _nVisibleLayerId) override;
+
+ virtual bool Search(const SwPaM& rPaM, const SvxSearchItem& rSearchItem) override;
+
+private:
+ DocumentDrawModelManager(DocumentDrawModelManager const&) = delete;
+ DocumentDrawModelManager& operator=(DocumentDrawModelManager const&) = delete;
+
+ SwDoc& m_rDoc;
+
+ std::unique_ptr<SwDrawModel> mpDrawModel;
+
+ /** Draw Model Layer IDs
+ * LayerIds, Heaven == above document
+ * Hell == below document
+ * Controls == at the very top
+ */
+ SdrLayerID mnHeaven;
+ SdrLayerID mnHell;
+ SdrLayerID mnControls;
+ SdrLayerID mnInvisibleHeaven;
+ SdrLayerID mnInvisibleHell;
+ SdrLayerID mnInvisibleControls;
+};
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentExternalDataManager.hxx b/sw/source/core/inc/DocumentExternalDataManager.hxx
new file mode 100644
index 0000000000..bc80ac429f
--- /dev/null
+++ b/sw/source/core/inc/DocumentExternalDataManager.hxx
@@ -0,0 +1,44 @@
+/* -*- 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_DOCUMENTEXTERNALDATAMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTEXTERNALDATAMANAGER_HXX
+
+#include <IDocumentExternalData.hxx>
+
+namespace sw
+{
+class DocumentExternalDataManager final : public IDocumentExternalData
+{
+private:
+ DocumentExternalDataManager(DocumentExternalDataManager const&) = delete;
+ DocumentExternalDataManager& operator=(DocumentExternalDataManager const&) = delete;
+
+public:
+ DocumentExternalDataManager() = default;
+
+ void setExternalData(::sw::tExternalDataType eType,
+ ::sw::tExternalDataPointer pPayload) override;
+ ::sw::tExternalDataPointer getExternalData(::sw::tExternalDataType eType) override;
+};
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentFieldsManager.hxx b/sw/source/core/inc/DocumentFieldsManager.hxx
new file mode 100644
index 0000000000..accf7a53e8
--- /dev/null
+++ b/sw/source/core/inc/DocumentFieldsManager.hxx
@@ -0,0 +1,111 @@
+/* -*- 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_DOCUMENTFIELDSMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTFIELDSMANAGER_HXX
+
+#include <IDocumentFieldsAccess.hxx>
+#include <sal/types.h>
+#include <memory>
+
+class SwDoc;
+class SwDBNameInfField;
+
+namespace sw {
+
+class DocumentFieldsManager final : public IDocumentFieldsAccess
+{
+
+public:
+
+ DocumentFieldsManager( SwDoc& i_rSwdoc );
+
+ virtual const SwFieldTypes *GetFieldTypes() const override;
+ virtual SwFieldType *InsertFieldType(const SwFieldType &) override;
+ virtual SwFieldType *GetSysFieldType( const SwFieldIds eWhich ) const override;
+ virtual SwFieldType* GetFieldType(SwFieldIds nResId, const OUString& rName, bool bDbFieldMatching) const override;
+ virtual void RemoveFieldType(size_t nField) override;
+ virtual void UpdateFields(bool bCloseDB) override;
+ virtual void InsDeletedFieldType(SwFieldType &) override;
+ virtual void PutValueToField(const SwPosition & rPos, const css::uno::Any& rVal, sal_uInt16 nWhich) override;
+ virtual bool UpdateField(SwTextField* rDstFormatField, SwField& rSrcField, bool bUpdateTableFields) override;
+ virtual void UpdateRefFields() override;
+ virtual void UpdateTableFields(const SwTable* pTable) override;
+ virtual void UpdateExpFields(SwTextField* pField, bool bUpdateRefFields) override;
+ virtual void UpdateUsrFields() override;
+ virtual void UpdatePageFields(const SwTwips) override;
+ virtual void LockExpFields() override;
+ virtual void UnlockExpFields() override;
+ virtual bool IsExpFieldsLocked() const override;
+ virtual SwDocUpdateField& GetUpdateFields() const override;
+ virtual bool SetFieldsDirty(bool b, const SwNode* pChk, SwNodeOffset nLen) override;
+ virtual void SetFixFields(const DateTime* pNewDateTime) override;
+ virtual void FieldsToCalc(SwCalc& rCalc, SwNodeOffset nLastNd, sal_Int32 nLastCnt) override;
+ virtual void FieldsToCalc(SwCalc& rCalc, const SetGetExpField& rToThisField, SwRootFrame const* pLayout) override;
+ virtual void FieldsToExpand(std::unordered_map<OUString, OUString>& rTable, const SetGetExpField& rToThisField, SwRootFrame const& rLayout) override;
+ virtual bool IsNewFieldLst() const override;
+ virtual void SetNewFieldLst( bool bFlag) override;
+ virtual void InsDelFieldInFieldLst(bool bIns, const SwTextField& rField) override;
+ virtual sal_Int32 GetRecordsPerDocument() const override;
+
+ //Non Interface methods
+
+ /** Returns the field at a certain position.
+ @param rPos position to search at
+ @return pointer to field at the given position or NULL in case no field is found
+ */
+ static SwField* GetFieldAtPos(const SwPosition& rPos);
+
+ /** Returns the field at a certain position.
+ @param rPos position to search at
+ @return pointer to field at the given position or NULL in case no field is found
+ */
+ static SwTextField* GetTextFieldAtPos(const SwPosition& rPos);
+
+ bool containsUpdatableFields();
+
+ // Delete all unreferenced field types.
+ void GCFieldTypes();
+
+ void InitFieldTypes();
+
+ void ClearFieldTypes();
+
+ void UpdateDBNumFields( SwDBNameInfField& rDBField, SwCalc& rCalc );
+
+ virtual ~DocumentFieldsManager() override;
+
+private:
+
+ DocumentFieldsManager(DocumentFieldsManager const&) = delete;
+ DocumentFieldsManager& operator=(DocumentFieldsManager const&) = delete;
+
+ void UpdateExpFieldsImpl(SwTextField* pField, SwRootFrame const* pLayout);
+
+ SwDoc& m_rDoc;
+
+ bool mbNewFieldLst; //< TRUE: Rebuild field-list.
+ std::unique_ptr<SwDocUpdateField> mpUpdateFields; //< Struct for updating fields
+ std::unique_ptr<SwFieldTypes> mpFieldTypes;
+ sal_Int8 mnLockExpField; //< If != 0 UpdateExpFields() has no effect!
+};
+
+}
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentLayoutManager.hxx b/sw/source/core/inc/DocumentLayoutManager.hxx
new file mode 100644
index 0000000000..8db5cbe328
--- /dev/null
+++ b/sw/source/core/inc/DocumentLayoutManager.hxx
@@ -0,0 +1,76 @@
+/* -*- 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_DOCUMENTLAYOUTMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTLAYOUTMANAGER_HXX
+
+#include <IDocumentLayoutAccess.hxx>
+#include <memory>
+
+class SwDoc;
+class SwViewShell;
+class SwLayouter;
+
+namespace sw {
+
+class DocumentLayoutManager final : public IDocumentLayoutAccess
+{
+
+public:
+
+ DocumentLayoutManager( SwDoc& i_rSwdoc );
+
+ virtual const SwViewShell *GetCurrentViewShell() const override;
+ virtual SwViewShell *GetCurrentViewShell() override; //< It must be able to communicate to a SwViewShell.This is going to be removed later.
+ virtual void SetCurrentViewShell( SwViewShell* pNew ) override;
+
+ virtual const SwRootFrame *GetCurrentLayout() const override;
+ virtual SwRootFrame *GetCurrentLayout() override;
+ virtual bool HasLayout() const override;
+
+ virtual const SwLayouter* GetLayouter() const override;
+ virtual SwLayouter* GetLayouter() override;
+ virtual void SetLayouter( SwLayouter* pNew ) override;
+
+ virtual SwFrameFormat* MakeLayoutFormat( RndStdIds eRequest, const SfxItemSet* pSet ) override;
+ virtual void DelLayoutFormat( SwFrameFormat *pFormat ) override;
+ virtual SwFrameFormat* CopyLayoutFormat( const SwFrameFormat& rSrc, const SwFormatAnchor& rNewAnchor, bool bSetTextFlyAtt, bool bMakeFrames ) override;
+
+ //Non Interface methods
+ void ClearSwLayouterEntries();
+
+ virtual ~DocumentLayoutManager() override;
+
+private:
+
+ DocumentLayoutManager(DocumentLayoutManager const&) = delete;
+ DocumentLayoutManager& operator=(DocumentLayoutManager const&) = delete;
+
+ SwDoc& m_rDoc;
+
+ SwViewShell *mpCurrentView; //< SwDoc should get a new member mpCurrentView
+ std::unique_ptr<SwLayouter> mpLayouter; /**< css::frame::Controller for complex layout formatting
+ like footnote/endnote in sections */
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentLinksAdministrationManager.hxx b/sw/source/core/inc/DocumentLinksAdministrationManager.hxx
new file mode 100644
index 0000000000..28dcd7544a
--- /dev/null
+++ b/sw/source/core/inc/DocumentLinksAdministrationManager.hxx
@@ -0,0 +1,86 @@
+/* -*- 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_DOCUMENTLINKSADMINISTRATIONMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTLINKSADMINISTRATIONMANAGER_HXX
+
+#include <IDocumentLinksAdministration.hxx>
+
+#include <memory>
+#include <optional>
+#include <string_view>
+
+namespace sfx2 { class LinkManager; }
+class SwDoc;
+class SwPaM;
+class SwNodeRange;
+
+namespace sw
+{
+
+class DocumentLinksAdministrationManager final : public IDocumentLinksAdministration
+{
+public:
+
+ DocumentLinksAdministrationManager( SwDoc& i_rSwdoc );
+
+ bool IsVisibleLinks() const override;
+
+ void SetVisibleLinks(bool bFlag) override;
+
+ sfx2::LinkManager& GetLinkManager() override;
+
+ const sfx2::LinkManager& GetLinkManager() const override;
+
+ void UpdateLinks() override;
+
+ bool GetData(const OUString& rItem, const OUString& rMimeType, css::uno::Any& rValue) const override;
+
+ void SetData(const OUString& rItem) override;
+
+ ::sfx2::SvLinkSource* CreateLinkSource(const OUString& rItem) override;
+
+ bool EmbedAllLinks() override;
+
+ void SetLinksUpdated(const bool bNewLinksUpdated) override;
+
+ bool LinksUpdated() const override;
+
+ //Non-Interface method
+ bool SelectServerObj( std::u16string_view rStr, SwPaM*& rpPam, std::optional<SwNodeRange>& rpRange ) const;
+
+ virtual ~DocumentLinksAdministrationManager() override;
+
+private:
+
+ DocumentLinksAdministrationManager(DocumentLinksAdministrationManager const&) = delete;
+ DocumentLinksAdministrationManager& operator=(DocumentLinksAdministrationManager const&) = delete;
+
+ bool mbVisibleLinks; //< TRUE: Links are inserted visibly.
+ bool mbLinksUpdated; //< #i38810# flag indicating, that the links have been updated.
+ std::unique_ptr<sfx2::LinkManager> m_pLinkMgr; //< List of linked stuff (graphics/DDE/OLE).
+
+ SwDoc& m_rDoc;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentListItemsManager.hxx b/sw/source/core/inc/DocumentListItemsManager.hxx
new file mode 100644
index 0000000000..eb31e4e25a
--- /dev/null
+++ b/sw/source/core/inc/DocumentListItemsManager.hxx
@@ -0,0 +1,71 @@
+/* -*- 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_DOCUMENTLISTITEMSMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTLISTITEMSMANAGER_HXX
+
+#include <IDocumentListItems.hxx>
+#include <memory>
+#include <set>
+
+namespace sw
+{
+
+class DocumentListItemsManager final : public IDocumentListItems
+{
+public:
+
+ DocumentListItemsManager();
+
+ void addListItem( const SwNodeNum& rNodeNum ) override;
+ void removeListItem( const SwNodeNum& rNodeNum ) override;
+
+ OUString getListItemText(const SwNodeNum& rNodeNum,
+ SwRootFrame const& rLayout) const override;
+
+ bool isNumberedInLayout(SwNodeNum const& rNodeNum,
+ SwRootFrame const& rLayout) const override;
+
+ void getNumItems( IDocumentListItems::tSortedNodeNumList& orNodeNumList ) const override;
+
+ virtual ~DocumentListItemsManager() override;
+
+
+ //Non Interface
+ struct lessThanNodeNum
+ {
+ bool operator()( const SwNodeNum* pNodeNumOne,
+ const SwNodeNum* pNodeNumTwo ) const;
+ };
+
+ typedef std::set< const SwNodeNum*, lessThanNodeNum > tImplSortedNodeNumList;
+
+private:
+
+ DocumentListItemsManager(DocumentListItemsManager const&) = delete;
+ DocumentListItemsManager& operator=(DocumentListItemsManager const&) = delete;
+
+ std::unique_ptr<tImplSortedNodeNumList> mpListItemsList;
+};
+
+}
+
+ #endif // INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTLISTITEMSMANAGER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentListsManager.hxx b/sw/source/core/inc/DocumentListsManager.hxx
new file mode 100644
index 0000000000..caab21e358
--- /dev/null
+++ b/sw/source/core/inc/DocumentListsManager.hxx
@@ -0,0 +1,74 @@
+/* -*- 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_DOCUMENTLISTSMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTLISTSMANAGER_HXX
+
+#include <IDocumentListsAccess.hxx>
+#include <o3tl/deleter.hxx>
+#include <memory>
+#include <unordered_map>
+
+class SwList;
+class SwDoc;
+
+namespace sw
+{
+
+class DocumentListsManager final : public IDocumentListsAccess
+{
+ public:
+
+ DocumentListsManager( SwDoc& i_rSwdoc );
+
+ SwList* createList( const OUString& rListId,
+ const OUString& rDefaultListStyleName ) override;
+ SwList* getListByName( const OUString& rListId ) const override;
+
+ void createListForListStyle( const OUString& rListStyleName ) override;
+ SwList* getListForListStyle( const OUString& rListStyleName ) const override;
+ void deleteListForListStyle( const OUString& rListStyleName ) override;
+ void deleteListsByDefaultListStyle( const OUString& rListStyleName ) override;
+ // #i91400#
+ void trackChangeOfListStyleName( const OUString& rListStyleName,
+ const OUString& rNewListStyleName ) override;
+ virtual ~DocumentListsManager() override;
+
+ private:
+
+ DocumentListsManager(DocumentListsManager const&) = delete;
+ DocumentListsManager& operator=(DocumentListsManager const&) = delete;
+
+ SwDoc& m_rDoc;
+
+ typedef std::unique_ptr<SwList, o3tl::default_delete<SwList>> SwListPtr;
+ // container to hold the lists of the text document
+ std::unordered_map<OUString, SwListPtr> maLists;
+ // relation between list style and its default list
+ std::unordered_map<OUString, SwList*> maListStyleLists;
+
+ OUString CreateUniqueListId();
+ OUString MakeListIdUnique( const OUString& aSuggestedUniqueListId );
+};
+
+}
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTLISTSMANAGER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentOutlineNodesManager.hxx b/sw/source/core/inc/DocumentOutlineNodesManager.hxx
new file mode 100644
index 0000000000..2489d23972
--- /dev/null
+++ b/sw/source/core/inc/DocumentOutlineNodesManager.hxx
@@ -0,0 +1,65 @@
+/* -*- 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_DOCUMENTOUTLINENODESMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTOUTLINENODESMANAGER_HXX
+
+#include <IDocumentOutlineNodes.hxx>
+
+class SwDoc;
+
+namespace sw
+{
+
+class DocumentOutlineNodesManager final : public IDocumentOutlineNodes
+{
+public:
+
+ DocumentOutlineNodesManager( SwDoc& i_rSwdoc );
+
+ //typedef std::vector< const SwTextNode* > tSortedOutlineNodeList;
+
+ tSortedOutlineNodeList::size_type getOutlineNodesCount() const override;
+
+ int getOutlineLevel( const tSortedOutlineNodeList::size_type nIdx ) const override;
+ OUString getOutlineText( const tSortedOutlineNodeList::size_type nIdx,
+ SwRootFrame const* pLayout,
+ const bool bWithNumber = true,
+ const bool bWithSpacesForLevel = false,
+ const bool bWithFootnote = true ) const override;
+ SwTextNode* getOutlineNode( const tSortedOutlineNodeList::size_type nIdx ) const override;
+ bool isOutlineInLayout(tSortedOutlineNodeList::size_type nIdx,
+ SwRootFrame const& rLayout) const override;
+ void getOutlineNodes( IDocumentOutlineNodes::tSortedOutlineNodeList& orOutlineNodeList ) const override;
+
+ virtual ~DocumentOutlineNodesManager() override;
+
+private:
+
+ DocumentOutlineNodesManager(DocumentOutlineNodesManager const&) = delete;
+ DocumentOutlineNodesManager& operator=(DocumentOutlineNodesManager const&) = delete;
+
+ SwDoc& m_rDoc;
+};
+
+}
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTOUTLINENODESMANAGER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentRedlineManager.hxx b/sw/source/core/inc/DocumentRedlineManager.hxx
new file mode 100644
index 0000000000..a164dbbeab
--- /dev/null
+++ b/sw/source/core/inc/DocumentRedlineManager.hxx
@@ -0,0 +1,189 @@
+/* -*- 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_DOCUMENTREDLINEMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTREDLINEMANAGER_HXX
+
+#include <IDocumentRedlineAccess.hxx>
+
+class SwDoc;
+
+namespace sw
+{
+
+class SAL_DLLPUBLIC_RTTI DocumentRedlineManager final : public IDocumentRedlineAccess
+{
+public:
+ DocumentRedlineManager( SwDoc& i_rSwdoc );
+
+ /**
+ * Replaced by SwRootFrame::IsHideRedlines() (this is model-level redline
+ * hiding).
+ */
+ virtual RedlineFlags GetRedlineFlags() const override;
+
+ virtual void SetRedlineFlags_intern(/*[in]*/RedlineFlags eMode) override;
+
+ virtual void SetRedlineFlags(/*[in]*/RedlineFlags eMode) override;
+
+ virtual bool IsRedlineOn() const override;
+
+ virtual bool IsIgnoreRedline() const override;
+
+ virtual const SwRedlineTable& GetRedlineTable() const override;
+ virtual SwRedlineTable& GetRedlineTable() override;
+ virtual const SwExtraRedlineTable& GetExtraRedlineTable() const override;
+ virtual SwExtraRedlineTable& GetExtraRedlineTable() override;
+
+ virtual bool IsInRedlines(const SwNode& rNode) const override;
+
+ virtual AppendResult AppendRedline(
+ /*[in]*/ SwRangeRedline* pPtr,
+ /*[in]*/ bool bCallDelete,
+ /*[in]*/ sal_uInt32 nMoveIDToDelete = 0) override;
+
+ virtual bool AppendTableRowRedline(/*[in]*/SwTableRowRedline* pPtr) override;
+ virtual bool AppendTableCellRedline(/*[in]*/SwTableCellRedline* pPtr) override;
+
+ virtual bool SplitRedline(/*[in]*/const SwPaM& rPam) override;
+
+ virtual bool DeleteRedline(
+ /*[in]*/const SwPaM& rPam,
+ /*[in]*/bool bSaveInUndo,
+ /*[in]*/RedlineType nDelType) override;
+
+ virtual bool DeleteRedline(
+ /*[in]*/const SwStartNode& rSection,
+ /*[in]*/bool bSaveInUndo,
+ /*[in]*/RedlineType nDelType) override;
+
+ virtual SwRedlineTable::size_type GetRedlinePos(
+ /*[in]*/const SwNode& rNode,
+ /*[in]*/RedlineType nType) const override;
+
+ virtual SwRedlineTable::size_type GetRedlineEndPos(
+ /*[in]*/ SwRedlineTable::size_type nStartPos,
+ /*[in]*/ const SwNode& rNode,
+ /*[in]*/ RedlineType nType) const override;
+
+ virtual bool HasRedline(
+ /*[in]*/const SwPaM& rPam,
+ /*[in]*/RedlineType nType,
+ /*[in]*/bool bStartOrEndInRange) const override;
+
+ virtual void CompressRedlines(size_t nStartIdx = 0) override;
+
+ virtual const SwRangeRedline* GetRedline(
+ /*[in]*/const SwPosition& rPos,
+ /*[in]*/SwRedlineTable::size_type* pFndPos) const override;
+
+ virtual bool IsRedlineMove() const override;
+
+ virtual void SetRedlineMove(/*[in]*/bool bFlag) override;
+
+ virtual bool AcceptRedline(/*[in]*/ SwRedlineTable::size_type nPos, /*[in]*/ bool bCallDelete,
+ /*[in]*/ bool bRange = false) override;
+
+ virtual bool AcceptRedline(/*[in]*/ const SwPaM& rPam, /*[in]*/ bool bCallDelete,
+ /*[in]*/ sal_Int8 nDepth = 0) override;
+
+ virtual void AcceptRedlineParagraphFormatting(/*[in]*/const SwPaM& rPam) override;
+
+ virtual bool RejectRedline(/*[in]*/ SwRedlineTable::size_type nPos, /*[in]*/ bool bCallDelete,
+ /*[in]*/ bool bRange = false) override;
+
+ virtual bool RejectRedline(/*[in]*/ const SwPaM& rPam, /*[in]*/ bool bCallDelete,
+ /*[in]*/ sal_Int8 nDepth = 0) override;
+
+ virtual void AcceptAllRedline(/*[in]*/bool bAcceptReject) override;
+
+ virtual const SwRangeRedline* SelNextRedline(/*[in]*/SwPaM& rPam) const override;
+
+ virtual const SwRangeRedline* SelPrevRedline(/*[in]*/SwPaM& rPam) const override;
+
+ virtual void UpdateRedlineAttr() override;
+
+ virtual std::size_t GetRedlineAuthor() override;
+
+ virtual std::size_t InsertRedlineAuthor(const OUString& rAuthor) override;
+
+ virtual bool SetRedlineComment(
+ /*[in]*/const SwPaM& rPam,
+ /*[in]*/const OUString& rComment) override;
+
+ virtual const css::uno::Sequence <sal_Int8>& GetRedlinePassword() const override;
+
+ virtual void SetRedlinePassword(
+ /*[in]*/const css::uno::Sequence <sal_Int8>& rNewPassword) override;
+
+ // After nodes are removed, m_pContentNode's may not updated
+ virtual void UpdateRedlineContentNode(
+ /*[in]*/ SwRedlineTable::size_type nStartPos,
+ /*[in]*/ SwRedlineTable::size_type nEndPos) const override;
+
+ //Non Interface methods;
+
+ /** Set comment-text for Redline. It then comes in via AppendRedLine.
+ Used by AutoFormat. 0-pointer resets mode.
+ Sequence number is for conjoining of Redlines by the UI. */
+ void SetAutoFormatRedlineComment( const OUString* pText, sal_uInt16 nSeqNo = 0 );
+
+ bool IsHideRedlines() const { return m_bHideRedlines; }
+ void SetHideRedlines(bool const bHideRedlines) { m_bHideRedlines = bHideRedlines; }
+
+ void HideAll(bool bDeletion);
+ void ShowAll();
+
+ virtual ~DocumentRedlineManager() override;
+
+private:
+
+ bool RejectRedlineRange(SwRedlineTable::size_type nPosOrigin,
+ SwRedlineTable::size_type& nPosStart,
+ SwRedlineTable::size_type& nPosEnd, bool bCallDelete);
+ bool AcceptRedlineRange(SwRedlineTable::size_type nPosOrigin,
+ SwRedlineTable::size_type& nPosStart,
+ SwRedlineTable::size_type& nPosEnd, bool bCallDelete);
+ bool AcceptMovedRedlines(sal_uInt32 nMovedID, bool bCallDelete);
+ bool RejectMovedRedlines(sal_uInt32 nMovedID, bool bCallDelete);
+
+ DocumentRedlineManager(DocumentRedlineManager const&) = delete;
+ DocumentRedlineManager& operator=(DocumentRedlineManager const&) = delete;
+
+ SwDoc& m_rDoc;
+
+ RedlineFlags meRedlineFlags; //< Current Redline Mode.
+ SwRedlineTable maRedlineTable; //< List of all Ranged Redlines.
+ SwExtraRedlineTable maExtraRedlineTable; //< List of all Extra Redlines.
+ std::optional<OUString> moAutoFormatRedlnComment; //< Comment for Redlines inserted via AutoFormat.
+ bool mbIsRedlineMove; //< true: Redlines are moved into to / out of the section.
+ sal_uInt16 mnAutoFormatRedlnCommentNo; /**< SeqNo for conjoining of AutoFormat-Redlines.
+ by the UI. Managed by SwAutoFormat! */
+ css::uno::Sequence <sal_Int8 > maRedlinePasswd;
+
+ /// this flag is necessary for file import because the ViewShell/layout is
+ /// created "too late" and the ShowRedlineChanges item is not below "Views"
+ bool m_bHideRedlines = false;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentSettingManager.hxx b/sw/source/core/inc/DocumentSettingManager.hxx
new file mode 100644
index 0000000000..284dccf9cf
--- /dev/null
+++ b/sw/source/core/inc/DocumentSettingManager.hxx
@@ -0,0 +1,227 @@
+/* -*- 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_DOCUMENTSETTINGMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTSETTINGMANAGER_HXX
+
+#include <IDocumentSettingAccess.hxx>
+class SwDoc;
+typedef struct _xmlTextWriter* xmlTextWriterPtr;
+
+namespace sw {
+class DocumentSettingManager final :
+ public IDocumentSettingAccess
+{
+ std::shared_ptr<SvxForbiddenCharactersTable> mxForbiddenCharsTable;
+ SwDoc &m_rDoc;
+
+ sal_uInt16 mnLinkUpdMode; //< UpdateMode for links.
+
+ SwFieldUpdateFlags meFieldUpdMode;//< Automatically Update Mode for fields/charts.
+ CharCompressType meChrCmprType;//< for ASIAN: compress punctuation/kana
+
+ sal_uInt32 mn32DummyCompatibilityOptions1;
+ sal_uInt32 mn32DummyCompatibilityOptions2;
+
+ // COMPATIBILITY FLAGS START
+ //
+ //
+ // HISTORY OF THE COMPATIBILITY FLAGS:
+ //
+ // SO5:
+ // mbParaSpaceMax def = false, true since SO8
+ // mbParaSpaceMaxAtPages def = false, true since SO8
+ //
+ // SO6:
+ // mbTabCompat def = false, true since SO8
+ //
+ // SO7:
+ // mbUseVirtualDevice def = true
+ // mbAddFlyOffsets def = false, hidden
+ //
+ // SO7pp1:
+ // bOldNumbering def = false, hidden
+ //
+ // SO8:
+ // mbAddExternalLeading def = true
+ // mbUseHiResolutionVirtualDevice def = true, hidden
+ // mbOldLineSpacing def = false
+ // mbAddParaSpacingToTableCells def = true
+ // mbUseFormerObjectPos def = false
+ // mbUseFormerTextWrapping def = false
+ // mbConsiderWrapOnObjPos def = false
+ //
+ // SO8pp1:
+ // mbIgnoreFirstLineIndentInNumbering def = false, hidden
+ // mbDoNotJustifyLinesWithManualBreak def = false, hidden
+ // mbDoNotResetParaAttrsForNumFont def = false, hidden
+ //
+ // SO8pp3
+ // mbDoNotCaptureDrawObjsOnPage def = false, hidden
+ // - Relevant for drawing objects, which don't follow the text flow, but
+ // whose position is outside the page area:
+ // false: Such drawing objects are captured on the page area of its anchor.
+ // true: Such drawing objects can leave the page area, they aren't captured.
+ // mbTableRowKeep def = false, hidden
+ // mbIgnoreTabsAndBlanksForLineCalculation def = false, hidden
+ // mbClipAsCharacterAnchoredWriterFlyFrame def = false, hidden
+ // - Introduced in order to re-activate clipping of as-character anchored
+ // Writer fly frames in method <SwFlyInContentFrame::MakeAll()> for documents,
+ // which are created with version prior SO8/OOo 2.0
+ //
+ // SO8pp4
+ // mbUnixForceZeroExtLeading def = false, hidden
+ //
+ // SO8pu8
+ //
+ // SO9
+ // #i24363# tab stops relative to indent
+ // mbTabRelativeToIndent def = true, hidden
+ // #i89181# suppress tab stop at left indent for paragraphs in lists, whose
+ // list level position and space mode equals LABEL_ALIGNMENT and whose list
+ // label is followed by a tab character.
+ // mbTabAtLeftIndentForParagraphsInList def = false, hidden
+
+ bool mbHTMLMode : 1; //< true: Document is in HTMLMode.
+ bool mbIsGlobalDoc : 1; //< true: It's a global document.
+ bool mbGlblDocSaveLinks : 1; //< true: Save sections linked in global document.
+ bool mbIsLabelDoc : 1; //< true: It's a label document.
+ bool mbPurgeOLE : 1; //< true: Purge OLE-Objects
+ bool mbKernAsianPunctuation : 1; //< true: kerning also for ASIAN punctuation
+
+ bool mbParaSpaceMax : 1;
+ bool mbParaSpaceMaxAtPages : 1;
+ bool mbTabCompat : 1;
+ bool mbUseVirtualDevice : 1;
+ bool mbAddFlyOffsets : 1;
+ bool mbAddVerticalFlyOffsets : 1;
+ bool mbAddExternalLeading : 1;
+ bool mbUseHiResolutionVirtualDevice : 1;
+ bool mbOldLineSpacing : 1; // #i11859#
+ bool mbAddParaSpacingToTableCells : 1;
+ bool mbUseFormerObjectPos : 1; // #i11860#
+ bool mbUseFormerTextWrapping : 1;
+ bool mbConsiderWrapOnObjPos : 1; // #i28701#
+ // true: object positioning algorithm has consider the wrapping style of // the floating screen objects as given by its attribute 'WrapInfluenceOnObjPos'
+ // floating screen objects as given by its
+ // attribute 'WrapInfluenceOnObjPos'.
+ bool mbMathBaselineAlignment : 1; // TL 2010-10-29 #i972#
+ bool mbStylesNoDefault : 1;
+ bool mEmbedFonts : 1; //< Whether to embed fonts when saving.
+ bool mEmbedUsedFonts : 1; //< Whether to embed fonts that are used by the document when saving.
+ bool mEmbedLatinScriptFonts : 1; //< Whether to embed latin script fonts when saving.
+ bool mEmbedAsianScriptFonts : 1; //< Whether to embed asian script fonts when saving.
+ bool mEmbedComplexScriptFonts : 1; //< Whether to embed complex script fonts when saving.
+ bool mEmbedSystemFonts : 1; //< Whether to embed also system fonts.
+
+ // non-ui-compatibility flags:
+ bool mbOldNumbering : 1;
+ bool mbIgnoreFirstLineIndentInNumbering : 1; // #i47448#
+ bool mbDoNotJustifyLinesWithManualBreak : 1; // #i49277#
+ bool mbDoNotResetParaAttrsForNumFont : 1; // #i53199#
+ bool mbTableRowKeep : 1;
+ bool mbIgnoreTabsAndBlanksForLineCalculation : 1; // #i3952#
+ bool mbDoNotCaptureDrawObjsOnPage : 1; // #i62875#
+ bool mbClipAsCharacterAnchoredWriterFlyFrames : 1;
+ bool mbUnixForceZeroExtLeading : 1; // #i60945#
+ bool mbTabRelativeToIndent : 1; // #i24363# tab stops relative to indent
+ bool mbProtectForm : 1;
+ bool mbMsWordCompTrailingBlanks : 1; // tdf#104349 tdf#104668
+ bool mbMsWordCompMinLineHeightByFly : 1;
+ bool mbInvertBorderSpacing : 1;
+ bool mbCollapseEmptyCellPara : 1;
+ bool mbTabAtLeftIndentForParagraphsInList; // #i89181# - see above
+ bool mbSmallCapsPercentage66;
+ bool mbTabOverflow;
+ bool mbUnbreakableNumberings;
+ bool mbClippedPictures;
+ bool mbBackgroundParaOverDrawings;
+ bool mbTabOverMargin;
+ bool mbTabOverSpacing;
+ bool mbTreatSingleColumnBreakAsPageBreak; // tdf#76349
+ bool mbSurroundTextWrapSmall;
+ bool mbPropLineSpacingShrinksFirstLine; // fdo#79602
+ bool mbSubtractFlys; // tdf#86578
+ bool mApplyParagraphMarkFormatToNumbering;
+ bool mbAddParaLineSpacingToTableCells; // tdf#125300 tdf#134782
+
+ bool mbLastBrowseMode : 1;
+ bool mbDisableOffPagePositioning; // tdf#112443
+ bool mbEmptyDbFieldHidesPara;
+ bool mbContinuousEndnotes = false;
+ bool mbProtectBookmarks;
+ bool mbProtectFields;
+ bool mbHeaderSpacingBelowLastPara;
+ bool mbFrameAutowidthWithMorePara; //tdf#124423
+ /// Gutter position: false means left (not a compatibility setting).
+ bool mbGutterAtTop;
+ bool mbFootnoteInColumnToPageEnd;
+ sal_Int32 mnImagePreferredDPI;
+ bool mbAutoFirstLineIndentDisregardLineSpace;
+ bool mbHyphenateURLs = false;
+ bool mbDoNotBreakWrappedTables = false;
+ bool mbAllowTextAfterFloatingTableBreak = false;
+ bool mbJustifyLinesWithShrinking = false;
+ // If this is on as_char flys wrapping will be handled the same like in Word
+ bool mbNoNumberingShowFollowBy;
+ bool mbDropCapPunctuation; // tdf#150200, tdf#150438
+ bool mbUseVariableWidthNBSP : 1; // tdf#41652
+
+public:
+
+ DocumentSettingManager(SwDoc &rDoc);
+ virtual ~DocumentSettingManager() override;
+
+ // IDocumentSettingAccess
+ virtual bool get(/*[in]*/ DocumentSettingId id) const override;
+ virtual void set(/*[in]*/ DocumentSettingId id, /*[in]*/ bool value) override;
+ virtual const css::i18n::ForbiddenCharacters* getForbiddenCharacters(/*[in]*/ LanguageType nLang, /*[in]*/ bool bLocaleData ) const override;
+ virtual void setForbiddenCharacters(/*[in]*/ LanguageType nLang, /*[in]*/ const css::i18n::ForbiddenCharacters& rForbiddenCharacters ) override;
+ virtual std::shared_ptr<SvxForbiddenCharactersTable>& getForbiddenCharacterTable() override;
+ virtual const std::shared_ptr<SvxForbiddenCharactersTable>& getForbiddenCharacterTable() const override;
+ virtual sal_uInt16 getLinkUpdateMode( /*[in]*/bool bGlobalSettings ) const override;
+ virtual void setLinkUpdateMode( /*[in]*/ sal_uInt16 nMode ) override;
+ virtual SwFieldUpdateFlags getFieldUpdateFlags( /*[in]*/bool bGlobalSettings ) const override;
+ virtual void setFieldUpdateFlags( /*[in]*/ SwFieldUpdateFlags eMode ) override;
+ virtual CharCompressType getCharacterCompressionType() const override;
+ virtual void setCharacterCompressionType( /*[in]*/CharCompressType nType ) override;
+
+ sal_Int32 getImagePreferredDPI() override
+ {
+ return mnImagePreferredDPI;
+ }
+ void setImagePreferredDPI(sal_Int32 nValue) override
+ {
+ mnImagePreferredDPI = nValue;
+ }
+
+// Replace all compatibility options with those from rSource.
+ void ReplaceCompatibilityOptions(const DocumentSettingManager& rSource);
+
+ sal_uInt32 Getn32DummyCompatibilityOptions1() const override;
+ void Setn32DummyCompatibilityOptions1( const sal_uInt32 CompatibilityOptions1 ) override;
+ sal_uInt32 Getn32DummyCompatibilityOptions2() const override;
+ void Setn32DummyCompatibilityOptions2( const sal_uInt32 CompatibilityOptions2 ) override;
+ void dumpAsXml(xmlTextWriterPtr pWriter) const;
+};
+
+}
+
+#endif //_DOCSETTING_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentStateManager.hxx b/sw/source/core/inc/DocumentStateManager.hxx
new file mode 100644
index 0000000000..60c8c4923c
--- /dev/null
+++ b/sw/source/core/inc/DocumentStateManager.hxx
@@ -0,0 +1,62 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <IDocumentState.hxx>
+
+class SwDoc;
+
+
+namespace sw {
+
+class DocumentStateManager final : public IDocumentState
+{
+
+public:
+ DocumentStateManager( SwDoc& i_rSwdoc );
+
+ void SetModified() override;
+ void ResetModified() override;
+ bool IsModified() const override;
+ bool IsEnableSetModified() const override;
+ void SetEnableSetModified(bool bEnableSetModified) override;
+ bool IsInCallModified() const override;
+ bool IsUpdateExpField() const override;
+ bool IsNewDoc() const override;
+ void SetNewDoc(bool b) override;
+ void SetUpdateExpFieldStat(bool b) override;
+
+private:
+
+ DocumentStateManager(DocumentStateManager const&) = delete;
+ DocumentStateManager& operator=(DocumentStateManager const&) = delete;
+
+ SwDoc& m_rDoc;
+
+ bool mbEnableSetModified; //< FALSE: changing document modification status (temporarily) locked
+ bool mbModified ; //< TRUE: document has changed.
+ bool mbUpdateExpField; //< TRUE: Update expression fields.
+ bool mbNewDoc ; //< TRUE: new Doc.
+ bool mbInCallModified; //< TRUE: in Set/Reset-Modified link.
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentStatisticsManager.hxx b/sw/source/core/inc/DocumentStatisticsManager.hxx
new file mode 100644
index 0000000000..430fcff7ca
--- /dev/null
+++ b/sw/source/core/inc/DocumentStatisticsManager.hxx
@@ -0,0 +1,69 @@
+/* -*- 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_DOCUMENTSTATISTICSMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTSTATISTICSMANAGER_HXX
+
+#include <IDocumentStatistics.hxx>
+#include <SwDocIdle.hxx>
+#include <tools/long.hxx>
+#include <memory>
+
+class SwDoc;
+struct SwDocStat;
+
+namespace sw
+{
+class DocumentStatisticsManager final : public IDocumentStatistics
+{
+public:
+ DocumentStatisticsManager(SwDoc& i_rSwdoc);
+
+ void DocInfoChgd(bool isEnableSetModified) override;
+ const SwDocStat& GetDocStat() const override;
+ void SetDocStatModified(bool bSet);
+ const SwDocStat& GetUpdatedDocStat(bool bCompleteAsync, bool bFields) override;
+ void SetDocStat(const SwDocStat& rStat) override;
+ void UpdateDocStat(bool bCompleteAsync, bool bFields) override;
+ virtual ~DocumentStatisticsManager() override;
+
+private:
+ DocumentStatisticsManager(DocumentStatisticsManager const&) = delete;
+ DocumentStatisticsManager& operator=(DocumentStatisticsManager const&) = delete;
+
+ SwDoc& m_rDoc;
+
+ /** continue computing a chunk of document statistics
+ * \param nChars number of characters to count before exiting
+ * \param bFields if stat. fields should be updated
+ *
+ * returns false when there is no more to calculate
+ */
+ bool IncrementalDocStatCalculate(tools::Long nChars, bool bFields = true);
+
+ // Our own 'StatsUpdateTimer' calls the following method
+ DECL_LINK(DoIdleStatsUpdate, Timer*, void);
+
+ std::unique_ptr<SwDocStat> mpDocStat; //< Statistics information
+ bool mbInitialized; //< allow first time update
+ SwDocIdle maStatsUpdateIdle; //< Idle for asynchronous stats calculation
+};
+}
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DocumentStylePoolManager.hxx b/sw/source/core/inc/DocumentStylePoolManager.hxx
new file mode 100644
index 0000000000..f410d0d092
--- /dev/null
+++ b/sw/source/core/inc/DocumentStylePoolManager.hxx
@@ -0,0 +1,61 @@
+/* -*- 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_DOCUMENTSTYLEPOOLMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTSTYLEPOOLMANAGER_HXX
+
+#include <IDocumentStylePoolAccess.hxx>
+
+class SwDoc;
+
+namespace sw {
+
+class DocumentStylePoolManager final : public IDocumentStylePoolAccess
+{
+
+public:
+
+ DocumentStylePoolManager( SwDoc& i_rSwdoc );
+
+ virtual SwTextFormatColl* GetTextCollFromPool( sal_uInt16 nId, bool bRegardLanguage = true ) override;
+ virtual SwFormat* GetFormatFromPool( sal_uInt16 nId ) override;
+ virtual SwFrameFormat* GetFrameFormatFromPool( sal_uInt16 nId ) override;
+ virtual SwCharFormat* GetCharFormatFromPool( sal_uInt16 nId ) override;
+ virtual SwPageDesc* GetPageDescFromPool( sal_uInt16 nId, bool bRegardLanguage = true ) override;
+ virtual SwNumRule* GetNumRuleFromPool( sal_uInt16 nId ) override;
+ virtual bool IsPoolTextCollUsed( sal_uInt16 nId ) const override;
+ virtual bool IsPoolFormatUsed( sal_uInt16 nId ) const override;
+ virtual bool IsPoolPageDescUsed( sal_uInt16 nId ) const override;
+
+ virtual ~DocumentStylePoolManager() override;
+
+private:
+
+ DocumentStylePoolManager(DocumentStylePoolManager const&) = delete;
+ DocumentStylePoolManager& operator=(DocumentStylePoolManager const&) = delete;
+
+ SwDoc& m_rDoc;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/sw/source/core/inc/DocumentTimerManager.hxx b/sw/source/core/inc/DocumentTimerManager.hxx
new file mode 100644
index 0000000000..895aa4b86b
--- /dev/null
+++ b/sw/source/core/inc/DocumentTimerManager.hxx
@@ -0,0 +1,87 @@
+/* -*- 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_DOCUMENTTIMERMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTTIMERMANAGER_HXX
+
+#include <IDocumentTimerAccess.hxx>
+#include <SwDocIdle.hxx>
+
+#include <sal/types.h>
+#include <tools/link.hxx>
+
+class SwDoc;
+
+namespace sw
+{
+class DocumentTimerManager final : public IDocumentTimerAccess
+{
+public:
+ enum class IdleJob
+ {
+ None, ///< document has no idle jobs to do
+ Busy, ///< document is busy and idle jobs are postponed
+ Grammar,
+ Layout,
+ Fields,
+ };
+
+ DocumentTimerManager(SwDoc& i_rSwdoc);
+ virtual ~DocumentTimerManager() override;
+
+ void StartIdling() override;
+
+ void StopIdling() override;
+
+ void BlockIdling() override;
+
+ void UnblockIdling() override;
+
+ bool IsDocIdle() const override;
+
+private:
+ DocumentTimerManager(DocumentTimerManager const&) = delete;
+ DocumentTimerManager& operator=(DocumentTimerManager const&) = delete;
+
+ /// Delay starting idle jobs to allow for post-load activity.
+ /// Used by LOK only.
+ DECL_LINK(FireIdleJobsTimeout, Timer*, void);
+
+ DECL_LINK(DoIdleJobs, Timer*, void);
+
+ IdleJob GetNextIdleJob() const;
+
+ SwDoc& m_rDoc;
+
+ sal_uInt32 m_nIdleBlockCount; ///< Don't run the Idle, if > 0
+ bool m_bStartOnUnblock; ///< true, if the last unblock should start the timer
+ SwDocIdle m_aDocIdle;
+ Timer m_aFireIdleJobsTimer;
+ bool m_bWaitForLokInit; ///< true if we waited for LOK to initialize already.
+};
+
+inline bool DocumentTimerManager::IsDocIdle() const
+{
+ return ((0 == m_nIdleBlockCount) && (GetNextIdleJob() != IdleJob::Busy));
+}
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/DropDownFormFieldButton.hxx b/sw/source/core/inc/DropDownFormFieldButton.hxx
new file mode 100644
index 0000000000..6f8aa42edd
--- /dev/null
+++ b/sw/source/core/inc/DropDownFormFieldButton.hxx
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#pragma once
+
+#include "FormFieldButton.hxx"
+
+class SwEditWin;
+namespace sw::mark
+{
+class DropDownFieldmark;
+}
+
+/**
+ * This button is shown when the cursor is on a drop-down form field.
+ * The user can select an item of the field using this button while filling in a form.
+ */
+class DropDownFormFieldButton final : public FormFieldButton
+{
+private:
+ std::unique_ptr<weld::TreeView> m_xTreeView;
+
+ DECL_LINK(MyListBoxHandler, weld::TreeView&, bool);
+
+ void InitDropdown();
+
+public:
+ DropDownFormFieldButton(SwEditWin* pEditWin, sw::mark::DropDownFieldmark& rFieldMark);
+ virtual ~DropDownFormFieldButton() override;
+
+ virtual void LaunchPopup() override;
+ virtual void DestroyPopup() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sw/source/core/inc/FormFieldButton.hxx b/sw/source/core/inc/FormFieldButton.hxx
new file mode 100644
index 0000000000..22a9b3e8c7
--- /dev/null
+++ b/sw/source/core/inc/FormFieldButton.hxx
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#pragma once
+
+#include <vcl/ctrl.hxx>
+#include <vcl/weld.hxx>
+#include <swrect.hxx>
+
+class SwEditWin;
+namespace sw::mark
+{
+class Fieldmark;
+}
+
+/**
+ * This button is shown when the cursor is on a form field with drop-down capability.
+ */
+class FormFieldButton : public Control
+{
+public:
+ FormFieldButton(SwEditWin* pEditWin, sw::mark::Fieldmark& rFieldMark);
+ virtual ~FormFieldButton() override;
+ virtual void dispose() override;
+
+ void CalcPosAndSize(const SwRect& rPortionPaintArea);
+
+ virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
+ DECL_LINK(FieldPopupModeEndHdl, weld::Popover&, void);
+
+ virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
+ virtual WindowHitTest ImplHitTest(const Point& rFramePos) override;
+
+ virtual void LaunchPopup();
+ virtual void DestroyPopup();
+
+private:
+ tools::Rectangle m_aFieldFramePixel;
+
+protected:
+ sw::mark::Fieldmark& m_rFieldmark;
+ std::unique_ptr<weld::Builder> m_xFieldPopupBuilder;
+ std::unique_ptr<weld::Popover> m_xFieldPopup;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sw/source/core/inc/GraphicSizeCheck.hxx b/sw/source/core/inc/GraphicSizeCheck.hxx
new file mode 100644
index 0000000000..a58a7f4324
--- /dev/null
+++ b/sw/source/core/inc/GraphicSizeCheck.hxx
@@ -0,0 +1,111 @@
+/* -*- 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/.
+ *
+ */
+
+#pragma once
+
+#include <doc.hxx>
+#include <svx/GenericCheckDialog.hxx>
+
+namespace sw
+{
+/**
+ * Class responsible to check if a graphic object violates the size
+ * constraints and store the results.
+ */
+class GraphicSizeViolation final
+{
+private:
+ const SwGrfNode* m_pGraphicNode;
+
+ sal_Int32 m_nLowDPILimit = 0;
+ sal_Int32 m_nHighDPILimit = 0;
+
+ sal_Int32 m_nDPIX = 0;
+ sal_Int32 m_nDPIY = 0;
+
+public:
+ GraphicSizeViolation(sal_Int32 nDPI, const SwGrfNode* pGraphicNode);
+ bool check();
+
+ const OUString& getGraphicName();
+
+ bool isDPITooLow() { return m_nDPIX < m_nLowDPILimit || m_nDPIY < m_nLowDPILimit; }
+
+ bool isDPITooHigh() { return m_nDPIX > m_nHighDPILimit || m_nDPIY > m_nHighDPILimit; }
+
+ sal_Int32 getDPIX() { return m_nDPIX; }
+
+ sal_Int32 getDPIY() { return m_nDPIY; }
+};
+
+/**
+ * Run the graphic size checks for all the graphic objects in the DOM
+ * and store a list of violations.
+ */
+class GraphicSizeCheck final
+{
+private:
+ SwDoc* m_pDocument;
+ std::vector<std::unique_ptr<GraphicSizeViolation>> m_aGraphicSizeViolationList;
+
+public:
+ GraphicSizeCheck(SwDoc* pDocument)
+ : m_pDocument(pDocument)
+ {
+ }
+
+ void check();
+
+ std::vector<std::unique_ptr<GraphicSizeViolation>>& getViolationList()
+ {
+ return m_aGraphicSizeViolationList;
+ }
+};
+
+/** The UI part of the GraphicSizeViolation used by GenericCheckDialog */
+class GraphicSizeCheckGUIEntry final : public svx::CheckData
+{
+private:
+ SwDoc* m_pDocument;
+ std::unique_ptr<GraphicSizeViolation> m_pViolation;
+
+public:
+ GraphicSizeCheckGUIEntry(SwDoc* pDocument, std::unique_ptr<GraphicSizeViolation>&& pViolation)
+ : m_pDocument(pDocument)
+ , m_pViolation(std::move(pViolation))
+ {
+ }
+
+ OUString getText() override;
+
+ bool canMarkObject() override { return true; }
+
+ void markObject() override;
+
+ bool hasProperties() override { return true; }
+
+ void runProperties() override;
+};
+
+/**
+ * The UI part presenting the graphic size check results, which is
+ * used by GenericCheckDialog
+ */
+class GraphicSizeCheckGUIResult final : public svx::CheckDataCollection
+{
+public:
+ GraphicSizeCheckGUIResult(SwDoc* pDocument);
+
+ OUString getTitle() override;
+};
+
+} // end sw namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/MarkManager.hxx b/sw/source/core/inc/MarkManager.hxx
new file mode 100644
index 0000000000..ef0e79d74c
--- /dev/null
+++ b/sw/source/core/inc/MarkManager.hxx
@@ -0,0 +1,168 @@
+/* -*- 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_MARKMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_MARKMANAGER_HXX
+
+#include <IMark.hxx>
+#include <IDocumentMarkAccess.hxx>
+#include <unordered_map>
+#include <memory>
+
+class SwCursorShell;
+class SfxViewShell;
+
+namespace sw::mark {
+ typedef std::unordered_map<OUString, sal_Int32> MarkBasenameMapUniqueOffset_t;
+
+ class FieldmarkWithDropDownButton;
+
+ class MarkManager final
+ : virtual public IDocumentMarkAccess
+ {
+ public:
+ MarkManager(/*[in/out]*/ SwDoc& rDoc);
+ // IDocumentMarkAccess
+ virtual ::sw::mark::IMark* makeMark(const SwPaM& rPaM,
+ const OUString& rName, IDocumentMarkAccess::MarkType eMark,
+ sw::mark::InsertMode eMode,
+ SwPosition const* pSepPos = nullptr) override;
+
+ virtual sw::mark::IFieldmark* makeFieldBookmark( const SwPaM& rPaM,
+ const OUString& rName,
+ const OUString& rType,
+ SwPosition const* pSepPos = nullptr) override;
+ virtual sw::mark::IFieldmark* makeNoTextFieldBookmark( const SwPaM& rPaM,
+ const OUString& rName,
+ const OUString& rType) override;
+
+ virtual ::sw::mark::IMark* getMarkForTextNode(const SwTextNode& rTextNode, IDocumentMarkAccess::MarkType eMark) override;
+
+ virtual sw::mark::IMark* makeAnnotationMark(
+ const SwPaM& rPaM,
+ const OUString& rName ) override;
+
+ virtual void repositionMark(::sw::mark::IMark* io_pMark, const SwPaM& rPaM) override;
+ virtual bool renameMark(::sw::mark::IMark* io_pMark, const OUString& rNewName) override;
+ virtual void correctMarksAbsolute(const SwNode& rOldNode, const SwPosition& rNewPos, const sal_Int32 nOffset) override;
+ virtual void correctMarksRelative(const SwNode& rOldNode, const SwPosition& rNewPos, const sal_Int32 nOffset) override;
+
+ virtual void deleteMarks(const SwNode& rStt,
+ const SwNode& rEnd,
+ std::vector< ::sw::mark::SaveBookmark>* pSaveBkmk,
+ std::optional<sal_Int32> oStartContentIdx,
+ std::optional<sal_Int32> oEndContentIdx,
+ bool isReplace) override;
+
+ // deleters
+ virtual std::unique_ptr<ILazyDeleter>
+ deleteMark(const const_iterator_t& ppMark, bool isMoveNodes) override;
+ virtual void deleteMark(const ::sw::mark::IMark* const pMark) override;
+ virtual void clearAllMarks() override;
+
+ // marks
+ virtual const_iterator_t getAllMarksBegin() const override;
+ virtual const_iterator_t getAllMarksEnd() const override;
+ virtual sal_Int32 getAllMarksCount() const override;
+ virtual const_iterator_t findMark(const OUString& rName) const override;
+
+ // bookmarks
+ virtual bool isBookmarkDeleted(SwPaM const& rPaM, bool isReplace) const override;
+ virtual const_iterator_t getBookmarksBegin() const override;
+ virtual const_iterator_t getBookmarksEnd() const override;
+ virtual sal_Int32 getBookmarksCount() const override;
+ virtual const_iterator_t findBookmark(const OUString& rName) const override;
+ virtual const_iterator_t findFirstBookmarkStartsAfter(const SwPosition& rPos) const override;
+ virtual ::sw::mark::IMark* getOneInnermostBookmarkFor(const SwPosition& rPos) const override;
+
+ // Fieldmarks
+ virtual const_iterator_t getFieldmarksBegin() const override;
+ virtual const_iterator_t getFieldmarksEnd() const override;
+ virtual sal_Int32 getFieldmarksCount() const override;
+ virtual ::sw::mark::IFieldmark* getFieldmarkAt(const SwPosition& rPos) const override;
+ virtual sw::mark::IFieldmark* getInnerFieldmarkFor(const SwPosition& rPos) const override;
+ virtual sw::mark::IFieldmark* getFieldmarkBefore(const SwPosition& rPos, bool bLoop) const override;
+ virtual sw::mark::IFieldmark* getFieldmarkAfter(const SwPosition& rPos, bool bLoop) const override;
+
+ virtual ::sw::mark::IFieldmark* getDropDownFor(const SwPosition &rPos) const override;
+ virtual std::vector<::sw::mark::IFieldmark*> getNoTextFieldmarksIn(const SwPaM &rPaM) const override;
+
+ virtual void deleteFieldmarkAt(const SwPosition& rPos) override;
+ virtual ::sw::mark::IFieldmark* changeFormFieldmarkType(::sw::mark::IFieldmark* pFieldmark, const OUString& rNewType) override;
+
+ virtual void NotifyCursorUpdate(const SwCursorShell& rCursorShell) override;
+ virtual void ClearFieldActivation() override;
+ void LOKUpdateActiveField(const SfxViewShell* pViewShell);
+
+ void dumpAsXml(xmlTextWriterPtr pWriter) const;
+
+ // Annotation Marks
+ virtual const_iterator_t getAnnotationMarksBegin() const override;
+ virtual const_iterator_t getAnnotationMarksEnd() const override;
+ virtual sal_Int32 getAnnotationMarksCount() const override;
+ virtual const_iterator_t findAnnotationMark( const OUString& rName ) const override;
+ virtual sw::mark::IMark* getAnnotationMarkFor(const SwPosition& rPos) const override;
+ virtual const_iterator_t findFirstAnnotationStartsAfter(const SwPosition& rPos) const override;
+
+ virtual void assureSortedMarkContainers() const override;
+
+ typedef std::vector<sw::mark::MarkBase*> container_t;
+
+ // helper bookmark to store annotation range of redlines
+ virtual ::sw::mark::IMark* makeAnnotationBookmark(const SwPaM& rPaM,
+ const OUString& rName, IDocumentMarkAccess::MarkType eMark,
+ sw::mark::InsertMode eMode,
+ SwPosition const* pSepPos = nullptr) override;
+ virtual const_iterator_t findAnnotationBookmark( const OUString& rName ) const override;
+ virtual void restoreAnnotationMarks(bool bDelete = true) override;
+
+ private:
+
+ MarkManager(MarkManager const&) = delete;
+ MarkManager& operator=(MarkManager const&) = delete;
+
+ // make names
+ OUString getUniqueMarkName(const OUString& rName) const;
+
+ void sortSubsetMarks();
+ void sortMarks();
+
+ // container for all marks, this container owns the objects it points to
+ container_t m_vAllMarks;
+
+ // additional container for bookmarks
+ container_t m_vBookmarks;
+ // additional container for fieldmarks
+ container_t m_vFieldmarks;
+
+ mutable MarkBasenameMapUniqueOffset_t m_aMarkBasenameMapUniqueOffset;
+
+ // container for annotation marks
+ container_t m_vAnnotationMarks;
+
+ SwDoc& m_rDoc;
+
+ sw::mark::FieldmarkWithDropDownButton* m_pLastActiveFieldmark;
+ };
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/ModelTraverser.hxx b/sw/source/core/inc/ModelTraverser.hxx
new file mode 100644
index 0000000000..f3c6acb9c6
--- /dev/null
+++ b/sw/source/core/inc/ModelTraverser.hxx
@@ -0,0 +1,51 @@
+/* -*- 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/.
+ *
+ */
+
+#pragma once
+
+#include <doc.hxx>
+
+class SwNode;
+class SdrObject;
+
+namespace sw
+{
+class SW_DLLPUBLIC ModelTraverseHandler
+{
+public:
+ virtual ~ModelTraverseHandler() {}
+
+ virtual void handleNode(SwNode* pNode) = 0;
+ virtual void handleSdrObject(SdrObject* pObject) = 0;
+};
+
+class ModelTraverser
+{
+private:
+ std::vector<std::shared_ptr<ModelTraverseHandler>> mpNodeHandler;
+ SwDoc* m_pDoc;
+
+public:
+ ModelTraverser(SwDoc* pDoc)
+ : m_pDoc(pDoc)
+ {
+ }
+
+ void traverse();
+
+ void addNodeHandler(std::shared_ptr<ModelTraverseHandler> pHandler)
+ {
+ mpNodeHandler.push_back(pHandler);
+ }
+};
+
+} // end sw namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/SearchResultLocator.hxx b/sw/source/core/inc/SearchResultLocator.hxx
new file mode 100644
index 0000000000..ad48e075d2
--- /dev/null
+++ b/sw/source/core/inc/SearchResultLocator.hxx
@@ -0,0 +1,71 @@
+/* -*- 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/.
+ *
+ */
+
+#pragma once
+
+#include <swdllapi.h>
+#include <doc.hxx>
+#include <basegfx/range/b2drange.hxx>
+#include <utility>
+
+namespace sw::search
+{
+enum class NodeType
+{
+ Undefined = 0,
+ WriterNode = 1,
+ CommonNode = 2 // node in a SdrObject
+};
+
+struct SearchIndexData
+{
+ NodeType meType = NodeType::Undefined;
+ SwNodeOffset mnNodeIndex{ 0 };
+ OUString maObjectName;
+
+ SearchIndexData() {}
+
+ SearchIndexData(NodeType eType, SwNodeOffset nNodeIndex, OUString aObjectName = OUString())
+ : meType(eType)
+ , mnNodeIndex(nNodeIndex)
+ , maObjectName(std::move(aObjectName))
+ {
+ }
+};
+
+struct LocationResult
+{
+ bool mbFound = false;
+ std::vector<basegfx::B2DRange> maRectangles;
+};
+
+class SW_DLLPUBLIC SearchResultLocator
+{
+ SwDoc* mpDocument;
+
+ void findOne(LocationResult& rResult, SearchIndexData const& rSearchIndexData);
+ static bool tryParseJSON(const char* pPayload,
+ std::vector<sw::search::SearchIndexData>& rDataVector);
+ static bool tryParseXML(const char* pPayload,
+ std::vector<sw::search::SearchIndexData>& rDataVector);
+
+public:
+ SearchResultLocator(SwDoc* pDoc)
+ : mpDocument(pDoc)
+ {
+ }
+
+ LocationResult find(std::vector<SearchIndexData> const& rSearchIndexDataVector);
+ LocationResult findForPayload(const char* pPayload);
+};
+
+} // end sw namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/SwGrammarMarkUp.hxx b/sw/source/core/inc/SwGrammarMarkUp.hxx
new file mode 100644
index 0000000000..efefadf83a
--- /dev/null
+++ b/sw/source/core/inc/SwGrammarMarkUp.hxx
@@ -0,0 +1,71 @@
+/* -*- 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_SWGRAMMARMARKUP_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SWGRAMMARMARKUP_HXX
+
+#include "wrong.hxx"
+#include <vector>
+
+/* SwGrammarMarkUp extends the functionality of a "normal" SwWrongList by memorizing
+ the start positions of sentences in the paragraph
+
+ The whole class is only a temporary solution without usage of virtual functions.
+ At the end the whole SwWrongList stuff should be reworked and replaced by interfaces
+ to deal with all the different wronglists like
+ spell, grammar, smarttag, sentence...
+ "MarkUpList" would be a better name than WrongList.
+*/
+
+class SwGrammarMarkUp final : public SwWrongList
+{
+ std::vector<sal_Int32> maSentence;
+
+public:
+ SwGrammarMarkUp()
+ : SwWrongList(WRONGLIST_GRAMMAR)
+ {
+ }
+
+ virtual ~SwGrammarMarkUp() override;
+ virtual SwWrongList* Clone() override;
+ virtual void CopyFrom(const SwWrongList& rCopy) override;
+
+ /* SwWrongList::Move() + handling of maSentence */
+ void MoveGrammar(sal_Int32 nPos, sal_Int32 nDiff);
+ /* SwWrongList::SplitList() + handling of maSentence */
+ std::unique_ptr<SwGrammarMarkUp> SplitGrammarList(sal_Int32 nSplitPos);
+ /* SwWrongList::JoinList() + handling of maSentence */
+ void JoinGrammarList(SwGrammarMarkUp* pNext, sal_Int32 nInsertPos);
+ /* SwWrongList::ClearList() + handling of maSentence */
+ void ClearGrammarList(sal_Int32 nSentenceEnd = COMPLETE_STRING);
+ /* setSentence to define the start position of a sentence,
+ at the moment the end position is given by the next start position */
+ void setSentence(sal_Int32 nStart);
+ /* getSentenceStart returns the last start position of a sentence
+ which is lower or equal to the given parameter */
+ sal_Int32 getSentenceStart(sal_Int32 nPos);
+ /* getSentenceEnd returns the first start position of a sentence
+ which is greater than the given parameter */
+ sal_Int32 getSentenceEnd(sal_Int32 nPos);
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/SwPortionHandler.hxx b/sw/source/core/inc/SwPortionHandler.hxx
new file mode 100644
index 0000000000..29625efbca
--- /dev/null
+++ b/sw/source/core/inc/SwPortionHandler.hxx
@@ -0,0 +1,98 @@
+/* -*- 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_SWPORTIONHANDLER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SWPORTIONHANDLER_HXX
+
+#include <swdllapi.h>
+#include <rtl/ustring.hxx>
+#include "TextFrameIndex.hxx"
+
+class SwFont;
+enum class PortionType;
+
+/** The SwPortionHandler interface implements a visitor for the layout
+ * engine's text portions. This can be used to gather information of
+ * the on-screen representation of a single paragraph.
+ *
+ * For each text portion, one of the methods text(...) or special(...)
+ * is called, depending on whether it is a 'normal' run of text, or
+ * any other portion. Additionally, the linebreak() method is called
+ * once at the end of every on-screen line.
+ *
+ * All parameters relate to the 'view string', which is the text string
+ * held by the sequence of all corresponding SwTextFrames.
+ *
+ * The SwPortionHandler can be used with the
+ * SwTextFrame::VisitPortions(...) method.
+ */
+class SW_DLLPUBLIC SwPortionHandler
+{
+public:
+
+ virtual ~SwPortionHandler() {} /// (empty) destructor
+
+ /** text portion. A run of nLength characters from the view
+ * string, that contains no special characters like embedded
+ * fields, etc. Thus, the on-screen text of this portion
+ * corresponds exactly to the corresponding characters in the
+ * view string.
+ */
+ virtual void Text(
+ TextFrameIndex nLength, ///< length of this portion in the view string
+ PortionType nType /// type of this portion
+ ) = 0;
+
+ /** special portion. This method is called for every non-text
+ * portion. The parameters describe the length of the
+ * corresponding characters in the view string (often 0 or 1),
+ * the text which is displayed, and the type of the portion.
+ */
+ virtual void Special(
+ TextFrameIndex nLength, ///< length of this portion in the view string
+ const OUString& rText, /// text which is painted on-screen
+ PortionType nType /// type of this portion
+ ) = 0;
+
+ /** line break. This method is called whenever a line break in the
+ * layout occurs.
+ */
+ virtual void LineBreak() = 0;
+
+ /** skip characters. The SwTextFrame may only display partially
+ * display a certain paragraph (e.g. when the paragraph is split
+ * across multiple pages). In this case, the Skip() method must be
+ * called to inform the portion handler to ignore a certain run of
+ * characters in the 'view string'. Skip(), if used at all, must
+ * be called before any of the other methods is called. Calling
+ * Skip() between portions is not allowed.
+ */
+ virtual void Skip(
+ TextFrameIndex nLength /// number of 'view string' characters to be skipped
+ ) = 0;
+
+ /** end of paragraph. This method is to be called when all the
+ * paragraph's portions have been processed.
+ */
+ virtual void Finish() = 0;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/SwUndoFmt.hxx b/sw/source/core/inc/SwUndoFmt.hxx
new file mode 100644
index 0000000000..c3f0a256f1
--- /dev/null
+++ b/sw/source/core/inc/SwUndoFmt.hxx
@@ -0,0 +1,257 @@
+/* -*- 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_SWUNDOFMT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SWUNDOFMT_HXX
+
+#include <undobj.hxx>
+#include <swundo.hxx>
+#include <numrule.hxx>
+#include <memory>
+
+class SwDoc;
+class SwTextFormatColl;
+class SwConditionTextFormatColl;
+class SwRewriter;
+
+class SwUndoFormatCreate : public SwUndo
+{
+protected:
+ SwFormat * m_pNew;
+ OUString m_sDerivedFrom;
+ SwDoc& m_rDoc;
+ mutable OUString m_sNewName;
+ std::unique_ptr<SfxItemSet> m_pNewSet;
+ sal_uInt16 m_nId; // FormatId related
+ bool m_bAuto;
+
+public:
+ SwUndoFormatCreate(SwUndoId nUndoId, SwFormat * pNew, SwFormat const * pDerivedFrom,
+ SwDoc& rDoc);
+ virtual ~SwUndoFormatCreate() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+
+ virtual SwFormat * Create(SwFormat * pDerivedFrom) = 0;
+ virtual void Delete() = 0;
+ virtual SwFormat * Find(const OUString & rName) const = 0;
+};
+
+class SwUndoFormatDelete : public SwUndo
+{
+protected:
+ OUString m_sDerivedFrom;
+ SwDoc& m_rDoc;
+ OUString m_sOldName;
+ SfxItemSet m_aOldSet;
+ sal_uInt16 m_nId; // FormatId related
+ bool m_bAuto;
+
+public:
+ SwUndoFormatDelete(SwUndoId nUndoId, SwFormat const * pOld, SwDoc& rDoc);
+ virtual ~SwUndoFormatDelete() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+
+ virtual SwFormat * Create(SwFormat * pDerivedFrom) = 0;
+ virtual void Delete(SwFormat * pFormat) = 0;
+ virtual SwFormat * Find(const OUString & rName) const = 0;
+};
+
+class SwUndoRenameFormat : public SwUndo
+{
+protected:
+ OUString m_sOldName, m_sNewName;
+ SwDoc& m_rDoc;
+
+public:
+ SwUndoRenameFormat(SwUndoId nUndoId, OUString sOldName,
+ OUString sNewName,
+ SwDoc& rDoc);
+ virtual ~SwUndoRenameFormat() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ SwRewriter GetRewriter() const override;
+
+ virtual SwFormat * Find(const OUString & rName) const = 0;
+};
+
+class SwUndoTextFormatCollCreate : public SwUndoFormatCreate
+{
+public:
+ SwUndoTextFormatCollCreate(SwTextFormatColl * pNew, SwTextFormatColl const * pDerivedFrom,
+ SwDoc& rDoc);
+
+ virtual SwFormat * Create(SwFormat * pDerivedFrom) override;
+ virtual void Delete() override;
+ virtual SwFormat * Find(const OUString & rName) const override;
+};
+
+class SwUndoTextFormatCollDelete : public SwUndoFormatDelete
+{
+public:
+ SwUndoTextFormatCollDelete(SwTextFormatColl const * pOld, SwDoc& rDoc);
+
+ virtual SwFormat * Create(SwFormat * pDerivedFrom) override;
+ virtual void Delete(SwFormat * pFormat) override;
+ virtual SwFormat * Find(const OUString & rName) const override;
+};
+
+class SwUndoCondTextFormatCollCreate final : public SwUndoTextFormatCollCreate
+{
+public:
+ SwUndoCondTextFormatCollCreate(SwConditionTextFormatColl * pNew, SwTextFormatColl const * pDerivedFrom, SwDoc& rDoc);
+ virtual SwFormat * Create(SwFormat * pDerivedFrom) override;
+};
+
+class SwUndoCondTextFormatCollDelete final : public SwUndoTextFormatCollDelete
+{
+public:
+ SwUndoCondTextFormatCollDelete(SwTextFormatColl const * pOld, SwDoc& rDoc);
+ virtual SwFormat * Create(SwFormat * pDerivedFrom) override;
+};
+
+class SwUndoRenameFormatColl final : public SwUndoRenameFormat
+{
+public:
+ SwUndoRenameFormatColl(const OUString & sOldName,
+ const OUString & sNewName,
+ SwDoc& rDoc);
+
+ virtual SwFormat * Find(const OUString & rName) const override;
+};
+
+class SwUndoCharFormatCreate final : public SwUndoFormatCreate
+{
+public:
+ SwUndoCharFormatCreate(SwCharFormat * pNew, SwCharFormat const * pDerivedFrom,
+ SwDoc& rDoc);
+
+ virtual SwFormat * Create(SwFormat * pDerivedFrom) override;
+ virtual void Delete() override;
+ virtual SwFormat * Find(const OUString & rName) const override;
+};
+
+class SwUndoCharFormatDelete final : public SwUndoFormatDelete
+{
+public:
+ SwUndoCharFormatDelete(SwCharFormat const * pOld, SwDoc& rDoc);
+
+ virtual SwFormat * Create(SwFormat * pDerivedFrom) override;
+ virtual void Delete(SwFormat * pFormat) override;
+ virtual SwFormat * Find(const OUString & rName) const override;
+};
+
+class SwUndoRenameCharFormat final : public SwUndoRenameFormat
+{
+public:
+ SwUndoRenameCharFormat(const OUString & sOldName,
+ const OUString & sNewName,
+ SwDoc& rDoc);
+
+ virtual SwFormat * Find(const OUString & rName) const override;
+};
+
+class SwUndoFrameFormatCreate final : public SwUndoFormatCreate
+{
+public:
+ SwUndoFrameFormatCreate(SwFrameFormat * pNew, SwFrameFormat const * pDerivedFrom,
+ SwDoc& rDoc);
+
+ virtual SwFormat * Create(SwFormat * pDerivedFrom) override;
+ virtual void Delete() override;
+ virtual SwFormat * Find(const OUString & rName) const override;
+};
+
+class SwUndoFrameFormatDelete final : public SwUndoFormatDelete
+{
+public:
+ SwUndoFrameFormatDelete(SwFrameFormat const * pOld, SwDoc& rDoc);
+
+ virtual SwFormat * Create(SwFormat * pDerivedFrom) override;
+ virtual void Delete(SwFormat * pFormat) override;
+ virtual SwFormat * Find(const OUString & rName) const override;
+};
+
+class SwUndoRenameFrameFormat final : public SwUndoRenameFormat
+{
+public:
+ SwUndoRenameFrameFormat(const OUString & sOldName,
+ const OUString & sNewName,
+ SwDoc& rDoc);
+
+ virtual SwFormat * Find(const OUString & rName) const override;
+};
+
+class SwUndoNumruleCreate final : public SwUndo
+{
+ const SwNumRule * m_pNew;
+ mutable SwNumRule m_aNew;
+ SwDoc& m_rDoc;
+ mutable bool m_bInitialized;
+
+public:
+ SwUndoNumruleCreate(const SwNumRule * pNew, SwDoc& rDoc);
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ SwRewriter GetRewriter() const override;
+};
+
+class SwUndoNumruleDelete final : public SwUndo
+{
+ SwNumRule m_aOld;
+ SwDoc& m_rDoc;
+
+public:
+ SwUndoNumruleDelete(const SwNumRule& rRule, SwDoc& rDoc);
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ SwRewriter GetRewriter() const override;
+};
+
+class SwUndoNumruleRename final : public SwUndo
+{
+ OUString m_aOldName, m_aNewName;
+ SwDoc& m_rDoc;
+
+ public:
+ SwUndoNumruleRename(OUString aOldName, OUString aNewName,
+ SwDoc& rDoc);
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ SwRewriter GetRewriter() const override;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_SWUNDOFMT_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/SwUndoPageDesc.hxx b/sw/source/core/inc/SwUndoPageDesc.hxx
new file mode 100644
index 0000000000..ab90a3a65b
--- /dev/null
+++ b/sw/source/core/inc/SwUndoPageDesc.hxx
@@ -0,0 +1,88 @@
+/* -*- 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_SWUNDOPAGEDESC_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SWUNDOPAGEDESC_HXX
+
+#include <undobj.hxx>
+#include <pagedesc.hxx>
+
+class SwDoc;
+
+class SwUndoPageDesc final : public SwUndo
+{
+ SwPageDescExt m_aOld, m_aNew;
+ SwDoc * m_pDoc;
+ bool m_bExchange;
+
+ // To avoid duplication of (header/footer)content nodes for simple page desc changes
+ void ExchangeContentNodes( SwPageDesc& rSource, SwPageDesc &rDest );
+
+ // tdf#153220 use to Exit HeaderFooter EditMode
+ void ExitHeaderFooterEdit();
+public:
+ SwUndoPageDesc(const SwPageDesc & aOld, const SwPageDesc & aNew,
+ SwDoc * pDoc);
+ virtual ~SwUndoPageDesc() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+};
+
+class SwUndoPageDescCreate final : public SwUndo
+{
+ const SwPageDesc * m_pDesc;
+ SwPageDescExt m_aNew;
+ SwDoc * m_pDoc;
+
+ void DoImpl();
+
+public:
+ SwUndoPageDescCreate(const SwPageDesc * pNew, SwDoc * pDoc);
+ virtual ~SwUndoPageDescCreate() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+};
+
+class SwUndoPageDescDelete final : public SwUndo
+{
+ SwPageDescExt m_aOld;
+ SwDoc * m_pDoc;
+
+ void DoImpl();
+
+public:
+ SwUndoPageDescDelete(const SwPageDesc & aOld, SwDoc * pDoc);
+ virtual ~SwUndoPageDescDelete() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+};
+#endif // _SW_UNDO_PAGE_DESC_CHANGE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/SwUndoTOXChange.hxx b/sw/source/core/inc/SwUndoTOXChange.hxx
new file mode 100644
index 0000000000..a7aabf41e4
--- /dev/null
+++ b/sw/source/core/inc/SwUndoTOXChange.hxx
@@ -0,0 +1,45 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <undobj.hxx>
+#include <tox.hxx>
+
+class SwDoc;
+class SwTOXBaseSection;
+
+class SwUndoTOXChange final : public SwUndo
+{
+private:
+ SwTOXBase m_Old;
+ SwTOXBase m_New;
+
+ SwNodeOffset const m_nNodeIndex;
+
+public:
+ SwUndoTOXChange(const SwDoc& rDoc, SwTOXBaseSection const& rTOX, const SwTOXBase& rNew);
+ virtual ~SwUndoTOXChange() override;
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+ virtual void RepeatImpl(::sw::RepeatContext&) override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/SwXMLBlockExport.hxx b/sw/source/core/inc/SwXMLBlockExport.hxx
new file mode 100644
index 0000000000..90f8c59595
--- /dev/null
+++ b/sw/source/core/inc/SwXMLBlockExport.hxx
@@ -0,0 +1,63 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <xmloff/xmlexp.hxx>
+
+class SwXMLTextBlocks;
+
+class SwXMLBlockListExport final : public SvXMLExport
+{
+private:
+ SwXMLTextBlocks &m_rBlockList;
+
+public:
+ SwXMLBlockListExport(
+ const css::uno::Reference< css::uno::XComponentContext >& rContext,
+ SwXMLTextBlocks & rBlocks,
+ const OUString &rFileName,
+ css::uno::Reference< css::xml::sax::XDocumentHandler> const &rHandler);
+
+ ErrCode exportDoc( enum ::xmloff::token::XMLTokenEnum eClass = ::xmloff::token::XML_TOKEN_INVALID ) override;
+ void ExportAutoStyles_() override {}
+ void ExportMasterStyles_ () override {}
+ void ExportContent_() override {}
+};
+
+class SwXMLTextBlockExport final : public SvXMLExport
+{
+private:
+ SwXMLTextBlocks &m_rBlockList;
+
+public:
+ SwXMLTextBlockExport(
+ const css::uno::Reference< css::uno::XComponentContext >& rContext,
+ SwXMLTextBlocks & rBlocks,
+ const OUString &rFileName,
+ css::uno::Reference< css::xml::sax::XDocumentHandler> const &rHandler);
+
+ ErrCode exportDoc(enum ::xmloff::token::XMLTokenEnum /*eClass*/) override { return ERRCODE_NONE; }
+ void exportDoc(std::u16string_view rText);
+ void ExportAutoStyles_() override {}
+ void ExportMasterStyles_ () override {}
+ void ExportContent_() override {}
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/SwXMLBlockImport.hxx b/sw/source/core/inc/SwXMLBlockImport.hxx
new file mode 100644
index 0000000000..821033c1e1
--- /dev/null
+++ b/sw/source/core/inc/SwXMLBlockImport.hxx
@@ -0,0 +1,126 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <xmloff/xmlimp.hxx>
+#include <xmloff/xmlnamespace.hxx>
+#include <xmloff/xmltoken.hxx>
+#include <com/sun/star/xml/sax/FastToken.hpp>
+#include <sax/fastattribs.hxx>
+
+namespace com::sun::star::xml::sax { class XFastTokenHandler; }
+
+using namespace css::xml::sax;
+using namespace xmloff::token;
+
+class SwXMLTextBlocks;
+class SwXMLBlockListImport final : public SvXMLImport
+{
+private:
+ SwXMLTextBlocks &m_rBlockList;
+
+ // This method is called after the namespace map has been updated, but
+ // before a context for the current element has been pushed.
+ virtual SvXMLImportContext* CreateFastContext( sal_Int32 Element,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override;
+
+public:
+ SwXMLBlockListImport(
+ const css::uno::Reference< css::uno::XComponentContext >& rContext,
+ SwXMLTextBlocks &rBlocks );
+
+ SwXMLTextBlocks& getBlockList()
+ {
+ return m_rBlockList;
+ }
+ virtual ~SwXMLBlockListImport()
+ noexcept override;
+};
+
+class SwXMLTextBlockImport final : public SvXMLImport
+{
+ // This method is called after the namespace map has been updated, but
+ // before a context for the current element has been pushed.
+ virtual SvXMLImportContext* CreateFastContext( sal_Int32 Element,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override;
+
+public:
+ bool m_bTextOnly;
+ OUString &m_rText;
+ SwXMLTextBlockImport(
+ const css::uno::Reference< css::uno::XComponentContext >& rContext,
+ OUString &rNewText, bool bNewTextOnly );
+
+ virtual ~SwXMLTextBlockImport()
+ noexcept override;
+ virtual void SAL_CALL endDocument() override;
+};
+
+enum SwXMLTextBlockToken : sal_Int32
+{
+ OFFICE_BODY = FastToken::NAMESPACE | XML_NAMESPACE_OFFICE | XML_BODY,
+ OFFICE_TEXT = FastToken::NAMESPACE | XML_NAMESPACE_OFFICE | XML_TEXT,
+ OFFICE_DOCUMENT = FastToken::NAMESPACE | XML_NAMESPACE_OFFICE | XML_DOCUMENT,
+ OFFICE_DOCUMENT_CONTENT = FastToken::NAMESPACE | XML_NAMESPACE_OFFICE | XML_DOCUMENT_CONTENT,
+ TEXT_P = FastToken::NAMESPACE | XML_NAMESPACE_TEXT | XML_P
+};
+
+class SwXMLTextBlockTokenHandler final :
+ public sax_fastparser::FastTokenHandlerBase
+{
+public:
+ SwXMLTextBlockTokenHandler();
+ virtual ~SwXMLTextBlockTokenHandler() override;
+
+ //XFastTokenHandler
+ sal_Int32 SAL_CALL getTokenFromUTF8( const css::uno::Sequence< sal_Int8 >& Identifier ) override;
+ css::uno::Sequence< sal_Int8 > SAL_CALL getUTF8Identifier( sal_Int32 Token ) override;
+
+ //Much fast direct C++ shortcut to the method that matters
+ virtual sal_Int32 getTokenDirect( const char *pTag, sal_Int32 nLength ) const override;
+};
+
+enum SwXMLBlockListToken : sal_Int32
+{
+ ABBREVIATED_NAME = FastToken::NAMESPACE | XML_NAMESPACE_BLOCKLIST | XML_ABBREVIATED_NAME,
+ BLOCK = FastToken::NAMESPACE | XML_NAMESPACE_BLOCKLIST | XML_BLOCK,
+ BLOCK_LIST = FastToken::NAMESPACE | XML_NAMESPACE_BLOCKLIST | XML_BLOCK_LIST,
+ LIST_NAME = FastToken::NAMESPACE | XML_NAMESPACE_BLOCKLIST | XML_LIST_NAME,
+ NAME = FastToken::NAMESPACE | XML_NAMESPACE_BLOCKLIST | XML_NAME,
+ PACKAGE_NAME = FastToken::NAMESPACE | XML_NAMESPACE_BLOCKLIST | XML_PACKAGE_NAME,
+ UNFORMATTED_TEXT = FastToken::NAMESPACE | XML_NAMESPACE_BLOCKLIST | XML_UNFORMATTED_TEXT
+};
+
+class SwXMLBlockListTokenHandler final :
+ public sax_fastparser::FastTokenHandlerBase
+{
+public:
+ SwXMLBlockListTokenHandler();
+ virtual ~SwXMLBlockListTokenHandler() override;
+
+ //XFastTokenHandler
+ sal_Int32 SAL_CALL getTokenFromUTF8( const css::uno::Sequence< sal_Int8 >& Identifier ) override;
+ css::uno::Sequence< sal_Int8 > SAL_CALL getUTF8Identifier( sal_Int32 Token ) override;
+
+ //Much fast direct C++ shortcut to the method that matters
+ virtual sal_Int32 getTokenDirect( const char *pTag, sal_Int32 nLength ) const override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/SwXMLTextBlocks.hxx b/sw/source/core/inc/SwXMLTextBlocks.hxx
new file mode 100644
index 0000000000..05a97ded59
--- /dev/null
+++ b/sw/source/core/inc/SwXMLTextBlocks.hxx
@@ -0,0 +1,98 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <string_view>
+
+#include <sfx2/objsh.hxx>
+#include "swblocks.hxx"
+#include <o3tl/typed_flags_set.hxx>
+
+class SwDoc;
+class SvxMacroTableDtor;
+
+enum class SwXmlFlags {
+ NONE = 0x0000,
+ NoRootCommit = 0x0002,
+};
+namespace o3tl {
+ template<> struct typed_flags<SwXmlFlags> : is_typed_flags<SwXmlFlags, 0x0002> {};
+}
+
+class SwXMLTextBlocks final : public SwImpBlocks
+{
+ SfxObjectShellRef m_xDocShellRef;
+ SwXmlFlags m_nFlags;
+ OUString m_aPackageName;
+ tools::SvRef<SfxMedium> m_xMedium;
+ css::uno::Reference < css::embed::XStorage > m_xBlkRoot;
+ css::uno::Reference < css::embed::XStorage > m_xRoot;
+
+ void ReadInfo();
+ void WriteInfo();
+ void InitBlockMode ( const css::uno::Reference < css::embed::XStorage >& rStorage );
+ void ResetBlockMode();
+
+public:
+ SwXMLTextBlocks( const OUString& rFile );
+ SwXMLTextBlocks( const css::uno::Reference < css::embed::XStorage >&, const OUString& rFile );
+ void AddName( const OUString&, const OUString&, const OUString&, bool bOnlyText );
+ virtual void AddName( const OUString&, const OUString&, bool bOnlyText = false ) override;
+ static OUString GeneratePackageName ( std::u16string_view rShort );
+ virtual ~SwXMLTextBlocks() override;
+ virtual ErrCode Delete( sal_uInt16 ) override;
+ virtual ErrCode Rename( sal_uInt16, const OUString& ) override;
+ virtual ErrCode CopyBlock( SwImpBlocks& rImp, OUString& rShort, const OUString& rLong) override;
+ virtual void ClearDoc() override;
+ virtual ErrCode GetDoc( sal_uInt16 ) override;
+ virtual ErrCode BeginPutDoc( const OUString&, const OUString& ) override;
+ virtual ErrCode PutDoc() override;
+ virtual ErrCode PutText( const OUString&, const OUString&, const OUString& ) override;
+ virtual ErrCode MakeBlockList() override;
+
+ virtual ErrCode OpenFile( bool bReadOnly = true ) override;
+ virtual void CloseFile() override;
+
+ static bool IsFileUCBStorage( const OUString & rFileName);
+
+ // Methods for the new Autocorrecter
+ ErrCode GetText( std::u16string_view rShort, OUString& );
+
+ virtual bool IsOnlyTextBlock( const OUString& rShort ) const override;
+ bool IsOnlyTextBlock( sal_uInt16 nIdx ) const;
+ void SetIsTextOnly( const OUString& rShort, bool bNewValue );
+
+ virtual ErrCode GetMacroTable( sal_uInt16, SvxMacroTableDtor& rMacroTable ) override;
+ virtual ErrCode SetMacroTable( sal_uInt16 nIdx,
+ const SvxMacroTableDtor& rMacroTable ) override;
+ virtual bool PutMuchEntries( bool bOn ) override;
+
+ SwDoc* GetDoc() const { return m_xDoc.get(); }
+ //void SetDoc( SwDoc * pNewDoc);
+ ErrCode StartPutBlock( const OUString& rShort, const OUString& rPackageName );
+ ErrCode PutBlock();
+ ErrCode GetBlockText( std::u16string_view rShort, OUString& rText );
+ ErrCode PutBlockText( const OUString& rShort, std::u16string_view rText, const OUString& rPackageName );
+ void MakeBlockText( std::u16string_view rText );
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/SwXTextDefaults.hxx b/sw/source/core/inc/SwXTextDefaults.hxx
new file mode 100644
index 0000000000..0acab2a7d2
--- /dev/null
+++ b/sw/source/core/inc/SwXTextDefaults.hxx
@@ -0,0 +1,65 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <cppuhelper/implbase.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XPropertyState.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+
+class SwDoc;
+class SfxItemPropertySet;
+
+class SwXTextDefaults final : public cppu::WeakImplHelper
+ <
+ css::beans::XPropertyState,
+ css::beans::XPropertySet,
+ css::lang::XServiceInfo
+ >
+{
+ const SfxItemPropertySet* m_pPropSet;
+ SwDoc * m_pDoc;
+
+public:
+ SwXTextDefaults ( SwDoc * pNewDoc );
+ virtual ~SwXTextDefaults () override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override;
+ virtual void SAL_CALL setPropertyValue( const OUString& rPropertyName, const css::uno::Any& aValue ) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& rPropertyName ) override;
+ virtual void SAL_CALL addPropertyChangeListener( const OUString& rPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertyChangeListener( const OUString& rPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override;
+ virtual void SAL_CALL addVetoableChangeListener( const OUString& rPropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+ virtual void SAL_CALL removeVetoableChangeListener( const OUString& rPropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+
+ // XPropertyState
+ virtual css::beans::PropertyState SAL_CALL getPropertyState( const OUString& rPropertyName ) override;
+ virtual css::uno::Sequence< css::beans::PropertyState > SAL_CALL getPropertyStates( const css::uno::Sequence< OUString >& rPropertyNames ) override;
+ virtual void SAL_CALL setPropertyToDefault( const OUString& rPropertyName ) override;
+ virtual css::uno::Any SAL_CALL getPropertyDefault( const OUString& rPropertyName ) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName( ) override;
+ virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/TextFrameIndex.hxx b/sw/source/core/inc/TextFrameIndex.hxx
new file mode 100644
index 0000000000..3987bd5903
--- /dev/null
+++ b/sw/source/core/inc/TextFrameIndex.hxx
@@ -0,0 +1,26 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#ifndef INCLUDED_SW_SOURCE_CORE_INC_TEXTFRAMEINDEX_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_TEXTFRAMEINDEX_HXX
+
+#include <sal/types.h>
+#include <o3tl/strong_int.hxx>
+
+/**
+ * Denotes a character index in a text frame at a layout level, after extent
+ * mapping from a text node at a document model level.
+ *
+ * @see SwTextFrame::MapViewToModelPos().
+ */
+typedef o3tl::strong_int<sal_Int32, struct Tag_TextFrameIndex> TextFrameIndex;
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_TEXTFRAMEINDEX_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sw/source/core/inc/ThemeColorChanger.hxx b/sw/source/core/inc/ThemeColorChanger.hxx
new file mode 100644
index 0000000000..6eeb3a25f6
--- /dev/null
+++ b/sw/source/core/inc/ThemeColorChanger.hxx
@@ -0,0 +1,33 @@
+/* -*- 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/.
+ *
+ */
+#pragma once
+
+#include <swdllapi.h>
+#include <docsh.hxx>
+#include <docmodel/theme/ColorSet.hxx>
+#include <svx/theme/IThemeColorChanger.hxx>
+
+namespace sw
+{
+class SW_DLLPUBLIC ThemeColorChanger : public svx::IThemeColorChanger
+{
+private:
+ SwDocShell* mpDocSh;
+
+public:
+ ThemeColorChanger(SwDocShell* pDocSh);
+ virtual ~ThemeColorChanger() override;
+
+ void apply(std::shared_ptr<model::ColorSet> const& pColorSet) override;
+};
+
+} // end sw namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoAttribute.hxx b/sw/source/core/inc/UndoAttribute.hxx
new file mode 100644
index 0000000000..f6905cafc6
--- /dev/null
+++ b/sw/source/core/inc/UndoAttribute.hxx
@@ -0,0 +1,269 @@
+/* -*- 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_UNDOATTRIBUTE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDOATTRIBUTE_HXX
+
+#include <undobj.hxx>
+#include <memory>
+#include <rtl/ustring.hxx>
+#include <svl/itemset.hxx>
+#include <swtypes.hxx>
+#include <calbck.hxx>
+#include <o3tl/sorted_vector.hxx>
+
+class SvxTabStopItem;
+class SwFormat;
+class SwFootnoteInfo;
+class SwEndNoteInfo;
+class SwDoc;
+
+class SwUndoAttr final : public SwUndo, private SwUndRng
+{
+ SfxItemSet m_AttrSet; // attributes for Redo
+ const std::unique_ptr<SwHistory> m_pHistory; // History for Undo
+ std::unique_ptr<SwRedlineData> m_pRedlineData; // Redlining
+ std::unique_ptr<SwRedlineSaveDatas> m_pRedlineSaveData;
+ SwNodeOffset m_nNodeIndex; // Offset: for Redlining
+ const SetAttrMode m_nInsertFlags; // insert flags
+ OUString m_aChrFormatName;
+
+ void RemoveIdx( SwDoc& rDoc );
+ void redoAttribute(SwPaM& rPam, sw::UndoRedoContext& rContext);
+public:
+ SwUndoAttr( const SwPaM&, SfxItemSet, const SetAttrMode nFlags );
+ SwUndoAttr( const SwPaM&, const SfxPoolItem&, const SetAttrMode nFlags );
+
+ virtual ~SwUndoAttr() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ void SaveRedlineData( const SwPaM& rPam, bool bInsContent );
+
+ SwHistory& GetHistory() { return *m_pHistory; }
+};
+
+class SwUndoResetAttr final : public SwUndo, private SwUndRng
+{
+ const std::unique_ptr<SwHistory> m_pHistory;
+ o3tl::sorted_vector<sal_uInt16> m_Ids;
+ const sal_uInt16 m_nFormatId; // Format-Id for Redo
+
+public:
+ SwUndoResetAttr( const SwPaM&, sal_uInt16 nFormatId );
+ SwUndoResetAttr( const SwPosition&, sal_uInt16 nFormatId );
+
+ virtual ~SwUndoResetAttr() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ void SetAttrs( o3tl::sorted_vector<sal_uInt16> && rAttrs );
+
+ SwHistory& GetHistory() { return *m_pHistory; }
+};
+
+class SwUndoFormatAttr final : public SwUndo
+{
+ friend class SwUndoDefaultAttr;
+ OUString m_sFormatName;
+ std::optional<SfxItemSet> m_oOldSet; // old attributes
+ sal_Int32 m_nAnchorContentOffset;
+ SwNodeOffset m_nNodeIndex;
+ const sal_uInt16 m_nFormatWhich;
+ const bool m_bSaveDrawPt;
+
+ void SaveFlyAnchor( const SwFormat * pFormat, bool bSaveDrawPt = false );
+ // #i35443# - Add return value, type <bool>.
+ // Return value indicates, if anchor attribute is restored.
+ // Notes: - If anchor attribute is restored, all other existing attributes
+ // are also restored.
+ // - Anchor attribute isn't restored successfully, if it contains
+ // an invalid anchor position and all other existing attributes
+ // aren't restored.
+ // This situation occurs for undo of styles.
+ bool RestoreFlyAnchor(::sw::UndoRedoContext & rContext);
+ // --> OD 2008-02-27 #refactorlists# - removed <rAffectedItemSet>
+ void Init( const SwFormat & rFormat );
+
+public:
+ // register at the Format and save old attributes
+ // --> OD 2008-02-27 #refactorlists# - removed <rNewSet>
+ SwUndoFormatAttr( SfxItemSet&& rOldSet,
+ SwFormat& rFormat,
+ bool bSaveDrawPt );
+ SwUndoFormatAttr( const SfxPoolItem& rItem,
+ SwFormat& rFormat,
+ bool bSaveDrawPt );
+
+ virtual ~SwUndoFormatAttr() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+
+ void PutAttr( const SfxPoolItem& rItem, const SwDoc& rDoc );
+ SwFormat* GetFormat( const SwDoc& rDoc ); // checks if it is still in the Doc!
+};
+
+// --> OD 2008-02-12 #newlistlevelattrs#
+class SwUndoFormatResetAttr final : public SwUndo
+{
+ public:
+ SwUndoFormatResetAttr( SwFormat& rChangedFormat,
+ const std::vector<sal_uInt16>& rIds );
+ virtual ~SwUndoFormatResetAttr() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ private:
+ // format at which a certain attribute is reset.
+ SwFormat * const m_pChangedFormat;
+ // old attribute which has been reset - needed for undo.
+ SfxItemSet m_aSet;
+
+ void BroadcastStyleChange();
+};
+
+class SwUndoDontExpandFormat final : public SwUndo
+{
+ const SwNodeOffset m_nNodeIndex;
+ const sal_Int32 m_nContentIndex;
+
+public:
+ SwUndoDontExpandFormat( const SwPosition& rPos );
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+};
+
+// helper class to receive changed attribute sets
+class SwUndoFormatAttrHelper final : public SwClient
+{
+ SwFormat& m_rFormat;
+ std::unique_ptr<SwUndoFormatAttr> m_pUndo;
+ const bool m_bSaveDrawPt;
+
+public:
+ SwUndoFormatAttrHelper(SwFormat& rFormat, bool bSaveDrawPt = true);
+
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+
+ SwUndoFormatAttr* GetUndo() const { return m_pUndo.get(); }
+ // release the undo object (so it is not deleted here), and return it
+ std::unique_ptr<SwUndoFormatAttr> ReleaseUndo() { return std::move(m_pUndo); }
+};
+
+class SwDocModifyAndUndoGuard final
+{
+ SwDoc* doc;
+ std::unique_ptr<SwUndoFormatAttrHelper> helper;
+
+public:
+ SwDocModifyAndUndoGuard(SwFormat& format);
+ ~SwDocModifyAndUndoGuard();
+};
+
+class SwUndoMoveLeftMargin final : public SwUndo, private SwUndRng
+{
+ const std::unique_ptr<SwHistory> m_pHistory;
+ const bool m_bModulus;
+
+public:
+ SwUndoMoveLeftMargin( const SwPaM&, bool bRight, bool bModulus );
+
+ virtual ~SwUndoMoveLeftMargin() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ SwHistory& GetHistory() { return *m_pHistory; }
+
+};
+
+class SwUndoDefaultAttr final : public SwUndo
+{
+ std::optional<SfxItemSet> m_oOldSet; // the old attributes
+ std::unique_ptr<SvxTabStopItem> m_pTabStop;
+
+public:
+ // registers at the format and saves old attributes
+ SwUndoDefaultAttr( const SfxItemSet& rOldSet, const SwDoc& rDoc );
+
+ virtual ~SwUndoDefaultAttr() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+};
+
+class SwUndoChangeFootNote final : public SwUndo, private SwUndRng
+{
+ const std::unique_ptr<SwHistory> m_pHistory;
+ const OUString m_Text;
+ const bool m_bEndNote;
+
+public:
+ SwUndoChangeFootNote( const SwPaM& rRange, OUString aText,
+ bool bIsEndNote );
+ virtual ~SwUndoChangeFootNote() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ SwHistory& GetHistory() { return *m_pHistory; }
+};
+
+class SwUndoFootNoteInfo final : public SwUndo
+{
+ std::unique_ptr<SwFootnoteInfo> m_pFootNoteInfo;
+
+public:
+ SwUndoFootNoteInfo( const SwFootnoteInfo &rInfo, const SwDoc& rDoc );
+
+ virtual ~SwUndoFootNoteInfo() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+};
+
+class SwUndoEndNoteInfo final : public SwUndo
+{
+ std::unique_ptr<SwEndNoteInfo> m_pEndNoteInfo;
+
+public:
+ SwUndoEndNoteInfo( const SwEndNoteInfo &rInfo, const SwDoc& rDoc );
+
+ virtual ~SwUndoEndNoteInfo() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOATTRIBUTE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoBookmark.hxx b/sw/source/core/inc/UndoBookmark.hxx
new file mode 100644
index 0000000000..368a997571
--- /dev/null
+++ b/sw/source/core/inc/UndoBookmark.hxx
@@ -0,0 +1,157 @@
+/* -*- 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_UNDOBOOKMARK_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDOBOOKMARK_HXX
+
+#include <memory>
+#include <undobj.hxx>
+#include "rolbck.hxx"
+
+class SwHistoryBookmark;
+class SwHistoryNoTextFieldmark;
+class SwHistoryTextFieldmark;
+
+namespace sw::mark
+{
+class IMark;
+class IFieldmark;
+}
+
+class SwDoc;
+
+class SwUndoBookmark : public SwUndo
+{
+ const std::unique_ptr<SwHistoryBookmark> m_pHistoryBookmark;
+
+protected:
+ SwUndoBookmark(SwUndoId nUndoId, const ::sw::mark::IMark&);
+
+ void SetInDoc(SwDoc*);
+ void ResetInDoc(SwDoc&);
+
+public:
+ virtual ~SwUndoBookmark() override;
+
+ /**
+ Returns the rewriter for this undo object.
+
+ The rewriter contains the following rule:
+
+ $1 -> <name of bookmark>
+
+ <name of bookmark> is the name of the bookmark whose
+ insertion/deletion is recorded by this undo object.
+
+ @return the rewriter for this undo object
+ */
+ virtual SwRewriter GetRewriter() const override;
+};
+
+class SwUndoInsBookmark final : public SwUndoBookmark
+{
+public:
+ SwUndoInsBookmark(const ::sw::mark::IMark&);
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+};
+
+class SwUndoDeleteBookmark final : public SwUndoBookmark
+{
+public:
+ SwUndoDeleteBookmark(const ::sw::mark::IMark&);
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+};
+
+class SwUndoRenameBookmark final : public SwUndo
+{
+ const OUString m_sOldName;
+ const OUString m_sNewName;
+
+public:
+ SwUndoRenameBookmark(OUString aOldName, OUString aNewName, const SwDoc& rDoc);
+ virtual ~SwUndoRenameBookmark() override;
+
+private:
+ virtual SwRewriter GetRewriter() const override;
+ static void Rename(::sw::UndoRedoContext const&, const OUString& sFrom, const OUString& sTo);
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+};
+
+/// Handling undo / redo of checkbox and drop-down form field insertion
+class SwUndoInsNoTextFieldmark final : public SwUndo
+{
+private:
+ const std::unique_ptr<SwHistoryNoTextFieldmark> m_pHistoryNoTextFieldmark;
+
+public:
+ SwUndoInsNoTextFieldmark(const ::sw::mark::IFieldmark& rFieldmark);
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+};
+
+/// Handling undo / redo of checkbox and drop-down form field deletion
+class SwUndoDelNoTextFieldmark final : public SwUndo
+{
+private:
+ const std::unique_ptr<SwHistoryNoTextFieldmark> m_pHistoryNoTextFieldmark;
+
+public:
+ SwUndoDelNoTextFieldmark(const ::sw::mark::IFieldmark& rFieldmark);
+ ~SwUndoDelNoTextFieldmark();
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+};
+
+/// Handling undo / redo of text form field insertion
+class SwUndoInsTextFieldmark final : public SwUndo
+{
+private:
+ const std::unique_ptr<SwHistoryTextFieldmark> m_pHistoryTextFieldmark;
+
+public:
+ SwUndoInsTextFieldmark(const ::sw::mark::IFieldmark& rFieldmark);
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+};
+
+/// Handling undo / redo of text form field deletion
+class SwUndoDelTextFieldmark final : public SwUndo
+{
+private:
+ const std::unique_ptr<SwHistoryTextFieldmark> m_pHistoryTextFieldmark;
+
+public:
+ SwUndoDelTextFieldmark(const ::sw::mark::IFieldmark& rFieldmark);
+ ~SwUndoDelTextFieldmark();
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOBOOKMARK_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoCore.hxx b/sw/source/core/inc/UndoCore.hxx
new file mode 100644
index 0000000000..94891df09e
--- /dev/null
+++ b/sw/source/core/inc/UndoCore.hxx
@@ -0,0 +1,297 @@
+/* -*- 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_UNDOCORE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDOCORE_HXX
+
+#include <undobj.hxx>
+#include <calbck.hxx>
+#include <rtl/ustring.hxx>
+#include <redline.hxx>
+#include <numrule.hxx>
+
+#include <memory>
+#include <vector>
+
+class SfxItemSet;
+class SwFormatColl;
+class SwFormatAnchor;
+class SdrMarkList;
+class SwUndoDelete;
+
+namespace sw {
+ class UndoManager;
+ class IShellCursorSupplier;
+}
+
+class SwRedlineSaveData final : public SwUndRng, public SwRedlineData, private SwUndoSaveSection
+{
+public:
+ SwRedlineSaveData(
+ SwComparePosition eCmpPos,
+ const SwPosition& rSttPos,
+ const SwPosition& rEndPos,
+ SwRangeRedline& rRedl,
+ bool bCopyNext );
+
+ ~SwRedlineSaveData();
+
+ void RedlineToDoc( SwPaM const & rPam );
+
+ const SwNodeIndex* GetMvSttIdx() const
+ {
+ return SwUndoSaveSection::GetMvSttIdx();
+ }
+
+#if OSL_DEBUG_LEVEL > 0
+ sal_uInt16 m_nRedlineCount;
+ bool m_bRedlineCountDontCheck;
+ bool m_bRedlineMoved;
+#endif
+};
+
+class SwRedlineSaveDatas {
+private:
+ std::vector<std::unique_ptr<SwRedlineSaveData>> m_Data;
+
+public:
+ SwRedlineSaveDatas() : m_Data() {}
+
+ void clear() { m_Data.clear(); }
+ bool empty() const { return m_Data.empty(); }
+ size_t size() const { return m_Data.size(); }
+ void push_back(std::unique_ptr<SwRedlineSaveData> pNew) { m_Data.push_back(std::move(pNew)); }
+ const SwRedlineSaveData& operator[](size_t const nIdx) const { return *m_Data[ nIdx ]; }
+ SwRedlineSaveData& operator[](size_t const nIdx) { return *m_Data[ nIdx ]; }
+#if OSL_DEBUG_LEVEL > 0
+ void SetRedlineCountDontCheck(bool bCheck) { m_Data[0]->m_bRedlineCountDontCheck=bCheck; }
+#endif
+};
+
+namespace sw {
+class UndoRedoContext final
+ : public SfxUndoContext
+{
+public:
+ UndoRedoContext(SwDoc & rDoc, IShellCursorSupplier & rCursorSupplier)
+ : m_rDoc(rDoc)
+ , m_rCursorSupplier(rCursorSupplier)
+ , m_pSelFormat(nullptr)
+ , m_pMarkList(nullptr)
+ { }
+
+ SwDoc & GetDoc() const { return m_rDoc; }
+
+ IShellCursorSupplier & GetCursorSupplier() { return m_rCursorSupplier; }
+
+ void SetSelections(SwFrameFormat *const pSelFormat, SdrMarkList *const pMarkList)
+ {
+ m_pSelFormat = pSelFormat;
+ m_pMarkList = pMarkList;
+ }
+ void GetSelections(SwFrameFormat *& o_rpSelFormat, SdrMarkList *& o_rpMarkList)
+ {
+ o_rpSelFormat = m_pSelFormat;
+ o_rpMarkList = m_pMarkList;
+ }
+
+ void SetUndoOffset(size_t nUndoOffset) { m_nUndoOffset = nUndoOffset; }
+
+ size_t GetUndoOffset() override { return m_nUndoOffset; }
+
+private:
+ SwDoc & m_rDoc;
+ IShellCursorSupplier & m_rCursorSupplier;
+ SwFrameFormat * m_pSelFormat;
+ SdrMarkList * m_pMarkList;
+ size_t m_nUndoOffset = 0;
+};
+
+class RepeatContext final
+ : public SfxRepeatTarget
+{
+public:
+ RepeatContext(SwDoc & rDoc, SwPaM & rPaM)
+ : m_rDoc(rDoc)
+ , m_pCurrentPaM(& rPaM)
+ , m_bDeleteRepeated(false)
+ { }
+
+ SwDoc & GetDoc() const { return m_rDoc; }
+
+ SwPaM & GetRepeatPaM()
+ {
+ return *m_pCurrentPaM;
+ }
+
+private:
+ friend class ::sw::UndoManager;
+ friend class ::SwUndoDelete;
+
+ SwDoc & m_rDoc;
+ SwPaM * m_pCurrentPaM;
+ bool m_bDeleteRepeated; /// has a delete action been repeated?
+};
+
+} // namespace sw
+
+class SwUndoFormatColl final : public SwUndo, private SwUndRng
+{
+ OUString maFormatName;
+ std::unique_ptr<SwHistory> mpHistory;
+ // for correct <ReDo(..)> and <Repeat(..)>
+ // boolean, which indicates that the attributes are reset at the nodes
+ // before the format has been applied.
+ const bool mbReset;
+ // boolean, which indicates that the list attributes had been reset at
+ // the nodes before the format has been applied.
+ const bool mbResetListAttrs;
+
+ void DoSetFormatColl(SwDoc & rDoc, SwPaM const & rPaM);
+
+public:
+ SwUndoFormatColl( const SwPaM&, const SwFormatColl*,
+ const bool bReset,
+ const bool bResetListAttrs );
+ virtual ~SwUndoFormatColl() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ /**
+ Returns the rewriter for this undo object.
+
+ The rewriter contains one rule:
+
+ $1 -> <name of format collection>
+
+ <name of format collection> is the name of the format
+ collection that is applied by the action recorded by this undo
+ object.
+
+ @return the rewriter for this undo object
+ */
+ virtual SwRewriter GetRewriter() const override;
+
+ SwHistory* GetHistory() { return mpHistory.get(); }
+
+};
+
+class SwUndoSetFlyFormat final : public SwUndo, public SwClient
+{
+ SwFrameFormat* m_pFrameFormat; // saved FlyFormat
+ const OUString m_DerivedFromFormatName;
+ const OUString m_NewFormatName;
+ std::optional<SfxItemSet> m_oItemSet; // the re-/ set attributes
+ SwNodeOffset m_nOldNode, m_nNewNode;
+ sal_Int32 m_nOldContent, m_nNewContent;
+ RndStdIds m_nOldAnchorType, m_nNewAnchorType;
+ bool m_bAnchorChanged;
+
+ void PutAttr( sal_uInt16 nWhich, const SfxPoolItem* pItem );
+ void SwClientNotify(const SwModify&, const SfxHint&) override;
+ void GetAnchor( SwFormatAnchor& rAnhor, SwNodeOffset nNode, sal_Int32 nContent );
+
+public:
+ SwUndoSetFlyFormat( SwFrameFormat& rFlyFormat, const SwFrameFormat& rNewFrameFormat );
+ virtual ~SwUndoSetFlyFormat() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+};
+
+class SwUndoOutlineLeftRight final : public SwUndo, private SwUndRng
+{
+ short m_nOffset;
+
+public:
+ SwUndoOutlineLeftRight( const SwPaM& rPam, short nOffset );
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+};
+
+class SwUndoOutlineEdit final : public SwUndo, private SwUndRng
+{
+ SwNumRule m_aNewNumRule;
+ SwNumRule m_aOldNumRule;
+
+public:
+ SwUndoOutlineEdit(const SwNumRule& rOldRule, const SwNumRule& rNewRule, const SwDoc& rDoc);
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+ virtual void RepeatImpl(::sw::RepeatContext&) override;
+};
+
+const int nUndoStringLength = 20;
+
+/**
+ Shortens a string to a maximum length.
+
+ @param rStr the string to be shortened
+ @param nLength the maximum length for rStr
+ @param aFillStr string to replace cut out characters with
+
+ If rStr has less than nLength characters it will be returned unaltered.
+
+ If rStr has more than nLength characters the following algorithm
+ generates the shortened string:
+
+ frontLength = (nLength - length(aFillStr)) / 2
+ rearLength = nLength - length(aFillStr) - frontLength
+ shortenedString = concat(<first frontLength characters of rStr,
+ aFillStr,
+ <last rearLength characters of rStr>)
+
+ Preconditions:
+ - nLength - length(aFillStr) >= 2
+
+ @return the shortened string
+ */
+OUString
+ShortenString(const OUString & rStr, sal_Int32 nLength, std::u16string_view aFillStr);
+/**
+ Denotes special characters in a string.
+
+ The rStr is split into parts containing special characters and
+ parts not containing special characters. In a part containing
+ special characters all characters are equal. These parts are
+ maximal.
+
+ @param aStr the string to denote in
+ @param bQuoted add quotation marks to the text
+
+ The resulting string is generated by concatenating the found
+ parts. The parts without special characters are surrounded by
+ "'". The parts containing special characters are denoted as "n x",
+ where n is the length of the part and x is the representation of
+ the special character (i. e. "tab(s)").
+
+ @return the denoted string
+*/
+OUString DenoteSpecialCharacters(std::u16string_view aStr, bool bQuoted = true);
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOCORE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoDelete.hxx b/sw/source/core/inc/UndoDelete.hxx
new file mode 100644
index 0000000000..70e91367cb
--- /dev/null
+++ b/sw/source/core/inc/UndoDelete.hxx
@@ -0,0 +1,112 @@
+/* -*- 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_UNDODELETE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDODELETE_HXX
+
+#include <undobj.hxx>
+#include <ndindex.hxx>
+#include <rtl/ustring.hxx>
+#include <memory>
+#include <optional>
+
+class SwRedlineSaveDatas;
+class SwTextNode;
+typedef struct _xmlTextWriter* xmlTextWriterPtr;
+enum class SwDeleteFlags;
+
+namespace sfx2 {
+ class MetadatableUndo;
+}
+
+class SwUndoDelete final
+ : public SwUndo
+ , private SwUndRng
+ , private SwUndoSaveContent
+{
+ std::optional<SwNodeIndex> m_oMvStt; // Position of Nodes in UndoNodes-Array
+ std::optional<OUString> m_aSttStr, m_aEndStr;
+ std::unique_ptr<SwRedlineSaveDatas> m_pRedlSaveData;
+ std::shared_ptr< ::sfx2::MetadatableUndo > m_pMetadataUndoStart;
+ std::shared_ptr< ::sfx2::MetadatableUndo > m_pMetadataUndoEnd;
+
+ OUString m_sTableName;
+
+ SwNodeOffset m_nNode;
+ SwNodeOffset m_nNdDiff; // difference of Nodes before/after Delete
+ SwNodeOffset m_nSectDiff; // diff. of Nodes before/after Move w/ SectionNodes
+ SwNodeOffset m_nReplaceDummy; // diff. to a temporary dummy object
+ sal_uInt16 m_nSetPos;
+
+ bool m_bGroup : 1; // TRUE: is already Grouped; see CanGrouping()
+ bool m_bBackSp : 1; // TRUE: if Grouped and preceding content deleted
+ bool m_bJoinNext: 1; // TRUE: if range is selected forwards
+ bool m_bTableDelLastNd : 1; // TRUE: TextNode following Table inserted/deleted
+ bool m_bDelFullPara : 1; // TRUE: entire Nodes were deleted
+ bool m_bResetPgDesc : 1; // TRUE: reset PgDsc on following node
+ bool m_bResetPgBrk : 1; // TRUE: reset PgBreak on following node
+ bool m_bFromTableCopy : 1; // TRUE: called by SwUndoTableCpyTable
+ SwDeleteFlags m_DeleteFlags;
+
+ bool SaveContent( const SwPosition* pStt, const SwPosition* pEnd,
+ SwTextNode* pSttTextNd, SwTextNode* pEndTextNd );
+
+public:
+ SwUndoDelete(
+ SwPaM&,
+ SwDeleteFlags flags,
+ bool bFullPara = false,
+ bool bCalledByTableCpy = false );
+ virtual ~SwUndoDelete() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+ /**
+ Returns rewriter for this undo object.
+
+ The rewriter consists of the following rule:
+
+ $1 -> '<deleted text>'
+
+ <deleted text> is shortened to nUndoStringLength characters.
+
+ @return rewriter for this undo object
+ */
+ virtual SwRewriter GetRewriter() const override;
+
+ bool CanGrouping( SwDoc&, const SwPaM& );
+
+ void SetTableDelLastNd() { m_bTableDelLastNd = true; }
+
+ // for PageDesc/PageBreak Attributes of a table
+ void SetPgBrkFlags( bool bPageBreak, bool bPageDesc )
+ { m_bResetPgDesc = bPageDesc; m_bResetPgBrk = bPageBreak; }
+
+ void SetTableName(const OUString & rName);
+
+ // SwUndoTableCpyTable needs this information:
+ bool IsDelFullPara() const { return m_bDelFullPara; }
+
+ void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDODELETE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoDraw.hxx b/sw/source/core/inc/UndoDraw.hxx
new file mode 100644
index 0000000000..951902817b
--- /dev/null
+++ b/sw/source/core/inc/UndoDraw.hxx
@@ -0,0 +1,134 @@
+/* -*- 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_UNDODRAW_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDODRAW_HXX
+
+#include <undobj.hxx>
+#include <memory>
+
+struct SwUndoGroupObjImpl;
+class SdrMark;
+class SdrMarkList;
+class SdrObject;
+class SdrObjGroup;
+class SdrUndoAction;
+class SwDrawFrameFormat;
+class SwDoc;
+
+// Undo for Draw Objects
+class SwSdrUndo final : public SwUndo
+{
+ std::unique_ptr<SdrUndoAction> m_pSdrUndo;
+ std::unique_ptr<SdrMarkList> m_pMarkList; // MarkList for all selected SdrObjects
+
+public:
+ SwSdrUndo(std::unique_ptr<SdrUndoAction>, const SdrMarkList* pMarkList, const SwDoc& rDoc);
+
+ virtual ~SwSdrUndo() override;
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+
+ virtual OUString GetComment() const override;
+};
+
+class SwUndoDrawGroup final : public SwUndo
+{
+ std::unique_ptr<SwUndoGroupObjImpl[]> m_pObjArray;
+ sal_uInt16 m_nSize;
+ bool m_bDeleteFormat;
+
+public:
+ SwUndoDrawGroup(sal_uInt16 nCnt, const SwDoc& rDoc);
+
+ virtual ~SwUndoDrawGroup() override;
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+
+ void AddObj(sal_uInt16 nPos, SwDrawFrameFormat*, SdrObject*);
+ void SetGroupFormat(SwDrawFrameFormat*);
+};
+
+// Action "ungroup drawing object" is now split into three parts - see
+// method <SwDoc::UnGroupSelection(..)>:
+// - creation for <SwDrawFrameFormat> instances for the group members of the
+// selected group objects
+// - intrinsic ungroup of the selected group objects
+// - creation of <SwDrawContact> instances for the former group members and
+// connection to the Writer layout.
+// Thus, two undo actions (instances of <SwUndo>) are needed:
+// - Existing class <SwUndoDrawUnGroup> takes over the part for the formats.
+// - New class <SwUndoDrawUnGroupConnectToLayout> takes over the part for
+// contact object.
+class SwUndoDrawUnGroup final : public SwUndo
+{
+ std::unique_ptr<SwUndoGroupObjImpl[]> m_pObjArray;
+ sal_uInt16 m_nSize;
+ bool m_bDeleteFormat;
+
+public:
+ SwUndoDrawUnGroup(SdrObjGroup*, const SwDoc& rDoc);
+
+ virtual ~SwUndoDrawUnGroup() override;
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+
+ void AddObj(sal_uInt16 nPos, SwDrawFrameFormat*);
+};
+
+class SwUndoDrawUnGroupConnectToLayout final : public SwUndo
+{
+private:
+ std::vector<std::pair<SwDrawFrameFormat*, SdrObject*>> m_aDrawFormatsAndObjs;
+
+public:
+ SwUndoDrawUnGroupConnectToLayout(const SwDoc& rDoc);
+
+ virtual ~SwUndoDrawUnGroupConnectToLayout() override;
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+
+ void AddFormatAndObj(SwDrawFrameFormat* pDrawFrameFormat, SdrObject* pDrawObject);
+};
+
+class SwUndoDrawDelete final : public SwUndo
+{
+ std::unique_ptr<SwUndoGroupObjImpl[]> m_pObjArray;
+ std::unique_ptr<SdrMarkList> m_pMarkList; // MarkList for all selected SdrObjects
+ bool m_bDeleteFormat;
+
+public:
+ SwUndoDrawDelete(sal_uInt16 nCnt, const SwDoc& rDoc);
+
+ virtual ~SwUndoDrawDelete() override;
+
+ virtual void UndoImpl(::sw::UndoRedoContext&) override;
+ virtual void RedoImpl(::sw::UndoRedoContext&) override;
+
+ void AddObj(SwDrawFrameFormat*, const SdrMark&);
+ void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDODRAW_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoInsert.hxx b/sw/source/core/inc/UndoInsert.hxx
new file mode 100644
index 0000000000..348cc57af0
--- /dev/null
+++ b/sw/source/core/inc/UndoInsert.hxx
@@ -0,0 +1,228 @@
+/* -*- 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_UNDOINSERT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDOINSERT_HXX
+
+#include <memory>
+
+#include <undobj.hxx>
+#include <svx/svdtypes.hxx>
+#include <rtl/ustring.hxx>
+#include <vcl/graph.hxx>
+#include <swtypes.hxx>
+#include <ndindex.hxx>
+#include <IDocumentContentOperations.hxx>
+#include <optional>
+
+class SwGrfNode;
+class SwUndoDelete;
+class SwUndoFormatAttr;
+class SwDoc;
+namespace sw { class DocumentContentOperationsManager; }
+enum class MirrorGraph;
+
+/// Typing one or more characters to a single paragraph.
+class SwUndoInsert final : public SwUndo, private SwUndoSaveContent
+{
+ /// start of Content in UndoNodes for Redo
+ std::optional<SwNodeIndex> m_oUndoNodeIndex;
+ std::optional<OUString> maText;
+ std::optional<OUString> maUndoText;
+ std::unique_ptr<SwRedlineData> m_pRedlData;
+ SwNodeOffset m_nNode;
+ sal_Int32 m_nContent, m_nLen;
+ bool m_bIsWordDelim : 1;
+ bool m_bIsAppend : 1;
+ bool m_bWithRsid : 1;
+
+ const SwInsertFlags m_nInsertFlags;
+
+ friend class ::sw::DocumentContentOperationsManager; // actually only DocumentContentOperationsManager::InsertString, because it uses CanGrouping
+ bool CanGrouping( sal_Unicode cIns );
+ bool CanGrouping( const SwPosition& rPos );
+
+ SwDoc * m_pDoc;
+
+ void Init(const SwNode & rNode);
+ std::optional<OUString> GetTextFromDoc() const;
+
+public:
+ SwUndoInsert( const SwNode& rNode, sal_Int32 nContent, sal_Int32 nLen,
+ const SwInsertFlags nInsertFlags,
+ bool bWDelim = true );
+ SwUndoInsert( const SwNode& rNode );
+ virtual ~SwUndoInsert() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ /**
+ Returns rewriter for this undo object.
+
+ The returned rewriter has the following rule:
+
+ $1 -> '<inserted text>'
+
+ <inserted text> is shortened to a length of nUndoStringLength.
+
+ @return rewriter for this undo object
+ */
+ virtual SwRewriter GetRewriter() const override;
+
+ void SetWithRsid() { m_bWithRsid = true; }
+
+ bool IsIndependent(const SwUndoInsert& rOther) const;
+};
+
+SwRewriter
+MakeUndoReplaceRewriter(sal_uLong const occurrences,
+ OUString const& sOld, OUString const& sNew);
+
+class SwUndoReplace final
+ : public SwUndo
+{
+public:
+ SwUndoReplace(SwPaM const& rPam,
+ OUString const& rInsert, bool const bRegExp);
+
+ virtual ~SwUndoReplace() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ /**
+ Returns the rewriter of this undo object.
+
+ If this undo object represents several replacements the
+ rewriter contains the following rules:
+
+ $1 -> <number of replacements>
+ $2 -> occurrences of
+ $3 -> <replaced text>
+
+ If this undo object represents one replacement the rewriter
+ contains these rules:
+
+ $1 -> <replaced text>
+ $2 -> "->" (STR_YIELDS)
+ $3 -> <replacing text>
+
+ @return the rewriter of this undo object
+ */
+ virtual SwRewriter GetRewriter() const override;
+
+ void SetEnd( const SwPaM& rPam );
+
+private:
+ class Impl;
+ std::unique_ptr<Impl> m_pImpl;
+};
+
+/// Handles the undo/redo of the 'Replace...' context menu item for an image.
+class SwUndoReRead final : public SwUndo
+{
+ std::optional<Graphic> moGraphic;
+ std::optional<OUString> maNm;
+ std::optional<OUString> maFltr;
+ SwNodeOffset mnPosition;
+ MirrorGraph mnMirror;
+
+ void SaveGraphicData( const SwGrfNode& );
+ void SetAndSave( ::sw::UndoRedoContext & );
+
+public:
+ SwUndoReRead( const SwPaM& rPam, const SwGrfNode& pGrfNd );
+
+ virtual ~SwUndoReRead() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+};
+
+class SwUndoInsertLabel final : public SwUndo
+{
+ union {
+ struct {
+ // for NoTextFrames
+ SwUndoInsLayFormat* pUndoFly;
+ SwUndoFormatAttr* pUndoAttr;
+ } OBJECT;
+ struct {
+ // for tables or TextFrames
+ SwUndoDelete* pUndoInsNd;
+ SwNodeOffset nNode;
+ } NODE;
+ };
+
+ OUString m_sText;
+ // #i39983# the separator is drawn with a character style
+ OUString m_sSeparator;
+ OUString m_sNumberSeparator;
+ OUString m_sCharacterStyle;
+ // #i26791# - re-store of drawing object position no longer needed
+ sal_uInt16 m_nFieldId;
+ SwLabelType m_eType;
+ SdrLayerID m_nLayerId; // for character objects
+ bool m_bBefore :1;
+ bool m_bUndoKeep :1;
+ bool m_bCopyBorder :1;
+
+public:
+ SwUndoInsertLabel( const SwLabelType eTyp, OUString rText,
+ // #i39983# the separator is drawn with a character style
+ OUString aSeparator,
+ OUString aNumberSeparator, //#i61007# order of captions
+ const bool bBefore, const sal_uInt16 nId,
+ OUString aCharacterStyle,
+ const bool bCpyBrd,
+ const SwDoc* pDoc );
+ virtual ~SwUndoInsertLabel() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ /**
+ Returns the rewriter of this undo object.
+
+ The rewriter contains this rule:
+
+ $1 -> '<text of inserted label>'
+
+ <text of inserted label> is shortened to nUndoStringLength
+ characters.
+
+ @return the rewriter of this undo object
+ */
+ virtual SwRewriter GetRewriter() const override;
+ static SwRewriter CreateRewriter(const OUString &rStr);
+
+ void SetNodePos( SwNodeOffset nNd )
+ { if( SwLabelType::Object != m_eType ) NODE.nNode = nNd; }
+
+ void SetUndoKeep() { m_bUndoKeep = true; }
+ void SetFlys( SwFrameFormat& rOldFly, SfxItemSet const & rChgSet, SwFrameFormat& rNewFly );
+ void SetDrawObj( SdrLayerID nLayerId );
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOINSERT_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoManager.hxx b/sw/source/core/inc/UndoManager.hxx
new file mode 100644
index 0000000000..3376393573
--- /dev/null
+++ b/sw/source/core/inc/UndoManager.hxx
@@ -0,0 +1,143 @@
+/* -*- 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_UNDOMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDOMANAGER_HXX
+
+#include <IDocumentUndoRedo.hxx>
+#include <svx/sdrundomanager.hxx>
+#include <ndarr.hxx>
+#include <memory>
+
+class IDocumentDrawModelAccess;
+class IDocumentRedlineAccess;
+class IDocumentState;
+class SwDocShell;
+class SwView;
+
+namespace sw {
+
+/**
+ * Stores the undo/redo information, implementing the IDocumentUndoRedo interface.
+ * It contains a stack of SwUndo actions, each of which represents one user-visible
+ * undo / redo step.
+ */
+class SW_DLLPUBLIC UndoManager final
+ : public IDocumentUndoRedo
+ , public SdrUndoManager
+{
+public:
+ UndoManager(std::shared_ptr<SwNodes> pUndoNodes,
+ IDocumentDrawModelAccess & rDrawModelAccess,
+ IDocumentRedlineAccess & rRedlineAccess,
+ IDocumentState & rState);
+
+ /** IDocumentUndoRedo */
+ virtual void DoUndo(bool const bDoUndo) override;
+ virtual bool DoesUndo() const override;
+ virtual void DoGroupUndo(bool const bDoUndo) override;
+ virtual bool DoesGroupUndo() const override;
+ virtual void DoDrawUndo(bool const bDoUndo) override;
+ virtual bool DoesDrawUndo() const override;
+ void DoRepair(bool bRepair) override;
+ bool DoesRepair() const override;
+ virtual void SetUndoNoModifiedPosition() override;
+ virtual void LockUndoNoModifiedPosition() override;
+ virtual void UnLockUndoNoModifiedPosition() override;
+ virtual void SetUndoNoResetModified() override;
+ virtual bool IsUndoNoResetModified() const override;
+
+ virtual SwUndoId StartUndo(SwUndoId const eUndoId,
+ SwRewriter const*const pRewriter) override;
+ virtual SwUndoId EndUndo(SwUndoId const eUndoId,
+ SwRewriter const*const pRewriter) override;
+ virtual void DelAllUndoObj() override;
+ virtual bool GetLastUndoInfo(OUString *const o_pStr,
+ SwUndoId *const o_pId,
+ const SwView* pView = nullptr) const override;
+ virtual SwUndoComments_t GetUndoComments() const override;
+ virtual bool GetFirstRedoInfo(OUString *const o_pStr,
+ SwUndoId *const o_pId,
+ const SwView* pView = nullptr) const override;
+ virtual SwUndoComments_t GetRedoComments() const override;
+ virtual bool Repeat(::sw::RepeatContext & rContext,
+ sal_uInt16 const nRepeatCnt) override;
+ virtual SwUndoId GetRepeatInfo(OUString *const o_pStr) const override;
+ virtual void AppendUndo(std::unique_ptr<SwUndo> pUndo) override;
+ virtual void ClearRedo() override;
+ virtual bool IsUndoNodes(SwNodes const& rNodes) const override;
+ virtual size_t GetUndoActionCount(const bool bCurrentLevel = true) const override;
+ size_t GetRedoActionCount(const bool bCurrentLevel = true) const override;
+ void SetView(SwView* pView) override;
+ bool UndoWithOffset(size_t nUndoOffset) override;
+
+ // SfxUndoManager
+ virtual void AddUndoAction(std::unique_ptr<SfxUndoAction> pAction,
+ bool bTryMerg = false) override;
+ virtual bool Undo() override;
+ virtual bool Redo() override;
+ void dumpAsXml(xmlTextWriterPtr pWriter) const;
+
+ SwUndo * RemoveLastUndo();
+ SwUndo * GetLastUndo();
+
+ SwNodes const& GetUndoNodes() const;
+ SwNodes & GetUndoNodes();
+ void SetDocShell(SwDocShell* pDocShell);
+
+ /**
+ * Checks if the topmost undo action owned by pView is independent from the topmost action undo
+ * action. Sets rOffset to the offset of that independent undo action on success.
+ */
+ bool IsViewUndoActionIndependent(const SwView* pView, sal_uInt16& rOffset) const;
+
+private:
+ virtual void EmptyActionsChanged() override;
+
+ IDocumentDrawModelAccess & m_rDrawModelAccess;
+ IDocumentRedlineAccess & m_rRedlineAccess;
+ IDocumentState & m_rState;
+
+ /// Undo nodes array: content not currently in document, but required for undo/redo.
+ std::shared_ptr<SwNodes> m_xUndoNodes;
+
+ bool m_bGroupUndo : 1; // TRUE: Undo grouping enabled
+ bool m_bDrawUndo : 1; // TRUE: Draw Undo enabled
+ /// If true, then repair mode is enabled.
+ bool m_bRepair;
+ bool m_bLockUndoNoModifiedPosition : 1;
+ /// set the IgnoreRepeat flag on every added action
+ bool m_isAddWithIgnoreRepeat;
+ /// position in Undo-Array at which Doc was saved (and is not modified)
+ UndoStackMark m_UndoSaveMark;
+ SwDocShell* m_pDocShell;
+ SwView* m_pView;
+
+ enum class UndoOrRedoType { Undo, Redo };
+ bool impl_DoUndoRedo(UndoOrRedoType undoOrRedo, size_t nUndoOffset);
+
+ // UGLY: should not be called
+ using SdrUndoManager::Repeat;
+};
+
+} // namespace sw
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOMANAGER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoNumbering.hxx b/sw/source/core/inc/UndoNumbering.hxx
new file mode 100644
index 0000000000..660c14d2bd
--- /dev/null
+++ b/sw/source/core/inc/UndoNumbering.hxx
@@ -0,0 +1,142 @@
+/* -*- 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_UNDONUMBERING_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDONUMBERING_HXX
+
+#include <memory>
+#include <vector>
+#include <undobj.hxx>
+#include <rtl/ustring.hxx>
+#include <numrule.hxx>
+
+class SwUndoInsNum final : public SwUndo, private SwUndRng
+{
+ SwNumRule m_aNumRule;
+ std::unique_ptr<SwHistory> m_pHistory;
+ std::unique_ptr<SwNumRule> m_pOldNumRule;
+ OUString m_sReplaceRule;
+ sal_uInt16 m_nLRSavePos;
+
+public:
+ SwUndoInsNum( const SwPaM& rPam, const SwNumRule& rRule );
+ SwUndoInsNum( const SwNumRule& rOldRule, const SwNumRule& rNewRule,
+ const SwDoc& rDoc, SwUndoId nUndoId = SwUndoId::INSFMTATTR );
+ SwUndoInsNum( const SwPosition& rPos, const SwNumRule& rRule,
+ OUString aReplaceRule );
+
+ virtual ~SwUndoInsNum() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+
+ SwHistory* GetHistory(); // will be created if necessary
+ void SaveOldNumRule( const SwNumRule& rOld );
+
+ void SetLRSpaceEndPos();
+
+};
+
+class SwUndoDelNum final : public SwUndo, private SwUndRng
+{
+ struct NodeLevel
+ {
+ SwNodeOffset index;
+ int level;
+ NodeLevel(SwNodeOffset idx, int lvl) : index(idx), level(lvl) {};
+ };
+ std::vector<NodeLevel> m_aNodes;
+ std::unique_ptr<SwHistory> m_pHistory;
+
+public:
+ SwUndoDelNum( const SwPaM& rPam );
+
+ virtual ~SwUndoDelNum() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ void AddNode( const SwTextNode& rNd );
+ SwHistory* GetHistory() { return m_pHistory.get(); }
+};
+
+class SwUndoMoveNum final : public SwUndo, private SwUndRng
+{
+ SwNodeOffset m_nNewStart;
+ SwNodeOffset m_nOffset;
+
+public:
+ SwUndoMoveNum( const SwPaM& rPam, SwNodeOffset nOffset, bool bIsOutlMv );
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ void SetStartNode( SwNodeOffset nValue ) { m_nNewStart = nValue; }
+};
+
+class SwUndoNumUpDown final : public SwUndo, private SwUndRng
+{
+ short m_nOffset;
+
+public:
+ SwUndoNumUpDown( const SwPaM& rPam, short nOffset );
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+};
+
+class SwUndoNumOrNoNum final : public SwUndo
+{
+ SwNodeOffset m_nIndex;
+ bool mbNewNum, mbOldNum;
+
+public:
+ SwUndoNumOrNoNum( const SwNode& rIdx, bool mbOldNum,
+ bool mbNewNum );
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+};
+
+class SwUndoNumRuleStart final : public SwUndo
+{
+ SwNodeOffset m_nIndex;
+ sal_uInt16 m_nOldStart, m_nNewStart;
+ bool m_bSetStartValue : 1;
+ bool m_bFlag : 1;
+
+public:
+ SwUndoNumRuleStart( const SwPosition& rPos, bool bDelete );
+ SwUndoNumRuleStart( const SwPosition& rPos, sal_uInt16 nStt );
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDONUMBERING_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoOverwrite.hxx b/sw/source/core/inc/UndoOverwrite.hxx
new file mode 100644
index 0000000000..ddbf23262d
--- /dev/null
+++ b/sw/source/core/inc/UndoOverwrite.hxx
@@ -0,0 +1,93 @@
+/* -*- 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_UNDOOVERWRITE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDOOVERWRITE_HXX
+
+#include <memory>
+#include <rtl/ustring.hxx>
+#include <undobj.hxx>
+
+class SwRedlineSaveDatas;
+class SwTextNode;
+enum class TransliterationFlags;
+namespace utl {
+ class TransliterationWrapper;
+}
+
+class SwUndoOverwrite final : public SwUndo, private SwUndoSaveContent
+{
+ OUString m_aDelStr, m_aInsStr;
+ std::unique_ptr<SwRedlineSaveDatas> m_pRedlSaveData;
+ SwNodeOffset m_nStartNode;
+ sal_Int32 m_nStartContent;
+ bool m_bInsChar : 1; // no Overwrite, but Insert
+ bool m_bGroup : 1; // TRUE: is already grouped; evaluated in CanGrouping()
+
+public:
+ SwUndoOverwrite( SwDoc&, SwPosition&, sal_Unicode cIns );
+
+ virtual ~SwUndoOverwrite() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ /**
+ Returns the rewriter of this undo object.
+
+ The rewriter contains the following rule:
+
+ $1 -> '<overwritten text>'
+
+ <overwritten text> is shortened to nUndoStringLength characters.
+
+ @return the rewriter of this undo object
+ */
+ virtual SwRewriter GetRewriter() const override;
+
+ bool CanGrouping( SwDoc&, SwPosition&, sal_Unicode cIns );
+};
+
+struct UndoTransliterate_Data;
+class SwUndoTransliterate final : public SwUndo, public SwUndRng
+{
+ std::vector< std::unique_ptr<UndoTransliterate_Data> > m_aChanges;
+ TransliterationFlags m_nType;
+
+ void DoTransliterate(SwDoc & rDoc, SwPaM const & rPam);
+
+public:
+ SwUndoTransliterate( const SwPaM& rPam,
+ const utl::TransliterationWrapper& rTrans );
+
+ virtual ~SwUndoTransliterate() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ void AddChanges( SwTextNode& rTNd, sal_Int32 nStart, sal_Int32 nLen,
+ css::uno::Sequence <sal_Int32> const & rOffsets );
+ bool HasData() const { return m_aChanges.size() > 0; }
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOOVERWRITE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoRedline.hxx b/sw/source/core/inc/UndoRedline.hxx
new file mode 100644
index 0000000000..127aeae0aa
--- /dev/null
+++ b/sw/source/core/inc/UndoRedline.hxx
@@ -0,0 +1,148 @@
+/* -*- 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_UNDOREDLINE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDOREDLINE_HXX
+
+#include <memory>
+#include <undobj.hxx>
+#include <IDocumentContentOperations.hxx>
+
+struct SwSortOptions;
+class SwRangeRedline;
+class SwRedlineSaveDatas;
+class SwUndoDelete;
+
+class SwUndoRedline : public SwUndo, public SwUndRng
+{
+protected:
+ std::unique_ptr<SwRedlineData> mpRedlData;
+ std::unique_ptr<SwRedlineSaveDatas> mpRedlSaveData;
+ SwUndoId mnUserId;
+ bool mbHiddenRedlines;
+ sal_Int8 mnDepth; // index of the SwRedlineData in SwRangeRedline
+
+ virtual void UndoRedlineImpl(SwDoc & rDoc, SwPaM & rPam);
+ virtual void RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam);
+
+public:
+ SwUndoRedline( SwUndoId nUserId, const SwPaM& rRange, sal_Int8 nDepth = 0 );
+
+ virtual ~SwUndoRedline() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ sal_uInt16 GetRedlSaveCount() const;
+#if OSL_DEBUG_LEVEL > 0
+ void SetRedlineCountDontCheck(bool bCheck);
+#endif
+};
+
+class SwUndoRedlineDelete final : public SwUndoRedline
+{
+private:
+ std::unique_ptr<SwHistory> m_pHistory; ///< for moved fly anchors
+
+ bool m_bCanGroup : 1;
+ bool m_bIsDelim : 1;
+ bool m_bIsBackspace : 1;
+
+ OUString m_sRedlineText;
+
+ void InitHistory(SwPaM const& rRange);
+
+ virtual void UndoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) override;
+ virtual void RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) override;
+
+public:
+ SwUndoRedlineDelete(const SwPaM& rRange, SwUndoId nUserId, SwDeleteFlags flags = SwDeleteFlags::Default);
+ virtual SwRewriter GetRewriter() const override;
+
+ bool CanGrouping( const SwUndoRedlineDelete& rPrev );
+
+ // SwUndoTableCpyTable needs this information:
+ SwNodeOffset NodeDiff() const { return m_nSttNode - m_nEndNode; }
+ sal_Int32 ContentStart() const { return m_nSttContent; }
+
+ void SetRedlineText(const OUString & rText);
+};
+
+class SwUndoRedlineSort final : public SwUndoRedline
+{
+ std::unique_ptr<SwSortOptions> m_pOpt;
+ SwNodeOffset m_nSaveEndNode;
+ sal_Int32 m_nSaveEndContent;
+
+ virtual void UndoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) override;
+ virtual void RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) override;
+
+public:
+ SwUndoRedlineSort( const SwPaM& rRange, const SwSortOptions& rOpt );
+
+ virtual ~SwUndoRedlineSort() override;
+
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ void SetSaveRange( const SwPaM& rRange );
+};
+
+/// Undo for Edit -> track changes -> accept.
+class SwUndoAcceptRedline final : public SwUndoRedline
+{
+private:
+ virtual void RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) override;
+
+public:
+ SwUndoAcceptRedline( const SwPaM& rRange, sal_Int8 nDepth = 0 );
+
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+};
+
+class SwUndoRejectRedline final : public SwUndoRedline
+{
+private:
+ virtual void RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) override;
+
+public:
+ SwUndoRejectRedline( const SwPaM& rRange, sal_Int8 nDepth = 0 );
+
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+};
+
+class SwUndoCompDoc final : public SwUndo, public SwUndRng
+{
+ std::unique_ptr<SwRedlineData> m_pRedlineData;
+ std::unique_ptr<SwUndoDelete> m_pUndoDelete, m_pUndoDelete2;
+ std::unique_ptr<SwRedlineSaveDatas> m_pRedlineSaveDatas;
+ bool m_bInsert;
+
+public:
+ SwUndoCompDoc( const SwPaM& rRg, bool bIns );
+ SwUndoCompDoc( const SwRangeRedline& rRedl );
+
+ virtual ~SwUndoCompDoc() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOREDLINE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoSection.hxx b/sw/source/core/inc/UndoSection.hxx
new file mode 100644
index 0000000000..5be018a2e1
--- /dev/null
+++ b/sw/source/core/inc/UndoSection.hxx
@@ -0,0 +1,101 @@
+/* -*- 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_UNDOSECTION_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDOSECTION_HXX
+
+#include <o3tl/deleter.hxx>
+#include <undobj.hxx>
+#include <tuple>
+#include <memory>
+#include <optional>
+
+class SfxItemSet;
+class SwTextNode;
+class SwSectionData;
+class SwSectionFormat;
+class SwTOXBase;
+
+namespace sw {
+ enum class RedlineMode;
+ enum class FieldmarkMode;
+ enum class ParagraphBreakMode;
+};
+
+class SwUndoInsSection final : public SwUndo, private SwUndRng
+{
+private:
+ const std::unique_ptr<SwSectionData> m_pSectionData;
+ std::optional<std::tuple<std::unique_ptr<SwTOXBase>, sw::RedlineMode, sw::FieldmarkMode, sw::ParagraphBreakMode>> m_xTOXBase; /// set iff section is TOX
+ const std::unique_ptr<SfxItemSet> m_pAttrSet;
+ std::unique_ptr<SwHistory> m_pHistory;
+ std::unique_ptr<SwRedlineData> m_pRedlData;
+ std::unique_ptr<SwRedlineSaveDatas> m_pRedlineSaveData;
+ SwNodeOffset m_nSectionNodePos;
+ bool m_bSplitAtStart : 1;
+ bool m_bSplitAtEnd : 1;
+ bool m_bUpdateFootnote : 1;
+
+ void Join( SwDoc& rDoc, SwNodeOffset nNode );
+
+public:
+ SwUndoInsSection(SwPaM const&, SwSectionData const&,
+ SfxItemSet const* pSet,
+ std::tuple<SwTOXBase const*, sw::RedlineMode, sw::FieldmarkMode, sw::ParagraphBreakMode> const* pTOXBase);
+
+ virtual ~SwUndoInsSection() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ void SetSectNdPos(SwNodeOffset const nPos) { m_nSectionNodePos = nPos; }
+ void SaveSplitNode(SwTextNode *const pTextNd, bool const bAtStart);
+ void SetUpdateFootnoteFlag(bool const bFlag) { m_bUpdateFootnote = bFlag; }
+};
+
+std::unique_ptr<SwUndo> MakeUndoDelSection(SwSectionFormat const&);
+
+std::unique_ptr<SwUndo> MakeUndoUpdateSection(SwSectionFormat const&, bool const);
+
+
+class SwTOXBaseSection;
+class SwUndoDelSection;
+
+class SwUndoUpdateIndex final : public SwUndo
+{
+private:
+ std::unique_ptr<SwUndoDelSection> m_pTitleSectionUpdated;
+ std::unique_ptr<SwUndoSaveSection, o3tl::default_delete<SwUndoSaveSection>> const m_pSaveSectionOriginal;
+ std::unique_ptr<SwUndoSaveSection, o3tl::default_delete<SwUndoSaveSection>> const m_pSaveSectionUpdated;
+ SwNodeOffset const m_nStartIndex;
+
+public:
+ SwUndoUpdateIndex(SwTOXBaseSection &);
+ virtual ~SwUndoUpdateIndex() override;
+
+ void TitleSectionInserted(SwSectionFormat & rSectionFormat);
+
+ virtual void UndoImpl(::sw::UndoRedoContext &) override;
+ virtual void RedoImpl(::sw::UndoRedoContext &) override;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOSECTION_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoSort.hxx b/sw/source/core/inc/UndoSort.hxx
new file mode 100644
index 0000000000..432dd41133
--- /dev/null
+++ b/sw/source/core/inc/UndoSort.hxx
@@ -0,0 +1,76 @@
+/* -*- 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_UNDOSORT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDOSORT_HXX
+
+#include <undobj.hxx>
+
+#include <rtl/ustring.hxx>
+#include <tools/solar.h>
+
+#include <memory>
+#include <vector>
+
+struct SwSortOptions;
+class SwTableNode;
+class SwUndoAttrTable;
+
+struct SwSortUndoElement
+{
+ OUString maSourceString;
+ OUString maTargetString;
+ SwNodeOffset mnSourceNodeOffset;
+ SwNodeOffset mnTargetNodeOffset;
+
+ SwSortUndoElement(const OUString& aSource, const OUString& aTarget)
+ : maSourceString(aSource)
+ , maTargetString(aTarget)
+ {}
+
+ SwSortUndoElement(SwNodeOffset nSource, SwNodeOffset nTarget)
+ : mnSourceNodeOffset(nSource)
+ , mnTargetNodeOffset(nTarget)
+ {}
+};
+
+class SwUndoSort final : public SwUndo, private SwUndRng
+{
+ std::unique_ptr<SwSortOptions> m_pSortOptions;
+ std::vector<std::unique_ptr<SwSortUndoElement>> m_SortList;
+ std::unique_ptr<SwUndoAttrTable> m_pUndoAttrTable;
+ SwNodeOffset m_nTableNode;
+
+public: SwUndoSort( const SwPaM&, const SwSortOptions& );
+ SwUndoSort( SwNodeOffset nStt, SwNodeOffset nEnd, const SwTableNode&,
+ const SwSortOptions&, bool bSaveTable );
+
+ virtual ~SwUndoSort() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ void Insert( const OUString& rOrgPos, const OUString& rNewPos );
+ void Insert( SwNodeOffset nOrgPos, SwNodeOffset nNewPos );
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOSORT_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoSplitMove.hxx b/sw/source/core/inc/UndoSplitMove.hxx
new file mode 100644
index 0000000000..cd8b653df9
--- /dev/null
+++ b/sw/source/core/inc/UndoSplitMove.hxx
@@ -0,0 +1,85 @@
+/* -*- 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_UNDOSPLITMOVE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDOSPLITMOVE_HXX
+
+#include <undobj.hxx>
+
+class SwUndoSplitNode final : public SwUndo
+{
+ std::unique_ptr<SwHistory> m_pHistory;
+ std::unique_ptr<SwRedlineData> m_pRedlineData;
+ SwNodeOffset m_nNode;
+ sal_Int32 m_nContent;
+ bool m_bTableFlag : 1;
+ bool m_bCheckTableStart : 1;
+ sal_uInt32 m_nParRsid;
+
+public:
+ SwUndoSplitNode( SwDoc& rDoc, const SwPosition& rPos, bool bChkTable );
+
+ virtual ~SwUndoSplitNode() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ void SetTableFlag() { m_bTableFlag = true; }
+};
+
+class SwUndoMove final : public SwUndo, private SwUndRng, private SwUndoSaveContent
+{
+ // nDest... - destination range of move (after move!)
+ // nIns... - source Position of move (after move!)
+ // nMv... - destination position of move (before move!); for REDO
+ SwNodeOffset m_nDestStartNode, m_nDestEndNode, m_nInsPosNode, m_nMoveDestNode;
+ sal_Int32 m_nDestStartContent, m_nDestEndContent, m_nInsPosContent, m_nMoveDestContent;
+
+ sal_uInt16 m_nFootnoteStart; // StartPos of Footnotes in History
+
+ bool m_bJoinNext : 1,
+ m_bMoveRange : 1;
+
+ bool m_bMoveRedlines; // use DOC_MOVEREDLINES when calling SwDoc::Move
+
+ void DelFootnote( const SwPaM& );
+
+public:
+ SwUndoMove( const SwPaM&, const SwPosition& );
+ SwUndoMove( SwDoc& rDoc, const SwNodeRange&, const SwNode& );
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ /// set the destination range after the move
+ void SetDestRange( const SwNode& rStt, const SwNode& rEnd,
+ const SwNodeIndex& rInsPos );
+
+ bool IsMoveRange() const { return m_bMoveRange; }
+ SwNodeOffset GetEndNode() const { return m_nEndNode; }
+ SwNodeOffset GetDestSttNode() const { return m_nDestStartNode; }
+ sal_Int32 GetDestSttContent() const { return m_nDestStartContent; }
+
+ void SetMoveRedlines( bool b ) { m_bMoveRedlines = b; }
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOSPLITMOVE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoTable.hxx b/sw/source/core/inc/UndoTable.hxx
new file mode 100644
index 0000000000..29850d2f07
--- /dev/null
+++ b/sw/source/core/inc/UndoTable.hxx
@@ -0,0 +1,429 @@
+/* -*- 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_UNDOTABLE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDOTABLE_HXX
+
+#include <o3tl/deleter.hxx>
+#include <tools/long.hxx>
+#include <tools/solar.h>
+#include <ndarr.hxx>
+#include <undobj.hxx>
+#include <set>
+#include <itabenum.hxx>
+#include <tblenum.hxx>
+#include <memory>
+#include <vector>
+
+class SfxItemSet;
+
+struct SwSaveRowSpan;
+class SaveTable;
+class SwDDEFieldType;
+class SwUndoDelete;
+class SwSelBoxes;
+class SwTable;
+class SwTableBox;
+class SwStartNode;
+class SwTableNode;
+class SwTableAutoFormat;
+class SwTableSortBoxes;
+class SwContentNode;
+class SwCursorShell;
+
+namespace sw {
+
+void NotifyTableCollapsedParagraph(const SwContentNode* pNode, SwCursorShell *const pShell);
+
+}
+
+/// Implements undo/redo for Table -> Insert Table.
+class SwUndoInsTable final : public SwUndo
+{
+ OUString m_sTableName;
+ SwInsertTableOptions m_aInsTableOptions;
+ std::unique_ptr<SwDDEFieldType> m_pDDEFieldType;
+ std::optional<std::vector<sal_uInt16>> m_oColumnWidth;
+ std::unique_ptr<SwRedlineData> m_pRedlineData;
+ std::unique_ptr<SwTableAutoFormat> m_pAutoFormat;
+ SwNodeOffset m_nStartNode;
+ sal_uInt16 m_nRows, m_nColumns;
+ sal_uInt16 const m_nAdjust;
+
+public:
+ SwUndoInsTable( const SwPosition&, sal_uInt16 nCols, sal_uInt16 nRows,
+ sal_uInt16 eAdjust, const SwInsertTableOptions& rInsTableOpts,
+ const SwTableAutoFormat* pTAFormat, const std::vector<sal_uInt16> *pColArr,
+ const OUString & rName);
+
+ virtual ~SwUndoInsTable() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+};
+
+class SwUndoTextToTable final : public SwUndo, public SwUndRng
+{
+ OUString m_sTableName;
+ SwInsertTableOptions m_aInsertTableOpts;
+ std::vector<SwNodeOffset> mvDelBoxes;
+ std::unique_ptr<SwTableAutoFormat> m_pAutoFormat;
+ SwHistory* m_pHistory;
+ sal_Unicode m_cSeparator;
+ sal_uInt16 m_nAdjust;
+ bool m_bSplitEnd : 1;
+
+public:
+ SwUndoTextToTable( const SwPaM&, const SwInsertTableOptions&, sal_Unicode,
+ sal_uInt16,
+ const SwTableAutoFormat* pAFormat );
+
+ virtual ~SwUndoTextToTable() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ SwHistory& GetHistory(); // will be created if necessary
+ void AddFillBox( const SwTableBox& rBox );
+};
+
+class SwUndoTableToText final : public SwUndo
+{
+ OUString m_sTableName;
+ std::unique_ptr<SwDDEFieldType> m_pDDEFieldType;
+ std::unique_ptr<SaveTable> m_pTableSave;
+ SwTableToTextSaves m_vBoxSaves;
+ std::unique_ptr<SwHistory> m_pHistory;
+ SwNodeOffset m_nStartNode, m_nEndNode;
+ sal_Unicode m_cSeparator;
+ sal_uInt16 m_nHeadlineRepeat;
+ bool m_bCheckNumFormat : 1;
+
+public:
+ SwUndoTableToText( const SwTable& rTable, sal_Unicode cCh );
+
+ virtual ~SwUndoTableToText() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ void SetRange( const SwNodeRange& );
+ void AddBoxPos( SwDoc& rDoc, SwNodeOffset nNdIdx, SwNodeOffset nEndIdx,
+ sal_Int32 nContentIdx = SAL_MAX_INT32);
+};
+
+class SwUndoAttrTable final : public SwUndo
+{
+ SwNodeOffset m_nStartNode;
+ std::unique_ptr<SaveTable> m_pSaveTable;
+ bool m_bClearTableCol : 1;
+
+public:
+ SwUndoAttrTable( const SwTableNode& rTableNd, bool bClearTabCols = false );
+
+ virtual ~SwUndoAttrTable() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+};
+
+class SwUndoTableNumFormat;
+
+class SwUndoTableAutoFormat final : public SwUndo
+{
+ OUString m_TableStyleName;
+ SwNodeOffset m_nStartNode;
+ std::unique_ptr<SaveTable> m_pSaveTable;
+ std::vector< std::shared_ptr<SwUndoTableNumFormat> > m_Undos;
+ bool m_bSaveContentAttr;
+ sal_uInt16 m_nRepeatHeading;
+
+ void UndoRedo(bool const bUndo, ::sw::UndoRedoContext & rContext);
+
+public:
+ SwUndoTableAutoFormat( const SwTableNode& rTableNd, const SwTableAutoFormat& );
+
+ virtual ~SwUndoTableAutoFormat() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ void SaveBoxContent( const SwTableBox& rBox );
+};
+
+using SwUndoSaveSections = std::vector<std::unique_ptr<SwUndoSaveSection, o3tl::default_delete<SwUndoSaveSection>>>;
+
+class SwUndoTableNdsChg final : public SwUndo
+{
+ std::unique_ptr<SaveTable> m_pSaveTable;
+ std::set<SwNodeOffset> m_Boxes;
+ struct BoxMove
+ {
+ SwNodeOffset index; ///< Index of this box.
+ bool hasMoved; ///< Has this box been moved already.
+ BoxMove(SwNodeOffset idx, bool moved=false) : index(idx), hasMoved(moved) {};
+ bool operator<(const BoxMove& other) const { return index < other.index; };
+ };
+ std::optional< std::set<BoxMove> > m_xNewSttNds;
+ std::unique_ptr<SwUndoSaveSections> m_pDelSects;
+ tools::Long m_nMin, m_nMax; // for redo of delete column
+ SwNodeOffset m_nSttNode;
+ sal_uInt16 m_nCount;
+ bool m_bFlag;
+ bool m_bSameHeight; // only used for SplitRow
+
+ SwUndoTableNdsChg(SwUndoTableNdsChg const&) = delete;
+ SwUndoTableNdsChg& operator=(SwUndoTableNdsChg const&) = delete;
+
+public:
+ SwUndoTableNdsChg( SwUndoId UndoId,
+ const SwSelBoxes& rBoxes,
+ const SwTableNode& rTableNd,
+ tools::Long nMn, tools::Long nMx,
+ sal_uInt16 nCnt, bool bFlg, bool bSameHeight );
+
+ virtual ~SwUndoTableNdsChg() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ void SaveNewBoxes( const SwTableNode& rTableNd, const SwTableSortBoxes& rOld );
+ void SaveNewBoxes( const SwTableNode& rTableNd, const SwTableSortBoxes& rOld,
+ const SwSelBoxes& rBoxes, const std::vector<SwNodeOffset> &rNodeCnts );
+ void SaveSection( SwStartNode* pSttNd );
+ void ReNewBoxes( const SwSelBoxes& rBoxes );
+
+};
+
+class SwUndoMove;
+
+class SwUndoTableMerge final : public SwUndo, private SwUndRng
+{
+ SwNodeOffset m_nTableNode;
+ std::unique_ptr<SaveTable> m_pSaveTable;
+ std::set<SwNodeOffset> m_Boxes;
+ std::vector<SwNodeOffset> m_aNewStartNodes;
+ std::vector<std::unique_ptr<SwUndoMove>> m_vMoves;
+ std::unique_ptr<SwHistory> m_pHistory;
+
+public:
+ SwUndoTableMerge( const SwPaM& rTableSel );
+
+ virtual ~SwUndoTableMerge() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ void MoveBoxContent( SwDoc& rDoc, SwNodeRange& rRg, SwNode& rPos );
+
+ void SetSelBoxes( const SwSelBoxes& rBoxes );
+
+ void AddNewBox( SwNodeOffset nSttNdIdx )
+ { m_aNewStartNodes.push_back( nSttNdIdx ); }
+
+ void SaveCollection( const SwTableBox& rBox );
+};
+
+class SwUndoTableNumFormat final : public SwUndo
+{
+ std::unique_ptr<SfxItemSet> m_pBoxSet;
+ std::unique_ptr<SwHistory> m_pHistory;
+ OUString m_aStr, m_aNewFormula;
+
+ sal_uLong m_nFormatIdx, m_nNewFormatIdx;
+ double m_fNum, m_fNewNum;
+ SwNodeOffset m_nNode;
+ SwNodeOffset m_nNodePos;
+
+ bool m_bNewFormat : 1;
+ bool m_bNewFormula : 1;
+ bool m_bNewValue : 1;
+
+public:
+ SwUndoTableNumFormat( const SwTableBox& rBox, const SfxItemSet* pNewSet = nullptr );
+
+ virtual ~SwUndoTableNumFormat() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ void SetNumFormat( sal_uLong nNewNumFormatIdx, const double& rNewNumber )
+ { m_nFormatIdx = nNewNumFormatIdx; m_fNum = rNewNumber; }
+ void SetBox( const SwTableBox& rBox );
+};
+
+struct UndoTableCpyTable_Entry;
+
+class SwUndoTableCpyTable final : public SwUndo
+{
+ std::vector<std::unique_ptr<UndoTableCpyTable_Entry>> m_vArr;
+ std::unique_ptr<SwUndoTableNdsChg> m_pInsRowUndo;
+
+ //b6341295: When redlining is active, PrepareRedline has to create the
+ //redlining attributes for the new and the old table cell content
+ static std::unique_ptr<SwUndo> PrepareRedline( SwDoc* pDoc, const SwTableBox& rBox,
+ SwPosition& rPos, bool& rJoin, bool bRedo );
+
+public:
+ SwUndoTableCpyTable(const SwDoc& rDoc);
+
+ virtual ~SwUndoTableCpyTable() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ void AddBoxBefore( const SwTableBox& rBox, bool bDelContent );
+ void AddBoxAfter( const SwTableBox& rBox, const SwNodeIndex& rIdx,
+ bool bDelContent );
+
+ bool IsEmpty() const;
+ bool InsertRow( SwTable& rTable, const SwSelBoxes& rBoxes, sal_uInt16 nCnt );
+ void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+};
+
+class SwUndoCpyTable final : public SwUndo
+{
+ std::unique_ptr<SwUndoDelete> m_pDelete;
+ SwNodeOffset m_nTableNode;
+
+public:
+ SwUndoCpyTable(const SwDoc& rDoc);
+
+ virtual ~SwUndoCpyTable() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ void SetTableSttIdx( SwNodeOffset nIdx ) { m_nTableNode = nIdx; }
+};
+
+class SwUndoSplitTable final : public SwUndo
+{
+ SwNodeOffset m_nTableNode, m_nOffset;
+ std::unique_ptr<SwSaveRowSpan> mpSaveRowSpan; // stores row span values at the splitting row
+ std::unique_ptr<SaveTable> m_pSavedTable;
+ std::unique_ptr<SwHistory> m_pHistory;
+ SplitTable_HeadlineOption const m_nMode;
+ sal_uInt16 m_nFormulaEnd;
+ bool m_bCalcNewSize;
+
+public:
+ SwUndoSplitTable( const SwTableNode& rTableNd, std::unique_ptr<SwSaveRowSpan> pRowSp,
+ SplitTable_HeadlineOption nMode, bool bCalcNewSize );
+
+ virtual ~SwUndoSplitTable() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ void SetTableNodeOffset( SwNodeOffset nIdx ) { m_nOffset = nIdx - m_nTableNode; }
+ SwHistory* GetHistory() { return m_pHistory.get(); }
+ void SaveFormula( SwHistory& rHistory );
+};
+
+class SwUndoMergeTable final : public SwUndo
+{
+ OUString m_aName;
+ SwNodeOffset m_nTableNode;
+ std::unique_ptr<SaveTable> m_pSaveTable, m_pSaveHdl;
+ std::unique_ptr<SwHistory> m_pHistory;
+ bool m_bWithPrev;
+
+public:
+ SwUndoMergeTable( const SwTableNode& rTableNd, const SwTableNode& rDelTableNd,
+ bool bWithPrev );
+
+ virtual ~SwUndoMergeTable() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+
+ void SaveFormula( SwHistory& rHistory );
+};
+
+class SwUndoTableHeadline final : public SwUndo
+{
+ SwNodeOffset m_nTableNode;
+ sal_uInt16 m_nOldHeadline;
+ sal_uInt16 m_nNewHeadline;
+
+public:
+ SwUndoTableHeadline( const SwTable&, sal_uInt16 nOldHdl, sal_uInt16 nNewHdl );
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RepeatImpl( ::sw::RepeatContext & ) override;
+};
+
+void InsertSort( std::vector<sal_uInt16>& rArr, sal_uInt16 nIdx );
+
+class SwUndoTableStyleMake final : public SwUndo
+{
+ OUString m_sName;
+ std::unique_ptr<SwTableAutoFormat> m_pAutoFormat;
+public:
+ SwUndoTableStyleMake(OUString aName, const SwDoc& rDoc);
+
+ virtual ~SwUndoTableStyleMake() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+};
+
+class SwUndoTableStyleDelete final : public SwUndo
+{
+ std::unique_ptr<SwTableAutoFormat> m_pAutoFormat;
+ std::vector<SwTable*> m_rAffectedTables;
+public:
+ SwUndoTableStyleDelete(std::unique_ptr<SwTableAutoFormat> pAutoFormat, std::vector<SwTable*>&& rAffectedTables, const SwDoc& rDoc);
+
+ virtual ~SwUndoTableStyleDelete() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+};
+
+class SwUndoTableStyleUpdate final : public SwUndo
+{
+ std::unique_ptr<SwTableAutoFormat> m_pOldFormat, m_pNewFormat;
+public:
+ SwUndoTableStyleUpdate(const SwTableAutoFormat& rNewFormat, const SwTableAutoFormat& rOldFormat, const SwDoc& rDoc);
+
+ virtual ~SwUndoTableStyleUpdate() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOTABLE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoThemeChange.hxx b/sw/source/core/inc/UndoThemeChange.hxx
new file mode 100644
index 0000000000..5ce4900801
--- /dev/null
+++ b/sw/source/core/inc/UndoThemeChange.hxx
@@ -0,0 +1,35 @@
+/* -*- 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/.
+ */
+
+#pragma once
+
+#include <undobj.hxx>
+#include <memory>
+#include <docmodel/theme/ColorSet.hxx>
+
+namespace sw
+{
+class UndoThemeChange final : public SwUndo
+{
+private:
+ SwDoc& mrDocument;
+ std::shared_ptr<model::ColorSet> mpOldColorSet;
+ std::shared_ptr<model::ColorSet> mpNewColorSet;
+
+public:
+ UndoThemeChange(SwDoc& rDocument, std::shared_ptr<model::ColorSet> const& pOld,
+ std::shared_ptr<model::ColorSet> const& pNew);
+ virtual ~UndoThemeChange() override;
+
+ virtual void UndoImpl(UndoRedoContext& rUndoRedoContext) override;
+ virtual void RedoImpl(UndoRedoContext& rUndoRedoContext) override;
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/acorrect.hxx b/sw/source/core/inc/acorrect.hxx
new file mode 100644
index 0000000000..0b9fce1787
--- /dev/null
+++ b/sw/source/core/inc/acorrect.hxx
@@ -0,0 +1,121 @@
+/* -*- 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_ACORRECT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_ACORRECT_HXX
+
+#include <memory>
+
+#include <svl/itemset.hxx>
+#include <editeng/svxacorr.hxx>
+#include <nodeoffset.hxx>
+#include <ndindex.hxx>
+#include <utility>
+
+class SwEditShell;
+class SwPaM;
+struct SwPosition;
+class SfxItemSet;
+
+class SwDontExpandItem
+{
+ std::unique_ptr<SfxItemSet> m_pDontExpandItems;
+
+public:
+ SwDontExpandItem() {}
+ ~SwDontExpandItem();
+
+ void SaveDontExpandItems( const SwPosition& rPos );
+ void RestoreDontExpandItems( const SwPosition& rPos );
+
+};
+
+class SwAutoCorrDoc final : public SvxAutoCorrDoc
+{
+ SwEditShell& m_rEditSh;
+ SwPaM& m_rCursor;
+ std::optional<SwNodeIndex> m_oIndex;
+ int m_nEndUndoCounter;
+ bool m_bUndoIdInitialized;
+
+ void DeleteSel( SwPaM& rDelPam );
+ void DeleteSelImpl(SwPaM & rDelPam);
+
+public:
+ SwAutoCorrDoc( SwEditShell& rEditShell, SwPaM& rPam, sal_Unicode cIns = 0 );
+ virtual ~SwAutoCorrDoc() override;
+
+ virtual bool Delete( sal_Int32 nStt, sal_Int32 nEnd ) override;
+ virtual bool Insert( sal_Int32 nPos, const OUString& rText ) override;
+ virtual bool Replace( sal_Int32 nPos, const OUString& rText ) override;
+ virtual bool ReplaceRange( sal_Int32 nPos, sal_Int32 nLen, const OUString& rText ) override;
+
+ virtual void SetAttr( sal_Int32 nStt, sal_Int32 nEnd, sal_uInt16 nSlotId,
+ SfxPoolItem& ) override;
+
+ virtual bool SetINetAttr( sal_Int32 nStt, sal_Int32 nEnd, const OUString& rURL ) override;
+
+ // return text of a previous paragraph
+ // If it does not exist or if there is nothing before, return blank.
+ // - true: paragraph before "normal" insertion position
+ // - false: paragraph in that the corrected word was inserted
+ // (does not need to be the same paragraph)
+ virtual OUString const* GetPrevPara(bool bAtNormalPos) override;
+
+ virtual bool ChgAutoCorrWord( sal_Int32& rSttPos, sal_Int32 nEndPos,
+ SvxAutoCorrect& rACorrect,
+ OUString* pPara ) override;
+ virtual bool TransliterateRTLWord( sal_Int32& rSttPos, sal_Int32 nEndPos,
+ bool bApply = false ) override;
+
+ // Will be called after swapping characters by the functions
+ // - FnCapitalStartWord and
+ // - FnCapitalStartSentence.
+ // Afterwards the words can be added into exception list if needed.
+ virtual void SaveCpltSttWord( ACFlags nFlag, sal_Int32 nPos,
+ const OUString& rExceptWord, sal_Unicode cChar ) override;
+ virtual LanguageType GetLanguage( sal_Int32 nPos ) const override;
+};
+
+class SwAutoCorrExceptWord
+{
+ OUString m_sWord;
+ SwNodeOffset m_nNode;
+ ACFlags m_nFlags;
+ sal_Int32 m_nContent;
+ sal_Unicode m_cChar;
+ LanguageType m_eLanguage;
+ bool m_bDeleted;
+
+public:
+ SwAutoCorrExceptWord(ACFlags nAFlags, SwNodeOffset nNd, sal_Int32 nContent,
+ OUString aWord, sal_Unicode cChr,
+ LanguageType eLang)
+ : m_sWord(std::move(aWord)), m_nNode(nNd), m_nFlags(nAFlags), m_nContent(nContent),
+ m_cChar(cChr), m_eLanguage(eLang), m_bDeleted(false)
+ {}
+
+ bool IsDeleted() const { return m_bDeleted; }
+ void CheckChar(const SwPosition& rPos, sal_Unicode cChar);
+ bool CheckDelChar(const SwPosition& rPos);
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/anchoredobjectposition.hxx b/sw/source/core/inc/anchoredobjectposition.hxx
new file mode 100644
index 0000000000..a366833000
--- /dev/null
+++ b/sw/source/core/inc/anchoredobjectposition.hxx
@@ -0,0 +1,447 @@
+/* -*- 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_ANCHOREDOBJECTPOSITION_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_ANCHOREDOBJECTPOSITION_HXX
+
+#include <swtypes.hxx>
+#include "frame.hxx"
+#include <nodeoffset.hxx>
+
+class SdrObject;
+class SwFlyFrame;
+class SwContact;
+class SwFrameFormat;
+class SwRect;
+class SvxLRSpaceItem;
+class SvxULSpaceItem;
+class SwFormatHoriOrient;
+class SwAnchoredObject;
+
+namespace objectpositioning
+{
+ class SwEnvironmentOfAnchoredObject;
+
+ class SwAnchoredObjectPosition
+ {
+ private:
+ // object to be positioned
+ SdrObject& mrDrawObj;
+ // #i26791# - anchored object the object belongs to;
+ SwAnchoredObject* mpAnchoredObj;
+ // frame the object is anchored at
+ SwFrame* mpAnchorFrame;
+ // contact object
+ SwContact* mpContact;
+ // frame format
+ const SwFrameFormat* mpFrameFormat;
+ // does the object represents a Writer fly frame
+ bool mbIsObjFly;
+ // #i62875#
+ bool mbFollowTextFlow;
+ // #i62875#
+ // for compatibility option <DoNotCaptureDrawObjsOnPage>
+ bool mbDoNotCaptureAnchoredObj;
+
+ /** determine information about object
+
+ member <mbIsObjFly>, <mpAnchoredObj>, <mpAnchorFrame>, <mpContact>
+ and <mpFrameFormat> are set
+ */
+ void GetInfoAboutObj();
+
+ // #i62875#
+ // --> OD 2009-09-01 #mongolianlayout# - add parameter <bVertL2R>
+ SwTwips ImplAdjustVertRelPos( const SwTwips nTopOfAnch,
+ const bool bVert,
+ const bool bVertL2R,
+ const SwFrame& rPageAlignLayFrame,
+ const SwTwips nProposedRelPosY,
+ const bool bFollowTextFlow,
+ const bool bCheckBottom ) const;
+ SwTwips ImplAdjustHoriRelPos( const SwFrame& _rPageAlignLayFrame,
+ const SwTwips _nProposedRelPosX ) const;
+
+ protected:
+ SwAnchoredObjectPosition( SdrObject& _rDrawObj );
+ virtual ~SwAnchoredObjectPosition();
+
+ // accessors for object and its corresponding data/information
+ SdrObject& GetObject() const
+ {
+ return mrDrawObj;
+ }
+ bool IsObjFly() const
+ {
+ return mbIsObjFly;
+ }
+ SwAnchoredObject& GetAnchoredObj() const
+ {
+ return *mpAnchoredObj;
+ }
+ SwFrame& GetAnchorFrame() const
+ {
+ return *mpAnchorFrame;
+ }
+ const SwFrameFormat& GetFrameFormat() const
+ {
+ return *mpFrameFormat;
+ }
+ // #i62875#
+ bool DoesObjFollowsTextFlow() const
+ {
+ return mbFollowTextFlow;
+ }
+
+ // virtual methods providing data for to character anchored objects.
+ virtual bool IsAnchoredToChar() const;
+ virtual const SwFrame* ToCharOrientFrame() const;
+ virtual const SwRect* ToCharRect() const;
+ // #i22341#
+ virtual SwTwips ToCharTopOfLine() const;
+
+ /** helper method to determine top of a frame for the vertical object
+ positioning
+
+ #i11860#
+ */
+ SwTwips GetTopForObjPos( const SwFrame& _rFrame,
+ const SwRectFn& _fnRect,
+ const bool _bVert ) const;
+
+ void GetVertAlignmentValues( const SwFrame& _rVertOrientFrame,
+ const SwFrame& _rPageAlignLayFrame,
+ const sal_Int16 _eRelOrient,
+ SwTwips& _orAlignAreaHeight,
+ SwTwips& _orAlignAreaOffset ) const;
+
+ // #i26791# - add output parameter <_roVertOffsetToFrameAnchorPos>
+ SwTwips GetVertRelPos( const SwFrame& _rVertOrientFrame,
+ const SwFrame& _rPageAlignLayFrame,
+ const sal_Int16 _eVertOrient,
+ const sal_Int16 _eRelOrient,
+ const SwTwips _nVertPos,
+ const SvxLRSpaceItem& _rLRSpacing,
+ const SvxULSpaceItem& _rULSpacing,
+ SwTwips& _roVertOffsetToFrameAnchorPos ) const;
+
+ /** adjust calculated vertical in order to keep object inside
+ 'page' alignment layout frame.
+
+ #i31805# - add parameter <_bCheckBottom>
+ #i26945# - add parameter <_bFollowTextFlow>
+ #i62875# - made inline, intrinsic actions moved
+ to private method <ImplAdjustVertRelPos>, which is only
+ called, if <mbDoNotCaptureAnchoredObj> not set.
+ OD 2009-09-01 #mongolianlayout# - add parameter <bVertL2R>
+
+ @param nTopOfAnch
+ input parameter - 'vertical' position, at which the relative
+ position of the object is calculated from.
+
+ @param bVert
+ input parameter - boolean, indicating, if object is in vertical
+ layout.
+
+ @param bVertL2R
+ input parameter - boolean, indicating, if object is in mongolian
+ layout (vertical left-to-right layout).
+
+ @param rPageAlignLayFrame
+ input parameter - layout frame, which determines the 'page area'
+ the object has to be vertical positioned in.
+
+ @param nProposedRelPosY
+ input parameter - proposed relative vertical position, which
+ will be adjusted.
+
+ @param bFollowTextFlow
+ input parameter - value of attribute 'Follow text flow' of the
+ anchored object.
+
+ @param bCheckBottom
+ input parameter - boolean indicating, if bottom of anchored
+ object has to be checked and thus, (if needed) the proposed
+ relative position has to be adjusted. default value <true>
+ */
+ SwTwips AdjustVertRelPos( const SwTwips nTopOfAnch,
+ const bool bVert,
+ const bool bVertL2R,
+ const SwFrame& rPageAlignLayFrame,
+ const SwTwips nProposedRelPosY,
+ const bool bFollowTextFlow,
+ const bool bCheckBottom = true ) const
+ {
+ return !mbDoNotCaptureAnchoredObj
+ ? ImplAdjustVertRelPos( nTopOfAnch, bVert, bVertL2R,
+ rPageAlignLayFrame,
+ nProposedRelPosY,
+ bFollowTextFlow,
+ bCheckBottom )
+ : nProposedRelPosY;
+ }
+
+ /** calculate relative horizontal position
+
+ #i26791# - add output parameter
+ <_roHoriOffsetToFrameAnchorPos>
+
+ @param _rHoriOrientFrame
+ input parameter - frame the horizontal position of the object
+ is oriented at.
+
+ @param _rEnvOfObj
+ input parameter - object instance to retrieve environment
+ information about the object
+
+ @param _rHoriOrient
+ input parameter - horizontal positioning and alignment, for which
+ the relative position is calculated.
+
+ @param _rLRSpacing
+ input parameter - left and right spacing of the object to the text
+
+ @param _rULSpacing
+ input parameter - upper and lower spacing of the object to the text
+
+ @param _bObjWrapThrough
+ input parameter - boolean indicating, if object has wrap mode
+ 'wrap through'.
+
+ @param _nRelPosY
+ input parameter - relative vertical position
+
+ @param _roHoriOffsetToFrameAnchorPos
+ output parameter - 'horizontal' offset to frame anchor position
+ according to the alignment
+
+ @return relative horizontal position in SwTwips
+ */
+ SwTwips CalcRelPosX( const SwFrame& _rHoriOrientFrame,
+ const SwEnvironmentOfAnchoredObject& _rEnvOfObj,
+ const SwFormatHoriOrient& _rHoriOrient,
+ const SvxLRSpaceItem& _rLRSpacing,
+ const SvxULSpaceItem& _rULSpacing,
+ const bool _bObjWrapThrough,
+ const SwTwips _nRelPosY,
+ SwTwips& _roHoriOffsetToFrameAnchorPos
+ ) const;
+
+ /** adjust calculated horizontal in order to keep object inside
+ 'page' alignment layout frame for object type position TO_CNTNT
+
+ #i62875# - made inline, intrinsic actions moved
+ to private method <ImplAdjustHoriRelPos>, which is only
+ called, if <mbDoNotCaptureAnchoredObj> not set.
+
+ @param _rPageAlignLayFrame
+ input parameter - layout frame, which determines the 'page area'
+ the object has to be horizontal positioned in.
+
+ @param _nProposedRelPosX
+ input parameter - proposed relative horizontal position, which
+ will be adjusted.
+
+ @return adjusted relative horizontal position in SwTwips.
+ */
+ SwTwips AdjustHoriRelPos( const SwFrame& _rPageAlignLayFrame,
+ const SwTwips _nProposedRelPosX ) const
+ {
+ return !mbDoNotCaptureAnchoredObj
+ ? ImplAdjustHoriRelPos( _rPageAlignLayFrame, _nProposedRelPosX )
+ : _nProposedRelPosX;
+ }
+
+ /** toggle given horizontal orientation and relative alignment
+
+ @param _bToggleLeftRight
+ input parameter - boolean indicating, if horizontal orientation
+ and relative alignment has to be toggled.
+
+ @param _ioeHoriOrient
+ input/output parameter - horizontal orientation, that is toggled,
+ if needed.
+
+ @param _iopeRelOrient
+ optional input/output parameter (default value NULL)
+ - if set, relative alignment, that is toggled, if needed.
+ */
+ static void ToggleHoriOrientAndAlign( const bool _bToggleLeftRight,
+ sal_Int16& _ioeHoriOrient,
+ sal_Int16& _iopeRelOrient
+ );
+
+ /** determine alignment values for horizontal position of object
+
+ @param _rHoriOrientFrame
+ input parameter - frame the horizontal position of the object
+ is oriented at.
+
+ @param _rPageAlignLayFrame
+ input parameter - layout frame, which determines the 'page area'
+ the object has to be horizontal positioned in.
+
+ @param _eRelOrient
+ input parameter - horizontal relative alignment, for which
+ the relative position is calculated.
+
+ @param _bToggleLeftRight
+ input parameter - boolean indicating, if left/right alignments
+ have to be toggled.
+
+ @param _bObjWrapThrough
+ input parameter - boolean indicating, if object has wrap mode
+ 'wrap through'.
+ important note: value is only relevant, if _rHoriOrientFrame is
+ a text frame.
+
+ @param _orAlignAreaWidth
+ output parameter - width in SwTwips of the area the horizontal
+ position is aligned to.
+
+ @param _orAlignAreaOffset
+ output parameter - offset in SwTwips of the area the horizontal
+ position is aligned to. offset is given to the 'left' of the
+ anchor position.
+
+ @param _obAlignedRelToPage
+ output parameter - boolean indicating, that object is aligned
+ to 'page area'.
+ */
+ void GetHoriAlignmentValues( const SwFrame& _rHoriOrientFrame,
+ const SwFrame& _rPageAlignLayFrame,
+ const sal_Int16 _eRelOrient,
+ const bool _bObjWrapThrough,
+ SwTwips& _orAlignAreaWidth,
+ SwTwips& _orAlignAreaOffset,
+ bool& _obAlignedRelToPage ) const;
+
+ /** adjust calculated horizontal position in order to draw object
+ aside other objects with same positioning
+
+ @param _rHoriOrientFrame
+ input parameter - frame the horizontal position of the object
+ is oriented at.
+
+ @param _nProposedRelPosX
+ input parameter - proposed relative horizontal position, which
+ will be adjusted.
+
+ @param _nRelPosY
+ input parameter - relative vertical position
+
+ @param _eHoriOrient
+ input parameter - horizontal position of object
+
+ @param _eRelOrient
+ input parameter - alignment of object
+
+ @param _rLRSpacing
+ input parameter - left and right spacing of the object to the text
+
+ @param _rULSpacing
+ input parameter - upper and lower spacing of the object to the text
+
+ @param _bEvenPage
+ input parameter - boolean indicating, if object is on an even page.
+
+ @return adjusted relative horizontal position in SwTwips
+ */
+ SwTwips AdjustHoriRelPosForDrawAside( const SwFrame& _rHoriOrientFrame,
+ const SwTwips _nProposedRelPosX,
+ const SwTwips _nRelPosY,
+ const sal_Int16 _eHoriOrient,
+ const sal_Int16 _eRelOrient,
+ const SvxLRSpaceItem& _rLRSpacing,
+ const SvxULSpaceItem& _rULSpacing,
+ const bool _bEvenPage
+ ) const;
+
+ /** determine, if object has to draw aside given fly frame
+
+ method used by <AdjustHoriRelPosForDrawAside(..)>
+
+ @param _pFly
+ input parameter - fly frame the draw aside check is done for.
+
+ @param _rObjRect
+ input parameter - proposed object rectangle
+
+ @param _pObjContext
+ input parameter - context of the object
+
+ @param _nObjIndex
+ input parameter - index of the anchor frame of the object
+
+ @param _bEvenPage
+ input parameter - boolean indicating, if object is on an even page.
+
+ @param _eHoriOrient
+ input parameter - horizontal position of object
+
+ @param _eRelOrient
+ input parameter - alignment of object
+
+ @return boolean indicating, if object has to be drawn aside
+ given fly frame.
+ */
+ bool DrawAsideFly( const SwFlyFrame* _pFly,
+ const SwRect& _rObjRect,
+ const SwFrame* _pObjContext,
+ const SwNodeOffset _nObjIndex,
+ const bool _bEvenPage,
+ const sal_Int16 _eHoriOrient,
+ const sal_Int16 _eRelOrient
+ ) const;
+
+ /** determine, if object has to draw aside another object
+
+ the different alignments of the objects determines, if one has
+ to draw aside another one. Thus, the given alignment are checked
+ against each other, which one has to be drawn aside the other one.
+ depending on parameter _bLeft check is done for left or right
+ positioning.
+ method used by <DrawAsideFly(..)>
+
+ @param _eRelOrient1
+ input parameter - alignment 1
+
+ @param _eRelOrient2
+ input parameter - alignment 2
+
+ @param _bLeft
+ input parameter - boolean indicating, if check is done for left
+ or for right positioning.
+
+ @return boolean indicating, if an object with an alignment
+ <_eRelOrient1> has to be drawn aside an object with an
+ alignment <_eRelOrient2>
+ */
+ static bool Minor_( sal_Int16 _eRelOrient1,
+ sal_Int16 _eRelOrient2,
+ bool _bLeft );
+
+ public:
+ virtual void CalcPosition() = 0;
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/annotationmark.hxx b/sw/source/core/inc/annotationmark.hxx
new file mode 100644
index 0000000000..c4c2bc1288
--- /dev/null
+++ b/sw/source/core/inc/annotationmark.hxx
@@ -0,0 +1,48 @@
+/* -*- 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_ANNOTATIONMARK_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_ANNOTATIONMARK_HXX
+
+#include "bookmark.hxx"
+#include <rtl/ustring.hxx>
+
+class SwFormatField;
+
+namespace sw::mark
+{
+ class AnnotationMark final : public MarkBase
+ {
+ public:
+ AnnotationMark(
+ const SwPaM& rPaM,
+ const OUString& rName );
+
+ virtual ~AnnotationMark() override;
+
+ virtual void InitDoc(SwDoc& io_Doc, sw::mark::InsertMode eMode, SwPosition const* pSepPos) override;
+
+ const SwFormatField* GetAnnotationFormatField() const;
+ };
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/ascharanchoredobjectposition.hxx b/sw/source/core/inc/ascharanchoredobjectposition.hxx
new file mode 100644
index 0000000000..34f42e3643
--- /dev/null
+++ b/sw/source/core/inc/ascharanchoredobjectposition.hxx
@@ -0,0 +1,160 @@
+/* -*- 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_ASCHARANCHOREDOBJECTPOSITION_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_ASCHARANCHOREDOBJECTPOSITION_HXX
+
+#include "anchoredobjectposition.hxx"
+#include <swtypes.hxx>
+#include <swrect.hxx>
+#include <o3tl/typed_flags_set.hxx>
+
+class SwTextFrame;
+class SwFormatVertOrient;
+
+// flags for positioning algorithm of as-character-anchored objects
+enum class AsCharFlags {
+ None = 0x00,
+ Quick = 0x01,
+ UlSpace = 0x02,
+ Init = 0x04,
+ Rotate = 0x08,
+ Reverse = 0x10,
+ Bidi = 0x20,
+};
+namespace o3tl {
+ template<> struct typed_flags<AsCharFlags> : is_typed_flags<AsCharFlags, 0x3f> {};
+};
+
+namespace sw
+{
+ // TODO: merge/migrate this to com::sun::star::VertOrientation instead of duplicating?
+ enum class LineAlign
+ {
+ NONE,
+ TOP,
+ CENTER,
+ BOTTOM
+ };
+};
+namespace objectpositioning
+{
+ class SwAsCharAnchoredObjectPosition final : public SwAnchoredObjectPosition
+ {
+ private:
+ // data to calculate object position
+ // Proposed anchor position, starting point for the calculation
+ // of the object position.
+ const Point& mrProposedAnchorPos;
+ // flags that influences the calculation of the anchor position
+ // AsCharFlags::Quick : quick formatting - calculated position not set at object
+ // AsCharFlags::UlSpace : consider upper/lower spacing - adjustment of anchor position
+ // AsCharFlags::Init : initial calculation
+ // AsCharFlags::Rotate : object is rotated by 90 degrees
+ // AsCharFlags::Reverse : object is reversed (rotated by 270 degrees)
+ // AsCharFlags::Bidi : object belongs to a BIDI-multi-portion
+ const AsCharFlags mnFlags;
+ // needed line values for the different alignments.
+ const SwTwips mnLineAscent;
+ const SwTwips mnLineDescent;
+ const SwTwips mnLineAscentInclObjs;
+ const SwTwips mnLineDescentInclObjs;
+
+ // calculated data for object position
+ Point maAnchorPos;
+ SwTwips mnRelPos;
+ SwRect maObjBoundRect;
+ // line alignment relative to line height
+ sw::LineAlign mnLineAlignment;
+
+ // method to cast <SwAnchoredObjectPosition::GetAnchorFrame()>
+ const SwTextFrame& GetAnchorTextFrame() const;
+
+ /** determine the relative position to base line for object position
+
+ @param _ObjBoundHeight
+ height including corresponding spacing of the object, for which
+ the Y-position has to be calculated.
+
+ @param _rVert
+ given vertical positioning and alignment
+
+ @return relative position to the base line
+ */
+ SwTwips GetRelPosToBase( const SwTwips _nObjBoundHeight,
+ const SwFormatVertOrient& _rVert );
+
+ public:
+ /** constructor; provided object to be positioned and needed data
+ for calculation of the object position
+
+ @param _rDrawObj
+ input parameter - object, that is be positioned.
+
+ @param _rProposedAnchorPos
+ proposed anchor position; starting point for the calculation
+ of the anchor position
+
+ @param _nFlags
+ flags that influences the calculation of the anchor position
+ AsCharFlags::Quick : quick formatting - calculated position not set at object
+ AsCharFlags::UlSpace : consider upper/lower spacing - adjustment of anchor position
+ AsCharFlags::Init : initial calculation
+ AsCharFlags::Rotate : object is rotated by 90 degrees
+ AsCharFlags::Reverse : object is reversed (rotated by 270 degrees)
+ AsCharFlags::Bidi : object belongs to a BIDI-multi-portion
+
+ @param _nLineAscent, _nLineDescent, _nLineAscentInclObjs,
+ _nLineDescentInclObjs - needed line values for the different
+ alignments.
+ */
+ SwAsCharAnchoredObjectPosition( SdrObject& _rDrawObj,
+ const Point& _rProposedAnchorPos,
+ const AsCharFlags _nFlags,
+ const SwTwips _nLineAscent,
+ const SwTwips _nLineDescent,
+ const SwTwips _nLineAscentInclObjs,
+ const SwTwips _nLineDescentInclObjs );
+ virtual ~SwAsCharAnchoredObjectPosition() override;
+
+ /** calculate position for object position
+
+ members <maAnchorPos>, <mnRelPos>, <maObjBoundRect> and
+ <mnLineAlignment> are calculated.
+ calculated position is set at the given object.
+ */
+ virtual void CalcPosition() override;
+
+ // calculated anchored position for object position type AS_CHAR
+ const Point& GetAnchorPos() const { return maAnchorPos;}
+
+ // calculated relative position to base line for object position type AS_CHAR
+ SwTwips GetRelPosY() const { return mnRelPos;}
+
+ // determined object rectangle including spacing for object position type AS_CHAR
+ const SwRect& GetObjBoundRectInclSpacing() const { return maObjBoundRect;}
+
+ // determined line alignment relative to line height
+ sw::LineAlign GetLineAlignment() const { return mnLineAlignment;}
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/attrhint.hxx b/sw/source/core/inc/attrhint.hxx
new file mode 100644
index 0000000000..e098b26952
--- /dev/null
+++ b/sw/source/core/inc/attrhint.hxx
@@ -0,0 +1,31 @@
+/* -*- 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_ATTRHINT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_ATTRHINT_HXX
+
+#include <svl/hint.hxx>
+
+class SwAttrHint final : public SfxHint
+{
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/bodyfrm.hxx b/sw/source/core/inc/bodyfrm.hxx
new file mode 100644
index 0000000000..fe7418177c
--- /dev/null
+++ b/sw/source/core/inc/bodyfrm.hxx
@@ -0,0 +1,42 @@
+/* -*- 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_BODYFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_BODYFRM_HXX
+
+#include "layfrm.hxx"
+
+class SwBorderAttrs;
+
+/// Container of body content (i.e. not header or footer). Typical parent is an
+/// SwPageFrame, typical lower is an SwTextFrame.
+class SAL_DLLPUBLIC_RTTI SwBodyFrame final : public SwLayoutFrame
+{
+ virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override;
+
+public:
+ SwBodyFrame( SwFrameFormat*, SwFrame* );
+
+ virtual void PaintSubsidiaryLines( const SwPageFrame*, const SwRect& ) const override;
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/bookmark.hxx b/sw/source/core/inc/bookmark.hxx
new file mode 100644
index 0000000000..8a3fc98f26
--- /dev/null
+++ b/sw/source/core/inc/bookmark.hxx
@@ -0,0 +1,367 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <cppuhelper/weakref.hxx>
+#include <sfx2/Metadatable.hxx>
+#include <vcl/keycod.hxx>
+#include <unotools/weakref.hxx>
+#include <memory>
+#include <optional>
+#include <string_view>
+#include <com/sun/star/text/XTextContent.hpp>
+
+#include <rtl/ustring.hxx>
+#include <osl/diagnose.h>
+#include <tools/ref.hxx>
+#include <IMark.hxx>
+#include <swrect.hxx>
+#include "FormFieldButton.hxx"
+
+class SwDoc;
+class SwEditWin;
+class SwServerObject;
+class SvNumberFormatter;
+class SfxViewShell;
+class SwXBookmark;
+
+namespace sw::mark {
+ class MarkBase
+ : virtual public IMark
+ {
+ public:
+ //getters
+ SwPosition& GetMarkPos() const override
+ { return const_cast<SwPosition&>(*m_oPos1); }
+ const OUString& GetName() const override
+ { return m_aName; }
+ SwPosition& GetOtherMarkPos() const override
+ {
+ OSL_PRECOND(IsExpanded(), "<SwPosition::GetOtherMarkPos(..)> - I have no other Pos set." );
+ return const_cast<SwPosition&>(*m_oPos2);
+ }
+ SwPosition& GetMarkStart() const override
+ {
+ if( !IsExpanded() ) return GetMarkPos( );
+ if ( GetMarkPos( ) < GetOtherMarkPos( ) )
+ return GetMarkPos();
+ else
+ return GetOtherMarkPos( );
+ }
+ SwPosition& GetMarkEnd() const override
+ {
+ if( !IsExpanded() ) return GetMarkPos();
+ if ( GetMarkPos( ) >= GetOtherMarkPos( ) )
+ return GetMarkPos( );
+ else
+ return GetOtherMarkPos( );
+ }
+
+ bool IsCoveringPosition(const SwPosition& rPos) const override;
+ bool IsExpanded() const override
+ { return m_oPos2.has_value(); }
+
+ void SetName(const OUString& rName)
+ { m_aName = rName; }
+ virtual void SetMarkPos(const SwPosition& rNewPos);
+ virtual void SetOtherMarkPos(const SwPosition& rNewPos);
+ virtual void ClearOtherMarkPos()
+ { m_oPos2.reset(); }
+
+ virtual auto InvalidateFrames() -> void;
+
+ OUString ToString( ) const override;
+ void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+
+ void Swap()
+ {
+ if(m_oPos2)
+ m_oPos1.swap(m_oPos2);
+ }
+
+ virtual void InitDoc(SwDoc&, sw::mark::InsertMode, SwPosition const*)
+ {
+ }
+
+ ~MarkBase() override;
+
+ const unotools::WeakReference<SwXBookmark> & GetXBookmark() const
+ { return m_wXBookmark; }
+ void SetXBookmark(rtl::Reference<SwXBookmark> const& xBkmk);
+
+ static OUString GenerateNewName(std::u16string_view rPrefix);
+ protected:
+ // SwClient
+ void SwClientNotify(const SwModify&, const SfxHint&) override;
+
+ MarkBase(const SwPaM& rPaM, OUString aName);
+ std::optional<SwPosition> m_oPos1;
+ std::optional<SwPosition> m_oPos2;
+ OUString m_aName;
+
+ unotools::WeakReference<SwXBookmark> m_wXBookmark;
+ };
+
+ class NavigatorReminder final
+ : public MarkBase
+ {
+ public:
+ NavigatorReminder(const SwPaM& rPaM);
+ };
+
+ class UnoMark final
+ : public MarkBase
+ {
+ public:
+ UnoMark(const SwPaM& rPaM);
+ };
+
+ class DdeBookmark
+ : public MarkBase
+ {
+ public:
+ DdeBookmark(const SwPaM& rPaM);
+
+ const SwServerObject* GetRefObject() const { return m_aRefObj.get(); }
+ SwServerObject* GetRefObject() { return m_aRefObj.get(); }
+
+ bool IsServer() const { return m_aRefObj.is(); }
+
+ void SetRefObject( SwServerObject* pObj );
+
+ virtual void DeregisterFromDoc(SwDoc& rDoc);
+ ~DdeBookmark() override;
+
+ private:
+ tools::SvRef<SwServerObject> m_aRefObj;
+ };
+
+ class Bookmark
+ : virtual public IBookmark
+ , public DdeBookmark
+ , public ::sfx2::Metadatable
+ {
+ public:
+ Bookmark(const SwPaM& rPaM,
+ const vcl::KeyCode& rCode,
+ const OUString& rName);
+ void InitDoc(SwDoc& io_Doc, sw::mark::InsertMode eMode, SwPosition const* pSepPos) override;
+
+ void DeregisterFromDoc(SwDoc& io_rDoc) override;
+
+ auto InvalidateFrames() -> void override;
+
+ const OUString& GetShortName() const override
+ { return m_sShortName; }
+ const vcl::KeyCode& GetKeyCode() const override
+ { return m_aCode; }
+ void SetShortName(const OUString& rShortName) override
+ { m_sShortName = rShortName; }
+ void SetKeyCode(const vcl::KeyCode& rCode) override
+ { m_aCode = rCode; }
+ bool IsHidden() const override
+ { return m_bHidden; }
+ const OUString& GetHideCondition() const override
+ { return m_sHideCondition; }
+ void Hide(bool rHide) override;
+ void SetHideCondition(const OUString& rHideCondition) override;
+
+ // ::sfx2::Metadatable
+ ::sfx2::IXmlIdRegistry& GetRegistry() override;
+ bool IsInClipboard() const override;
+ bool IsInUndo() const override;
+ bool IsInContent() const override;
+ void sendLOKDeleteCallback();
+ css::uno::Reference< css::rdf::XMetadatable > MakeUnoObject() override;
+
+ private:
+ vcl::KeyCode m_aCode;
+ OUString m_sShortName;
+ bool m_bHidden;
+ OUString m_sHideCondition;
+ };
+
+ class Fieldmark
+ : virtual public IFieldmark
+ , public MarkBase
+ {
+ public:
+ Fieldmark(const SwPaM& rPaM);
+
+ OUString GetFieldname() const override
+ { return m_aFieldname; }
+ OUString GetFieldHelptext() const override
+ { return m_aFieldHelptext; }
+
+ IFieldmark::parameter_map_t* GetParameters() override
+ { return &m_vParams; }
+
+ const IFieldmark::parameter_map_t* GetParameters() const override
+ { return &m_vParams; }
+
+ void SetFieldname(const OUString& aFieldname) override
+ { m_aFieldname = aFieldname; }
+ void SetFieldHelptext(const OUString& aFieldHelptext) override
+ { m_aFieldHelptext = aFieldHelptext; }
+
+ virtual void ReleaseDoc(SwDoc&) = 0;
+
+ void SetMarkStartPos( const SwPosition& rNewStartPos );
+
+ void Invalidate() override;
+ OUString ToString() const override;
+ void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+
+ private:
+ OUString m_aFieldname;
+ OUString m_aFieldHelptext;
+ IFieldmark::parameter_map_t m_vParams;
+ };
+
+ class TextFieldmark final
+ : public Fieldmark
+ {
+ public:
+ TextFieldmark(const SwPaM& rPaM, const OUString& rName);
+ ~TextFieldmark();
+ void InitDoc(SwDoc& io_rDoc, sw::mark::InsertMode eMode, SwPosition const* pSepPos) override;
+ void ReleaseDoc(SwDoc& rDoc) override;
+
+ OUString GetContent() const override;
+ void ReplaceContent(const OUString& sNewContent) override;
+
+ private:
+ sw::DocumentContentOperationsManager* m_pDocumentContentOperationsManager;
+ };
+
+ // Non text fieldmarks have no content between the start and end marks.
+ class NonTextFieldmark
+ : public Fieldmark
+ {
+ public:
+ NonTextFieldmark(const SwPaM& rPaM);
+ void InitDoc(SwDoc& io_rDoc, sw::mark::InsertMode eMode, SwPosition const* pSepPos) override;
+ void ReleaseDoc(SwDoc& rDoc) override;
+ };
+
+ /// Fieldmark representing a checkbox form field.
+ class CheckboxFieldmark final
+ : virtual public ICheckboxFieldmark
+ , public NonTextFieldmark
+ {
+ public:
+ CheckboxFieldmark(const SwPaM& rPaM, const OUString& rName);
+ bool IsChecked() const override;
+ void SetChecked(bool checked) override;
+ OUString GetContent() const override;
+ void ReplaceContent(const OUString& sNewContent) override;
+ };
+
+ /// Fieldmark with a drop down button (e.g. this button opens the date picker for a date field)
+ class FieldmarkWithDropDownButton
+ : public NonTextFieldmark
+ {
+ public:
+ FieldmarkWithDropDownButton(const SwPaM& rPaM);
+ ~FieldmarkWithDropDownButton() override;
+
+ virtual void ShowButton(SwEditWin* pEditWin) = 0;
+ virtual void RemoveButton();
+ void LaunchPopup();
+
+ protected:
+ VclPtr<FormFieldButton> m_pButton;
+ };
+
+ /// Fieldmark representing a drop-down form field.
+ class DropDownFieldmark final
+ : virtual public IDropdownFieldmark
+ , public FieldmarkWithDropDownButton
+ {
+ public:
+ DropDownFieldmark(const SwPaM& rPaM, const OUString& rName);
+ ~DropDownFieldmark() override;
+
+ void ShowButton(SwEditWin* pEditWin) override;
+ void RemoveButton() override;
+ OUString GetContent(sal_Int32* pIndex) const override;
+ OUString GetContent() const override;
+ void AddContent(const OUString& rText, sal_Int32* pIndex = nullptr) override;
+ void DelContent(sal_Int32 nDelIndex = -1) override;
+ void ReplaceContent(const OUString* pText, sal_Int32* pIndex) override;
+ void ReplaceContent(const OUString& sNewContent) override;
+
+ // This method should be called only by the portion so we can now the portion's painting area
+ void SetPortionPaintArea(const SwRect& rPortionPaintArea);
+
+ void SendLOKShowMessage(const SfxViewShell* pViewShell);
+ static void SendLOKHideMessage(const SfxViewShell* pViewShell);
+
+ private:
+ SwRect m_aPortionPaintArea;
+ };
+
+ /// Fieldmark representing a date form field.
+ /// TODO: this was an SDT in DOCX, which is modelled suboptimally here
+ /// as a fieldmark; as it cannot contain paragraph breaks, must be
+ /// well-formed XML element, and does not have field separator, it
+ /// should be a nesting text attribute similar to SwTextMeta.
+ class DateFieldmark final
+ : virtual public IDateFieldmark
+ , public FieldmarkWithDropDownButton
+ {
+ public:
+ DateFieldmark(const SwPaM& rPaM);
+ ~DateFieldmark() override;
+
+ void InitDoc(SwDoc& io_rDoc, sw::mark::InsertMode eMode, SwPosition const* pSepPos) override;
+ void ReleaseDoc(SwDoc& rDoc) override;
+
+ void ShowButton(SwEditWin* pEditWin) override;
+
+ void SetPortionPaintAreaStart(const SwRect& rPortionPaintArea);
+ void SetPortionPaintAreaEnd(const SwRect& rPortionPaintArea);
+
+ OUString GetContent() const override;
+ void ReplaceContent(const OUString& sNewContent) override;
+
+ std::pair<bool, double> GetCurrentDate() const override;
+ void SetCurrentDate(double fDate) override;
+ OUString GetDateInStandardDateFormat(double fDate) const override;
+
+ private:
+ OUString GetDateInCurrentDateFormat(double fDate) const;
+ std::pair<bool, double> ParseCurrentDateParam() const;
+ void InvalidateCurrentDateParam();
+
+ SvNumberFormatter* m_pNumberFormatter;
+ sw::DocumentContentOperationsManager* m_pDocumentContentOperationsManager;
+ SwRect m_aPaintAreaStart;
+ SwRect m_aPaintAreaEnd;
+ };
+
+ /// return position of the CH_TXT_ATR_FIELDSEP for rMark
+ SwPosition FindFieldSep(IFieldmark const& rMark);
+
+ /// check if rPaM is valid range of new fieldmark
+ bool IsFieldmarkOverlap(SwPaM const& rPaM);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/cellfrm.hxx b/sw/source/core/inc/cellfrm.hxx
new file mode 100644
index 0000000000..796cb1d3df
--- /dev/null
+++ b/sw/source/core/inc/cellfrm.hxx
@@ -0,0 +1,78 @@
+/* -*- 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_CELLFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_CELLFRM_HXX
+
+#include "layfrm.hxx"
+
+class SwTableBox;
+struct SwCursorMoveState;
+class SwBorderAttrs;
+
+/// SwCellFrame is one table cell in the document layout.
+class SW_DLLPUBLIC SwCellFrame final : public SwLayoutFrame
+{
+ const SwTableBox* m_pTabBox;
+
+ virtual void DestroyImpl() override;
+ virtual ~SwCellFrame() override;
+
+ virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override;
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+ virtual const SwCellFrame* DynCastCellFrame() const override { return this; }
+
+public:
+ SwCellFrame( const SwTableBox &, SwFrame*, bool bInsertContent );
+
+ virtual bool GetModelPositionForViewPoint( SwPosition *, Point&, SwCursorMoveState* = nullptr, bool bTestBackground = false ) const override;
+ virtual void PaintSwFrame( vcl::RenderContext& rRenderContext, SwRect const&,
+ SwPrintData const*const pPrintData = nullptr ) const override;
+ virtual void CheckDirection( bool bVert ) override;
+
+ // #i103961#
+ virtual void Cut() override;
+
+ const SwTableBox *GetTabBox() const { return m_pTabBox; }
+
+ // used for breaking table rows:
+ SwCellFrame* GetFollowCell() const;
+ SwCellFrame* GetPreviousCell() const;
+
+ virtual bool IsLeaveUpperAllowed() const override;
+ virtual bool IsCoveredCell() const override;
+
+ // used for rowspan stuff:
+ const SwCellFrame& FindStartEndOfRowSpanCell( bool bStart ) const;
+ tools::Long GetLayoutRowSpan() const;
+
+ /// If this is a vertically merged cell, then looks up its covered cell in rRow.
+ const SwCellFrame* GetCoveredCellInRow(const SwRowFrame& rRow) const;
+
+ /// If this is a vertically merged cell, then looks up its covered cells.
+ std::vector<const SwCellFrame*> GetCoveredCells() const;
+
+ void dumpAsXmlAttributes(xmlTextWriterPtr writer) const override;
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/cntfrm.hxx b/sw/source/core/inc/cntfrm.hxx
new file mode 100644
index 0000000000..2f6c8b5ba3
--- /dev/null
+++ b/sw/source/core/inc/cntfrm.hxx
@@ -0,0 +1,147 @@
+/* -*- 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_CNTFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_CNTFRM_HXX
+
+#include <swdllapi.h>
+#include "frame.hxx"
+#include "flowfrm.hxx"
+#include <cshtyp.hxx>
+
+class SwLayoutFrame;
+class SwContentNode;
+class SwBorderAttrs;
+class SwAttrSetChg;
+class SwTextFrame;
+
+// implemented in cntfrm.cxx, used in cntfrm.cxx and crsrsh.cxx
+extern bool GetFrameInPage( const SwContentFrame*, SwWhichPage, SwPosPage, SwPaM* );
+
+enum class SwContentFrameInvFlags : sal_uInt8
+{
+ NONE = 0x00,
+ SetCompletePaint = 0x01,
+ InvalidatePos = 0x02,
+ InvalidateSize = 0x04,
+ InvalidateSectPrt = 0x08,
+ InvalidateNextPrt = 0x10,
+ InvalidatePrevPrt = 0x20,
+ InvalidateNextPos = 0x40,
+ SetNextCompletePaint = 0x80,
+};
+
+namespace o3tl {
+ template<> struct typed_flags<SwContentFrameInvFlags> : is_typed_flags<SwContentFrameInvFlags, 0xff> {};
+}
+
+/**
+ * SwContentFrame is the layout for content nodes: a common base class for text (paragraph) and
+ * non-text (e.g. graphic) frames.
+ */
+class SW_DLLPUBLIC SwContentFrame: public SwFrame, public SwFlowFrame
+{
+ friend void MakeNxt( SwFrame *pFrame, SwFrame *pNxt ); // calls MakePrtArea
+
+ // parameter <bObjsInNewUpper> indicates that objects exist in remaining
+ // area of new upper
+ bool WouldFit_( SwTwips nSpace,
+ SwLayoutFrame *pNewUpper,
+ bool bTstMove,
+ const bool bObjsInNewUpper );
+
+ virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
+
+ void UpdateAttr_( const SfxPoolItem*, const SfxPoolItem*, SwContentFrameInvFlags &,
+ SwAttrSetChg *pa = nullptr, SwAttrSetChg *pb = nullptr );
+
+ virtual bool ShouldBwdMoved( SwLayoutFrame *pNewUpper, bool& ) override;
+
+ const SwContentFrame* ImplGetNextContentFrame( bool bFwd ) const;
+
+protected:
+ void MakePrtArea( const SwBorderAttrs & );
+
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+ virtual SwTwips ShrinkFrame( SwTwips, bool bTst = false, bool bInfo = false ) override;
+ virtual SwTwips GrowFrame ( SwTwips, bool bTst = false, bool bInfo = false ) override;
+
+ SwContentFrame( SwContentNode * const, SwFrame* );
+
+ virtual void DestroyImpl() override;
+ virtual ~SwContentFrame() override;
+
+public:
+
+ virtual void Cut() override;
+ virtual void Paste( SwFrame* pParent, SwFrame* pSibling = nullptr ) override;
+
+ inline const SwContentFrame *GetFollow() const;
+ inline SwContentFrame *GetFollow();
+ SwTextFrame* FindMaster() const;
+
+ // layout dependent cursor travelling
+ virtual bool LeftMargin(SwPaM *) const = 0;
+ virtual bool RightMargin(SwPaM *, bool bAPI = false) const = 0;
+ virtual bool UnitUp( SwPaM *, const SwTwips nOffset,
+ bool bSetInReadOnly ) const;
+ virtual bool UnitDown( SwPaM *, const SwTwips nOffset,
+ bool bSetInReadOnly ) const;
+
+ // nMaxHeight is the required height
+ // bSplit indicates that the paragraph has to be split
+ // bTst indicates that we are currently doing a test formatting
+ virtual bool WouldFit(SwTwips &nMaxHeight, bool &bSplit, bool bTst, bool);
+
+ bool MoveFootnoteCntFwd( bool, SwFootnoteBossFrame* ); // called by MoveFwd if content
+
+ inline SwContentFrame* GetNextContentFrame() const;
+ inline SwContentFrame* GetPrevContentFrame() const;
+ static bool CalcLowers(SwLayoutFrame & rLay, SwLayoutFrame const& rDontLeave,
+ tools::Long nBottom, bool bSkipRowSpanCells);
+};
+
+inline SwContentFrame* SwContentFrame::GetNextContentFrame() const
+{
+ if ( GetNext() && GetNext()->IsContentFrame() )
+ return const_cast<SwContentFrame*>(static_cast<const SwContentFrame*>(GetNext()));
+ else
+ return const_cast<SwContentFrame*>(ImplGetNextContentFrame( true ));
+}
+
+inline SwContentFrame* SwContentFrame::GetPrevContentFrame() const
+{
+ if ( GetPrev() && GetPrev()->IsContentFrame() )
+ return const_cast<SwContentFrame*>(static_cast<const SwContentFrame*>(GetPrev()));
+ else
+ return const_cast<SwContentFrame*>(ImplGetNextContentFrame( false ));
+}
+
+inline const SwContentFrame *SwContentFrame::GetFollow() const
+{
+ return static_cast<const SwContentFrame*>(SwFlowFrame::GetFollow());
+}
+inline SwContentFrame *SwContentFrame::GetFollow()
+{
+ return static_cast<SwContentFrame*>(SwFlowFrame::GetFollow());
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/colfrm.hxx b/sw/source/core/inc/colfrm.hxx
new file mode 100644
index 0000000000..a223dfa803
--- /dev/null
+++ b/sw/source/core/inc/colfrm.hxx
@@ -0,0 +1,42 @@
+/* -*- 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_COLFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_COLFRM_HXX
+
+#include "ftnboss.hxx"
+
+class SwColumnFrame final : public SwFootnoteBossFrame
+{
+private:
+ virtual void DestroyImpl() override;
+ virtual ~SwColumnFrame() override;
+
+public:
+ SwColumnFrame(SwFrameFormat*, SwFrame*);
+
+ virtual void PaintBreak() const override;
+ virtual void PaintSubsidiaryLines(const SwPageFrame*, const SwRect&) const override;
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_COLFRM_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/contentcontrolbutton.hxx b/sw/source/core/inc/contentcontrolbutton.hxx
new file mode 100644
index 0000000000..28b9e49c30
--- /dev/null
+++ b/sw/source/core/inc/contentcontrolbutton.hxx
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#pragma once
+
+#include <vcl/ctrl.hxx>
+#include <vcl/weld.hxx>
+#include <swrect.hxx>
+
+class SwEditWin;
+class SwContentControl;
+
+/// This button is shown when the cursor is inside a content control with drop-down capability.
+class SwContentControlButton : public Control
+{
+public:
+ SwContentControlButton(SwEditWin* pEditWin, std::shared_ptr<SwContentControl> pContentControl);
+ virtual ~SwContentControlButton() override;
+ virtual void dispose() override;
+
+ void CalcPosAndSize(const SwRect& rPortionPaintArea);
+ void SetRTL(bool bRTL) { m_bRTL = bRTL; }
+
+ virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
+ DECL_LINK(PopupModeEndHdl, weld::Popover&, void);
+ /// Shared MouseButtonDown() and KeyInput() code.
+ void StartPopup();
+
+ virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
+ virtual WindowHitTest ImplHitTest(const Point& rFramePos) override;
+
+ virtual void LaunchPopup();
+ virtual void DestroyPopup();
+
+ const std::shared_ptr<SwContentControl>& GetContentControl() const { return m_pContentControl; }
+
+private:
+ tools::Rectangle m_aFramePixel;
+
+protected:
+ std::shared_ptr<SwContentControl> m_pContentControl;
+ std::unique_ptr<weld::Builder> m_xPopupBuilder;
+ std::unique_ptr<weld::Popover> m_xPopup;
+ bool m_bRTL = false;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/crossrefbookmark.hxx b/sw/source/core/inc/crossrefbookmark.hxx
new file mode 100644
index 0000000000..3ee770e8d6
--- /dev/null
+++ b/sw/source/core/inc/crossrefbookmark.hxx
@@ -0,0 +1,88 @@
+/* -*- 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_CROSSREFBOOKMARK_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_CROSSREFBOOKMARK_HXX
+
+#include <sal/config.h>
+
+#include <string_view>
+
+#include "bookmark.hxx"
+#include <rtl/ustring.hxx>
+#include <vcl/keycod.hxx>
+
+namespace sw::mark {
+ class CrossRefBookmark
+ : public Bookmark
+ {
+ public:
+ CrossRefBookmark(const SwPaM& rPaM,
+ const vcl::KeyCode& rCode,
+ const OUString& rName,
+ std::u16string_view rPrefix);
+
+ // getters
+ virtual SwPosition& GetOtherMarkPos() const override;
+ virtual SwPosition& GetMarkStart() const override
+ { return const_cast<SwPosition&>(*m_oPos1); }
+ virtual SwPosition& GetMarkEnd() const override
+ { return const_cast<SwPosition&>(*m_oPos1); }
+ virtual bool IsExpanded() const override
+ { return false; }
+
+ virtual void SetMarkPos(const SwPosition& rNewPos) override;
+ virtual void SetOtherMarkPos(const SwPosition&) override
+ {
+ assert(false &&
+ "<CrossRefBookmark::SetOtherMarkPos(..)>"
+ " - misusage of CrossRefBookmark: other bookmark position isn't allowed to be set." );
+ }
+ virtual void ClearOtherMarkPos() override
+ {
+ assert(false &&
+ "<SwCrossRefBookmark::ClearOtherMarkPos(..)>"
+ " - misusage of CrossRefBookmark: other bookmark position isn't allowed to be set or cleared." );
+ }
+ };
+
+ class CrossRefHeadingBookmark final
+ : public CrossRefBookmark
+ {
+ public:
+ CrossRefHeadingBookmark(const SwPaM& rPaM,
+ const vcl::KeyCode& rCode,
+ const OUString& rName);
+ static bool IsLegalName(std::u16string_view rName);
+ };
+
+ class CrossRefNumItemBookmark final
+ : public CrossRefBookmark
+ {
+ public:
+ CrossRefNumItemBookmark(const SwPaM& rPaM,
+ const vcl::KeyCode& rCode,
+ const OUString& rName);
+ static bool IsLegalName(std::u16string_view rName);
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/datecontentcontrolbutton.hxx b/sw/source/core/inc/datecontentcontrolbutton.hxx
new file mode 100644
index 0000000000..48b08f2db9
--- /dev/null
+++ b/sw/source/core/inc/datecontentcontrolbutton.hxx
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#pragma once
+
+#include "contentcontrolbutton.hxx"
+
+class SwEditWin;
+class SvNumberFormatter;
+class SwContentControl;
+
+/**
+ * This button is shown when the cursor is on a date content control. The user can select a date
+ * from a date picker.
+ */
+class SwDateContentControlButton final : public SwContentControlButton
+{
+private:
+ SvNumberFormatter* m_pNumberFormatter;
+
+ std::unique_ptr<weld::Calendar> m_xCalendar;
+
+ DECL_LINK(SelectHandler, weld::Calendar&, void);
+
+public:
+ SwDateContentControlButton(SwEditWin* pEditWin,
+ const std::shared_ptr<SwContentControl>& pContentControl,
+ SvNumberFormatter* pNumberFormatter);
+ ~SwDateContentControlButton() override;
+
+ void LaunchPopup() override;
+ void DestroyPopup() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/dbg_lay.hxx b/sw/source/core/inc/dbg_lay.hxx
new file mode 100644
index 0000000000..d340153abc
--- /dev/null
+++ b/sw/source/core/inc/dbg_lay.hxx
@@ -0,0 +1,105 @@
+/* -*- 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_DBG_LAY_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DBG_LAY_HXX
+
+#include <o3tl/typed_flags_set.hxx>
+#include <memory>
+
+enum class PROT {
+ FileInit = 0x00000000,
+ Init = 0x00000001,
+ MakeAll = 0x00000002,
+ MoveFwd = 0x00000004,
+ MoveBack = 0x00000008,
+ Grow = 0x00000010,
+ Shrink = 0x00000020,
+ GrowTest = 0x00000040,
+ ShrinkTest = 0x00000080,
+ Size = 0x00000100,
+ PrintArea = 0x00000200,
+ AdjustN = 0x00000800,
+ Section = 0x00001000,
+ Cut = 0x00002000,
+ Paste = 0x00004000,
+ Leaf = 0x00008000,
+ TestFormat = 0x00010000,
+ FrmChanges = 0x00020000,
+};
+namespace o3tl {
+ template<> struct typed_flags<PROT> : is_typed_flags<PROT, 0x0003fbff> {};
+}
+
+enum class DbgAction {
+ NONE,
+ Start, End,
+ CreateMaster, CreateFollow,
+ DelMaster, DelFollow,
+ Merge,
+ NextSect, PrevSect
+};
+
+#ifdef DBG_UTIL
+
+class SwImplProtocol;
+class SwFrame;
+class SwImplEnterLeave;
+
+class SwProtocol
+{
+ static PROT s_nRecord;
+ static SwImplProtocol* s_pImpl;
+ static bool Start() { return bool( PROT::Init & s_nRecord ); }
+
+public:
+ static PROT Record() { return s_nRecord; }
+ static void SetRecord( PROT nNew ) { s_nRecord = nNew; }
+ static bool Record( PROT nFunc ) { return bool(( nFunc | PROT::Init ) & s_nRecord); }
+ static void Record( const SwFrame* pFrame, PROT nFunction, DbgAction nAction, void* pParam );
+ static void Init();
+ static void Stop();
+};
+
+class SwEnterLeave
+{
+ std::unique_ptr<SwImplEnterLeave> pImpl;
+public:
+ SwEnterLeave( const SwFrame* pFrame, PROT nFunc, DbgAction nAct, void* pPar );
+ ~SwEnterLeave();
+};
+
+#define PROTOCOL( pFrame, nFunc, nAct, pPar ) { if( SwProtocol::Record( nFunc ) )\
+ SwProtocol::Record( pFrame, nFunc, nAct, pPar ); }
+#define PROTOCOL_INIT SwProtocol::Init();
+#define PROTOCOL_STOP SwProtocol::Stop();
+#define PROTOCOL_ENTER( pFrame, nFunc, nAct, pPar ) SwEnterLeave aEnter( pFrame, nFunc, nAct, pPar );
+
+#else
+
+#define PROTOCOL( pFrame, nFunc, nAct, pPar )
+#define PROTOCOL_INIT
+#define PROTOCOL_STOP
+#define PROTOCOL_ENTER( pFrame, nFunc, nAct, pPar )
+
+#endif
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/dflyobj.hxx b/sw/source/core/inc/dflyobj.hxx
new file mode 100644
index 0000000000..701d633289
--- /dev/null
+++ b/sw/source/core/inc/dflyobj.hxx
@@ -0,0 +1,154 @@
+/* -*- 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_DFLYOBJ_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DFLYOBJ_HXX
+
+#include <svx/svdovirt.hxx>
+#include <svx/svdobj.hxx>
+
+#include <swdllapi.h>
+
+namespace drawinglayer::geometry { class ViewInformation2D; }
+
+class SwFlyFrame;
+class SwFrameFormat;
+
+// DrawObjects for Flys
+class SwFlyDrawObj final : public SdrObject
+{
+private:
+ virtual std::unique_ptr<sdr::properties::BaseProperties> CreateObjectSpecificProperties() override;
+ bool mbIsTextBox;
+
+ // #i95264# SwFlyDrawObj needs an own VC since createViewIndependentPrimitive2DSequence()
+ // is called when RecalcBoundRect() is used
+ virtual std::unique_ptr<sdr::contact::ViewContact> CreateObjectSpecificViewContact() override;
+
+ // protected destructor
+ virtual ~SwFlyDrawObj() override;
+
+public:
+ SwFlyDrawObj(SdrModel& rSdrModel);
+
+ // for instantiation of this class while loading (via factory
+ virtual rtl::Reference<SdrObject> CloneSdrObject(SdrModel& rTargetModel) const override;
+
+ virtual SdrInventor GetObjInventor() const override;
+ virtual SdrObjKind GetObjIdentifier() const override;
+ virtual bool IsTextBox() const override { return mbIsTextBox; }
+ void SetTextBox(bool bIsTextBox) { mbIsTextBox = bIsTextBox; }
+
+ virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sinAngle, double cosAngle) override;
+};
+
+// virtual objects for Flys
+// Flys will always be shown with virtual objects. By doing that, they can be
+// shown multiple times if needed (header/footer).
+// For example, if an SwFlyFrameFormat is anchored in a header, then all pages will have a separate
+// SwVirtFlyDrawObj in their headers.
+class SW_DLLPUBLIC SwVirtFlyDrawObj final : public SdrVirtObj
+{
+private:
+ SwFlyFrame *m_pFlyFrame;
+
+ // RotGrfFlyFrame: Helper to access the rotation angle (in 10th degrees, left-handed)
+ // of a GraphicFrame
+ Degree10 getPossibleRotationFromFraphicFrame(Size& rSize) const;
+
+ // AW: Need own sdr::contact::ViewContact since AnchorPos from parent is
+ // not used but something own (top left of new SnapRect minus top left
+ // of original SnapRect)
+ virtual std::unique_ptr<sdr::contact::ViewContact> CreateObjectSpecificViewContact() override;
+
+ // protected destructor
+ virtual ~SwVirtFlyDrawObj() override;
+
+public:
+ // for paints triggered form ExecutePrimitive
+ void wrap_DoPaintObject(
+ drawinglayer::geometry::ViewInformation2D const&) const;
+
+ // for simple access to inner and outer bounds
+ basegfx::B2DRange getOuterBound() const;
+ basegfx::B2DRange getInnerBound() const;
+
+ // RotGrfFlyFrame: Check if this is a SwGrfNode
+ bool ContainsSwGrfNode() const;
+
+ SwVirtFlyDrawObj(
+ SdrModel& rSdrModel,
+ SdrObject& rNew,
+ SwFlyFrame* pFly);
+
+ // override method of base class SdrVirtObj
+ virtual void TakeObjInfo( SdrObjTransformInfoRec& rInfo ) const override;
+
+ // we treat the size calculation completely on ourself here
+ virtual const tools::Rectangle& GetCurrentBoundRect() const override;
+ virtual const tools::Rectangle& GetLastBoundRect() const override;
+ virtual Degree100 GetRotateAngle() const override;
+ virtual void RecalcBoundRect() override;
+ virtual void RecalcSnapRect() override;
+ virtual const tools::Rectangle& GetSnapRect() const override;
+ virtual void SetSnapRect(const tools::Rectangle& rRect) override;
+ virtual void NbcSetSnapRect(const tools::Rectangle& rRect) override;
+ virtual const tools::Rectangle& GetLogicRect() const override;
+ virtual void SetLogicRect(const tools::Rectangle& rRect) override;
+ virtual void NbcSetLogicRect(const tools::Rectangle& rRect) override;
+ virtual ::basegfx::B2DPolyPolygon TakeXorPoly() const override;
+ virtual void NbcMove (const Size& rSiz) override;
+ virtual void NbcResize(const Point& rRef, const Fraction& xFact,
+ const Fraction& yFact) override;
+ virtual void NbcCrop(const basegfx::B2DPoint& rRef, double fxFact, double fyFact) override;
+ virtual void Move (const Size& rSiz) override;
+ virtual void Resize(const Point& rRef, const Fraction& xFact,
+ const Fraction& yFact, bool bUnsetRelative = true) override;
+ virtual void Crop(const basegfx::B2DPoint& rRef, double fxFact, double fyFact) override;
+ virtual void addCropHandles(SdrHdlList& rTarget) const override;
+ virtual void Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
+
+
+ // FullDrag support
+ virtual rtl::Reference<SdrObject> getFullDragClone() const override;
+
+ const SwFrameFormat *GetFormat() const;
+ SwFrameFormat *GetFormat();
+
+ // methods to get pointers for the Fly
+ SwFlyFrame* GetFlyFrame() { return m_pFlyFrame; }
+ const SwFlyFrame* GetFlyFrame() const { return m_pFlyFrame; }
+
+ void SetRect() const;
+
+ // if a URL is attached to a graphic than this is a macro object
+ virtual bool HasMacro() const override;
+ virtual SdrObject* CheckMacroHit (const SdrObjMacroHitRec& rRec) const override;
+ virtual PointerStyle GetMacroPointer (const SdrObjMacroHitRec& rRec) const override;
+
+ // RotGrfFlyFrame: If true, this SdrObject supports only limited rotation.
+ virtual bool HasLimitedRotation() const override;
+
+ virtual bool IsTextBox() const override;
+ void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/dialoghelp.hxx b/sw/source/core/inc/dialoghelp.hxx
new file mode 100644
index 0000000000..a549523658
--- /dev/null
+++ b/sw/source/core/inc/dialoghelp.hxx
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#ifndef INCLUDED_SW_SOURCE_CORE_INC_DIALOGHELP_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DIALOGHELP_HXX
+
+class SwDoc;
+class SwDocShell;
+class SfxFrame;
+class SfxMedium;
+
+namespace weld
+{
+class Window;
+}
+
+weld::Window* GetFrameWeld(const SfxFrame* pFrame);
+weld::Window* GetFrameWeld(const SfxMedium* pMedium);
+weld::Window* GetFrameWeld(SwDocShell* pDocSh);
+weld::Window* GetFrameWeld(SwDoc* pDoc);
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sw/source/core/inc/docedt.hxx b/sw/source/core/inc/docedt.hxx
new file mode 100644
index 0000000000..036d516d99
--- /dev/null
+++ b/sw/source/core/inc/docedt.hxx
@@ -0,0 +1,31 @@
+/* -*- 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_DOCEDT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCEDT_HXX
+
+class SwPaM;
+
+bool sw_JoinText(SwPaM& rPam, bool bJoinPrev);
+
+void sw_GetJoinFlags(SwPaM& rPam, bool& rJoinText, bool& rJoinPrev);
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/docfld.hxx b/sw/source/core/inc/docfld.hxx
new file mode 100644
index 0000000000..f09116978f
--- /dev/null
+++ b/sw/source/core/inc/docfld.hxx
@@ -0,0 +1,188 @@
+/* -*- 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_DOCFLD_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCFLD_HXX
+
+#include <calc.hxx>
+#include <doc.hxx>
+#include <IDocumentTimerAccess.hxx>
+#include <IMark.hxx>
+#include <o3tl/sorted_vector.hxx>
+#include <memory>
+#include <optional>
+
+class SwTextField;
+class SwContentIndex;
+class SwNodeIndex;
+class SwContentFrame;
+class SwSectionNode;
+class SwSection;
+class SwTextTOXMark;
+class SwTableBox;
+class SwTextINetFormat;
+class SwFlyFrameFormat;
+class SwNode;
+struct SwPosition;
+enum class SwFieldIds : sal_uInt16;
+
+// Update expression fields
+class SetGetExpField
+{
+ // TODO: in case of multiple layouts, storing this only once isn't going to work (although already a problem for cached field value)
+ sal_uInt16 m_nPageNumber = 0;
+ SwNodeOffset m_nNode;
+ union {
+ const SwTextField* pTextField;
+ const SwSection* pSection;
+ const SwPosition* pPos;
+ const SwTextTOXMark* pTextTOX;
+ const SwTableBox* pTBox;
+ const SwTextINetFormat* pTextINet;
+ const SwFlyFrameFormat* pFlyFormat;
+ ::sw::mark::IBookmark const* pBookmark;
+ } m_CNTNT;
+ sal_Int32 m_nContent;
+ enum SetGetExpFieldType
+ {
+ TEXTFIELD, TEXTTOXMARK, SECTIONNODE, BOOKMARK, CRSRPOS, TABLEBOX,
+ TEXTINET, FLYFRAME
+ } m_eSetGetExpFieldType;
+
+public:
+ SetGetExpField( const SwNode& rNd, const SwTextField* pField = nullptr,
+ std::optional<sal_Int32> oContentIdx = std::nullopt,
+ sal_uInt16 nPageNumber = 0);
+
+ SetGetExpField( const SwNode& rNd, const SwTextINetFormat& rINet );
+
+ SetGetExpField( const SwSectionNode& rSectNode,
+ const SwPosition* pPos = nullptr,
+ sal_uInt16 nPageNumber = 0);
+
+ SetGetExpField( ::sw::mark::IBookmark const& rBookmark,
+ SwPosition const* pPos = nullptr,
+ sal_uInt16 nPageNumber = 0);
+
+ SetGetExpField( const SwTableBox& rTableBox );
+
+ SetGetExpField( const SwNode& rNd, const SwTextTOXMark& rTOX );
+
+ SetGetExpField( const SwPosition& rPos );
+
+ SetGetExpField( const SwFlyFrameFormat& rFlyFormat, const SwPosition* pPos );
+
+ bool operator==( const SetGetExpField& rField ) const;
+ bool operator<( const SetGetExpField& rField ) const;
+
+ const SwTextField* GetTextField() const
+ { return TEXTFIELD == m_eSetGetExpFieldType ? m_CNTNT.pTextField : nullptr; }
+ const SwSection* GetSection() const
+ { return SECTIONNODE == m_eSetGetExpFieldType ? m_CNTNT.pSection : nullptr; }
+ ::sw::mark::IBookmark const* GetBookmark() const
+ { return BOOKMARK == m_eSetGetExpFieldType ? m_CNTNT.pBookmark : nullptr; }
+ const SwTextINetFormat* GetINetFormat() const
+ { return TEXTINET == m_eSetGetExpFieldType ? m_CNTNT.pTextINet : nullptr; }
+ const SwFlyFrameFormat* GetFlyFormat() const
+ { return FLYFRAME == m_eSetGetExpFieldType ? m_CNTNT.pFlyFormat : nullptr; }
+
+ SwNodeOffset GetNode() const { return m_nNode; }
+ sal_Int32 GetContent() const { return m_nContent; }
+ const void* GetPointer() const { return m_CNTNT.pTextField; }
+
+ void GetPosOfContent( SwPosition& rPos ) const;
+
+ const SwNode* GetNodeFromContent() const;
+ sal_Int32 GetCntPosFromContent() const;
+
+ void SetBodyPos( const SwContentFrame& rFrame );
+};
+
+class SetGetExpFields : public o3tl::sorted_vector<std::unique_ptr<SetGetExpField>, o3tl::less_uniqueptr_to<SetGetExpField> >
+{
+};
+
+
+//struct SwCalcFieldType final : public SwHash
+//{
+// const SwFieldType* pFieldType;
+//
+// SwCalcFieldType( const OUString& rStr, const SwFieldType* pFieldTyp )
+// : SwHash( rStr ), pFieldType( pFieldTyp )
+// {}
+//};
+
+// search for the string that was saved under rName in the hash table
+OUString LookString( std::unordered_map<OUString,OUString> const & rTable, const OUString& rName );
+
+const int GETFLD_ALL = 3; // combine flags via OR
+const int GETFLD_CALC = 1;
+const int GETFLD_EXPAND = 2;
+
+class SwDocUpdateField
+{
+ std::unique_ptr<SetGetExpFields> m_pFieldSortList; ///< current field list for calculation
+ std::unordered_multimap<OUString, const SwFieldType*> m_FieldTypeTable;
+
+ SwNodeOffset m_nNodes; ///< to check if the node count changed
+ int m_nFieldListGetMode;
+ SwDoc& m_rDoc;
+
+ bool m_bInUpdateFields : 1; ///< currently in an UpdateFields call
+ bool m_bFieldsDirty : 1; ///< some fields are invalid
+
+ void MakeFieldList_( SwDoc& pDoc, int eGetMode );
+ void GetBodyNode( const SwTextField& , SwFieldIds nFieldWhich );
+ template<typename T>
+ void GetBodyNodeGeneric(SwNode const& rNode, T const&);
+
+public:
+ SwDocUpdateField(SwDoc& rDocument);
+ ~SwDocUpdateField();
+
+ const SetGetExpFields* GetSortList() const { return m_pFieldSortList.get(); }
+
+ void MakeFieldList( SwDoc& rDoc, bool bAll, int eGetMode );
+
+ void InsDelFieldInFieldLst( bool bIns, const SwTextField& rField );
+
+ void InsertFieldType( const SwFieldType& rType );
+ void RemoveFieldType( const SwFieldType& rType );
+
+ bool IsInUpdateFields() const { return m_bInUpdateFields; }
+ void SetInUpdateFields( bool b ) { m_bInUpdateFields = b; }
+
+ bool IsFieldsDirty() const { return m_bFieldsDirty; }
+ void SetFieldsDirty( bool b )
+ {
+ m_bFieldsDirty = b;
+
+ if (b)
+ {
+ m_rDoc.getIDocumentTimerAccess().StartIdling();
+ }
+ }
+
+ std::unordered_multimap<OUString, const SwFieldType*> const& GetFieldTypeTable() const { return m_FieldTypeTable; }
+ std::unordered_multimap<OUString, const SwFieldType*> & GetFieldTypeTable() { return m_FieldTypeTable; }
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/docredln.hxx b/sw/source/core/inc/docredln.hxx
new file mode 100644
index 0000000000..f60cb930dc
--- /dev/null
+++ b/sw/source/core/inc/docredln.hxx
@@ -0,0 +1,35 @@
+/* -*- 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_DOCREDLN_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCREDLN_HXX
+
+#include <sal/config.h>
+
+#if defined DBG_UTIL
+
+class SwDoc;
+
+void sw_DebugRedline(const SwDoc* pDoc);
+
+#endif
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/docsort.hxx b/sw/source/core/inc/docsort.hxx
new file mode 100644
index 0000000000..0aad16da4a
--- /dev/null
+++ b/sw/source/core/inc/docsort.hxx
@@ -0,0 +1,152 @@
+/* -*- 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_DOCSORT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCSORT_HXX
+
+#include <ndindex.hxx>
+
+#include <memory>
+#include <vector>
+
+class SwDoc;
+class SwTableBox;
+class SwUndoSort;
+class FlatFndBox;
+struct SwSortOptions;
+class FndBox_;
+class FndLine_;
+class CollatorWrapper;
+class LocaleDataWrapper;
+namespace com::sun::star::lang { struct Locale; }
+
+class SwMovedBoxes
+{
+private:
+ std::vector<const SwTableBox*> mBoxes;
+
+public:
+ void push_back(const SwTableBox* &rpTableBox) {mBoxes.push_back(rpTableBox);}
+
+ sal_uInt16 GetPos(const SwTableBox* pTableBox) const;
+};
+
+// Functions for moving boxes
+void MoveCol(SwDoc* pDoc, const FlatFndBox& rBox,
+ sal_uInt16 nS, sal_uInt16 nT, SwMovedBoxes& rMovedList, SwUndoSort* pUD);
+void MoveRow(SwDoc* pDoc, const FlatFndBox& rBox,
+ sal_uInt16 nS, sal_uInt16 nT, SwMovedBoxes& rMovedList, SwUndoSort* pUD);
+void MoveCell(SwDoc* pDoc, const SwTableBox* pSource,
+ const SwTableBox* pTar, bool bMovedBefore, SwUndoSort* pUD=nullptr);
+
+// Elements for sorting text and table content
+struct SwSortElement
+{
+ static SwSortOptions* pOptions;
+ static SwDoc* pDoc;
+ static const FlatFndBox* pBox;
+ static CollatorWrapper* pSortCollator;
+ static css::lang::Locale* pLocale;
+ static std::optional<OUString> xLastAlgorithm;
+ static LocaleDataWrapper* pLclData;
+
+ static void Init( SwDoc*, const SwSortOptions& rOpt, FlatFndBox const * = nullptr );
+ static void Finit();
+
+ SwSortElement() = default;
+ SwSortElement(SwSortElement const &) = default;
+ SwSortElement(SwSortElement &&) = default;
+ SwSortElement & operator =(SwSortElement const &) = default;
+ SwSortElement & operator =(SwSortElement &&) = default;
+
+ virtual ~SwSortElement();
+
+ virtual OUString GetKey(sal_uInt16 nKey ) const = 0;
+ virtual double GetValue(sal_uInt16 nKey ) const;
+
+ bool operator<(const SwSortElement& ) const;
+
+ static double StrToDouble(std::u16string_view rStr);
+private:
+ int keycompare(const SwSortElement& rCmp, sal_uInt16 nKey) const;
+};
+
+// sort text
+struct SwSortTextElement final : public SwSortElement
+{
+ SwNodeOffset nOrg;
+ SwNodeIndex aPos;
+
+ SwSortTextElement( const SwNodeIndex& rPos );
+
+ virtual OUString GetKey( sal_uInt16 nKey ) const override;
+};
+
+// sort table
+struct SwSortBoxElement final : public SwSortElement
+{
+ sal_uInt16 nRow;
+
+ SwSortBoxElement( sal_uInt16 nRC );
+
+ virtual OUString GetKey( sal_uInt16 nKey ) const override;
+ virtual double GetValue( sal_uInt16 nKey ) const override;
+};
+
+// two-dimensional array of FndBoxes
+class FlatFndBox
+{
+public:
+ FlatFndBox(SwDoc* pDocPtr, const FndBox_& rBox);
+ ~FlatFndBox();
+
+ bool IsSymmetric() const { return m_bSym; }
+ sal_uInt16 GetRows() const { return m_nRows; }
+ sal_uInt16 GetCols() const { return m_nCols; }
+
+ const FndBox_* GetBox(sal_uInt16 nCol, sal_uInt16 nRow) const;
+
+ inline bool HasItemSets() const;
+ const SfxItemSet* GetItemSet(sal_uInt16 nCol, sal_uInt16 nRow) const;
+
+private:
+ bool CheckLineSymmetry(const FndBox_& rBox);
+ bool CheckBoxSymmetry(const FndLine_& rLn);
+ sal_uInt16 GetColCount(const FndBox_& rBox);
+ sal_uInt16 GetRowCount(const FndBox_& rBox);
+ void FillFlat(const FndBox_&, bool bLastBox=false);
+
+ SwDoc* m_pDoc;
+ std::unique_ptr<FndBox_ const *[]> m_pArr;
+ /// using optional because SfxItemSet has no default constructor
+ std::vector<std::optional<SfxItemSet>> m_vItemSets;
+
+ sal_uInt16 m_nRows;
+ sal_uInt16 m_nCols;
+ sal_uInt16 m_nRow;
+ sal_uInt16 m_nCol;
+
+ bool m_bSym;
+};
+
+inline bool FlatFndBox::HasItemSets() const { return !m_vItemSets.empty(); }
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/doctxm.hxx b/sw/source/core/inc/doctxm.hxx
new file mode 100644
index 0000000000..d33809d5d8
--- /dev/null
+++ b/sw/source/core/inc/doctxm.hxx
@@ -0,0 +1,114 @@
+/* -*- 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_DOCTXM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DOCTXM_HXX
+
+#include <tools/gen.hxx>
+#include <hints.hxx>
+#include <tox.hxx>
+#include <section.hxx>
+
+class SwTOXInternational;
+class SwPageDesc;
+class SwTextNode;
+class SwTextFormatColl;
+struct SwPosition;
+struct SwTOXSortTabBase;
+
+class SwTOXBaseSection final : public SwTOXBase, public SwSection
+{
+ std::vector<std::unique_ptr<SwTOXSortTabBase>> m_aSortArr;
+
+ void UpdateMarks( const SwTOXInternational& rIntl,
+ const SwTextNode* pOwnChapterNode,
+ SwRootFrame const* pLayout );
+ void UpdateOutline( const SwTextNode* pOwnChapterNode,
+ SwRootFrame const* pLayout );
+ void UpdateTemplate( const SwTextNode* pOwnChapterNode,
+ SwRootFrame const* pLayout );
+ void UpdateContent( SwTOXElement eType,
+ const SwTextNode* pOwnChapterNode,
+ SwRootFrame const* pLayout );
+ void UpdateTable( const SwTextNode* pOwnChapterNode,
+ SwRootFrame const* pLayout );
+ void UpdateSequence( const SwTextNode* pOwnChapterNode,
+ SwRootFrame const* pLayout );
+ void UpdateAuthorities( const SwTOXInternational& rIntl,
+ SwRootFrame const* pLayout );
+
+ // insert sorted into array for creation
+ void InsertSorted(std::unique_ptr<SwTOXSortTabBase> pBase);
+
+ // insert alpha delimiter at creation
+ void InsertAlphaDelimiter( const SwTOXInternational& rIntl );
+
+ // replace page num placeholder with actual page number
+ void UpdatePageNum_( SwTextNode* pNd,
+ const std::vector<sal_uInt16>& rNums,
+ const std::vector<SwPageDesc*>& rDescs,
+ const std::vector<sal_uInt16>* pMainEntryNums,
+ const SwTOXInternational& rIntl );
+
+ // get section for entering keywords
+ Range GetKeyRange( const OUString& rStr, const OUString& rStrReading,
+ const SwTOXSortTabBase& rNew, sal_uInt16 nLevel,
+ const Range& rRange );
+
+ // return text collection via name/ from format pool
+ SwTextFormatColl* GetTextFormatColl( sal_uInt16 nLevel );
+ virtual void SwClientNotify(const SwModify& rModify, const SfxHint& rHint) override;
+
+public:
+ SwTOXBaseSection(SwTOXBase const& rBase, SwSectionFormat & rFormat);
+ virtual ~SwTOXBaseSection() override;
+
+ // <_bNewTOX> : distinguish between the creation of a new table-of-content
+ // (true) or an update of a table-of-content (false)
+ void Update( const SfxItemSet* pAttr = nullptr,
+ SwRootFrame const* pLayout = nullptr,
+ const bool _bNewTOX = false );
+ void UpdatePageNum(); // insert page numbering
+
+ bool SetPosAtStartEnd( SwPosition& rPos ) const;
+ bool IsVisible() const override
+ {
+ return GetFormat() && GetFormat()->IsVisible();
+ }
+};
+
+struct SwDefTOXBase_Impl
+{
+ std::unique_ptr<SwTOXBase> pContBase;
+ std::unique_ptr<SwTOXBase> pIdxBase;
+ std::unique_ptr<SwTOXBase> pUserBase;
+ std::unique_ptr<SwTOXBase> pTableBase;
+ std::unique_ptr<SwTOXBase> pObjBase;
+ std::unique_ptr<SwTOXBase> pIllBase;
+ std::unique_ptr<SwTOXBase> pAuthBase;
+ std::unique_ptr<SwTOXBase> pBiblioBase;
+
+ SwDefTOXBase_Impl()
+ {
+ }
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/drawfont.hxx b/sw/source/core/inc/drawfont.hxx
new file mode 100644
index 0000000000..fe6a442647
--- /dev/null
+++ b/sw/source/core/inc/drawfont.hxx
@@ -0,0 +1,639 @@
+/* -*- 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_DRAWFONT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DRAWFONT_HXX
+
+#include <osl/diagnose.h>
+#include <vcl/vclptr.hxx>
+#include <vcl/outdev.hxx>
+#include <swtypes.hxx>
+#include "TextFrameIndex.hxx"
+#include <swdllapi.h>
+
+class SwTextFrame;
+class SwViewShell;
+class SwScriptInfo;
+namespace sw { class WrongListIterator; }
+class SwFont;
+namespace vcl {
+ class Font;
+ namespace text {
+ class TextLayoutCache;
+ }
+ typedef OutputDevice RenderContext;
+}
+class SwUnderlineFont;
+
+// encapsulates information for drawing text
+class SW_DLLPUBLIC SwDrawTextInfo
+{
+ const SwTextFrame* m_pFrame;
+ VclPtr<OutputDevice> m_pOut;
+ SwViewShell const * m_pSh;
+ const SwScriptInfo* m_pScriptInfo;
+ Point m_aPos;
+ vcl::text::TextLayoutCache const* m_pCachedVclData;
+ OUString m_aText;
+ sw::WrongListIterator* m_pWrong;
+ sw::WrongListIterator* m_pGrammarCheck;
+ sw::WrongListIterator* m_pSmartTags;
+ Size m_aSize;
+ SwFont *m_pFnt;
+ SwUnderlineFont* m_pUnderFnt;
+ TextFrameIndex* m_pHyphPos;
+ tools::Long m_nKanaDiff;
+ TextFrameIndex m_nIdx;
+ TextFrameIndex m_nLen;
+ TextFrameIndex m_nMeasureLen;
+ /// this is not a string index
+ sal_Int32 m_nOfst;
+ sal_uInt16 m_nWidth;
+ sal_uInt16 m_nAscent;
+ sal_uInt16 m_nCompress;
+ tools::Long m_nCharacterSpacing;
+ tools::Long m_nSpace;
+ tools::Long m_nKern;
+ TextFrameIndex m_nNumberOfBlanks;
+ sal_uInt8 m_nCursorBidiLevel;
+ bool m_bBullet : 1;
+ bool m_bUpper : 1; // for small caps: upper case flag
+ bool m_bDrawSpace : 1; // for small caps: underline/ line through
+ bool m_bGreyWave : 1; // grey wave line for extended text input
+ // For underlining we need to know, if a section is right in front of a
+ // whole block or a fix margin section.
+ bool m_bSpaceStop : 1;
+ bool m_bSnapToGrid : 1; // Does paragraph snap to grid?
+ // Paint text as if text has LTR direction, used for line numbering
+ bool m_bIgnoreFrameRTL : 1;
+ // GetModelPositionForViewPoint should not return the next position if screen position is
+ // inside second half of bound rect, used for Accessibility
+ bool m_bPosMatchesBounds :1;
+
+#ifdef DBG_UTIL
+ // These flags should control that the appropriate Set-function has been
+ // called before calling the Get-function of a member
+ bool m_bPos : 1;
+ bool m_bWrong : 1;
+ bool m_bGrammarCheck : 1;
+ bool m_bSize : 1;
+ bool m_bFnt : 1;
+ bool m_bHyph : 1;
+ bool m_bKana : 1;
+ bool m_bOfst : 1;
+ bool m_bAscent: 1;
+ bool m_bCharacterSpacing : 1;
+ bool m_bSpace : 1;
+ bool m_bNumberOfBlanks : 1;
+ bool m_bUppr : 1;
+ bool m_bDrawSp: 1;
+#endif
+
+public:
+
+ /// constructor for simple strings
+ SwDrawTextInfo( SwViewShell const *pSh, OutputDevice &rOut,
+ const OUString &rText, sal_Int32 const nIdx, sal_Int32 const nLen,
+ sal_uInt16 nWidth = 0, bool bBullet = false)
+ : SwDrawTextInfo(pSh, rOut, nullptr, rText, TextFrameIndex(nIdx), TextFrameIndex(nLen), nWidth, bBullet)
+ {}
+ /// constructor for text frame contents
+ SwDrawTextInfo( SwViewShell const *pSh, OutputDevice &rOut, const SwScriptInfo* pSI,
+ const OUString &rText, TextFrameIndex const nIdx, TextFrameIndex const nLen,
+ sal_uInt16 nWidth = 0, bool bBullet = false,
+ vcl::text::TextLayoutCache const*const pCachedVclData = nullptr)
+ : m_pCachedVclData(pCachedVclData)
+ {
+ assert( (nLen == TextFrameIndex(COMPLETE_STRING)) ? (nIdx.get() < rText.getLength()) : (nIdx + nLen).get() <= rText.getLength() );
+ m_pFrame = nullptr;
+ m_pSh = pSh;
+ m_pOut = &rOut;
+ m_pScriptInfo = pSI;
+ m_aText = rText;
+ m_nIdx = nIdx;
+ m_nLen = nLen;
+ m_nMeasureLen = TextFrameIndex(COMPLETE_STRING);
+ m_nKern = 0;
+ m_nCompress = 0;
+ m_nWidth = nWidth;
+ m_nNumberOfBlanks = TextFrameIndex(0);
+ m_nCursorBidiLevel = 0;
+ m_bBullet = bBullet;
+ m_pUnderFnt = nullptr;
+ m_bGreyWave = false;
+ m_bSpaceStop = false;
+ m_bSnapToGrid = false;
+ m_bIgnoreFrameRTL = false;
+ m_bPosMatchesBounds = false;
+
+ // These values are initialized but have to be set explicitly via their
+ // Set-function before they may be accessed by their Get-function:
+ m_pWrong = nullptr;
+ m_pGrammarCheck = nullptr;
+ m_pSmartTags = nullptr;
+ m_pFnt = nullptr;
+ m_pHyphPos = nullptr;
+ m_nKanaDiff = 0;
+ m_nOfst = 0;
+ m_nAscent = 0;
+ m_nCharacterSpacing = 0;
+ m_nSpace = 0;
+ m_bUpper = false;
+ m_bDrawSpace = false;
+
+#ifdef DBG_UTIL
+ // these flags control whether the matching member variables have been
+ // set by using the Set-function before they may be accessed by their
+ // Get-function:
+ m_bPos = m_bWrong = m_bGrammarCheck = m_bSize = m_bFnt = m_bAscent =
+ m_bSpace = m_bNumberOfBlanks = m_bUppr =
+ m_bDrawSp = m_bKana = m_bOfst = m_bHyph =
+ m_bCharacterSpacing = false;
+#endif
+ }
+
+ const SwTextFrame* GetFrame() const
+ {
+ return m_pFrame;
+ }
+
+ void SetFrame( const SwTextFrame* pNewFrame )
+ {
+ m_pFrame = pNewFrame;
+ }
+
+ SwViewShell const *GetShell() const
+ {
+ return m_pSh;
+ }
+
+ vcl::RenderContext& GetOut() const
+ {
+ return *m_pOut;
+ }
+
+ vcl::RenderContext *GetpOut() const
+ {
+ return m_pOut;
+ }
+
+ const SwScriptInfo* GetScriptInfo() const
+ {
+ return m_pScriptInfo;
+ }
+
+ const Point &GetPos() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bPos, "DrawTextInfo: Undefined Position" );
+#endif
+ return m_aPos;
+ }
+
+ TextFrameIndex *GetHyphPos() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bHyph, "DrawTextInfo: Undefined Hyph Position" );
+#endif
+ return m_pHyphPos;
+ }
+
+ vcl::text::TextLayoutCache const* GetVclCache() const
+ {
+ return m_pCachedVclData;
+ }
+
+ const OUString &GetText() const
+ {
+ return m_aText;
+ }
+
+ sw::WrongListIterator* GetWrong() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bWrong, "DrawTextInfo: Undefined WrongList" );
+#endif
+ return m_pWrong;
+ }
+
+ sw::WrongListIterator* GetGrammarCheck() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bGrammarCheck, "DrawTextInfo: Undefined GrammarCheck List" );
+#endif
+ return m_pGrammarCheck;
+ }
+
+ sw::WrongListIterator* GetSmartTags() const
+ {
+ return m_pSmartTags;
+ }
+
+ const Size &GetSize() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bSize, "DrawTextInfo: Undefined Size" );
+#endif
+ return m_aSize;
+ }
+
+ SwFont* GetFont() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bFnt, "DrawTextInfo: Undefined Font" );
+#endif
+ return m_pFnt;
+ }
+
+ SwUnderlineFont* GetUnderFnt() const
+ {
+ return m_pUnderFnt;
+ }
+
+ TextFrameIndex GetIdx() const
+ {
+ return m_nIdx;
+ }
+
+ TextFrameIndex GetLen() const
+ {
+ return m_nLen;
+ }
+
+ TextFrameIndex GetMeasureLen() const
+ {
+ return m_nMeasureLen;
+ }
+
+ sal_Int32 GetOffset() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bOfst, "DrawTextInfo: Undefined Offset" );
+#endif
+ return m_nOfst;
+ }
+
+ TextFrameIndex GetEnd() const
+ {
+ return m_nIdx + m_nLen;
+ }
+
+ tools::Long GetKanaDiff() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bKana, "DrawTextInfo: Undefined kana difference" );
+#endif
+ return m_nKanaDiff;
+ }
+
+ sal_uInt16 GetWidth() const
+ {
+ return m_nWidth;
+ }
+
+ sal_uInt16 GetAscent() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bAscent, "DrawTextInfo: Undefined Ascent" );
+#endif
+ return m_nAscent;
+ }
+
+ sal_uInt16 GetKanaComp() const
+ {
+ return m_nCompress;
+ }
+
+ tools::Long GetCharacterSpacing() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bCharacterSpacing, "DrawTextInfo: Undefined CharacterSpacing" );
+#endif
+ return m_nCharacterSpacing;
+ }
+
+ tools::Long GetKern() const
+ {
+ return m_nKern;
+ }
+
+ tools::Long GetSpace() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bSpace, "DrawTextInfo: Undefined Spacing" );
+#endif
+ return m_nSpace;
+ }
+
+ TextFrameIndex GetNumberOfBlanks() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bNumberOfBlanks, "DrawTextInfo::Undefined NumberOfBlanks" );
+#endif
+ return m_nNumberOfBlanks;
+ }
+
+ sal_uInt8 GetCursorBidiLevel() const
+ {
+ return m_nCursorBidiLevel;
+ }
+
+ bool GetBullet() const
+ {
+ return m_bBullet;
+ }
+
+ bool GetUpper() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bUppr, "DrawTextInfo: Undefined Upperflag" );
+#endif
+ return m_bUpper;
+ }
+
+ bool GetDrawSpace() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bDrawSp, "DrawTextInfo: Undefined DrawSpaceflag" );
+#endif
+ return m_bDrawSpace;
+ }
+
+ bool GetGreyWave() const
+ {
+ return m_bGreyWave;
+ }
+
+ bool IsSpaceStop() const
+ {
+ return m_bSpaceStop;
+ }
+
+ bool SnapToGrid() const
+ {
+ return m_bSnapToGrid;
+ }
+
+ bool IsIgnoreFrameRTL() const
+ {
+ return m_bIgnoreFrameRTL;
+ }
+
+ bool IsPosMatchesBounds() const
+ {
+ return m_bPosMatchesBounds;
+ }
+
+ void SetOut( OutputDevice &rNew )
+ {
+ m_pOut = &rNew;
+ }
+
+ void SetPos( const Point &rNew )
+ {
+ m_aPos = rNew;
+#ifdef DBG_UTIL
+ m_bPos = true;
+#endif
+ }
+
+ void SetHyphPos(TextFrameIndex *const pNew)
+ {
+ m_pHyphPos = pNew;
+#ifdef DBG_UTIL
+ m_bHyph = true;
+#endif
+ }
+
+ void SetText( const OUString &rNew )
+ {
+ assert( (m_nLen == TextFrameIndex(COMPLETE_STRING)) ? (m_nIdx.get() < rNew.getLength()) : (m_nIdx + m_nLen).get() <= rNew.getLength() );
+ m_aText = rNew;
+ m_pCachedVclData = nullptr; // would any case benefit from save/restore?
+ }
+
+ // These methods are here so we can set all the related fields together to preserve the invariants that we assert
+ void SetTextIdxLen( const OUString &rNewStr, TextFrameIndex const nNewIdx, TextFrameIndex const nNewLen )
+ {
+ assert( (nNewLen == TextFrameIndex(COMPLETE_STRING)) ? (nNewIdx.get() < rNewStr.getLength()) : (nNewIdx + nNewLen).get() <= rNewStr.getLength() );
+ m_aText = rNewStr;
+ m_nIdx = nNewIdx;
+ m_nLen = nNewLen;
+ m_pCachedVclData = nullptr; // would any case benefit from save/restore?
+ }
+
+ // These methods are here so we can set all the related fields together to preserve the invariants that we assert
+ void SetIdxLen( TextFrameIndex const nNewIdx, TextFrameIndex const nNewLen )
+ {
+ assert( (nNewLen == TextFrameIndex(COMPLETE_STRING)) ? (nNewIdx.get() < m_aText.getLength()) : (nNewIdx + nNewLen).get() <= m_aText.getLength() );
+ m_nIdx = nNewIdx;
+ m_nLen = nNewLen;
+ }
+
+ void SetWrong(sw::WrongListIterator *const pNew)
+ {
+ m_pWrong = pNew;
+#ifdef DBG_UTIL
+ m_bWrong = true;
+#endif
+ }
+
+ void SetGrammarCheck(sw::WrongListIterator *const pNew)
+ {
+ m_pGrammarCheck = pNew;
+#ifdef DBG_UTIL
+ m_bGrammarCheck = true;
+#endif
+ }
+
+ void SetSmartTags(sw::WrongListIterator *const pNew)
+ {
+ m_pSmartTags = pNew;
+ }
+
+ void SetSize( const Size &rNew )
+ {
+ m_aSize = rNew;
+#ifdef DBG_UTIL
+ m_bSize = true;
+#endif
+ }
+
+ void SetFont( SwFont* pNew )
+ {
+ m_pFnt = pNew;
+#ifdef DBG_UTIL
+ m_bFnt = true;
+#endif
+ }
+
+ void SetIdx(TextFrameIndex const nNew)
+ {
+ assert( (m_nLen == TextFrameIndex(COMPLETE_STRING)) ? (nNew.get() < m_aText.getLength()) : (nNew + m_nLen).get() <= m_aText.getLength() );
+ m_nIdx = nNew;
+ }
+
+ void SetLen(TextFrameIndex const nNew)
+ {
+ assert( (nNew == TextFrameIndex(COMPLETE_STRING)) ? (m_nIdx.get() < m_aText.getLength()) : (m_nIdx + nNew).get() <= m_aText.getLength() );
+ m_nLen = nNew;
+ }
+
+ void SetMeasureLen(TextFrameIndex const nNew)
+ {
+ assert( nNew == TextFrameIndex(COMPLETE_STRING) || nNew <= m_nLen );
+ m_nMeasureLen = nNew;
+ }
+
+ void SetOffset( sal_Int32 nNew )
+ {
+ m_nOfst = nNew;
+#ifdef DBG_UTIL
+ m_bOfst = true;
+#endif
+ }
+
+ void SetKanaDiff( tools::Long nNew )
+ {
+ m_nKanaDiff = nNew;
+#ifdef DBG_UTIL
+ m_bKana = true;
+#endif
+ }
+
+ void SetWidth( sal_uInt16 nNew )
+ {
+ m_nWidth = nNew;
+ }
+
+ void SetAscent( sal_uInt16 nNew )
+ {
+ m_nAscent = nNew;
+#ifdef DBG_UTIL
+ m_bAscent = true;
+#endif
+ }
+
+ void SetKern( tools::Long nNew )
+ {
+ m_nKern = nNew;
+ }
+
+ void SetSpace( tools::Long nNew )
+ {
+ if( nNew < 0 )
+ {
+ m_nCharacterSpacing = -nNew;
+ m_nSpace = 0;
+ }
+ else
+ {
+ // negative space (shrinking) stored over LONG_MAX/2
+ if ( nNew < LONG_MAX/2 )
+ m_nSpace = nNew;
+ else
+ m_nSpace = LONG_MAX/2 - nNew;
+ m_nCharacterSpacing = 0;
+ }
+#ifdef DBG_UTIL
+ m_bSpace = true;
+ m_bCharacterSpacing = true;
+#endif
+ }
+
+ void SetNumberOfBlanks( TextFrameIndex const nNew )
+ {
+#ifdef DBG_UTIL
+ m_bNumberOfBlanks = true;
+#endif
+ m_nNumberOfBlanks = nNew;
+ }
+
+ void SetCursorBidiLevel( sal_uInt8 nNew )
+ {
+ m_nCursorBidiLevel = nNew;
+ }
+
+ void SetKanaComp( short nNew )
+ {
+ m_nCompress = nNew;
+ }
+
+ void SetBullet( bool bNew )
+ {
+ m_bBullet = bNew;
+ }
+
+ void SetUnderFnt( SwUnderlineFont* pULFnt )
+ {
+ m_pUnderFnt = pULFnt;
+ }
+
+ void SetUpper( bool bNew )
+ {
+ m_bUpper = bNew;
+#ifdef DBG_UTIL
+ m_bUppr = true;
+#endif
+ }
+
+ void SetDrawSpace( bool bNew )
+ {
+ m_bDrawSpace = bNew;
+#ifdef DBG_UTIL
+ m_bDrawSp = true;
+#endif
+ }
+
+ void SetGreyWave( bool bNew )
+ {
+ m_bGreyWave = bNew;
+ }
+
+ void SetSpaceStop( bool bNew )
+ {
+ m_bSpaceStop = bNew;
+ }
+
+ void SetSnapToGrid( bool bNew )
+ {
+ m_bSnapToGrid = bNew;
+ }
+
+ void SetIgnoreFrameRTL( bool bNew )
+ {
+ m_bIgnoreFrameRTL = bNew;
+ }
+
+ void SetPosMatchesBounds( bool bNew )
+ {
+ m_bPosMatchesBounds = bNew;
+ }
+
+ void Shift( Degree10 nDir );
+
+ // sets a new color at the output device if necessary if a font is passed
+ // as argument, the change if made to the font otherwise the font at the
+ // output device is changed returns if the font has been changed
+ bool ApplyAutoColor( vcl::Font* pFnt = nullptr );
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/dropdowncontentcontrolbutton.hxx b/sw/source/core/inc/dropdowncontentcontrolbutton.hxx
new file mode 100644
index 0000000000..6ca32974e1
--- /dev/null
+++ b/sw/source/core/inc/dropdowncontentcontrolbutton.hxx
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#pragma once
+
+#include "contentcontrolbutton.hxx"
+
+class SwEditWin;
+class SwContentControl;
+
+/**
+ * This button is shown when the cursor is inside a drop-down content control.
+ * The user can select a list item using this button while filling in a form.
+ */
+class SwDropDownContentControlButton final : public SwContentControlButton
+{
+private:
+ std::unique_ptr<weld::TreeView> m_xTreeView;
+
+ DECL_LINK(ListBoxHandler, weld::TreeView&, bool);
+
+ void InitDropdown();
+
+public:
+ SwDropDownContentControlButton(SwEditWin* pEditWin,
+ const std::shared_ptr<SwContentControl>& pContentControl);
+ virtual ~SwDropDownContentControlButton() override;
+
+ virtual void LaunchPopup() override;
+ virtual void DestroyPopup() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/dumpfilter.hxx b/sw/source/core/inc/dumpfilter.hxx
new file mode 100644
index 0000000000..6ebc6e8c9e
--- /dev/null
+++ b/sw/source/core/inc/dumpfilter.hxx
@@ -0,0 +1,59 @@
+/* -*- 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/.
+ */
+
+#ifndef INCLUDED_SW_SOURCE_CORE_INC_DUMPFILTER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DUMPFILTER_HXX
+
+#include <com/sun/star/document/XFilter.hpp>
+#include <com/sun/star/document/XExporter.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <cppuhelper/implbase.hxx>
+
+namespace sw {
+
+ /** Implementation of UNO export service to dump the layout of the
+ document as XML. This filter should be mostly be used for testing
+ purpose.
+ */
+ class LayoutDumpFilter final : public cppu::WeakImplHelper
+ <
+ css::document::XFilter,
+ css::document::XExporter,
+ css::lang::XInitialization,
+ css::lang::XServiceInfo
+ >
+ {
+ css::uno::Reference< css::lang::XComponent > m_xSrcDoc;
+
+ public:
+ LayoutDumpFilter();
+ virtual ~LayoutDumpFilter() override;
+
+ // XFilter
+ virtual sal_Bool SAL_CALL filter( const css::uno::Sequence< css::beans::PropertyValue >& aDescriptor ) override;
+ virtual void SAL_CALL cancel( ) override;
+
+ // XExporter
+ virtual void SAL_CALL setSourceDocument( const css::uno::Reference< css::lang::XComponent >& xDoc ) override;
+
+ // XInitialization
+ virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName( ) override;
+ virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
+
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/dview.hxx b/sw/source/core/inc/dview.hxx
new file mode 100644
index 0000000000..cdcf3f2659
--- /dev/null
+++ b/sw/source/core/inc/dview.hxx
@@ -0,0 +1,125 @@
+/* -*- 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_DVIEW_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DVIEW_HXX
+
+#include <svx/fmview.hxx>
+
+class FmFormModel;
+class OutputDevice;
+class SwViewShellImp;
+class SwFrame;
+class SwFlyFrame;
+class SwAnchoredObject;
+class SdrUndoManager;
+
+class SwDrawView final : public FmFormView
+{
+ Point m_aAnchorPoint; // anchor position
+ SwViewShellImp &m_rImp; // a view is always part of a shell
+
+ const SwFrame *CalcAnchor();
+
+ /** determine maximal order number for a 'child' object of given 'parent' object
+
+ The maximal order number will be determined on the current object
+ order hierarchy. It's the order number of the 'child' object with the
+ highest order number. The calculation can be influenced by parameter
+ <_pExclChildObj> - this 'child' object won't be considered.
+
+ @param <_rParentObj>
+ input parameter - 'parent' object, for which the maximal order number
+ for its 'children' will be determined.
+
+ @param <_pExclChildObj>
+ optional input parameter - 'child' object, which will not be considered
+ on the calculation of the maximal order number
+ */
+ static sal_uInt32 GetMaxChildOrdNum( const SwFlyFrame& _rParentObj,
+ const SdrObject* _pExclChildObj = nullptr );
+
+ /** method to move 'repeated' objects of the given moved object to the
+ according level
+
+ @param <_rMovedAnchoredObj>
+ input parameter - moved object, for which the 'repeated' ones have also
+ to be moved.
+
+ @param <_rMovedChildrenObjs>
+ input parameter - data collection of moved 'child' objects - the 'repeated'
+ ones of these 'children' will also been moved.
+ */
+ void MoveRepeatedObjs( const SwAnchoredObject& _rMovedAnchoredObj,
+ const std::vector<SdrObject*>& _rMovedChildObjs ) const;
+
+ // add custom handles (used by other apps, e.g. AnchorPos)
+ virtual void AddCustomHdl() override;
+
+ // override to allow extra handling when picking SwVirtFlyDrawObj's
+ using FmFormView::CheckSingleSdrObjectHit;
+ virtual SdrObject* CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObject* pObj, SdrPageView* pPV, SdrSearchOptions nOptions, const SdrLayerIDSet* pMVisLay) const override;
+
+ // Create a local UndoManager
+ std::unique_ptr<SdrUndoManager> createLocalTextUndoManager() override;
+
+public:
+ SwDrawView(
+ SwViewShellImp &rI,
+ FmFormModel& rFmFormModel,
+ OutputDevice* pOutDev);
+
+ // from base class
+ virtual SdrObject* GetMaxToTopObj(SdrObject* pObj) const override;
+ virtual SdrObject* GetMaxToBtmObj(SdrObject* pObj) const override;
+ virtual void MarkListHasChanged() override;
+
+ // #i7672#
+ // Override to reuse edit background color in active text edit view (OutlinerView)
+ virtual void ModelHasChanged() override;
+
+ virtual void ObjOrderChanged( SdrObject* pObj, size_t nOldPos,
+ size_t nNewPos ) override;
+ virtual bool TakeDragLimit(SdrDragMode eMode, tools::Rectangle& rRect) const override;
+ virtual void MakeVisible( const tools::Rectangle&, vcl::Window &rWin ) override;
+ virtual void CheckPossibilities() override;
+
+ const SwViewShellImp &Imp() const { return m_rImp; }
+ SwViewShellImp &Imp() { return m_rImp; }
+
+ // anchor and Xor for dragging
+ void ShowDragAnchor();
+
+ virtual void DeleteMarked() override;
+
+ void ValidateMarkList() { FlushComeBackTimer(); }
+
+ // #i99665#
+ static bool IsAntiAliasing();
+
+ // method to replace marked/selected <SwDrawVirtObj>
+ // by its reference object for delete of selection and group selection
+ static void ReplaceMarkedDrawVirtObjs( SdrMarkView& _rMarkView );
+
+ /// See SdrMarkView::GetSfxViewShell().
+ SfxViewShell* GetSfxViewShell() const override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/environmentofanchoredobject.hxx b/sw/source/core/inc/environmentofanchoredobject.hxx
new file mode 100644
index 0000000000..610bd934f8
--- /dev/null
+++ b/sw/source/core/inc/environmentofanchoredobject.hxx
@@ -0,0 +1,94 @@
+/* -*- 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_ENVIRONMENTOFANCHOREDOBJECT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_ENVIRONMENTOFANCHOREDOBJECT_HXX
+
+class SwFrame;
+class SwLayoutFrame;
+
+namespace objectpositioning
+{
+class SwEnvironmentOfAnchoredObject
+{
+private:
+ const bool mbFollowTextFlow;
+
+public:
+ /** constructor
+
+ @param _bFollowTextFlow
+ input parameter - indicates, if the anchored object, for which
+ this environment is instantiated, follow the text flow or not
+ */
+ SwEnvironmentOfAnchoredObject(const bool _bFollowTextFlow);
+
+ /** determine environment layout frame for possible horizontal object
+ positions respectively for alignment to 'page areas'
+
+ this is, if object has to follow the text flow:
+ - cell frame, if anchored inside a cell
+ - fly frame, if anchored inside a fly frame
+ otherwise it's the page frame
+
+ this is, if object hasn't to follow the text flow:
+ - page frame.
+ - no exception any more. Thus remove
+ parameter <_bForPageAlignment>
+
+ @param _rHoriOrientFrame
+ input parameter - frame, at which the horizontal position is
+ oriented at (typically it's the anchor frame).
+ starting point for the search of the layout frame.
+
+ @return reference to the layout frame, which determines the
+ horizontal environment the object has to be positioned in.
+ */
+ const SwLayoutFrame& GetHoriEnvironmentLayoutFrame(const SwFrame& _rHoriOrientFrame) const;
+
+ /** determine environment layout frame for possible vertical object
+ positions respectively for alignments to 'page areas'
+
+ this is, if object has to follow the text flow:
+ - cell frame, if anchored inside a cell
+ - fly frame, if anchored inside a fly frame
+ - header/footer frame, if anchored inside page header/footer
+ - footnote frame, if anchored inside footnote
+ otherwise it's the document body frame
+
+ this is, if object hasn't to follow the text flow:
+ - page frame.
+ - no exception any more. Thus remove
+ parameter <_bForPageAlignment>
+
+ @param _rVertOrientFrame
+ input parameter - frame, at which the vertical position is
+ oriented at (typically it's the anchor frame).
+ starting point for the search of the layout frame.
+
+ @return reference to the layout frame, which determines the
+ vertical environment the object has to be positioned in.
+ */
+ const SwLayoutFrame& GetVertEnvironmentLayoutFrame(const SwFrame& _rVertOrientFrame) const;
+};
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/fefly.hxx b/sw/source/core/inc/fefly.hxx
new file mode 100644
index 0000000000..411bf75861
--- /dev/null
+++ b/sw/source/core/inc/fefly.hxx
@@ -0,0 +1,30 @@
+/* -*- 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_FEFLY_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_FEFLY_HXX
+
+class SwFlyFrame;
+class SfxItemSet;
+
+bool sw_ChkAndSetNewAnchor(const SwFlyFrame& rFly, SfxItemSet& rSet);
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/fieldhint.hxx b/sw/source/core/inc/fieldhint.hxx
new file mode 100644
index 0000000000..27d31f86f6
--- /dev/null
+++ b/sw/source/core/inc/fieldhint.hxx
@@ -0,0 +1,44 @@
+/* -*- 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_FIELDHINT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_FIELDHINT_HXX
+
+#include <svl/hint.hxx>
+
+class SwPaM;
+class SwRootFrame;
+
+class SwFieldHint final : public SfxHint
+{
+public:
+ SwPaM* m_pPaM;
+ SwRootFrame const* m_pLayout;
+
+ SwFieldHint(SwPaM* const pPaM, SwRootFrame const* const pLayout)
+ : SfxHint(SfxHintId::SwField)
+ , m_pPaM(pPaM)
+ , m_pLayout(pLayout)
+ {
+ }
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/flowfrm.hxx b/sw/source/core/inc/flowfrm.hxx
new file mode 100644
index 0000000000..3d271613bf
--- /dev/null
+++ b/sw/source/core/inc/flowfrm.hxx
@@ -0,0 +1,280 @@
+/* -*- 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_FLOWFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_FLOWFRM_HXX
+
+#include "frame.hxx"
+#include "layfrm.hxx"
+#include <swtypes.hxx>
+
+class SvxFormatKeepItem;
+class SvxFormatBreakItem;
+class SwPageFrame;
+class SwRect;
+class SwBorderAttrs;
+class SwDoc;
+class SwNode;
+class SwNodeIndex;
+
+/** Base class that provides the general functionalities for frames that are
+ allowed at page breaks (flow) and shall continue on the next page (can be
+ split), e.g. paragraphs (ContentFrame) or tables (TabFrame).
+
+ Some parts of these functionalities are implemented in FlowFrame while the
+ specific ones are done in the corresponding Frame classes. The FlowFrame has to
+ be seen as a base class. As such it is no Frame by itself and thus no direct
+ instances of FlowFrame can exist.
+
+ Actually it is not even a real Frame. The obvious implementation would be a
+ FlowFrame that is virtually inherited from SwFrame and that works with its own
+ member data. Further classes would need to inherit from FlowFrame and (via
+ multiple base classes since the class tree splits exactly at the branch
+ from SwFrame to SwContentFrame and SwLayoutFrame) also virtually from SwFrame as
+ well. Unfortunately, this leads - besides problems with compilers and
+ debugging programs - to high additional costs, that we IMHO are not able to
+ afford nowadays.
+
+ Hence, we use another technique: A FlowFrame keeps a reference to a SwFrame
+ - which it is actually itself - and they are friends. As a result, the
+ FlowFrame can work with the reference to the SwFrame instead of working with
+ its own this-pointer.
+ */
+class SAL_DLLPUBLIC_RTTI SAL_LOPLUGIN_ANNOTATE("crosscast") SwFlowFrame
+{
+ // PrepareMake is allowed to lock/unlock (robustness)
+ friend inline void PrepareLock ( SwFlowFrame * );
+ friend inline void PrepareUnlock( SwFlowFrame * );
+ friend inline void TableSplitRecalcLock( SwFlowFrame * );
+ friend inline void TableSplitRecalcUnlock( SwFlowFrame * );
+ // #i44049#
+ friend class SwObjectFormatterTextFrame;
+ friend class FlowFrameJoinLockGuard;
+
+ // TableSel is allowed to reset the follow-bit
+ friend inline void UnsetFollow( SwFlowFrame *pFlow );
+
+ friend void MakeFrames( SwDoc *, SwNode &, SwNode & );
+
+ friend class SwNode2LayImpl;
+
+ SwFrame& m_rThis;
+
+ // helper methods for MoveSubTree()
+ static SwLayoutFrame *CutTree( SwFrame* );
+ static bool PasteTree( SwFrame *, SwLayoutFrame *, SwFrame *, SwFrame* );
+
+ /** indicates that a backward move was done over multiple pages
+
+ Needed for the interaction of _GetPrevxxx and MoveBwd so that multiple
+ pages can be skipped at the same time. In addition, it is evaluated by
+ the MoveBwd() method in TabFrame.
+ */
+ static bool s_bMoveBwdJump;
+
+ /** helper method to determine previous frame for calculation of the
+ upper space
+
+ #i11860#
+
+ @param _pProposedPrevFrame
+ optional input parameter - pointer to frame, which should be used
+ instead of the direct previous frame.
+ */
+ const SwFrame* GetPrevFrameForUpperSpaceCalc_( const SwFrame* _pProposedPrevFrame = nullptr ) const;
+
+ /** method to determine the upper space amount, which is considered for
+ the previous frame
+
+ #i11860#
+ */
+ SwTwips GetUpperSpaceAmountConsideredForPrevFrame() const;
+
+ /** method to determine the upper space amount, which is considered for
+ the page grid
+
+ #i11860#
+ */
+ SwTwips GetUpperSpaceAmountConsideredForPageGrid_(
+ const SwTwips _nUpperSpaceWithoutGrid ) const;
+
+protected:
+ SwFlowFrame *m_pFollow;
+ SwFlowFrame *m_pPrecede;
+
+ bool m_bLockJoin :1; // if true than joins (and thus deletes) are prohibited!
+ bool m_bUndersized:1; // I am smaller than needed
+ bool m_bFlyLock :1; // stop positioning of at-character flyframes
+
+ // checks if forward flow makes sense to prevent infinite moves
+ inline bool IsFwdMoveAllowed() const;
+ // #i44049# - method <CalcContent(..)> has to check this property.
+ friend void CalcContent( SwLayoutFrame *pLay, bool bNoColl );
+ bool IsKeepFwdMoveAllowed( bool bIgnoreMyOwnKeepValue = false ); // like above, forward flow for Keep.
+
+ /** method to determine overlapping of an object that requests floating
+
+ 0: no overlapping
+ 1: objects that are anchored at the FlowFrame overlap
+ 2: objects that are anchored somewhere else overlap
+ 3: both types of objects overlap
+ */
+ sal_uInt8 BwdMoveNecessary( const SwPageFrame *pPage, const SwRect &rRect );
+
+ void LockJoin() { m_bLockJoin = true; }
+ void UnlockJoin() { m_bLockJoin = false; }
+
+ bool CheckMoveFwd( bool& rbMakePage, bool bKeep, bool bIgnoreMyOwnKeepValue );
+ bool MoveFwd( bool bMakePage, bool bPageBreak, bool bMoveAlways = false );
+ bool MoveBwd( bool &rbReformat );
+ virtual bool ShouldBwdMoved( SwLayoutFrame *pNewUpper, bool &rReformat )=0;
+
+public:
+ SwFlowFrame( SwFrame &rFrame );
+ virtual ~SwFlowFrame();
+
+ const SwFrame& GetFrame() const { return m_rThis; }
+ SwFrame& GetFrame() { return m_rThis; }
+
+ static bool IsMoveBwdJump() { return s_bMoveBwdJump; }
+ static void SetMoveBwdJump( bool bNew ){ s_bMoveBwdJump = bNew; }
+
+ void SetUndersized( const bool bNew ) { m_bUndersized = bNew; }
+ bool IsUndersized() const { return m_bUndersized; }
+
+ bool IsPrevObjMove() const;
+
+ /** hook tree onto new parent with minimal operations and notifications */
+ void MoveSubTree( SwLayoutFrame* pParent, SwFrame* pSibling = nullptr );
+
+ bool HasFollow() const { return m_pFollow != nullptr; }
+ bool IsFollow() const { return nullptr != m_pPrecede; }
+ bool IsAnFollow( const SwFlowFrame *pFlow ) const;
+ const SwFlowFrame *GetFollow() const { return m_pFollow; }
+ SwFlowFrame *GetFollow() { return m_pFollow; }
+ void SetFollow(SwFlowFrame *const pFollow);
+
+ const SwFlowFrame *GetPrecede() const { return m_pPrecede; }
+ SwFlowFrame *GetPrecede() { return m_pPrecede; }
+
+ bool IsJoinLocked() const { return m_bLockJoin; }
+ bool IsAnyJoinLocked() const { return m_bLockJoin || HasLockedFollow(); }
+
+ bool IsPageBreak( bool bAct ) const;
+ bool IsColBreak( bool bAct ) const;
+
+ /** method to determine if a Keep needs to be considered (Breaks!) */
+ bool IsKeep(SvxFormatKeepItem const& rKeep,
+ SvxFormatBreakItem const& rBreak,
+ bool bBreakCheck = false ) const;
+
+ bool HasLockedFollow() const;
+
+ bool HasParaSpaceAtPages( bool bSct ) const;
+
+ /** method to determine the upper space hold by the frame
+
+ #i11860#
+
+ @param _bConsiderGrid
+ optional input parameter - consider the page grid while calculating?
+ */
+ SwTwips CalcUpperSpace( const SwBorderAttrs *pAttrs = nullptr,
+ const SwFrame* pPr = nullptr,
+ const bool _bConsiderGrid = true ) const;
+
+ /** method to determine the upper space amount, which is considered for
+ the previous frame and the page grid, if option 'Use former object
+ positioning' is OFF
+
+ #i11860#
+ */
+ SwTwips GetUpperSpaceAmountConsideredForPrevFrameAndPageGrid() const;
+
+ /** calculation of lower space */
+ SwTwips CalcLowerSpace( const SwBorderAttrs* _pAttrs = nullptr ) const;
+
+ /** calculation of the additional space to be considered, if flow frame
+ is the last inside a table cell
+
+ #i26250
+
+ @param _pAttrs
+ optional input parameter - border attributes of the flow frame.
+ Used for optimization, if caller has already determined the border
+ attributes.
+
+ @return SwTwips
+ */
+ SwTwips CalcAddLowerSpaceAsLastInTableCell(
+ const SwBorderAttrs* _pAttrs = nullptr ) const;
+
+ void CheckKeep();
+
+ void SetFlyLock( bool bNew ){ m_bFlyLock = bNew; }
+ bool IsFlyLock() const { return m_bFlyLock; }
+
+ bool ForbiddenForFootnoteCntFwd() const;
+
+ // Casting of a Frame into a FlowFrame (if it is one, otherwise 0)
+ // These methods need to be customized in subclasses!
+ static SwFlowFrame *CastFlowFrame( SwFrame *pFrame );
+ static const SwFlowFrame *CastFlowFrame( const SwFrame *pFrame );
+};
+
+inline bool SwFlowFrame::IsFwdMoveAllowed() const
+{
+ return m_rThis.GetIndPrev() != nullptr;
+}
+
+//use this to protect a SwLayoutFrame for a given scope from getting merged with
+//its neighbour and thus deleted
+class FlowFrameJoinLockGuard
+{
+private:
+ SwFlowFrame *m_pFlow;
+ bool m_bOldJoinLocked;
+public:
+ //JoinLock pParent for the lifetime of the Cut/Paste call, etc. to avoid
+ //SwSectionFrame::MergeNext removing the pParent we're trying to reparent
+ //into
+ FlowFrameJoinLockGuard(SwLayoutFrame* pFrame)
+ {
+ m_pFlow = SwFlowFrame::CastFlowFrame(pFrame);
+ if (m_pFlow)
+ {
+ m_bOldJoinLocked = m_pFlow->IsJoinLocked();
+ m_pFlow->LockJoin();
+ }
+ else
+ {
+ m_bOldJoinLocked = false;
+ }
+ }
+
+ ~FlowFrameJoinLockGuard()
+ {
+ if (m_pFlow && !m_bOldJoinLocked)
+ m_pFlow->UnlockJoin();
+ }
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/flyfrm.hxx b/sw/source/core/inc/flyfrm.hxx
new file mode 100644
index 0000000000..d1f14591bc
--- /dev/null
+++ b/sw/source/core/inc/flyfrm.hxx
@@ -0,0 +1,316 @@
+/* -*- 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;
+class SwFlyAtContentFrame;
+
+
+/** 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, bool bFollow = false );
+
+ 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 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#
+ 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 );
+
+ /// Is this fly allowed to split across pages? (Disabled by default.)
+ bool IsFlySplitAllowed() const;
+
+ // #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 void RegisterAtPage(SwPageFrame&) 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 = nullptr) const override;
+
+ 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;
+
+ SwFlyAtContentFrame* DynCastFlyAtContentFrame();
+
+private:
+ void UpdateUnfloatButton(SwWrtShell* pWrtSh, bool bShow) const;
+ void PaintDecorators() const;
+};
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/flyfrms.hxx b/sw/source/core/inc/flyfrms.hxx
new file mode 100644
index 0000000000..051d514fd3
--- /dev/null
+++ b/sw/source/core/inc/flyfrms.hxx
@@ -0,0 +1,254 @@
+/* -*- 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_FLYFRMS_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_FLYFRMS_HXX
+
+#include <sal/config.h>
+
+#include <swdllapi.h>
+
+#include "flyfrm.hxx"
+#include "flowfrm.hxx"
+
+class SwNoTextFrame;
+
+double getLocalFrameRotation_from_SwNoTextFrame(const SwNoTextFrame& rNoTextFrame);
+
+// Base class for those Flys that can "move freely" or better that are not
+// bound in Content.
+class SW_DLLPUBLIC SwFlyFreeFrame : public SwFlyFrame
+{
+private:
+ // #i34753# - flag for at-page anchored Writer fly frames
+ // to prevent a positioning - call of method <MakeObjPos()> -, if Writer
+ // fly frame is already clipped during its format by the object formatter.
+ bool mbNoMakePos : 1;
+
+ // #i37068# - flag to prevent move in method <CheckClip(..)>
+ bool mbNoMoveOnCheckClip : 1;
+
+ SwRect maUnclippedFrame;
+
+ // RotateFlyFrame3 add TransformableSwFrame
+ std::unique_ptr< TransformableSwFrame > mpTransformableSwFrame;
+
+ void CheckClip( const SwFormatFrameSize &rSz ); //'Emergency' Clipping.
+
+ /** determines, if direct environment of fly frame has 'auto' size
+
+ #i17297#
+ start with anchor frame and search for a header, footer, row or fly frame
+ stopping at page frame.
+ return <true>, if such a frame is found and it has 'auto' size.
+ otherwise <false> is returned.
+
+ @return boolean indicating, that direct environment has 'auto' size
+ */
+ bool HasEnvironmentAutoSize() const;
+
+ // RotateFlyFrame3 - Support for outer Frame of a SwGrfNode
+ // Only for local data extraction. To uniquely access information
+ // for local transformation, use getFrameArea(Print)Transformation
+ double getLocalFrameRotation() const;
+
+protected:
+ // #i28701# - new friend class <SwFlyNotify> for access to
+ // method <NotifyBackground>
+ friend class SwFlyNotify;
+ virtual void NotifyBackground( SwPageFrame *pPage,
+ const SwRect& rRect, PrepareHint eHint) override;
+ SwFlyFreeFrame( SwFlyFrameFormat*, SwFrame*, SwFrame *pAnchor, bool bFollow = false );
+
+ virtual void DestroyImpl() override;
+ virtual ~SwFlyFreeFrame() override;
+
+public:
+ // #i28701#
+
+ virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
+
+ // #i37068# - accessors for member <mbNoMoveOnCheckClip>
+ void SetNoMoveOnCheckClip( const bool _bNewNoMoveOnCheckClip )
+ {
+ mbNoMoveOnCheckClip = _bNewNoMoveOnCheckClip;
+ }
+ bool IsNoMoveOnCheckClip() const
+ {
+ return mbNoMoveOnCheckClip;
+ }
+ // #i34753# - accessors for member <mbNoMakePos>
+ void SetNoMakePos( const bool _bNoMakePos )
+ {
+ if ( IsFlyLayFrame() )
+ {
+ mbNoMakePos = _bNoMakePos;
+ }
+ }
+ bool IsNoMakePos() const
+ {
+ if ( IsFlyLayFrame() )
+ {
+ return mbNoMakePos;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ const SwRect& GetUnclippedFrame( ) const
+ {
+ if ( maUnclippedFrame.HasArea( ) )
+ return maUnclippedFrame;
+ else
+ return getFrameArea();
+ }
+
+ /** method to determine, if a format on the Writer fly frame is possible
+
+ #i28701#
+ refine 'IsFormatPossible'-conditions of method
+ <SwFlyFrame::IsFormatPossible()> by:
+ format isn't possible, if Writer fly frame isn't registered at a page frame
+ and its anchor frame isn't inside another Writer fly frame.
+ */
+ virtual bool IsFormatPossible() const override;
+
+ // RotateFlyFrame3 - Support for Transformations
+ bool isTransformableSwFrame() const { return bool(mpTransformableSwFrame); }
+ TransformableSwFrame* getTransformableSwFrame() { return mpTransformableSwFrame.get(); }
+ const TransformableSwFrame* getTransformableSwFrame() const { return mpTransformableSwFrame.get(); }
+
+ // RotateFlyFrame3 - Support for AutoContour
+ bool supportsAutoContour() const;
+
+ // RotateFlyFrame3 - Support for Transformations
+ virtual basegfx::B2DHomMatrix getFrameAreaTransformation() const override;
+ virtual basegfx::B2DHomMatrix getFramePrintAreaTransformation() const override;
+
+ // RotateFlyFrame3 - Support for Transformations
+ virtual void transform_translate(const Point& rOffset) override;
+};
+
+/// Flys that are bound to layout frames (to-frame) and not to/as content
+class SwFlyLayFrame final: public SwFlyFreeFrame
+{
+public:
+ // #i28701#
+
+ SwFlyLayFrame( SwFlyFrameFormat*, SwFrame*, SwFrame *pAnchor );
+
+ virtual void RegisterAtPage(SwPageFrame &) override;
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+};
+
+/// Flys that are anchored to content (at-para, at-char) but not in content (as-char).
+class SW_DLLPUBLIC SwFlyAtContentFrame final: public SwFlyFreeFrame, public SwFlowFrame
+{
+ virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
+
+ // #i28701#
+ virtual bool InvalidationAllowed( const InvalidationType _nInvalid ) const override;
+
+ /** method to assure that anchored object is registered at the correct
+ page frame
+
+ #i28701#
+ */
+ virtual void RegisterAtCorrectPage() override;
+ virtual void RegisterAtPage(SwPageFrame &) override;
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+ bool ShouldBwdMoved(SwLayoutFrame* pNewUpper, bool& rReformat) override;
+
+public:
+ // #i28701#
+
+ SwFlyAtContentFrame( SwFlyFrameFormat*, SwFrame*, SwFrame *pAnchor, bool bFollow = false );
+ SwFlyAtContentFrame(SwFlyAtContentFrame& rPrecede);
+ ~SwFlyAtContentFrame();
+
+ void SetAbsPos( const Point &rNew );
+
+ // #i26791#
+ virtual void MakeObjPos() override;
+
+ /** method to determine, if a format on the Writer fly frame is possible
+
+ #i28701#
+ refine 'IsFormatPossible'-conditions of method
+ <SwFlyFreeFrame::IsFormatPossible()> by:
+ format isn't possible, if method <MakeAll()> is already in progress.
+ */
+ virtual bool IsFormatPossible() const override;
+ const SwFlyAtContentFrame* GetFollow() const;
+ SwFlyAtContentFrame* GetFollow();
+ const SwFlyAtContentFrame* GetPrecede() const;
+ SwFlyAtContentFrame* GetPrecede();
+ /// Like Cut(), except that follow chaining is maintained.
+ void DelEmpty();
+ bool IsWrapOnAllPages() const;
+ void dumpAsXmlAttributes(xmlTextWriterPtr pWriter) const override;
+};
+
+/// Flys that are anchored as a character in the content.
+class SwFlyInContentFrame final: public SwFlyFrame
+{
+ Point m_aRef; // relative to this point AbsPos is being calculated
+
+ virtual void DestroyImpl() override;
+ virtual ~SwFlyInContentFrame() override;
+
+ virtual void NotifyBackground(SwPageFrame *pPage, const SwRect& rRect, PrepareHint eHint) override;
+ virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+
+public:
+ // #i28701#
+
+ SwFlyInContentFrame( SwFlyFrameFormat*, SwFrame*, SwFrame *pAnchor );
+
+ virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override;
+
+ void SetRefPoint( const Point& rPoint, const Point &rRelAttr,
+ const Point &rRelPos );
+ const Point &GetRefPoint() const { return m_aRef; }
+ Point const & GetRelPos() const;
+
+ // (26.11.93, see tabfrm.hxx, but might also be valid for others)
+ // For creation of a Fly after a FlyCnt was created _and_ inserted.
+ // Must be called by creator because can be pasted only after creation.
+ // Sometimes the page for registering the Flys is not visible until then
+ // as well.
+ void RegistFlys();
+
+ //see layact.cxx
+ void AddRefOfst( tools::Long nOfst ) { m_aRef.AdjustY( nOfst ); }
+ void AddRefOfst(Point const& rOfst) { m_aRef += rOfst; }
+
+ // #i26791#
+ virtual void MakeObjPos() override;
+
+ // invalidate anchor frame on invalidation of the position, because the
+ // position is calculated during the format of the anchor frame
+ virtual void ActionOnInvalidation( const InvalidationType _nInvalid ) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/fntcache.hxx b/sw/source/core/inc/fntcache.hxx
new file mode 100644
index 0000000000..bea6663e14
--- /dev/null
+++ b/sw/source/core/inc/fntcache.hxx
@@ -0,0 +1,146 @@
+/* -*- 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_FNTCACHE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_FNTCACHE_HXX
+
+#include <sal/config.h>
+
+#include <cstdint>
+#include <unordered_map>
+
+#include <vcl/font.hxx>
+#include <vcl/glyphitem.hxx>
+#include <vcl/vclptr.hxx>
+#include <vcl/outdev.hxx>
+#include "swcache.hxx"
+#include "TextFrameIndex.hxx"
+
+class FontMetric;
+class SwFntObj;
+class SwDrawTextInfo;
+class SwViewShell;
+class SwSubFont;
+class MapMode;
+
+class SwFntCache : public SwCache
+{
+public:
+ SwFntCache() : SwCache(50
+#ifdef DBG_UTIL
+ , OString(RTL_CONSTASCII_STRINGPARAM("Global Font-Cache pFntCache"))
+#endif
+ ) {}
+
+ inline SwFntObj *First( );
+ static inline SwFntObj *Next( SwFntObj *pFntObj);
+ void Flush();
+};
+
+// Font cache, global variable, created/destroyed in txtinit.cxx
+extern SwFntCache *pFntCache;
+extern SwFntObj *pLastFont;
+
+class SwFntObj final : public SwCacheObj
+{
+ friend class SwFntAccess;
+ friend void InitCore();
+ friend void FinitCore();
+
+ vcl::Font m_aFont;
+ vcl::Font *m_pScrFont;
+ vcl::Font *m_pPrtFont;
+ VclPtr<OutputDevice> m_pPrinter;
+ sal_uInt16 m_nGuessedLeading;
+ sal_uInt16 m_nExtLeading;
+ sal_uInt16 m_nScrAscent;
+ sal_uInt16 m_nPrtAscent;
+ sal_uInt16 m_nScrHeight;
+ sal_uInt16 m_nPrtHeight;
+ sal_uInt16 m_nPropWidth;
+ sal_uInt16 m_nScrHangingBaseline;
+ sal_uInt16 m_nPrtHangingBaseline;
+ sal_uInt16 m_nZoom;
+ bool m_bSymbol : 1;
+ bool m_bPaintBlank : 1;
+
+ static tools::Long s_nPixWidth;
+ static MapMode *s_pPixMap;
+
+public:
+ SwFntObj( const SwSubFont &rFont, std::uintptr_t nFontCacheId,
+ SwViewShell const *pSh );
+
+ virtual ~SwFntObj() override;
+
+ vcl::Font *GetScrFont() { return m_pScrFont; }
+ vcl::Font& GetFont() { return m_aFont; }
+ const vcl::Font& GetFont() const { return m_aFont; }
+
+ sal_uInt16 GetGuessedLeading() const { return m_nGuessedLeading; }
+ sal_uInt16 GetExternalLeading() const { return m_nExtLeading; }
+
+ sal_uInt16 GetFontAscent( const SwViewShell *pSh, const OutputDevice& rOut );
+ sal_uInt16 GetFontHeight( const SwViewShell *pSh, const OutputDevice& rOut );
+ sal_uInt16 GetFontLeading( const SwViewShell *pSh, const OutputDevice& rOut );
+ sal_uInt16 GetFontHangingBaseline( const SwViewShell *pSh, const OutputDevice& rOut );
+
+ void GuessLeading( const SwViewShell& rSh, const FontMetric& rMet );
+
+ void SetDevFont( const SwViewShell *pSh, OutputDevice& rOut );
+ OutputDevice* GetPrt() const { return m_pPrinter; }
+ sal_uInt16 GetZoom() const { return m_nZoom; }
+ sal_uInt16 GetPropWidth() const { return m_nPropWidth; }
+ bool IsSymbol() const { return m_bSymbol; }
+
+ void DrawText( SwDrawTextInfo &rInf );
+ /// determine the TextSize (of the printer)
+ Size GetTextSize( SwDrawTextInfo &rInf );
+ TextFrameIndex GetModelPositionForViewPoint(SwDrawTextInfo &rInf);
+
+ void CreateScrFont( const SwViewShell& rSh, const OutputDevice& rOut );
+ void CreatePrtFont( const OutputDevice& rOut );
+};
+
+SwFntObj *SwFntCache::First( )
+{
+ return static_cast<SwFntObj *>(SwCache::First());
+}
+
+SwFntObj *SwFntCache::Next( SwFntObj *pFntObj)
+{
+ return static_cast<SwFntObj *>(SwCache::Next( pFntObj ));
+}
+
+class SwFntAccess final : public SwCacheAccess
+{
+ SwViewShell const *m_pShell;
+
+ virtual SwCacheObj *NewObj( ) override;
+
+public:
+ SwFntAccess( const void*& rnFontCacheId, sal_uInt16 &rIndex, const void *pOwner,
+ SwViewShell const *pShell,
+ bool bCheck = false );
+ SwFntObj* Get() { return static_cast<SwFntObj*>( SwCacheAccess::Get() ); }
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/fntcap.hxx b/sw/source/core/inc/fntcap.hxx
new file mode 100644
index 0000000000..0b1cee67cd
--- /dev/null
+++ b/sw/source/core/inc/fntcap.hxx
@@ -0,0 +1,37 @@
+/* -*- 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_FNTCAP_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_FNTCAP_HXX
+
+#include <rtl/ustring.hxx>
+#include "TextFrameIndex.hxx"
+
+class SwFont;
+
+TextFrameIndex sw_CalcCaseMap( const SwFont& rFnt,
+ const OUString& rOrigString,
+ TextFrameIndex nOfst,
+ TextFrameIndex nLen,
+ TextFrameIndex nIdx );
+
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/frame.hxx b/sw/source/core/inc/frame.hxx
new file mode 100644
index 0000000000..d57654f6a9
--- /dev/null
+++ b/sw/source/core/inc/frame.hxx
@@ -0,0 +1,1446 @@
+/* -*- 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_FRAME_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_FRAME_HXX
+
+#include <drawinglayer/primitive2d/Primitive2DContainer.hxx>
+#include <editeng/borderline.hxx>
+#include <svl/poolitem.hxx>
+#include <swtypes.hxx>
+#include <swrect.hxx>
+#include <calbck.hxx>
+#include <svl/SfxBroadcaster.hxx>
+#include <o3tl/typed_flags_set.hxx>
+#include <com/sun/star/style/TabStop.hpp>
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <vcl/outdev.hxx>
+
+#include <memory>
+#include <optional>
+
+namespace drawinglayer::processor2d { class BaseProcessor2D; }
+
+class SwLayoutFrame;
+class SwRootFrame;
+class SwPageFrame;
+class SwBodyFrame;
+class SwFlyFrame;
+class SwSectionFrame;
+class SwFootnoteFrame;
+class SwFootnoteBossFrame;
+class SwTabFrame;
+class SwRowFrame;
+class SwContentFrame;
+class SwAttrSet;
+class Color;
+class SwBorderAttrs;
+class SwCache;
+class SvxBrushItem;
+class SvxFormatBreakItem;
+class SwFormatPageDesc;
+class SwSelectionList;
+struct SwPosition;
+struct SwCursorMoveState;
+class SwFormat;
+class SwPrintData;
+class SwSortedObjs;
+class SwAnchoredObject;
+enum class SvxFrameDirection;
+class IDocumentDrawModelAccess;
+class SwTextFrame;
+
+// Each FrameType is represented here as a bit.
+// The bits must be set in a way that it can be determined with masking of
+// which kind of FrameType an instance is _and_ from what classes it was derived.
+// Each frame has in its base class a member that must be set by the
+// constructors accordingly.
+enum class SwFrameType
+{
+ None = 0x0000,
+ Root = 0x0001,
+ Page = 0x0002,
+ Column = 0x0004,
+ Header = 0x0008,
+ Footer = 0x0010,
+ FtnCont = 0x0020,
+ Ftn = 0x0040,
+ Body = 0x0080,
+ Fly = 0x0100,
+ Section = 0x0200,
+// UNUSED 0x0400
+ Tab = 0x0800,
+ Row = 0x1000,
+ Cell = 0x2000,
+ Txt = 0x4000,
+ NoTxt = 0x8000,
+};
+
+namespace o3tl
+{
+ template<> struct typed_flags<SwFrameType> : is_typed_flags<SwFrameType, 0xfbff> {};
+};
+
+// for internal use some common combinations
+#define FRM_LAYOUT SwFrameType(0x3bFF)
+#define FRM_ALL SwFrameType(0xfbff)
+#define FRM_CNTNT (SwFrameType::Txt | SwFrameType::NoTxt)
+#define FRM_FTNBOSS (SwFrameType::Page | SwFrameType::Column)
+#define FRM_ACCESSIBLE (SwFrameType::Root | SwFrameType::Page | SwFrameType::Header | SwFrameType::Footer | SwFrameType::Ftn | SwFrameType::Fly | SwFrameType::Tab | SwFrameType::Cell | SwFrameType::Txt)
+#define FRM_NEIGHBOUR (SwFrameType::Column | SwFrameType::Cell)
+#define FRM_NOTE_VERT (SwFrameType::FtnCont | SwFrameType::Ftn | SwFrameType::Section | SwFrameType::Tab | SwFrameType::Row | SwFrameType::Cell | SwFrameType::Txt)
+#define FRM_HEADFOOT (SwFrameType::Header | SwFrameType::Footer)
+#define FRM_BODYFTNC (SwFrameType::FtnCont | SwFrameType::Body)
+
+// for GetNextLeaf/GetPrevLeaf.
+enum MakePageType
+{
+ MAKEPAGE_NONE, // do not create page/footnote
+ MAKEPAGE_APPEND, // only append page if needed
+ MAKEPAGE_INSERT, // add or append page if needed
+ MAKEPAGE_FTN, // add footnote if needed
+ MAKEPAGE_NOSECTION // Don't create section frames
+};
+
+namespace drawinglayer::attribute {
+ class SdrAllFillAttributesHelper;
+ typedef std::shared_ptr< SdrAllFillAttributesHelper > SdrAllFillAttributesHelperPtr;
+}
+
+/// Helper class to isolate geometry-defining members of SwFrame
+/// and to control their accesses. Moved to own class to have no
+/// hidden accesses to 'private' members anymore.
+///
+/// Added most important flags about the state of this geometric
+/// information and if it is valid or not
+class SAL_DLLPUBLIC_RTTI SwFrameAreaDefinition
+{
+private:
+ friend void FriendHackInvalidateRowFrame(SwFrameAreaDefinition &);
+
+ // The absolute position and size of the SwFrame in the document.
+ // This values are set by the layouter implementations
+ SwRect maFrameArea;
+
+ // The 'inner' Frame Area defined by a SwRect relative to FrameArea:
+ // When identical to FrameArea, Pos() will be (0, 0) and Size identical.
+ SwRect maFramePrintArea;
+
+ // bitfield
+ bool mbFrameAreaPositionValid : 1;
+ bool mbFrameAreaSizeValid : 1;
+ bool mbFramePrintAreaValid : 1;
+
+ // #i65250#
+ // frame ID is now in general available - used for layout loop control
+ static sal_uInt32 snLastFrameId;
+ const sal_uInt32 mnFrameId;
+
+protected:
+ // write access to mb*Valid flags
+ void setFrameAreaPositionValid(bool bNew);
+ void setFrameAreaSizeValid(bool bNew);
+ void setFramePrintAreaValid(bool bNew);
+
+public:
+ SwFrameAreaDefinition();
+ virtual ~SwFrameAreaDefinition();
+
+ // read access to mb*Valid flags
+ bool isFrameAreaPositionValid() const { return mbFrameAreaPositionValid; }
+ bool isFrameAreaSizeValid() const { return mbFrameAreaSizeValid; }
+ bool isFramePrintAreaValid() const { return mbFramePrintAreaValid; }
+
+ // syntactic sugar: test whole FrameAreaDefinition
+ bool isFrameAreaDefinitionValid() const { return isFrameAreaPositionValid() && isFrameAreaSizeValid() && isFramePrintAreaValid(); }
+
+ // #i65250#
+ sal_uInt32 GetFrameId() const { return mnFrameId; }
+
+ // read accesses to FrameArea definitions - only const access allowed.
+ // Do *not* const_cast results, it is necessary to track changes. use
+ // the below offered WriteAccess helper classes instead
+ const SwRect& getFrameArea() const { return maFrameArea; }
+ const SwRect& getFramePrintArea() const { return maFramePrintArea; }
+
+ // helper class(es) for FrameArea manipulation. These
+ // have to be used to apply changes to FrameAreas. They hold a copy of the
+ // SwRect for manipulation. It gets written back at destruction. Thus, this
+ // mechanism depends on scope usage, take care. It prevents errors using
+ // different instances of SwFrame in get/set methods which is more safe
+ class FrameAreaWriteAccess : public SwRect
+ {
+ private:
+ SwFrameAreaDefinition& mrTarget;
+
+ FrameAreaWriteAccess(const FrameAreaWriteAccess&) = delete;
+ FrameAreaWriteAccess& operator=(const FrameAreaWriteAccess&) = delete;
+
+ public:
+ FrameAreaWriteAccess(SwFrameAreaDefinition& rTarget) : SwRect(rTarget.getFrameArea()), mrTarget(rTarget) {}
+ ~FrameAreaWriteAccess();
+ void setSwRect(const SwRect& rNew) { *static_cast< SwRect* >(this) = rNew; }
+ };
+
+ // same helper for FramePrintArea
+ class FramePrintAreaWriteAccess : public SwRect
+ {
+ private:
+ SwFrameAreaDefinition& mrTarget;
+
+ FramePrintAreaWriteAccess(const FramePrintAreaWriteAccess&) = delete;
+ FramePrintAreaWriteAccess& operator=(const FramePrintAreaWriteAccess&) = delete;
+
+ public:
+ FramePrintAreaWriteAccess(SwFrameAreaDefinition& rTarget) : SwRect(rTarget.getFramePrintArea()), mrTarget(rTarget) {}
+ ~FramePrintAreaWriteAccess();
+ void setSwRect(const SwRect& rNew) { *static_cast< SwRect* >(this) = rNew; }
+ };
+
+ // RotateFlyFrame3 - Support for Transformations
+ // Hand out the Transformations for the current FrameAreaDefinition
+ // for the FrameArea and FramePrintArea.
+ // FramePrintArea is not relative to FrameArea in this
+ // transformation representation (to make it easier to use and understand).
+ // There is no 'set' method since SwFrame is a layout object. For
+ // some cases rotation will be included (used for SwGrfNode in inner
+ // SwFrame of a SwFlyFrame)
+ virtual basegfx::B2DHomMatrix getFrameAreaTransformation() const;
+ virtual basegfx::B2DHomMatrix getFramePrintAreaTransformation() const;
+
+ // RotateFlyFrame3 - Support for Transformations
+ // Modify current transformations by applying given translation
+ virtual void transform_translate(const Point& rOffset);
+};
+
+/// RotateFlyFrame3: Helper class when you want to make your SwFrame derivate
+/// transformable. It provides some tooling to do so. To use, add as member
+/// (see e.g. SwFlyFreeFrame which uses 'std::unique_ptr< TransformableSwFrame >')
+class TransformableSwFrame
+{
+private:
+ // The SwFrameAreaDefinition to work on
+ SwFrameAreaDefinition& mrSwFrameAreaDefinition;
+
+ // FrameAreaTransformation and FramePrintAreaTransformation
+ // !identity when needed (translate/scale is used (e.g. rotation))
+ basegfx::B2DHomMatrix maFrameAreaTransformation;
+ basegfx::B2DHomMatrix maFramePrintAreaTransformation;
+
+public:
+ TransformableSwFrame(SwFrameAreaDefinition& rSwFrameAreaDefinition)
+ : mrSwFrameAreaDefinition(rSwFrameAreaDefinition),
+ maFrameAreaTransformation(),
+ maFramePrintAreaTransformation()
+ {
+ }
+
+ // get SwFrameArea in transformation form
+ const basegfx::B2DHomMatrix& getLocalFrameAreaTransformation() const
+ {
+ return maFrameAreaTransformation;
+ }
+
+ // get SwFramePrintArea in transformation form
+ const basegfx::B2DHomMatrix& getLocalFramePrintAreaTransformation() const
+ {
+ return maFramePrintAreaTransformation;
+ }
+
+ // Helpers to re-create the untransformed SwRect(s) originally
+ // in the SwFrameAreaDefinition, based on the current Transformations.
+ SwRect getUntransformedFrameArea() const;
+ SwRect getUntransformedFramePrintArea() const;
+
+ // Helper method to re-create FrameAreaTransformations based on the
+ // current FrameAreaDefinition transformed by given rotation and Center
+ void createFrameAreaTransformations(
+ double fRotation,
+ const basegfx::B2DPoint& rCenter);
+
+ // Tooling method to reset the SwRect(s) in the current
+ // SwFrameAreaDefinition which are already adapted to
+ // Transformation back to the untransformed state, using
+ // the getUntransformedFrame*Area calls above when needed.
+ // Only the SwRect(s) are changed back, not the transformations.
+ void restoreFrameAreas();
+
+ // Re-Creates the SwRect(s) as BoundAreas based on the current
+ // set Transformations.
+ void adaptFrameAreasToTransformations();
+
+ // Modify current definitions by applying the given transformation
+ void transform(const basegfx::B2DHomMatrix& aTransform);
+};
+
+enum class SwFrameInvFlags : sal_uInt8
+{
+ NONE = 0x00,
+ InvalidatePrt = 0x01,
+ InvalidateSize = 0x02,
+ InvalidatePos = 0x04,
+ SetCompletePaint = 0x08,
+ NextInvalidatePos = 0x10,
+ NextSetCompletePaint = 0x20,
+};
+
+namespace o3tl {
+ template<> struct typed_flags<SwFrameInvFlags> : is_typed_flags<SwFrameInvFlags, 0x003f> {};
+}
+
+/**
+ * Base class of the Writer layout elements.
+ *
+ * This includes not only fly frames, but everything down to the paragraph
+ * level: pages, headers, footers, etc. (Inside a paragraph SwLinePortion
+ * instances are used.)
+ */
+class SW_DLLPUBLIC SwFrame : public SwFrameAreaDefinition, public SwClient, public SfxBroadcaster
+{
+ // the hidden Frame
+ friend class SwFlowFrame;
+ friend class SwLayoutFrame;
+ friend class SwLooping;
+ friend class SwDeletionChecker; // for GetDep()
+
+ // voids lower during creation of a column
+ friend SwFrame *SaveContent( SwLayoutFrame *, SwFrame* pStart );
+ friend void RestoreContent( SwFrame *, SwLayoutFrame *, SwFrame *pSibling );
+
+ // for validating a mistakenly invalidated one in SwContentFrame::MakeAll
+ friend void ValidateSz( SwFrame *pFrame );
+ // implemented in text/txtftn.cxx, prevents Footnote oscillation
+ friend void ValidateText( SwFrame *pFrame );
+
+ friend void MakeNxt( SwFrame *pFrame, SwFrame *pNxt );
+
+ // cache for (border) attributes
+ static SwCache *spCache;
+
+ SwRootFrame *mpRoot;
+ SwLayoutFrame *mpUpper;
+ SwFrame *mpNext;
+ SwFrame *mpPrev;
+
+ // sw_redlinehide: hide these dangerous SwClient functions
+ using SwClient::GetRegisteredInNonConst;
+ using SwClient::GetRegisteredIn;
+
+ SwFrame *FindNext_();
+ SwFrame *FindPrev_();
+
+ /** method to determine next content frame in the same environment
+ for a flow frame (content frame, table frame, section frame)
+
+ #i27138# - adding documentation:
+ Travelling downwards through the layout to determine the next content
+ frame in the same environment. There are several environments in a
+ document, which form a closed context regarding this function. These
+ environments are:
+ - Each page header
+ - Each page footer
+ - Each unlinked fly frame
+ - Each group of linked fly frames
+ - All footnotes
+ - All document body frames
+ #i27138# - adding parameter <_bInSameFootnote>
+ Its default value is <false>. If its value is <true>, the environment
+ 'All footnotes' is no longer treated. Instead each footnote is treated
+ as an own environment.
+
+ @param _bInSameFootnote
+ input parameter - boolean indicating, that the found next content
+ frame has to be in the same footnote frame. This parameter is only
+ relevant for flow frames in footnotes.
+
+ @return SwContentFrame*
+ pointer to the found next content frame. It's NULL, if none exists.
+ */
+ SwContentFrame* FindNextCnt_( const bool _bInSameFootnote );
+
+ /** method to determine previous content frame in the same environment
+ for a flow frame (content frame, table frame, section frame)
+
+ #i27138#
+ Travelling upwards through the layout to determine the previous content
+ frame in the same environment. There are several environments in a
+ document, which form a closed context regarding this function. These
+ environments are:
+ - Each page header
+ - Each page footer
+ - Each unlinked fly frame
+ - Each group of linked fly frames
+ - All footnotes
+ - All document body frames
+ #i27138# - adding parameter <_bInSameFootnote>
+ Its default value is <false>. If its value is <true>, the environment
+ 'All footnotes' is no longer treated. Instead each footnote is treated
+ as an own environment.
+
+ The found previous content frame has to be in the same footnote frame. This is only
+ relevant for flow frames in footnotes.
+
+ @return SwContentFrame*
+ pointer to the found previous content frame. It's NULL, if none exists.
+ */
+ SwContentFrame* FindPrevCnt_();
+
+ void UpdateAttrFrame( const SfxPoolItem*, const SfxPoolItem*, SwFrameInvFlags & );
+ SwFrame* GetIndNext_();
+ void SetDirFlags( bool bVert );
+
+ const SwLayoutFrame* ImplGetNextLayoutLeaf( bool bFwd ) const;
+
+ SwPageFrame* ImplFindPageFrame();
+
+protected:
+ std::unique_ptr<SwSortedObjs> m_pDrawObjs; // draw objects, can be null
+ SwFrameType mnFrameType; //Who am I?
+
+ bool mbInDtor : 1;
+ bool mbInvalidR2L : 1;
+ bool mbDerivedR2L : 1;
+ bool mbRightToLeft : 1;
+ bool mbInvalidVert : 1;
+ bool mbDerivedVert : 1;
+ bool mbVertical : 1;
+
+ bool mbVertLR : 1;
+ bool mbVertLRBT : 1;
+
+ bool mbValidLineNum : 1;
+ bool mbFixSize : 1;
+
+ // if true, frame will be painted completely even content was changed
+ // only partially. For ContentFrames a border (from Action) will exclusively
+ // painted if <mbCompletePaint> is true.
+ bool mbCompletePaint : 1;
+
+ bool mbRetouche : 1; // frame is responsible for retouching
+
+ bool mbInfInvalid : 1; // InfoFlags are invalid
+ bool mbInfBody : 1; // Frame is in document body
+ bool mbInfTab : 1; // Frame is in a table
+ bool mbInfFly : 1; // Frame is in a Fly
+ bool mbInfFootnote : 1; // Frame is in a footnote
+ bool mbInfSct : 1; // Frame is in a section
+ bool mbColLocked : 1; // lock Grow/Shrink for column-wise section
+ // or fly frames, will be set in Format
+ bool m_isInDestroy : 1;
+ int mnForbidDelete;
+
+ void ColLock() { mbColLocked = true; }
+ void ColUnlock() { mbColLocked = false; }
+
+ virtual void DestroyImpl();
+ virtual ~SwFrame() override;
+
+ // Only used by SwRootFrame Ctor to get 'this' into mpRoot...
+ void setRootFrame( SwRootFrame* pRoot ) { mpRoot = pRoot; }
+
+ SwPageFrame *InsertPage( SwPageFrame *pSibling, bool bFootnote );
+ void PrepareMake(vcl::RenderContext* pRenderContext);
+ void OptPrepareMake();
+ /// Calculates the frame area position, in case it's invalid. The frame area size and the print
+ /// area is not considered here.
+ virtual void MakePos();
+ // Format next frame of table frame to assure keeping attributes.
+ // In case of nested tables method <SwFrame::MakeAll()> is called to
+ // avoid formatting of superior table frame.
+ friend SwFrame* sw_FormatNextContentForKeep( SwTabFrame* pTabFrame );
+
+ virtual void MakeAll(vcl::RenderContext* pRenderContext) = 0;
+ // adjust frames of a page
+ SwTwips AdjustNeighbourhood( SwTwips nDiff, bool bTst = false );
+
+ // change only frame size not the size of PrtArea
+ virtual SwTwips ShrinkFrame( SwTwips, bool bTst = false, bool bInfo = false ) = 0;
+ virtual SwTwips GrowFrame ( SwTwips, bool bTst = false, bool bInfo = false ) = 0;
+
+ /// use these so we can grep for SwFrame's GetRegisteredIn accesses
+ /// beware that SwTextFrame may return sw::WriterMultiListener
+ sw::BroadcastingModify* GetDep()
+ { return static_cast<sw::BroadcastingModify*>(GetRegisteredInNonConst()); }
+ const sw::BroadcastingModify* GetDep() const
+ { return static_cast<const sw::BroadcastingModify*>(GetRegisteredIn()); }
+
+ SwFrame( sw::BroadcastingModify*, SwFrame* );
+
+ void CheckDir( SvxFrameDirection nDir, bool bVert, bool bOnlyBiDi, bool bBrowse );
+
+ /** enumeration for the different invalidations
+ #i28701#
+ */
+ enum InvalidationType
+ {
+ INVALID_SIZE, INVALID_PRTAREA, INVALID_POS, INVALID_LINENUM, INVALID_ALL
+ };
+
+ /** method to determine, if an invalidation is allowed.
+ #i28701
+ */
+ virtual bool InvalidationAllowed( const InvalidationType _nInvalid ) const;
+
+ /** method to perform additional actions on an invalidation
+
+ #i28701#
+ Method has *only* to contain actions, which has to be performed on
+ *every* assignment of the corresponding flag to <false>.
+ */
+ virtual void ActionOnInvalidation( const InvalidationType _nInvalid );
+
+ // draw shadow and borders
+ void PaintShadow( const SwRect&, SwRect&, const SwBorderAttrs& ) const;
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+
+ virtual const IDocumentDrawModelAccess& getIDocumentDrawModelAccess( );
+
+public:
+ virtual css::uno::Sequence< css::style::TabStop > GetTabStopInfo( SwTwips )
+ {
+ return css::uno::Sequence< css::style::TabStop >();
+ }
+
+
+ SwFrameType GetType() const { return mnFrameType; }
+
+ static SwCache &GetCache() { return *spCache; }
+ static SwCache *GetCachePtr() { return spCache; }
+ static void SetCache( SwCache *pNew ) { spCache = pNew; }
+
+ // change PrtArea size and FrameSize
+ SwTwips Shrink( SwTwips, bool bTst = false, bool bInfo = false );
+ SwTwips Grow ( SwTwips, bool bTst = false, bool bInfo = false );
+
+ // different methods for inserting in layout tree (for performance reasons)
+
+ // insert before pBehind or at the end of the chain below mpUpper
+ void InsertBefore( SwLayoutFrame* pParent, SwFrame* pBehind );
+ // insert after pBefore or at the beginning of the chain below mpUpper
+ void InsertBehind( SwLayoutFrame *pParent, SwFrame *pBefore );
+ // insert before pBehind or at the end of the chain while considering
+ // the siblings of pSct
+ bool InsertGroupBefore( SwFrame* pParent, SwFrame* pWhere, SwFrame* pSct );
+ void RemoveFromLayout();
+
+ // For internal use only - who ignores this will be put in a sack and has
+ // to stay there for two days
+ // Does special treatment for Get_[Next|Prev]Leaf() (for tables).
+ SwLayoutFrame *GetLeaf( MakePageType eMakePage, bool bFwd );
+ SwLayoutFrame *GetNextLeaf ( MakePageType eMakePage );
+ SwLayoutFrame *GetNextFootnoteLeaf( MakePageType eMakePage );
+ SwLayoutFrame *GetNextSctLeaf( MakePageType eMakePage );
+ SwLayoutFrame *GetNextFlyLeaf( MakePageType eMakePage );
+ SwLayoutFrame *GetNextCellLeaf();
+ SwLayoutFrame *GetPrevLeaf ();
+ SwLayoutFrame *GetPrevFootnoteLeaf( MakePageType eMakeFootnote );
+ SwLayoutFrame *GetPrevSctLeaf();
+ SwLayoutFrame *GetPrevFlyLeaf();
+ SwLayoutFrame *GetPrevCellLeaf();
+ const SwLayoutFrame *GetLeaf ( MakePageType eMakePage, bool bFwd,
+ const SwFrame *pAnch ) const;
+
+ bool WrongPageDesc( SwPageFrame* pNew );
+
+ //#i28701# - new methods to append/remove drawing objects
+ void AppendDrawObj( SwAnchoredObject& _rNewObj );
+ void RemoveDrawObj( SwAnchoredObject& _rToRemoveObj );
+
+ // work with chain of FlyFrames
+ void AppendFly( SwFlyFrame *pNew );
+ void RemoveFly( SwFlyFrame *pToRemove );
+ const SwSortedObjs *GetDrawObjs() const { return m_pDrawObjs.get(); }
+ SwSortedObjs *GetDrawObjs() { return m_pDrawObjs.get(); }
+ void SetDrawObjsAsDeleted( bool bDeleted ); // change tracking of objects anchored to character
+ // #i28701# - change purpose of method and adjust its name
+ void InvalidateObjs( const bool _bNoInvaOfAsCharAnchoredObjs = true );
+
+ virtual void PaintSwFrameShadowAndBorder(
+ const SwRect&,
+ const SwPageFrame* pPage,
+ const SwBorderAttrs&) const;
+ void PaintBaBo( const SwRect&, const SwPageFrame *pPage,
+ const bool bOnlyTextBackground = false) const;
+ void PaintSwFrameBackground( const SwRect&, const SwPageFrame *pPage,
+ const SwBorderAttrs &,
+ const bool bLowerMode = false,
+ const bool bLowerBorder = false,
+ const bool bOnlyTextBackground = false ) const;
+ void PaintBorderLine( const SwRect&, const SwRect&, const SwPageFrame*,
+ const Color *pColor,
+ const SvxBorderLineStyle = SvxBorderLineStyle::SOLID ) const;
+
+ std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> CreateProcessor2D( ) const;
+ void ProcessPrimitives( const drawinglayer::primitive2d::Primitive2DContainer& rSequence ) const;
+
+ // retouch, not in the area of the given Rect!
+ void Retouch( const SwPageFrame *pPage, const SwRect &rRect ) const;
+
+ bool GetBackgroundBrush(
+ drawinglayer::attribute::SdrAllFillAttributesHelperPtr& rFillAttributes,
+ const SvxBrushItem*& rpBrush,
+ std::optional<Color>& rxColor,
+ SwRect &rOrigRect,
+ bool bLowerMode,
+ bool bConsiderTextBox ) const;
+
+ inline void SetCompletePaint() const;
+ inline void ResetCompletePaint() const;
+ bool IsCompletePaint() const { return mbCompletePaint; }
+
+ inline void SetRetouche() const;
+ inline void ResetRetouche() const;
+ bool IsRetouche() const { return mbRetouche; }
+
+ void SetInfFlags();
+ void InvalidateInfFlags() { mbInfInvalid = true; }
+ inline bool IsInDocBody() const; // use InfoFlags, determine flags
+ inline bool IsInFootnote() const; // if necessary
+ inline bool IsInTab() const;
+ inline bool IsInFly() const;
+ inline bool IsInSct() const;
+
+ // If frame is inside a split table row, this function returns
+ // the corresponding row frame in the follow table.
+ const SwRowFrame* IsInSplitTableRow() const;
+
+ // If frame is inside a follow flow row, this function returns
+ // the corresponding row frame master table
+ const SwRowFrame* IsInFollowFlowRow() const;
+
+ bool IsInBalancedSection() const;
+
+ inline bool IsVertical() const;
+ inline bool IsVertLR() const;
+ inline bool IsVertLRBT() const;
+
+ void SetDerivedVert( bool bNew ){ mbDerivedVert = bNew; }
+ void SetInvalidVert( bool bNew) { mbInvalidVert = bNew; }
+ inline bool IsRightToLeft() const;
+ void SetDerivedR2L( bool bNew ) { mbDerivedR2L = bNew; }
+
+ void CheckDirChange();
+ // returns upper left frame position for LTR and
+ // upper right frame position for Asian / RTL frames
+ Point GetFrameAnchorPos( bool bIgnoreFlysAnchoredAtThisFrame ) const;
+
+ /** determine, if frame is moveable in given environment
+
+ method replaced 'old' method <bool IsMoveable() const>.
+ Determines, if frame is moveable in given environment. if no environment
+ is given (parameter _pLayoutFrame == 0), the movability in the actual
+ environment (<GetUpper()) is checked.
+
+ @param _pLayoutFrame
+ input parameter - given environment (layout frame), in which the movability
+ will be checked. If not set ( == 0 ), actual environment is taken.
+
+ @return boolean, indicating, if frame is moveable in given environment
+ */
+ bool IsMoveable( const SwLayoutFrame* _pLayoutFrame = nullptr ) const;
+
+ // Is it permitted for the (Text)Frame to add a footnote in the current
+ // environment (not e.g. for repeating table headlines)
+ bool IsFootnoteAllowed() const;
+
+ /// Calculates the frame area size and the print area, in case they are invalid.
+ /// The frame area position is not considered here.
+ virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr );
+
+ virtual void CheckDirection( bool bVert );
+
+ void ReinitializeFrameSizeAttrFlags();
+
+ /// WARNING: this may not return correct RES_PAGEDESC/RES_BREAK items for
+ /// SwTextFrame, use GetBreakItem()/GetPageDescItem() instead
+ const SwAttrSet *GetAttrSet() const;
+ virtual const SvxFormatBreakItem& GetBreakItem() const;
+ virtual const SwFormatPageDesc& GetPageDescItem() const;
+
+ bool HasFixSize() const { return mbFixSize; }
+
+ // check all pages (starting from the given) and correct them if needed
+ static void CheckPageDescs( SwPageFrame *pStart, bool bNotifyFields = true, SwPageFrame** ppPrev = nullptr);
+
+ // might return 0, with and without const
+ SwFrame *GetNext() { return mpNext; }
+ SwFrame *GetPrev() { return mpPrev; }
+ SwLayoutFrame *GetUpper() { return mpUpper; }
+ SwRootFrame *getRootFrame(){ return mpRoot; }
+ SwPageFrame *FindPageFrame() { return IsPageFrame() ? reinterpret_cast<SwPageFrame*>(this) : ImplFindPageFrame(); }
+ SwFrame *FindColFrame();
+ SwRowFrame *FindRowFrame();
+ SwFootnoteBossFrame *FindFootnoteBossFrame( bool bFootnotes = false );
+ SwTabFrame *ImplFindTabFrame();
+ SwFootnoteFrame *ImplFindFootnoteFrame();
+ SwFlyFrame *ImplFindFlyFrame();
+ SwSectionFrame *ImplFindSctFrame();
+ const SwBodyFrame *ImplFindBodyFrame() const;
+ SwFrame *FindFooterOrHeader();
+ SwFrame *GetLower();
+ const SwFrame *GetNext() const { return mpNext; }
+ const SwFrame *GetPrev() const { return mpPrev; }
+ const SwLayoutFrame *GetUpper() const { return mpUpper; }
+ const SwRootFrame *getRootFrame() const { return mpRoot; }
+ inline SwTabFrame *FindTabFrame();
+ inline SwFootnoteFrame *FindFootnoteFrame();
+ inline SwFlyFrame *FindFlyFrame();
+ inline SwSectionFrame *FindSctFrame();
+ inline SwFrame *FindNext();
+ // #i27138# - add parameter <_bInSameFootnote>
+ SwContentFrame* FindNextCnt( const bool _bInSameFootnote = false );
+ inline SwFrame *FindPrev();
+ inline const SwPageFrame *FindPageFrame() const;
+ inline const SwFootnoteBossFrame *FindFootnoteBossFrame( bool bFootnote = false ) const;
+ inline const SwFrame *FindColFrame() const;
+ inline const SwFrame *FindFooterOrHeader() const;
+ inline const SwTabFrame *FindTabFrame() const;
+ inline const SwFootnoteFrame *FindFootnoteFrame() const;
+ inline const SwFlyFrame *FindFlyFrame() const;
+ inline const SwSectionFrame *FindSctFrame() const;
+ inline const SwBodyFrame *FindBodyFrame() const;
+ inline const SwFrame *FindNext() const;
+ // #i27138# - add parameter <_bInSameFootnote>
+ const SwContentFrame* FindNextCnt( const bool _bInSameFootnote = false ) const;
+ inline const SwFrame *FindPrev() const;
+ const SwFrame *GetLower() const;
+
+ SwContentFrame* FindPrevCnt();
+
+ const SwContentFrame* FindPrevCnt() const;
+
+ // #i79774#
+ SwFrame* GetIndPrev_() const;
+ SwFrame* GetIndPrev() const
+ { return ( mpPrev || !IsInSct() ) ? mpPrev : GetIndPrev_(); }
+
+ SwFrame* GetIndNext()
+ { return ( mpNext || !IsInSct() ) ? mpNext : GetIndNext_(); }
+ const SwFrame* GetIndNext() const { return const_cast<SwFrame*>(this)->GetIndNext(); }
+
+ sal_uInt16 GetPhyPageNum() const; // page number without offset
+ sal_uInt16 GetVirtPageNum() const; // page number with offset
+ bool OnRightPage() const { return 0 != GetPhyPageNum() % 2; };
+ bool WannaRightPage() const;
+ bool OnFirstPage() const;
+
+ inline const SwLayoutFrame *GetPrevLayoutLeaf() const;
+ inline const SwLayoutFrame *GetNextLayoutLeaf() const;
+ inline SwLayoutFrame *GetPrevLayoutLeaf();
+ inline SwLayoutFrame *GetNextLayoutLeaf();
+
+ virtual void Calc(vcl::RenderContext* pRenderContext) const; // here might be "formatted"
+ inline void OptCalc() const; // here we assume (for optimization) that
+ // the predecessors are already formatted
+ Point GetRelPos() const;
+
+ // PaintArea is the area where content might be displayed.
+ // The margin of a page or the space between columns belongs to it.
+ SwRect GetPaintArea() const;
+
+ // UnionFrame is the union of Frame- and PrtArea, normally identical
+ // to the FrameArea except in case of negative Prt margins.
+ SwRect UnionFrame( bool bBorder = false ) const;
+
+ virtual Size ChgSize( const Size& aNewSize );
+
+ virtual void Cut() = 0;
+ virtual void Paste( SwFrame* pParent, SwFrame* pSibling = nullptr ) = 0;
+
+ void ValidateLineNum() { mbValidLineNum = true; }
+
+ bool GetValidLineNumFlag()const { return mbValidLineNum; }
+
+ // Only invalidate Frame
+ // #i28701# - add call to method <ActionOnInvalidation(..)>
+ // for all invalidation methods.
+ // #i28701# - use method <InvalidationAllowed(..)> to
+ // decide, if invalidation will to be performed or not.
+ // #i26945# - no additional invalidation, if it's already
+ // invalidate.
+ void InvalidateSize_()
+ {
+ if ( isFrameAreaSizeValid() && InvalidationAllowed( INVALID_SIZE ) )
+ {
+ setFrameAreaSizeValid(false);
+ ActionOnInvalidation( INVALID_SIZE );
+ }
+ }
+ void InvalidatePrt_()
+ {
+ if ( isFramePrintAreaValid() && InvalidationAllowed( INVALID_PRTAREA ) )
+ {
+ setFramePrintAreaValid(false);
+ ActionOnInvalidation( INVALID_PRTAREA );
+ }
+ }
+ void InvalidatePos_()
+ {
+ if ( isFrameAreaPositionValid() && InvalidationAllowed( INVALID_POS ) )
+ {
+ setFrameAreaPositionValid(false);
+ ActionOnInvalidation( INVALID_POS );
+ }
+ }
+ void InvalidateLineNum_()
+ {
+ if ( mbValidLineNum && InvalidationAllowed( INVALID_LINENUM ) )
+ {
+ mbValidLineNum = false;
+ ActionOnInvalidation( INVALID_LINENUM );
+ }
+ }
+ void InvalidateAll_()
+ {
+ if ( ( isFrameAreaSizeValid() || isFramePrintAreaValid() || isFrameAreaPositionValid() ) && InvalidationAllowed( INVALID_ALL ) )
+ {
+ setFrameAreaSizeValid(false);
+ setFrameAreaPositionValid(false);
+ setFramePrintAreaValid(false);
+ ActionOnInvalidation( INVALID_ALL );
+ }
+ }
+ // also notify page at the same time
+ inline void InvalidateSize();
+ inline void InvalidatePrt();
+ inline void InvalidatePos();
+ inline void InvalidateLineNum();
+ inline void InvalidateAll();
+ void ImplInvalidateSize();
+ void ImplInvalidatePrt();
+ void ImplInvalidatePos();
+ void ImplInvalidateLineNum();
+
+ inline void InvalidateNextPos( bool bNoFootnote = false );
+ void ImplInvalidateNextPos( bool bNoFootnote );
+
+ /** method to invalidate printing area of next frame
+ #i11859#
+ */
+ void InvalidateNextPrtArea();
+
+ void InvalidatePage( const SwPageFrame *pPage = nullptr ) const;
+
+ virtual bool FillSelection( SwSelectionList& rList, const SwRect& rRect ) const;
+
+ virtual bool GetModelPositionForViewPoint( SwPosition *, Point&,
+ SwCursorMoveState* = nullptr, bool bTestBackground = false ) const;
+ virtual bool GetCharRect( SwRect &, const SwPosition&,
+ SwCursorMoveState* = nullptr, bool bAllowFarAway = true ) const;
+ virtual void PaintSwFrame( vcl::RenderContext& rRenderContext, SwRect const&,
+ SwPrintData const*const pPrintData = nullptr ) const;
+
+ // HACK: shortcut between frame and formatting
+ // It's your own fault if you cast void* incorrectly! In any case check
+ // the void* for 0.
+ virtual bool Prepare( const PrepareHint ePrep = PrepareHint::Clear,
+ const void *pVoid = nullptr, bool bNotify = true );
+
+ // true if it is the correct class, false otherwise
+ inline bool IsLayoutFrame() const;
+ inline bool IsRootFrame() const;
+ inline bool IsPageFrame() const;
+ inline bool IsColumnFrame() const;
+ inline bool IsFootnoteBossFrame() const; // footnote bosses might be PageFrames or ColumnFrames
+ inline bool IsHeaderFrame() const;
+ inline bool IsFooterFrame() const;
+ inline bool IsFootnoteContFrame() const;
+ inline bool IsFootnoteFrame() const;
+ inline bool IsBodyFrame() const;
+ inline bool IsColBodyFrame() const; // implemented in layfrm.hxx, BodyFrame above ColumnFrame
+ inline bool IsPageBodyFrame() const; // implemented in layfrm.hxx, BodyFrame above PageFrame
+ inline bool IsFlyFrame() const;
+ inline bool IsSctFrame() const;
+ inline bool IsTabFrame() const;
+ inline bool IsRowFrame() const;
+ inline bool IsCellFrame() const;
+ inline bool IsContentFrame() const;
+ inline bool IsTextFrame() const;
+ SwTextFrame* DynCastTextFrame();
+ const SwTextFrame* DynCastTextFrame() const;
+ SwPageFrame* DynCastPageFrame();
+ const SwPageFrame* DynCastPageFrame() const;
+ inline bool IsNoTextFrame() const;
+ // Frames where its PrtArea depends on their neighbors and that are
+ // positioned in the content flow
+ inline bool IsFlowFrame() const;
+ // Frames that are capable of retouching or that might need to retouch behind
+ // themselves
+ inline bool IsRetoucheFrame() const;
+ inline bool IsAccessibleFrame() const;
+
+ void PrepareCursor(); // CursorShell is allowed to call this
+
+ // Is the Frame (or the section containing it) protected? Same for Fly in
+ // Fly in ... and footnotes
+ bool IsProtected() const;
+
+ bool IsColLocked() const { return mbColLocked; }
+ virtual bool IsDeleteForbidden() const { return mnForbidDelete > 0; }
+
+ /// this is the only way to delete a SwFrame instance
+ static void DestroyFrame(SwFrame *const pFrame);
+
+ bool IsInDtor() const { return mbInDtor; }
+
+ // No inline cause we need the function pointers
+ tools::Long GetTopMargin() const;
+ tools::Long GetBottomMargin() const;
+ tools::Long GetLeftMargin() const;
+ tools::Long GetRightMargin() const;
+ void SetTopBottomMargins( tools::Long, tools::Long );
+ void SetLeftRightMargins( tools::Long, tools::Long );
+ void SetRightLeftMargins( tools::Long, tools::Long );
+ tools::Long GetPrtLeft() const;
+ tools::Long GetPrtBottom() const;
+ tools::Long GetPrtRight() const;
+ tools::Long GetPrtTop() const;
+ bool SetMinLeft( tools::Long );
+ bool SetMaxBottom( tools::Long );
+ bool SetMaxRight( tools::Long );
+ void MakeBelowPos( const SwFrame*, const SwFrame*, bool );
+ void MakeLeftPos( const SwFrame*, const SwFrame*, bool );
+ void MakeRightPos( const SwFrame*, const SwFrame*, bool );
+ bool IsNeighbourFrame() const
+ { return bool(GetType() & FRM_NEIGHBOUR); }
+
+ // NEW TABLES
+ // Some functions for covered/covering table cells. This way unnecessary
+ // includes can be avoided
+ virtual bool IsLeaveUpperAllowed() const;
+ virtual bool IsCoveredCell() const;
+ bool IsInCoveredCell() const;
+
+ // #i81146# new loop control
+ bool KnowsFormat( const SwFormat& rFormat ) const;
+ void RegisterToFormat( SwFormat& rFormat );
+ void ValidateThisAndAllLowers( const sal_uInt16 nStage );
+
+ void ForbidDelete() { ++mnForbidDelete; }
+ void AllowDelete() { assert(mnForbidDelete > 0); --mnForbidDelete; }
+
+ drawinglayer::attribute::SdrAllFillAttributesHelperPtr getSdrAllFillAttributesHelper() const;
+ bool supportsFullDrawingLayerFillAttributeSet() const;
+
+public:
+ // if writer is NULL, dumps the layout structure as XML in layout.xml
+ virtual void dumpAsXml(xmlTextWriterPtr writer = nullptr) const = 0;
+ void dumpTopMostAsXml(xmlTextWriterPtr writer = nullptr) const;
+ void dumpInfosAsXml(xmlTextWriterPtr writer) const;
+ virtual void dumpAsXmlAttributes(xmlTextWriterPtr writer) const;
+ void dumpChildrenAsXml(xmlTextWriterPtr writer) const;
+ bool IsCollapse() const;
+};
+
+inline bool SwFrame::IsInDocBody() const
+{
+ if ( mbInfInvalid )
+ const_cast<SwFrame*>(this)->SetInfFlags();
+ return mbInfBody;
+}
+inline bool SwFrame::IsInFootnote() const
+{
+ if ( mbInfInvalid )
+ const_cast<SwFrame*>(this)->SetInfFlags();
+ return mbInfFootnote;
+}
+inline bool SwFrame::IsInTab() const
+{
+ if ( mbInfInvalid )
+ const_cast<SwFrame*>(this)->SetInfFlags();
+ return mbInfTab;
+}
+inline bool SwFrame::IsInFly() const
+{
+ if ( mbInfInvalid )
+ const_cast<SwFrame*>(this)->SetInfFlags();
+ return mbInfFly;
+}
+inline bool SwFrame::IsInSct() const
+{
+ if ( mbInfInvalid )
+ const_cast<SwFrame*>(this)->SetInfFlags();
+ return mbInfSct;
+}
+bool SwFrame::IsVertical() const
+{
+ if( mbInvalidVert )
+ const_cast<SwFrame*>(this)->SetDirFlags( true );
+ return mbVertical;
+}
+inline bool SwFrame::IsVertLR() const
+{
+ return mbVertLR;
+}
+inline bool SwFrame::IsVertLRBT() const
+{
+ return mbVertLRBT;
+}
+inline bool SwFrame::IsRightToLeft() const
+{
+ if( mbInvalidR2L )
+ const_cast<SwFrame*>(this)->SetDirFlags( false );
+ return mbRightToLeft;
+}
+
+inline void SwFrame::SetCompletePaint() const
+{
+ const_cast<SwFrame*>(this)->mbCompletePaint = true;
+}
+inline void SwFrame::ResetCompletePaint() const
+{
+ const_cast<SwFrame*>(this)->mbCompletePaint = false;
+}
+
+inline void SwFrame::SetRetouche() const
+{
+ const_cast<SwFrame*>(this)->mbRetouche = true;
+}
+inline void SwFrame::ResetRetouche() const
+{
+ const_cast<SwFrame*>(this)->mbRetouche = false;
+}
+
+inline SwLayoutFrame *SwFrame::GetNextLayoutLeaf()
+{
+ return const_cast<SwLayoutFrame*>(static_cast<const SwFrame*>(this)->GetNextLayoutLeaf());
+}
+inline SwLayoutFrame *SwFrame::GetPrevLayoutLeaf()
+{
+ return const_cast<SwLayoutFrame*>(static_cast<const SwFrame*>(this)->GetPrevLayoutLeaf());
+}
+inline const SwLayoutFrame *SwFrame::GetNextLayoutLeaf() const
+{
+ return ImplGetNextLayoutLeaf( true );
+}
+inline const SwLayoutFrame *SwFrame::GetPrevLayoutLeaf() const
+{
+ return ImplGetNextLayoutLeaf( false );
+}
+
+inline void SwFrame::InvalidateSize()
+{
+ if ( isFrameAreaSizeValid() )
+ {
+ ImplInvalidateSize();
+ }
+}
+inline void SwFrame::InvalidatePrt()
+{
+ if ( isFramePrintAreaValid() )
+ {
+ ImplInvalidatePrt();
+ }
+}
+inline void SwFrame::InvalidatePos()
+{
+ if ( isFrameAreaPositionValid() )
+ {
+ ImplInvalidatePos();
+ }
+}
+inline void SwFrame::InvalidateLineNum()
+{
+ if ( mbValidLineNum )
+ ImplInvalidateLineNum();
+}
+inline void SwFrame::InvalidateAll()
+{
+ if ( InvalidationAllowed( INVALID_ALL ) )
+ {
+ if ( isFrameAreaDefinitionValid() )
+ {
+ ImplInvalidatePos();
+ }
+
+ setFrameAreaSizeValid(false);
+ setFrameAreaPositionValid(false);
+ setFramePrintAreaValid(false);
+
+ // #i28701#
+ ActionOnInvalidation( INVALID_ALL );
+ }
+}
+inline void SwFrame::InvalidateNextPos( bool bNoFootnote )
+{
+ if ( mpNext && !mpNext->IsSctFrame() )
+ mpNext->InvalidatePos();
+ else
+ ImplInvalidateNextPos( bNoFootnote );
+}
+
+inline void SwFrame::OptCalc() const
+{
+ if ( !isFrameAreaPositionValid() || !isFramePrintAreaValid() || !isFrameAreaSizeValid() )
+ {
+ const_cast<SwFrame*>(this)->OptPrepareMake();
+ }
+}
+inline const SwPageFrame *SwFrame::FindPageFrame() const
+{
+ return const_cast<SwFrame*>(this)->FindPageFrame();
+}
+inline const SwFrame *SwFrame::FindColFrame() const
+{
+ return const_cast<SwFrame*>(this)->FindColFrame();
+}
+inline const SwFrame *SwFrame::FindFooterOrHeader() const
+{
+ return const_cast<SwFrame*>(this)->FindFooterOrHeader();
+}
+inline SwTabFrame *SwFrame::FindTabFrame()
+{
+ return IsInTab() ? ImplFindTabFrame() : nullptr;
+}
+inline const SwFootnoteBossFrame *SwFrame::FindFootnoteBossFrame( bool bFootnote ) const
+{
+ return const_cast<SwFrame*>(this)->FindFootnoteBossFrame( bFootnote );
+}
+inline SwFootnoteFrame *SwFrame::FindFootnoteFrame()
+{
+ return IsInFootnote() ? ImplFindFootnoteFrame() : nullptr;
+}
+inline SwFlyFrame *SwFrame::FindFlyFrame()
+{
+ return IsInFly() ? ImplFindFlyFrame() : nullptr;
+}
+inline SwSectionFrame *SwFrame::FindSctFrame()
+{
+ return IsInSct() ? ImplFindSctFrame() : nullptr;
+}
+
+inline const SwBodyFrame *SwFrame::FindBodyFrame() const
+{
+ return IsInDocBody() ? ImplFindBodyFrame() : nullptr;
+}
+
+inline const SwTabFrame *SwFrame::FindTabFrame() const
+{
+ return IsInTab() ? const_cast<SwFrame*>(this)->ImplFindTabFrame() : nullptr;
+}
+inline const SwFootnoteFrame *SwFrame::FindFootnoteFrame() const
+{
+ return IsInFootnote() ? const_cast<SwFrame*>(this)->ImplFindFootnoteFrame() : nullptr;
+}
+inline const SwFlyFrame *SwFrame::FindFlyFrame() const
+{
+ return IsInFly() ? const_cast<SwFrame*>(this)->ImplFindFlyFrame() : nullptr;
+}
+inline const SwSectionFrame *SwFrame::FindSctFrame() const
+{
+ return IsInSct() ? const_cast<SwFrame*>(this)->ImplFindSctFrame() : nullptr;
+}
+inline SwFrame *SwFrame::FindNext()
+{
+ if ( mpNext )
+ return mpNext;
+ else
+ return FindNext_();
+}
+inline const SwFrame *SwFrame::FindNext() const
+{
+ if ( mpNext )
+ return mpNext;
+ else
+ return const_cast<SwFrame*>(this)->FindNext_();
+}
+inline SwFrame *SwFrame::FindPrev()
+{
+ if ( mpPrev && !mpPrev->IsSctFrame() )
+ return mpPrev;
+ else
+ return FindPrev_();
+}
+inline const SwFrame *SwFrame::FindPrev() const
+{
+ if ( mpPrev && !mpPrev->IsSctFrame() )
+ return mpPrev;
+ else
+ return const_cast<SwFrame*>(this)->FindPrev_();
+}
+
+inline bool SwFrame::IsLayoutFrame() const
+{
+ return bool(GetType() & FRM_LAYOUT);
+}
+inline bool SwFrame::IsRootFrame() const
+{
+ return mnFrameType == SwFrameType::Root;
+}
+inline bool SwFrame::IsPageFrame() const
+{
+ return mnFrameType == SwFrameType::Page;
+}
+inline bool SwFrame::IsColumnFrame() const
+{
+ return mnFrameType == SwFrameType::Column;
+}
+inline bool SwFrame::IsFootnoteBossFrame() const
+{
+ return bool(GetType() & FRM_FTNBOSS);
+}
+inline bool SwFrame::IsHeaderFrame() const
+{
+ return mnFrameType == SwFrameType::Header;
+}
+inline bool SwFrame::IsFooterFrame() const
+{
+ return mnFrameType == SwFrameType::Footer;
+}
+inline bool SwFrame::IsFootnoteContFrame() const
+{
+ return mnFrameType == SwFrameType::FtnCont;
+}
+inline bool SwFrame::IsFootnoteFrame() const
+{
+ return mnFrameType == SwFrameType::Ftn;
+}
+inline bool SwFrame::IsBodyFrame() const
+{
+ return mnFrameType == SwFrameType::Body;
+}
+inline bool SwFrame::IsFlyFrame() const
+{
+ return mnFrameType == SwFrameType::Fly;
+}
+inline bool SwFrame::IsSctFrame() const
+{
+ return mnFrameType == SwFrameType::Section;
+}
+inline bool SwFrame::IsTabFrame() const
+{
+ return mnFrameType == SwFrameType::Tab;
+}
+inline bool SwFrame::IsRowFrame() const
+{
+ return mnFrameType == SwFrameType::Row;
+}
+inline bool SwFrame::IsCellFrame() const
+{
+ return mnFrameType == SwFrameType::Cell;
+}
+inline bool SwFrame::IsContentFrame() const
+{
+ return bool(GetType() & FRM_CNTNT);
+}
+inline bool SwFrame::IsTextFrame() const
+{
+ return mnFrameType == SwFrameType::Txt;
+}
+inline bool SwFrame::IsNoTextFrame() const
+{
+ return mnFrameType == SwFrameType::NoTxt;
+}
+inline bool SwFrame::IsFlowFrame() const
+{
+ return bool(GetType() & (FRM_CNTNT|SwFrameType::Tab|SwFrameType::Section));
+}
+inline bool SwFrame::IsRetoucheFrame() const
+{
+ return bool(GetType() & (FRM_CNTNT|SwFrameType::Tab|SwFrameType::Section|SwFrameType::Ftn));
+}
+inline bool SwFrame::IsAccessibleFrame() const
+{
+ return bool(GetType() & FRM_ACCESSIBLE);
+}
+
+//use this to protect a SwFrame for a given scope from getting deleted
+class SwFrameDeleteGuard
+{
+private:
+ SwFrame *m_pForbidFrame;
+public:
+ //Flag pFrame for SwFrameDeleteGuard lifetime that we shouldn't delete
+ //it in e.g. SwSectionFrame::MergeNext etc because we will need it
+ //again after the SwFrameDeleteGuard dtor
+ explicit SwFrameDeleteGuard(SwFrame* pFrame)
+ : m_pForbidFrame(pFrame)
+ {
+ if (m_pForbidFrame)
+ m_pForbidFrame->ForbidDelete();
+ }
+
+ SwFrameDeleteGuard(const SwFrameDeleteGuard&) =delete;
+
+ ~SwFrameDeleteGuard()
+ {
+ if (m_pForbidFrame)
+ m_pForbidFrame->AllowDelete();
+ }
+
+ SwFrameDeleteGuard& operator=(const SwFrameDeleteGuard&) =delete;
+};
+
+typedef tools::Long (SwFrame::*SwFrameGet)() const;
+typedef bool (SwFrame::*SwFrameMax)( tools::Long );
+typedef void (SwFrame::*SwFrameMakePos)( const SwFrame*, const SwFrame*, bool );
+typedef tools::Long (*SwOperator)( tools::Long, tools::Long );
+typedef void (SwFrame::*SwFrameSet)( tools::Long, tools::Long );
+
+struct SwRectFnCollection
+{
+ SwRectGet fnGetTop;
+ SwRectGet fnGetBottom;
+ SwRectGet fnGetLeft;
+ SwRectGet fnGetRight;
+ SwRectGet fnGetWidth;
+ SwRectGet fnGetHeight;
+ SwRectPoint fnGetPos;
+ SwRectSize fnGetSize;
+
+ SwRectSet fnSetTop;
+ SwRectSet fnSetBottom;
+ SwRectSet fnSetLeft;
+ SwRectSet fnSetRight;
+ SwRectSet fnSetWidth;
+ SwRectSet fnSetHeight;
+
+ SwRectSet fnSubTop;
+ SwRectSet fnAddBottom;
+ SwRectSet fnSubLeft;
+ SwRectSet fnAddRight;
+ SwRectSet fnAddWidth;
+ SwRectSet fnAddHeight;
+
+ SwRectSet fnSetPosX;
+ SwRectSet fnSetPosY;
+
+ SwFrameGet fnGetTopMargin;
+ SwFrameGet fnGetBottomMargin;
+ SwFrameGet fnGetLeftMargin;
+ SwFrameGet fnGetRightMargin;
+ SwFrameSet fnSetXMargins;
+ SwFrameSet fnSetYMargins;
+ SwFrameGet fnGetPrtTop;
+ SwFrameGet fnGetPrtBottom;
+ SwFrameGet fnGetPrtLeft;
+ SwFrameGet fnGetPrtRight;
+ SwRectDist fnTopDist;
+ SwRectDist fnBottomDist;
+ SwRectDist fnLeftDist;
+ SwRectDist fnRightDist;
+ SwFrameMax fnSetLimit;
+ SwRectMax fnOverStep;
+
+ SwRectSetPos fnSetPos;
+ SwFrameMakePos fnMakePos;
+ SwOperator fnXDiff;
+ SwOperator fnYDiff;
+ SwOperator fnXInc;
+ SwOperator fnYInc;
+
+ SwRectSetTwice fnSetLeftAndWidth;
+ SwRectSetTwice fnSetTopAndHeight;
+};
+
+typedef SwRectFnCollection* SwRectFn;
+
+// This class allows to use proper methods regardless of orientation (LTR/RTL, horizontal or vertical)
+extern SwRectFn fnRectHori, fnRectVert, fnRectVertL2R, fnRectVertL2RB2T;
+class SwRectFnSet {
+public:
+ explicit SwRectFnSet(const SwFrame *pFrame)
+ : m_bVert(pFrame->IsVertical())
+ , m_bVertL2R(pFrame->IsVertLR())
+ , m_bVertL2RB2T(pFrame->IsVertLRBT())
+ {
+ m_fnRect = m_bVert ? (m_bVertL2R ? (m_bVertL2RB2T ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert) : fnRectHori;
+ }
+
+ void Refresh(const SwFrame *pFrame)
+ {
+ m_bVert = pFrame->IsVertical();
+ m_bVertL2R = pFrame->IsVertLR();
+ m_bVertL2RB2T = pFrame->IsVertLRBT();
+ m_fnRect = m_bVert ? (m_bVertL2R ? (m_bVertL2RB2T ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert) : fnRectHori;
+ }
+
+ bool IsVert() const { return m_bVert; }
+ bool IsVertL2R() const { return m_bVertL2R; }
+ SwRectFn FnRect() const { return m_fnRect; }
+
+ bool PosDiff(const SwRect &rRect1, const SwRect &rRect2) const
+ {
+ return ((rRect1.*m_fnRect->fnGetTop)() != (rRect2.*m_fnRect->fnGetTop)()
+ || (rRect1.*m_fnRect->fnGetLeft)() != (rRect2.*m_fnRect->fnGetLeft)());
+ }
+
+ tools::Long GetTop (const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetTop) (); }
+ tools::Long GetBottom(const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetBottom)(); }
+ tools::Long GetLeft (const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetLeft) (); }
+ tools::Long GetRight (const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetRight) (); }
+ tools::Long GetWidth (const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetWidth) (); }
+ tools::Long GetHeight(const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetHeight)(); }
+ Point GetPos (const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetPos) (); }
+ Size GetSize (const SwRect& rRect) const { return (rRect.*m_fnRect->fnGetSize) (); }
+
+ void SetTop (SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnSetTop) (nNew); }
+ void SetBottom(SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnSetBottom)(nNew); }
+ void SetLeft (SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnSetLeft) (nNew); }
+ void SetRight (SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnSetRight) (nNew); }
+ void SetWidth (SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnSetWidth) (nNew); }
+ void SetHeight(SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnSetHeight)(nNew); }
+
+ void SubTop (SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnSubTop) (nNew); }
+ void AddBottom(SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnAddBottom)(nNew); }
+ void SubLeft (SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnSubLeft) (nNew); }
+ void AddRight (SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnAddRight) (nNew); }
+ void AddWidth (SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnAddWidth) (nNew); }
+ void AddHeight(SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnAddHeight)(nNew); }
+
+ void SetPosX(SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnSetPosX)(nNew); }
+ void SetPosY(SwRect& rRect, tools::Long nNew) const { (rRect.*m_fnRect->fnSetPosY)(nNew); }
+
+ tools::Long GetTopMargin (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetTopMargin) (); }
+ tools::Long GetBottomMargin(const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetBottomMargin)(); }
+ tools::Long GetLeftMargin (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetLeftMargin) (); }
+ tools::Long GetRightMargin (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetRightMargin) (); }
+ void SetXMargins(SwFrame& rFrame, tools::Long nLeft, tools::Long nRight) const { (rFrame.*m_fnRect->fnSetXMargins)(nLeft, nRight); }
+ void SetYMargins(SwFrame& rFrame, tools::Long nTop, tools::Long nBottom) const { (rFrame.*m_fnRect->fnSetYMargins)(nTop, nBottom); }
+ tools::Long GetPrtTop (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetPrtTop) (); }
+ tools::Long GetPrtBottom (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetPrtBottom) (); }
+ tools::Long GetPrtLeft (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetPrtLeft) (); }
+ tools::Long GetPrtRight (const SwFrame& rFrame) const { return (rFrame.*m_fnRect->fnGetPrtRight) (); }
+ tools::Long TopDist (const SwRect& rRect, tools::Long nPos) const { return (rRect.*m_fnRect->fnTopDist) (nPos); }
+ tools::Long BottomDist(const SwRect& rRect, tools::Long nPos) const { return (rRect.*m_fnRect->fnBottomDist) (nPos); }
+ tools::Long LeftDist (const SwRect& rRect, tools::Long nPos) const { return (rRect.*m_fnRect->fnLeftDist) (nPos); }
+ tools::Long RightDist (const SwRect& rRect, tools::Long nPos) const { return (rRect.*m_fnRect->fnRightDist) (nPos); }
+ void SetLimit (SwFrame& rFrame, tools::Long nNew) const { (rFrame.*m_fnRect->fnSetLimit) (nNew); }
+ bool OverStep (const SwRect& rRect, tools::Long nPos) const { return (rRect.*m_fnRect->fnOverStep) (nPos); }
+
+ void SetPos(SwRect& rRect, const Point& rNew) const { (rRect.*m_fnRect->fnSetPos)(rNew); }
+ void MakePos(SwFrame& rFrame, const SwFrame* pUp, const SwFrame* pPrv, bool bNotify) const { (rFrame.*m_fnRect->fnMakePos)(pUp, pPrv, bNotify); }
+ tools::Long XDiff(tools::Long n1, tools::Long n2) const { return (m_fnRect->fnXDiff) (n1, n2); }
+ tools::Long YDiff(tools::Long n1, tools::Long n2) const { return (m_fnRect->fnYDiff) (n1, n2); }
+ tools::Long XInc (tools::Long n1, tools::Long n2) const { return (m_fnRect->fnXInc) (n1, n2); }
+ tools::Long YInc (tools::Long n1, tools::Long n2) const { return (m_fnRect->fnYInc) (n1, n2); }
+
+ void SetLeftAndWidth(SwRect& rRect, tools::Long nLeft, tools::Long nWidth) const { (rRect.*m_fnRect->fnSetLeftAndWidth)(nLeft, nWidth); }
+ void SetTopAndHeight(SwRect& rRect, tools::Long nTop, tools::Long nHeight) const { (rRect.*m_fnRect->fnSetTopAndHeight)(nTop, nHeight); }
+
+private:
+ bool m_bVert;
+ bool m_bVertL2R;
+ bool m_bVertL2RB2T;
+ SwRectFn m_fnRect;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/frminf.hxx b/sw/source/core/inc/frminf.hxx
new file mode 100644
index 0000000000..1e1d433c47
--- /dev/null
+++ b/sw/source/core/inc/frminf.hxx
@@ -0,0 +1,75 @@
+/* -*- 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_FRMINF_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_FRMINF_HXX
+
+#include <swtypes.hxx>
+
+#include "TextFrameIndex.hxx"
+
+#include <vector>
+
+class SwTextFrame;
+class SwTextCursor;
+
+class SwTextFrameInfo
+{
+ const SwTextFrame *m_pFrame;
+
+ // Where does the text (w/o whitespaces) start (document is global!)?
+ static SwTwips GetLineStart( const SwTextCursor &rLine );
+
+public:
+ SwTextFrameInfo( const SwTextFrame *pTextFrame ) : m_pFrame(pTextFrame) { }
+
+ // Does the paragraph fit into a single line?
+ bool IsOneLine() const;
+
+ // Is the line filled to X%?
+ bool IsFilled( const sal_uInt8 nPercent ) const;
+
+ // Where does the text (w/o whitespaces) start (rel. in frame)?
+ SwTwips GetLineStart() const;
+
+ // return center position of the next character
+ SwTwips GetCharPos(TextFrameIndex nChar, bool bCenter = true) const;
+
+ // collect all whitespaces at the beginning and end of a line in Pam
+ void GetSpaces(std::vector<std::pair<TextFrameIndex, TextFrameIndex>> &,
+ bool bWithLineBreak) const;
+
+ // Is a bullet point/symbol/etc. at the first text position?
+ bool IsBullet(TextFrameIndex nTextPos) const;
+
+ // determine indentation for first line
+ SwTwips GetFirstIndent() const;
+
+ const SwTextFrame* GetFrame() const { return m_pFrame; }
+ SwTextFrameInfo& SetFrame( const SwTextFrame* pNew )
+ { m_pFrame = pNew; return *this; }
+
+ // Is it a comparison? Returns position in frame.
+ sal_Int32 GetBigIndent( TextFrameIndex & rFndPos,
+ const SwTextFrame *pNextFrame ) const;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/frmtool.hxx b/sw/source/core/inc/frmtool.hxx
new file mode 100644
index 0000000000..ffc218b550
--- /dev/null
+++ b/sw/source/core/inc/frmtool.hxx
@@ -0,0 +1,626 @@
+/* -*- 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_FRMTOOL_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_FRMTOOL_HXX
+
+#include <swtypes.hxx>
+#include <frameformats.hxx>
+#include <BorderCacheOwner.hxx>
+#include "frame.hxx"
+#include "txtfrm.hxx"
+#include "swcache.hxx"
+#include <swatrset.hxx>
+
+class SwLayoutFrame;
+class SwFont;
+class SwTextFrame;
+class SwFormatAnchor;
+class SwViewShell;
+class SwPageFrame;
+class SwFlyFrame;
+class SwContentFrame;
+class SwRootFrame;
+class SwDoc;
+class SdrObject;
+class SvxBrushItem;
+class SdrMarkList;
+class SwNodeIndex;
+class GraphicObject;
+class GraphicAttr;
+class SwPageDesc;
+class SwRegionRects;
+class SwTextNode;
+namespace sw { struct Extent; }
+namespace basegfx::utils { class B2DClipState; }
+
+#define FAR_AWAY (SAL_MAX_INT32 - 20000) // initial position of a Fly
+constexpr tools::Long BROWSE_HEIGHT = 56700 * 10; // 10 Meters
+#define GRFNUM_NO 0
+#define GRFNUM_YES 1
+#define GRFNUM_REPLACE 2
+
+void AppendObjs(const sw::FrameFormats<sw::SpzFrameFormat*>* pSpz, SwNodeOffset nIndex, SwFrame* pFrame, SwPageFrame* pPage, SwDoc* doc);
+
+void AppendObjsOfNode(sw::FrameFormats<sw::SpzFrameFormat*> const* pTable, SwNodeOffset nIndex,
+ SwFrame * pFrame, SwPageFrame * pPage, SwDoc * pDoc,
+ std::vector<sw::Extent>::const_iterator const* pIter,
+ std::vector<sw::Extent>::const_iterator const* pEnd,
+ SwTextNode const* pFirstNode, SwTextNode const* pLastNode);
+
+void RemoveHiddenObjsOfNode(SwTextNode const& rNode,
+ std::vector<sw::Extent>::const_iterator const* pIter,
+ std::vector<sw::Extent>::const_iterator const* pEnd,
+ SwTextNode const* pFirstNode, SwTextNode const* pLastNode);
+
+bool IsAnchoredObjShown(SwTextFrame const& rFrame, SwFormatAnchor const& rAnchor);
+
+void AppendAllObjs(const sw::FrameFormats<sw::SpzFrameFormat*>* pSpzs, const SwFrame* pSib);
+
+// draw background with brush or graphics
+// The 6th parameter indicates that the method should consider background
+// transparency, saved in the color of the brush item.
+void DrawGraphic(
+ const SvxBrushItem *,
+ vcl::RenderContext &,
+ const SwRect &rOrg,
+ const SwRect &rOut,
+ const sal_uInt8 nGrfNum = GRFNUM_NO,
+ const bool bConsiderBackgroundTransparency = false );
+bool DrawFillAttributes(
+ const drawinglayer::attribute::SdrAllFillAttributesHelperPtr& rFillAttributes,
+ const SwRect& rOriginalLayoutRect,
+ const SwRegionRects& rPaintRegion,
+ const basegfx::utils::B2DClipState& rClipState,
+ vcl::RenderContext& rOut);
+
+// RotGrfFlyFrame: Adapted to rotation
+void paintGraphicUsingPrimitivesHelper(
+ vcl::RenderContext & rOutputDevice,
+ GraphicObject const& rGraphicObj,
+ GraphicAttr const& rGraphicAttr,
+ const basegfx::B2DHomMatrix& rGraphicTransform,
+ const OUString& rName,
+ const OUString& rTitle,
+ const OUString& rDescription);
+
+// MM02 new VOC and primitive-based version
+void paintGraphicUsingPrimitivesHelper(
+ vcl::RenderContext & rOutputDevice,
+ drawinglayer::primitive2d::Primitive2DContainer& rContent,
+ const basegfx::B2DHomMatrix& rGraphicTransform,
+ const OUString& rName,
+ const OUString& rTitle,
+ const OUString& rDescription);
+
+// method to align rectangle.
+// Created declaration here to avoid <extern> declarations
+void SwAlignRect( SwRect &rRect, const SwViewShell *pSh, const vcl::RenderContext* pRenderContext );
+
+// method to align graphic rectangle
+// Created declaration here to avoid <extern> declarations
+void SwAlignGrfRect( SwRect *pGrfRect, const vcl::RenderContext &rOut );
+
+/**
+ * Paint border around a run of characters using frame painting code.
+ *
+ * @param[in] rFont font object of actual text, which specify the border
+ * @param[in] rPaintArea rectangle area in which line portion takes place
+ * @param[in] bVerticalLayout corresponding text frame verticality
+ * @param[in] bVerticalLayoutLRBT corresponding text frame verticality (LRBT subset)
+ * @param[in] bJoinWithPrev leave border with which actual border joins to the previous portion
+ * @param[in] bJoinWithNext leave border with which actual border joins to the next portion
+**/
+void PaintCharacterBorder(const SwFont& rFont, const SwRect& rPaintArea, const bool bVerticalLayout,
+ const bool bVerticalLayoutLRBT, const bool bJoinWithPrev,
+ const bool bJoinWithNext);
+
+// get Fly, if no List is given use the current shell
+// Implementation in feshview.cxx
+SwFlyFrame *GetFlyFromMarked( const SdrMarkList *pLst, SwViewShell *pSh );
+
+SwFrame *SaveContent( SwLayoutFrame *pLay, SwFrame *pStart = nullptr );
+void RestoreContent( SwFrame *pSav, SwLayoutFrame *pParent, SwFrame *pSibling );
+
+// Get ContentNodes, create ContentFrames, and add them to LayFrame.
+void InsertCnt_( SwLayoutFrame *pLay, SwDoc *pDoc, SwNodeOffset nIndex,
+ bool bPages = false, SwNodeOffset nEndIndex = SwNodeOffset(0),
+ SwFrame *pPrv = nullptr, sw::FrameMode eMode = sw::FrameMode::New);
+
+// Creation of frames for a specific section (uses InsertCnt_)
+void MakeFrames( SwDoc *pDoc, SwNode &rSttIdx,
+ SwNode &rEndIdx );
+
+extern bool bObjsDirect;
+
+// for FlyCnts, see SwFlyAtContentFrame::MakeAll()
+extern bool bSetCompletePaintOnInvalidate;
+
+// for table settings via keyboard
+SwTwips CalcRowRstHeight( SwLayoutFrame *pRow );
+tools::Long CalcHeightWithFlys( const SwFrame *pFrame );
+
+namespace sw {
+ bool HasPageBreakBefore(SwPageFrame const& rPage);
+ bool IsRightPageByNumber(SwRootFrame const& rLayout, sal_uInt16 nPageNum);
+ class FlyCreationSuppressor
+ {
+ const bool m_wasAlreadySuppressed;
+ public:
+ FlyCreationSuppressor(bool isAlreadySuppressedAllowed = true);
+ ~FlyCreationSuppressor();
+ };
+} // namespace sw
+
+SwPageFrame *InsertNewPage( SwPageDesc &rDesc, SwFrame *pUpper,
+ bool isRightPage, bool bFirst, bool bInsertEmpty, bool bFootnote,
+ SwFrame *pSibling, bool bVeryFirstPage = false );
+
+// connect Flys with page
+void RegistFlys( SwPageFrame*, const SwLayoutFrame* );
+
+// notification of Fly's background if needed
+void Notify( SwFlyFrame *pFly, SwPageFrame *pOld, const SwRect &rOld,
+ const SwRect* pOldRect = nullptr );
+
+void Notify_Background( const SdrObject* pObj,
+ SwPageFrame* pPage,
+ const SwRect& rRect,
+ const PrepareHint eHint,
+ const bool bInva );
+
+const SwFrame* GetVirtualUpper( const SwFrame* pFrame, const Point& rPos );
+
+bool Is_Lower_Of( const SwFrame *pCurrFrame, const SdrObject* pObj );
+
+// FIXME: EasyHack (refactoring): rename method and parameter name in all files
+const SwFrame *FindContext( const SwFrame *pFrame, SwFrameType nAdditionalContextTyp );
+
+bool IsFrameInSameContext( const SwFrame *pInnerFrame, const SwFrame *pFrame );
+
+const SwFrame * FindPage( const SwRect &rRect, const SwFrame *pPage );
+
+/** @see SwContentNode::getLayoutFrame()
+ @param pPos
+ Document model position; for a text frame, the returned frame will be
+ one containing this position.
+ @param pViewPosAndCalcFrame
+ First is a point in the document view; the returned frame will be the one
+ with the minimal distance to this point. To get the first frame in the
+ document, pass in a default-initialized Point with coordinates 0,0.
+ Second indicates whether the frames should be formatted before retrieving
+ their position for the test; this cannot be done by every caller so use
+ with care!
+ */
+SwFrame* GetFrameOfModify( const SwRootFrame* pLayout,
+ sw::BroadcastingModify const&,
+ SwFrameType const nFrameType,
+ const SwPosition *pPos = nullptr,
+ std::pair<Point, bool> const* pViewPosAndCalcFrame = nullptr);
+
+// Should extra data (redline stroke, line numbers) be painted?
+bool IsExtraData( const SwDoc *pDoc );
+
+// #i11760# - method declaration <CalcContent(..)>
+void CalcContent( SwLayoutFrame *pLay, bool bNoColl = false );
+
+// Notify classes memorize the current sizes in their constructor and do
+// the necessary notifications in their destructor if needed
+class SwFrameNotify
+{
+private:
+ void ImplDestroy();
+
+protected:
+ SwFrame *mpFrame;
+ const SwRect maFrame;
+ const SwRect maPrt;
+ SwTwips mnFlyAnchorOfst;
+ SwTwips mnFlyAnchorOfstNoWrap;
+ bool mbHadFollow;
+ bool mbInvaKeep;
+ bool mbValidSize;
+
+public:
+ SwFrameNotify( SwFrame *pFrame );
+ ~SwFrameNotify();
+
+ const SwRect &getFrameArea() const { return maFrame; }
+ void SetInvaKeep() { mbInvaKeep = true; }
+};
+
+class SwLayNotify : public SwFrameNotify
+{
+ bool m_bLowersComplete;
+
+ void ImplDestroy();
+
+public:
+ SwLayNotify( SwLayoutFrame *pLayFrame );
+ ~SwLayNotify();
+
+ void SetLowersComplete( bool b ) { m_bLowersComplete = b; }
+ bool IsLowersComplete() const { return m_bLowersComplete; }
+};
+
+class SwFlyNotify : public SwLayNotify
+{
+ SwPageFrame *m_pOldPage;
+ const SwRect m_aFrameAndSpace;
+
+ void ImplDestroy();
+
+public:
+ SwFlyNotify( SwFlyFrame *pFlyFrame );
+ ~SwFlyNotify();
+};
+
+class SwContentNotify : public SwFrameNotify
+{
+private:
+ // #i11859#
+ bool mbChkHeightOfLastLine;
+ SwTwips mnHeightOfLastLine;
+
+ // #i25029#
+ bool mbInvalidatePrevPrtArea;
+ bool mbBordersJoinedWithPrev;
+
+ void ImplDestroy();
+
+public:
+ SwContentNotify( SwContentFrame *pContentFrame );
+ ~SwContentNotify();
+
+ // #i25029#
+ void SetInvalidatePrevPrtArea()
+ {
+ mbInvalidatePrevPrtArea = true;
+ }
+
+ void SetBordersJoinedWithPrev()
+ {
+ mbBordersJoinedWithPrev = true;
+ }
+};
+
+// SwBorderAttrs encapsulates the calculation for margin attributes including
+// border. The whole class is cached.
+
+// WARNING! If more attributes should be cached also adjust the method
+// Modify::Modify!
+class SwBorderAttrs final : public SwCacheObj
+{
+ const SwAttrSet &m_rAttrSet;
+ const SvxULSpaceItem &m_rUL;
+ std::unique_ptr<SvxFirstLineIndentItem> m_pFirstLineIndent;
+ std::unique_ptr<SvxTextLeftMarginItem> m_pTextLeftMargin;
+ std::unique_ptr<SvxRightMarginItem> m_pRightMargin;
+ std::shared_ptr<SvxLRSpaceItem> m_xLR;
+ const SvxBoxItem &m_rBox;
+ const SvxShadowItem &m_rShadow;
+ const Size m_aFrameSize;
+
+ // the following bool values set the cached values to INVALID - until they
+ // are calculated for the first time
+ bool m_bTopLine : 1;
+ bool m_bBottomLine : 1;
+ bool m_bLeftLine : 1;
+ bool m_bRightLine : 1;
+ bool m_bTop : 1;
+ bool m_bBottom : 1;
+ bool m_bLine : 1;
+ bool m_bLineSpacing : 1;
+
+ bool m_bIsLine : 1; // border on at least one side?
+
+ bool m_bCacheGetLine : 1; // cache GetTopLine(), GetBottomLine()?
+ bool m_bCachedGetTopLine : 1; // is GetTopLine() cached?
+ bool m_bCachedGetBottomLine : 1; // is GetBottomLine() cached?
+ // Booleans indicate that <m_bJoinedWithPrev> and <m_bJoinedWithNext> are
+ // cached and valid.
+ // Caching depends on value of <m_bCacheGetLine>.
+ mutable bool m_bCachedJoinedWithPrev : 1;
+ mutable bool m_bCachedJoinedWithNext : 1;
+ // Booleans indicate that borders are joined with previous/next frame.
+ bool m_bJoinedWithPrev :1;
+ bool m_bJoinedWithNext :1;
+
+ // The cached values (un-defined until calculated for the first time)
+ sal_uInt16 m_nTopLine,
+ m_nBottomLine,
+ m_nLeftLine,
+ m_nRightLine,
+ m_nTop,
+ m_nBottom,
+ m_nGetTopLine,
+ m_nGetBottomLine,
+ m_nLineSpacing;
+
+ // only calculate lines and shadow
+ void CalcTopLine_();
+ void CalcBottomLine_();
+ void CalcLeftLine_();
+ void CalcRightLine_();
+
+ // lines + shadow + margin
+ void CalcTop_();
+ void CalcBottom_();
+
+ void IsLine_();
+
+ // #i25029# - If <_pPrevFrame> is set, its value is taken for testing, if
+ // borders/shadow have to be joined with previous frame.
+ void GetTopLine_ ( const SwFrame& _rFrame,
+ const SwFrame* _pPrevFrame );
+ void GetBottomLine_( const SwFrame& _rFrame );
+
+ // calculate cached values <m_bJoinedWithPrev> and <m_bJoinedWithNext>
+ // #i25029# - If <_pPrevFrame> is set, its value is taken for testing, if
+ // borders/shadow have to be joined with previous frame.
+ void CalcJoinedWithPrev( const SwFrame& _rFrame,
+ const SwFrame* _pPrevFrame );
+ void CalcJoinedWithNext( const SwFrame& _rFrame );
+
+ // internal helper method for CalcJoinedWithPrev and CalcJoinedWithNext
+ bool JoinWithCmp( const SwFrame& _rCallerFrame,
+ const SwFrame& _rCmpFrame ) const;
+
+ // Are the left and right line and the LRSpace equal?
+ bool CmpLeftRight( const SwBorderAttrs &rCmpAttrs,
+ const SwFrame *pCaller,
+ const SwFrame *pCmp ) const;
+
+ // tdf#125300 line spacing before cell border
+ void CalcLineSpacing_();
+
+public:
+ SwBorderAttrs( const sw::BorderCacheOwner* pOwner, const SwFrame *pConstructor );
+ virtual ~SwBorderAttrs() override;
+
+ const SwAttrSet &GetAttrSet() const { return m_rAttrSet; }
+ const SvxULSpaceItem &GetULSpace() const { return m_rUL; }
+ const SvxBoxItem &GetBox() const { return m_rBox; }
+ const SvxShadowItem &GetShadow() const { return m_rShadow; }
+
+ inline sal_uInt16 CalcTopLine() const;
+ inline sal_uInt16 CalcBottomLine() const;
+ inline sal_uInt16 CalcLeftLine() const;
+ inline sal_uInt16 CalcRightLine() const;
+ inline sal_uInt16 CalcTop() const;
+ inline sal_uInt16 CalcBottom() const;
+ inline sal_uInt16 CalcLineSpacing() const;
+ tools::Long CalcLeft( const SwFrame *pCaller ) const;
+ tools::Long CalcRight( const SwFrame *pCaller ) const;
+
+ inline bool IsLine() const;
+
+ const Size &GetSize() const { return m_aFrameSize; }
+
+ // Should upper (or lower) border be evaluated for this frame?
+ // #i25029# - If <_pPrevFrame> is set, its value is taken for testing, if
+ // borders/shadow have to be joined with previous frame.
+ inline sal_uInt16 GetTopLine ( const SwFrame& _rFrame,
+ const SwFrame* _pPrevFrame = nullptr ) const;
+ inline sal_uInt16 GetBottomLine( const SwFrame& _rFrame ) const;
+ inline void SetGetCacheLine( bool bNew ) const;
+
+ // Accessors for cached values <m_bJoinedWithPrev> and <m_bJoinedWithNext>
+ // #i25029# - If <_pPrevFrame> is set, its value is taken for testing, if
+ // borders/shadow have to be joined with previous frame.
+ bool JoinedWithPrev( const SwFrame& _rFrame,
+ const SwFrame* _pPrevFrame = nullptr ) const;
+ bool JoinedWithNext( const SwFrame& _rFrame ) const;
+};
+
+class SwBorderAttrAccess final : public SwCacheAccess
+{
+ const SwFrame *m_pConstructor; //opt: for passing on to SwBorderAttrs
+
+ virtual SwCacheObj *NewObj() override;
+
+public:
+ SwBorderAttrAccess( SwCache &rCache, const SwFrame *pOwner );
+
+ SwBorderAttrs *Get();
+};
+
+// Iterator for draw objects of a page. The objects will be iterated sorted by
+// their Z-order. Iterating is not cheap since for each operation the _whole_
+// SortArray needs to be traversed.
+class SwOrderIter
+{
+ const SwPageFrame *m_pPage;
+ const SdrObject *m_pCurrent;
+
+public:
+ SwOrderIter( const SwPageFrame *pPage );
+
+ void Current( const SdrObject *pNew ) { m_pCurrent = pNew; }
+ const SdrObject *operator()() const { return m_pCurrent; }
+ void Top();
+ const SdrObject *Bottom();
+ const SdrObject *Next();
+ void Prev();
+};
+
+class StackHack
+{
+ static sal_uInt8 s_nCnt;
+ static bool s_bLocked;
+
+public:
+ StackHack()
+ {
+ if ( ++StackHack::s_nCnt > 50 )
+ StackHack::s_bLocked = true;
+ }
+ ~StackHack()
+ {
+ if ( --StackHack::s_nCnt < 5 )
+ StackHack::s_bLocked = false;
+ }
+
+ static bool IsLocked() { return StackHack::s_bLocked; }
+ static sal_uInt8 Count() { return StackHack::s_nCnt; }
+};
+
+// Should upper (or lower) border be evaluated for this frame?
+// #i25029# - If <_pPrevFrame> is set, its value is taken for testing, if
+// borders/shadow have to be joined with previous frame.
+inline sal_uInt16 SwBorderAttrs::GetTopLine ( const SwFrame& _rFrame,
+ const SwFrame* _pPrevFrame ) const
+{
+ if ( !m_bCachedGetTopLine || _pPrevFrame )
+ {
+ const_cast<SwBorderAttrs*>(this)->GetTopLine_( _rFrame, _pPrevFrame );
+ }
+ return m_nGetTopLine;
+}
+inline sal_uInt16 SwBorderAttrs::GetBottomLine( const SwFrame& _rFrame ) const
+{
+ if ( !m_bCachedGetBottomLine )
+ const_cast<SwBorderAttrs*>(this)->GetBottomLine_( _rFrame );
+ return m_nGetBottomLine;
+}
+inline void SwBorderAttrs::SetGetCacheLine( bool bNew ) const
+{
+ const_cast<SwBorderAttrs*>(this)->m_bCacheGetLine = bNew;
+ const_cast<SwBorderAttrs*>(this)->m_bCachedGetBottomLine =
+ const_cast<SwBorderAttrs*>(this)->m_bCachedGetTopLine = false;
+ // invalidate cache for values <m_bJoinedWithPrev> and <m_bJoinedWithNext>
+ m_bCachedJoinedWithPrev = false;
+ m_bCachedJoinedWithNext = false;
+}
+
+inline sal_uInt16 SwBorderAttrs::CalcTopLine() const
+{
+ if ( m_bTopLine )
+ const_cast<SwBorderAttrs*>(this)->CalcTopLine_();
+ return m_nTopLine;
+}
+inline sal_uInt16 SwBorderAttrs::CalcBottomLine() const
+{
+ if ( m_bBottomLine )
+ const_cast<SwBorderAttrs*>(this)->CalcBottomLine_();
+ return m_nBottomLine;
+}
+inline sal_uInt16 SwBorderAttrs::CalcLeftLine() const
+{
+ if ( m_bLeftLine )
+ const_cast<SwBorderAttrs*>(this)->CalcLeftLine_();
+ return m_nLeftLine;
+}
+inline sal_uInt16 SwBorderAttrs::CalcRightLine() const
+{
+ if ( m_bRightLine )
+ const_cast<SwBorderAttrs*>(this)->CalcRightLine_();
+ return m_nRightLine;
+}
+inline sal_uInt16 SwBorderAttrs::CalcTop() const
+{
+ if ( m_bTop )
+ const_cast<SwBorderAttrs*>(this)->CalcTop_();
+ return m_nTop;
+}
+inline sal_uInt16 SwBorderAttrs::CalcBottom() const
+{
+ if ( m_bBottom )
+ const_cast<SwBorderAttrs*>(this)->CalcBottom_();
+ return m_nBottom;
+}
+inline sal_uInt16 SwBorderAttrs::CalcLineSpacing() const
+{
+ if ( m_bLineSpacing )
+ const_cast<SwBorderAttrs*>(this)->CalcLineSpacing_();
+ return m_nLineSpacing;
+}
+inline bool SwBorderAttrs::IsLine() const
+{
+ if ( m_bLine )
+ const_cast<SwBorderAttrs*>(this)->IsLine_();
+ return m_bIsLine;
+}
+
+/** method to determine the spacing values of a frame
+
+ #i28701#
+ Values only provided for flow frames (table, section or text frames)
+ Note: line spacing value is only determined for text frames
+ #i102458#
+ Add output parameter <obIsLineSpacingProportional>
+
+ @param rFrame
+ input parameter - frame, for which the spacing values are determined.
+
+ @param onPrevLowerSpacing
+ output parameter - lower spacing of the frame in SwTwips
+
+ @param onPrevLineSpacing
+ output parameter - line spacing of the frame in SwTwips
+
+ @param obIsLineSpacingProportional
+
+ @param bIdenticalStyles true if the styles of the actual and the next paragraphs (text-frames) are the same
+*/
+void GetSpacingValuesOfFrame( const SwFrame& rFrame,
+ SwTwips& onLowerSpacing,
+ SwTwips& onLineSpacing,
+ bool& obIsLineSpacingProportional,
+ bool bIdenticalStyles );
+
+/** method to get the content of the table cell
+
+ Content from any nested tables will be omitted.
+ Note: line spacing value is only determined for text frames
+
+ @param rCell_
+ input parameter - the cell which should be searched for content.
+
+ return
+ pointer to the found content frame or 0
+*/
+
+const SwContentFrame* GetCellContent( const SwLayoutFrame& rCell_ );
+
+/** helper class to check if a frame has been deleted during an operation
+ * WARNING! This should only be used as a last and desperate means to make the
+ * code robust.
+ */
+
+class SwDeletionChecker
+{
+private:
+ const SwFrame* mpFrame;
+ const sw::BroadcastingModify* mpRegIn;
+
+public:
+ SwDeletionChecker(const SwFrame* pFrame);
+
+ /**
+ * return
+ * true if mpFrame != 0 and mpFrame is not client of pRegIn
+ * false otherwise
+ */
+ bool HasBeenDeleted() const;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/ftnboss.hxx b/sw/source/core/inc/ftnboss.hxx
new file mode 100644
index 0000000000..109c9df74e
--- /dev/null
+++ b/sw/source/core/inc/ftnboss.hxx
@@ -0,0 +1,131 @@
+/* -*- 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_FTNBOSS_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_FTNBOSS_HXX
+
+#include "layfrm.hxx"
+
+class SwFootnoteBossFrame;
+class SwFootnoteContFrame;
+class SwFootnoteFrame;
+class SwTextFootnote;
+
+// Set max. footnote area.
+// Restoration of the old value in DTor. Implementation in ftnfrm.cxx
+class SwSaveFootnoteHeight
+{
+ SwFrameDeleteGuard aGuard;
+ SwFootnoteBossFrame *pBoss;
+ const SwTwips nOldHeight;
+ SwTwips nNewHeight;
+public:
+ SwSaveFootnoteHeight( SwFootnoteBossFrame *pBs, const SwTwips nDeadLine );
+ ~SwSaveFootnoteHeight();
+};
+
+enum class SwNeighbourAdjust {
+ OnlyAdjust, GrowShrink, GrowAdjust, AdjustGrow
+};
+
+typedef std::vector<SwFootnoteFrame*> SwFootnoteFrames;
+
+class SW_DLLPUBLIC SwFootnoteBossFrame: public SwLayoutFrame
+{
+ // for private footnote operations
+ friend class SwFrame;
+ friend class SwSaveFootnoteHeight;
+ friend class SwPageFrame; // for setting of MaxFootnoteHeight
+
+ // max. height of the footnote container on this page
+ SwTwips m_nMaxFootnoteHeight;
+
+ SwFootnoteContFrame *MakeFootnoteCont();
+ SwFootnoteFrame *FindFirstFootnote();
+ SwNeighbourAdjust NeighbourhoodAdjustment_() const;
+
+ static void CollectFootnotes_(const SwContentFrame*, SwFootnoteFrame*,
+ SwFootnoteFrames&, const SwFootnoteBossFrame*);
+
+protected:
+ void InsertFootnote( SwFootnoteFrame * );
+ static void ResetFootnote( const SwFootnoteFrame *pAssumed );
+
+public:
+ SwFootnoteBossFrame( SwFrameFormat* pFormat, SwFrame* pSib )
+ : SwLayoutFrame( pFormat, pSib )
+ , m_nMaxFootnoteHeight(0)
+ {}
+
+ SwLayoutFrame *FindBodyCont();
+ inline const SwLayoutFrame *FindBodyCont() const;
+ void SetMaxFootnoteHeight( const SwTwips nNewMax ) { m_nMaxFootnoteHeight = nNewMax; }
+
+ // footnote interface
+ void AppendFootnote( SwContentFrame *, SwTextFootnote * );
+ bool RemoveFootnote(const SwContentFrame *, const SwTextFootnote *, bool bPrep = true);
+ static SwFootnoteFrame *FindFootnote( const SwContentFrame *, const SwTextFootnote * );
+ SwFootnoteContFrame *FindFootnoteCont();
+ inline const SwFootnoteContFrame *FindFootnoteCont() const;
+ const SwFootnoteFrame *FindFirstFootnote( SwContentFrame const * ) const;
+ SwFootnoteContFrame *FindNearestFootnoteCont( bool bDontLeave = false );
+
+ static void ChangeFootnoteRef( const SwContentFrame *pOld, const SwTextFootnote *,
+ SwContentFrame *pNew );
+ void RearrangeFootnotes( const SwTwips nDeadLine, const bool bLock,
+ const SwTextFootnote *pAttr = nullptr );
+
+ // Set DeadLine (in document coordinates) so that the text formatter can
+ // temporarily limit footnote height.
+ void SetFootnoteDeadLine( const SwTwips nDeadLine );
+ SwTwips GetMaxFootnoteHeight() const { return m_nMaxFootnoteHeight; }
+
+ // returns value for remaining space until the body reaches minimal height
+ SwTwips GetVarSpace() const;
+
+ // methods needed for layouting
+ // The parameter <_bCollectOnlyPreviousFootnotes> controls if only footnotes
+ // that are positioned before the this footnote boss-frame have to be
+ // collected.
+ void CollectFootnotes( const SwContentFrame* _pRef,
+ SwFootnoteBossFrame* _pOld,
+ SwFootnoteFrames& _rFootnoteArr,
+ const bool _bCollectOnlyPreviousFootnotes = false );
+ void MoveFootnotes_( SwFootnoteFrames &rFootnoteArr, bool bCalc = false );
+ void MoveFootnotes( const SwContentFrame *pSrc, SwContentFrame *pDest,
+ SwTextFootnote const *pAttr );
+
+ // should AdjustNeighbourhood be called (or Grow/Shrink)?
+ SwNeighbourAdjust NeighbourhoodAdjustment() const
+ { return IsPageFrame() ? SwNeighbourAdjust::OnlyAdjust : NeighbourhoodAdjustment_(); }
+};
+
+inline const SwLayoutFrame *SwFootnoteBossFrame::FindBodyCont() const
+{
+ return const_cast<SwFootnoteBossFrame*>(this)->FindBodyCont();
+}
+
+inline const SwFootnoteContFrame *SwFootnoteBossFrame::FindFootnoteCont() const
+{
+ return const_cast<SwFootnoteBossFrame*>(this)->FindFootnoteCont();
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/ftnfrm.hxx b/sw/source/core/inc/ftnfrm.hxx
new file mode 100644
index 0000000000..558c4941bf
--- /dev/null
+++ b/sw/source/core/inc/ftnfrm.hxx
@@ -0,0 +1,171 @@
+/* -*- 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_FTNFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_FTNFRM_HXX
+
+#include "layfrm.hxx"
+
+class SwContentFrame;
+class SwRootFrame;
+class SwTextNode;
+class SwTextFootnote;
+class SwBorderAttrs;
+class SwFootnoteFrame;
+
+void sw_RemoveFootnotes( SwFootnoteBossFrame* pBoss, bool bPageOnly, bool bEndNotes );
+
+namespace sw {
+
+void RemoveFootnotesForNode(
+ SwRootFrame const& rLayout, SwTextNode const& rTextNode,
+ std::vector<std::pair<sal_Int32, sal_Int32>> const*const pExtents);
+
+}
+
+// There exists a special container frame on a page for footnotes. It's called
+// SwFootnoteContFrame. Each footnote is separated by a SwFootnoteFrame which contains
+// the text frames of a footnote. SwFootnoteFrame can be split and will then
+// continue on another page.
+class SwFootnoteContFrame final : public SwLayoutFrame
+{
+ static SwFootnoteFrame* AddChained(bool bAppend, SwFrame *pNewUpper, bool bDefaultFormat);
+
+public:
+ SwFootnoteContFrame( SwFrameFormat*, SwFrame* );
+
+ const SwFootnoteFrame* FindFootNote() const;
+
+ static inline SwFootnoteFrame* AppendChained(SwFrame* pThis, bool bDefaultFormat);
+ static inline SwFootnoteFrame* PrependChained(SwFrame* pThis, bool bDefaultFormat);
+
+ virtual SwTwips ShrinkFrame( SwTwips, bool bTst = false, bool bInfo = false ) override;
+ virtual SwTwips GrowFrame ( SwTwips, bool bTst = false, bool bInfo = false ) override;
+ virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override;
+ virtual void PaintSwFrameShadowAndBorder(
+ const SwRect&,
+ const SwPageFrame* pPage,
+ const SwBorderAttrs&) const override;
+ virtual void PaintSubsidiaryLines( const SwPageFrame*, const SwRect& ) const override;
+ void PaintLine( const SwRect &, const SwPageFrame * ) const;
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+};
+
+inline SwFootnoteFrame* SwFootnoteContFrame::AppendChained(SwFrame* pThis, bool bDefaultFormat)
+{
+ return AddChained(true, pThis, bDefaultFormat);
+}
+
+inline SwFootnoteFrame* SwFootnoteContFrame::PrependChained(SwFrame* pThis, bool bDefaultFormat)
+{
+ return AddChained(false, pThis, bDefaultFormat);
+}
+
+/// Represents one footnote or endnote in the layout. Typical upper is an SwFootnoteContFrame,
+/// typical lower is an SwTextFrame.
+class SwFootnoteFrame final : public SwLayoutFrame
+{
+ // Pointer to FootnoteFrame in which the footnote will be continued:
+ // - 0 no following existent
+ // - otherwise the following FootnoteFrame
+ SwFootnoteFrame *mpFollow;
+ SwFootnoteFrame *mpMaster; // FootnoteFrame from which I am the following
+ SwContentFrame *mpReference; // in this ContentFrame is the footnote reference
+ SwTextFootnote *mpAttribute; // footnote attribute (for recognition)
+
+ // if true paragraphs in this footnote are NOT permitted to flow backwards
+ bool mbBackMoveLocked : 1;
+ // #i49383# - control unlock of position of lower anchored objects.
+ bool mbUnlockPosOfLowerObjs : 1;
+
+public:
+ SwFootnoteFrame( SwFrameFormat*, SwFrame*, SwContentFrame*, SwTextFootnote* );
+
+ virtual bool IsDeleteForbidden() const override;
+ virtual void Cut() override;
+ virtual void Paste( SwFrame* pParent, SwFrame* pSibling = nullptr ) override;
+
+ virtual void PaintSubsidiaryLines( const SwPageFrame*, const SwRect& ) const override;
+
+ bool operator<( const SwTextFootnote* pTextFootnote ) const;
+
+#ifdef DBG_UTIL
+ const SwContentFrame *GetRef() const;
+ SwContentFrame *GetRef();
+#else
+ const SwContentFrame *GetRef() const { return mpReference; }
+ SwContentFrame *GetRef() { return mpReference; }
+#endif
+ const SwContentFrame *GetRefFromAttr() const;
+ SwContentFrame *GetRefFromAttr();
+
+ const SwFootnoteFrame *GetFollow() const { return mpFollow; }
+ SwFootnoteFrame *GetFollow() { return mpFollow; }
+
+ const SwFootnoteFrame *GetMaster() const { return mpMaster; }
+ SwFootnoteFrame *GetMaster() { return mpMaster; }
+
+ const SwTextFootnote *GetAttr() const { return mpAttribute; }
+ SwTextFootnote *GetAttr() { return mpAttribute; }
+
+ void SetFollow( SwFootnoteFrame *pNew ) { mpFollow = pNew; }
+ void SetMaster( SwFootnoteFrame *pNew ) { mpMaster = pNew; }
+ void SetRef ( SwContentFrame *pNew ) { mpReference = pNew; }
+
+ void InvalidateNxtFootnoteCnts( SwPageFrame const * pPage );
+
+ void LockBackMove() { mbBackMoveLocked = true; }
+ void UnlockBackMove() { mbBackMoveLocked = false;}
+ bool IsBackMoveLocked() const { return mbBackMoveLocked; }
+
+ // prevents that the last content deletes the SwFootnoteFrame as well (Cut())
+ void ColLock() { mbColLocked = true; }
+ void ColUnlock() { mbColLocked = false; }
+
+ // #i49383#
+ void UnlockPosOfLowerObjs()
+ {
+ mbUnlockPosOfLowerObjs = true;
+ }
+ void KeepLockPosOfLowerObjs()
+ {
+ mbUnlockPosOfLowerObjs = false;
+ }
+ bool IsUnlockPosOfLowerObjs() const
+ {
+ return mbUnlockPosOfLowerObjs;
+ }
+
+ /** search for last content in the current footnote frame
+
+ OD 2005-12-02 #i27138#
+
+ @return SwContentFrame*
+ pointer to found last content frame. NULL, if none is found.
+ */
+ SwContentFrame* FindLastContent();
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+ void dumpAsXmlAttributes(xmlTextWriterPtr writer) const override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/hffrm.hxx b/sw/source/core/inc/hffrm.hxx
new file mode 100644
index 0000000000..4fed2517db
--- /dev/null
+++ b/sw/source/core/inc/hffrm.hxx
@@ -0,0 +1,68 @@
+/* -*- 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_HFFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_HFFRM_HXX
+
+#include "layfrm.hxx"
+
+class SwViewShell;
+
+class SwHeadFootFrame : public SwLayoutFrame
+{
+private:
+ std::vector<basegfx::B2DPolygon> GetSubsidiaryLinesPolygons(const SwViewShell& rViewShell) const;
+
+protected:
+ void FormatSize(SwTwips nUL, const SwBorderAttrs * pAttrs);
+ void FormatPrt(SwTwips & nUL, const SwBorderAttrs * pAttrs);
+ inline bool GetEatSpacing() const; // in hffrm.cxx
+
+public:
+ SwHeadFootFrame(SwFrameFormat * pFrame, SwFrame*, SwFrameType aType);
+ virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override;
+ virtual SwTwips GrowFrame( SwTwips,
+ bool bTst = false, bool bInfo = false ) override;
+ virtual SwTwips ShrinkFrame( SwTwips,
+ bool bTst = false, bool bInfo = false ) override;
+ virtual void PaintSubsidiaryLines( const SwPageFrame*, const SwRect& ) const override;
+ void AddSubsidiaryLinesBounds(const SwViewShell& rViewShell, RectangleVector& rRects) const;
+};
+
+/// Header in the document layout, inside a page.
+class SwHeaderFrame final : public SwHeadFootFrame
+{
+public:
+ SwHeaderFrame( SwFrameFormat* pFrame, SwFrame* pSib ) : SwHeadFootFrame(pFrame, pSib, SwFrameType::Header) {};
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+};
+
+/// Footer in the document layout, inside a page.
+class SwFooterFrame final : public SwHeadFootFrame
+{
+public:
+ SwFooterFrame( SwFrameFormat* pFrame, SwFrame* pSib ) : SwHeadFootFrame(pFrame, pSib, SwFrameType::Footer) {};
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/ifinishedthreadlistener.hxx b/sw/source/core/inc/ifinishedthreadlistener.hxx
new file mode 100644
index 0000000000..2ff8197d2c
--- /dev/null
+++ b/sw/source/core/inc/ifinishedthreadlistener.hxx
@@ -0,0 +1,46 @@
+/* -*- 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_IFINISHEDTHREADLISTENER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_IFINISHEDTHREADLISTENER_HXX
+
+#include <osl/interlck.h>
+
+/** interface class to listen on the finish of a thread
+
+ OD 2007-03-30 #i73788#
+ Note: The thread provides its ThreadID on the finish notification
+*/
+class IFinishedThreadListener
+{
+public:
+ virtual ~IFinishedThreadListener()
+ {
+ };
+
+ virtual void NotifyAboutFinishedThread( const oslInterlockedCount nThreadID ) = 0;
+
+protected:
+ IFinishedThreadListener()
+ {
+ };
+};
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/layact.hxx b/sw/source/core/inc/layact.hxx
new file mode 100644
index 0000000000..417d75deeb
--- /dev/null
+++ b/sw/source/core/inc/layact.hxx
@@ -0,0 +1,235 @@
+/* -*- 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 <tools/color.hxx>
+
+#include <ctime>
+#include <memory>
+#include <vector>
+
+#include <swrect.hxx>
+
+class OutputDevice;
+class SwFrame;
+class SwFrameDeleteGuard;
+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
+
+ // 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;
+
+ std::vector<SwFrame*> m_aFrameStack;
+ std::vector<std::unique_ptr<SwFrameDeleteGuard>> m_aFrameDeleteGuards;
+
+ // 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()
+
+ 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
+
+ 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_bInterrupt; // For terminating processing on interrupt
+ bool m_bIdle; // True if the LayAction was triggered by the Idler
+ bool m_bReschedule; // Call Reschedule depending on Progress?
+ 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;
+
+ void PaintContent( const SwContentFrame *, const SwPageFrame *,
+ const SwRect &rOldRect, tools::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(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();
+
+ void PushFormatLayout(SwFrame* pLow);
+ void PopFormatLayout();
+
+ inline void CheckIdleEnd();
+
+public:
+ SwLayAction( SwRootFrame *pRt, SwViewShellImp *pImp );
+ ~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 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 m_bInterrupt; }
+
+ VclInputFlags GetInputType() const { return m_nInputType; }
+
+ // 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; }
+
+ void SetAgain(bool bAgain);
+ 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 * );
+
+};
+
+enum class IdleJobType
+{
+ ONLINE_SPELLING,
+ AUTOCOMPLETE_WORDS,
+ WORD_COUNT,
+ SMART_TAGS
+};
+
+enum class IdleJobArea
+{
+ ALL,
+ VISIBLE
+};
+
+class SwLayIdle
+{
+ SwRootFrame *m_pRoot;
+ SwViewShellImp *m_pImp; // The Idler registers and deregisters here
+ SwContentNode *m_pContentNode; // The current cursor position is saved here
+ sal_Int32 m_nTextPos;
+ bool m_bPageValid; // Were we able to evaluate everything on the whole page?
+#ifdef DBG_UTIL
+ bool m_bIndicator;
+
+ void ShowIdle( Color eName );
+#endif
+
+ bool DoIdleJob_( const SwContentFrame*, IdleJobType );
+ bool DoIdleJob(IdleJobType eJobType, IdleJobArea eJobArea);
+
+ static bool isJobEnabled(IdleJobType eJob, const SwViewShell* pViewShell);
+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: */
diff --git a/sw/source/core/inc/laycache.hxx b/sw/source/core/inc/laycache.hxx
new file mode 100644
index 0000000000..27f36a96fa
--- /dev/null
+++ b/sw/source/core/inc/laycache.hxx
@@ -0,0 +1,69 @@
+/* -*- 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_LAYCACHE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_LAYCACHE_HXX
+
+#include <sal/types.h>
+#include <memory>
+
+class SwDoc;
+class SwLayCacheImpl;
+class SvStream;
+
+/*
+ * This class allows to save layout information in the file and it contains
+ * this information after loading of a file.
+ * Call Write(..) with a stream and the document to save and the page break
+ * information of the document will be written.
+ * Call Read(..) with a stream and the member pLayCacheImpl will
+ * read the information from the stream and store it in an internal structure.
+ * There's a simple locking mechanism at these classes,
+ * if somebody reads the information, he increments the lock count by 1,
+ * during the Read(..) function the lock count will set to $8000.
+ */
+class SwLayoutCache
+{
+ std::unique_ptr<SwLayCacheImpl> m_pImpl;
+ sal_uInt16 m_nLockCount;
+
+public:
+ SwLayoutCache();
+ ~SwLayoutCache();
+
+ void Read( SvStream &rStream );
+ static void Write( SvStream &rStream, const SwDoc& rDoc );
+
+ void ClearImpl();
+ bool IsLocked() const { return m_nLockCount > 0; }
+ sal_uInt16& GetLockCount() { return m_nLockCount; }
+ SwLayCacheImpl *LockImpl()
+ { if( m_nLockCount & 0x8000 ) return nullptr;
+ if ( m_pImpl )
+ ++m_nLockCount;
+ return m_pImpl.get(); }
+ void UnlockImpl() { --m_nLockCount; }
+
+#ifdef DBG_UTIL
+ bool CompareLayout( const SwDoc& rDoc ) const;
+#endif
+};
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/layfrm.hxx b/sw/source/core/inc/layfrm.hxx
new file mode 100644
index 0000000000..981fbb34f6
--- /dev/null
+++ b/sw/source/core/inc/layfrm.hxx
@@ -0,0 +1,225 @@
+/* -*- 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_LAYFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_LAYFRM_HXX
+
+#include "frame.hxx"
+#include <swdllapi.h>
+
+class SwAnchoredObject;
+class SwContentFrame;
+class SwFormatCol;
+struct SwCursorMoveState;
+class SwFrameFormat;
+class SwBorderAttrs;
+class SwFormatFrameSize;
+class SwCellFrame;
+
+/// A layout frame is a frame that contains other frames (m_pLower), e.g. SwPageFrame or SwTabFrame.
+class SW_DLLPUBLIC SwLayoutFrame: public SwFrame
+{
+ // The SwFrame in disguise
+ friend class SwFlowFrame;
+ friend class SwFrame;
+
+ // Releases the Lower while restructuring columns
+ friend SwFrame* SaveContent( SwLayoutFrame *, SwFrame * );
+ friend void RestoreContent( SwFrame *, SwLayoutFrame *, SwFrame *pSibling );
+
+protected:
+
+ virtual void DestroyImpl() override;
+ virtual ~SwLayoutFrame() override;
+
+ virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override;
+ virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
+
+ SwFrame * m_pLower;
+ std::vector<SwAnchoredObject*> m_VertPosOrientFramesFor;
+
+ virtual SwTwips ShrinkFrame( SwTwips, bool bTst = false, bool bInfo = false ) override;
+ virtual SwTwips GrowFrame ( SwTwips, bool bTst = false, bool bInfo = false ) override;
+
+ tools::Long CalcRel( const SwFormatFrameSize &rSz ) const;
+
+public:
+ // --> #i28701#
+
+ virtual void PaintSubsidiaryLines( const SwPageFrame*, const SwRect& ) const;
+ void RefreshLaySubsidiary( const SwPageFrame*, const SwRect& ) const;
+ void RefreshExtraData( const SwRect & ) const;
+
+ /// Change size of lowers proportionally
+ void ChgLowersProp( const Size& rOldSize );
+
+ void AdjustColumns( const SwFormatCol *pCol, bool bAdjustAttributes );
+
+ void ChgColumns( const SwFormatCol &rOld, const SwFormatCol &rNew,
+ const bool bChgFootnote = false );
+
+ /// Paints the column separation line for the inner columns
+ void PaintColLines( const SwRect &, const SwFormatCol &,
+ const SwPageFrame * ) const;
+
+ virtual bool FillSelection( SwSelectionList& rList, const SwRect& rRect ) const override;
+
+ virtual bool GetModelPositionForViewPoint( SwPosition *, Point&,
+ SwCursorMoveState* = nullptr, bool bTestBackground = false ) const override;
+
+ virtual void Cut() override;
+ virtual void Paste( SwFrame* pParent, SwFrame* pSibling = nullptr ) override;
+
+ /**
+ * Finds the closest Content for the SPoint
+ * Is used for Pages, Flys and Cells if GetModelPositionForViewPoint failed
+ */
+ const SwContentFrame* GetContentPos( Point &rPoint, const bool bDontLeave,
+ const bool bBodyOnly = false,
+ SwCursorMoveState *pCMS = nullptr,
+ const bool bDefaultExpand = true ) const;
+
+ SwLayoutFrame( SwFrameFormat*, SwFrame* );
+
+ virtual void PaintSwFrame( vcl::RenderContext& rRenderContext, SwRect const&,
+ SwPrintData const*const pPrintData = nullptr ) const override;
+ const SwFrame *Lower() const { return m_pLower; }
+ SwFrame *Lower() { return m_pLower; }
+ bool ContainsDeleteForbiddenLayFrame() const;
+ const SwContentFrame *ContainsContent() const;
+ inline SwContentFrame *ContainsContent();
+ const SwCellFrame *FirstCell() const;
+ inline SwCellFrame *FirstCell();
+
+ /**
+ * Method <ContainsAny()> doesn't investigate content of footnotes by default.
+ * But under certain circumstances this investigation is intended.
+ * Thus, introduce new optional parameter <_bInvestigateFootnoteForSections>.
+ * It's default is <false>, still indicating that content of footnotes isn't
+ * investigated for sections.
+ */
+ const SwFrame *ContainsAny( const bool _bInvestigateFootnoteForSections = false ) const;
+ inline SwFrame *ContainsAny( const bool _bInvestigateFootnoteForSections = false );
+ bool IsAnLower( const SwFrame * ) const;
+
+ virtual const SwFrameFormat *GetFormat() const;
+ virtual SwFrameFormat *GetFormat();
+ void SetFrameFormat( SwFrameFormat* );
+
+ /**
+ * Moving the Footnotes of all Lowers - starting from StartContent
+ *
+ * @returns true if at least one Footnote was moved
+ * Calls the page number update if bFootnoteNums is set
+ */
+ bool MoveLowerFootnotes( SwContentFrame *pStart, SwFootnoteBossFrame *pOldBoss,
+ SwFootnoteBossFrame *pNewBoss, const bool bFootnoteNums );
+
+ // --> #i28701# - change purpose of method and its name
+ // --> #i44016# - add parameter <_bUnlockPosOfObjs> to
+ /// force an unlockposition call for the lower objects.
+ void NotifyLowerObjs( const bool _bUnlockPosOfObjs = false );
+
+ /**
+ * Invalidates the inner Frames, whose width and/or height are
+ * calculated using percentages.
+ * Frames that are anchored to this or inner Frames, are also invalidated.
+ */
+ void InvaPercentLowers( SwTwips nDiff = 0 );
+
+ /// Called by Format for Frames and Areas with columns
+ void FormatWidthCols( const SwBorderAttrs &, const SwTwips nBorder,
+ const SwTwips nMinHeight );
+
+ /**
+ * InnerHeight returns the height of the content and may be bigger or
+ * less than the PrtArea-Height of the layoutframe himself
+ */
+ SwTwips InnerHeight() const;
+
+ /** method to check relative position of layout frame to
+ a given layout frame.
+
+ refactoring of pseudo-local method <lcl_Apres(..)> in
+ <txtftn.cxx> for #104840#.
+
+ @param _aCheckRefLayFrame
+ constant reference of an instance of class <SwLayoutFrame> which
+ is used as the reference for the relative position check.
+
+ @return true, if <this> is positioned before the layout frame <p>
+ */
+ bool IsBefore( const SwLayoutFrame* _pCheckRefLayFrame ) const;
+
+ const SwFrame* GetLastLower() const;
+ inline SwFrame* GetLastLower();
+
+ virtual void PaintBreak() const;
+
+ void SetVertPosOrientFrameFor(SwAnchoredObject *pObj)
+ {
+ m_VertPosOrientFramesFor.push_back(pObj);
+ }
+
+ void ClearVertPosOrientFrameFor(SwAnchoredObject *pObj)
+ {
+ std::erase(m_VertPosOrientFramesFor, pObj);
+ }
+ void dumpAsXmlAttributes(xmlTextWriterPtr writer) const override;
+};
+
+/**
+ * In order to save us from duplicating implementations, we cast here
+ * a little.
+ */
+inline SwContentFrame* SwLayoutFrame::ContainsContent()
+{
+ return const_cast<SwContentFrame*>(static_cast<const SwLayoutFrame*>(this)->ContainsContent());
+}
+
+inline SwCellFrame* SwLayoutFrame::FirstCell()
+{
+ return const_cast<SwCellFrame*>(static_cast<const SwLayoutFrame*>(this)->FirstCell());
+}
+
+inline SwFrame* SwLayoutFrame::ContainsAny( const bool _bInvestigateFootnoteForSections )
+{
+ return const_cast<SwFrame*>(static_cast<const SwLayoutFrame*>(this)->ContainsAny( _bInvestigateFootnoteForSections ));
+}
+
+/**
+ * These SwFrame inlines are here, so that frame.hxx does not need to include layfrm.hxx
+ */
+inline bool SwFrame::IsColBodyFrame() const
+{
+ return mnFrameType == SwFrameType::Body && GetUpper()->IsColumnFrame();
+}
+
+inline bool SwFrame::IsPageBodyFrame() const
+{
+ return mnFrameType == SwFrameType::Body && GetUpper()->IsPageFrame();
+}
+
+inline SwFrame* SwLayoutFrame::GetLastLower()
+{
+ return const_cast<SwFrame*>(static_cast<const SwLayoutFrame*>(this)->GetLastLower());
+}
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_LAYFRM_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/layouter.hxx b/sw/source/core/inc/layouter.hxx
new file mode 100644
index 0000000000..a3979cf467
--- /dev/null
+++ b/sw/source/core/inc/layouter.hxx
@@ -0,0 +1,146 @@
+/* -*- 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_LAYOUTER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_LAYOUTER_HXX
+
+#include <swtypes.hxx>
+#include <unordered_map>
+#include <memory>
+
+class SwEndnoter;
+class SwDoc;
+class SwSectionFrame;
+class SwFootnoteFrame;
+class SwPageFrame;
+class SwLooping;
+
+class SwMovedFwdFramesByObjPos;
+class SwTextFrame;
+class SwRowFrame;
+class SwObjsMarkedAsTmpConsiderWrapInfluence;
+class SwAnchoredObject;
+class SwFlowFrame;
+class SwLayoutFrame;
+
+#define LOOP_PAGE 1
+
+class SwLayouter
+{
+ std::unique_ptr<SwEndnoter> mpEndnoter;
+ std::unique_ptr<SwLooping> mpLooping;
+ void CollectEndnotes_( SwSectionFrame* pSect );
+ bool StartLooping( SwPageFrame const * pPage );
+
+ // --> #i28701#
+ std::unique_ptr<SwMovedFwdFramesByObjPos> mpMovedFwdFrames;
+ // --> #i35911#
+ std::unique_ptr<SwObjsMarkedAsTmpConsiderWrapInfluence> mpObjsTmpConsiderWrapInfl;
+
+public:
+ // --> #i65250#
+ // - data structure to collect moving backward layout information
+ struct tMoveBwdLayoutInfoKey
+ {
+ // frame ID of flow frame
+ sal_uInt32 mnFrameId;
+ // position of new upper frame
+ SwTwips mnNewUpperPosX;
+ SwTwips mnNewUpperPosY;
+ // size of new upper frame
+ SwTwips mnNewUpperWidth;
+ SwTwips mnNewUpperHeight;
+ // free space in new upper frame
+ SwTwips mnFreeSpaceInNewUpper;
+
+ };
+private:
+ struct fMoveBwdLayoutInfoKeyHash
+ {
+ size_t operator()( const tMoveBwdLayoutInfoKey& p_key ) const
+ {
+ return p_key.mnFrameId;
+ }
+ };
+ struct fMoveBwdLayoutInfoKeyEq
+ {
+ bool operator()( const tMoveBwdLayoutInfoKey& p_key1,
+ const tMoveBwdLayoutInfoKey& p_key2 ) const
+ {
+ return p_key1.mnFrameId == p_key2.mnFrameId &&
+ p_key1.mnNewUpperPosX == p_key2.mnNewUpperPosX &&
+ p_key1.mnNewUpperPosY == p_key2.mnNewUpperPosY &&
+ p_key1.mnNewUpperWidth == p_key2.mnNewUpperWidth &&
+ p_key1.mnNewUpperHeight == p_key2.mnNewUpperHeight &&
+ p_key1.mnFreeSpaceInNewUpper == p_key2.mnFreeSpaceInNewUpper;
+ }
+ };
+ std::unordered_map< tMoveBwdLayoutInfoKey, sal_uInt16,
+ fMoveBwdLayoutInfoKeyHash,
+ fMoveBwdLayoutInfoKeyEq > maMoveBwdLayoutInfo;
+public:
+ SwLayouter();
+ ~SwLayouter();
+ void InsertEndnotes( SwSectionFrame const * pSect );
+ void CollectEndnote( SwFootnoteFrame* pFootnote );
+ bool HasEndnotes() const;
+
+ void LoopControl( SwPageFrame* pPage );
+ void EndLoopControl();
+ void LoopingLouieLight( const SwDoc& rDoc, const SwTextFrame& rFrame );
+
+ static void CollectEndnotes( SwDoc* pDoc, SwSectionFrame* pSect );
+ static bool Collecting( SwDoc* pDoc, SwSectionFrame const * pSect, SwFootnoteFrame* pFootnote );
+ static bool StartLoopControl( SwDoc* pDoc, SwPageFrame const *pPage );
+
+ // --> #i28701#
+ static void ClearMovedFwdFrames( const SwDoc& _rDoc );
+ static void InsertMovedFwdFrame( const SwDoc& _rDoc,
+ const SwTextFrame& _rMovedFwdFrameByObjPos,
+ const sal_uInt32 _nToPageNum );
+ static bool FrameMovedFwdByObjPos( const SwDoc& _rDoc,
+ const SwTextFrame& _rTextFrame,
+ sal_uInt32& _ornToPageNum );
+ // --> #i40155# - unmark given frame as to be moved forward.
+ static void RemoveMovedFwdFrame( const SwDoc& _rDoc,
+ const SwTextFrame& _rTextFrame );
+ // --> #i26945#
+ static bool DoesRowContainMovedFwdFrame( const SwDoc& _rDoc,
+ const SwRowFrame& _rRowFrame );
+
+ // --> #i35911#
+ static void ClearObjsTmpConsiderWrapInfluence( const SwDoc& _rDoc );
+ static void InsertObjForTmpConsiderWrapInfluence(
+ const SwDoc& _rDoc,
+ SwAnchoredObject& _rAnchoredObj );
+ static void RemoveObjForTmpConsiderWrapInfluence(
+ const SwDoc& _rDoc,
+ SwAnchoredObject& _rAnchoredObj );
+
+ // --> #i65250#
+ static bool MoveBwdSuppressed( const SwDoc& p_rDoc,
+ const SwFlowFrame& p_rFlowFrame,
+ const SwLayoutFrame& p_rNewUpperFrame );
+ static void ClearMoveBwdLayoutInfo( const SwDoc& p_rDoc );
+};
+
+extern void LOOPING_LOUIE_LIGHT( bool bCondition, const SwTextFrame& rTextFrame );
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_LAYOUTER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/movedfwdfrmsbyobjpos.hxx b/sw/source/core/inc/movedfwdfrmsbyobjpos.hxx
new file mode 100644
index 0000000000..c42944060c
--- /dev/null
+++ b/sw/source/core/inc/movedfwdfrmsbyobjpos.hxx
@@ -0,0 +1,58 @@
+/* -*- 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_MOVEDFWDFRMSBYOBJPOS_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_MOVEDFWDFRMSBYOBJPOS_HXX
+
+#include <map>
+#include <sal/types.h>
+
+class SwTextNode;
+class SwTextFrame;
+// --> #i26945#
+class SwRowFrame;
+
+typedef std::map< const SwTextNode*, const sal_uInt32 > NodeMap;
+
+class SwMovedFwdFramesByObjPos
+{
+ private:
+ NodeMap maMovedFwdFrames;
+
+ public:
+ SwMovedFwdFramesByObjPos();
+ ~SwMovedFwdFramesByObjPos();
+
+ void Insert( const SwTextFrame& _rMovedFwdFrameByObjPos,
+ const sal_uInt32 _nToPageNum );
+
+ // --> #i40155#
+ void Remove( const SwTextFrame& _rTextFrame );
+
+ bool FrameMovedFwdByObjPos( const SwTextFrame& _rTextFrame,
+ sal_uInt32& _ornToPageNum ) const;
+
+ // --> #i26945#
+ bool DoesRowContainMovedFwdFrame( const SwRowFrame& _rRowFrame ) const;
+
+ void Clear() { maMovedFwdFrames.clear(); };
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/mvsave.hxx b/sw/source/core/inc/mvsave.hxx
new file mode 100644
index 0000000000..7491718191
--- /dev/null
+++ b/sw/source/core/inc/mvsave.hxx
@@ -0,0 +1,201 @@
+/* -*- 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_MVSAVE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_MVSAVE_HXX
+
+#include <vcl/keycod.hxx>
+#include <IDocumentMarkAccess.hxx>
+#include <ndindex.hxx>
+#include <deque>
+#include <optional>
+#include <vector>
+#include <o3tl/typed_flags_set.hxx>
+
+namespace sfx2 {
+ class MetadatableUndo;
+}
+
+class SvNumberFormatter;
+class SwDoc;
+class SwFormatAnchor;
+class SwFrameFormat;
+class SwContentIndex;
+class SwNodeRange;
+class SwPaM;
+class SwNode;
+struct SwPosition;
+
+namespace sw::mark
+{
+ class IMark;
+
+ class SaveBookmark
+ {
+ public:
+ SaveBookmark(
+ const ::sw::mark::IMark& rBkmk,
+ const SwNode& rMvPos,
+ std::optional<sal_Int32> oContentIdx);
+ void SetInDoc(SwDoc* pDoc,
+ const SwNode&,
+ std::optional<sal_Int32> oContentIdx = std::nullopt);
+
+ private:
+ OUString m_aName;
+ OUString m_aShortName;
+ bool m_bHidden;
+ OUString m_aHideCondition;
+ vcl::KeyCode m_aCode;
+ IDocumentMarkAccess::MarkType m_eOrigBkmType;
+ SwNodeOffset m_nNode1;
+ SwNodeOffset m_nNode2;
+ sal_Int32 m_nContent1;
+ sal_Int32 m_nContent2;
+ std::shared_ptr< ::sfx2::MetadatableUndo > m_pMetadataUndo;
+ };
+
+ enum class RestoreMode { Flys = 1, NonFlys = 2, All = 3 };
+
+ /// Takes care of storing relevant attributes of an SwTextNode before split, then restore them on the new node.
+ class ContentIdxStore
+ {
+ public:
+ virtual bool Empty() =0;
+ virtual void Save(SwDoc& rDoc, SwNodeOffset nNode, sal_Int32 nContent, bool bSaveFlySplit=false) =0;
+ virtual void Restore(SwDoc& rDoc, SwNodeOffset nNode, sal_Int32 nOffset=0, bool bAuto = false, bool bAtStart = false, RestoreMode = RestoreMode::All) =0;
+ virtual void Restore(SwNode& rNd, sal_Int32 nLen, sal_Int32 nCorrLen, RestoreMode = RestoreMode::All) =0;
+ virtual ~ContentIdxStore() {};
+ static std::shared_ptr<ContentIdxStore> Create();
+ };
+}
+
+namespace o3tl {
+ template<> struct typed_flags<sw::mark::RestoreMode> : is_typed_flags<sw::mark::RestoreMode, 3> {};
+}
+
+void DelBookmarks(SwNode& rStt,
+ const SwNode& rEnd,
+ std::vector< ::sw::mark::SaveBookmark> * SaveBkmk =nullptr,
+ std::optional<sal_Int32> oStartContentIdx = std::nullopt,
+ std::optional<sal_Int32> oEndContentIdx = std::nullopt,
+ bool isReplace = false);
+
+/** data structure to temporarily hold fly anchor positions relative to some
+ * location. */
+struct SaveFly
+{
+ SwFrameFormat* pFrameFormat; /// the fly's frame format
+ SwNodeOffset nNdDiff; /// relative node difference
+ sal_Int32 nContentIndex; ///< index in node
+ bool isAtInsertNode; ///< if true, anchor _at_ insert node index
+
+ SaveFly( SwNodeOffset nNodeDiff, sal_Int32 const nCntntIdx, SwFrameFormat* pFormat, bool bInsert )
+ : pFrameFormat(pFormat)
+ , nNdDiff(nNodeDiff)
+ , nContentIndex(nCntntIdx)
+ , isAtInsertNode(bInsert)
+ { }
+};
+
+typedef std::deque< SaveFly > SaveFlyArr;
+
+void RestFlyInRange( SaveFlyArr& rArr, const SwPosition& rSttIdx,
+ const SwNode* pInsPos, bool isForceToStartPos = false);
+void SaveFlyInRange( const SwNodeRange& rRg, SaveFlyArr& rArr );
+void SaveFlyInRange( const SwPaM& rPam, const SwPosition& rInsPos,
+ SaveFlyArr& rArr, bool bMoveAllFlys, SwHistory * pHistory = nullptr);
+
+void DelFlyInRange( SwNode& rMkNd,
+ SwNode& rPtNd,
+ std::optional<sal_Int32> nMkContentIdx = std::nullopt,
+ std::optional<sal_Int32> pPtContentIdx = std::nullopt);
+
+class SwDataChanged
+{
+ const SwPaM* m_pPam;
+ const SwPosition* m_pPos;
+ SwDoc& m_rDoc;
+ sal_Int32 m_nContent;
+
+public:
+ SwDataChanged( const SwPaM& rPam );
+ SwDataChanged( SwDoc& rDoc, const SwPosition& rPos );
+ ~SwDataChanged();
+
+ sal_Int32 GetContent() const { return m_nContent; }
+};
+
+/**
+ * Function declarations so that everything below the CursorShell can
+ * move the Cursor once in a while.
+ * These functions do not call the SwDoc::Corr methods!
+ */
+void PaMCorrAbs( const SwPaM& rRange,
+ const SwPosition& rNewPos );
+
+/// Sets all PaMs in OldNode to relative Pos
+void PaMCorrRel( const SwNode &rOldNode,
+ const SwPosition &rNewPos,
+ const sal_Int32 nOffset = 0 );
+
+/**
+ * Helper to copy paragraph-bound Flys.
+ * By sorting by order number, we try to retain the layout.
+ */
+class ZSortFly
+{
+ const SwFrameFormat* m_pFormat;
+ const SwFormatAnchor* m_pAnchor;
+ sal_uInt32 m_nOrdNum;
+
+public:
+ ZSortFly( const SwFrameFormat* pFrameFormat, const SwFormatAnchor* pFlyAnchor,
+ sal_uInt32 nArrOrdNum );
+
+ bool operator==( const ZSortFly& ) const { return false; }
+ bool operator<( const ZSortFly& rCmp ) const
+ { return m_nOrdNum < rCmp.m_nOrdNum; }
+
+ const SwFrameFormat* GetFormat() const { return m_pFormat; }
+ const SwFormatAnchor* GetAnchor() const { return m_pAnchor; }
+};
+
+class SwTableNumFormatMerge
+{
+ SvNumberFormatter* pNFormat;
+public:
+ SwTableNumFormatMerge( const SwDoc& rSrc, SwDoc& rDest );
+ ~SwTableNumFormatMerge();
+};
+
+class SaveRedlEndPosForRestore
+{
+ std::vector<SwPosition*> mvSavArr;
+ std::optional<SwNodeIndex> moSaveIndex;
+ sal_Int32 mnSaveContent;
+
+public:
+ SaveRedlEndPosForRestore( const SwNode& rInsIdx, sal_Int32 nContent );
+ ~SaveRedlEndPosForRestore();
+ void Restore();
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_MVSAVE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/node2lay.hxx b/sw/source/core/inc/node2lay.hxx
new file mode 100644
index 0000000000..0ba712f197
--- /dev/null
+++ b/sw/source/core/inc/node2lay.hxx
@@ -0,0 +1,90 @@
+/* -*- 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_NODE2LAY_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_NODE2LAY_HXX
+
+#include <nodeoffset.hxx>
+
+#include <memory>
+
+/**
+ * This class connects the Nodes with the Layouts.
+ * It provides an intelligent iterator over Frames belonging to the Node or
+ * Node Range. Depending on the purpose of iterating (e.g. to insert other
+ * Frames before or after the Frames) Master/Follows are recognized and only
+ * the relevant ones are returned. Repeated table headers are also taken
+ * into account.
+ * It's possible to iterate over SectionNodes that are either not directly
+ * assigned to a SectionFrame or to multiple ones due to nesting.
+ *
+ * This class is an interface between the method and a SwClientIter: it
+ * chooses the right sw::BroadcastingModify depending on the task, creates a SwClientIter
+ * and filters its iterations depending on the task.
+ * The task is determined by the choice of class.
+ *
+ * 1. Collecting the UpperFrames (so that later RestoreUpperFrames can be called)
+ * is called by MakeFrames, if there's no PrevNext (before/after we can insert
+ * the Frames).
+ * 2. Inserting the Frames before/after which the new Frames of a Node need to
+ * be inserted, is also called by MakeFrames.
+ */
+
+class SwNode2LayImpl;
+class SwFrame;
+class SwLayoutFrame;
+class SwNode;
+class SwNodes;
+class Point;
+
+class SwNode2Layout
+{
+ std::unique_ptr<SwNode2LayImpl> m_pImpl;
+
+public:
+ /// Use this ctor for inserting before/after rNd
+ /// @param nIdx is the index of the to-be-inserted Node
+ SwNode2Layout(const SwNode& rNd, SwNodeOffset nIdx);
+ ~SwNode2Layout();
+ SwFrame* NextFrame();
+ SwLayoutFrame* UpperFrame(SwFrame*& rpFrame, const SwNode& rNode);
+
+ SwFrame* GetFrame(const Point* pDocPos) const;
+};
+
+class SwNode2LayoutSaveUpperFrames
+{
+ std::unique_ptr<SwNode2LayImpl> m_pImpl;
+
+public:
+ /// Use this ctor for collecting the UpperFrames
+ SwNode2LayoutSaveUpperFrames(const SwNode& rNd);
+ ~SwNode2LayoutSaveUpperFrames();
+
+ void RestoreUpperFrames(SwNodes& rNds, SwNodeOffset nStt, SwNodeOffset nEnd);
+};
+
+namespace sw
+{
+SwFrame const* FindNeighbourFrameForNode(SwNode const& rNode);
+
+} // namespace sw
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/noteurl.hxx b/sw/source/core/inc/noteurl.hxx
new file mode 100644
index 0000000000..1e5775d3c0
--- /dev/null
+++ b/sw/source/core/inc/noteurl.hxx
@@ -0,0 +1,32 @@
+/* -*- 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_NOTEURL_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_NOTEURL_HXX
+
+class SwNoteURL
+{
+};
+
+// globale Variable, in NoteURL.Cxx angelegt
+extern SwNoteURL* pNoteURL;
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/notxtfrm.hxx b/sw/source/core/inc/notxtfrm.hxx
new file mode 100644
index 0000000000..50612e396a
--- /dev/null
+++ b/sw/source/core/inc/notxtfrm.hxx
@@ -0,0 +1,116 @@
+/* -*- 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_NOTXTFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_NOTXTFRM_HXX
+
+#include "cntfrm.hxx"
+#include <node.hxx>
+// MM02
+#include <svx/sdr/contact/viewcontact.hxx>
+
+class SwNoTextNode;
+class OutputDevice;
+class SwBorderAttrs;
+struct SwCursorMoveState;
+
+class SwNoTextFrame final : public SwContentFrame
+{
+private:
+ friend void FrameFinit();
+ const Size& GetSize() const;
+
+ void Format ( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override;
+ void PaintPicture( vcl::RenderContext*, const SwRect& ) const;
+
+ virtual void DestroyImpl() override;
+ virtual ~SwNoTextFrame() override;
+
+ // RotateFlyFrame3 add TransformableSwFrame
+ std::unique_ptr< TransformableSwFrame > mpTransformableSwFrame;
+
+ // RotateFlyFrame3 - Support for inner frame of a SwGrfNode.
+ // Only for local data extraction. To uniquely access information
+ // for local transformation, use getFrameArea(Print)Transformation.
+ friend double getLocalFrameRotation_from_SwNoTextFrame(const SwNoTextFrame& rNoTextFrame);
+ double getLocalFrameRotation() const;
+
+ void ClearCache();
+
+ // MM02
+ std::unique_ptr<sdr::contact::ViewContact> mpViewContact;
+ sdr::contact::ViewContact& GetViewContact() const;
+ void OnGraphicArrived();
+
+ virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+
+ void ImplPaintPictureGraphic( vcl::RenderContext* pOut,
+ SwGrfNode* pGrfNd, bool bPrn,
+ const SwRect& rAlignedGrfArea, SwViewShell* pShell, SwNoTextNode& rNoTNd ) const;
+ void ImplPaintPictureBitmap( vcl::RenderContext* pOut,
+ SwOLENode* pOLENd, bool bIsChart, bool bPrn,
+ const SwRect& rAlignedGrfArea, SwViewShell* pShell ) const;
+ void ImplPaintPictureAnimate(vcl::RenderContext* pOut, SwViewShell* pShell,
+ SwGrfNode* pGrfNd, const SwRect& rAlignedGrfArea) const;
+ void ImplPaintPictureReplacement(const GraphicObject& rGrfObj, SwGrfNode* pGrfNd,
+ const SwRect& rAlignedGrfArea, SwViewShell* pShell) const;
+
+public:
+ SwNoTextFrame( SwNoTextNode * const, SwFrame* );
+
+ const SwContentNode *GetNode() const
+ { return static_cast<SwContentNode const*>(GetDep()); }
+ SwContentNode *GetNode()
+ { return static_cast<SwContentNode *>(GetDep()); }
+
+ virtual bool LeftMargin(SwPaM *) const override;
+ virtual bool RightMargin(SwPaM *, bool bAPI = false) const override;
+
+ virtual void PaintSwFrame( vcl::RenderContext& rRenderContext, SwRect const&,
+ SwPrintData const*const pPrintData = nullptr ) const override;
+ virtual bool GetCharRect( SwRect &, const SwPosition&,
+ SwCursorMoveState* = nullptr, bool bAllowFarAway = true ) const override;
+ virtual bool GetModelPositionForViewPoint(SwPosition* pPos, Point& aPoint,
+ SwCursorMoveState* = nullptr, bool bTestBackground = false) const override;
+
+ void GetGrfArea( SwRect &rRect, SwRect * ) const;
+
+ bool IsTransparent() const;
+
+ void StopAnimation( const OutputDevice* = nullptr ) const;
+ bool HasAnimation() const;
+
+ // RotateFlyFrame3 - Support for Transformations
+ bool isTransformableSwFrame() const { return bool(mpTransformableSwFrame); }
+ TransformableSwFrame* getTransformableSwFrame() { return mpTransformableSwFrame.get(); }
+ const TransformableSwFrame* getTransformableSwFrame() const { return mpTransformableSwFrame.get(); }
+
+ // RotateFlyFrame3 - Support for Transformations
+ virtual basegfx::B2DHomMatrix getFrameAreaTransformation() const override;
+ virtual basegfx::B2DHomMatrix getFramePrintAreaTransformation() const override;
+
+ // RotateFlyFrame3 - Support for Transformations
+ virtual void transform_translate(const Point& rOffset) override;
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/objectformatter.hxx b/sw/source/core/inc/objectformatter.hxx
new file mode 100644
index 0000000000..f85c12dc5f
--- /dev/null
+++ b/sw/source/core/inc/objectformatter.hxx
@@ -0,0 +1,175 @@
+/* -*- 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_OBJECTFORMATTER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_OBJECTFORMATTER_HXX
+
+#include <sal/types.h>
+#include <memory>
+
+class SwFrame;
+// #i26945#
+class SwTextFrame;
+class SwLayoutFrame;
+class SwPageFrame;
+class SwAnchoredObject;
+class SwLayAction;
+// OD 2004-10-04 #i26945#
+class SwPageNumAndTypeOfAnchors;
+
+// #i28701#
+// Format floating screen objects, which are anchored at the given anchor frame
+// and registered at the given page frame.
+
+class SwObjectFormatter
+{
+ private:
+ // page frame, at which the floating screen objects are registered.
+ const SwPageFrame& mrPageFrame;
+
+ // value of document compatibility option 'Consider wrapping style on
+ // object positioning'
+ const bool mbConsiderWrapOnObjPos;
+
+ // layout action calling the format of the floating screen objects
+ SwLayAction* mpLayAction;
+
+ // data structure to collect page number of object's 'anchor'
+ // #i26945#
+ std::unique_ptr<SwPageNumAndTypeOfAnchors> mpPgNumAndTypeOfAnchors;
+
+ /** helper method for method <FormatObj_(..)> - performs the intrinsic
+ format of the layout of the given layout frame and all its lower
+ layout frames.
+
+ #i28701#
+ IMPORTANT NOTE:
+ Method corresponds to methods <SwLayAction::FormatLayoutFly(..)> and
+ <SwLayAction::FormatLayout(..)>. Thus, its code for the formatting have
+ to be synchronised.
+ */
+ void FormatLayout_( SwLayoutFrame& _rLayoutFrame );
+
+ /** helper method for method <FormatObj_(..)> - performs the intrinsic
+ format of the content of the given floating screen object.
+
+ #i28701#
+ */
+ void FormatObjContent( SwAnchoredObject& _rAnchoredObj );
+
+ protected:
+ SwObjectFormatter( const SwPageFrame& _rPageFrame,
+ SwLayAction* _pLayAction,
+ const bool _bCollectPgNumOfAnchors = false );
+
+ static std::unique_ptr<SwObjectFormatter> CreateObjFormatter( SwFrame& _rAnchorFrame,
+ const SwPageFrame& _rPageFrame,
+ SwLayAction* _pLayAction );
+
+ virtual SwFrame& GetAnchorFrame() = 0;
+
+ const SwPageFrame& GetPageFrame() const
+ {
+ return mrPageFrame;
+ }
+
+ bool ConsiderWrapOnObjPos() const
+ {
+ return mbConsiderWrapOnObjPos;
+ }
+
+ SwLayAction* GetLayAction()
+ {
+ return mpLayAction;
+ }
+
+ /** performs the intrinsic format of a given floating screen object and its content.
+ */
+ void FormatObj_( SwAnchoredObject& _rAnchoredObj );
+
+ /** invokes the intrinsic format method for all floating screen objects,
+ anchored at anchor frame on the given page frame
+
+ for format of floating screen objects for
+ follow text frames, the 'master' text frame is passed to the method.
+ Thus, the objects, whose anchor character is inside the follow text
+ frame can be formatted.
+
+ @param _pMasterTextFrame
+ input parameter - pointer to 'master' text frame. default value: NULL
+ */
+ bool FormatObjsAtFrame_( SwTextFrame* _pMasterTextFrame = nullptr );
+
+ /** accessor to collected anchored object
+ */
+ SwAnchoredObject* GetCollectedObj( const sal_uInt32 _nIndex );
+
+ /** accessor to 'anchor' page number of collected anchored object
+ */
+ sal_uInt32 GetPgNumOfCollected( const sal_uInt32 _nIndex );
+
+ /** accessor to 'anchor' type of collected anchored object
+ */
+ bool IsCollectedAnchoredAtMaster( const sal_uInt32 _nIndex );
+
+ /** accessor to total number of collected anchored objects
+ */
+ sal_uInt32 CountOfCollected();
+
+ public:
+ virtual ~SwObjectFormatter();
+
+ /** intrinsic method to format a certain floating screen object
+
+ #i40147# - add parameter <_bCheckForMovedFwd>
+
+ @param _rAnchoredObj
+ input parameter - anchored object, which have to be formatted.
+
+ @param _bCheckForMovedFwd
+ input parameter - boolean indicating, that after a successful
+ format of the anchored object the anchor frame has to be checked,
+ if it would moved forward due to the positioning of the anchored object.
+ default value: false
+ value only considered, if wrapping style influence has to be
+ considered for the positioning of the anchored object.
+ */
+ virtual bool DoFormatObj( SwAnchoredObject& _rAnchoredObj,
+ const bool _bCheckForMovedFwd = false ) = 0;
+
+ /** intrinsic method to format all floating screen objects
+ */
+ virtual bool DoFormatObjs() = 0;
+
+ /** method to format all floating screen objects at the given anchor frame
+ */
+ static bool FormatObjsAtFrame( SwFrame& _rAnchorFrame,
+ const SwPageFrame& _rPageFrame,
+ SwLayAction* _pLayAction = nullptr );
+
+ /** method to format a given floating screen object
+ */
+ static bool FormatObj( SwAnchoredObject& _rAnchoredObj,
+ SwFrame* _pAnchorFrame = nullptr,
+ const SwPageFrame* _pPageFrame = nullptr,
+ SwLayAction* pLayAction = nullptr );
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/observablethread.hxx b/sw/source/core/inc/observablethread.hxx
new file mode 100644
index 0000000000..3d10a7f384
--- /dev/null
+++ b/sw/source/core/inc/observablethread.hxx
@@ -0,0 +1,87 @@
+/* -*- 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_OBSERVABLETHREAD_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_OBSERVABLETHREAD_HXX
+
+#include <osl/thread.hxx>
+#include <osl/interlck.h>
+#include <salhelper/simplereferenceobject.hxx>
+#include <memory>
+
+class IFinishedThreadListener;
+
+/** class for an observable thread
+
+ OD 2007-01-29 #i73788#
+ Note: A thread is ref-counted. Thus, an instance of a derived class has to
+ to be hold via a reference. The thread itself assures during its execution,
+ that the ref-count is increased. Its execution starts with its <run()> method
+ and ends with its <onTerminated()> method.
+ Note: A thread can be only observed by one or none thread observer in order
+ to notify, that the thread has finished its work.
+*/
+class ObservableThread : public osl::Thread,
+ public salhelper::SimpleReferenceObject
+{
+ public:
+
+ virtual ~ObservableThread() override;
+
+ void SetListener( std::weak_ptr< IFinishedThreadListener > const & pThreadListener,
+ const oslInterlockedCount nThreadID );
+
+ // resolve ambiguity
+ using SimpleReferenceObject::operator new;
+ using SimpleReferenceObject::operator delete;
+
+ protected:
+
+ ObservableThread();
+
+ /** intrinsic function of the thread
+
+ Important note:
+ Do not override this method again. Instead override <threadFunction()>.
+ Otherwise, it's not guaranteed, that its ref-count is increased
+ during the execution of the thread.
+ */
+ virtual void SAL_CALL run() override;
+
+ virtual void threadFunction() = 0;
+
+ /** method called, when thread has finished its work
+
+ Important note:
+ Do not override this method again. Instead override <threadFinished()>.
+ Otherwise, it's not guaranteed, that the ref-count is decreased at
+ the end of its execution and that the observer is notified, that
+ the thread has finished its work.
+ */
+ virtual void SAL_CALL onTerminated() override;
+
+ private:
+
+ oslInterlockedCount mnThreadID;
+
+ std::weak_ptr< IFinishedThreadListener > mpThreadListener;
+
+};
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/pagedeschint.hxx b/sw/source/core/inc/pagedeschint.hxx
new file mode 100644
index 0000000000..2dbfec18da
--- /dev/null
+++ b/sw/source/core/inc/pagedeschint.hxx
@@ -0,0 +1,40 @@
+/* -*- 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_PAGEDESCHINT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_PAGEDESCHINT_HXX
+
+#include <svl/hint.hxx>
+
+class SwPageDesc;
+
+class SwPageDescHint final : public SfxHint
+{
+ SwPageDesc* m_pPageDesc;
+public:
+ SwPageDescHint( SwPageDesc* p )
+ : m_pPageDesc(p)
+ {}
+
+ SwPageDesc* GetPageDesc() const { return m_pPageDesc; }
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/pagefrm.hxx b/sw/source/core/inc/pagefrm.hxx
new file mode 100644
index 0000000000..54458032f1
--- /dev/null
+++ b/sw/source/core/inc/pagefrm.hxx
@@ -0,0 +1,468 @@
+/* -*- 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_PAGEFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_PAGEFRM_HXX
+
+#include <viewsh.hxx>
+#include <swdllapi.h>
+#include "ftnboss.hxx"
+#include "hffrm.hxx"
+
+#include <SidebarWindowsTypes.hxx>
+
+class SwFlyFrame;
+class SwFlyFrameFormat;
+class SwPageDesc;
+class SwContentFrame;
+struct SwPosition;
+struct SwCursorMoveState;
+class SwAttrSetChg;
+namespace vcl { class Font; }
+class SwSortedObjs;
+class SwAnchoredObject;
+namespace sw {
+ class VirtPageNumHint;
+}
+
+enum class SwPageFrameInvFlags : sal_uInt8
+{
+ NONE = 0x00,
+ InvalidatePrt = 0x01,
+ SetCompletePaint = 0x02,
+ InvalidateNextPos = 0x04,
+ PrepareHeader = 0x08,
+ PrepareFooter = 0x10,
+ CheckGrid = 0x20,
+ InvalidateGrid = 0x40,
+};
+
+namespace o3tl {
+ template<> struct typed_flags<SwPageFrameInvFlags> : is_typed_flags<SwPageFrameInvFlags, 0x007f> {};
+}
+
+/// A page of the document layout. Upper frame is expected to be an SwRootFrame
+/// instance. At least an SwBodyFrame lower is expected.
+class SW_DLLPUBLIC SwPageFrame final: public SwFootnoteBossFrame
+{
+ friend class SwFrame;
+
+ std::unique_ptr<SwSortedObjs> m_pSortedObjs;
+
+ SwPageDesc *m_pDesc; //PageDesc that describes the Page
+
+ /// Physical page number: index into list of SwRootFrame lowers
+ sal_uInt16 m_nPhyPageNum;
+
+ bool m_bInvalidContent :1;
+ bool m_bInvalidLayout :1;
+ bool m_bInvalidFlyContent :1;
+ bool m_bInvalidFlyLayout :1;
+ bool m_bInvalidFlyInCnt :1;
+ bool m_bFootnotePage :1; // This Page is for document end footnotes
+ bool m_bEmptyPage :1; // This Page is an explicitly empty page
+ bool m_bEndNotePage :1; // 'Footnote page' for end notes
+ bool m_bInvalidSpelling :1; // We need online spelling
+ bool m_bInvalidSmartTags :1; // We need checking for smarttags
+ bool m_bInvalidAutoCmplWrds :1; // Update auto complete word list
+ bool m_bInvalidWordCount :1;
+ bool m_bHasGrid :1; // Grid for Asian layout
+
+ static const sal_Int8 snShadowPxWidth;
+
+ void UpdateAttr_( const SfxPoolItem*, const SfxPoolItem*, SwPageFrameInvFlags &,
+ SwAttrSetChg *pa = nullptr, SwAttrSetChg *pb = nullptr );
+
+ /// Adapt the max. footnote height in each single column
+ void SetColMaxFootnoteHeight();
+
+ /** determine rectangle for horizontal page shadow
+
+ #i9719#
+
+ @param _rPageRect
+ input parameter - constant instance reference of the page rectangle.
+ Generally, it's the frame area of the page, but for empty pages in print
+ preview, this parameter is useful.
+
+ @param _pViewShell
+ input parameter - instance of the view shell, for which the rectangle
+ has to be generated.
+
+ @param _orBottomShadowRect
+ output parameter - instance reference of the bottom shadow rectangle for
+ the given page rectangle
+ */
+
+ static void GetHorizontalShadowRect( const SwRect& _rPageRect,
+ const SwViewShell* _pViewShell,
+ OutputDevice const * pRenderContext,
+ SwRect& _orBottomShadowRect,
+ bool bPaintLeftShadow,
+ bool bPaintRightShadow,
+ bool bRightSidebar );
+
+ virtual void DestroyImpl() override;
+ virtual ~SwPageFrame() override;
+ virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+
+ /// Calculate the content height of a page (without columns).
+ size_t GetContentHeight(const tools::Long nTop, const tools::Long nBottom) const;
+
+ std::vector<basegfx::B2DPolygon> GetSubsidiaryLinesPolygons(const SwViewShell& rViewShell) const;
+
+public:
+ SwPageFrame( SwFrameFormat*, SwFrame*, SwPageDesc* );
+
+ /// Make this public, so that the SwViewShell can access it when switching from browse mode
+ /// Add/remove header/footer
+ void PrepareHeader();
+ void PrepareFooter();
+
+ const SwSortedObjs *GetSortedObjs() const { return m_pSortedObjs.get(); }
+ SwSortedObjs *GetSortedObjs() { return m_pSortedObjs.get(); }
+
+ void AppendDrawObjToPage( SwAnchoredObject& _rNewObj );
+ void RemoveDrawObjFromPage( SwAnchoredObject& _rToRemoveObj );
+
+ void AppendFlyToPage( SwFlyFrame *pNew );
+ void RemoveFlyFromPage( SwFlyFrame *pToRemove );
+ void MoveFly( SwFlyFrame *pToMove, SwPageFrame *pDest ); // Optimized Remove/Append
+
+ void SetPageDesc( SwPageDesc *, SwFrameFormat * );
+ SwPageDesc *GetPageDesc() { return m_pDesc; }
+ const SwPageDesc *GetPageDesc() const { return m_pDesc; }
+ SwPageDesc *FindPageDesc();
+
+ SwContentFrame *FindLastBodyContent();
+ inline SwContentFrame *FindFirstBodyContent();
+ inline const SwContentFrame *FindFirstBodyContent() const;
+ inline const SwContentFrame *FindLastBodyContent() const;
+
+ SwRect GetBoundRect(OutputDevice const * pOutputDevice) const;
+
+ // Specialized GetContentPos() for Field in Frames
+ void GetContentPosition( const Point &rPt, SwPosition &rPos ) const;
+
+ bool IsEmptyPage() const { return m_bEmptyPage; } // Explicitly empty page
+
+ void UpdateFootnoteNum();
+
+ /// Always call after Paste
+ /// Creates the page-bound frames and formats the generic content
+ void PreparePage( bool bFootnote );
+
+ // Sends a Prepare() to all ContentFrames caused by a changed register template
+ void PrepareRegisterChg();
+
+ // Appends a fly frame - the given one or a new one - at the page frame.
+ // Needed for <Modify> and <MakeFrames>
+ // - return value not needed any more
+ // - second parameter is of type <SwFlyFrameFormat*>
+ // - third parameter only needed for assertion, but calling method assures
+ // this assertion. Thus, delete it.
+ void PlaceFly( SwFlyFrame* pFly, SwFlyFrameFormat* pFormat );
+
+ virtual bool GetModelPositionForViewPoint( SwPosition *, Point&,
+ SwCursorMoveState* = nullptr, bool bTestBackground = false ) const override;
+ virtual void Cut() override;
+ virtual void Paste( SwFrame* pParent, SwFrame* pSibling = nullptr ) override;
+ virtual void CheckDirection( bool bVert ) override;
+ void CheckGrid( bool bInvalidate );
+ void PaintGrid( OutputDevice const * pOut, SwRect const &rRect ) const;
+ bool HasGrid() const { return m_bHasGrid; }
+
+ void PaintDecorators( ) const;
+ virtual void PaintSubsidiaryLines( const SwPageFrame*, const SwRect& ) const override;
+ void AddSubsidiaryLinesBounds(const SwViewShell& rShell, RectangleVector& rRects) const;
+ virtual void PaintBreak() const override;
+
+ /// Paint line number etc.
+ void RefreshExtraData( const SwRect & ) const;
+
+ /// Paint helper lines
+ void RefreshSubsidiary( const SwRect& ) const;
+
+ /// Foot note interface
+ bool IsFootnotePage() const { return m_bFootnotePage; }
+ bool IsEndNotePage() const { return m_bEndNotePage; }
+ void SetFootnotePage( bool b ) { m_bFootnotePage = b; }
+ void SetEndNotePage( bool b ) { m_bEndNotePage = b; }
+
+ sal_uInt16 GetPhyPageNum() const { return m_nPhyPageNum;}
+ void SetPhyPageNum( sal_uInt16 nNum ) { m_nPhyPageNum = nNum;}
+
+ /// Validate, invalidate and query the Page status
+ /// Layout/Content and Fly/non-Fly respectively are inspected separately
+ inline void InvalidateFlyLayout() const;
+ inline void InvalidateFlyContent() const;
+ inline void InvalidateFlyInCnt() const;
+ inline void InvalidateLayout() const;
+ inline void InvalidateContent() const;
+ inline void InvalidateSpelling() const;
+ inline void InvalidateSmartTags() const;
+ inline void InvalidateAutoCompleteWords() const;
+ inline void InvalidateWordCount() const;
+ inline void ValidateFlyLayout() const;
+ inline void ValidateFlyContent() const;
+ inline void ValidateFlyInCnt() const;
+ inline void ValidateLayout() const;
+ inline void ValidateContent() const;
+ inline void ValidateSpelling() const;
+ inline void ValidateSmartTags() const;
+ inline void ValidateAutoCompleteWords() const;
+ inline void ValidateWordCount() const;
+ inline bool IsInvalid() const;
+ inline bool IsInvalidFly() const;
+ bool IsRightShadowNeeded() const;
+ bool IsLeftShadowNeeded() const;
+ bool IsInvalidFlyLayout() const { return m_bInvalidFlyLayout; }
+ bool IsInvalidFlyContent() const { return m_bInvalidFlyContent; }
+ bool IsInvalidFlyInCnt() const { return m_bInvalidFlyInCnt; }
+ bool IsInvalidLayout() const { return m_bInvalidLayout; }
+ bool IsInvalidContent() const { return (m_bInvalidContent || m_bInvalidFlyInCnt); }
+ bool IsInvalidSpelling() const { return m_bInvalidSpelling; }
+ bool IsInvalidSmartTags() const { return m_bInvalidSmartTags; }
+ bool IsInvalidAutoCompleteWords() const { return m_bInvalidAutoCmplWrds; }
+ bool IsInvalidWordCount() const { return m_bInvalidWordCount; }
+
+ /** SwPageFrame::GetDrawBackgroundColor
+
+ determine the color, that is respectively will be drawn as background
+ for the page frame.
+
+ @return reference to an instance of class Color
+ */
+ Color GetDrawBackgroundColor() const;
+
+ /** paint margin area of a page
+
+ implement paint of margin area; margin area will be painted for a
+ view shell with a window and if the document is not in online layout.
+
+ @param _rOutputRect
+ input parameter - constant instance reference of the rectangle, for
+ which an output has to be generated.
+
+ @param _pViewShell
+ input parameter - instance of the view shell, on which the output
+ has to be generated.
+ */
+ void PaintMarginArea( const SwRect& _rOutputRect,
+ SwViewShell const * _pViewShell ) const;
+
+ /** paint page border and shadow
+
+ @param _rPageRect
+ input parameter - constant instance reference of the page rectangle.
+ Generally, it's the frame area of the page, but for empty pages in print
+ preview, this parameter is useful.
+
+ @param _pViewShell
+ input parameter - instance of the view shell, on which the output
+ has to be generated.
+
+ @param bPaintRightShadow
+ Should we paint shadow on the right or not (used in book mode)
+
+ @param bFullBottomShadow
+ Should we have a bottom shadow of the same size as the pages or
+ not (for right pages in book mode in a LTR environment).
+
+ @param bRightSidebar
+ Is the note sidebar on the right or not (used to adjust the
+ shadow with & position).
+ */
+ static void PaintBorderAndShadow( const SwRect& _rPageRect,
+ const SwViewShell* _pViewShell,
+ bool bPaintLeftShadow,
+ bool bPaintRightShadow,
+ bool bRightSidebar );
+
+ /** get bound rectangle of border and shadow for repaints
+
+ @param _rPageRect
+ input parameter - constant instance reference of the page rectangle.
+ Generally, it's the frame area of the page, but for empty pages in print
+ preview, this parameter is useful.
+
+ @param _pViewShell
+ input parameter - instance of the view shell, for which the rectangle
+ has to be generated.
+
+ @param _orBorderAndShadowBoundRect
+ output parameter - instance reference of the bounded border and shadow
+ rectangle for the given page rectangle
+ */
+ static void GetBorderAndShadowBoundRect( const SwRect& _rPageRect,
+ const SwViewShell* _pViewShell,
+ OutputDevice const * pRenderContext,
+ SwRect& _orBorderAndShadowBoundRect,
+ const bool bLeftShadow,
+ const bool bRightShadow,
+ const bool bRightSidebar
+ );
+
+ static void PaintNotesSidebar(const SwRect& _rPageRect, SwViewShell* _pViewShell, sal_uInt16 nPageNum, bool bRight);
+ static void PaintNotesSidebarArrows(const Point &rMiddleFirst, const Point &rMiddleSecond, SwViewShell const * _pViewShell, const Color& rColorUp, const Color& rColorDown);
+ /**
+ asks the page on which side a margin should be shown, e.g for notes
+ returns true for left side, false for right side
+ */
+ sw::sidebarwindows::SidebarPosition SidebarPosition() const;
+
+ virtual bool FillSelection( SwSelectionList& rList, const SwRect& rRect ) const override;
+
+ SwRect PrtWithoutHeaderAndFooter() const;
+
+ // in case this is an empty page, this function returns the 'reference' page
+ const SwPageFrame& GetFormatPage() const;
+
+ /// If in header or footer area, it also indicates the exact area in rControl.
+ /// Header or footer must be active, otherwise returns false.
+ bool IsOverHeaderFooterArea( const Point& rPt, FrameControlType &rControl ) const;
+
+ // return font used to paint the "empty page" string
+ static const vcl::Font& GetEmptyPageFont();
+
+ static SwTwips GetSidebarBorderWidth( const SwViewShell* );
+
+ /// Is bottom-of-page-frame - bottom-of-text-frame difference valid in case whitespace is hidden?
+ /// If false is returned, then the caller should handle negative difference as (at least) zero difference instead.
+ bool CheckPageHeightValidForHideWhitespace(SwTwips nDiff);
+
+ const SwHeaderFrame* GetHeaderFrame() const;
+ const SwFooterFrame* GetFooterFrame() const;
+
+ void UpdateVirtPageNumInfo(sw::VirtPageNumHint& rHint, const SwFrame* pFrame) const;
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+};
+
+inline SwContentFrame *SwPageFrame::FindFirstBodyContent()
+{
+ SwLayoutFrame *pBody = FindBodyCont();
+ return pBody ? pBody->ContainsContent() : nullptr;
+}
+inline const SwContentFrame *SwPageFrame::FindFirstBodyContent() const
+{
+ const SwLayoutFrame *pBody = FindBodyCont();
+ return pBody ? pBody->ContainsContent() : nullptr;
+}
+inline const SwContentFrame *SwPageFrame::FindLastBodyContent() const
+{
+ return const_cast<SwPageFrame*>(this)->FindLastBodyContent();
+}
+inline void SwPageFrame::InvalidateFlyLayout() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidFlyLayout = true;
+}
+inline void SwPageFrame::InvalidateFlyContent() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidFlyContent = true;
+}
+inline void SwPageFrame::InvalidateFlyInCnt() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidFlyInCnt = true;
+}
+inline void SwPageFrame::InvalidateLayout() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidLayout = true;
+}
+inline void SwPageFrame::InvalidateContent() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidContent = true;
+}
+inline void SwPageFrame::InvalidateSpelling() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidSpelling = true;
+}
+
+inline void SwPageFrame::InvalidateSmartTags() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidSmartTags = true;
+}
+inline void SwPageFrame::InvalidateAutoCompleteWords() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidAutoCmplWrds = true;
+}
+inline void SwPageFrame::InvalidateWordCount() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidWordCount = true;
+}
+inline void SwPageFrame::ValidateFlyLayout() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidFlyLayout = false;
+}
+inline void SwPageFrame::ValidateFlyContent() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidFlyContent = false;
+}
+inline void SwPageFrame::ValidateFlyInCnt() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidFlyInCnt = false;
+}
+inline void SwPageFrame::ValidateLayout() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidLayout = false;
+}
+inline void SwPageFrame::ValidateContent() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidContent = false;
+}
+inline void SwPageFrame::ValidateSpelling() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidSpelling = false;
+}
+
+inline void SwPageFrame::ValidateSmartTags() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidSmartTags = false;
+}
+inline void SwPageFrame::ValidateAutoCompleteWords() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidAutoCmplWrds = false;
+}
+inline void SwPageFrame::ValidateWordCount() const
+{
+ const_cast<SwPageFrame*>(this)->m_bInvalidWordCount = false;
+}
+
+inline bool SwPageFrame::IsInvalid() const
+{
+ return (m_bInvalidContent || m_bInvalidLayout || m_bInvalidFlyInCnt);
+}
+inline bool SwPageFrame::IsInvalidFly() const
+{
+ return m_bInvalidFlyLayout || m_bInvalidFlyContent;
+}
+
+
+class SwTextGridItem;
+
+SwTextGridItem const* GetGridItem(SwPageFrame const*const);
+
+sal_uInt16 GetGridWidth(SwTextGridItem const&, SwDoc const&);
+
+namespace sw { bool IsPageFrameEmpty(SwPageFrame const& rPage); }
+
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_PAGEFRM_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/paintfrm.hxx b/sw/source/core/inc/paintfrm.hxx
new file mode 100644
index 0000000000..dca4a3871b
--- /dev/null
+++ b/sw/source/core/inc/paintfrm.hxx
@@ -0,0 +1,37 @@
+/* -*- 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_PAINTFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_PAINTFRM_HXX
+
+#include <tools/color.hxx>
+
+extern Color aGlobalRetoucheColor;
+
+class OutputDevice;
+namespace vcl
+{
+typedef OutputDevice RenderContext;
+};
+
+void SwCalcPixStatics(vcl::RenderContext const* pOut);
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_PAINTFRM_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/pamtyp.hxx b/sw/source/core/inc/pamtyp.hxx
new file mode 100644
index 0000000000..d8c1110dea
--- /dev/null
+++ b/sw/source/core/inc/pamtyp.hxx
@@ -0,0 +1,122 @@
+/* -*- 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_PAMTYP_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_PAMTYP_HXX
+
+#include <unotools/textsearch.hxx>
+
+#include <memory>
+#include <optional>
+
+class SwpHints;
+struct SwPosition;
+class SwPaM;
+class SwTextAttr;
+class SwFormat;
+class SfxPoolItem;
+class SwRootFrame;
+class SwNode;
+class SwNodeIndex;
+class SwContentNode;
+class SwContentIndex;
+class SvxSearchItem;
+enum class SwCursorSkipMode;
+
+namespace i18nutil {
+ struct SearchOptions2;
+}
+
+// function prototypes for the move/find methods of SwPaM
+
+void GoStartDoc( SwPosition*);
+void GoEndDoc( SwPosition*);
+void GoStartSection( SwPosition*);
+void GoEndSection( SwPosition*);
+void GoStartOfSection( SwPosition*);
+void GoEndOfSection( SwPosition*);
+const SwTextAttr* GetFrwrdTextHint( const SwpHints&, size_t&, sal_Int32 );
+const SwTextAttr* GetBkwrdTextHint( const SwpHints&, size_t&, sal_Int32 );
+
+bool GoNext(SwNode* pNd, SwContentIndex * pIdx, SwCursorSkipMode nMode );
+bool GoPrevious(SwNode* pNd, SwContentIndex * pIdx, SwCursorSkipMode nMode );
+SwContentNode* GoNextNds( SwNodeIndex * pIdx, bool );
+SwContentNode* GoPreviousNds( SwNodeIndex * pIdx, bool );
+SwContentNode* GoNextPos( SwPosition * pIdx, bool );
+SwContentNode* GoPreviousPos( SwPosition * pIdx, bool );
+
+// type definitions of functions
+typedef bool (*GoNd)( SwNode*, SwContentIndex*, SwCursorSkipMode );
+typedef SwContentNode* (*GoNds)( SwNodeIndex*, bool );
+typedef SwContentNode* (*GoPos)( SwPosition*, bool );
+typedef void (*GoDoc)( SwPosition* );
+typedef void (*GoSection)( SwPosition* );
+typedef bool (SwPosition::*CmpOp)( const SwPosition& ) const;
+typedef const SwTextAttr* (*GetHint)( const SwpHints&, size_t&, sal_Int32 );
+typedef bool (utl::TextSearch::*SearchText)( const OUString&, sal_Int32*,
+ sal_Int32*, css::util::SearchResult* );
+typedef void (*MvSection)( SwPosition * );
+
+struct SwMoveFnCollection
+{
+ GoNd fnNd;
+ GoNds fnNds;
+ GoPos fnPos;
+ GoDoc fnDoc;
+ GoSection fnSections;
+ CmpOp fnCmpOp;
+ GetHint fnGetHint;
+ SearchText fnSearch;
+ MvSection fnSection;
+};
+
+// function prototype for searching
+SwContentNode* GetNode(SwPaM&, bool&, SwMoveFnCollection const &,
+ bool bInReadOnly = false, SwRootFrame const* pLayout = nullptr);
+
+namespace sw {
+
+ void MakeRegion(SwMoveFnCollection const & fnMove,
+ const SwPaM & rOrigRg, std::optional<SwPaM>& rDestinaton);
+
+ /// Search.
+ bool FindTextImpl(SwPaM & rSearchPam,
+ const i18nutil::SearchOptions2& rSearchOpt,
+ bool bSearchInNotes,
+ utl::TextSearch& rSText,
+ SwMoveFnCollection const & fnMove,
+ const SwPaM & rRegion, bool bInReadOnly,
+ SwRootFrame const* pLayout,
+ std::unique_ptr<SvxSearchItem>& xSearchItem);
+ bool FindFormatImpl(SwPaM & rSearchPam,
+ const SwFormat& rFormat,
+ SwMoveFnCollection const & fnMove,
+ const SwPaM & rRegion, bool bInReadOnly,
+ SwRootFrame const* pLayout);
+ bool FindAttrImpl(SwPaM & rSearchPam,
+ const SfxPoolItem& rAttr,
+ SwMoveFnCollection const & fnMove,
+ const SwPaM & rPam, bool bInReadOnly,
+ SwRootFrame const* pLayout);
+
+} // namespace sw
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/prevwpage.hxx b/sw/source/core/inc/prevwpage.hxx
new file mode 100644
index 0000000000..d9c8d1df0f
--- /dev/null
+++ b/sw/source/core/inc/prevwpage.hxx
@@ -0,0 +1,53 @@
+/* -*- 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_PREVWPAGE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_PREVWPAGE_HXX
+
+// classes <Point>, <Size> and <Rectangle>
+#include <tools/gen.hxx>
+
+class SwPageFrame;
+
+/** data structure for a preview page in the current preview layout
+*/
+struct PreviewPage
+{
+ const SwPageFrame* pPage;
+ bool bVisible;
+ Size aPageSize;
+ Point aPreviewWinPos;
+ Point aLogicPos;
+ Point aMapOffset;
+
+ inline PreviewPage();
+};
+
+inline PreviewPage::PreviewPage()
+ : pPage( nullptr ),
+ bVisible( false ),
+ aPageSize( Size(0,0) ),
+ aPreviewWinPos( Point(0,0) ),
+ aLogicPos( Point(0,0) ),
+ aMapOffset( Point(0,0) )
+{};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/ptqueue.hxx b/sw/source/core/inc/ptqueue.hxx
new file mode 100644
index 0000000000..a5e40f2e3f
--- /dev/null
+++ b/sw/source/core/inc/ptqueue.hxx
@@ -0,0 +1,57 @@
+/* -*- 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_PTQUEUE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_PTQUEUE_HXX
+
+/**
+ * Unfortunately we have some problems with processing more than one Paint()
+ * at a time. This happens especially often during printing.
+ *
+ * SwRootFrame::PaintSwFrame() determines that it's called a second time and adds the
+ * rectangle and the corresponding Shell to the PaintCollector.
+ * The call sites that are causing the double Paint() only need to process the
+ * collected Paint()s at the right point in time.
+ * Doing this during printing (after having printed one page) is very suitable
+ * for doing that.
+ *
+ * Invalidating windows directly from the RootFrame::PaintSwFrame was not a successful
+ * approach, because the Paint()s arrive at a very unfavourable point in time.
+ * Triggering an update for all windows after printing each page does not seem
+ * appropriate either: on the one hand we don't have direct access to the edit
+ * windows and on the other hand the updates can become very costly on some
+ * platforms.
+ */
+
+class SwQueuedPaint;
+class SwViewShell;
+class SwRect;
+
+class SwPaintQueue
+{
+public:
+ static SwQueuedPaint* s_pPaintQueue;
+
+ static void Add(SwViewShell* pSh, const SwRect& rNew);
+ static void Remove(SwViewShell const* pSh);
+ static void Repaint();
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/retrievedinputstreamdata.hxx b/sw/source/core/inc/retrievedinputstreamdata.hxx
new file mode 100644
index 0000000000..ddb2c564a1
--- /dev/null
+++ b/sw/source/core/inc/retrievedinputstreamdata.hxx
@@ -0,0 +1,90 @@
+/* -*- 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_RETRIEVEDINPUTSTREAMDATA_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_RETRIEVEDINPUTSTREAMDATA_HXX
+
+#include <tools/link.hxx>
+#include <sal/types.h>
+#include <mutex>
+#include <com/sun/star/uno/Reference.hxx>
+
+#include <map>
+#include <memory>
+#include <utility>
+
+namespace com::sun::star::io { class XInputStream; }
+
+class SwAsyncRetrieveInputStreamThreadConsumer;
+
+/** Singleton class to manage retrieved input stream data in Writer
+
+ OD 2007-01-29 #i73788#
+ The instance of this class provides data container for retrieved input
+ stream data. The data container is accessed via a key, which the data
+ manager provides on creation of the data container.
+ When a certain data container is filled with data, an user event is submitted
+ to trigger the processing of with data.
+*/
+class SwRetrievedInputStreamDataManager
+{
+ public:
+
+ typedef sal_uInt64 tDataKey;
+
+ struct tData
+ {
+ std::weak_ptr< SwAsyncRetrieveInputStreamThreadConsumer > mpThreadConsumer;
+ css::uno::Reference<css::io::XInputStream> mxInputStream;
+ bool mbIsStreamReadOnly;
+
+ tData()
+ : mpThreadConsumer(),
+ mbIsStreamReadOnly( false )
+ {};
+
+ tData( std::weak_ptr< SwAsyncRetrieveInputStreamThreadConsumer > pThreadConsumer )
+ : mpThreadConsumer(std::move( pThreadConsumer )),
+ mbIsStreamReadOnly( false )
+ {};
+ };
+
+ static SwRetrievedInputStreamDataManager& GetManager();
+
+ tDataKey ReserveData( std::weak_ptr< SwAsyncRetrieveInputStreamThreadConsumer > const & pThreadConsumer );
+
+ void PushData( const tDataKey nDataKey,
+ css::uno::Reference<css::io::XInputStream> const & xInputStream,
+ const bool bIsStreamReadOnly );
+
+ bool PopData( const tDataKey nDataKey,
+ tData& rData );
+
+ DECL_STATIC_LINK( SwRetrievedInputStreamDataManager, LinkedInputStreamReady, void*, void );
+
+ private:
+
+ static tDataKey snNextKeyValue;
+
+ std::mutex maMutex;
+
+ std::map< tDataKey, tData > maInputStreamData;
+};
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/retrieveinputstream.hxx b/sw/source/core/inc/retrieveinputstream.hxx
new file mode 100644
index 0000000000..b030ed0fc5
--- /dev/null
+++ b/sw/source/core/inc/retrieveinputstream.hxx
@@ -0,0 +1,55 @@
+/* -*- 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_RETRIEVEINPUTSTREAM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_RETRIEVEINPUTSTREAM_HXX
+
+#include "observablethread.hxx"
+#include <rtl/ref.hxx>
+#include <rtl/ustring.hxx>
+#include "retrievedinputstreamdata.hxx"
+
+/** class for a thread to retrieve an input stream given by a URL
+
+ OD 2007-01-29 #i73788#
+*/
+class SwAsyncRetrieveInputStreamThread final : public ObservableThread
+{
+ public:
+
+ static ::rtl::Reference< ObservableThread > createThread(
+ const SwRetrievedInputStreamDataManager::tDataKey nDataKey,
+ const OUString& rLinkedURL, const OUString& rReferer );
+
+ virtual ~SwAsyncRetrieveInputStreamThread() override;
+
+ private:
+
+ virtual void threadFunction() override;
+
+ SwAsyncRetrieveInputStreamThread( const SwRetrievedInputStreamDataManager::tDataKey nDataKey,
+ OUString aLinkedURL,
+ OUString aReferer );
+
+ const SwRetrievedInputStreamDataManager::tDataKey mnDataKey;
+ const OUString mrLinkedURL;
+ const OUString mrReferer;
+};
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/retrieveinputstreamconsumer.hxx b/sw/source/core/inc/retrieveinputstreamconsumer.hxx
new file mode 100644
index 0000000000..ba6424e9a1
--- /dev/null
+++ b/sw/source/core/inc/retrieveinputstreamconsumer.hxx
@@ -0,0 +1,59 @@
+/* -*- 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_RETRIEVEINPUTSTREAMCONSUMER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_RETRIEVEINPUTSTREAMCONSUMER_HXX
+
+#include <osl/interlck.h>
+#include <rtl/ustring.hxx>
+
+namespace com::sun::star::io { class XInputStream; }
+namespace com::sun::star::uno { template <typename > class Reference; }
+
+class SwGrfNode;
+
+/** class to provide creation of a thread to retrieve an input stream given by
+ a URL and to consume the retrieved input stream.
+
+ #i73788#
+*/
+class SwAsyncRetrieveInputStreamThreadConsumer
+{
+ public:
+
+ SwAsyncRetrieveInputStreamThreadConsumer( SwGrfNode& rGrfNode );
+ ~SwAsyncRetrieveInputStreamThreadConsumer() COVERITY_NOEXCEPT_FALSE;
+
+ /** method to create thread
+ */
+ void CreateThread( const OUString& rURL, const OUString& rReferer );
+
+ /** method called to provide the retrieved input stream to the thread Consumer
+ */
+ void ApplyInputStream(
+ css::uno::Reference<css::io::XInputStream> const & xInputStream,
+ const bool bIsStreamReadOnly );
+
+ private:
+
+ SwGrfNode& mrGrfNode;
+ oslInterlockedCount mnThreadID;
+};
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/rolbck.hxx b/sw/source/core/inc/rolbck.hxx
new file mode 100644
index 0000000000..9d74a6a9e6
--- /dev/null
+++ b/sw/source/core/inc/rolbck.hxx
@@ -0,0 +1,443 @@
+/* -*- 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_ROLBCK_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_ROLBCK_HXX
+
+#include <o3tl/deleter.hxx>
+#include <o3tl/sorted_vector.hxx>
+#include <svl/itemset.hxx>
+#include <vcl/keycod.hxx>
+#include <tox.hxx>
+
+#include <IDocumentMarkAccess.hxx>
+
+#include <memory>
+#include <vector>
+
+namespace sfx2 {
+ class MetadatableUndo;
+}
+namespace sw {
+ class SpzFrameFormat;
+}
+
+class SwDoc;
+class SwFormatColl;
+class SwTextAttr;
+class SfxPoolItem;
+class SwUndoSaveSection;
+class SwTextFootnote;
+class SwUndoDelLayFormat;
+class SwFlyFrameFormat;
+class SwFormatField;
+class SwTextField;
+class SwFieldType;
+class SwTextTOXMark;
+class SwTextRefMark;
+class SwFrameFormat;
+class SwpHints;
+class SwFormatChain;
+class SwNode;
+class SwCharFormat;
+enum class SwFieldIds : sal_uInt16;
+typedef struct _xmlTextWriter* xmlTextWriterPtr;
+
+enum HISTORY_HINT {
+ HSTRY_SETFMTHNT,
+ HSTRY_RESETFMTHNT,
+ HSTRY_SETTXTHNT,
+ HSTRY_SETTXTFLDHNT,
+ HSTRY_SETREFMARKHNT,
+ HSTRY_SETTOXMARKHNT,
+ HSTRY_RESETTXTHNT,
+ HSTRY_SETFTNHNT,
+ HSTRY_CHGFMTCOLL,
+ HSTRY_FLYCNT,
+ HSTRY_BOOKMARK,
+ HSTRY_SETATTRSET,
+ HSTRY_CHGFLYANCHOR,
+ HSTRY_CHGFLYCHAIN,
+ HSTRY_CHGCHARFMT,
+ HSTRY_NOTEXTFIELDMARK,
+ HSTRY_TEXTFIELDMARK,
+};
+
+class SwHistoryHint
+{
+ const HISTORY_HINT m_eWhichId;
+
+public:
+ SwHistoryHint( HISTORY_HINT eWhich ) : m_eWhichId( eWhich ) {}
+ virtual ~SwHistoryHint() {}
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) = 0;
+ HISTORY_HINT Which() const { return m_eWhichId; }
+ virtual OUString GetDescription() const;
+ virtual void dumpAsXml(xmlTextWriterPtr pWriter) const;
+};
+
+class SwHistorySetFormat final : public SwHistoryHint
+{
+ std::unique_ptr<SfxPoolItem> m_pAttr;
+ const SwNodeOffset m_nNodeIndex;
+
+public:
+ SwHistorySetFormat( const SfxPoolItem* pFormatHt, SwNodeOffset nNode );
+ virtual ~SwHistorySetFormat() override;
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+ virtual OUString GetDescription() const override;
+
+ void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+};
+
+class SwHistoryResetFormat final : public SwHistoryHint
+{
+ const SwNodeOffset m_nNodeIndex;
+ const sal_uInt16 m_nWhich;
+
+public:
+ SwHistoryResetFormat( const SfxPoolItem* pFormatHt, SwNodeOffset nNodeIdx );
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+
+};
+
+class SwHistorySetText final : public SwHistoryHint
+{
+ std::unique_ptr<SfxPoolItem> m_pAttr;
+ const SwNodeOffset m_nNodeIndex;
+ const sal_Int32 m_nStart;
+ const sal_Int32 m_nEnd;
+ bool m_bFormatIgnoreStart : 1;
+ bool m_bFormatIgnoreEnd : 1;
+
+public:
+ SwHistorySetText( SwTextAttr* pTextHt, SwNodeOffset nNode );
+ virtual ~SwHistorySetText() override;
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+
+};
+
+class SwHistorySetTextField final : public SwHistoryHint
+{
+ //!! beware of the order for the declaration of the unique_ptrs.
+ //!! If they get destroyed in the wrong order sw may crash (namely mail-merge as well)
+ std::unique_ptr<SwFieldType> m_pFieldType;
+ const std::unique_ptr<SwFormatField> m_pField;
+
+ SwNodeOffset m_nNodeIndex;
+ sal_Int32 m_nPos;
+ SwFieldIds m_nFieldWhich;
+
+public:
+ SwHistorySetTextField( const SwTextField* pTextField, SwNodeOffset nNode );
+ virtual ~SwHistorySetTextField() override;
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+
+ virtual OUString GetDescription() const override;
+
+};
+
+class SwHistorySetRefMark final : public SwHistoryHint
+{
+ const OUString m_RefName;
+ const SwNodeOffset m_nNodeIndex;
+ const sal_Int32 m_nStart;
+ const sal_Int32 m_nEnd;
+
+public:
+ SwHistorySetRefMark( const SwTextRefMark* pTextHt, SwNodeOffset nNode );
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+ const OUString& GetRefName() {return m_RefName;}
+};
+
+class SwHistorySetTOXMark final : public SwHistoryHint
+{
+ SwTOXMark m_TOXMark;
+ const OUString m_TOXName;
+ const TOXTypes m_eTOXTypes;
+ const SwNodeOffset m_nNodeIndex;
+ const sal_Int32 m_nStart;
+ const sal_Int32 m_nEnd;
+
+public:
+ SwHistorySetTOXMark( const SwTextTOXMark* pTextHt, SwNodeOffset nNode );
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+ bool IsEqual( const SwTOXMark& rCmp ) const;
+
+ static SwTOXType* GetSwTOXType(SwDoc& rDoc, TOXTypes eTOXTypes, const OUString& rTOXName);
+};
+
+class SwHistoryResetText final : public SwHistoryHint
+{
+ const SwNodeOffset m_nNodeIndex;
+ const sal_Int32 m_nStart;
+ const sal_Int32 m_nEnd;
+ const sal_uInt16 m_nAttr;
+
+public:
+ SwHistoryResetText( sal_uInt16 nWhich, sal_Int32 nStt, sal_Int32 nEnd,
+ SwNodeOffset nNode );
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+
+ sal_uInt16 GetWhich() const { return m_nAttr; }
+ SwNodeOffset GetNode() const { return m_nNodeIndex; }
+ sal_Int32 GetContent() const { return m_nStart; }
+
+};
+
+class SwHistorySetFootnote final : public SwHistoryHint
+{
+ const std::unique_ptr<SwUndoSaveSection, o3tl::default_delete<SwUndoSaveSection>> m_pUndo;
+ const OUString m_FootnoteNumber;
+ SwNodeOffset m_nNodeIndex;
+ const sal_Int32 m_nStart;
+ const bool m_bEndNote;
+
+public:
+ SwHistorySetFootnote( SwTextFootnote* pTextFootnote, SwNodeOffset nNode );
+ SwHistorySetFootnote( const SwTextFootnote& );
+ virtual ~SwHistorySetFootnote() override;
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+
+ virtual OUString GetDescription() const override;
+
+};
+
+class SwHistoryChangeFormatColl final : public SwHistoryHint
+{
+ SwFormatColl * const m_pColl;
+ const SwNodeOffset m_nNodeIndex;
+ const SwNodeType m_nNodeType;
+
+public:
+ SwHistoryChangeFormatColl( SwFormatColl* pColl, SwNodeOffset nNode, SwNodeType nNodeWhich );
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+
+};
+
+class SwHistoryTextFlyCnt final : public SwHistoryHint
+{
+ std::unique_ptr<SwUndoDelLayFormat> m_pUndo;
+
+public:
+ SwHistoryTextFlyCnt( SwFrameFormat* const pFlyFormat );
+ virtual ~SwHistoryTextFlyCnt() override;
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+ SwUndoDelLayFormat* GetUDelLFormat() { return m_pUndo.get(); }
+
+ void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+};
+
+class SwHistoryBookmark final : public SwHistoryHint
+{
+ public:
+ SwHistoryBookmark(const ::sw::mark::IMark& rBkmk,
+ bool bSavePos, bool bSaveOtherPos);
+ virtual void SetInDoc(SwDoc * pDoc, bool) override;
+
+ bool IsEqualBookmark(const ::sw::mark::IMark& rBkmk);
+ const OUString& GetName() const { return m_aName;}
+
+ private:
+ const OUString m_aName;
+ OUString m_aShortName;
+ bool m_bHidden;
+ OUString m_aHideCondition;
+ vcl::KeyCode m_aKeycode;
+ const SwNodeOffset m_nNode;
+ const SwNodeOffset m_nOtherNode;
+ const sal_Int32 m_nContent;
+ const sal_Int32 m_nOtherContent;
+ const bool m_bSavePos;
+ const bool m_bSaveOtherPos;
+ const bool m_bHadOtherPos;
+ const IDocumentMarkAccess::MarkType m_eBkmkType;
+ std::shared_ptr< ::sfx2::MetadatableUndo > m_pMetadataUndo;
+};
+
+/// History object containing all information used during undo / redo
+/// of checkbox and drop-down form field insertion.
+class SwHistoryNoTextFieldmark final : public SwHistoryHint
+{
+ public:
+ SwHistoryNoTextFieldmark(const ::sw::mark::IFieldmark& rFieldMark);
+ virtual void SetInDoc(SwDoc* pDoc, bool) override;
+ void ResetInDoc(SwDoc& rDoc);
+
+ private:
+ const OUString m_sType;
+ const SwNodeOffset m_nNode;
+ const sal_Int32 m_nContent;
+};
+
+/// History object containing all information used during undo / redo
+/// of text form field insertion.
+class SwHistoryTextFieldmark final : public SwHistoryHint
+{
+ public:
+ SwHistoryTextFieldmark(const ::sw::mark::IFieldmark& rFieldMark);
+ virtual void SetInDoc(SwDoc* pDoc, bool) override;
+ void ResetInDoc(SwDoc& rDoc);
+
+ private:
+ const OUString m_sName;
+ const OUString m_sType;
+ const SwNodeOffset m_nStartNode;
+ const sal_Int32 m_nStartContent;
+ const SwNodeOffset m_nEndNode;
+ const sal_Int32 m_nEndContent;
+ /*const*/ SwNodeOffset m_nSepNode;
+ /*const*/ sal_Int32 m_nSepContent;
+};
+
+class SwHistorySetAttrSet final : public SwHistoryHint
+{
+ SfxItemSet m_OldSet;
+ std::vector<sal_uInt16> m_ResetArray;
+ const SwNodeOffset m_nNodeIndex;
+
+public:
+ SwHistorySetAttrSet( const SfxItemSet& rSet, SwNodeOffset nNode,
+ const o3tl::sorted_vector<sal_uInt16> &rSetArr );
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+
+};
+
+class SwHistoryChangeFlyAnchor final : public SwHistoryHint
+{
+ sw::SpzFrameFormat& m_rFormat; // despite the name, this is not only used for flys, but also for draw formats(!)
+ const SwNodeOffset m_nOldNodeIndex;
+ const sal_Int32 m_nOldContentIndex;
+
+public:
+ SwHistoryChangeFlyAnchor(sw::SpzFrameFormat& rFormat);
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+};
+
+class SwHistoryChangeFlyChain final : public SwHistoryHint
+{
+ SwFlyFrameFormat * const m_pPrevFormat;
+ SwFlyFrameFormat * const m_pNextFormat;
+ SwFlyFrameFormat * const m_pFlyFormat;
+
+public:
+ SwHistoryChangeFlyChain( SwFlyFrameFormat& rFormat, const SwFormatChain& rAttr );
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+};
+
+class SwHistoryChangeCharFormat final : public SwHistoryHint
+{
+ const SfxItemSet m_OldSet;
+ const OUString m_Format;
+
+public:
+ SwHistoryChangeCharFormat( SfxItemSet aSet, OUString sFormat);
+ virtual void SetInDoc( SwDoc* pDoc, bool bTmpSet ) override;
+
+};
+
+class SwHistory
+{
+ friend class SwDoc; // actually only SwDoc::DelUndoObj may access
+ friend class SwRegHistory; // for inserting History attributes
+
+ std::vector<std::unique_ptr<SwHistoryHint>> m_SwpHstry;
+ sal_uInt16 m_nEndDiff;
+
+public:
+ SwHistory();
+ ~SwHistory();
+
+ // call and delete all objects between nStart and array end
+ bool Rollback( SwDoc* pDoc, sal_uInt16 nStart = 0 );
+ // call all objects between nStart and TmpEnd; store nStart as TmpEnd
+ bool TmpRollback( SwDoc* pDoc, sal_uInt16 nStart, bool ToFirst = true );
+
+ void AddPoolItem(const SfxPoolItem* pOldValue, const SfxPoolItem* pNewValue,
+ SwNodeOffset nNodeIdx );
+ void AddTextAttr(SwTextAttr* pTextHt, SwNodeOffset nNodeIdx, bool bNewAttr);
+ void AddColl(SwFormatColl*, SwNodeOffset nNodeIdx, SwNodeType nWhichNd);
+ void AddIMark(const ::sw::mark::IMark&, bool bSavePos, bool bSaveOtherPos);
+ void AddChangeFlyAnchor(sw::SpzFrameFormat& rFormat);
+ void AddDeleteFly( SwFrameFormat&, sal_uInt16& rSetPos );
+ void AddFootnote( const SwTextFootnote& );
+ void AddCharFormat(const SfxItemSet & rSet, const SwCharFormat & rCharFormat);
+
+ sal_uInt16 Count() const { return m_SwpHstry.size(); }
+ sal_uInt16 GetTmpEnd() const { return m_SwpHstry.size() - m_nEndDiff; }
+ sal_uInt16 SetTmpEnd( sal_uInt16 nTmpEnd ); // return previous value
+ SwHistoryHint * operator[]( sal_uInt16 nPos ) { return m_SwpHstry[nPos].get(); }
+ SwHistoryHint const* operator[]( sal_uInt16 nPos ) const
+ { return m_SwpHstry[nPos].get(); }
+
+ // for SwUndoDelete::Undo/Redo
+ void Move( sal_uInt16 nPos, SwHistory *pIns,
+ sal_uInt16 const nStart = 0)
+ {
+ auto itSourceBegin = pIns->m_SwpHstry.begin() + nStart;
+ auto itSourceEnd = pIns->m_SwpHstry.end();
+ if (itSourceBegin == itSourceEnd)
+ return;
+ m_SwpHstry.insert(m_SwpHstry.begin() + nPos, std::make_move_iterator(itSourceBegin), std::make_move_iterator(itSourceEnd));
+ pIns->m_SwpHstry.erase( itSourceBegin, itSourceEnd );
+ }
+
+ // helper methods for recording attribute in History
+ // used by Undo classes (Delete/Overwrite/Inserts)
+ void CopyAttr(
+ SwpHints const * pHts,
+ const SwNodeOffset nNodeIdx,
+ const sal_Int32 nStart,
+ const sal_Int32 nEnd,
+ const bool bCopyFields );
+
+ void CopyFormatAttr( const SfxItemSet& rSet, SwNodeOffset nNodeIdx );
+
+ void dumpAsXml(xmlTextWriterPtr pWriter) const;
+};
+
+class SwRegHistory final: public SwClient
+{
+private:
+ o3tl::sorted_vector<sal_uInt16> m_WhichIdSet;
+ SwHistory * const m_pHistory;
+ SwNodeOffset m_nNodeIndex;
+
+ void MakeSetWhichIds();
+
+public:
+ SwRegHistory( SwHistory* pHst );
+ SwRegHistory( const SwNode& rNd, SwHistory* pHst );
+ SwRegHistory( sw::BroadcastingModify* pRegIn, const SwNode& rNd, SwHistory* pHst );
+ virtual void SwClientNotify(const SwModify&, const SfxHint& rHint) override;
+
+ /// @return true if at least 1 item was inserted
+ bool InsertItems( const SfxItemSet& rSet,
+ sal_Int32 const nStart, sal_Int32 const nEnd,
+ SetAttrMode const nFlags,
+ SwTextAttr **ppNewTextAttr );
+
+ void AddHint( SwTextAttr* pHt, const bool bNew );
+
+ void RegisterInModify( sw::BroadcastingModify* pRegIn, const SwNode& rNd );
+ void ChangeNodeIndex( SwNodeOffset nNew ) { m_nNodeIndex = nNew; }
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_ROLBCK_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/rootfrm.hxx b/sw/source/core/inc/rootfrm.hxx
new file mode 100644
index 0000000000..90d18fcf0e
--- /dev/null
+++ b/sw/source/core/inc/rootfrm.hxx
@@ -0,0 +1,489 @@
+/* -*- 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_ROOTFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_ROOTFRM_HXX
+
+#include "layfrm.hxx"
+#include <swregion.hxx>
+#include <viewsh.hxx>
+#include <doc.hxx>
+#include <IDocumentTimerAccess.hxx>
+#include <o3tl/typed_flags_set.hxx>
+#include <set>
+#include <vector>
+
+class SwContentFrame;
+class SdrPage;
+class SwFrameFormat;
+class SwPaM;
+class SwCursor;
+class SwShellCursor;
+class SwTableCursor;
+class SwLayVout;
+class SwViewOption;
+class SwSelectionList;
+struct SwPosition;
+struct SwCursorMoveState;
+
+namespace sw {
+ enum class RedlineMode
+ {
+ Shown, Hidden
+ };
+
+ enum class FieldmarkMode { ShowCommand = 1, ShowResult = 2, ShowBoth = 3 };
+ enum class ParagraphBreakMode { Shown, Hidden };
+};
+
+enum class SwInvalidateFlags
+{
+ Size = 0x01,
+ PrtArea = 0x02,
+ Pos = 0x04,
+ Table = 0x08,
+ Section = 0x10,
+ LineNum = 0x20,
+ Direction = 0x40,
+};
+
+namespace o3tl
+{
+ template<> struct typed_flags<SwInvalidateFlags> : is_typed_flags<SwInvalidateFlags, 0x7f> {};
+};
+
+enum class SwRemoveResult
+{
+ Next,
+ Prev
+};
+
+using SwCurrShells = std::set<CurrShell*>;
+
+class SwSectionFrame;
+using SwDestroyList = o3tl::sorted_vector<SwSectionFrame*>;
+class SwFlyFrame;
+using SwFlyDestroyList = o3tl::sorted_vector<SwFlyFrame*>;
+
+/// The root element of a Writer document layout. Lower frames are expected to
+/// be SwPageFrame instances.
+class SW_DLLPUBLIC SwRootFrame final : public SwLayoutFrame
+{
+ // Needs to disable the Superfluous temporarily
+ friend void AdjustSizeChgNotify( SwRootFrame *pRoot );
+
+ // Maintains the mpLastPage (Cut() and Paste() of SwPageFrame
+ friend inline void SetLastPage( SwPageFrame* );
+
+ // For creating and destroying of the virtual output device manager
+ friend void FrameInit(); // Creates s_pVout
+ friend void FrameFinit(); // Destroys s_pVout
+
+ std::vector<SwRect> maPageRects;// returns the current rectangle for each page frame
+ // the rectangle is extended to the top/bottom/left/right
+ // for pages located at the outer margins
+ SwRect maPagesArea; // the area covered by the pages
+ tools::Long mnViewWidth; // the current page layout bases on this view width
+ sal_uInt16 mnColumns; // the current page layout bases on this number of columns
+ bool mbBookMode; // the current page layout is in book view
+ bool mbSidebarChanged; // the notes sidebar state has changed
+
+ bool mbNeedGrammarCheck; // true when sth needs to be checked (not necessarily started yet!)
+
+ static SwLayVout *s_pVout;
+ static bool s_isInPaint; // Protection against double Paints
+ static bool s_isNoVirDev;// No virt. Device for SystemPaints
+ /// The last, still alive SwRootFrame instance, for debugging.
+ static SwRootFrame* s_pLast;
+
+ /// Width of the HTML / Web document if not defined otherwise: 20cm.
+ static constexpr sal_Int64 MIN_BROWSE_WIDTH = o3tl::toTwips(20000, o3tl::Length::mm100);
+
+ bool mbCheckSuperfluous :1; // Search for empty Pages?
+ bool mbIdleFormat :1; // Trigger Idle Formatter?
+ bool mbBrowseWidthValid :1; // Is mnBrowseWidth valid?
+ bool mbTurboAllowed :1;
+ bool mbAssertFlyPages :1; // Insert more Pages for Flys if needed?
+ bool mbTableUpdateInProgress : 1; // tdf#139426 to allow suppression of AssertFlyPages during TableUpdate
+ bool mbIsVirtPageNum :1; // Do we have a virtual pagenumber?
+ bool mbIsNewLayout :1; // Layout loaded or newly created
+ bool mbCallbackActionEnabled:1; // No Action in Notification desired
+ // @see dcontact.cxx, ::Changed()
+ bool mbLayoutFreezed;
+ bool mbHideRedlines;
+ sw::FieldmarkMode m_FieldmarkMode;
+ sw::ParagraphBreakMode m_ParagraphBreakMode;
+
+ /**
+ * For BrowseMode
+ * mnBrowseWidth is the outer margin of the object most to the right.
+ * The page's right edge should not be smaller than this value.
+ */
+ tools::Long mnBrowseWidth;
+
+ /// If we only have to format one ContentFrame, its in mpTurbo
+ const SwContentFrame *mpTurbo;
+
+ /// We should not need to always struggle to find the last page, so store it here
+ SwPageFrame *mpLastPage;
+
+ /** [ Comment from the original StarOffice checkin ]:
+ * The root takes care of the shell access. Via the document
+ * it should be possible to get at the root frame, and thus always
+ * have access to the shell.
+ * the pointer mpCurrShell is the pointer to any of the shells for
+ * the document.
+ * Because sometimes it matters which shell is used, it is necessary to
+ * know the active shell.
+ * this is approximated by setting the pointer mpCurrShell when a
+ * shell gets the focus (FEShell). Additionally the pointer will be
+ * set temporarily by SwCurrShell typically via CurrShell
+ * The class can be found in the SwViewShell. These object can
+ * be created nested (also for different kinds of Shells). They are
+ * collected into the Array mpCurrShells.
+ * Furthermore it can happen that a shell is activated while a curshell
+ * object is still 'active'. This one will be entered into mpWaitingCurrShell
+ * and will be activated by the last d'tor of CurrShell.
+ * One other problem is the destruction of a shell while it is active.
+ * The pointer mpCurrShell is then reset to an arbitrary other shell.
+ * If at the time of the destruction of a shell, which is still referenced
+ * by a curshell object, that will be cleaned up as well.
+ */
+ friend class CurrShell;
+ friend void SetShell( SwViewShell *pSh );
+ friend void InitCurrShells( SwRootFrame *pRoot );
+ SwViewShell *mpCurrShell;
+ SwViewShell *mpWaitingCurrShell;
+ std::unique_ptr<SwCurrShells> mpCurrShells;
+
+ /// One Page per DrawModel per Document; is always the size of the Root
+ SdrPage *mpDrawPage;
+
+ std::unique_ptr<SwDestroyList> mpDestroy;
+ std::unique_ptr<SwFlyDestroyList> mpFlyDestroy;
+
+ sal_uInt16 mnPhyPageNums; /// Page count
+ sal_uInt16 mnAccessibleShells; // Number of accessible shells
+
+ void ImplCalcBrowseWidth();
+ void ImplInvalidateBrowseWidth();
+
+ void DeleteEmptySct_(); // Destroys the registered SectionFrames
+ /// Destroys the registered FlyFrames.
+ void DeleteEmptyFlys_();
+ void RemoveFromList_( SwSectionFrame* pSct ); // Removes SectionFrames from the Delete List
+
+ virtual void DestroyImpl() override;
+ virtual ~SwRootFrame() override;
+
+ virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
+
+public:
+
+ /// Remove MasterObjects from the Page (called by the ctors)
+ static void RemoveMasterObjs( SdrPage *pPg );
+
+ void AllCheckPageDescs() const;
+ void AllInvalidateAutoCompleteWords() const;
+ void AllAddPaintRect() const;
+ void AllRemoveFootnotes() ;
+ void AllInvalidateSmartTagsOrSpelling(bool bSmartTags) const;
+
+ /// Output virtual Device (e.g. for animations)
+ static bool FlushVout();
+
+ /// Save Clipping if exactly the ClipRect is outputted
+ static bool HasSameRect( const SwRect& rRect );
+
+ SwRootFrame( SwFrameFormat*, SwViewShell* );
+ void Init(SwFrameFormat*);
+
+ SwViewShell *GetCurrShell() const { return mpCurrShell; }
+ void DeRegisterShell( SwViewShell *pSh );
+
+ /**
+ * Set up Start-/EndAction for all Shells on an as high as possible
+ * (Shell section) level.
+ * For the StarONE binding, which does not know the Shells directly.
+ * The ChangeLinkd of the CursorShell (UI notifications) is called
+ * automatically in the EndAllAction.
+ */
+ void StartAllAction();
+ void EndAllAction();
+
+ /**
+ * Certain UNO Actions (e.g. table cursor) require that all Actions are reset temporarily
+ * In order for that to work, every SwViewShell needs to remember its old Action counter
+ */
+ void UnoRemoveAllActions();
+ void UnoRestoreAllActions();
+
+ const SdrPage* GetDrawPage() const { return mpDrawPage; }
+ SdrPage* GetDrawPage() { return mpDrawPage; }
+ void SetDrawPage( SdrPage* pNew ){ mpDrawPage = pNew; }
+
+ virtual bool GetModelPositionForViewPoint( SwPosition *, Point&,
+ SwCursorMoveState* = nullptr, bool bTestBackground = false ) const override;
+
+ virtual void PaintSwFrame( vcl::RenderContext& rRenderContext, SwRect const&,
+ SwPrintData const*const pPrintData = nullptr ) const override;
+ virtual SwTwips ShrinkFrame( SwTwips, bool bTst = false, bool bInfo = false ) override;
+ virtual SwTwips GrowFrame ( SwTwips, bool bTst = false, bool bInfo = false ) override;
+#ifdef DBG_UTIL
+ virtual void Cut() override;
+ virtual void Paste( SwFrame* pParent, SwFrame* pSibling = nullptr ) override;
+#endif
+
+ virtual bool FillSelection( SwSelectionList& rList, const SwRect& rRect ) const override;
+
+ Point GetNextPrevContentPos( const Point &rPoint, bool bNext ) const;
+
+ virtual Size ChgSize( const Size& aNewSize ) override;
+
+ void SetIdleFlags()
+ {
+ mbIdleFormat = true;
+
+ SwViewShell* pCurrShell = GetCurrShell();
+ // May be NULL if called from SfxBaseModel::dispose
+ // (this happens in the build test 'rtfexport').
+ if (pCurrShell != nullptr)
+ pCurrShell->GetDoc()->getIDocumentTimerAccess().StartIdling();
+ }
+ bool IsIdleFormat() const { return mbIdleFormat; }
+ void ResetIdleFormat() { mbIdleFormat = false; }
+
+ bool IsNeedGrammarCheck() const { return mbNeedGrammarCheck; }
+ void SetNeedGrammarCheck( bool bVal )
+ {
+ mbNeedGrammarCheck = bVal;
+
+ if ( bVal )
+ {
+ SwViewShell* pCurrShell = GetCurrShell();
+ // May be NULL if called from SfxBaseModel::dispose
+ // (this happens in the build test 'rtfexport').
+ if (pCurrShell != nullptr)
+ pCurrShell->GetDoc()->getIDocumentTimerAccess().StartIdling();
+ }
+ }
+
+ /// Makes sure that all requested page-bound Flys find a Page
+ void SetAssertFlyPages() { mbAssertFlyPages = true; }
+ void AssertFlyPages();
+ bool IsAssertFlyPages() const { return mbAssertFlyPages; }
+
+ void SetTableUpdateInProgress(bool bValue) { mbTableUpdateInProgress = bValue; }
+ bool IsTableUpdateInProgress() const { return mbTableUpdateInProgress; }
+
+ /**
+ * Makes sure that, starting from the passed Page, all page-bound Frames
+ * are on the right Page (pagenumber).
+ */
+ static void AssertPageFlys( SwPageFrame * );
+
+ /// Invalidate all Content, Size or PrtArea
+ void InvalidateAllContent( SwInvalidateFlags nInvalidate );
+
+ /**
+ * Invalidate/re-calculate the position of all floating
+ * screen objects (Writer fly frames and drawing objects), which are
+ * anchored to paragraph or to character.
+ */
+ void InvalidateAllObjPos();
+
+ /// Remove superfluous Pages
+ void SetSuperfluous() { mbCheckSuperfluous = true; }
+ bool IsSuperfluous() const { return mbCheckSuperfluous; }
+ void RemoveSuperfluous();
+
+ /**
+ * Query/set the current Page and the collective Page count
+ * We'll format as much as necessary
+ */
+ sal_uInt16 GetCurrPage( const SwPaM* ) const;
+ sal_uInt16 SetCurrPage( SwCursor*, sal_uInt16 nPageNum );
+ Point GetPagePos( sal_uInt16 nPageNum ) const;
+ sal_uInt16 GetPageNum() const { return mnPhyPageNums; }
+ void DecrPhyPageNums() { --mnPhyPageNums; }
+ void IncrPhyPageNums() { ++mnPhyPageNums; }
+ bool IsVirtPageNum() const { return mbIsVirtPageNum; }
+ inline void SetVirtPageNum( const bool bOf ) const;
+ bool IsDummyPage( sal_uInt16 nPageNum ) const;
+
+ /**
+ * Point rPt: The point that should be used to find the page
+ * Size pSize: If given, we return the (first) page that overlaps with the
+ * rectangle defined by rPt and pSize
+ * bool bExtend: Extend each page to the left/right/top/bottom up to the
+ * next page margin
+ */
+ const SwPageFrame* GetPageAtPos( const Point& rPt, const Size* pSize = nullptr, bool bExtend = false ) const;
+
+ /**
+ * Point rPt: The point to test
+ * @returns true: if rPt is between top/bottom margins of two pages
+ * in hide-whitespace, rPt can be near the gap, but
+ * not strictly between pages (in a page) as gap is small.
+ * @returns false: if rPt is in a page or not strictly between two pages
+ */
+ bool IsBetweenPages(const Point& rPt) const;
+
+ enum class RectsMode { Default, NoAnchoredFlys };
+ void CalcFrameRects(SwShellCursor const&, SwRects &, RectsMode eMode = RectsMode::Default);
+
+ /**
+ * Calculates the cells included from the current selection
+ *
+ * @returns false: There was no result because of an invalid layout
+ * @returns true: Everything worked fine.
+ */
+ bool MakeTableCursors( SwTableCursor& );
+
+ void DisallowTurbo() const { const_cast<SwRootFrame*>(this)->mbTurboAllowed = false; }
+ void ResetTurboFlag() const { const_cast<SwRootFrame*>(this)->mbTurboAllowed = true; }
+ bool IsTurboAllowed() const { return mbTurboAllowed; }
+ void SetTurbo( const SwContentFrame *pContent ) { mpTurbo = pContent; }
+ void ResetTurbo() { mpTurbo = nullptr; }
+ const SwContentFrame *GetTurbo() const { return mpTurbo; }
+
+ /// Update the footnote numbers of all Pages
+ void UpdateFootnoteNums(); // Only for page by page numbering!
+
+ /// Remove all footnotes (but no references)
+ void RemoveFootnotes( SwPageFrame *pPage = nullptr, bool bPageOnly = false,
+ bool bEndNotes = false );
+ void CheckFootnotePageDescs( bool bEndNote );
+
+ const SwPageFrame *GetLastPage() const { return mpLastPage; }
+ SwPageFrame *GetLastPage() { return mpLastPage; }
+
+ static bool IsInPaint() { return s_isInPaint; }
+
+ static void SetNoVirDev(const bool bNew) { s_isNoVirDev = bNew; }
+
+ inline tools::Long GetBrowseWidth() const;
+ inline void InvalidateBrowseWidth();
+
+ bool IsNewLayout() const { return mbIsNewLayout; }
+ void ResetNewLayout() { mbIsNewLayout = false;}
+
+ /**
+ * Empty SwSectionFrames are registered here for deletion and
+ * destroyed later on or deregistered.
+ */
+ void InsertEmptySct( SwSectionFrame* pDel );
+ /// Empty SwFlyFrames are registered here for deletion and destroyed later if they are not
+ /// de-registered in the meantime.
+ void InsertEmptyFly(SwFlyFrame* pDel);
+ void DeleteEmptySct() { if( mpDestroy ) DeleteEmptySct_(); }
+ void DeleteEmptyFlys() { if( mpFlyDestroy ) DeleteEmptyFlys_(); }
+ void RemoveFromList( SwSectionFrame* pSct ) { if( mpDestroy ) RemoveFromList_( pSct ); }
+#ifdef DBG_UTIL
+ bool IsInDelList( SwSectionFrame* pSct ) const;
+#endif
+ bool IsInFlyDelList( SwFlyFrame* pFly ) const;
+
+ void SetCallbackActionEnabled( bool b ) { mbCallbackActionEnabled = b; }
+ bool IsCallbackActionEnabled() const { return mbCallbackActionEnabled; }
+
+ bool IsAnyShellAccessible() const { return mnAccessibleShells > 0; }
+ void AddAccessibleShell() { ++mnAccessibleShells; }
+ void RemoveAccessibleShell() { --mnAccessibleShells; }
+
+ /**
+ * Get page frame by physical page number
+ * looping through the lowers, which are page frame, in order to find the
+ * page frame with the given physical page number.
+ * if no page frame is found, 0 is returned.
+ * Note: Empty page frames are also returned.
+ *
+ * @param _nPageNum: physical page number of page frame to be searched and
+ * returned.
+ *
+ * @return pointer to the page frame with the given physical page number
+ */
+ SwPageFrame* GetPageByPageNum( sal_uInt16 _nPageNum ) const;
+
+ void CheckViewLayout( const SwViewOption* pViewOpt, const SwRect* pVisArea );
+ bool IsLeftToRightViewLayout() const;
+ const SwRect& GetPagesArea() const { return maPagesArea; }
+ void SetSidebarChanged() { mbSidebarChanged = true; }
+
+ bool IsLayoutFreezed() const { return mbLayoutFreezed; }
+ void FreezeLayout( bool freeze ) { mbLayoutFreezed = freeze; }
+
+ void RemovePage( SwPageFrame **pDel, SwRemoveResult eResult );
+
+ /**
+ * Replacement for sw::DocumentRedlineManager::GetRedlineFlags()
+ * (this is layout-level redline hiding).
+ */
+ bool IsHideRedlines() const { return mbHideRedlines; }
+ void SetHideRedlines(bool);
+ sw::FieldmarkMode GetFieldmarkMode() const { return m_FieldmarkMode; }
+ void SetFieldmarkMode(sw::FieldmarkMode, sw::ParagraphBreakMode);
+ sw::ParagraphBreakMode GetParagraphBreakMode() const { return m_ParagraphBreakMode; }
+ bool HasMergedParas() const;
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+};
+
+inline tools::Long SwRootFrame::GetBrowseWidth() const
+{
+ if ( !mbBrowseWidthValid )
+ const_cast<SwRootFrame*>(this)->ImplCalcBrowseWidth();
+ return mnBrowseWidth;
+}
+
+inline void SwRootFrame::InvalidateBrowseWidth()
+{
+ if ( mbBrowseWidthValid )
+ ImplInvalidateBrowseWidth();
+}
+
+inline void SwRootFrame::SetVirtPageNum( const bool bOf) const
+{
+ const_cast<SwRootFrame*>(this)->mbIsVirtPageNum = bOf;
+}
+
+/// helper class to disable creation of an action by a callback event
+/// in particular, change event from a drawing object (SwDrawContact::Changed())
+class DisableCallbackAction
+{
+ private:
+ SwRootFrame & m_rRootFrame;
+ bool m_bOldCallbackActionState;
+
+ public:
+ explicit DisableCallbackAction(SwRootFrame & rRootFrame)
+ : m_rRootFrame(rRootFrame)
+ , m_bOldCallbackActionState(rRootFrame.IsCallbackActionEnabled())
+ {
+ m_rRootFrame.SetCallbackActionEnabled(false);
+ }
+
+ ~DisableCallbackAction()
+ {
+ m_rRootFrame.SetCallbackActionEnabled(m_bOldCallbackActionState);
+ }
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_ROOTFRM_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/rowfrm.hxx b/sw/source/core/inc/rowfrm.hxx
new file mode 100644
index 0000000000..a48dacf6a3
--- /dev/null
+++ b/sw/source/core/inc/rowfrm.hxx
@@ -0,0 +1,131 @@
+/* -*- 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_ROWFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_ROWFRM_HXX
+
+#include "layfrm.hxx"
+
+class SwTableLine;
+class SwBorderAttrs;
+
+/// SwRowFrame is one table row in the document layout.
+class SwRowFrame final : public SwLayoutFrame
+{
+ virtual void Format(vcl::RenderContext* pRenderContext,
+ const SwBorderAttrs* pAttrs = nullptr) override;
+ /// Only change the Frame size, not the PrtArea SSize
+ virtual SwTwips ShrinkFrame(SwTwips, bool bTst = false, bool bInfo = false) override;
+ virtual SwTwips GrowFrame(SwTwips, bool bTst = false, bool bInfo = false) override;
+
+ const SwTableLine* m_pTabLine;
+ SwRowFrame* m_pFollowRow; ///< note: this is *only* set on old-style tables!
+ // #i29550#
+ sal_uInt16 mnTopMarginForLowers;
+ sal_uInt16 mnBottomMarginForLowers;
+ sal_uInt16 mnBottomLineSize;
+ // <-- collapsing
+ bool m_bIsFollowFlowRow; ///< note: this is *only* set on old-style tables!
+ bool m_bIsRepeatedHeadline;
+ bool m_bIsRowSpanLine;
+
+ bool m_bForceRowSplitAllowed;
+ bool m_bIsInSplit;
+
+ virtual void DestroyImpl() override;
+ virtual ~SwRowFrame() override;
+
+ virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+ virtual const SwRowFrame* DynCastRowFrame() const override { return this; }
+
+public:
+ SwRowFrame(const SwTableLine&, SwFrame*, bool bInsertContent = true);
+
+ virtual void Cut() override;
+
+ /**
+ * Register Flys after a line was created _AND_ inserted
+ * Must be called by the creator; the Fly is inserted _after_ it has
+ * been created; the same holds true for the Page at which the Flys
+ * are to be registered at.
+ */
+ void RegistFlys(SwPageFrame* pPage = nullptr);
+
+ const SwTableLine* GetTabLine() const { return m_pTabLine; }
+
+ /**
+ * Adapts the Cells to the current height; invalidates the Cells if
+ * the Direction does not match the height
+ */
+ void AdjustCells(const SwTwips nHeight, const bool bHeight);
+
+ SwRowFrame* GetFollowRow() const { return m_pFollowRow; }
+ void SetFollowRow(SwRowFrame* pNew) { m_pFollowRow = pNew; }
+
+ // #i29550#
+ sal_uInt16 GetTopMarginForLowers() const { return mnTopMarginForLowers; }
+ void SetTopMarginForLowers(sal_uInt16 nNew) { mnTopMarginForLowers = nNew; }
+ sal_uInt16 GetBottomMarginForLowers() const { return mnBottomMarginForLowers; }
+ void SetBottomMarginForLowers(sal_uInt16 nNew) { mnBottomMarginForLowers = nNew; }
+ sal_uInt16 GetBottomLineSize() const { return mnBottomLineSize; }
+ void SetBottomLineSize(sal_uInt16 nNew) { mnBottomLineSize = nNew; }
+ // <-- collapsing
+
+ bool IsRepeatedHeadline() const { return m_bIsRepeatedHeadline; }
+ void SetRepeatedHeadline(bool bNew) { m_bIsRepeatedHeadline = bNew; }
+
+ // --> split table rows
+ bool IsRowSplitAllowed() const;
+ bool IsForceRowSplitAllowed() const { return m_bForceRowSplitAllowed; }
+ void SetForceRowSplitAllowed(bool bNew) { m_bForceRowSplitAllowed = bNew; };
+ bool IsFollowFlowRow() const { return m_bIsFollowFlowRow; }
+ void SetFollowFlowRow(bool bNew) { m_bIsFollowFlowRow = bNew; }
+ // <-- split table rows
+
+ // #131283# Table row keep feature
+ bool ShouldRowKeepWithNext(const bool bCheckParents = true) const;
+
+ // #i4032# NEW TABLES
+ bool IsRowSpanLine() const { return m_bIsRowSpanLine; }
+ void SetRowSpanLine(bool bNew) { m_bIsRowSpanLine = bNew; }
+
+ // A row may only be split if the minimum height of the row frame
+ // fits into the vertical space left.
+ // The minimum height is found as maximum of two values: minimal
+ // contents of the row (e.g., height of first line of text, or an
+ // object, or lower table cell), and the minimum height setting.
+ // As the minimum height setting should not prevent the row to
+ // flow, (it only should ensure that *total* height is no less), we
+ // should not consider the setting when the split is performed
+ // (we should be able to keep on first page as little as required).
+ // When IsInSplit is true, lcl_CalcMinRowHeight will ignore the
+ // minimum height setting. It is set in lcl_RecalcSplitLine around
+ // lcl_RecalcRow and SwRowFrame::Calc that decide if it's possible
+ // to keep part of row's content on first page, and update table's
+ // height to fit the rest of space.
+ bool IsInSplit() const { return m_bIsInSplit; }
+ void SetInSplit(bool bNew = true) { m_bIsInSplit = bNew; }
+ void OnFrameSize(const SfxPoolItem&);
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/scriptinfo.hxx b/sw/source/core/inc/scriptinfo.hxx
new file mode 100644
index 0000000000..21c3c2240c
--- /dev/null
+++ b/sw/source/core/inc/scriptinfo.hxx
@@ -0,0 +1,398 @@
+/* -*- 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_SCRIPTINFO_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SCRIPTINFO_HXX
+
+#include <vector>
+#include <deque>
+#include <unordered_set>
+#include <rtl/ustrbuf.hxx>
+#include <o3tl/typed_flags_set.hxx>
+#include <i18nlangtag/lang.h>
+#include <tools/long.hxx>
+#include "TextFrameIndex.hxx"
+#include <doc.hxx>
+
+class SwTextNode;
+class SwTextFrame;
+class Point;
+class MultiSelection;
+enum class SwFontScript;
+namespace sw { struct MergedPara; }
+namespace sw::mark { class IBookmark; }
+
+#define SPACING_PRECISION_FACTOR 100
+
+// encapsulates information about script changes
+class SwScriptInfo
+{
+public:
+ enum CompType { KANA, SPECIAL_LEFT, SPECIAL_RIGHT, NONE, SPECIAL_MIDDLE};
+ enum class MarkKind { Start = (1<<0), End = (1<<1), Point = (1<<2) };
+
+private:
+ //! Records a single change in script type.
+ struct ScriptChangeInfo
+ {
+ TextFrameIndex position; //!< Character position at which we change script
+ sal_uInt8 type; //!< Script type (Latin/Asian/Complex) that we change to.
+ ScriptChangeInfo(TextFrameIndex pos, sal_uInt8 typ) : position(pos), type(typ) {};
+ };
+ //TODO - This is sorted, so should probably be a std::set rather than vector.
+ // But we also use random access (probably unnecessarily).
+ std::vector<ScriptChangeInfo> m_ScriptChanges;
+ //! Records a single change in direction.
+ struct DirectionChangeInfo
+ {
+ TextFrameIndex position; //!< Character position at which we change direction.
+ sal_uInt8 type; //!< Direction that we change to.
+ DirectionChangeInfo(TextFrameIndex pos, sal_uInt8 typ) : position(pos), type(typ) {};
+ };
+ std::vector<DirectionChangeInfo> m_DirectionChanges;
+ std::deque<TextFrameIndex> m_Kashida;
+ /// indexes into m_Kashida
+ std::unordered_set<size_t> m_KashidaInvalid;
+ std::deque<TextFrameIndex> m_NoKashidaLine;
+ std::deque<TextFrameIndex> m_NoKashidaLineEnd;
+ std::vector<TextFrameIndex> m_HiddenChg;
+ std::vector<std::tuple<TextFrameIndex, MarkKind, Color, OUString>> m_Bookmarks;
+ //! Records a single change in compression.
+ struct CompressionChangeInfo
+ {
+ TextFrameIndex position; //!< Character position where the change occurs.
+ TextFrameIndex length; //!< Length of the segment.
+ CompType type; //!< Type of compression that we change to.
+ CompressionChangeInfo(TextFrameIndex pos, TextFrameIndex len, CompType typ) : position(pos), length(len), type(typ) {};
+ };
+ std::vector<CompressionChangeInfo> m_CompressionChanges;
+#ifdef DBG_UTIL
+ CompType DbgCompType(const TextFrameIndex nPos) const;
+#endif
+
+ TextFrameIndex m_nInvalidityPos;
+ sal_uInt8 m_nDefaultDir;
+
+ void UpdateBidiInfo( const OUString& rText );
+ bool IsKashidaValid(size_t nKashPos) const;
+ // returns true if nKashPos is newly marked invalid
+ bool MarkKashidaInvalid(size_t nKashPos);
+ void ClearKashidaInvalid(size_t nKashPos);
+ bool MarkOrClearKashidaInvalid(TextFrameIndex nStt, TextFrameIndex nLen,
+ bool bMark, sal_Int32 nMarkCount);
+ bool IsKashidaLine(TextFrameIndex nCharIdx) const;
+ // examines the range [ nStart, nStart + nEnd ] if there are kanas
+ // returns start index of kana entry in array, otherwise SAL_MAX_SIZE
+ size_t HasKana(TextFrameIndex nStart, TextFrameIndex nEnd) const;
+
+public:
+
+ SwScriptInfo();
+ ~SwScriptInfo();
+
+ // determines script changes
+ void InitScriptInfo(const SwTextNode& rNode, sw::MergedPara const* pMerged, bool bRTL);
+ void InitScriptInfo(const SwTextNode& rNode, sw::MergedPara const* pMerged);
+
+ // set/get position from which data is invalid
+ void SetInvalidityA(const TextFrameIndex nPos)
+ {
+ if (nPos < m_nInvalidityPos)
+ m_nInvalidityPos = nPos;
+ }
+ TextFrameIndex GetInvalidityA() const
+ {
+ return m_nInvalidityPos;
+ }
+
+ // get default direction for paragraph
+ sal_uInt8 GetDefaultDir() const { return m_nDefaultDir; };
+
+ // array operations, nCnt refers to array position
+ size_t CountScriptChg() const { return m_ScriptChanges.size(); }
+ TextFrameIndex GetScriptChg(const size_t nCnt) const
+ {
+ assert(nCnt < m_ScriptChanges.size());
+ return m_ScriptChanges[nCnt].position;
+ }
+ sal_uInt8 GetScriptType( const size_t nCnt ) const
+ {
+ assert( nCnt < m_ScriptChanges.size());
+ return m_ScriptChanges[nCnt].type;
+ }
+
+ size_t CountDirChg() const { return m_DirectionChanges.size(); }
+ TextFrameIndex GetDirChg(const size_t nCnt) const
+ {
+ assert(nCnt < m_DirectionChanges.size());
+ return m_DirectionChanges[ nCnt ].position;
+ }
+ sal_uInt8 GetDirType( const size_t nCnt ) const
+ {
+ assert(nCnt < m_DirectionChanges.size());
+ return m_DirectionChanges[ nCnt ].type;
+ }
+
+ size_t CountKashida() const
+ {
+ return m_Kashida.size();
+ }
+
+ TextFrameIndex GetKashida(const size_t nCnt) const
+ {
+ assert(nCnt < m_Kashida.size());
+ return m_Kashida[nCnt];
+ }
+
+ size_t CountCompChg() const { return m_CompressionChanges.size(); };
+ TextFrameIndex GetCompStart(const size_t nCnt) const
+ {
+ assert(nCnt < m_CompressionChanges.size());
+ return m_CompressionChanges[ nCnt ].position;
+ }
+ TextFrameIndex GetCompLen(const size_t nCnt) const
+ {
+ assert(nCnt < m_CompressionChanges.size());
+ return m_CompressionChanges[ nCnt ].length;
+ }
+ CompType GetCompType( const size_t nCnt ) const
+ {
+ assert(nCnt < m_CompressionChanges.size());
+ return m_CompressionChanges[ nCnt ].type;
+ }
+
+ size_t CountHiddenChg() const { return m_HiddenChg.size(); };
+ TextFrameIndex GetHiddenChg(const size_t nCnt) const
+ {
+ assert(nCnt < m_HiddenChg.size());
+ return m_HiddenChg[ nCnt ];
+ }
+ TextFrameIndex NextHiddenChg(TextFrameIndex nPos) const;
+ TextFrameIndex NextBookmark(TextFrameIndex nPos) const;
+ std::vector<std::tuple<MarkKind, Color, OUString>>
+ GetBookmarks(TextFrameIndex const nPos);
+ static void CalcHiddenRanges(const SwTextNode& rNode,
+ MultiSelection& rHiddenMulti,
+ std::vector<std::pair<sw::mark::IBookmark const*, MarkKind>> * pBookmarks);
+ static void selectHiddenTextProperty(const SwTextNode& rNode,
+ MultiSelection &rHiddenMulti,
+ std::vector<std::pair<sw::mark::IBookmark const*, MarkKind>> * pBookmarks);
+ static void selectRedLineDeleted(const SwTextNode& rNode, MultiSelection &rHiddenMulti, bool bSelect=true);
+
+ // "high" level operations, nPos refers to string position
+ TextFrameIndex NextScriptChg(TextFrameIndex nPos) const;
+ sal_Int16 ScriptType(const TextFrameIndex nPos) const;
+
+ // Returns the position of the next direction level change.
+ // If bLevel is set, the position of the next level which is smaller
+ // than the level at position nPos is returned. This is required to
+ // obtain the end of a SwBidiPortion
+ TextFrameIndex NextDirChg(const TextFrameIndex nPos,
+ const sal_uInt8* pLevel = nullptr) const;
+ sal_uInt8 DirType(const TextFrameIndex nPos) const;
+
+ // HIDDEN TEXT STUFF START
+
+/** Hidden text range information - static and non-version
+
+ @descr Determines if a given position is inside a hidden text range. The
+ static version tries to obtain a valid SwScriptInfo object
+ via the SwTextNode, otherwise it calculates the values from scratch.
+ The non-static version uses the internally cached information
+ for the calculation.
+
+ @param rNode
+ The text node.
+ @param nPos
+ The given position that should be checked.
+ @param rnStartPos
+ Return parameter for the start position of the hidden range.
+ COMPLETE_STRING if nPos is not inside a hidden range.
+ @param rnEndPos
+ Return parameter for the end position of the hidden range.
+ 0 if nPos is not inside a hidden range.
+ @param rnEndPos
+ Return parameter that contains all the hidden text ranges. Optional.
+ @return
+ returns true if there are any hidden characters in this paragraph.
+
+*/
+ static bool GetBoundsOfHiddenRange( const SwTextNode& rNode, sal_Int32 nPos,
+ sal_Int32& rnStartPos, sal_Int32& rnEndPos,
+ std::vector<sal_Int32>* pList = nullptr );
+ bool GetBoundsOfHiddenRange(TextFrameIndex nPos, TextFrameIndex & rnStartPos,
+ TextFrameIndex & rnEndPos) const;
+
+ static bool IsInHiddenRange( const SwTextNode& rNode, sal_Int32 nPos );
+
+/** Hidden text attribute handling
+
+ @descr Takes a string and either deletes the hidden ranges or sets
+ a given character in place of the hidden characters.
+
+ @param rNode
+ The text node.
+ @param rText
+ The string to modify.
+ @param cChar
+ The character that should replace the hidden characters.
+ @param bDel
+ If set, the hidden ranges will be deleted from the text node.
+ */
+ static sal_Int32 MaskHiddenRanges(
+ const SwTextNode& rNode, OUStringBuffer& rText,
+ const sal_Int32 nStt, const sal_Int32 nEnd,
+ const sal_Unicode cChar );
+
+/** Hidden text attribute handling
+
+ @descr Takes a SwTextNode and deletes the hidden ranges from the node.
+
+ @param rNode
+ The text node.
+ */
+ static void DeleteHiddenRanges( SwTextNode& rNode );
+
+ // HIDDEN TEXT STUFF END
+
+ // modifies the kerning array according to a given compress value
+ tools::Long Compress( KernArray& rKernArray, TextFrameIndex nIdx, TextFrameIndex nLen,
+ const sal_uInt16 nCompress, const sal_uInt16 nFontHeight,
+ const bool bCentered,
+ Point* pPoint = nullptr ) const;
+
+/** Performs a kashida justification on the kerning array
+
+ @descr Add some extra space for kashida justification to the
+ positions in the kerning array.
+ @param pKernArray
+ The printers kerning array. Optional.
+ @param nStt
+ Start referring to the paragraph.
+ @param nLen
+ The number of characters to be considered.
+ @param nSpaceAdd
+ The value which has to be added to a kashida opportunity.
+ @return The number of kashida opportunities in the given range
+*/
+ sal_Int32 KashidaJustify( KernArray* pKernArray, sal_Bool* pKashidaArray,
+ TextFrameIndex nStt, TextFrameIndex nLen, tools::Long nSpaceAdd = 0) const;
+
+/** Clears array of kashidas marked as invalid
+ */
+ void ClearKashidaInvalid(TextFrameIndex const nStt, TextFrameIndex const nLen)
+ {
+ MarkOrClearKashidaInvalid(nStt, nLen, false, 0);
+ }
+
+/** Marks nCnt kashida positions as invalid
+ pKashidaPositions: array of char indices relative to the paragraph
+*/
+ void MarkKashidasInvalid(sal_Int32 nCnt, const TextFrameIndex* pKashidaPositions);
+
+/** Marks nCnt kashida positions as invalid
+ in the given text range
+ */
+ bool MarkKashidasInvalid(sal_Int32 const nCnt,
+ TextFrameIndex const nStt, TextFrameIndex const nLen)
+ {
+ return MarkOrClearKashidaInvalid(nStt, nLen, true, nCnt);
+ }
+
+/** retrieves kashida opportunities for a given text range.
+
+ rKashidaPositions: buffer to receive the char indices of the
+ kashida opportunities relative to the paragraph
+*/
+ void GetKashidaPositions(TextFrameIndex nStt, TextFrameIndex nLen,
+ std::vector<TextFrameIndex>& rKashidaPosition);
+
+/** Use regular blank justification instead of kashdida justification for the given line of text.
+ nStt Start char index of the line referring to the paragraph.
+ nLen Number of characters in the line
+*/
+ void SetNoKashidaLine(TextFrameIndex nStt, TextFrameIndex nLen);
+
+/** Clear forced blank justification for a given line.
+ nStt Start char index of the line referring to the paragraph.
+ nLen Number of characters in the line
+*/
+ void ClearNoKashidaLine(TextFrameIndex nStt, TextFrameIndex nLen);
+
+/** Checks if text is Arabic text.
+
+ @descr Checks if text is Arabic text.
+ @param rText
+ The text to check
+ @param nStt
+ Start index of the text
+ @return Returns if the language is an Arabic language
+ */
+ static bool IsArabicText(const OUString& rText, TextFrameIndex nStt, TextFrameIndex nLen);
+
+/** Performs a thai justification on the kerning array
+
+ @descr Add some extra space for thai justification to the
+ positions in the kerning array.
+ @param aText
+ The String
+ @param pKernArray
+ The printers kerning array. Optional.
+ @param nIdx
+ Start referring to the paragraph.
+ @param nLen
+ The number of characters to be considered.
+ @param nSpaceAdd
+ The value which has to be added to the cells.
+ @return The number of extra spaces in the given range
+*/
+ static TextFrameIndex ThaiJustify( std::u16string_view aText, KernArray* pKernArray,
+ TextFrameIndex nIdx,
+ TextFrameIndex nLen,
+ TextFrameIndex nNumberOfBlanks = TextFrameIndex(0),
+ tools::Long nSpaceAdd = 0 );
+
+ static TextFrameIndex CountCJKCharacters(const OUString &rText,
+ TextFrameIndex nPos, TextFrameIndex nEnd, LanguageType aLang);
+
+ static void CJKJustify( const OUString& rText, KernArray& rKernArray,
+ TextFrameIndex nStt,
+ TextFrameIndex nLen, LanguageType aLang,
+ tools::Long nSpaceAdd, bool bIsSpaceStop );
+
+ /// return a frame for the node, ScriptInfo is its member...
+ /// (many clients need both frame and SI, and both have to match)
+ static SwScriptInfo* GetScriptInfo( const SwTextNode& rNode,
+ SwTextFrame const** o_pFrame = nullptr,
+ bool bAllowInvalid = false);
+
+ SwFontScript WhichFont(TextFrameIndex nIdx) const;
+ static SwFontScript WhichFont(sal_Int32 nIdx, OUString const & rText);
+};
+
+namespace o3tl
+{
+
+template<> struct typed_flags<SwScriptInfo::MarkKind> : is_typed_flags<SwScriptInfo::MarkKind, 0x07> {};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/sectfrm.hxx b/sw/source/core/inc/sectfrm.hxx
new file mode 100644
index 0000000000..c07d78b12b
--- /dev/null
+++ b/sw/source/core/inc/sectfrm.hxx
@@ -0,0 +1,189 @@
+/* -*- 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_SECTFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SECTFRM_HXX
+
+#include "layfrm.hxx"
+#include "flowfrm.hxx"
+
+#include <svl/listener.hxx>
+
+class SwSection;
+class SwSectionFormat;
+class SwAttrSetChg;
+class SwFootnoteContFrame;
+class SwLayouter;
+
+enum class SwFindMode
+{
+ None = 0, EndNote = 1, LastCnt = 2, MyLast = 4
+};
+
+enum class SwSectionFrameInvFlags : sal_uInt8
+{
+ NONE = 0x00,
+ InvalidateSize = 0x01,
+ SetCompletePaint = 0x10,
+};
+
+namespace o3tl {
+ template<> struct typed_flags<SwSectionFrameInvFlags> : is_typed_flags<SwSectionFrameInvFlags, 0x0011> {};
+}
+
+class SwSectionFrame final: public SwLayoutFrame, public SwFlowFrame
+ , public SvtListener // TODO?
+{
+ SwSection* m_pSection;
+ bool m_bFootnoteAtEnd; // footnotes at the end of section
+ bool m_bEndnAtEnd; // endnotes at the end of section
+ bool m_bContentLock; // content locked
+ bool m_bOwnFootnoteNum; // special numbering of footnotes
+ bool m_bFootnoteLock; // ftn, don't leave this section bwd
+
+ void UpdateAttr_( const SfxPoolItem*, const SfxPoolItem*, SwSectionFrameInvFlags &,
+ SwAttrSetChg *pa = nullptr, SwAttrSetChg *pb = nullptr );
+ void Cut_( bool bRemove );
+ // Is there a FootnoteContainer?
+ // An empty sectionfrm without FootnoteCont is superfluous
+ bool IsSuperfluous() const { return !ContainsAny() && !ContainsFootnoteCont(); }
+ void CalcFootnoteAtEndFlag();
+ void CalcEndAtEndFlag();
+ const SwSectionFormat* GetEndSectFormat_() const;
+ bool IsEndnoteAtMyEnd() const;
+
+ virtual void DestroyImpl() override;
+ virtual ~SwSectionFrame() override;
+
+ virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
+ virtual bool ShouldBwdMoved( SwLayoutFrame *pNewUpper, bool &rReformat ) override;
+ virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override;
+ virtual void Notify(SfxHint const& rHint) override;
+ virtual void SwClientNotify( const SwModify&, const SfxHint& ) override;
+
+public:
+ SwSectionFrame( SwSection &, SwFrame* ); // Content is not created!
+ SwSectionFrame( SwSectionFrame &, bool bMaster ); // _ONLY_ for creating Master/Follows!
+
+ void Init();
+ virtual void CheckDirection( bool bVert ) override;
+
+ virtual void PaintSubsidiaryLines( const SwPageFrame*, const SwRect& ) const override;
+
+ virtual void Cut() override;
+ virtual void Paste( SwFrame* pParent, SwFrame* pSibling = nullptr ) override;
+
+ inline const SwSectionFrame *GetFollow() const;
+ inline SwSectionFrame *GetFollow();
+ SwSectionFrame* FindMaster() const;
+
+ SwContentFrame *FindLastContent( SwFindMode nMode = SwFindMode::None );
+ inline const SwContentFrame *FindLastContent() const;
+ SwSection* GetSection() { return m_pSection; }
+ const SwSection* GetSection() const { return m_pSection; }
+ void ColLock() { mbColLocked = true; }
+ void ColUnlock() { mbColLocked = false; }
+
+ void CalcFootnoteContent();
+ void SimpleFormat();
+ bool IsDescendantFrom( const SwSectionFormat* pSect ) const;
+ bool HasToBreak( const SwFrame* pFrame ) const;
+ void MergeNext( SwSectionFrame* pNxt );
+
+ /**
+ * Splits the SectionFrame surrounding the pFrame up in two parts:
+ * pFrame and the start of the 2nd part
+ */
+ SwSectionFrame* SplitSect( SwFrame* pFrameStartAfter, SwFrame* pFramePutAfter );
+ void DelEmpty( bool bRemove ); // Like Cut(), except for that Follow chaining is maintained
+ SwFootnoteContFrame* ContainsFootnoteCont( const SwFootnoteContFrame* pCont = nullptr ) const;
+ bool Growable() const;
+ SwTwips Shrink_( SwTwips, bool bTst );
+ SwTwips Grow_ ( SwTwips, bool bTst );
+
+ /**
+ * A sectionfrm has to maximize, if he has a follow or a ftncontainer at
+ * the end of the page. A superfluous follow will be ignored,
+ * if bCheckFollow is set.
+ */
+ bool ToMaximize( bool bCheckFollow ) const;
+ bool ToMaximize_() const {
+ if( !m_pSection ) return false;
+ return ToMaximize( false );
+ }
+ bool MoveAllowed( const SwFrame* ) const;
+ bool CalcMinDiff( SwTwips& rMinDiff ) const;
+
+ /**
+ * Returns the size delta that the section would like to be
+ * greater if it has undersized TextFrames in it.
+ *
+ * The return value is > 0 for undersized Frames, or 0 otherwise.
+ *
+ * If necessary the undersized-flag is corrected.
+ * We need this in the FormatWidthCols to "deflate" columns there.
+ */
+ SwTwips Undersize();
+ SwTwips CalcUndersize() const;
+
+ /// Adapt size to surroundings
+ void CheckClipping( bool bGrow, bool bMaximize );
+
+ void InvalidateFootnotePos();
+ void CollectEndnotes( SwLayouter* pLayouter );
+ const SwSectionFormat* GetEndSectFormat() const {
+ if( IsEndnAtEnd() ) return GetEndSectFormat_();
+ return nullptr;
+ }
+
+ static void MoveContentAndDelete( SwSectionFrame* pDel, bool bSave );
+
+ bool IsBalancedSection() const;
+
+ virtual void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+ void dumpAsXmlAttributes(xmlTextWriterPtr writer) const override;
+
+ bool IsFootnoteAtEnd() const { return m_bFootnoteAtEnd; }
+ bool IsEndnAtEnd() const { return m_bEndnAtEnd; }
+ bool IsAnyNoteAtEnd() const { return m_bFootnoteAtEnd || m_bEndnAtEnd; }
+
+ void SetContentLock( bool bNew ) { m_bContentLock = bNew; }
+ bool IsContentLocked() const { return m_bContentLock; }
+
+ bool IsOwnFootnoteNum() const { return m_bOwnFootnoteNum; }
+
+ void SetFootnoteLock( bool bNew ) { m_bFootnoteLock = bNew; }
+ bool IsFootnoteLock() const { return m_bFootnoteLock; }
+};
+
+inline const SwSectionFrame *SwSectionFrame::GetFollow() const
+{
+ return static_cast<const SwSectionFrame*>(SwFlowFrame::GetFollow());
+}
+inline SwSectionFrame *SwSectionFrame::GetFollow()
+{
+ return static_cast<SwSectionFrame*>(SwFlowFrame::GetFollow());
+}
+inline const SwContentFrame *SwSectionFrame::FindLastContent() const
+{
+ return const_cast<SwSectionFrame*>(this)->FindLastContent();
+}
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_SECTFRM_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/sortedobjs.hxx b/sw/source/core/inc/sortedobjs.hxx
new file mode 100644
index 0000000000..6d524f4928
--- /dev/null
+++ b/sw/source/core/inc/sortedobjs.hxx
@@ -0,0 +1,100 @@
+/* -*- 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_SORTEDOBJS_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SORTEDOBJS_HXX
+
+#include <vector>
+#include <swdllapi.h>
+
+class SwAnchoredObject;
+
+/** class for collecting anchored objects
+
+ for #i28701#
+ Anchored objects can be inserted and deleted. The entries can be directly
+ accessed via index.
+ An anchored object is inserted sorted. The sort criteria are:
+ - anchor type
+ - order 1: to-page, 2: to-fly, 3: to-paragraph|to-character|as-character
+ - anchor node
+ - wrapping style (inclusive layer)
+ - order 1: wrapping style != css::text::WrapTextMode_THROUGH and not in hell layer,
+ 2: wrapping style = css::text::WrapTextMode_THROUGH or in hell layer
+ - wrapping style influence
+ - order 1: NONE_SUCCESSIVE_POSITIONED, 2: NONE_CONCURRENT_POSITIONED
+ - again anchor type
+ - order 1: to-paragraph, 2: to-character, 3: as-character
+ - anchor node position
+ - internal anchor order number
+ If one of the sort criteria attributes of an anchored object changes,
+ the sorting has to be updated - use method <Update(..)>
+*/
+class SW_DLLPUBLIC SwSortedObjs
+{
+ private:
+ std::vector< SwAnchoredObject* > maSortedObjLst;
+
+ public:
+ typedef std::vector<SwAnchoredObject*>::const_iterator const_iterator;
+ SwSortedObjs();
+ ~SwSortedObjs();
+
+ size_t size() const;
+
+ /** direct access to the entries
+
+ @param _nIndex
+ input parameter - index of entry, valid value range [0..size()-1]
+ */
+ SwAnchoredObject* operator[]( size_t _nIndex ) const;
+ const_iterator begin() const
+ { return maSortedObjLst.cbegin(); };
+ const_iterator end() const
+ { return maSortedObjLst.cend(); };
+
+ bool Insert( SwAnchoredObject& _rAnchoredObj );
+
+ void Remove( SwAnchoredObject& _rAnchoredObj );
+
+ bool Contains( const SwAnchoredObject& _rAnchoredObj ) const;
+
+ /** method to update the position of the given anchored object in the
+ sorted list
+
+ @return boolean, indicating success of the update.
+ */
+ void Update(SwAnchoredObject& _rAnchoredObj);
+ void UpdateAll();
+
+ /** Position of object <_rAnchoredObj> in sorted list
+
+ Returns the number of the list position of object <_rAnchoredObj>.
+ Returns <size()>, if object isn't contained in list.
+
+ @return size_t
+ Number of the list position of object <_rAnchoredObj>
+ */
+ size_t ListPosOf( const SwAnchoredObject& _rAnchoredObj ) const;
+
+ bool is_sorted() const;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/swblocks.hxx b/sw/source/core/inc/swblocks.hxx
new file mode 100644
index 0000000000..7bd877ad65
--- /dev/null
+++ b/sw/source/core/inc/swblocks.hxx
@@ -0,0 +1,129 @@
+/* -*- 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_SWBLOCKS_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SWBLOCKS_HXX
+
+#include <tools/date.hxx>
+#include <tools/time.hxx>
+#include <o3tl/sorted_vector.hxx>
+#include <comphelper/errcode.hxx>
+#include <rtl/ref.hxx>
+
+class SwPaM;
+class SwDoc;
+class SvxMacroTableDtor;
+
+// Name of a text block:
+
+class SwBlockName
+{
+ friend class SwImpBlocks;
+ sal_uInt16 m_nHashS, m_nHashL; // Hash codes for testing
+public:
+ OUString m_aShort; /// Shortname
+ OUString m_aLong; /// Longname
+ OUString m_aPackageName; /// Package name
+ bool m_bIsOnlyTextFlagInit : 1; /// Is the Flag valid?
+ bool m_bIsOnlyText : 1; /// Unformatted text
+
+ SwBlockName( const OUString& rShort, const OUString& rLong );
+ SwBlockName( const OUString& rShort, const OUString& rLong, OUString aPackageName );
+
+ /// For sorting in the array
+ bool operator< ( const SwBlockName& r ) const { return m_aShort < r.m_aShort; }
+};
+
+class SwBlockNames : public o3tl::sorted_vector<std::unique_ptr<SwBlockName>, o3tl::less_uniqueptr_to<SwBlockName> > {};
+
+class SwImpBlocks
+{
+ friend class SwTextBlocks;
+protected:
+ OUString m_aFile; // Physical file name
+ OUString m_aName; // Logical file name
+ OUString m_aCurrentText; // Current text
+ OUString m_aShort, m_aLong; // Short- and longname (PutDoc)
+ OUString m_sBaseURL; // Base URL - has to be set at the Readers and Writers
+ SwBlockNames m_aNames; // List of all Blocks
+ Date m_aDateModified; // For aligning the Actions
+ tools::Time m_aTimeModified;
+ rtl::Reference<SwDoc> m_xDoc; // Document to be switched
+ sal_uInt16 m_nCurrentIndex; // Current Index
+ bool m_bReadOnly : 1;
+ bool m_bInPutMuchBlocks : 1; // Put several block entries
+ bool m_bInfoChanged : 1; // Whether any info of TextBlock changed
+
+ explicit SwImpBlocks( const OUString& );
+
+ enum class FileType {
+ NoFile, // Not present
+ None, // No TB file
+ XML // XML Block List
+ };
+ static FileType GetFileType( const OUString& );
+
+ virtual void ClearDoc(); // Delete Doc content
+ std::unique_ptr<SwPaM> MakePaM(); // Span PaM over Doc
+ virtual void AddName( const OUString&, const OUString&, bool bOnlyText = false );
+ bool IsFileChanged() const;
+ void Touch();
+
+public:
+ virtual ~SwImpBlocks();
+
+ static sal_uInt16 Hash( std::u16string_view ); /// Hashcode for Block names
+ sal_uInt16 GetCount() const; /// Get count of Text Blocks
+ sal_uInt16 GetIndex( const OUString& ) const; /// Index for shortnames
+ sal_uInt16 GetLongIndex( std::u16string_view ) const; /// Index for longnames
+ OUString GetShortName( sal_uInt16 ) const; /// Return shortname for index
+ OUString GetLongName( sal_uInt16 ) const; /// Return longname for index
+ OUString GetPackageName( sal_uInt16 ) const; /// Return packagename for index
+
+ const OUString& GetFileName() const {return m_aFile;} /// Return physical file name
+ void SetName( const OUString& rName ) /// Logic name
+ { m_aName = rName; m_bInfoChanged = true; }
+ const OUString& GetName() const
+ { return m_aName; }
+
+ const OUString& GetBaseURL() const { return m_sBaseURL;}
+ void SetBaseURL( const OUString& rURL ) { m_sBaseURL = rURL; }
+
+ virtual ErrCode Delete( sal_uInt16 ) = 0;
+ virtual ErrCode Rename( sal_uInt16, const OUString& ) = 0;
+ virtual ErrCode CopyBlock( SwImpBlocks& rImp, OUString& rShort, const OUString& rLong) = 0;
+ virtual ErrCode GetDoc( sal_uInt16 ) = 0;
+ virtual ErrCode BeginPutDoc( const OUString&, const OUString& ) = 0;
+ virtual ErrCode PutDoc() = 0;
+ virtual ErrCode PutText( const OUString&, const OUString&, const OUString& ) = 0;
+ virtual ErrCode MakeBlockList() = 0;
+
+ virtual ErrCode OpenFile( bool bReadOnly = true ) = 0;
+ virtual void CloseFile() = 0;
+
+ virtual bool IsOnlyTextBlock( const OUString& rShort ) const;
+
+ virtual ErrCode GetMacroTable( sal_uInt16 nIdx, SvxMacroTableDtor& rMacroTable );
+ virtual ErrCode SetMacroTable( sal_uInt16 nIdx,
+ const SvxMacroTableDtor& rMacroTable );
+ virtual bool PutMuchEntries( bool bOn );
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/swcache.hxx b/sw/source/core/inc/swcache.hxx
new file mode 100644
index 0000000000..df8ed2a64e
--- /dev/null
+++ b/sw/source/core/inc/swcache.hxx
@@ -0,0 +1,268 @@
+/* -*- 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_SWCACHE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SWCACHE_HXX
+
+/**
+ * Here, we manage pointers in a simple PtrArray to objects.
+ * These objects are created (using new) in cache access classes; they are
+ * destroyed by the cache.
+ *
+ * One can access these objects by array index or by searching in the array.
+ * If you access it by index, managing the index is the responsibility of
+ * the cache user.
+ *
+ * The cached objects are derived from the base class SwCacheObj.
+ * In it, the cache objects are doubly-linked which allows for the use of
+ * an LRU algorithm.
+ *
+ * The LRU algorithm can be changed in the base class, by setting a virtual
+ * First Pointer. It can be set to the first real one plus an offset.
+ * By doing so we can protect the start area of the cache and make sure we
+ * don't mess up the cache during some special operations.
+ * E.g.: the Idle Handler should not destroy the cache for the visible area.
+ *
+ * The cache can be grown and shrunk in size.
+ * E.g.: The cache for FormatInfo is grown for every new Shell and shrunk
+ * when destroying them.
+ */
+
+#include <memory>
+#include <vector>
+
+#include <rtl/string.hxx>
+#include <tools/long.hxx>
+
+class SwCacheObj;
+
+class SwCache
+{
+ std::vector<std::unique_ptr<SwCacheObj>> m_aCacheObjects;
+ std::vector<sal_uInt16> m_aFreePositions; /// Free positions for the Insert if the maximum has not been reached
+ /// Every time an object is deregistered, its position is added here
+ SwCacheObj *m_pRealFirst; /// _ALWAYS_ the real first LRU
+ SwCacheObj *m_pFirst; /// The virtual first, only different to m_pRealFirst when SetLRUOfst has been called
+ SwCacheObj *m_pLast;
+
+ sal_uInt16 m_nCurMax; // Maximum of accepted objects
+
+ void DeleteObj( SwCacheObj *pObj );
+
+#ifdef DBG_UTIL
+ OString m_aName;
+ tools::Long m_nAppend; /// number of entries appended
+ tools::Long m_nInsertFree; /// number of entries inserted on freed position
+ tools::Long m_nReplace; /// number of LRU replacements
+ tools::Long m_nGetSuccess;
+ tools::Long m_nGetFail;
+ tools::Long m_nToTop; /// number of reordering (LRU)
+ tools::Long m_nDelete; /// number of explicit deletes
+ tools::Long m_nGetSeek; /// number of gets without index
+ tools::Long m_nAverageSeekCnt; /// number of seeks for all gets without index
+ tools::Long m_nFlushCnt; /// number of flush calls
+ tools::Long m_nFlushedObjects;
+ tools::Long m_nIncreaseMax; /// number of cache size increases
+ tools::Long m_nDecreaseMax; /// number of cache size decreases
+
+ void Check();
+#endif
+
+public:
+
+// Only add sal_uInt8!!!
+#ifdef DBG_UTIL
+ SwCache( const sal_uInt16 nInitSize, OString aNm );
+#else
+ SwCache( const sal_uInt16 nInitSize );
+#endif
+ /// The dtor will free all objects still in the vector
+ ~SwCache();
+
+ void Flush();
+
+ //bToTop == false -> No LRU resorting!
+ SwCacheObj *Get( const void *pOwner, const bool bToTop = true );
+ SwCacheObj *Get( const void *pOwner, const sal_uInt16 nIndex,
+ const bool bToTop = true );
+ void ToTop( SwCacheObj *pObj );
+
+ bool Insert(SwCacheObj *pNew, bool isDuplicateOwnerAllowed);
+ void Delete(const void * pOwner, sal_uInt16 nIndex);
+ void Delete( const void *pOwner );
+
+ /// Mark some entries as "do not delete"
+ /// @param nOfst determines how many are not to be touched
+ void SetLRUOfst( const sal_uInt16 nOfst );
+ void ResetLRUOfst() { m_pFirst = m_pRealFirst; }
+
+ void IncreaseMax( const sal_uInt16 nAdd );
+ void DecreaseMax( const sal_uInt16 nSub );
+ sal_uInt16 GetCurMax() const { return m_nCurMax; }
+ SwCacheObj *First() { return m_pRealFirst; }
+ static inline SwCacheObj *Next( SwCacheObj *pCacheObj);
+ SwCacheObj* operator[](sal_uInt16 nIndex) { return m_aCacheObjects[nIndex].get(); }
+ sal_uInt16 size() { return m_aCacheObjects.size(); }
+};
+
+/// Try to prevent visible SwParaPortions from being deleted.
+class SwSaveSetLRUOfst
+{
+public:
+ SwSaveSetLRUOfst();
+ ~SwSaveSetLRUOfst();
+};
+
+/**
+ * The Cache object base class
+ * Users of the Cache must derive a class from the SwCacheObj and store
+ * their payload there
+ */
+class SwCacheObj
+{
+ friend class SwCache; /// Can do everything
+
+ SwCacheObj *m_pNext; /// For the LRU chaining
+ SwCacheObj *m_pPrev;
+
+ sal_uInt16 m_nCachePos; /// Position in the Cache array
+
+ sal_uInt8 m_nLock;
+
+ SwCacheObj *GetNext() { return m_pNext; }
+ SwCacheObj *GetPrev() { return m_pPrev; }
+ void SetNext( SwCacheObj *pNew ) { m_pNext = pNew; }
+ void SetPrev( SwCacheObj *pNew ) { m_pPrev = pNew; }
+
+ void SetCachePos(const sal_uInt16 nNew)
+ {
+ if (m_nCachePos != nNew)
+ {
+ m_nCachePos = nNew;
+ UpdateCachePos();
+ }
+ }
+ virtual void UpdateCachePos() { }
+
+protected:
+ const void *m_pOwner;
+
+public:
+
+ SwCacheObj( const void *pOwner );
+ virtual ~SwCacheObj();
+
+ const void *GetOwner() const { return m_pOwner; }
+ inline bool IsOwner( const void *pNew ) const;
+
+ sal_uInt16 GetCachePos() const { return m_nCachePos; }
+
+ bool IsLocked() const { return 0 != m_nLock; }
+
+#ifdef DBG_UTIL
+ void Lock();
+ void Unlock();
+#else
+ void Lock() { ++m_nLock; }
+ void Unlock() { --m_nLock; }
+#endif
+};
+
+/**
+ * Access class for the Cache
+ *
+ * The Cache object is created in the ctor.
+ * If the Cache does not return one, the member is set to 0 and one is
+ * created on the Get() and added to the Cache (if possible).
+ * Cache users must derive a class from SwCacheAccess in order to
+ * guarantee type safety. The base class should always be called for the
+ * Get(). A derived Get() should only ever guarantee type safety.
+ * Cache objects are always locked for the instance's life time.
+ */
+class SwCacheAccess
+{
+ SwCache &m_rCache;
+
+ void Get_(bool isDuplicateOwnerAllowed);
+
+protected:
+ SwCacheObj *m_pObj;
+ const void *m_pOwner; /// Can be use in NewObj
+
+ virtual SwCacheObj *NewObj() = 0;
+
+ inline SwCacheObj *Get(bool isDuplicateOwnerAllowed);
+
+ inline SwCacheAccess( SwCache &rCache, const void *pOwner, bool bSeek );
+ inline SwCacheAccess( SwCache &rCache, const void* nCacheId, const sal_uInt16 nIndex );
+
+public:
+ virtual ~SwCacheAccess();
+};
+
+
+inline bool SwCacheObj::IsOwner( const void *pNew ) const
+{
+ return m_pOwner && m_pOwner == pNew;
+}
+
+inline SwCacheObj *SwCache::Next( SwCacheObj *pCacheObj)
+{
+ if ( pCacheObj )
+ return pCacheObj->GetNext();
+ else
+ return nullptr;
+}
+
+inline SwCacheAccess::SwCacheAccess( SwCache &rC, const void *pOwn, bool bSeek ) :
+ m_rCache( rC ),
+ m_pObj( nullptr ),
+ m_pOwner( pOwn )
+{
+ if ( bSeek && m_pOwner )
+ {
+ m_pObj = m_rCache.Get( m_pOwner );
+ if (m_pObj)
+ m_pObj->Lock();
+ }
+}
+
+inline SwCacheAccess::SwCacheAccess( SwCache &rC, const void* nCacheId,
+ const sal_uInt16 nIndex ) :
+ m_rCache( rC ),
+ m_pObj( nullptr ),
+ m_pOwner( nCacheId )
+{
+ if ( m_pOwner )
+ {
+ m_pObj = m_rCache.Get( m_pOwner, nIndex );
+ if (m_pObj)
+ m_pObj->Lock();
+ }
+}
+
+inline SwCacheObj *SwCacheAccess::Get(bool const isDuplicateOwnerAllowed = true)
+{
+ if ( !m_pObj )
+ Get_(isDuplicateOwnerAllowed);
+ return m_pObj;
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/swfntcch.hxx b/sw/source/core/inc/swfntcch.hxx
new file mode 100644
index 0000000000..a895ee8550
--- /dev/null
+++ b/sw/source/core/inc/swfntcch.hxx
@@ -0,0 +1,76 @@
+/* -*- 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_SWFNTCCH_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SWFNTCCH_HXX
+
+#define NUM_DEFAULT_VALUES 39
+
+#include "swcache.hxx"
+#include "swfont.hxx"
+
+class SwViewShell;
+class SfxPoolItem;
+
+class SwFontCache : public SwCache
+{
+public:
+
+ SwFontCache() : SwCache(50
+#ifdef DBG_UTIL
+ , "Global AttributeSet/Font-Cache pSwFontCache"_ostr
+#endif
+ ) {}
+
+};
+
+// AttributeSet/Font-Cache, globale Variable, in FontCache.Cxx angelegt
+extern SwFontCache *pSwFontCache;
+
+class SwFontObj final : public SwCacheObj
+{
+ friend class SwFontAccess;
+
+private:
+ SwFont m_aSwFont;
+ const SfxPoolItem* m_pDefaultArray[ NUM_DEFAULT_VALUES ];
+
+public:
+ SwFontObj( const void* pOwner, SwViewShell *pSh );
+
+ virtual ~SwFontObj() override;
+
+ SwFont& GetFont() { return m_aSwFont; }
+ const SwFont& GetFont() const { return m_aSwFont; }
+ const SfxPoolItem** GetDefault() { return m_pDefaultArray; }
+};
+
+class SwFontAccess final : public SwCacheAccess
+{
+ SwViewShell *m_pShell;
+
+ virtual SwCacheObj *NewObj( ) override;
+
+public:
+ SwFontAccess( const void *pOwner, SwViewShell *pSh );
+ SwFontObj *Get();
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/swfont.hxx b/sw/source/core/inc/swfont.hxx
new file mode 100644
index 0000000000..86f44fb3eb
--- /dev/null
+++ b/sw/source/core/inc/swfont.hxx
@@ -0,0 +1,1010 @@
+/* -*- 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_SWFONT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SWFONT_HXX
+
+#include <memory>
+#include <i18nlangtag/lang.h>
+#include <tools/color.hxx>
+#include <tools/gen.hxx>
+#include <svl/poolitem.hxx>
+#include <editeng/svxfont.hxx>
+#include <swtypes.hxx>
+#include "drawfont.hxx"
+#include <editeng/borderline.hxx>
+#include <optional>
+#include <o3tl/enumarray.hxx>
+
+class SfxItemSet;
+class SwAttrSet;
+class SwDoCapitals; // DoCapitals
+class SwScriptInfo; // GetTextSize_
+class SwViewShell;
+class IDocumentSettingAccess;
+enum class SvxShadowItemSide;
+
+const sal_Unicode CH_BLANK = ' '; // ' ' blank spaces
+const sal_Unicode CH_BREAK = 0x0A;
+const sal_Unicode CH_TAB = '\t'; // \t
+constexpr OUStringChar CH_PAR = u'\u00B6'; // paragraph
+const sal_Unicode CH_BULLET = 0xB7; // centered dot
+const sal_Unicode CH_FULL_BLANK = 0x3000;
+const sal_Unicode CH_NB_SPACE = 0xA0;
+const sal_Unicode CH_SIX_PER_EM = 0x2006; // six-per-em space
+
+Degree10 UnMapDirection( Degree10 nDir, const bool bVertFormat, const bool bVertFormatLRBT );
+
+class SwSubFont final : public SvxFont
+{
+ friend class SwFont;
+ const void* m_nFontCacheId; // "MagicNumber" within the font cache
+ Size m_aSize; // foreigners only see this size
+ sal_uInt16 m_nFontIndex; // index in the font cache
+ sal_uInt16 m_nOrgHeight; // height including escapement/proportion
+ sal_uInt16 m_nOrgAscent; // ascent including escapement/proportion
+ sal_uInt16 m_nProportionalWidth; // proportional width
+ bool m_bSmallCapsPercentage66;
+
+ sal_uInt16 CalcEscAscent( const sal_uInt16 nOldAscent ) const;
+ sal_uInt16 CalcEscHeight( const sal_uInt16 nOldHeight,
+ const sal_uInt16 nOldAscent ) const;
+ void CalcEsc( SwDrawTextInfo const & rInf, Point& rPos );
+
+ short CheckKerning_( );
+
+ bool ChgFnt( SwViewShell const *pSh, OutputDevice& rOut );
+ bool IsSymbol( SwViewShell const *pSh );
+ sal_uInt16 GetAscent( SwViewShell const *pSh, const OutputDevice& rOut );
+ sal_uInt16 GetHeight( SwViewShell const *pSh, const OutputDevice& rOut );
+ sal_uInt16 GetHangingBaseline( SwViewShell const *pSh, const OutputDevice& rOut );
+ Size GetTextSize_( SwDrawTextInfo& rInf );
+ Size GetCapitalSize( SwDrawTextInfo& rInf );
+ void DrawText_( SwDrawTextInfo &rInf, const bool bGrey );
+ void DrawCapital( SwDrawTextInfo &rInf );
+ void DrawStretchCapital( SwDrawTextInfo &rInf );
+ void DoOnCapitals( SwDoCapitals &rDo );
+ void DrawStretchText_( SwDrawTextInfo &rInf );
+ TextFrameIndex GetModelPositionForViewPoint_( SwDrawTextInfo& rInf );
+ TextFrameIndex GetCapitalCursorOfst( SwDrawTextInfo& rInf );
+
+ inline void SetColor( const Color& rColor );
+ inline void SetFillColor( const Color& rColor );
+ inline void SetCharSet( const rtl_TextEncoding eCharSet );
+ inline void SetPitch( const FontPitch ePitch );
+ inline void SetAlign( const TextAlign eAlign );
+ inline void SetUnderline( const FontLineStyle eUnderline );
+ inline void SetOverline( const FontLineStyle eOverline );
+ inline void SetStrikeout( const FontStrikeout eStrikeout );
+ inline void SetItalic( const FontItalic eItalic );
+ inline void SetOutline( const bool bOutline );
+ inline void SetVertical( const Degree10 nDir, const bool bVertFormat );
+ inline void SetShadow( const bool bShadow );
+ inline void SetAutoKern( FontKerning nAutoKern );
+ inline void SetWordLineMode( const bool bWordLineMode );
+ inline void SetEmphasisMark( const FontEmphasisMark eValue );
+ inline void SetRelief( const FontRelief eNew );
+
+ // methods for sub-/superscript
+ inline void SetEscapement( const short nNewEsc );
+ inline void SetProportion( const sal_uInt8 nNewPropr );
+
+ inline void SetFamily( const FontFamily eFamily );
+ inline void SetName( const OUString& rName );
+ inline void SetStyleName( const OUString& rStyleName );
+ inline void SetSize( const Size& rSize );
+ inline void SetWeight( const FontWeight eWeight );
+ inline void SetLanguage( LanguageType eNewLang );
+ short CheckKerning()
+ { return GetFixKerning() >= 0 ? GetFixKerning() : CheckKerning_( ); }
+ void SetPropWidth( const sal_uInt16 nNew )
+ { m_nFontCacheId = nullptr; m_nProportionalWidth = nNew; }
+public:
+ SwSubFont() : m_aSize(0,0)
+ { m_nFontCacheId = nullptr; m_nFontIndex = m_nOrgHeight = m_nOrgAscent = 0; m_nProportionalWidth =100; m_bSmallCapsPercentage66 = false; }
+ sal_uInt16 GetPropWidth() const { return m_nProportionalWidth; }
+};
+
+enum class SwFontScript
+{
+ Latin, CJK, CTL, LAST = CTL
+};
+
+// mostly used as a "unknown script" marker
+#define SW_SCRIPTS (SwFontScript(int(SwFontScript::LAST)+1))
+
+/// To take Asian or other languages into consideration, an SwFont object consists of 3 SwSubFonts
+/// (Latin, CJK, and CTL). The m_nActual member indicates the current script, i.e. the currently
+/// active subfont.
+class SwFont
+{
+ // CJK == Chinese, Japanese, Korean
+ // CTL == Complex text layout ( Hebrew, Arabic )
+ o3tl::enumarray<SwFontScript, SwSubFont> m_aSub; // Latin-, CJK- and CTL-font
+
+ std::optional<Color>
+ mxBackColor; // background color (i.e. at character styles)
+ Color m_aHighlightColor; // highlight color
+ Color m_aUnderColor; // color of the underlining
+ Color m_aOverColor; // color of the overlining
+
+ // character borders
+ std::optional<editeng::SvxBorderLine> m_aTopBorder;
+ std::optional<editeng::SvxBorderLine> m_aBottomBorder;
+ std::optional<editeng::SvxBorderLine> m_aRightBorder;
+ std::optional<editeng::SvxBorderLine> m_aLeftBorder;
+
+ // border distance
+ sal_uInt16 m_nTopBorderDist;
+ sal_uInt16 m_nBottomBorderDist;
+ sal_uInt16 m_nRightBorderDist;
+ sal_uInt16 m_nLeftBorderDist;
+
+ Color m_aShadowColor;
+ sal_uInt16 m_nShadowWidth;
+ SvxShadowLocation m_aShadowLocation;
+
+ sal_uInt8 m_nToxCount; // counts the nesting depth of the Tox
+ sal_uInt8 m_nRefCount; // counts the nesting depth of the Refs
+ sal_uInt8 m_nMetaCount; // count META/METAFIELD
+ sal_uInt8 m_nContentControlCount; // count CONTENTCONTROL
+ sal_uInt8 m_nInputFieldCount; // count INPUTFIELD
+
+ SwFontScript m_nActual; // actual font (Latin, CJK or CTL)
+
+ // switch for the font-extensions
+ bool m_bPaintBlank :1; // blanks not with DrawRect
+ bool m_bFontChg :1;
+ bool m_bOrgChg :1; // nOrgHeight/Ascent are invalid
+ bool m_bGreyWave :1; // for the extended TextInput: gray waveline
+
+public:
+ SwFont( const SwAttrSet* pSet, const IDocumentSettingAccess* pIDocumentSettingAccess );
+ SwFont( const SwFont& rFont );
+
+ void ChgFnt( SwViewShell const *pSh, OutputDevice& rOut )
+ { m_bPaintBlank = m_aSub[m_nActual].ChgFnt( pSh, rOut ); }
+
+ ~SwFont();
+
+ SwFont& operator=( const SwFont &rFont );
+
+ SwFontScript GetActual() const { return m_nActual; }
+ inline void SetActual( SwFontScript nNew );
+ const SvxFont& GetActualFont() const { return m_aSub[m_nActual]; }
+
+ // gets a font cache id via SwFntAccess
+ void AllocFontCacheId( SwViewShell const *pSh, SwFontScript nWhich );
+ // set background color
+ void SetBackColor( std::optional<Color> xNewColor );
+ const std::optional<Color>& GetBackColor() const{ return mxBackColor; }
+ void SetHighlightColor( const Color& aNewColor );
+ const Color& GetHighlightColor() const { return m_aHighlightColor; }
+
+ void CheckFontCacheId( SwViewShell const *pSh, SwFontScript nWhich )
+ { if( !m_aSub[ nWhich ].m_nFontCacheId ) AllocFontCacheId( pSh, nWhich ); }
+ void GetFontCacheId( const void* &rnFontCacheId, sal_uInt16 &rIdx, SwFontScript nWhich )
+ { rnFontCacheId = m_aSub[nWhich].m_nFontCacheId; rIdx = m_aSub[nWhich].m_nFontIndex; }
+ void SetFontCacheId( const void* nNewFontCacheId, const sal_uInt16 nIdx, SwFontScript nWhich )
+ { m_aSub[nWhich].m_nFontCacheId = nNewFontCacheId; m_aSub[nWhich].m_nFontIndex = nIdx; }
+ bool DifferentFontCacheId( const SwFont* pFnt, SwFontScript nWhich )
+ { return m_aSub[nWhich].m_nFontCacheId != pFnt->m_aSub[nWhich].m_nFontCacheId ||
+ !m_aSub[nWhich].m_nFontCacheId || !pFnt->m_aSub[nWhich].m_nFontCacheId; }
+
+ const Size &GetSize( SwFontScript nWhich ) const
+ { return m_aSub[nWhich].m_aSize; }
+ bool IsFntChg() const { return m_bFontChg; }
+ void SetFntChg( const bool bNew ) { m_bFontChg = bNew; }
+
+ // the encapsulated SV-Font-methods (set bFntChg to true)
+ inline void SetColor( const Color& rColor );
+ inline void SetFillColor( const Color& rColor );
+ inline void SetAlign( const TextAlign eAlign );
+ inline void SetUnderline( const FontLineStyle eUnderline );
+ void SetUnderColor( const Color &rColor ) { m_aUnderColor = rColor; }
+ inline void SetOverline( const FontLineStyle eOverline );
+ void SetOverColor( const Color &rColor ) { m_aOverColor = rColor; }
+ inline void SetStrikeout( const FontStrikeout eStrikeout );
+ inline void SetOutline( const bool bOutline );
+ void SetVertical(Degree10 nDir, const bool bVertLayout = false,
+ const bool bVertLayoutLRBT = false);
+ inline void SetShadow( const bool bShadow );
+ inline void SetAutoKern( FontKerning nAutoKern );
+ inline void SetTransparent( const bool bTrans );
+ inline void SetWordLineMode( const bool bWordLineMode );
+ inline void SetFixKerning( const short nNewKern );
+ inline void SetCaseMap( const SvxCaseMap eNew );
+ inline void SetEmphasisMark( const FontEmphasisMark eValue );
+
+ // methods for sub-/superscript
+ inline void SetEscapement( const short nNewEsc );
+ inline void SetProportion( const sal_uInt8 nNewPropr );
+
+ inline void SetPropWidth( const sal_uInt16 nNew );
+
+ inline void SetFamily( const FontFamily eFamily, const SwFontScript nWhich );
+ inline void SetName( const OUString& rName, const SwFontScript nWhich );
+ inline void SetStyleName( const OUString& rStyleName, const SwFontScript nWhich );
+ inline void SetSize( const Size& rSize, const SwFontScript nWhich );
+ inline void SetWeight( const FontWeight eWeight, const SwFontScript nWhich );
+ inline void SetItalic( const FontItalic eItalic, const SwFontScript nWhich );
+ inline void SetLanguage( LanguageType eNewLang, const SwFontScript nWhich );
+ inline void SetCharSet( const rtl_TextEncoding eCharSet, const SwFontScript nWhich );
+ inline void SetPitch( const FontPitch ePitch, const SwFontScript nWhich );
+ inline void SetRelief( const FontRelief eNew );
+
+ // Get/Set-methods for the current setting
+ sal_uInt8 &GetTox() { return m_nToxCount; }
+ bool IsTox() const { return ( 0 != m_nToxCount ); }
+ sal_uInt8 &GetRef() { return m_nRefCount; }
+ bool IsRef() const { return ( 0 != m_nRefCount ); }
+ sal_uInt8 &GetMeta() { return m_nMetaCount; }
+ bool IsMeta() const { return (0 != m_nMetaCount); }
+ sal_uInt8& GetContentControl() { return m_nContentControlCount; }
+ bool IsContentControl() const { return m_nContentControlCount != 0; }
+ sal_uInt8 &GetInputField() { return m_nInputFieldCount; }
+ bool IsInputField() const { return (0 != m_nInputFieldCount); }
+ inline void SetGreyWave( const bool bNew );
+ bool IsGreyWave() const { return m_bGreyWave; }
+ bool IsPaintBlank() const { return m_bPaintBlank; }
+
+ // setting of the base class font for SwTextCharFormat
+ void SetDiffFnt( const SfxItemSet* pSet,
+ const IDocumentSettingAccess* pIDocumentSettingAccess );
+
+ const SvxFont &GetFnt( const SwFontScript nWhich ) const
+ { return m_aSub[nWhich]; };
+
+ bool IsSymbol( SwViewShell const *pSh )
+ { return m_aSub[m_nActual].IsSymbol( pSh ); }
+ FontLineStyle GetUnderline() const { return m_aSub[m_nActual].GetUnderline(); }
+ const Color& GetUnderColor() const { return m_aUnderColor; }
+ FontLineStyle GetOverline() const { return m_aSub[m_nActual].GetOverline(); }
+ const Color& GetOverColor() const { return m_aOverColor; }
+ FontStrikeout GetStrikeout() const { return m_aSub[m_nActual].GetStrikeout(); }
+ const Color& GetColor() const { return m_aSub[m_nActual].GetColor(); }
+ bool IsWordLineMode() const { return m_aSub[m_nActual].IsWordLineMode(); }
+ short GetEscapement() const { return m_aSub[m_nActual].GetEscapement(); }
+ SvxCaseMap GetCaseMap() const { return m_aSub[m_nActual].GetCaseMap(); }
+ sal_uInt8 GetPropr() const { return m_aSub[m_nActual].GetPropr(); }
+ FontItalic GetItalic() const { return m_aSub[m_nActual].GetItalic(); }
+ LanguageType GetLanguage() const { return m_aSub[m_nActual].GetLanguage(); }
+ tools::Long GetHeight() const { return m_aSub[m_nActual].GetFontSize().Height(); }
+ FontWeight GetWeight() const { return m_aSub[m_nActual].GetWeight(); }
+ FontEmphasisMark GetEmphasisMark() const
+ { return m_aSub[m_nActual].GetEmphasisMark(); }
+ Degree10 GetOrientation(const bool bVertLayout = false,
+ const bool bVertFormatLRBT = false) const;
+
+ const OUString& GetName( const SwFontScript nWhich ) const
+ { return m_aSub[nWhich].GetFamilyName(); }
+ LanguageType GetLanguage( const SwFontScript nWhich ) const
+ { return m_aSub[nWhich].GetLanguage(); }
+ rtl_TextEncoding GetCharSet( const SwFontScript nWhich ) const
+ { return m_aSub[nWhich].GetCharSet(); }
+ tools::Long GetHeight( const SwFontScript nWhich ) const
+ { return m_aSub[nWhich].GetFontSize().Height(); }
+
+ // makes the logical font be effective in the OutputDevice
+ void ChgPhysFnt( SwViewShell const *pSh, OutputDevice& rOut );
+
+ TextFrameIndex GetCapitalBreak( SwViewShell const* pSh, const OutputDevice* pOut,
+ const SwScriptInfo* pScript, const OUString& rText,
+ tools::Long nTextWidth, TextFrameIndex nIdx, TextFrameIndex nLen);
+
+ void DoOnCapitals( SwDoCapitals &rDo )
+ { m_aSub[m_nActual].DoOnCapitals( rDo ); }
+
+ Size GetTextSize_( SwDrawTextInfo& rInf )
+ { rInf.SetFont( this ); return m_aSub[m_nActual].GetTextSize_( rInf ); }
+
+ TextFrameIndex GetTextBreak( SwDrawTextInfo const & rInf, tools::Long nTextWidth );
+
+ TextFrameIndex GetModelPositionForViewPoint_( SwDrawTextInfo& rInf )
+ { return m_aSub[m_nActual].GetModelPositionForViewPoint_( rInf ); }
+
+ void DrawText_( SwDrawTextInfo &rInf )
+ { m_aSub[m_nActual].DrawText_( rInf, IsGreyWave() ); }
+
+ void DrawStretchText_( SwDrawTextInfo &rInf )
+ { m_aSub[m_nActual].DrawStretchText_( rInf ); }
+
+ short CheckKerning()
+ { return m_aSub[m_nActual].CheckKerning(); }
+
+ sal_uInt16 GetAscent( SwViewShell const *pSh, const OutputDevice& rOut )
+ { return m_aSub[m_nActual].GetAscent( pSh, rOut ); }
+ sal_uInt16 GetHeight( SwViewShell const *pSh, const OutputDevice& rOut )
+ { return m_aSub[m_nActual].GetHeight( pSh, rOut ); }
+
+ sal_uInt16 GetHangingBaseline( SwViewShell const *pSh, const OutputDevice& rOut )
+ { return m_nActual == SwFontScript::CTL ? m_aSub[m_nActual].GetHangingBaseline( pSh, rOut ) : 0; }
+
+ void Invalidate()
+ { m_bFontChg = m_bOrgChg = true; }
+
+ void SetTopBorder( const editeng::SvxBorderLine* pTopBorder );
+ void SetBottomBorder( const editeng::SvxBorderLine* pBottomBorder );
+ void SetRightBorder( const editeng::SvxBorderLine* pRightBorder );
+ void SetLeftBorder( const editeng::SvxBorderLine* pLeftBorder );
+
+ const std::optional<editeng::SvxBorderLine>& GetTopBorder() const { return m_aTopBorder; }
+ const std::optional<editeng::SvxBorderLine>& GetBottomBorder() const { return m_aBottomBorder; }
+ const std::optional<editeng::SvxBorderLine>& GetRightBorder() const { return m_aRightBorder; }
+ const std::optional<editeng::SvxBorderLine>& GetLeftBorder() const { return m_aLeftBorder; }
+
+ // Get absolute border correspond to the layout verticality and orientation.
+ const std::optional<editeng::SvxBorderLine>&
+ GetAbsTopBorder(const bool bVertLayout, const bool bVertLayoutLRBT) const;
+ const std::optional<editeng::SvxBorderLine>&
+ GetAbsBottomBorder(const bool bVertLayout, const bool bVertLayoutLRBT) const;
+ const std::optional<editeng::SvxBorderLine>&
+ GetAbsRightBorder(const bool bVertLayout, const bool bVertLayoutLRBT) const;
+ const std::optional<editeng::SvxBorderLine>&
+ GetAbsLeftBorder(const bool bVertLayout, const bool bVertLayoutLRBT) const;
+
+ void SetTopBorderDist( const sal_uInt16 nTopDist );
+ void SetBottomBorderDist( const sal_uInt16 nBottomDist );
+ void SetRightBorderDist( const sal_uInt16 nRightDist );
+ void SetLeftBorderDist( const sal_uInt16 nLeftDist );
+
+ sal_uInt16 GetTopBorderDist() const { return m_nTopBorderDist; }
+ sal_uInt16 GetBottomBorderDist() const { return m_nBottomBorderDist; }
+ sal_uInt16 GetRightBorderDist() const { return m_nRightBorderDist; }
+ sal_uInt16 GetLeftBorderDist() const { return m_nLeftBorderDist; }
+
+ // Return with the whole space which border holed (border width, spacing and shadow width)
+ sal_uInt16 GetTopBorderSpace() const;
+ sal_uInt16 GetBottomBorderSpace() const;
+ sal_uInt16 GetRightBorderSpace() const;
+ sal_uInt16 GetLeftBorderSpace() const;
+
+ /// Check whether font has any border on any side
+ bool HasBorder() const;
+
+ void SetShadowColor( const Color& rColor );
+ void SetShadowWidth( const sal_uInt16 nWidth );
+ void SetShadowLocation( const SvxShadowLocation aLocation );
+
+ const Color& GetShadowColor() const { return m_aShadowColor; }
+ sal_uInt16 GetShadowWidth() const { return m_nShadowWidth; }
+ SvxShadowLocation GetShadowLocation() const { return m_aShadowLocation; }
+
+ /**
+ * Get the absolute shadow location dependent from orientation.
+ *
+ * @param[in] bVertLayout true, if the container layout is vertical
+ * false, otherwise
+ * @param[in] bVertLayoutLRBT true if the container layout is vertical
+ * (bottom to top, left to right), false otherwise
+ * @return absolute location
+ **/
+ SvxShadowLocation GetAbsShadowLocation(const bool bVertLayout,
+ const bool bVertLayoutLRBT) const;
+
+ /**
+ * Calculate the shadow space on the specified side dependent from
+ * the orientation and connection with neighbours.
+ * @see shaditem.hxx for integer constants of sides
+ *
+ * @param[in] nShadow specify the side
+ * @param[in] bVertLayout true, if the container layout is vertical
+ * false, otherwise
+ * @param[in] bVertLayoutLRBT true if the container layout is vertical
+ * (bottom to top, left to right), false otherwise
+ * @param[in] bSkipLeft relative left shadow space is skipped
+ * @param[in] bSkipRight relative right shadow space is skipped
+ * @return the shadow space
+ **/
+ sal_uInt16 CalcShadowSpace(
+ const SvxShadowItemSide nShadow, const bool bVertLayout, const bool bVertLayoutLRBT,
+ const bool bSkipLeft, const bool bSkipRight ) const;
+
+ void dumpAsXml( xmlTextWriterPtr writer ) const;
+};
+
+inline void SwFont::SetColor( const Color& rColor )
+{
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].SetColor( rColor );
+ m_aSub[SwFontScript::CJK].SetColor( rColor );
+ m_aSub[SwFontScript::CTL].SetColor( rColor );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetColor( const Color& rColor )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetColor( rColor );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetFillColor( const Color& rColor )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetFillColor( rColor );
+}
+
+inline void SwFont::SetFillColor( const Color& rColor )
+{
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].SetFillColor( rColor );
+ m_aSub[SwFontScript::CJK].SetFillColor( rColor );
+ m_aSub[SwFontScript::CTL].SetFillColor( rColor );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetFamily( const FontFamily eFamily )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetFamily( eFamily );
+}
+
+inline void SwFont::SetFamily( const FontFamily eFamily, const SwFontScript nWhich )
+{
+ m_bFontChg = true;
+ m_aSub[nWhich].SetFamily( eFamily );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetName( const OUString& rName )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetFamilyName( rName );
+}
+
+inline void SwFont::SetName( const OUString& rName, const SwFontScript nWhich )
+{
+ m_bFontChg = true;
+ m_aSub[nWhich].SetName( rName );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetStyleName( const OUString& rStyleName )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetStyleName( rStyleName );
+}
+
+inline void SwFont::SetStyleName( const OUString& rStyle, const SwFontScript nWhich )
+{
+ m_bFontChg = true;
+ m_aSub[nWhich].SetStyleName( rStyle );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetCharSet( const rtl_TextEncoding eCharSet )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetCharSet( eCharSet );
+}
+
+inline void SwFont::SetCharSet( const rtl_TextEncoding eCharSet, const SwFontScript nWhich )
+{
+ m_bFontChg = true;
+ m_aSub[nWhich].SetCharSet( eCharSet );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetPitch( const FontPitch ePitch )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetPitch( ePitch );
+}
+
+// encapsulated SV-Font-method
+inline void SwFont::SetPitch( const FontPitch ePitch, const SwFontScript nWhich )
+{
+ m_bFontChg = true;
+ m_aSub[nWhich].SetPitch( ePitch );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetAlign( const TextAlign eAlign )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetAlignment( eAlign );
+}
+
+inline void SwFont::SetAlign( const TextAlign eAlign )
+{
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].SetAlign( eAlign );
+ m_aSub[SwFontScript::CJK].SetAlign( eAlign );
+ m_aSub[SwFontScript::CTL].SetAlign( eAlign );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetWeight( const FontWeight eWeight )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetWeight( eWeight );
+}
+
+inline void SwFont::SetWeight( const FontWeight eWeight, const SwFontScript nWhich )
+{
+ m_bFontChg = true;
+ m_aSub[nWhich].SetWeight( eWeight );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetUnderline( const FontLineStyle eUnderline )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetUnderline( eUnderline );
+}
+
+inline void SwFont::SetUnderline( const FontLineStyle eUnderline )
+{
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].SetUnderline( eUnderline );
+ m_aSub[SwFontScript::CJK].SetUnderline( eUnderline );
+ m_aSub[SwFontScript::CTL].SetUnderline( eUnderline );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetOverline( const FontLineStyle eOverline )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetOverline( eOverline );
+}
+
+inline void SwFont::SetOverline( const FontLineStyle eOverline )
+{
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].SetOverline( eOverline );
+ m_aSub[SwFontScript::CJK].SetOverline( eOverline );
+ m_aSub[SwFontScript::CTL].SetOverline( eOverline );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetStrikeout( const FontStrikeout eStrikeout )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetStrikeout( eStrikeout );
+}
+
+inline void SwFont::SetStrikeout( const FontStrikeout eStrikeout )
+{
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].SetStrikeout( eStrikeout );
+ m_aSub[SwFontScript::CJK].SetStrikeout( eStrikeout );
+ m_aSub[SwFontScript::CTL].SetStrikeout( eStrikeout );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetItalic( const FontItalic eItalic )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetItalic( eItalic );
+}
+
+inline void SwFont::SetItalic( const FontItalic eItalic, const SwFontScript nWhich )
+{
+ m_bFontChg = true;
+ m_aSub[nWhich].SetItalic( eItalic );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetOutline( const bool bOutline )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetOutline( bOutline );
+}
+
+inline void SwFont::SetOutline( const bool bOutline )
+{
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].SetOutline( bOutline );
+ m_aSub[SwFontScript::CJK].SetOutline( bOutline );
+ m_aSub[SwFontScript::CTL].SetOutline( bOutline );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetShadow( const bool bShadow )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetShadow( bShadow );
+}
+
+inline void SwFont::SetShadow( const bool bShadow )
+{
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].SetShadow( bShadow );
+ m_aSub[SwFontScript::CJK].SetShadow( bShadow );
+ m_aSub[SwFontScript::CTL].SetShadow( bShadow );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetAutoKern( FontKerning nAutoKern )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetKerning( nAutoKern );
+}
+
+inline void SwFont::SetAutoKern( FontKerning nAutoKern )
+{
+ m_bFontChg = true;
+ m_aSub[SwFontScript::CJK].SetAutoKern( nAutoKern );
+ if( nAutoKern != FontKerning::NONE )
+ nAutoKern = FontKerning::FontSpecific;
+ m_aSub[SwFontScript::Latin].SetAutoKern( nAutoKern );
+ m_aSub[SwFontScript::CTL].SetAutoKern( nAutoKern );
+}
+
+inline void SwFont::SetTransparent( const bool bTrans )
+{
+ m_aSub[SwFontScript::Latin].SetTransparent( bTrans );
+ m_aSub[SwFontScript::CJK].SetTransparent( bTrans );
+ m_aSub[SwFontScript::CTL].SetTransparent( bTrans );
+}
+
+inline void SwFont::SetFixKerning( const short nNewKern )
+{
+ m_aSub[SwFontScript::Latin].SetFixKerning( nNewKern );
+ m_aSub[SwFontScript::CJK].SetFixKerning( nNewKern );
+ m_aSub[SwFontScript::CTL].SetFixKerning( nNewKern );
+}
+
+inline void SwFont::SetCaseMap( const SvxCaseMap eNew )
+{
+ m_aSub[SwFontScript::Latin].SetCaseMap( eNew );
+ m_aSub[SwFontScript::CJK].SetCaseMap( eNew );
+ m_aSub[SwFontScript::CTL].SetCaseMap( eNew );
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetWordLineMode( const bool bWordLineMode )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetWordLineMode( bWordLineMode );
+}
+
+inline void SwFont::SetWordLineMode( const bool bWordLineMode )
+{
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].SetWordLineMode( bWordLineMode );
+ m_aSub[SwFontScript::CJK].SetWordLineMode( bWordLineMode );
+ m_aSub[SwFontScript::CTL].SetWordLineMode( bWordLineMode );
+}
+// encapsulated SV-Font-method
+inline void SwSubFont::SetEmphasisMark( const FontEmphasisMark eValue )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetEmphasisMark( eValue );
+}
+
+inline void SwFont::SetEmphasisMark( const FontEmphasisMark eValue )
+{
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].SetEmphasisMark( eValue );
+ m_aSub[SwFontScript::CJK].SetEmphasisMark( eValue );
+ m_aSub[SwFontScript::CTL].SetEmphasisMark( eValue );
+}
+
+inline void SwFont::SetPropWidth( const sal_uInt16 nNew )
+{
+ if( nNew != m_aSub[SwFontScript::Latin].GetPropWidth() )
+ {
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].SetPropWidth( nNew );
+ m_aSub[SwFontScript::CJK].SetPropWidth( nNew );
+ m_aSub[SwFontScript::CTL].SetPropWidth( nNew );
+ }
+}
+
+// encapsulated SV-Font-method
+inline void SwSubFont::SetRelief( const FontRelief eNew )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetRelief( eNew );
+}
+
+inline void SwFont::SetRelief( const FontRelief eNew )
+{
+ if( eNew != m_aSub[SwFontScript::Latin].GetRelief() )
+ {
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].SetRelief( eNew );
+ m_aSub[SwFontScript::CJK].SetRelief( eNew );
+ m_aSub[SwFontScript::CTL].SetRelief( eNew );
+ }
+}
+
+// overloaded font-method
+inline void SwSubFont::SetSize( const Size& rSize )
+{
+ m_aSize = rSize;
+ if ( GetPropr() == 100 )
+ Font::SetFontSize( m_aSize );
+ else
+ {
+ Font::SetFontSize( Size(
+ m_aSize.Width() * GetPropr() / 100,
+ m_aSize.Height() * GetPropr() / 100 ) );
+ }
+ m_nFontCacheId = nullptr;
+}
+
+inline void SwFont::SetSize( const Size& rSize, const SwFontScript nWhich )
+{
+ if( m_aSub[nWhich].m_aSize != rSize )
+ {
+ m_aSub[nWhich].SetSize( rSize );
+ m_bFontChg = true;
+ m_bOrgChg = true;
+ }
+}
+
+inline void SwFont::SetActual( SwFontScript nNew )
+{
+ if ( m_nActual != nNew )
+ {
+ m_bFontChg = true;
+ m_bOrgChg = true;
+ m_nActual = nNew;
+ }
+}
+
+inline void SwSubFont::SetProportion( const sal_uInt8 nNewPropr )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetFontSize( Size( m_aSize.Width() * nNewPropr / 100,
+ m_aSize.Height() * nNewPropr / 100 ) );
+ SvxFont::SetPropr( nNewPropr );
+}
+
+inline void SwFont::SetProportion( const sal_uInt8 nNewPropr )
+{
+ if( nNewPropr != m_aSub[SwFontScript::Latin].GetPropr() )
+ {
+ m_bFontChg = true;
+ m_bOrgChg = true;
+
+ m_aSub[SwFontScript::Latin].SetProportion( nNewPropr );
+ m_aSub[SwFontScript::CJK].SetProportion( nNewPropr );
+ m_aSub[SwFontScript::CTL].SetProportion( nNewPropr );
+ }
+}
+
+inline void SwSubFont::SetEscapement( const short nNewEsc )
+{
+ m_nFontCacheId = nullptr;
+ SvxFont::SetEscapement( nNewEsc );
+}
+
+inline void SwFont::SetEscapement( const short nNewEsc )
+{
+ if( nNewEsc != m_aSub[SwFontScript::Latin].GetEscapement() )
+ {
+ // these have to be set, otherwise nOrgHeight and nOrgAscent will not
+ // be calculated
+ m_bFontChg = true;
+ m_bOrgChg = true;
+
+ m_aSub[SwFontScript::Latin].SetEscapement( nNewEsc );
+ m_aSub[SwFontScript::CJK].SetEscapement( nNewEsc );
+ m_aSub[SwFontScript::CTL].SetEscapement( nNewEsc );
+ }
+}
+
+inline void SwSubFont::SetLanguage( LanguageType eNewLang )
+{
+ m_nFontCacheId = nullptr;
+ if( eNewLang == LANGUAGE_SYSTEM )
+ eNewLang = GetAppLanguage();
+ SvxFont::SetLanguage( eNewLang );
+}
+
+inline void SwFont::SetLanguage( const LanguageType eNewLang, const SwFontScript nWhich )
+{
+ m_aSub[nWhich].SetLanguage( eNewLang );
+ if( SwFontScript::CJK == nWhich )
+ {
+ m_aSub[SwFontScript::Latin].SetCJKContextLanguage( eNewLang );
+ m_aSub[SwFontScript::CJK].SetCJKContextLanguage( eNewLang );
+ m_aSub[SwFontScript::CTL].SetCJKContextLanguage( eNewLang );
+ }
+}
+
+inline void SwFont::SetGreyWave( const bool bNew )
+{
+ m_bGreyWave = bNew;
+}
+
+inline void SwSubFont::SetVertical( const Degree10 nDir, const bool bVertFormat )
+{
+ m_nFontCacheId = nullptr;
+ Font::SetVertical( bVertFormat );
+ Font::SetOrientation( nDir );
+}
+
+inline void SwFont::SetTopBorderDist( const sal_uInt16 nTopDist )
+{
+ m_nTopBorderDist = nTopDist;
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].m_nFontCacheId = m_aSub[SwFontScript::CJK].m_nFontCacheId = m_aSub[SwFontScript::CTL].m_nFontCacheId = nullptr;
+}
+
+inline void SwFont::SetBottomBorderDist( const sal_uInt16 nBottomDist )
+{
+ m_nBottomBorderDist = nBottomDist;
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].m_nFontCacheId = m_aSub[SwFontScript::CJK].m_nFontCacheId = m_aSub[SwFontScript::CTL].m_nFontCacheId = nullptr;
+}
+
+inline void SwFont::SetRightBorderDist( const sal_uInt16 nRightDist )
+{
+ m_nRightBorderDist = nRightDist;
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].m_nFontCacheId = m_aSub[SwFontScript::CJK].m_nFontCacheId = m_aSub[SwFontScript::CTL].m_nFontCacheId = nullptr;
+}
+
+inline void SwFont::SetLeftBorderDist( const sal_uInt16 nLeftDist )
+{
+ m_nLeftBorderDist = nLeftDist;
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].m_nFontCacheId = m_aSub[SwFontScript::CJK].m_nFontCacheId = m_aSub[SwFontScript::CTL].m_nFontCacheId = nullptr;
+}
+
+inline sal_uInt16 SwFont::GetTopBorderSpace() const
+{
+ sal_uInt16 nRet = 0;
+ if( m_aTopBorder )
+ {
+ nRet += m_aTopBorder->GetScaledWidth() + m_nTopBorderDist;
+ }
+ if( m_aShadowLocation == SvxShadowLocation::TopLeft ||
+ m_aShadowLocation == SvxShadowLocation::TopRight )
+ {
+ nRet += m_nShadowWidth;
+ }
+ return nRet;
+}
+
+inline sal_uInt16 SwFont::GetBottomBorderSpace() const
+{
+ sal_uInt16 nRet = 0;
+ if( m_aBottomBorder )
+ {
+ nRet += m_aBottomBorder->GetScaledWidth() + m_nBottomBorderDist;
+ }
+ if( m_aShadowLocation == SvxShadowLocation::BottomLeft ||
+ m_aShadowLocation == SvxShadowLocation::BottomRight )
+ {
+ nRet += m_nShadowWidth;
+ }
+ return nRet;
+}
+
+inline sal_uInt16 SwFont::GetRightBorderSpace() const
+{
+ sal_uInt16 nRet = 0;
+ if( m_aRightBorder )
+ {
+ nRet += m_aRightBorder->GetScaledWidth() + m_nRightBorderDist;
+ }
+ if( m_aShadowLocation == SvxShadowLocation::TopRight ||
+ m_aShadowLocation == SvxShadowLocation::BottomRight )
+ {
+ nRet += m_nShadowWidth;
+ }
+ return nRet;
+}
+
+inline sal_uInt16 SwFont::GetLeftBorderSpace() const
+{
+ sal_uInt16 nRet = 0;
+ if( m_aLeftBorder )
+ {
+ nRet += m_aLeftBorder->GetScaledWidth() + m_nLeftBorderDist;
+ }
+ if( m_aShadowLocation == SvxShadowLocation::TopLeft ||
+ m_aShadowLocation == SvxShadowLocation::BottomLeft )
+ {
+ nRet += m_nShadowWidth;
+ }
+ return nRet;
+}
+
+inline bool SwFont::HasBorder() const
+{
+ return m_aTopBorder || m_aBottomBorder || m_aLeftBorder || m_aRightBorder;
+}
+
+inline void SwFont::SetShadowColor( const Color& rColor )
+{
+ m_aShadowColor = rColor;
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].m_nFontCacheId = m_aSub[SwFontScript::CJK].m_nFontCacheId = m_aSub[SwFontScript::CTL].m_nFontCacheId = nullptr;
+}
+
+inline void SwFont::SetShadowWidth( const sal_uInt16 nWidth )
+{
+ m_nShadowWidth = nWidth;
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].m_nFontCacheId = m_aSub[SwFontScript::CJK].m_nFontCacheId = m_aSub[SwFontScript::CTL].m_nFontCacheId = nullptr;
+}
+
+inline void SwFont::SetShadowLocation( const SvxShadowLocation aLocation )
+{
+ m_aShadowLocation = aLocation;
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].m_nFontCacheId = m_aSub[SwFontScript::CJK].m_nFontCacheId = m_aSub[SwFontScript::CTL].m_nFontCacheId = nullptr;
+}
+
+inline void SwFont::SetHighlightColor( const Color& aNewColor )
+{
+ m_aHighlightColor = aNewColor;
+ m_bFontChg = true;
+ m_aSub[SwFontScript::Latin].m_nFontCacheId = m_aSub[SwFontScript::CJK].m_nFontCacheId = m_aSub[SwFontScript::CTL].m_nFontCacheId = nullptr;
+}
+
+// Used for the "continuous underline" feature.
+class SwUnderlineFont
+{
+ Point m_aPos;
+ TextFrameIndex m_nEnd;
+ std::unique_ptr<SwFont> m_pFont;
+
+public:
+ // sets the font which should paint the common baseline,
+ // index where continuous underline ends,
+ // and the starting point of the common baseline
+ SwUnderlineFont(SwFont& rFnt, TextFrameIndex nEnd, const Point& rPoint);
+ ~SwUnderlineFont();
+
+ SwFont& GetFont()
+ {
+ OSL_ENSURE( m_pFont, "No underline font" );
+ return *m_pFont;
+ }
+ const Point& GetPos() const { return m_aPos; }
+ TextFrameIndex GetEnd() const { return m_nEnd; }
+ // the x coordinate of the starting point has to be set for each portion
+ void SetPos( const Point& rPoint ) { m_aPos = rPoint; }
+};
+
+#ifdef DBG_UTIL
+
+class SvStatistics
+{
+public:
+ sal_uInt16 nGetTextSize;
+ sal_uInt16 nDrawText;
+ sal_uInt16 nGetStretchTextSize;
+ sal_uInt16 nDrawStretchText;
+ sal_uInt16 nChangeFont;
+
+ SvStatistics()
+ { nGetTextSize = nDrawText = nGetStretchTextSize = nDrawStretchText = nChangeFont = 0; }
+};
+
+// global variable, implemented in swfont.cxx
+extern SvStatistics g_SvStat;
+
+#define SV_STAT(nWhich) ++(g_SvStat.nWhich);
+
+
+#else
+#define SV_STAT(nWhich)
+#endif /* DBG_UTIL */
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/swselectionlist.hxx b/sw/source/core/inc/swselectionlist.hxx
new file mode 100644
index 0000000000..9eb3903211
--- /dev/null
+++ b/sw/source/core/inc/swselectionlist.hxx
@@ -0,0 +1,91 @@
+/* -*- 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_SWSELECTIONLIST_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SWSELECTIONLIST_HXX
+
+#include <list>
+
+class SwPaM;
+class SwFrame;
+
+/** This class is used as parameter for creation of a block cursor selection
+
+ This class will be created by a block cursor. Its responsibility is
+ to collect a group of selected text portions which are part of a common
+ context.
+ Definition of context:
+ A page header is a context.
+ A page footer is a context.
+ A footnote is a context.
+ Every fly frame builds a context together with its linked colleagues.
+ The content of the page bodies builds a context.
+*/
+
+class SwSelectionList
+{
+ std::list<SwPaM*> m_aList; // container for the selected text portions
+ const SwFrame* m_pContext; // the context of these text portions
+public:
+ /** Ctor to create an empty list for a given context
+
+ @param pInitCxt
+ The frame (normally a SwTextFrame) where the block cursor selection starts,
+ it will be used to get the allowed context for the text selections.
+ */
+ explicit SwSelectionList(const SwFrame* pInitCxt);
+
+ /** Start of the container for the selected text portions
+ */
+ std::list<SwPaM*>::iterator getStart() { return m_aList.begin(); }
+
+ /** End of the container for the selected text portions
+ */
+ std::list<SwPaM*>::iterator getEnd() { return m_aList.end(); }
+
+ /** Adds a text portion to the selection list
+
+ @param pPam
+ represents a text portion to select
+ */
+ void insertPaM(SwPaM* pPam) { m_aList.push_front(pPam); }
+
+ /** Reports if the list does not contain any text portion
+
+ @return true, if list is empty
+ */
+ bool isEmpty() const { return m_aList.empty(); }
+
+ /** Checks if the context of the list is equal to the context of the frame
+
+ If the list does not have already a context, the context of the frame
+ will define the list's context.
+ If the list has already a context, it will be compared to the context of
+ the given frame.
+
+ @param pCheck
+ The frame to check
+
+ @return true, if the context of the frame is equal to the one of the list
+ */
+ bool checkContext(const SwFrame* pCheck);
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_SWSELECTIONLIST_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/swthreadjoiner.hxx b/sw/source/core/inc/swthreadjoiner.hxx
new file mode 100644
index 0000000000..18e1e11930
--- /dev/null
+++ b/sw/source/core/inc/swthreadjoiner.hxx
@@ -0,0 +1,42 @@
+/* -*- 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_SWTHREADJOINER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SWTHREADJOINER_HXX
+
+#include <sal/types.h>
+
+namespace com::sun::star::uno
+{
+template <class interface_type> class Reference;
+}
+namespace com::sun::star::util
+{
+class XJobManager;
+}
+
+/** Testing */
+namespace SwThreadJoiner
+{
+css::uno::Reference<css::util::XJobManager>& GetThreadJoiner();
+
+void ReleaseThreadJoiner();
+}
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/swthreadmanager.hxx b/sw/source/core/inc/swthreadmanager.hxx
new file mode 100644
index 0000000000..6c478aec85
--- /dev/null
+++ b/sw/source/core/inc/swthreadmanager.hxx
@@ -0,0 +1,78 @@
+/* -*- 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_SWTHREADMANAGER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_SWTHREADMANAGER_HXX
+
+#include <osl/interlck.h>
+
+#include <memory>
+
+namespace rtl { template <class reference_type> class Reference; }
+
+class ObservableThread;
+class ThreadManager;
+
+/** class to manage threads in Writer using a <ThreadManager> instance
+
+ #i73788#
+ Conforms the singleton pattern
+*/
+class SwThreadManager
+{
+ public:
+
+ static SwThreadManager& GetThreadManager();
+
+ static bool ExistsThreadManager();
+
+ // private: don't call!
+ SwThreadManager();
+ // private: don't call!
+ ~SwThreadManager();
+
+ oslInterlockedCount AddThread( const rtl::Reference< ObservableThread >& rThread );
+
+ void RemoveThread( const oslInterlockedCount nThreadID );
+
+ /** suspend the starting of threads
+
+ Suspending the starting of further threads is sensible during the
+ destruction of a Writer document.
+ */
+ void SuspendStartingOfThreads();
+
+ /** continues the starting of threads after it has been suspended
+ */
+ void ResumeStartingOfThreads();
+
+ bool StartingOfThreadsSuspended();
+
+ private:
+
+ SwThreadManager(SwThreadManager const&) = delete;
+ SwThreadManager& operator=(SwThreadManager const&) = delete;
+
+ static bool sbThreadManagerInstantiated;
+
+ std::unique_ptr<ThreadManager> mpThreadManagerImpl;
+
+};
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/tabfrm.hxx b/sw/source/core/inc/tabfrm.hxx
new file mode 100644
index 0000000000..08020de734
--- /dev/null
+++ b/sw/source/core/inc/tabfrm.hxx
@@ -0,0 +1,265 @@
+/* -*- 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_TABFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_TABFRM_HXX
+
+#include <swdllapi.h>
+
+#include "layfrm.hxx"
+#include "flowfrm.hxx"
+
+class SwTable;
+class SwBorderAttrs;
+class SwAttrSetChg;
+
+enum class SwTabFrameInvFlags : sal_uInt8
+{
+ NONE = 0x00,
+ InvalidatePrt = 0x02,
+ InvalidateIndNextPrt = 0x04,
+ InvalidatePrevPrt = 0x08,
+ SetIndNextCompletePaint = 0x10,
+ InvalidateBrowseWidth = 0x20,
+ InvalidatePos = 0x40,
+ InvalidateNextPos = 0x80,
+};
+
+namespace o3tl {
+ template<> struct typed_flags<SwTabFrameInvFlags> : is_typed_flags<SwTabFrameInvFlags, 0xfe> {};
+}
+
+/// SwTabFrame is one table in the document layout, containing rows (which contain cells).
+class SW_DLLPUBLIC SwTabFrame final: public SwLayoutFrame, public SwFlowFrame
+{
+ friend void CalcContent( SwLayoutFrame *pLay, bool bNoColl );
+
+ // does the special treatment for Get_[Next|Prev]Leaf()
+ using SwFrame::GetLeaf;
+
+ SwTable * m_pTable;
+
+ bool m_bComplete :1; /// Set entries for Repaint without needing to
+ /// set the base class' CompletePaint
+ /// With that we would want to avoid unnecessary
+ /// table repaints
+ bool m_bCalcLowers :1; /// For stability of the content in MakeAll
+ bool m_bLowersFormatted :1; /// Communication between MakeAll and Layact
+ bool m_bLockBackMove :1; /// The Master took care of the BackMove test
+ bool m_bWantBackMove :1; /// Table wants to move back but was locked
+ bool m_bResizeHTMLTable :1; /// Call the Resize of the HTMLTableLayout in the MakeAll
+ /// This is an optimization, so that we don't have to call
+ /// it in ContentFrame::Grow; there it might be called for
+ /// _every_ Cell
+
+ bool m_bONECalcLowers :1; /// Primarily for the StarONE SS
+ /// The Contents are formatted via Calc() on MakeAll in any
+ /// case. There are no further invalidations and that path can
+ /// hardly give any guarantees
+
+ bool m_bHasFollowFlowLine :1; /// Means that the first line in the follow
+ /// is indented to contain content from a broken
+ /// cell
+ bool m_bIsRebuildLastLine :1; /// Means that currently the last line of the
+ /// TabFrame is rebuilt. In this case we do not
+ // want any notification to the master table
+
+ bool m_bRestrictTableGrowth :1; // Usually, the table may grow infinitely,
+ // as the table can be split in SwTabFrame::MakeAll
+ // In MakeAll, this flag is set to indicate that
+ // the table may only grow inside its upper. This
+ // is necessary, in order to let the text flow into
+ // the FollowFlowLine
+
+ bool m_bRemoveFollowFlowLinePending :1;
+
+ // #i26945#
+ bool m_bConsiderObjsForMinCellHeight :1; // Usually, the floating screen objects
+ // are considered during the calculation
+ // for the minimal cell height.
+ // For the splitting table rows algorithm
+ // we need not to consider floating
+ // screen object for the preparation
+ // of the re-calculation of the
+ // last table row.
+ // #i26945#
+ bool m_bObjsDoesFit :1; // For splitting table rows algorithm, this boolean
+ // indicates, if the floating screen objects fits
+
+ bool m_bInRecalcLowerRow : 1;
+
+ /**
+ * Split() splits the Frame at the specified position: a Follow is
+ * created and constructed and inserted directly after this.
+ * Join() gets the Follow's content and destroys it.
+ */
+ bool Split(const SwTwips nCutPos, bool bTryToSplit, bool bTableRowKeep, bool & rIsFootnoteGrowth);
+ void Join();
+
+ void UpdateAttr_(
+ const SfxPoolItem*,
+ const SfxPoolItem*, SwTabFrameInvFlags &,
+ SwAttrSetChg *pa = nullptr,
+ SwAttrSetChg *pb = nullptr );
+ void Invalidate(SwTabFrameInvFlags);
+ void HandleTableHeadlineChange();
+
+ virtual bool ShouldBwdMoved( SwLayoutFrame *pNewUpper, bool &rReformat ) override;
+
+ virtual void DestroyImpl() override;
+ virtual ~SwTabFrame() override;
+
+ virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
+ virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override;
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+ // only changes the Framesize, not the PrtArea size
+ virtual SwTwips GrowFrame ( SwTwips, bool bTst = false, bool bInfo = false ) override;
+ virtual const SwTabFrame* DynCastTabFrame() const override { return this; }
+
+public:
+ SwTabFrame( SwTable &, SwFrame* ); // calling RegistFlys always after creation _and_pasting!
+ SwTabFrame( SwTabFrame & ); // _only_ for the creation of follows
+
+ void JoinAndDelFollows(); // for DelFrames of the TableNodes!
+
+ // calls thr RegistFlys of the rows
+ void RegistFlys();
+
+ inline const SwTabFrame *GetFollow() const;
+ inline SwTabFrame *GetFollow();
+ SwTabFrame* FindMaster( bool bFirstMaster = false ) const;
+
+ virtual void PaintSwFrame( vcl::RenderContext& rRenderContext, SwRect const&,
+ SwPrintData const*const pPrintData = nullptr ) const override;
+ virtual void CheckDirection( bool bVert ) override;
+
+ virtual void Cut() override;
+ virtual void Paste( SwFrame* pParent, SwFrame* pSibling = nullptr ) override;
+
+ virtual bool Prepare( const PrepareHint ePrep = PrepareHint::Clear,
+ const void *pVoid = nullptr, bool bNotify = true ) override;
+
+ SwFrame *FindLastContentOrTable();
+ inline const SwFrame *FindLastContentOrTable() const;
+ SwContentFrame *FindLastContent();
+ inline const SwContentFrame *FindLastContent() const;
+
+ const SwTable *GetTable() const { return m_pTable; }
+ SwTable *GetTable() { return m_pTable; }
+
+ bool IsComplete() const { return m_bComplete; }
+ void SetComplete() { m_bComplete = true; }
+ void ResetComplete() { m_bComplete = false; }
+
+ bool IsLowersFormatted() const { return m_bLowersFormatted; }
+ void SetLowersFormatted(bool b) { m_bLowersFormatted = b; }
+
+ void SetCalcLowers() { m_bCalcLowers = true; } // use rarely
+ void SetResizeHTMLTable() { m_bResizeHTMLTable = true; } // same
+ void SetONECalcLowers() { m_bONECalcLowers = true; }
+
+ // Start: New stuff for breaking table rows
+
+ bool HasFollowFlowLine() const { return m_bHasFollowFlowLine; }
+ void SetFollowFlowLine(bool bNew) { m_bHasFollowFlowLine = bNew; }
+
+ bool IsRebuildLastLine() const { return m_bIsRebuildLastLine; }
+ void SetRebuildLastLine(bool bNew) { m_bIsRebuildLastLine = bNew; }
+
+ bool IsRestrictTableGrowth() const { return m_bRestrictTableGrowth; }
+ void SetRestrictTableGrowth( bool bNew ) { m_bRestrictTableGrowth = bNew; }
+
+ bool IsRemoveFollowFlowLinePending() const { return m_bRemoveFollowFlowLinePending; }
+ void SetRemoveFollowFlowLinePending(bool bNew) { m_bRemoveFollowFlowLinePending = bNew; }
+
+ bool IsInRecalcLowerRow() const
+ {
+ return m_bInRecalcLowerRow;
+ }
+ void SetInRecalcLowerRow( bool bNew )
+ {
+ m_bInRecalcLowerRow = bNew;
+ }
+
+ // #i26945#
+ bool IsConsiderObjsForMinCellHeight() const
+ {
+ return m_bConsiderObjsForMinCellHeight;
+ }
+ void SetConsiderObjsForMinCellHeight(bool const bConsiderObjsForMinCellHeight)
+ {
+ m_bConsiderObjsForMinCellHeight = bConsiderObjsForMinCellHeight;
+ }
+
+ // #i26945#
+ bool DoesObjsFit() const
+ {
+ return m_bObjsDoesFit;
+ }
+ void SetDoesObjsFit(bool const bObjsDoesFit)
+ {
+ m_bObjsDoesFit = bObjsDoesFit;
+ }
+
+ bool RemoveFollowFlowLine();
+
+ // End: New stuff for breaking table rows
+
+ bool CalcFlyOffsets(
+ SwTwips& rUpper,
+ tools::Long& rLeftOffset,
+ tools::Long& rRightOffset,
+ SwTwips * pSpaceBelowBottom) const;
+
+ SwTwips CalcHeightOfFirstContentLine() const;
+
+ bool IsInHeadline( const SwFrame& rFrame ) const;
+ SwRowFrame* GetFirstNonHeadlineRow() const;
+
+ bool IsLayoutSplitAllowed() const;
+
+ // #i29550#
+ bool IsCollapsingBorders() const;
+
+ sal_uInt16 GetBottomLineSize() const;
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+};
+
+inline const SwFrame *SwTabFrame::FindLastContentOrTable() const
+{
+ return const_cast<SwTabFrame*>(this)->FindLastContentOrTable();
+}
+
+inline const SwContentFrame *SwTabFrame::FindLastContent() const
+{
+ return const_cast<SwTabFrame*>(this)->FindLastContent();
+}
+
+inline const SwTabFrame *SwTabFrame::GetFollow() const
+{
+ return static_cast<const SwTabFrame*>(SwFlowFrame::GetFollow());
+}
+inline SwTabFrame *SwTabFrame::GetFollow()
+{
+ return static_cast<SwTabFrame*>(SwFlowFrame::GetFollow());
+}
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_TABFRM_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/tblrwcl.hxx b/sw/source/core/inc/tblrwcl.hxx
new file mode 100644
index 0000000000..9cd6fa3eb2
--- /dev/null
+++ b/sw/source/core/inc/tblrwcl.hxx
@@ -0,0 +1,197 @@
+/* -*- 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_TBLRWCL_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_TBLRWCL_HXX
+
+#include <cstddef>
+#include <vector>
+
+#include <swtypes.hxx>
+#include <swtable.hxx>
+
+namespace editeng { class SvxBorderLine; }
+
+class SwDoc;
+class SwTableNode;
+class SwTableBoxFormat;
+class SwHistory;
+class SwContentNode;
+class SfxPoolItem;
+class SwShareBoxFormats;
+class SwFormatFrameSize;
+
+void sw_LineSetHeadCondColl( const SwTableLine* pLine );
+
+#ifdef DBG_UTIL
+void CheckBoxWidth( const SwTableLine& rLine, SwTwips nSize );
+#endif
+
+void InsTableBox( SwDoc& rDoc, SwTableNode* pTableNd,
+ SwTableLine* pLine, SwTableBoxFormat* pBoxFrameFormat,
+ SwTableBox* pBox, sal_uInt16 nInsPos, sal_uInt16 nCnt = 1 );
+
+void DeleteBox_( SwTable& rTable, SwTableBox* pBox, SwUndo* pUndo,
+ bool bCalcNewSize, const bool bCorrBorder,
+ SwShareBoxFormats* pShareFormats = nullptr );
+
+/**
+ * Class for SplitTable
+ * Collects the uppermost or lowermost Lines of a Box from a Line in an array.
+ * We also store their positions.
+ *
+ * @see implementation in ndtbl.cxx
+ */
+class SwCollectTableLineBoxes
+{
+ std::vector<sal_uInt16> m_aPositionArr;
+ std::vector<SwTableBox*> m_Boxes;
+ SwHistory* m_pHistory;
+ SplitTable_HeadlineOption m_nMode;
+ sal_uInt16 m_nWidth;
+ bool m_bGetFromTop : 1;
+ bool m_bGetValues : 1;
+
+public:
+ SwCollectTableLineBoxes( bool bTop, SplitTable_HeadlineOption nMd = SplitTable_HeadlineOption::NONE, SwHistory* pHist=nullptr )
+ :
+ m_pHistory( pHist ), m_nMode( nMd ), m_nWidth( 0 ),
+ m_bGetFromTop( bTop ), m_bGetValues( true )
+
+ {}
+
+ void AddBox( const SwTableBox& rBox );
+ const SwTableBox* GetBoxOfPos( const SwTableBox& rBox );
+ void AddToUndoHistory( const SwContentNode& rNd );
+
+ size_t Count() const { return m_Boxes.size(); }
+ const SwTableBox& GetBox( std::size_t nPos, sal_uInt16* pWidth = nullptr ) const
+ {
+ // We need the EndPos of the column here!
+ if( pWidth )
+ *pWidth = (nPos+1 == m_aPositionArr.size()) ? m_nWidth
+ : m_aPositionArr[ nPos+1 ];
+ return *m_Boxes[ nPos ];
+ }
+
+ bool IsGetFromTop() const { return m_bGetFromTop; }
+ bool IsGetValues() const { return m_bGetValues; }
+
+ SplitTable_HeadlineOption GetMode() const { return m_nMode; }
+ void SetValues( bool bFlag ) { m_bGetValues = false; m_nWidth = 0;
+ m_bGetFromTop = bFlag; }
+ bool Resize( sal_uInt16 nOffset, sal_uInt16 nWidth );
+};
+
+void sw_Box_CollectBox( const SwTableBox* pBox, SwCollectTableLineBoxes* pSplPara );
+bool sw_Line_CollectBox( const SwTableLine*& rpLine, void* pPara );
+
+void sw_BoxSetSplitBoxFormats( SwTableBox* pBox, SwCollectTableLineBoxes* pSplPara );
+
+/**
+ * This structure is needed by Undo to restore row span attributes
+ * when a table has been split into two tables
+ */
+struct SwSaveRowSpan
+{
+ sal_uInt16 mnSplitLine; // the line number where the table has been split
+ std::vector< tools::Long > mnRowSpans; // the row span attributes in this line
+ SwSaveRowSpan( SwTableBoxes& rBoxes, sal_uInt16 nSplitLn );
+};
+
+struct SwGCLineBorder
+{
+ const SwTableLines* pLines;
+ SwShareBoxFormats* pShareFormats;
+ sal_uInt16 nLinePos;
+
+ SwGCLineBorder( const SwTable& rTable )
+ : pLines( &rTable.GetTabLines() ), pShareFormats(nullptr), nLinePos( 0 ) {}
+
+ SwGCLineBorder( const SwTableBox& rBox )
+ : pLines( &rBox.GetTabLines() ), pShareFormats(nullptr), nLinePos( 0 ) {}
+ bool IsLastLine() const { return nLinePos + 1 >= o3tl::narrowing<sal_uInt16>(pLines->size()); }
+};
+
+class SwGCBorder_BoxBrd
+{
+ const editeng::SvxBorderLine* m_pBorderLine;
+ bool m_bAnyBorderFind;
+public:
+ SwGCBorder_BoxBrd() : m_pBorderLine( nullptr ), m_bAnyBorderFind( false ) {}
+
+ void SetBorder( const editeng::SvxBorderLine& rBorderLine )
+ { m_pBorderLine = &rBorderLine; m_bAnyBorderFind = false; }
+
+ /**
+ * Check whether the left Border is the same as the set one
+ * @returns false if no Border was set
+ */
+ bool CheckLeftBorderOfFormat( const SwFrameFormat& rFormat );
+
+ bool IsAnyBorderFound() const { return m_bAnyBorderFind; }
+};
+
+void sw_GC_Line_Border( const SwTableLine* pLine, SwGCLineBorder* pGCPara );
+
+class SwShareBoxFormat
+{
+ const SwFrameFormat* m_pOldFormat;
+ std::vector<SwFrameFormat*> m_aNewFormats;
+
+public:
+ SwShareBoxFormat( const SwFrameFormat& rFormat )
+ : m_pOldFormat( &rFormat )
+ {}
+
+ const SwFrameFormat& GetOldFormat() const { return *m_pOldFormat; }
+
+ SwFrameFormat* GetFormat( tools::Long nWidth ) const;
+ SwFrameFormat* GetFormat( const SfxPoolItem& rItem ) const;
+ void AddFormat( SwFrameFormat& rFormat );
+ /// @returns true, if we can delete
+ bool RemoveFormat( const SwFrameFormat& rFormat );
+};
+
+class SwShareBoxFormats
+{
+ std::vector<SwShareBoxFormat> m_ShareArr;
+
+ bool Seek_Entry( const SwFrameFormat& rFormat, sal_uInt16* pPos ) const;
+
+ void ChangeFrameFormat( SwTableBox* pBox, SwTableLine* pLn, SwFrameFormat& rFormat );
+
+public:
+ SwShareBoxFormats() {}
+ ~SwShareBoxFormats();
+
+ SwFrameFormat* GetFormat( const SwFrameFormat& rFormat, tools::Long nWidth ) const;
+ SwFrameFormat* GetFormat( const SwFrameFormat& rFormat, const SfxPoolItem& ) const;
+
+ void AddFormat( const SwFrameFormat& rOld, SwFrameFormat& rNew );
+
+ void SetSize( SwTableBox& rBox, const SwFormatFrameSize& rSz );
+ void SetAttr( SwTableBox& rBox, const SfxPoolItem& rItem );
+ void SetAttr( SwTableLine& rLine, const SfxPoolItem& rItem );
+
+ void RemoveFormat( const SwFrameFormat& rFormat );
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/textapi.hxx b/sw/source/core/inc/textapi.hxx
new file mode 100644
index 0000000000..ec0395cbbd
--- /dev/null
+++ b/sw/source/core/inc/textapi.hxx
@@ -0,0 +1,66 @@
+/* -*- 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_TEXTAPI_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_TEXTAPI_HXX
+
+#include <editeng/unoedsrc.hxx>
+#include <editeng/unotext.hxx>
+#include <editeng/outlobj.hxx>
+
+class SwDoc;
+
+struct SwTextAPIEditSource_Impl;
+class SwTextAPIEditSource final : public SvxEditSource
+{
+ SwTextAPIEditSource_Impl* m_pImpl;
+
+ void EnsureOutliner();
+ virtual std::unique_ptr<SvxEditSource> Clone() const override;
+ virtual SvxTextForwarder* GetTextForwarder() override;
+ virtual void UpdateData() override;
+ explicit SwTextAPIEditSource( const SwTextAPIEditSource& rSource );
+
+public:
+ SwTextAPIEditSource(SwDoc* pDoc);
+ virtual ~SwTextAPIEditSource() override;
+
+ void Dispose();
+ void SetText( OutlinerParaObject const & rText );
+ void SetString( const OUString& rText );
+ std::optional<OutlinerParaObject> CreateText();
+ OUString GetText() const;
+};
+
+class SwTextAPIObject final : public SvxUnoText
+{
+ std::unique_ptr<SwTextAPIEditSource> m_pSource;
+public:
+ SwTextAPIObject( std::unique_ptr<SwTextAPIEditSource> p);
+ virtual ~SwTextAPIObject() noexcept override;
+ void DisposeEditSource() { m_pSource->Dispose(); }
+ std::optional<OutlinerParaObject> CreateText() { return m_pSource->CreateText(); }
+ void SetString( const OUString& rText ) { m_pSource->SetString( rText ); }
+ void SetText( OutlinerParaObject const & rText ) { m_pSource->SetText( rText ); }
+ OUString GetText() const { return m_pSource->GetText(); }
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/threadlistener.hxx b/sw/source/core/inc/threadlistener.hxx
new file mode 100644
index 0000000000..071de465cc
--- /dev/null
+++ b/sw/source/core/inc/threadlistener.hxx
@@ -0,0 +1,55 @@
+/* -*- 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_THREADLISTENER_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_THREADLISTENER_HXX
+
+#include "ifinishedthreadlistener.hxx"
+
+class ThreadManager;
+class ObservableThread;
+
+/** helper class to observe threads
+
+ OD 2007-03-30 #i73788#
+ An instance of this class can be used to observe a thread in order to
+ be notified, if the thread has finished its work. The notification is
+ directly forward to its owner - an instance of ThreadManager
+ Note:
+ - A thread can only have one or none listener.
+ - The notification is performed via the ThreadID
+*/
+class ThreadListener final : public IFinishedThreadListener
+{
+ public:
+
+ ThreadListener( ThreadManager& rThreadListenerOwner );
+ virtual ~ThreadListener() override;
+
+ void ListenToThread( const oslInterlockedCount nThreadID,
+ ObservableThread& rThread );
+
+ virtual void NotifyAboutFinishedThread( const oslInterlockedCount nThreadID ) override;
+
+ private:
+
+ ThreadManager& mrThreadListenerOwner;
+};
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/tocntntanchoredobjectposition.hxx b/sw/source/core/inc/tocntntanchoredobjectposition.hxx
new file mode 100644
index 0000000000..54fdecc589
--- /dev/null
+++ b/sw/source/core/inc/tocntntanchoredobjectposition.hxx
@@ -0,0 +1,93 @@
+/* -*- 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_TOCNTNTANCHOREDOBJECTPOSITION_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_TOCNTNTANCHOREDOBJECTPOSITION_HXX
+#include "anchoredobjectposition.hxx"
+
+class SwFrame;
+class SwTextFrame;
+class SwLayoutFrame;
+class SwRect;
+
+namespace objectpositioning
+{
+ class SwToContentAnchoredObjectPosition final : public SwAnchoredObjectPosition
+ {
+ private:
+ // calculated data for object position
+ const SwLayoutFrame* mpVertPosOrientFrame;
+ // #i26791#
+ // determine offset to frame anchor position according to the
+ // positioning alignments
+ Point maOffsetToFrameAnchorPos;
+
+ // data for calculation of position
+ bool mbAnchorToChar;
+ const SwFrame* mpToCharOrientFrame;
+ const SwRect* mpToCharRect;
+ SwTwips mnToCharTopOfLine;
+
+ virtual bool IsAnchoredToChar() const override;
+ virtual const SwFrame* ToCharOrientFrame() const override;
+ virtual const SwRect* ToCharRect() const override;
+ // #i22341#
+ virtual SwTwips ToCharTopOfLine() const override;
+
+ // method to cast <SwAnchoredObjectPosition::GetAnchorFrame()> to
+ // the needed type
+ SwTextFrame& GetAnchorTextFrame() const;
+
+ /** determine frame for horizontal position
+
+ if the given proposed frame is a content frame, the proposed
+ frame is returned.
+ otherwise (given proposed frame is a layout frame),
+ the lower content frames of the proposed frame are checked
+ for the first, that the anchor or a follow of the anchor.
+ If none is found, the proposed frame is returned.
+
+ @param _pProposedFrame
+ input parameter - proposed frame for horizontal position
+
+ @return constant reference to <SwFrame> object, at which the
+ horizontal position is determined.
+ */
+ const SwFrame& GetHoriVirtualAnchor( const SwLayoutFrame& _pProposedFrame ) const;
+
+ public:
+ SwToContentAnchoredObjectPosition( SdrObject& _rDrawObj );
+ virtual ~SwToContentAnchoredObjectPosition() override;
+
+ /** calculate position of object
+ */
+ virtual void CalcPosition() override;
+
+ /** frame, at which the vertical position is oriented at
+ */
+ const SwLayoutFrame& GetVertPosOrientFrame() const { return *mpVertPosOrientFrame;}
+
+ /// In case overlap is not allowed, re-position the current object.
+ void CalcOverlap(const SwTextFrame* pAnchorFrameForVertPos, Point& rRelPos,
+ const SwTwips nTopOfAnch);
+ };
+} // namespace objectpositioning
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/tolayoutanchoredobjectposition.hxx b/sw/source/core/inc/tolayoutanchoredobjectposition.hxx
new file mode 100644
index 0000000000..256e7378d8
--- /dev/null
+++ b/sw/source/core/inc/tolayoutanchoredobjectposition.hxx
@@ -0,0 +1,52 @@
+/* -*- 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_TOLAYOUTANCHOREDOBJECTPOSITION_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_TOLAYOUTANCHOREDOBJECTPOSITION_HXX
+#include "anchoredobjectposition.hxx"
+
+namespace objectpositioning
+{
+ class SwToLayoutAnchoredObjectPosition final : public SwAnchoredObjectPosition
+ {
+ private:
+ // calculated data for object position type TO_LAYOUT
+ Point maRelPos;
+
+ // #i26791#
+ // determine offset to frame anchor position according to the
+ // positioning alignments
+ Point maOffsetToFrameAnchorPos;
+
+ public:
+ SwToLayoutAnchoredObjectPosition( SdrObject& _rDrawObj );
+ virtual ~SwToLayoutAnchoredObjectPosition() override;
+
+ /** calculate position for object
+ */
+ virtual void CalcPosition() override;
+
+ /** calculated relative position for object
+ */
+ const Point& GetRelPos() const { return maRelPos;}
+ };
+} // namespace objectpositioning
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/txmsrt.hxx b/sw/source/core/inc/txmsrt.hxx
new file mode 100644
index 0000000000..324f88a90f
--- /dev/null
+++ b/sw/source/core/inc/txmsrt.hxx
@@ -0,0 +1,310 @@
+/* -*- 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_TXMSRT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_TXMSRT_HXX
+
+#include <i18nlangtag/lang.h>
+#include <unotools/charclass.hxx>
+#include <nodeoffset.hxx>
+#include <tox.hxx>
+
+#include <com/sun/star/lang/Locale.hpp>
+#include <optional>
+#include <utility>
+
+class SwContentNode;
+class SwTextNode;
+class SwTextTOXMark;
+class SwContentIndex;
+class SwFormatField;
+class SwRootFrame;
+class IndexEntrySupplierWrapper;
+
+enum TOXSortType
+{
+ TOX_SORT_INDEX,
+ TOX_SORT_CUSTOM,
+ TOX_SORT_CONTENT,
+ TOX_SORT_PARA,
+ TOX_SORT_TABLE,
+ TOX_SORT_AUTHORITY
+};
+
+struct SwTOXSource
+{
+ const SwContentNode* pNd;
+ sal_Int32 nPos;
+ bool bMainEntry;
+
+ SwTOXSource( const SwContentNode* pNode, sal_Int32 n, bool bMain )
+ : pNd(pNode), nPos(n), bMainEntry(bMain)
+ {
+ }
+};
+
+struct TextAndReading
+{
+ OUString sText;
+ OUString sReading;
+
+ TextAndReading() {}
+
+ TextAndReading(OUString aText, OUString aReading)
+ : sText(std::move(aText))
+ , sReading(std::move(aReading))
+ {}
+};
+
+class SwTOXInternational
+{
+ std::unique_ptr<IndexEntrySupplierWrapper> m_pIndexWrapper;
+ std::optional<CharClass> m_oCharClass;
+ LanguageType m_eLang;
+ OUString m_sSortAlgorithm;
+ SwTOIOptions m_nOptions;
+
+ void Init();
+
+public:
+ SwTOXInternational( LanguageType nLang, SwTOIOptions nOptions,
+ OUString aSortAlgorithm );
+ SwTOXInternational( const SwTOXInternational& );
+ ~SwTOXInternational();
+
+ sal_Int32 Compare( const TextAndReading& rTaR1,
+ const css::lang::Locale& rLocale1,
+ const TextAndReading& rTaR2,
+ const css::lang::Locale& rLocale2 ) const;
+
+ bool IsEqual( const TextAndReading& rTaR1,
+ const css::lang::Locale& rLocale1,
+ const TextAndReading& rTaR2,
+ const css::lang::Locale& rLocale2 ) const
+ {
+ return 0 == Compare( rTaR1, rLocale1, rTaR2, rLocale2 );
+ }
+
+ bool IsLess( const TextAndReading& rTaR1,
+ const css::lang::Locale& rLocale1,
+ const TextAndReading& rTaR2,
+ const css::lang::Locale& rLocale2 ) const
+ {
+ return -1 == Compare( rTaR1, rLocale1, rTaR2, rLocale2 );
+ }
+
+ OUString GetIndexKey( const TextAndReading& rTaR,
+ const css::lang::Locale& rLcl ) const;
+
+ OUString GetFollowingText( bool bMorePages ) const;
+
+ OUString ToUpper( const OUString& rStr, sal_Int32 nPos ) const;
+ bool IsNumeric( const OUString& rStr ) const;
+};
+
+/**
+ * Class for sorting directories
+ */
+struct SwTOXSortTabBase
+{
+ bool operator==(const SwTOXSortTabBase&) const = delete;
+ bool operator<(const SwTOXSortTabBase&) const = delete;
+
+ std::vector<SwTOXSource> aTOXSources;
+ css::lang::Locale aLocale;
+ const SwTextNode* pTOXNd;
+ const SwTextTOXMark* pTextMark;
+ const SwTOXInternational* pTOXIntl;
+ SwNodeOffset nPos;
+ sal_Int32 nCntPos;
+ sal_uInt16 nType;
+ static SwTOIOptions nOpt;
+
+ SwTOXSortTabBase( TOXSortType nType,
+ const SwContentNode* pTOXSrc,
+ const SwTextTOXMark* pTextMark,
+ const SwTOXInternational* pIntl,
+ const css::lang::Locale* pLocale = nullptr );
+ virtual ~SwTOXSortTabBase() {}
+
+ sal_uInt16 GetType() const { return nType; }
+ static SwTOIOptions GetOptions() { return nOpt; }
+
+ virtual void FillText(SwTextNode& rNd, const SwContentIndex& rInsPos,
+ sal_uInt16 nAuthField, SwRootFrame const* pLayout) const;
+ virtual sal_uInt16 GetLevel() const = 0;
+ virtual bool equivalent( const SwTOXSortTabBase& );
+ virtual bool sort_lt( const SwTOXSortTabBase& );
+
+ virtual std::pair<OUString, bool> GetURL(SwRootFrame const*const pLayout) const;
+
+ virtual bool IsFullPara() const;
+
+ // must be called
+ inline void InitText(SwRootFrame const*const pLayout);
+ inline TextAndReading const & GetText() const;
+ inline const css::lang::Locale& GetLocale() const;
+
+private:
+ bool m_bValidText;
+ TextAndReading m_aSort;
+
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const = 0;
+};
+
+inline void SwTOXSortTabBase::InitText(SwRootFrame const*const pLayout)
+{
+ // 'this' is 'SwTOXSortTabBase const*', so the virtual
+ // mechanism will call the derived class' GetText_Impl
+ assert(!m_bValidText);
+ m_aSort = GetText_Impl(pLayout);
+ m_bValidText = true;
+}
+
+inline TextAndReading const & SwTOXSortTabBase::GetText() const
+{
+ assert(m_bValidText);
+ return m_aSort;
+}
+
+inline const css::lang::Locale& SwTOXSortTabBase::GetLocale() const
+{
+ return aLocale;
+}
+
+/**
+ * For sorting by text
+ */
+struct SwTOXIndex final : public SwTOXSortTabBase
+{
+ SwTOXIndex( const SwTextNode&, const SwTextTOXMark*, SwTOIOptions nOptions, sal_uInt8 nKeyLevel,
+ const SwTOXInternational& rIntl,
+ const css::lang::Locale& rLocale );
+
+ virtual void FillText(SwTextNode& rNd, const SwContentIndex& rInsPos,
+ sal_uInt16 nAuthField, SwRootFrame const* pLayout) const override;
+ virtual sal_uInt16 GetLevel() const override;
+ virtual bool equivalent( const SwTOXSortTabBase& ) override;
+ virtual bool sort_lt( const SwTOXSortTabBase& ) override;
+
+private:
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const override;
+
+ sal_uInt8 nKeyLevel;
+};
+
+struct SwTOXCustom final : public SwTOXSortTabBase
+{
+ SwTOXCustom( TextAndReading aKey, sal_uInt16 nLevel,
+ const SwTOXInternational& rIntl,
+ const css::lang::Locale& rLocale );
+
+ virtual sal_uInt16 GetLevel() const override;
+ virtual bool equivalent( const SwTOXSortTabBase& ) override;
+ virtual bool sort_lt( const SwTOXSortTabBase& ) override;
+
+private:
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const override;
+
+ TextAndReading m_aKey;
+ sal_uInt16 nLev;
+};
+
+/**
+ * For sorting by position
+ */
+struct SwTOXContent final : public SwTOXSortTabBase
+{
+ SwTOXContent( const SwTextNode&, const SwTextTOXMark*,
+ const SwTOXInternational& rIntl );
+
+ virtual void FillText(SwTextNode& rNd, const SwContentIndex& rInsPos,
+ sal_uInt16 nAuthField, SwRootFrame const* pLayout) const override;
+ virtual sal_uInt16 GetLevel() const override;
+private:
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const override;
+
+};
+
+struct SwTOXPara final : public SwTOXSortTabBase
+{
+ SwTOXPara(SwContentNode&, SwTOXElement,
+ sal_uInt16 nLevel = FORM_ALPHA_DELIMITER,
+ OUString sSeqName = OUString());
+
+ void SetStartIndex(sal_Int32 nSet) { nStartIndex = nSet; }
+ void SetEndIndex(sal_Int32 nSet) { nEndIndex = nSet; }
+
+ virtual void FillText(SwTextNode& rNd, const SwContentIndex& rInsPos,
+ sal_uInt16 nAuthField, SwRootFrame const* pLayout) const override;
+ virtual sal_uInt16 GetLevel() const override;
+
+ virtual std::pair<OUString, bool> GetURL(SwRootFrame const*const pLayout) const override;
+ virtual bool IsFullPara() const override;
+private:
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const override;
+
+ SwTOXElement eType;
+ sal_uInt16 m_nLevel;
+ sal_Int32 nStartIndex;
+ sal_Int32 nEndIndex;
+ OUString m_sSequenceName;
+};
+
+struct SwTOXTable final : public SwTOXSortTabBase
+{
+ SwTOXTable( const SwContentNode& rNd );
+
+ void SetLevel(sal_uInt16 nSet){nLevel = nSet;}
+
+ virtual sal_uInt16 GetLevel() const override;
+
+ virtual std::pair<OUString, bool> GetURL(SwRootFrame const*const pLayout) const override;
+
+private:
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const override;
+
+ sal_uInt16 nLevel;
+};
+
+/// Represents one row in the bibliography table.
+struct SwTOXAuthority final : public SwTOXSortTabBase
+{
+private:
+ SwFormatField& m_rField;
+ virtual void FillText(SwTextNode& rNd, const SwContentIndex& rInsPos,
+ sal_uInt16 nAuthField, SwRootFrame const* pLayout) const override;
+ virtual TextAndReading GetText_Impl(SwRootFrame const* pLayout) const override;
+
+public:
+ SwTOXAuthority( const SwContentNode& rNd, SwFormatField& rField, const SwTOXInternational& rIntl );
+
+ SwFormatField& GetFieldFormat() {return m_rField;}
+
+ virtual bool equivalent( const SwTOXSortTabBase& ) override;
+ virtual bool sort_lt( const SwTOXSortTabBase& ) override;
+ virtual sal_uInt16 GetLevel() const override;
+ OUString GetText(sal_uInt16 nAuthField, const SwRootFrame* pLayout) const;
+
+ /// Gets the URL of the underlying SwAuthEntry, ignoring its page number.
+ static OUString GetSourceURL(const OUString& rText);
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_TXMSRT_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/txtfly.hxx b/sw/source/core/inc/txtfly.hxx
new file mode 100644
index 0000000000..9047e127e7
--- /dev/null
+++ b/sw/source/core/inc/txtfly.hxx
@@ -0,0 +1,389 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <editeng/txtrange.hxx>
+#include <swtypes.hxx>
+#include <swrect.hxx>
+#include <com/sun/star/text/WrapTextMode.hpp>
+#include <nodeoffset.hxx>
+#include <memory>
+#include <vector>
+
+class OutputDevice;
+class SwPageFrame;
+class SdrObject;
+class SwFormat;
+class SwAnchoredObject;
+class SwTextFrame;
+class SwDrawTextInfo;
+class SwContourCache;
+class SwBreakPortion;
+class SwTextFormatInfo;
+
+typedef std::vector< SwAnchoredObject* > SwAnchoredObjList;
+
+/** Contour-cache global variable, initialized/destroyed in txtinit.cxx
+ and needed in txtfly.cxx by text wrapping.
+ */
+extern SwContourCache *pContourCache;
+
+#define POLY_CNT 20
+#define POLY_MIN 5
+#define POLY_MAX 4000
+
+void ClrContourCache( const SdrObject *pObj );
+
+class SwContourCache
+{
+ friend void ClrContourCache();
+ struct CacheItem
+ {
+ const SdrObject *mpSdrObj;
+ std::unique_ptr<TextRanger> mxTextRanger;
+ };
+ std::vector<CacheItem> mvItems;
+ tools::Long mnPointCount;
+ SwRect ContourRect( const SwFormat* pFormat, const SdrObject* pObj,
+ const SwTextFrame* pFrame, const SwRect &rLine, const tools::Long nXPos,
+ const bool bRight );
+
+public:
+ SwContourCache();
+ ~SwContourCache();
+ const SdrObject* GetObject( sal_uInt16 nPos ) const{ return mvItems[ nPos ].mpSdrObj; }
+ sal_uInt16 GetCount() const { return mvItems.size(); }
+ void ClrObject( sal_uInt16 nPos );
+
+ /**
+ Computes the rectangle that will cover the object in the given line.
+
+ For _non_ contour-flow objects, this is simply the overlap area of
+ BoundRect (including spacing), and the line, for contour-flow,
+ the tools::PolyPolygon of the object gets traversed
+ */
+ static SwRect CalcBoundRect( const SwAnchoredObject* pAnchoredObj,
+ const SwRect &rLine,
+ const SwTextFrame* pFrame,
+ const tools::Long nXPos,
+ const bool bRight );
+};
+
+// MS Word wraps on sides with even less space (value guessed).
+#define TEXT_MIN_SMALL 300
+
+/**
+ The purpose of this class is to be the universal interface between
+ formatting/text output and the possibly overlapping free-flying frames.
+ During formatting the formatter gets the information from SwTextFly, whether
+ a certain area is present by the attributes of an overlapping frame.
+ Such areas are represented by dummy portions.
+
+ The whole text output and touch-up is, again, forwarded to a SwTextFly.
+ This one decides, whether parts of the text need to be clipped and splits
+ the areas for e.g. a DrawRect.
+
+ Please note that all free-flying frames are located in a PtrArray, sorted
+ by TopLeft.
+
+ Internally we always use document-global values. The IN and OUT parameters
+ are, however, adjusted to the needs of the LineIter most of the time. That
+ is: they are converted to frame- and window-local coordinates.
+ If multiple frames with wrap attributes are located on the same line, we get
+ the following settings for the text flow:
+
+ L/R P L R N
+ P -P-P- -P-L -P R- -P N
+ L -L P- -L L -L R- -L N
+ R R-P- R-L R R- R N
+ N N P- N L N R- N N
+
+ (P=parallel, L=left, R=right, N=no wrap)
+
+ We can describe the behaviour as follows:
+ Every frame can push away text, with the restriction that it only has influence
+ until the next frame.
+ */
+class SwTextFly
+{
+ const SwPageFrame * m_pPage;
+ const SwAnchoredObject * mpCurrAnchoredObj;
+ const SwTextFrame * m_pCurrFrame;
+ const SwTextFrame * m_pMaster;
+ std::unique_ptr<SwAnchoredObjList> mpAnchoredObjList;
+
+ tools::Long m_nMinBottom;
+ tools::Long m_nNextTop; /// Stores the upper edge of the "next" frame
+ SwNodeOffset m_nCurrFrameNodeIndex;
+
+ bool m_bOn : 1;
+ bool m_bTopRule: 1;
+ bool mbIgnoreCurrentFrame: 1;
+ bool mbIgnoreContour: 1;
+
+ /** boolean, indicating if objects in page header|footer are considered for
+ text frames not in page header|footer.
+ */
+ bool mbIgnoreObjsInHeaderFooter: 1;
+
+ /**
+ This method will be called during the LineIter formatting
+ \li to compute the position of the next \c FlyPortion
+ \li remember new overlappings after a change of the line height.
+
+ \param[in] rPortion
+ Scope: document global.
+ */
+ SwRect GetFrame_( const SwRect &rPortion ) const;
+
+ SwAnchoredObjList& InitAnchoredObjList();
+
+public:
+ SwAnchoredObjList& GetAnchoredObjList() const;
+private:
+
+ /**
+ Look for the first object which overlaps with the rectangle.
+ Iterates over the anchored object list mpAnchoredObjList.
+ */
+ bool ForEach( const SwRect &rRect, SwRect* pRect, bool bAvoid ) const;
+
+ /**
+ \li There is less than 2cm space on both sides for the text:
+ no surround (css::text::WrapTextMode_NONE)
+
+ \li There is more than 2cm space on only one side:
+ surround on that side (css::text::WrapTextMode_LEFT or css::text::WrapTextMode_RIGHT)
+
+ \li There is more than 2cm space on both sides, the object is
+ larger than 1.5cm: surround on the wider side
+ (css::text::WrapTextMode_LEFT or css::text::WrapTextMode_RIGHT)
+
+ \li There is more than 2cm space on both sides and the object
+ width is less than 1.5cm: both sides surround (css::text::WrapTextMode_PARALLEL)
+ */
+ css::text::WrapTextMode GetSurroundForTextWrap( const SwAnchoredObject* pAnchoredObj ) const;
+
+ /**
+ The right margin is the right margin or it is determined by the
+ next object standing on the line.
+ */
+ void CalcRightMargin( SwRect &rFly,
+ SwAnchoredObjList::size_type nPos,
+ const SwRect &rLine ) const;
+
+ /**
+ The left margin is the left margin of the current PrintArea or
+ it is determined by the last FlyFrame, which stands on the line.
+ */
+ void CalcLeftMargin( SwRect &rFly,
+ SwAnchoredObjList::size_type nPos,
+ const SwRect &rLine ) const;
+
+ /**
+ \return the position in sorted array
+ */
+ SwAnchoredObjList::size_type GetPos( const SwAnchoredObject* pAnchoredObj ) const;
+
+ bool GetTop( const SwAnchoredObject* _pAnchoredObj,
+ const bool bInFootnote,
+ const bool bInFooterOrHeader );
+
+ SwTwips CalcMinBottom() const;
+
+ const SwTextFrame* GetMaster_();
+
+public:
+
+ SwTextFly();
+ SwTextFly( const SwTextFrame *pFrame );
+ SwTextFly( const SwTextFly& rTextFly );
+ ~SwTextFly();
+
+ void CtorInitTextFly( const SwTextFrame *pFrame );
+
+ void SetTopRule();
+
+ SwRect GetFrame( const SwRect &rPortion ) const;
+ bool IsOn() const;
+
+ /**
+ If there is no flying object frame standing in rRect (usually the current row),
+ then we are turning ourself off.
+
+ \param rRect is global to the document!
+ */
+ bool Relax( const SwRect &rRect );
+ bool Relax();
+
+ SwTwips GetMinBottom() const;
+
+ /// Gets the maximum of the fly frame bottoms.
+ SwTwips GetMaxBottom(const SwBreakPortion& rPortion, const SwTextFormatInfo& rInfo) const;
+
+ const SwTextFrame* GetMaster() const;
+
+ // This temporary variable needs to be manipulated in const methods
+ tools::Long GetNextTop() const;
+ void SetNextTop( tools::Long nNew ) const;
+
+ /**
+ Determines the demanded rectangle for an anchored object,
+ considering its surround for text wrapping.
+
+ \param pAnchoredObj the object for which to get the bounds
+ \param rLine the bounds of the line to format
+
+ \return the flying object bounds
+ */
+ SwRect AnchoredObjToRect( const SwAnchoredObject* pAnchoredObj,
+ const SwRect& rRect ) const;
+
+ /**
+ This method is called by DrawText().
+
+ Ensures that the overlapping frames (except the transparent frames) won't
+ be scribbled by setting clip regions so that only the portions that are not
+ in the area of FlyFrames that are opaque and above the current frame will
+ be output.
+
+ DrawText() takes over the on optimization!
+ */
+ void DrawTextOpaque( SwDrawTextInfo &rInf );
+
+ /**
+ Two subtleties needs to be mentioned:
+ \li DrawRect() is allowed over the ClipRects
+ \li FlyToRect() returns bigger values than the frame data
+
+ Ensure that the overlapping frames (except the transparent frames)
+ won't be scribbled
+ */
+ void DrawFlyRect( OutputDevice* pOut, const SwRect &rRect );
+
+ /**
+ Used to switch off the SwTextFly when there is no overlapping object (Relax).
+
+ \param[in] the line area
+ \return whether the line will be overlapped by a frame
+ */
+ bool IsAnyFrame( const SwRect &rLine ) const;
+
+ /**
+ Same as IsAnyFrame(const SwRect&), but uses the current frame print
+ area
+ */
+ bool IsAnyFrame() const;
+
+ /**
+ true when a frame or DrawObj must be taken in account. The optimizations
+ like Paint/FormatEmpty for empty sentences or the virtual OutputDevice can
+ be used only when false is returned.
+
+ \param rRect
+ The rectangle can be empty, the current frame is then used. The value is
+ global to the document.
+ */
+ bool IsAnyObj( const SwRect& rRect ) const;
+
+ void SetIgnoreCurrentFrame( bool bNew );
+ void SetIgnoreContour( bool bNew );
+
+ void SetIgnoreObjsInHeaderFooter( const bool bNew );
+
+ SwRect GetFrameArea() const;
+};
+
+inline SwAnchoredObjList& SwTextFly::GetAnchoredObjList() const
+{
+ return mpAnchoredObjList
+ ? *mpAnchoredObjList
+ : const_cast<SwTextFly*>(this)->InitAnchoredObjList();
+}
+
+inline void SwTextFly::SetTopRule()
+{
+ m_bTopRule = false;
+}
+
+inline bool SwTextFly::IsOn() const
+{
+ return m_bOn;
+}
+
+inline bool SwTextFly::Relax( const SwRect &rRect )
+{
+ if (m_bOn)
+ {
+ m_bOn = IsAnyFrame( rRect );
+ }
+ return m_bOn;
+}
+
+inline bool SwTextFly::Relax()
+{
+ if (m_bOn)
+ {
+ m_bOn = IsAnyFrame();
+ }
+ return m_bOn;
+}
+
+inline SwTwips SwTextFly::GetMinBottom() const
+{
+ return mpAnchoredObjList ? m_nMinBottom : CalcMinBottom();
+}
+
+inline const SwTextFrame* SwTextFly::GetMaster() const
+{
+ return m_pMaster ? m_pMaster : const_cast<SwTextFly*>(this)->GetMaster_();
+}
+
+inline tools::Long SwTextFly::GetNextTop() const
+{
+ return m_nNextTop;
+}
+
+inline void SwTextFly::SetNextTop( tools::Long nNew ) const
+{
+ const_cast<SwTextFly*>(this)->m_nNextTop = nNew;
+}
+
+inline SwRect SwTextFly::GetFrame( const SwRect &rRect ) const
+{
+ return m_bOn ? GetFrame_( rRect ) : SwRect();
+}
+
+inline void SwTextFly::SetIgnoreCurrentFrame( bool bNew )
+{
+ mbIgnoreCurrentFrame = bNew;
+}
+
+inline void SwTextFly::SetIgnoreContour( bool bNew )
+{
+ mbIgnoreContour = bNew;
+}
+
+inline void SwTextFly::SetIgnoreObjsInHeaderFooter( const bool bNew )
+{
+ mbIgnoreObjsInHeaderFooter = bNew;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/txtfrm.hxx b/sw/source/core/inc/txtfrm.hxx
new file mode 100644
index 0000000000..aa2246727f
--- /dev/null
+++ b/sw/source/core/inc/txtfrm.hxx
@@ -0,0 +1,1060 @@
+/* -*- 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_TXTFRM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_TXTFRM_HXX
+
+#include <com/sun/star/uno/Sequence.hxx>
+#include "cntfrm.hxx"
+#include "TextFrameIndex.hxx"
+#include <nodeoffset.hxx>
+
+#include <set>
+#include <utility>
+
+#include <view.hxx>
+
+namespace com::sun::star::linguistic2 { class XHyphenatedWord; }
+
+namespace sw::mark { class IMark; }
+class SwCharRange;
+class SwTextNode;
+class SwTextAttrEnd;
+class SwTextFormatter;
+class SwTextFormatInfo;
+class SwParaPortion;
+class WidowsAndOrphans;
+class SwTextFootnote;
+class SwInterHyphInfo; // Hyphenate()
+class SwCache;
+class SwBorderAttrs;
+class SwFrameFormat;
+struct SwCursorMoveState;
+struct SwFillData;
+class SwPortionHandler;
+class SwScriptInfo;
+enum class ExpandMode;
+class SwTextAttr;
+class SwWrtShell;
+class SwNode;
+class SwFlyAtContentFrame;
+
+#define NON_PRINTING_CHARACTER_COLOR Color(0x26, 0x8b, 0xd2)
+
+/// a clone of SwInterHyphInfo, but with TextFrameIndex instead of node index
+class SwInterHyphInfoTextFrame
+{
+private:
+ /// output: hyphenated word
+ css::uno::Reference<css::linguistic2::XHyphenatedWord> m_xHyphWord;
+public:
+ /// input: requested range to hyphenate
+ TextFrameIndex m_nStart;
+ TextFrameIndex m_nEnd;
+ /// output: found word
+ TextFrameIndex m_nWordStart;
+ TextFrameIndex m_nWordLen;
+
+ SwInterHyphInfoTextFrame(SwTextFrame const& rFrame,
+ SwTextNode const& rNode, SwInterHyphInfo const& rHyphInfo);
+ void UpdateTextNodeHyphInfo(SwTextFrame const& rFrame,
+ SwTextNode const& rNode, SwInterHyphInfo & o_rHyphInfo);
+
+ void SetHyphWord(const css::uno::Reference<css::linguistic2::XHyphenatedWord> &xHW)
+ {
+ m_xHyphWord = xHW;
+ }
+};
+
+namespace sw {
+
+/**
+ * Describes a part of a single text node, which will be part of a text frame,
+ * even when redlines are hidden at a layout level.
+ */
+struct Extent
+{
+ SwTextNode * /*const logically, but need assignment for std::vector*/ pNode;
+ sal_Int32 nStart;
+ sal_Int32 nEnd;
+ Extent(SwTextNode *const p, sal_Int32 const s, sal_Int32 const e)
+ : pNode(p), nStart(s), nEnd(e)
+ {
+ assert(pNode);
+ assert(nStart != nEnd);
+ }
+};
+
+struct MergedPara;
+class InsertText;
+
+std::pair<SwTextNode*, sal_Int32> MapViewToModel(MergedPara const&, TextFrameIndex nIndex);
+TextFrameIndex MapModelToView(MergedPara const&, SwTextNode const* pNode, sal_Int32 nIndex);
+
+// warning: Existing must be used only once; a second use would delete the frame created by the first one...
+enum class FrameMode { New, Existing };
+std::unique_ptr<sw::MergedPara> CheckParaRedlineMerge(SwTextFrame & rFrame, SwTextNode & rTextNode, FrameMode eMode);
+SwTextFrame * MakeTextFrame(SwTextNode & rNode, SwFrame *, sw::FrameMode eMode);
+
+bool FrameContainsNode(SwContentFrame const& rFrame, SwNodeOffset nNodeIndex);
+bool IsParaPropsNode(SwRootFrame const& rLayout, SwTextNode const& rNode);
+SwTextNode * GetParaPropsNode(SwRootFrame const& rLayout, SwNode const& rNode);
+SwPosition GetParaPropsPos(SwRootFrame const& rLayout, SwPosition const& rPos);
+std::pair<SwTextNode *, SwTextNode *>
+GetFirstAndLastNode(SwRootFrame const& rLayout, SwNode const& rPos);
+
+SwTextNode const& GetAttrMerged(SfxItemSet & rFormatSet,
+ SwTextNode const& rNode, SwRootFrame const* pLayout);
+
+void GotoPrevLayoutTextFrame(SwNodeIndex & rIndex, SwRootFrame const* pLayout);
+void GotoNextLayoutTextFrame(SwNodeIndex & rIndex, SwRootFrame const* pLayout);
+
+TextFrameIndex UpdateMergedParaForDelete(MergedPara & rMerged,
+ bool isRealDelete,
+ SwTextNode const& rNode, sal_Int32 nIndex, sal_Int32 nLen);
+
+void MoveMergedFlysAndFootnotes(std::vector<SwTextFrame*> const& rFrames,
+ SwTextNode const& rFirstNode, SwTextNode & rSecondNode, bool);
+
+void MoveDeletedPrevFrames(const SwTextNode & rDeletedPrev, SwTextNode & rNode);
+enum class Recreate { No, ThisNode, Predecessor };
+void CheckResetRedlineMergeFlag(SwTextNode & rNode, Recreate eRecreateMerged);
+
+void UpdateFramesForAddDeleteRedline(SwDoc & rDoc, SwPaM const& rPam);
+void UpdateFramesForRemoveDeleteRedline(SwDoc & rDoc, SwPaM const& rPam);
+
+void AddRemoveFlysAnchoredToFrameStartingAtNode(
+ SwTextFrame & rFrame, SwTextNode & rTextNode,
+ std::set<SwNodeOffset> *pSkipped);
+
+OUString GetExpandTextMerged(SwRootFrame const* pLayout,
+ SwTextNode const& rNode, bool bWithNumber,
+ bool bWithSpacesForLevel, ExpandMode i_mode);
+
+bool IsMarkHidden(SwRootFrame const& rLayout, ::sw::mark::IMark const& rMark);
+bool IsMarkHintHidden(SwRootFrame const& rLayout,
+ SwTextNode const& rNode, SwTextAttrEnd const& rHint);
+
+void RecreateStartTextFrames(SwTextNode & rNode);
+
+sw::InsertText MakeInsertText(SwTextNode& rNode, const sal_Int32 nPos, const sal_Int32 nLen);
+
+/**
+ * Decides if rTextNode has a numbering which has layout-level values (e.g. Arabic, but not
+ * none or bullets).
+ */
+bool HasNumberingWhichNeedsLayoutUpdate(const SwTextNode& rTextNode);
+
+} // namespace sw
+
+/// Represents the visualization of a paragraph. Typical upper is an
+/// SwBodyFrame. The first text portion of the first line is az SwParaPortion.
+class SW_DLLPUBLIC SwTextFrame final : public SwContentFrame
+{
+ friend class SwTextIter;
+ friend class SwTestFormat;
+ friend class WidowsAndOrphans;
+ friend class TextFrameLockGuard; // May Lock()/Unlock()
+ friend bool sw_ChangeOffset(SwTextFrame* pFrame, TextFrameIndex nNew);
+
+ /// SwLineLayout cache: the lines are not actually owned by the SwTextFrame
+ /// but by this SwCache, so they will be deleted in large documents
+ /// if there are too many of them, but the "valid" flags of the frame
+ /// will still be set; GetFormatted() is the function that forces
+ /// recreation of the SwLineLayout by Format() if necessary.
+ static SwCache *s_pTextCache;
+ static constexpr tools::Long nMinPrtLine = 0; // This Line must not be underrun when printing
+ // Hack for table cells stretching multiple pages
+
+ sal_Int32 mnAllLines :24; // Line count for the Paint (including nThisLines)
+ sal_Int32 mnThisLines :8; // Count of Lines of the Frame
+
+ // The x position for flys anchored at this paragraph.
+ // These values are calculated in SwTextFrame::CalcBaseOfstForFly()
+ SwTwips mnFlyAnchorOfst;
+ // The x position for wrap-through flys anchored at this paragraph.
+ SwTwips mnFlyAnchorOfstNoWrap;
+ /// The y position for wrap-through flys anchored at this paragraph.
+ SwTwips mnFlyAnchorVertOfstNoWrap;
+ SwTwips mnFootnoteLine;
+ // OD 2004-03-17 #i11860# - re-factoring of #i11859#
+ // member for height of last line (value needed for proportional line spacing)
+ SwTwips mnHeightOfLastLine;
+ // member for the additional first line offset, which is caused by the list
+ // label alignment for list level position and space mode LABEL_ALIGNMENT.
+ // This additional first line offset is used for the text formatting.
+ // It is NOT used for the determination of printing area.
+ SwTwips mnAdditionalFirstLineOffset;
+
+ /// redline merge data
+ std::unique_ptr<sw::MergedPara> m_pMergedPara;
+
+ TextFrameIndex mnOffset; // Is the offset in the Content (character count)
+
+ sal_uInt16 mnCacheIndex; // Index into the cache, USHRT_MAX if there's definitely no fitting object in the cache
+
+ // Separates the Master and creates a Follow or adjusts the data in the Follow
+ void AdjustFollow_( SwTextFormatter &rLine, TextFrameIndex nOffset,
+ TextFrameIndex nStrEnd, const sal_uInt8 nMode );
+
+ // Iterates all Lines and sets the line spacing using the attribute
+ void CalcLineSpace();
+
+ // Only called in Format
+ void AdjustFrame( const SwTwips nChgHeight, bool bHasToFit = false );
+
+ // Evaluates the Preps in Format()
+ bool CalcPreps();
+ void PrepWidows( const sal_uInt16 nNeed, bool bNotify );
+ void InvalidateRange_( const SwCharRange &, const tools::Long = 0);
+ inline void InvalidateRange( const SwCharRange &, const tools::Long = 0);
+
+ // WidowsAndOrphans, AdjustFrame, AdjustFollow
+ void FormatAdjust( SwTextFormatter &rLine, WidowsAndOrphans &rFrameBreak,
+ TextFrameIndex nStrLen, const bool bDummy );
+ void ChangeOffset( SwTextFrame* pFrame, TextFrameIndex nNew );
+
+ bool mbLocked : 1; // In the Format?
+ bool mbWidow : 1; // Is our follow a Widow?
+ bool mbJustWidow : 1; // Did we just request Widow flag on master?
+ bool mbEmpty : 1; // Are we an empty paragraph?
+ bool mbInFootnoteConnect : 1; // Is in Connect at the moment
+ bool mbFootnote : 1; // Has at least one footnote
+ bool mbRepaint : 1; // TextFrame: Repaint is ready to be fetched
+ /// Contains rotated portions.
+ bool mbHasRotatedPortions : 1;
+ bool mbFieldFollow : 1; // Start with Field rest of the Master
+ bool mbHasAnimation : 1; // Contains animated SwGrfNumPortion
+ bool mbIsSwapped : 1; // during text formatting we swap the
+ // width and height for vertical formatting
+ // OD 14.03.2003 #i11760# - flag to control, if follow is formatted in
+ // method <CalcFollow(..)>.
+ // E.g., avoid formatting of follow, if method <SwLayoutFrame::FormatWidthCols(..)>
+ // is running.
+ bool mbFollowFormatAllowed : 1;
+
+ void ResetPreps();
+ void Lock() { mbLocked = true; }
+ void Unlock() { mbLocked = false; }
+ void SetWidow( const bool bNew ) { mbWidow = bNew; }
+ void SetJustWidow( const bool bNew ) { mbJustWidow = bNew; }
+ void SetEmpty( const bool bNew ) { mbEmpty = bNew; }
+ void SetFieldFollow( const bool bNew ) { mbFieldFollow = bNew; }
+
+ bool IsIdxInside(TextFrameIndex nPos, TextFrameIndex nLen) const;
+
+ // Changes the Frame or not (cf. FlyCnt)
+ bool GetModelPositionForViewPoint_(SwPosition *pPos, const Point &rPoint,
+ const bool bChgFrame, SwCursorMoveState* = nullptr ) const;
+ void FillCursorPos( SwFillData &rFill ) const;
+
+ // Format exactly one Line
+ bool FormatLine( SwTextFormatter &rLine, const bool bPrev );
+
+ // In order to safe stack space, we split this method:
+ // Format_ calls Format_ with parameters
+ void FormatImpl( vcl::RenderContext* pRenderContext, SwParaPortion *pPara,
+ ::std::vector<SwAnchoredObject *> & rIntersectingObjs);
+ void Format_( SwTextFormatter &rLine, SwTextFormatInfo &rInf,
+ const bool bAdjust = false );
+ void FormatOnceMore( SwTextFormatter &rLine, SwTextFormatInfo &rInf );
+
+ // Formats the Follow and ensures disposing on orphans
+ bool CalcFollow(TextFrameIndex nTextOfst);
+
+ virtual void MakePos() override;
+
+ // Corrects the position from which we need to format
+ static TextFrameIndex FindBrk(std::u16string_view aText, TextFrameIndex nStart,
+ TextFrameIndex nEnd);
+
+ // inline branch
+ SwTwips GetFootnoteFrameHeight_() const;
+
+ // Outsourced to CalcPreps
+ bool CalcPrepFootnoteAdjust();
+
+ // For Footnote and WidOrp: Forced validation
+ void ValidateFrame();
+ void ValidateBodyFrame();
+
+ bool GetDropRect_( SwRect &rRect ) const;
+
+ void SetPara( SwParaPortion *pNew, bool bDelete = true );
+
+ bool IsFootnoteNumFrame_() const;
+
+ // Refresh formatting information
+ bool FormatQuick( bool bForceQuickFormat );
+
+ // Opt: Format empty paragraphs
+ bool FormatEmpty();
+ SwTwips EmptyHeight() const;
+
+ // Opt: Paint empty paragraphs
+ bool PaintEmpty( const SwRect &, bool bCheck ) const;
+
+ void ChgThisLines(); // Must always be called if the Line count could have changed
+
+ // required for 'new' relative anchor position
+ void CalcBaseOfstForFly();
+
+ /** method to determine height of last line, needed for proportional line spacing
+
+ OD 2004-03-17 #i11860#
+ OD 2005-05-20 #i47162# - introduce new optional parameter <_bUseFont>
+ in order to force the usage of the former algorithm to determine the
+ height of the last line, which uses the font.
+
+ @param _bUseFont
+ optional input parameter - boolean indicating, if the font has to be
+ used to determine the height of the last line. default value: false
+ */
+ void CalcHeightOfLastLine( const bool _bUseFont = false );
+
+ virtual void DestroyImpl() override;
+ virtual ~SwTextFrame() override;
+
+ void UpdateOutlineContentVisibilityButton(SwWrtShell* pWrtSh) const;
+ void PaintOutlineContentVisibilityButton() const;
+
+ void PaintParagraphStylesHighlighting() const;
+
+ virtual void SwClientNotify(SwModify const& rModify, SfxHint const& rHint) override;
+
+ /// Like GetDrawObjs(), but limit to fly frames which are allowed to split.
+ std::vector<SwFlyAtContentFrame*> GetSplitFlyDrawObjs() const;
+
+public:
+
+ virtual const SvxFormatBreakItem& GetBreakItem() const override;
+ virtual const SwFormatPageDesc& GetPageDescItem() const override;
+
+ css::uno::Sequence< css::style::TabStop > GetTabStopInfo( SwTwips CurrentPos ) override;
+
+ /**
+ * This is public, as it needs to be called by some methods in order to save the Prepare
+ * USE WITH CAUTION!
+ */
+ void Init();
+
+ /// Is called by DoIdleJob_(), ExecSpellPopup() and UpDown()
+ SwRect AutoSpell_(SwTextNode &, sal_Int32);
+
+ /// Is called by DoIdleJob_()
+ SwRect SmartTagScan(SwTextNode &);
+
+ /// Is called by DoIdleJob_()
+ void CollectAutoCmplWrds(SwTextNode &, sal_Int32);
+
+ /**
+ * Returns the view rectangle for the rPos model position. The values are relative to the upper
+ * left position of the page frame.
+ * Additional information can be obtained by passing an SwCursorMoveState object.
+ * Returns false if rPos > number of character is string
+ */
+ virtual bool GetCharRect( SwRect& rRect, const SwPosition& rPos,
+ SwCursorMoveState* pCMS = nullptr, bool bAllowFarAway = true ) const override;
+
+ /// A slimmer version of GetCharRect for autopositioning Frames
+ bool GetAutoPos( SwRect &, const SwPosition& ) const;
+
+ /**
+ * Determine top of line for given position in the text frame
+ *
+ * OD 11.11.2003 #i22341#
+ * Assumption: given position exists in the text frame or in a follow of it
+ * OD 2004-02-02 - adjustment
+ * Top of first paragraph line is the top of the paragraph.
+ * OD 2004-03-18 #i11860# - Consider upper space amount considered for
+ * previous frame and the page grid.
+ *
+ * @param _onTopOfLine
+ * output parameter - top of line, if the given position is found in the
+ * text frame.
+ *
+ * @param _rPos
+ * input parameter - reference to the position in the text frame
+ *
+ * @return boolean indicating, if the top of line for the given position
+ * has been determined or not.
+ */
+ bool GetTopOfLine( SwTwips& _onTopOfLine,
+ const SwPosition& _rPos ) const;
+
+ virtual bool FillSelection( SwSelectionList& rList, const SwRect& rRect ) const override;
+
+ /**
+ * In nOffset returns the offset of the char within the set
+ * text buffer, which is closest to the position provided by
+ * aPoint within the layout's SSize.
+ *
+ * @returns false if the SPoint is outside of the SSize else
+ * returns true
+ */
+ virtual bool GetModelPositionForViewPoint( SwPosition *, Point&,
+ SwCursorMoveState* = nullptr, bool bTestBackground = false ) const override;
+
+ /**
+ * Makes sure that the Frame is not switched (e.g. switched for a
+ * character-bound Frame)
+ */
+ bool GetKeyCursorOfst(SwPosition *pPos, const Point &rPoint ) const
+ { return GetModelPositionForViewPoint_( pPos, rPoint, false ); }
+
+ void PaintExtraData( const SwRect & rRect ) const; /// Page number etc.
+ SwRect GetPaintSwRect();
+ virtual void PaintSwFrame( vcl::RenderContext& rRenderContext, SwRect const&,
+ SwPrintData const*const pPrintData = nullptr ) const override;
+
+ /**
+ * Layout oriented cursor travelling:
+ * Left border, right border, previous Line, following Line,
+ * same horizontal position
+ */
+ virtual bool LeftMargin(SwPaM *) const override;
+ virtual bool RightMargin(SwPaM *, bool bAPI = false) const override;
+
+ virtual bool UnitUp(SwPaM *, const SwTwips nOffset,
+ bool bSetInReadOnly ) const override;
+ virtual bool UnitDown(SwPaM *, const SwTwips nOffset,
+ bool bSetInReadOnly ) const override;
+ bool UnitUp_(SwPaM *, const SwTwips nOffset,
+ bool bSetInReadOnly ) const;
+ bool UnitDown_(SwPaM *, const SwTwips nOffset,
+ bool bSetInReadOnly ) const;
+
+ /**
+ * Prepares the cursor position for a visual cursor move (BiDi).
+ * The behaviour is different for insert and overwrite cursors
+ */
+ void PrepareVisualMove( TextFrameIndex& nPos, sal_uInt8& nCursorLevel,
+ bool& bRight, bool bInsertCursor );
+
+ /// Methods to manage the FollowFrame
+ void SplitFrame(TextFrameIndex nTextPos);
+ SwContentFrame *JoinFrame();
+ TextFrameIndex GetOffset() const { return mnOffset; }
+ void SetOffset_(TextFrameIndex nNewOfst);
+ inline void SetOffset (TextFrameIndex nNewOfst);
+ void ManipOfst(TextFrameIndex const nNewOfst) { mnOffset = nNewOfst; }
+ SwTextFrame *GetFrameAtPos ( const SwPosition &rPos);
+ inline const SwTextFrame *GetFrameAtPos ( const SwPosition &rPos) const;
+ SwTextFrame& GetFrameAtOfst(TextFrameIndex nOfst);
+ /// If there's a Follow and we don't contain text ourselves
+ bool IsEmptyMaster() const
+ { return GetFollow() && !GetFollow()->GetOffset(); }
+
+ void SetMergedPara(std::unique_ptr<sw::MergedPara> p);
+ sw::MergedPara * GetMergedPara() { return m_pMergedPara.get(); }
+ sw::MergedPara const* GetMergedPara() const { return m_pMergedPara.get(); }
+
+ /// Returns the text portion we want to edit (for inline see underneath)
+ const OUString& GetText() const;
+ SwTextNode const* GetTextNodeForParaProps() const;
+ SwTextNode const* GetTextNodeForFirstText() const;
+ SwTextNode * GetTextNodeFirst()
+ { return const_cast<SwTextNode*>(const_cast<SwTextFrame const*>(this)->GetTextNodeFirst()); };
+ SwTextNode const* GetTextNodeFirst() const;
+ SwDoc & GetDoc()
+ { return const_cast<SwDoc &>(const_cast<SwTextFrame const*>(this)->GetDoc()); }
+ SwDoc const& GetDoc() const;
+
+ SwTextFrame(SwTextNode * const, SwFrame*, sw::FrameMode eMode);
+
+ /**
+ * SwContentFrame: the shortcut for the Frames
+ * If the void* casts wrongly, it's its own fault!
+ * The void* must be checked for 0 in any case!
+ *
+ * return true if the Portion associated with this SwTextFrame was
+ * potentially destroyed and replaced by Prepare
+ */
+ virtual bool Prepare( const PrepareHint ePrep = PrepareHint::Clear,
+ const void *pVoid = nullptr, bool bNotify = true ) override;
+
+ /**
+ * nMaxHeight is the required height
+ * bSplit indicates, that the paragraph has to be split
+ * bTst indicates, that we are currently doing a test formatting
+ */
+ virtual bool WouldFit(SwTwips &nMaxHeight, bool &bSplit, bool bTst, bool bMoveBwd) override;
+
+ /**
+ * The WouldFit equivalent for temporarily rewired TextFrames
+ * nMaxHeight returns the required size here too and bSplit
+ * determines whether the paragraph needs to be split.
+ * We pass the potential predecessor for the distance calculation
+ */
+ bool TestFormat( const SwFrame* pPrv, SwTwips &nMaxHeight, bool &bSplit );
+
+ /**
+ * We format a Line for interactive hyphenation
+ * @return found
+ */
+ bool Hyphenate(SwInterHyphInfoTextFrame & rInf);
+
+ /// Test grow
+ inline SwTwips GrowTst( const SwTwips nGrow );
+
+ SwParaPortion *GetPara();
+ inline const SwParaPortion *GetPara() const;
+ inline bool HasPara() const;
+ bool HasPara_() const;
+
+ /// map position in potentially merged text frame to SwPosition
+ std::pair<SwTextNode*, sal_Int32> MapViewToModel(TextFrameIndex nIndex) const;
+ SwPosition MapViewToModelPos(TextFrameIndex nIndex) const;
+ TextFrameIndex MapModelToView(SwTextNode const* pNode, sal_Int32 nIndex) const;
+ TextFrameIndex MapModelToViewPos(SwPosition const& rPos) const;
+
+ // If there are any hanging punctuation portions in the margin
+ // the offset will be returned.
+ SwTwips HangingMargin() const;
+
+ /// Get the amount of lower margin of this frame we need to consider for fly portion purposes.
+ SwTwips GetLowerMarginForFlyIntersect() const;
+
+ // Locking
+ bool IsLocked() const { return mbLocked; }
+
+ bool IsWidow() const { return mbWidow; }
+ bool IsJustWidow() const { return mbJustWidow; }
+ bool IsEmpty() const { return mbEmpty; }
+ bool HasFootnote() const { return mbFootnote; }
+ bool IsInFootnoteConnect()const { return mbInFootnoteConnect;}
+ bool IsFieldFollow() const { return mbFieldFollow;}
+
+ inline void SetRepaint() const;
+ inline void ResetRepaint() const;
+ bool HasRepaint() const { return mbRepaint; }
+ void SetHasRotatedPortions(bool bHasRotatedPortions);
+ bool GetHasRotatedPortions() const { return mbHasRotatedPortions; }
+ void SetAnimation() const
+ { const_cast<SwTextFrame*>(this)->mbHasAnimation = true; }
+ bool HasAnimation() const { return mbHasAnimation; }
+
+ bool IsSwapped() const { return mbIsSwapped; }
+
+ /// Does the Frame have a local footnote (in this Frame or Follow)?
+#ifdef DBG_UTIL
+ void CalcFootnoteFlag(TextFrameIndex nStop = TextFrameIndex(COMPLETE_STRING)); //For testing SplitFrame
+#else
+ void CalcFootnoteFlag();
+#endif
+
+ /// Hidden
+ bool IsHiddenNow() const; // bHidden && pOut == pPrt
+ void HideHidden(); // Remove appendage if Hidden
+ void HideFootnotes(TextFrameIndex nStart, TextFrameIndex nEnd);
+
+ /**
+ * Hides respectively shows objects, which are anchored at paragraph,
+ * at/as a character of the paragraph, corresponding to the paragraph and
+ * paragraph portion visibility.
+ */
+ void HideAndShowObjects();
+
+ /// Footnote
+ void RemoveFootnote(TextFrameIndex nStart,
+ TextFrameIndex nLen = TextFrameIndex(COMPLETE_STRING));
+ inline SwTwips GetFootnoteFrameHeight() const;
+ SwTextFrame *FindFootnoteRef( const SwTextFootnote *pFootnote );
+ const SwTextFrame *FindFootnoteRef( const SwTextFootnote *pFootnote ) const
+ { return const_cast<SwTextFrame *>(this)->FindFootnoteRef( pFootnote ); }
+ void ConnectFootnote( SwTextFootnote *pFootnote, const SwTwips nDeadLine );
+
+ /**
+ * If we're a Footnote that grows towards its reference ...
+ * public, because it's needed by SwContentFrame::MakeAll
+ */
+ SwTwips GetFootnoteLine( const SwTextFootnote *pFootnote ) const;
+
+ TextFrameIndex GetDropLen(TextFrameIndex nWishLen) const;
+
+ LanguageType GetLangOfChar(TextFrameIndex nIndex, sal_uInt16 nScript,
+ bool bNoChar = false) const;
+
+ virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override;
+ virtual void CheckDirection( bool bVert ) override;
+
+ /// Returns the sum of line height in pLine
+ SwTwips GetParHeight() const;
+
+ inline SwTextFrame *GetFollow();
+ inline const SwTextFrame *GetFollow() const;
+
+ /// Find the page number of ErgoSum and QuoVadis
+ SwTextFrame *FindQuoVadisFrame();
+
+ /**
+ * In case the SwLineLayout was cleared out of the s_pTextCache, recreate it
+ *
+ * #i29062# GetFormatted() can trigger a full formatting
+ * of the paragraph, causing other layout frames to become invalid. This
+ * has to be avoided during painting. Therefore we need to pass the
+ * information that we are currently in the paint process.
+ */
+ SwTextFrame* GetFormatted( bool bForceQuickFormat = false );
+
+ /// Will be moved soon
+ void SetFootnote( const bool bNew ) { mbFootnote = bNew; }
+
+ /// Respect the Follows
+ inline bool IsInside(TextFrameIndex nPos) const;
+
+ /// DropCaps and selections
+ bool GetDropRect( SwRect &rRect ) const
+ { return HasPara() && GetDropRect_( rRect ); }
+
+ static SwCache *GetTextCache() { return s_pTextCache; }
+ static void SetTextCache( SwCache *pNew ) { s_pTextCache = pNew; }
+
+ static tools::Long GetMinPrtLine() { return nMinPrtLine; }
+
+ sal_uInt16 GetCacheIdx() const { return mnCacheIndex; }
+ void SetCacheIdx( const sal_uInt16 nNew ) { mnCacheIndex = nNew; }
+
+ /// Removes the Line information from the Cache but retains the entry itself
+ void ClearPara();
+ /// Removes this frame completely from the Cache
+ void RemoveFromCache();
+
+ /// Am I a FootnoteFrame, with a number at the start of the paragraph?
+ bool IsFootnoteNumFrame() const
+ { return IsInFootnote() && !GetIndPrev() && IsFootnoteNumFrame_(); }
+
+ /**
+ * Simulates a formatting as if there were not right margin or Flys or other
+ * obstacles and returns the width
+ */
+ SwTwips CalcFitToContent();
+
+ /**
+ * Simulate format for a list item paragraph, whose list level attributes
+ * are in LABEL_ALIGNMENT mode, in order to determine additional first
+ * line offset for the real text formatting due to the value of label
+ * adjustment attribute of the list level.
+ */
+ void CalcAdditionalFirstLineOffset();
+
+ SwTwips GetAdditionalFirstLineOffset() const
+ {
+ return mnAdditionalFirstLineOffset;
+ }
+
+ /**
+ * Returns the additional line spacing for the next paragraph
+ * @param _bNoPropLineSpacing: control, whether the value of a
+ * proportional line spacing is returned or not
+ */
+ tools::Long GetLineSpace( const bool _bNoPropLineSpacing = false ) const;
+
+ /// Returns the first line height
+ sal_uInt16 FirstLineHeight() const;
+
+ /// Rewires FlyInContentFrame, if nEnd > Index >= nStart
+ void MoveFlyInCnt(SwTextFrame *pNew, TextFrameIndex nStart, TextFrameIndex nEnd);
+
+ /// Calculates the position of FlyInContentFrames
+ TextFrameIndex CalcFlyPos( SwFrameFormat const * pSearch );
+
+ /// Determines the start position and step size of the register
+ bool FillRegister( SwTwips& rRegStart, sal_uInt16& rRegDiff );
+
+ /// Determines the line count
+ sal_Int32 GetLineCount(TextFrameIndex nPos);
+
+ /// For displaying the line numbers
+ sal_Int32 GetAllLines() const { return mnAllLines; }
+ sal_Int32 GetThisLines() const { return mnThisLines;}
+ void RecalcAllLines();
+
+ /// Stops the animations within numberings
+ void StopAnimation( const OutputDevice *pOut );
+
+ /// Visit all portions for Accessibility
+ void VisitPortions( SwPortionHandler& rPH ) const;
+
+ /// Returns the script info stored at the paraportion
+ const SwScriptInfo* GetScriptInfo() const;
+
+ /// Swaps width and height of the text frame
+ void SwapWidthAndHeight();
+
+ /**
+ * Calculates the coordinates of a rectangle when switching from
+ * horizontal to vertical layout
+ */
+ void SwitchHorizontalToVertical( SwRect& rRect ) const;
+
+ /**
+ * Calculates the coordinates of a point when switching from
+ * horizontal to vertical layout
+ */
+ void SwitchHorizontalToVertical( Point& rPoint ) const;
+
+ /**
+ * Calculates the limit value when switching from
+ * horizontal to vertical layout
+ */
+ tools::Long SwitchHorizontalToVertical( tools::Long nLimit ) const;
+
+ /**
+ * Calculates the coordinates of a rectangle when switching from
+ * vertical to horizontal layout
+ */
+ void SwitchVerticalToHorizontal( SwRect& rRect ) const;
+
+ /**
+ * Calculates the coordinates of a point when switching from
+ * vertical to horizontal layout
+ */
+ void SwitchVerticalToHorizontal( Point& rPoint ) const;
+
+ /**
+ * Calculates the a limit value when switching from
+ * vertical to horizontal layout
+ */
+ tools::Long SwitchVerticalToHorizontal( tools::Long nLimit ) const;
+
+ /**
+ * Calculates the coordinates of a rectangle when switching from
+ * LTR to RTL layout
+ */
+ void SwitchLTRtoRTL( SwRect& rRect ) const;
+
+ /**
+ * Calculates the coordinates of a point when switching from
+ * LTR to RTL layout
+ */
+ void SwitchLTRtoRTL( Point& rPoint ) const;
+
+ /**
+ * Calculates the coordinates of a rectangle when switching from
+ * RTL to LTR layout
+ */
+ void SwitchRTLtoLTR( SwRect& rRect ) const { SwitchLTRtoRTL( rRect ); }
+
+ /**
+ * Calculates the coordinates of a point when switching from
+ * RTL to LTR layout
+ */
+ void SwitchRTLtoLTR( Point& rPoint ) const { SwitchLTRtoRTL( rPoint ); };
+
+ bool FollowFormatAllowed() const
+ {
+ return mbFollowFormatAllowed;
+ }
+
+ void AllowFollowFormat()
+ {
+ mbFollowFormatAllowed = true;
+ }
+
+ void ForbidFollowFormat()
+ {
+ mbFollowFormatAllowed = false;
+ }
+
+ SwTwips GetBaseOffsetForFly( bool bIgnoreFlysAnchoredAtThisFrame ) const
+ {
+ return ( bIgnoreFlysAnchoredAtThisFrame ?
+ mnFlyAnchorOfst :
+ mnFlyAnchorOfstNoWrap );
+ }
+
+ SwTwips GetBaseVertOffsetForFly(bool bIgnoreFlysAnchoredAtThisFrame) const;
+
+ SwTwips GetHeightOfLastLine() const
+ {
+ return mnHeightOfLastLine;
+ }
+
+ static void repaintTextFrames( const SwTextNode& rNode );
+
+ void RegisterToNode(SwTextNode &, bool isForceNodeAsFirst = false);
+
+ bool IsSymbolAt(TextFrameIndex) const;
+ OUString GetCurWord(SwPosition const&) const;
+ sal_uInt16 GetScalingOfSelectedText(TextFrameIndex nStt, TextFrameIndex nEnd);
+
+ /// This text frame may have a split fly frames anchored to it. Is any of them a frame that has
+ /// a follow, i.e. not the last in a master -> follow 1 -> ... -> last follow chain?
+ SwFlyAtContentFrame* HasNonLastSplitFlyDrawObj() const;
+
+ /// This text frame has a follow and the text frame don't contain text. Additionally one split
+ /// fly is anchored to the text frame.
+ bool IsEmptyMasterWithSplitFly() const;
+
+ /// This text frame is not split, doesn't fit the upper, has a single split fly anchored to it
+ /// with a negative vertical offset. Such frames may need explicit splitting.
+ bool IsEmptyWithSplitFly() const;
+
+ static SwView* GetView();
+
+ void dumpAsXml(xmlTextWriterPtr writer = nullptr) const override;
+ void dumpAsXmlAttributes(xmlTextWriterPtr writer) const override;
+};
+
+//use this to protect a SwTextFrame for a given scope from getting merged with
+//its neighbour and thus deleted
+class TextFrameLockGuard
+{
+private:
+ SwTextFrame *m_pTextFrame;
+ bool m_bOldLocked;
+public:
+ //Lock pFrame for the lifetime of the Cut/Paste call, etc. to avoid
+ //SwTextFrame::AdjustFollow_ removing the pFrame we're trying to Make
+ TextFrameLockGuard(SwFrame* pFrame)
+ {
+ m_pTextFrame = pFrame->IsTextFrame() ? static_cast<SwTextFrame*>(pFrame) : nullptr;
+ if (m_pTextFrame)
+ {
+ m_bOldLocked = m_pTextFrame->IsLocked();
+ m_pTextFrame->Lock();
+ }
+ else
+ {
+ m_bOldLocked = false;
+ }
+ }
+
+ ~TextFrameLockGuard()
+ {
+ if (m_pTextFrame && !m_bOldLocked)
+ m_pTextFrame->Unlock();
+ }
+};
+
+inline const SwParaPortion *SwTextFrame::GetPara() const
+{
+ return const_cast<SwTextFrame*>(this)->GetPara();
+}
+
+inline bool SwTextFrame::HasPara() const
+{
+ return mnCacheIndex!=USHRT_MAX && HasPara_();
+}
+
+inline SwTwips SwTextFrame::GrowTst( const SwTwips nGrow )
+{
+ return Grow( nGrow, true );
+}
+
+inline bool SwTextFrame::IsInside(TextFrameIndex const nPos) const
+{
+ bool bRet = true;
+ if( nPos < GetOffset() )
+ bRet = false;
+ else
+ {
+ const SwTextFrame *pFoll = GetFollow();
+ if( pFoll && nPos >= pFoll->GetOffset() )
+ bRet = false;
+ }
+ return bRet;
+}
+
+inline SwTwips SwTextFrame::GetFootnoteFrameHeight() const
+{
+ if( !IsFollow() && IsInFootnote() && HasPara() )
+ return GetFootnoteFrameHeight_();
+ else
+ return 0;
+}
+
+inline const SwTextFrame *SwTextFrame::GetFollow() const
+{
+ return static_cast<const SwTextFrame*>(SwContentFrame::GetFollow());
+}
+inline SwTextFrame *SwTextFrame::GetFollow()
+{
+ return static_cast<SwTextFrame*>(SwContentFrame::GetFollow());
+}
+
+inline const SwTextFrame *SwTextFrame::GetFrameAtPos( const SwPosition &rPos) const
+{
+ return const_cast<SwTextFrame*>(this)->GetFrameAtPos( rPos );
+}
+
+inline void SwTextFrame::SetOffset(TextFrameIndex const nNewOfst)
+{
+ if ( mnOffset != nNewOfst )
+ SetOffset_( nNewOfst );
+}
+
+inline void SwTextFrame::SetRepaint() const
+{
+ const_cast<SwTextFrame*>(this)->mbRepaint = true;
+}
+inline void SwTextFrame::ResetRepaint() const
+{
+ const_cast<SwTextFrame*>(this)->mbRepaint = false;
+}
+
+class TemporarySwap {
+protected:
+ explicit TemporarySwap(SwTextFrame * frame, bool swap):
+ m_frame(frame), m_undo(false)
+ {
+ if (m_frame->IsVertical() && swap) {
+ m_undo = true;
+ m_frame->SwapWidthAndHeight();
+ }
+ }
+
+ ~TemporarySwap() {
+ if (m_undo) {
+ m_frame->SwapWidthAndHeight();
+ }
+ }
+
+private:
+ TemporarySwap(TemporarySwap const &) = delete;
+ void operator =(TemporarySwap const &) = delete;
+
+ SwTextFrame * m_frame;
+ bool m_undo;
+};
+
+class SwSwapIfSwapped: private TemporarySwap {
+public:
+ explicit SwSwapIfSwapped(SwTextFrame* frame):
+ TemporarySwap(frame, frame->IsSwapped()) {}
+};
+
+class SwSwapIfNotSwapped: private TemporarySwap {
+public:
+ explicit SwSwapIfNotSwapped(SwTextFrame* frame):
+ TemporarySwap(frame, !frame->IsSwapped()) {}
+};
+
+/**
+ * Helper class which can be used instead of the macros if a function
+ * has too many returns
+ */
+class SwFrameSwapper
+{
+ const SwTextFrame* pFrame;
+ bool bUndo;
+public:
+ SwFrameSwapper( const SwTextFrame* pFrame, bool bSwapIfNotSwapped );
+ ~SwFrameSwapper();
+};
+
+class SwLayoutModeModifier
+{
+ const OutputDevice& m_rOut;
+ vcl::text::ComplexTextLayoutFlags m_nOldLayoutMode;
+public:
+ SwLayoutModeModifier( const OutputDevice& rOutp );
+ ~SwLayoutModeModifier();
+ void Modify( bool bChgToRTL );
+ void SetAuto();
+};
+
+class SwDigitModeModifier
+{
+ const OutputDevice& rOut;
+ LanguageType nOldLanguageType;
+public:
+ SwDigitModeModifier( const OutputDevice& rOutp, LanguageType eCurLang );
+ ~SwDigitModeModifier();
+};
+
+namespace sw {
+
+/**
+ * Describes parts of multiple text nodes, which will form a text frame, even
+ * when redlines are hidden at a layout level.
+ */
+struct MergedPara
+{
+ sw::WriterMultiListener listener;
+ std::vector<Extent> extents;
+ /// note: cannot be const currently to avoid UB because SwTextGuess::Guess
+ /// const_casts it and modifies it (also, Update will modify it)
+ OUString mergedText;
+ /// most paragraph properties are taken from the first non-empty node
+ SwTextNode * pParaPropsNode;
+ /// except break attributes, those are taken from the first node
+ SwTextNode *const pFirstNode;
+ /// mainly for sanity checks
+ SwTextNode const* pLastNode;
+ MergedPara(SwTextFrame & rFrame, std::vector<Extent>&& rExtents,
+ OUString aText,
+ SwTextNode *const pProps, SwTextNode *const pFirst,
+ SwTextNode const*const pLast)
+ : listener(rFrame), extents(std::move(rExtents)), mergedText(std::move(aText))
+ , pParaPropsNode(pProps), pFirstNode(pFirst), pLastNode(pLast)
+ {
+ assert(pParaPropsNode);
+ assert(pFirstNode);
+ assert(pLastNode);
+ }
+};
+
+/// iterate SwTextAttr in potentially merged text frame
+class MergedAttrIterBase
+{
+protected:
+ sw::MergedPara const*const m_pMerged;
+ SwTextNode const*const m_pNode;
+ size_t m_CurrentExtent;
+ size_t m_CurrentHint;
+ MergedAttrIterBase(SwTextFrame const& rFrame);
+};
+
+class MergedAttrIter
+ : public MergedAttrIterBase
+{
+public:
+ MergedAttrIter(SwTextFrame const& rFrame) : MergedAttrIterBase(rFrame) {}
+ SwTextAttr const* NextAttr(SwTextNode const** ppNode = nullptr);
+};
+
+class MergedAttrIterByEnd
+{
+private:
+ std::vector<std::pair<SwTextNode const*, SwTextAttr const*>> m_Hints;
+ SwTextNode const*const m_pNode;
+ size_t m_CurrentHint;
+public:
+ MergedAttrIterByEnd(SwTextFrame const& rFrame);
+ SwTextAttr const* NextAttr(SwTextNode const*& rpNode);
+ void PrevAttr();
+};
+
+class MergedAttrIterReverse
+ : public MergedAttrIterBase
+{
+public:
+ MergedAttrIterReverse(SwTextFrame const& rFrame);
+ SwTextAttr const* PrevAttr(SwTextNode const** ppNode = nullptr);
+};
+
+
+const SwTwips WIDOW_MAGIC = (SAL_MAX_INT32 - 1)/2;
+
+} // namespace sw
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/txttypes.hxx b/sw/source/core/inc/txttypes.hxx
new file mode 100644
index 0000000000..6b3124fb8b
--- /dev/null
+++ b/sw/source/core/inc/txttypes.hxx
@@ -0,0 +1,98 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+/// @see PORGRP_* masks in porlin.hxx for meaning of bits!
+enum class PortionType
+{
+ NONE = 0x0000,
+ FlyCnt = 0x0001,
+
+ Hole = 0x0080,
+ TempEnd = 0x0081,
+ Break = 0x0082,
+ Kern = 0x0083,
+ Arrow = 0x0084,
+ Multi = 0x0085,
+ HiddenText = 0x0086,
+ ControlChar = 0x0087,
+ Bookmark = 0x0088,
+
+ Text = 0x8000,
+ Lay = 0x8001,
+ Para = 0x8002,
+ Hanging = 0x8004,
+ InputField = 0x8005,
+ FieldMark = 0x8006,
+ FieldFormCheckbox = 0x8007,
+
+ Drop = 0x8080,
+ Tox = 0x8089,
+ IsoTox = 0x808a,
+ Ref = 0x808b,
+ IsoRef = 0x808c,
+ Meta = 0x808d,
+ ContentControl = 0x808e,
+
+ Expand = 0xc080,
+ Blank = 0xc081,
+ PostIts = 0xc082,
+
+ Hyphen = 0xd080,
+ HyphenStr = 0xd081,
+ SoftHyphen = 0xd082,
+ SoftHyphenStr = 0xd083,
+ SoftHyphenComp = 0xd084,
+
+ Field = 0xe080,
+ Hidden = 0xe081,
+ QuoVadis = 0xe082,
+ ErgoSum = 0xe083,
+ Combined = 0xe084,
+ Footnote = 0xe085,
+
+ FootnoteNum = 0xe880,
+ Number = 0xe881,
+ Bullet = 0xe882,
+ GrfNum = 0xe883,
+
+ Glue = 0x0480,
+
+ Margin = 0x04c0,
+
+ Fix = 0x06c0,
+ Fly = 0x06c1,
+
+ // Tabulator, not table
+ Tab = 0x0750,
+
+ TabRight = 0x07d0,
+ TabCenter = 0x07d1,
+ TabDecimal = 0x07d2,
+
+ TabLeft = 0x0740,
+};
+
+namespace sw
+{
+const char* PortionTypeToString(PortionType nType);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/undoflystrattr.hxx b/sw/source/core/inc/undoflystrattr.hxx
new file mode 100644
index 0000000000..6cb639ac41
--- /dev/null
+++ b/sw/source/core/inc/undoflystrattr.hxx
@@ -0,0 +1,66 @@
+/* -*- 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_UNDOFLYSTRATTR_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNDOFLYSTRATTR_HXX
+
+#include <undobj.hxx>
+#include <swundo.hxx>
+
+class SwFlyFrameFormat;
+
+class SwUndoFlyStrAttr final : public SwUndo
+{
+ public:
+ SwUndoFlyStrAttr( SwFlyFrameFormat& rFlyFrameFormat,
+ const SwUndoId eUndoId,
+ OUString sOldStr,
+ OUString sNewStr );
+ virtual ~SwUndoFlyStrAttr() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+
+ private:
+ SwFlyFrameFormat& mrFlyFrameFormat;
+ const OUString msOldStr;
+ const OUString msNewStr;
+};
+
+class SwUndoFlyDecorative final : public SwUndo
+{
+ public:
+ SwUndoFlyDecorative(SwFlyFrameFormat& rFlyFrameFormat,
+ bool isDecorative);
+ virtual ~SwUndoFlyDecorative() override;
+
+ virtual void UndoImpl( ::sw::UndoRedoContext & ) override;
+ virtual void RedoImpl( ::sw::UndoRedoContext & ) override;
+
+ virtual SwRewriter GetRewriter() const override;
+
+ private:
+ SwFlyFrameFormat & m_rFlyFrameFormat;
+ bool const m_IsDecorative;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOFLYSTRATTR_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unobookmark.hxx b/sw/source/core/inc/unobookmark.hxx
new file mode 100644
index 0000000000..d1d800d9a2
--- /dev/null
+++ b/sw/source/core/inc/unobookmark.hxx
@@ -0,0 +1,240 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/text/XTextContent.hpp>
+#include <com/sun/star/text/XTextField.hpp>
+#include <com/sun/star/text/XFormField.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+#include <svl/listener.hxx>
+#include <sfx2/Metadatable.hxx>
+
+#include <unobaseclass.hxx>
+#include <IDocumentMarkAccess.hxx>
+
+class SwDoc;
+class SwXTextRange;
+
+typedef ::cppu::ImplInheritanceHelper
+< ::sfx2::MetadatableMixin
+, css::lang::XServiceInfo
+, css::beans::XPropertySet
+, css::container::XNamed
+, css::text::XTextContent
+> SwXBookmark_Base;
+
+/// UNO API wrapper around an internal sw::mark::IMark.
+class SwXBookmark
+ : public SwXBookmark_Base
+{
+
+private:
+
+ class Impl;
+ ::sw::UnoImplPtr<Impl> m_pImpl;
+
+protected:
+ /// @throws css::lang::IllegalArgumentException
+ /// @throws css::uno::RuntimeException
+ void attachToRangeEx(
+ const css::uno::Reference< css::text::XTextRange > & xTextRange,
+ IDocumentMarkAccess::MarkType eType,
+ bool isFieldmarkSeparatorAtStart = false);
+ /// @throws css::lang::IllegalArgumentException
+ /// @throws css::uno::RuntimeException
+ virtual void attachToRange(
+ const css::uno::Reference< css::text::XTextRange > & xTextRange);
+
+ ::sw::mark::IMark* GetBookmark() const;
+
+ IDocumentMarkAccess* GetIDocumentMarkAccess();
+
+ SwDoc * GetDoc();
+
+ void registerInMark( SwXBookmark& rXMark, ::sw::mark::IMark* const pMarkBase );
+
+ virtual ~SwXBookmark() override;
+
+ SwXBookmark(SwDoc *const pDoc);
+
+ /// descriptor
+ SwXBookmark();
+
+public:
+
+ static rtl::Reference<SwXBookmark>
+ CreateXBookmark(SwDoc & rDoc, ::sw::mark::IMark * pBookmark);
+
+ /// @return IMark for this, but only if it lives in pDoc
+ static ::sw::mark::IMark const* GetBookmarkInDoc(SwDoc const*const pDoc,
+ const css::uno::Reference<css::uno::XInterface> & xUT);
+
+ // MetadatableMixin
+ virtual ::sfx2::Metadatable* GetCoreObject() override;
+ virtual css::uno::Reference< css::frame::XModel > GetModel() override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(
+ const OUString& rServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL
+ getSupportedServiceNames() override;
+
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+ virtual void SAL_CALL addEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+ virtual void SAL_CALL removeEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
+ getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(
+ const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ const OUString& rPropertyName) override;
+ virtual void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+ virtual void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference<
+ css::beans::XVetoableChangeListener >& xListener) override;
+
+ // XNamed
+ virtual OUString SAL_CALL getName() override;
+ virtual void SAL_CALL setName(const OUString& rName) override;
+
+ // XTextContent
+ virtual void SAL_CALL attach(
+ const css::uno::Reference< css::text::XTextRange > & xTextRange) override;
+ virtual css::uno::Reference< css::text::XTextRange > SAL_CALL getAnchor() override;
+
+};
+
+class SwXFieldmarkParameters final
+ : public ::cppu::WeakImplHelper< css::container::XNameContainer>
+ , public SvtListener
+{
+ private:
+ ::sw::mark::IFieldmark* m_pFieldmark;
+ /// @throws css::uno::RuntimeException
+ ::sw::mark::IFieldmark::parameter_map_t* getCoreParameters();
+ public:
+ SwXFieldmarkParameters(::sw::mark::IFieldmark* const pFieldmark)
+ : m_pFieldmark(pFieldmark)
+ {
+ StartListening(pFieldmark->GetNotifier());
+ }
+
+ // XNameContainer
+ virtual void SAL_CALL insertByName( const OUString& aName, const css::uno::Any& aElement ) override;
+ virtual void SAL_CALL removeByName( const OUString& Name ) override;
+ // XNameReplace
+ virtual void SAL_CALL replaceByName( const OUString& aName, const css::uno::Any& aElement ) override;
+ // XNameAccess
+ virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getElementNames( ) override;
+ virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType( ) override;
+ virtual sal_Bool SAL_CALL hasElements( ) override;
+
+ virtual void Notify( const SfxHint& rHint ) override;
+};
+
+typedef cppu::ImplInheritanceHelper< SwXBookmark,
+ css::text::XFormField,
+ css::text::XTextField
+ > SwXFieldmark_Base;
+
+/// UNO wrapper around an sw::mark::IFieldmark.
+class SwXFieldmark final
+ : public SwXFieldmark_Base
+{
+ ::sw::mark::ICheckboxFieldmark* getCheckboxFieldmark();
+ bool const m_bReplacementObject;
+ bool m_isFieldmarkSeparatorAtStart = false;
+
+ rtl::Reference<SwXTextRange>
+ GetCommand(::sw::mark::IFieldmark const& rMark);
+ rtl::Reference<SwXTextRange>
+ GetResult(::sw::mark::IFieldmark const& rMark);
+
+ SwXFieldmark(bool isReplacementObject, SwDoc* pDoc);
+
+public:
+ static rtl::Reference<SwXBookmark>
+ CreateXFieldmark(SwDoc & rDoc, ::sw::mark::IMark * pMark,
+ bool isReplacementObject = false);
+
+ virtual void attachToRange(
+ const css::uno::Reference<css::text::XTextRange > & xTextRange) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual css::uno::Sequence<OUString> SAL_CALL
+ getSupportedServiceNames() override;
+
+ // XPropertySet
+ virtual css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL
+ getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(
+ const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ const OUString& rPropertyName) override;
+
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+ virtual void SAL_CALL addEventListener(
+ const css::uno::Reference<css::lang::XEventListener> & xListener) override;
+ virtual void SAL_CALL removeEventListener(
+ const css::uno::Reference<css::lang::XEventListener> & xListener) override;
+
+ // XTextContent
+ virtual void SAL_CALL attach(
+ const css::uno::Reference<css::text::XTextRange> & xTextRange) override;
+ virtual css::uno::Reference<css::text::XTextRange> SAL_CALL getAnchor() override;
+
+ // XTextField
+ virtual OUString SAL_CALL getPresentation(sal_Bool bShowCommand) override;
+
+ // XFormField
+ virtual OUString SAL_CALL getFieldType() override;
+ virtual void SAL_CALL setFieldType(const OUString& description) override;
+ virtual css::uno::Reference<css::container::XNameContainer> SAL_CALL getParameters() override;
+
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unocontentcontrol.hxx b/sw/source/core/inc/unocontentcontrol.hxx
new file mode 100644
index 0000000000..08e32afd7f
--- /dev/null
+++ b/sw/source/core/inc/unocontentcontrol.hxx
@@ -0,0 +1,170 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <deque>
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/text/XTextContent.hpp>
+#include <com/sun/star/text/XTextField.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+#include <unobaseclass.hxx>
+#include <unocoll.hxx>
+
+class SwPaM;
+class SwTextNode;
+class SwFormatContentControl;
+class SwContentControl;
+class SwXText;
+class SwXTextPortion;
+
+typedef std::deque<rtl::Reference<SwXTextPortion>> TextRangeList_t;
+
+/**
+ * UNO API wrapper around an SwContentControl, exposed as the com.sun.star.text.ContentControl
+ * service.
+ */
+class SwXContentControl final
+ : public cppu::WeakImplHelper<css::lang::XServiceInfo, css::container::XEnumerationAccess,
+ css::text::XTextContent, css::text::XText,
+ css::beans::XPropertySet>
+{
+ class Impl;
+ sw::UnoImplPtr<Impl> m_pImpl;
+
+protected:
+ void AttachImpl(const css::uno::Reference<css::text::XTextRange>& xTextRange,
+ sal_uInt16 nWhich);
+
+ ~SwXContentControl() override;
+
+ SwXContentControl(const SwXContentControl&) = delete;
+ SwXContentControl& operator=(const SwXContentControl&) = delete;
+
+ SwXContentControl(SwDoc* pDoc, SwContentControl* pContentControl,
+ const css::uno::Reference<SwXText>& xParentText,
+ std::unique_ptr<const TextRangeList_t> pPortions);
+
+ SwXContentControl(SwDoc* pDoc);
+
+public:
+ static rtl::Reference<SwXContentControl>
+ CreateXContentControl(SwContentControl& rContentControl,
+ const css::uno::Reference<SwXText>& xParentText = nullptr,
+ std::unique_ptr<const TextRangeList_t>&& pPortions
+ = std::unique_ptr<const TextRangeList_t>());
+
+ static rtl::Reference<SwXContentControl> CreateXContentControl(SwDoc& rDoc);
+
+ /// Initializes params with position of the attribute content (without CH_TXTATR).
+ bool SetContentRange(SwTextNode*& rpNode, sal_Int32& rStart, sal_Int32& rEnd) const;
+ const css::uno::Reference<SwXText>& GetParentText() const;
+
+ // XServiceInfo
+ OUString SAL_CALL getImplementationName() override;
+ sal_Bool SAL_CALL supportsService(const OUString& rServiceName) override;
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+ // XComponent
+ void SAL_CALL dispose() override;
+ void SAL_CALL
+ addEventListener(const css::uno::Reference<css::lang::XEventListener>& xListener) override;
+ void SAL_CALL
+ removeEventListener(const css::uno::Reference<css::lang::XEventListener>& xListener) override;
+
+ // XElementAccess
+ css::uno::Type SAL_CALL getElementType() override;
+ sal_Bool SAL_CALL hasElements() override;
+
+ // XEnumerationAccess
+ css::uno::Reference<css::container::XEnumeration> SAL_CALL createEnumeration() override;
+
+ // XTextContent
+ void SAL_CALL attach(const css::uno::Reference<css::text::XTextRange>& xTextRange) override;
+ css::uno::Reference<css::text::XTextRange> SAL_CALL getAnchor() override;
+
+ // XTextRange
+ css::uno::Reference<css::text::XText> SAL_CALL getText() override;
+ css::uno::Reference<css::text::XTextRange> SAL_CALL getStart() override;
+ css::uno::Reference<css::text::XTextRange> SAL_CALL getEnd() override;
+ OUString SAL_CALL getString() override;
+ void SAL_CALL setString(const OUString& rString) override;
+
+ // XSimpleText
+ css::uno::Reference<css::text::XTextCursor> SAL_CALL createTextCursor() override;
+ css::uno::Reference<css::text::XTextCursor> SAL_CALL createTextCursorByRange(
+ const css::uno::Reference<css::text::XTextRange>& xTextPosition) override;
+ void SAL_CALL insertString(const css::uno::Reference<css::text::XTextRange>& xRange,
+ const OUString& aString, sal_Bool bAbsorb) override;
+ void SAL_CALL insertControlCharacter(const css::uno::Reference<css::text::XTextRange>& xRange,
+ sal_Int16 nControlCharacter, sal_Bool bAbsorb) override;
+
+ // XText
+ void SAL_CALL insertTextContent(const css::uno::Reference<css::text::XTextRange>& xRange,
+ const css::uno::Reference<css::text::XTextContent>& xContent,
+ sal_Bool bAbsorb) override;
+ void SAL_CALL
+ removeTextContent(const css::uno::Reference<css::text::XTextContent>& xContent) override;
+
+ // XPropertySet
+ css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() override;
+ void SAL_CALL setPropertyValue(const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ css::uno::Any SAL_CALL getPropertyValue(const OUString& rPropertyName) override;
+ void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference<css::beans::XPropertyChangeListener>& xListener) override;
+ void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference<css::beans::XPropertyChangeListener>& xListener) override;
+ void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference<css::beans::XVetoableChangeListener>& xListener) override;
+ void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference<css::beans::XVetoableChangeListener>& xListener) override;
+};
+
+/// UNO wrapper around SwContentControlManager.
+class SwXContentControls final : public cppu::WeakImplHelper<css::container::XIndexAccess>,
+ public SwUnoCollection
+{
+ ~SwXContentControls() override;
+
+public:
+ SwXContentControls(SwDoc* pDoc);
+
+ // XIndexAccess
+ sal_Int32 SAL_CALL getCount() override;
+ css::uno::Any SAL_CALL getByIndex(sal_Int32 nIndex) override;
+
+ // XElementAccess
+ css::uno::Type SAL_CALL getElementType() override;
+ sal_Bool SAL_CALL hasElements() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unoevent.hxx b/sw/source/core/inc/unoevent.hxx
new file mode 100644
index 0000000000..4906f447f6
--- /dev/null
+++ b/sw/source/core/inc/unoevent.hxx
@@ -0,0 +1,95 @@
+/* -*- 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_UNOEVENT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOEVENT_HXX
+
+#include <svtools/unoevent.hxx>
+
+class SvxMacroItem;
+class SwXFrame;
+class SwXTextFrame;
+class SwXTextGraphicObject;
+class SwXTextEmbeddedObject;
+class SwFormatINetFormat;
+namespace sw
+{
+class ICoreFrameStyle;
+}
+
+class SwHyperlinkEventDescriptor final : public SvDetachedEventDescriptor
+{
+ //XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+
+ virtual ~SwHyperlinkEventDescriptor() override;
+
+public:
+ SwHyperlinkEventDescriptor();
+
+ void copyMacrosFromINetFormat(const SwFormatINetFormat& aFormat);
+ void copyMacrosIntoINetFormat(SwFormatINetFormat& aFormat);
+
+ void
+ copyMacrosFromNameReplace(css::uno::Reference<css::container::XNameReplace> const& xReplace);
+};
+
+// SwEventDescriptor for
+// 1) SwXTextFrame
+// 2) SwXGraphicObject
+// 3) SwXEmbeddedObject
+// All these objects are an SwXFrame, so they can use a common implementation
+class SwFrameEventDescriptor final : public SvEventDescriptor
+{
+ SwXFrame& m_rFrame;
+
+public:
+ SwFrameEventDescriptor(SwXTextFrame& rFrameRef);
+ SwFrameEventDescriptor(SwXTextGraphicObject& rGraphicRef);
+ SwFrameEventDescriptor(SwXTextEmbeddedObject& rObjectRef);
+
+ virtual ~SwFrameEventDescriptor() override;
+
+ virtual OUString SAL_CALL getImplementationName() override;
+
+private:
+ virtual void setMacroItem(const SvxMacroItem& rItem) override;
+ virtual const SvxMacroItem& getMacroItem() override;
+ virtual sal_uInt16 getMacroItemWhich() const override;
+};
+
+class SwFrameStyleEventDescriptor final : public SvEventDescriptor
+{
+ sw::ICoreFrameStyle& m_rStyle;
+
+public:
+ SwFrameStyleEventDescriptor(sw::ICoreFrameStyle& rStyle);
+
+ virtual ~SwFrameStyleEventDescriptor() override;
+
+ virtual OUString SAL_CALL getImplementationName() override;
+
+private:
+ virtual void setMacroItem(const SvxMacroItem& rItem) override;
+ virtual const SvxMacroItem& getMacroItem() override;
+ virtual sal_uInt16 getMacroItemWhich() const override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unofield.hxx b/sw/source/core/inc/unofield.hxx
new file mode 100644
index 0000000000..55214020c0
--- /dev/null
+++ b/sw/source/core/inc/unofield.hxx
@@ -0,0 +1,229 @@
+/* -*- 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_UNOFIELD_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOFIELD_HXX
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/container/XEnumeration.hpp>
+#include <com/sun/star/util/XUpdatable.hpp>
+#include <com/sun/star/text/XDependentTextField.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+#include <unobaseclass.hxx>
+#include <unocoll.hxx>
+#include <fldbas.hxx>
+
+class SwDoc;
+class SwFormatField;
+class SwSetExpField;
+
+typedef ::cppu::WeakImplHelper
+< css::beans::XPropertySet
+, css::lang::XServiceInfo
+, css::lang::XComponent
+> SwXFieldMaster_Base;
+
+class SwXFieldMaster final
+ : public SwXFieldMaster_Base
+{
+
+private:
+ class Impl;
+ ::sw::UnoImplPtr<Impl> m_pImpl;
+
+ virtual ~SwXFieldMaster() override;
+
+ SwXFieldMaster(SwFieldType& rType, SwDoc * pDoc);
+
+ /// descriptor
+ SwXFieldMaster(SwDoc& rDoc, SwFieldIds nResId);
+
+public:
+
+ static rtl::Reference<SwXFieldMaster>
+ CreateXFieldMaster(SwDoc * pDoc, SwFieldType * pType,
+ SwFieldIds nResId = SwFieldIds::Unknown);
+
+ static OUString GetProgrammaticName(const SwFieldType& rType, SwDoc& rDoc);
+ static OUString LocalizeFormula(const SwSetExpField& rField, const OUString& rFormula, bool bQuery);
+
+ SwFieldType* GetFieldType(bool bDontCreate = false) const;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(
+ const OUString& rServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL
+ getSupportedServiceNames() override;
+
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+ virtual void SAL_CALL addEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+ virtual void SAL_CALL removeEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
+ getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(
+ const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ const OUString& rPropertyName) override;
+ virtual void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+ virtual void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+
+};
+
+typedef ::cppu::WeakImplHelper
+< css::text::XDependentTextField
+, css::lang::XServiceInfo
+, css::beans::XPropertySet
+, css::util::XUpdatable
+> SwXTextField_Base;
+
+/**
+ * UNO wrapper around an SwFormatField, i.e. a Writer field that the user creates via Insert ->
+ * Field.
+ */
+class SwXTextField final
+ : public SwXTextField_Base
+{
+
+private:
+ class Impl;
+ ::sw::UnoImplPtr<Impl> m_pImpl;
+
+ virtual ~SwXTextField() override;
+
+ SwXTextField(SwFormatField& rFormat, SwDoc & rDoc);
+
+ /// descriptor
+ SwXTextField(SwServiceType nServiceId, SwDoc* pDoc);
+
+public:
+ SwServiceType GetServiceId() const;
+
+ static void TransmuteLeadToInputField(SwSetExpField & rField);
+
+ /// @return an SwXTextField, either an already existing one or a new one
+ static rtl::Reference<SwXTextField>
+ CreateXTextField(SwDoc * pDoc, SwFormatField const* pFormat,
+ SwServiceType nServiceId = SwServiceType::Invalid);
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(
+ const OUString& rServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL
+ getSupportedServiceNames() override;
+
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+ virtual void SAL_CALL addEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+ virtual void SAL_CALL removeEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
+ getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(
+ const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ const OUString& rPropertyName) override;
+ virtual void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+ virtual void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+
+ // XUpdatable
+ virtual void SAL_CALL update() override;
+
+ // XTextContent
+ virtual void SAL_CALL attach(
+ const css::uno::Reference< css::text::XTextRange > & xTextRange) override;
+ virtual css::uno::Reference< css::text::XTextRange > SAL_CALL getAnchor() override;
+
+ // XTextField
+ virtual OUString SAL_CALL getPresentation(sal_Bool bShowCommand) override;
+
+ // XDependentTextField
+ virtual void SAL_CALL attachTextFieldMaster(
+ const css::uno::Reference< css::beans::XPropertySet > & xFieldMaster) override;
+ virtual css::uno::Reference< css::beans::XPropertySet> SAL_CALL getTextFieldMaster() override;
+
+};
+
+typedef ::cppu::WeakImplHelper
+< css::container::XEnumeration
+, css::lang::XServiceInfo
+> SwXFieldEnumeration_Base;
+
+class SwXFieldEnumeration final
+ : public SwXFieldEnumeration_Base
+{
+
+private:
+ class Impl;
+ ::sw::UnoImplPtr<Impl> m_pImpl;
+
+ virtual ~SwXFieldEnumeration() override;
+
+public:
+ explicit SwXFieldEnumeration(SwDoc & rDoc);
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(
+ const OUString& rServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL
+ getSupportedServiceNames() override;
+
+ // XEnumeration
+ virtual sal_Bool SAL_CALL hasMoreElements() override;
+ virtual css::uno::Any SAL_CALL nextElement() override;
+
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unoflatpara.hxx b/sw/source/core/inc/unoflatpara.hxx
new file mode 100644
index 0000000000..9fd768d277
--- /dev/null
+++ b/sw/source/core/inc/unoflatpara.hxx
@@ -0,0 +1,138 @@
+/* -*- 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_UNOFLATPARA_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOFLATPARA_HXX
+
+#include <cppuhelper/implbase.hxx>
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/text/XFlatParagraph.hpp>
+#include <com/sun/star/text/XFlatParagraphIterator.hpp>
+#include <svl/listener.hxx>
+#include "unotextmarkup.hxx"
+#include <nodeoffset.hxx>
+
+#include <set>
+
+namespace com::sun::star::container { class XStringKeyMap; }
+namespace com::sun::star::text { class XTextRange; }
+class SwTextNode;
+class SwDoc;
+class ModelToViewHelper;
+
+typedef ::cppu::ImplInheritanceHelper
+< SwXTextMarkup
+, css::beans::XPropertySet
+, css::text::XFlatParagraph
+> SwXFlatParagraph_Base;
+
+class SwXFlatParagraph final
+ : public SwXFlatParagraph_Base
+{
+public:
+ SwXFlatParagraph( SwTextNode& rTextNode, OUString aExpandText, const ModelToViewHelper& rConversionMap );
+ virtual ~SwXFlatParagraph() override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
+ getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(
+ const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ const OUString& rPropertyName) override;
+ virtual void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+ virtual void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+
+ // text::XTextMarkup:
+ virtual css::uno::Reference< css::container::XStringKeyMap > SAL_CALL getMarkupInfoContainer() override;
+
+ virtual void SAL_CALL commitStringMarkup(::sal_Int32 nType, const OUString & aIdentifier, ::sal_Int32 nStart, ::sal_Int32 nLength,
+ const css::uno::Reference< css::container::XStringKeyMap > & xMarkupInfoContainer) override;
+
+ virtual void SAL_CALL commitTextRangeMarkup(::sal_Int32 nType, const OUString & aIdentifier, const css::uno::Reference< css::text::XTextRange> & xRange,
+ const css::uno::Reference< css::container::XStringKeyMap > & xMarkupInfoContainer) override;
+
+ // text::XFlatParagraph:
+ virtual OUString SAL_CALL getText() override;
+ virtual sal_Bool SAL_CALL isModified() override;
+ virtual void SAL_CALL setChecked(::sal_Int32 nType, sal_Bool bVal) override;
+ virtual sal_Bool SAL_CALL isChecked(::sal_Int32 nType) override;
+ virtual css::lang::Locale SAL_CALL getLanguageOfText(::sal_Int32 nPos, ::sal_Int32 nLen) override;
+ virtual css::lang::Locale SAL_CALL getPrimaryLanguageOfText(::sal_Int32 nPos, ::sal_Int32 nLen) override;
+ virtual void SAL_CALL changeText(::sal_Int32 nPos, ::sal_Int32 nLen, const OUString & aNewText, const css::uno::Sequence< css::beans::PropertyValue > & aAttributes) override;
+ virtual void SAL_CALL changeAttributes(::sal_Int32 nPos, ::sal_Int32 nLen, const css::uno::Sequence< css::beans::PropertyValue > & aAttributes) override;
+ virtual css::uno::Sequence< ::sal_Int32 > SAL_CALL getLanguagePortions() override;
+
+ using SwXTextMarkup::GetTextNode;
+
+private:
+ SwXFlatParagraph( const SwXFlatParagraph & ) = delete;
+ SwXFlatParagraph & operator = ( const SwXFlatParagraph & ) = delete;
+
+ OUString maExpandText;
+ OUString maOrigText;
+};
+
+class SwXFlatParagraphIterator final :
+ public ::cppu::WeakImplHelper
+ <
+ css::text::XFlatParagraphIterator
+ >,
+ public SvtListener
+{
+public:
+ SwXFlatParagraphIterator( SwDoc& rDoc, sal_Int32 nType, bool bAutomatic );
+ virtual ~SwXFlatParagraphIterator() override;
+
+ // text::XFlatParagraphIterator:
+ virtual css::uno::Reference< css::text::XFlatParagraph > SAL_CALL getFirstPara() override;
+ virtual css::uno::Reference< css::text::XFlatParagraph > SAL_CALL getNextPara() override;
+ virtual css::uno::Reference< css::text::XFlatParagraph > SAL_CALL getLastPara() override;
+ virtual css::uno::Reference< css::text::XFlatParagraph > SAL_CALL getParaBefore(const css::uno::Reference< css::text::XFlatParagraph > & xPara) override;
+ virtual css::uno::Reference< css::text::XFlatParagraph > SAL_CALL getParaAfter(const css::uno::Reference< css::text::XFlatParagraph > & xPara) override;
+
+ virtual void Notify( const SfxHint& ) override;
+
+private:
+ SwXFlatParagraphIterator( const SwXFlatParagraphIterator & ) = delete;
+ SwXFlatParagraphIterator & operator =(const SwXFlatParagraphIterator & ) = delete;
+
+ SwDoc* mpDoc;
+ const sal_Int32 mnType;
+ const bool mbAutomatic;
+
+ SwNodeOffset mnCurrentNode; // used for non-automatic mode
+ SwNodeOffset mnEndNode; // used for non-automatic mode
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unofldmid.h b/sw/source/core/inc/unofldmid.h
new file mode 100644
index 0000000000..8c1838f456
--- /dev/null
+++ b/sw/source/core/inc/unofldmid.h
@@ -0,0 +1,58 @@
+/* -*- 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_UNOFLDMID_H
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOFLDMID_H
+
+// mapping of the properties on the descriptor
+#define FIELD_PROP_PAR1 10
+#define FIELD_PROP_PAR2 11
+#define FIELD_PROP_PAR3 12
+#define FIELD_PROP_FORMAT 13
+#define FIELD_PROP_SUBTYPE 14
+#define FIELD_PROP_BOOL1 15
+#define FIELD_PROP_BOOL2 16
+#define FIELD_PROP_DATE 17
+#define FIELD_PROP_USHORT1 18
+#define FIELD_PROP_USHORT2 19
+#define FIELD_PROP_BYTE1 20
+#define FIELD_PROP_DOUBLE 21
+#define FIELD_PROP_BOOL3 22
+#define FIELD_PROP_PAR4 23
+#define FIELD_PROP_SHORT1 24
+#define FIELD_PROP_DATE_TIME 25
+#define FIELD_PROP_PROP_SEQ 26
+#define FIELD_PROP_LOCALE 27
+#define FIELD_PROP_BOOL4 28
+#define FIELD_PROP_STRINGS 29
+#define FIELD_PROP_PAR5 30
+#define FIELD_PROP_GRABBAG 31
+
+#define FIELD_PROP_IS_FIELD_USED 32
+#define FIELD_PROP_IS_FIELD_DISPLAYED 33
+
+#define FIELD_PROP_TEXT 34
+#define FIELD_PROP_TITLE 35
+#define FIELD_PROP_PAR6 36
+#define FIELD_PROP_PAR7 37
+
+#define FIELD_PROP_USHORT3 38
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unofootnote.hxx b/sw/source/core/inc/unofootnote.hxx
new file mode 100644
index 0000000000..23f22bee2c
--- /dev/null
+++ b/sw/source/core/inc/unofootnote.hxx
@@ -0,0 +1,136 @@
+/* -*- 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_UNOFOOTNOTE_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOFOOTNOTE_HXX
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/text/XFootnote.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+#include <unotext.hxx>
+
+class SwDoc;
+class SwFormatFootnote;
+
+typedef ::cppu::WeakImplHelper
+< css::lang::XServiceInfo
+, css::beans::XPropertySet
+, css::container::XEnumerationAccess
+, css::text::XFootnote
+> SwXFootnote_Base;
+
+class SwXFootnote final
+ : public SwXFootnote_Base
+ , public SwXText
+{
+ friend class SwXFootnotes;
+
+ class Impl;
+ ::sw::UnoImplPtr<Impl> m_pImpl;
+
+ virtual const SwStartNode *GetStartNode() const override;
+
+ virtual ~SwXFootnote() override;
+
+ SwXFootnote(SwDoc & rDoc, SwFormatFootnote & rFormat);
+ SwXFootnote(const bool bEndnote);
+
+public:
+
+ static rtl::Reference<SwXFootnote>
+ CreateXFootnote(SwDoc & rDoc, SwFormatFootnote * pFootnoteFormat,
+ bool isEndnote = false);
+
+ // XInterface
+ virtual css::uno::Any SAL_CALL queryInterface(
+ const css::uno::Type& rType) override;
+ virtual void SAL_CALL acquire() noexcept override { OWeakObject::acquire(); }
+ virtual void SAL_CALL release() noexcept override { OWeakObject::release(); }
+
+ // XTypeProvider
+ virtual css::uno::Sequence< css::uno::Type >
+ SAL_CALL getTypes() override;
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL
+ getImplementationId() override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(
+ const OUString& rServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL
+ getSupportedServiceNames() override;
+
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+ virtual void SAL_CALL addEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+ virtual void SAL_CALL removeEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
+ getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(
+ const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ const OUString& rPropertyName) override;
+ virtual void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+ virtual void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+
+ // XEnumerationAccess
+ virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL
+ createEnumeration() override;
+
+ // XTextContent
+ virtual void SAL_CALL attach(
+ const css::uno::Reference< css::text::XTextRange > & xTextRange) override;
+ virtual css::uno::Reference< css::text::XTextRange > SAL_CALL getAnchor() override;
+
+ // XFootnote
+ virtual OUString SAL_CALL getLabel() override;
+ virtual void SAL_CALL setLabel(const OUString& rLabel) override;
+
+ // XSimpleText
+ virtual rtl::Reference< SwXTextCursor > createXTextCursor() override;
+ virtual rtl::Reference< SwXTextCursor > createXTextCursorByRange(
+ const ::css::uno::Reference< ::css::text::XTextRange >& aTextPosition ) override;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNOFOOTNOTE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unoidx.hxx b/sw/source/core/inc/unoidx.hxx
new file mode 100644
index 0000000000..30eca1011a
--- /dev/null
+++ b/sw/source/core/inc/unoidx.hxx
@@ -0,0 +1,214 @@
+/* -*- 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_UNOIDX_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOIDX_HXX
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/util/XRefreshable.hpp>
+#include <com/sun/star/text/XDocumentIndexMark.hpp>
+#include <com/sun/star/text/XDocumentIndex.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+#include <sfx2/Metadatable.hxx>
+
+#include <toxe.hxx>
+#include <unobaseclass.hxx>
+
+class SwDoc;
+class SwTOXBaseSection;
+class SwTOXMark;
+class SwTOXType;
+
+typedef ::cppu::ImplInheritanceHelper
+< ::sfx2::MetadatableMixin
+, css::lang::XServiceInfo
+, css::beans::XPropertySet
+, css::container::XNamed
+, css::util::XRefreshable
+, css::text::XDocumentIndex
+> SwXDocumentIndex_Base;
+
+class SwXDocumentIndex final
+ : public SwXDocumentIndex_Base
+{
+
+private:
+
+ class StyleAccess_Impl;
+ class TokenAccess_Impl;
+
+ class Impl;
+ ::sw::UnoImplPtr<Impl> m_pImpl;
+
+ virtual ~SwXDocumentIndex() override;
+
+ SwXDocumentIndex(SwTOXBaseSection &, SwDoc &);
+
+ /// descriptor
+ SwXDocumentIndex(const TOXTypes eToxType, SwDoc& rDoc);
+
+public:
+
+ static rtl::Reference<SwXDocumentIndex>
+ CreateXDocumentIndex(SwDoc & rDoc, SwTOXBaseSection * pSection,
+ TOXTypes eTypes = TOX_INDEX);
+
+ // MetadatableMixin
+ virtual ::sfx2::Metadatable* GetCoreObject() override;
+ virtual css::uno::Reference< css::frame::XModel >
+ GetModel() override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(
+ const OUString& rServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL
+ getSupportedServiceNames() override;
+
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+ virtual void SAL_CALL addEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+ virtual void SAL_CALL removeEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
+ getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(
+ const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ const OUString& rPropertyName) override;
+ virtual void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+ virtual void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+
+ // XNamed
+ virtual OUString SAL_CALL getName() override;
+ virtual void SAL_CALL setName(const OUString& rName) override;
+
+ // XRefreshable
+ virtual void SAL_CALL refresh() override;
+ virtual void SAL_CALL addRefreshListener(
+ const css::uno::Reference< css::util::XRefreshListener>& xListener) override;
+ virtual void SAL_CALL removeRefreshListener(
+ const css::uno::Reference< css::util::XRefreshListener>& xListener) override;
+
+ // XTextContent
+ virtual void SAL_CALL attach(
+ const css::uno::Reference< css::text::XTextRange > & xTextRange) override;
+ virtual css::uno::Reference< css::text::XTextRange > SAL_CALL getAnchor() override;
+
+ // XDocumentIndex
+ virtual OUString SAL_CALL getServiceName() override;
+ virtual void SAL_CALL update() override;
+
+};
+
+typedef ::cppu::WeakImplHelper
+< css::lang::XServiceInfo
+, css::beans::XPropertySet
+, css::text::XDocumentIndexMark
+> SwXDocumentIndexMark_Base;
+
+class SwXDocumentIndexMark final
+ : public SwXDocumentIndexMark_Base
+{
+
+private:
+
+ class Impl;
+ ::sw::UnoImplPtr<Impl> m_pImpl;
+
+ virtual ~SwXDocumentIndexMark() override;
+
+ SwXDocumentIndexMark(SwDoc & rDoc,
+ const SwTOXType & rType, const SwTOXMark & rMark);
+
+ /// descriptor
+ SwXDocumentIndexMark(const TOXTypes eToxType);
+
+public:
+
+ static rtl::Reference<SwXDocumentIndexMark>
+ CreateXDocumentIndexMark(SwDoc & rDoc,
+ SwTOXMark * pMark, TOXTypes eType = TOX_INDEX);
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(
+ const OUString& rServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL
+ getSupportedServiceNames() override;
+
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+ virtual void SAL_CALL addEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+ virtual void SAL_CALL removeEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
+ getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(
+ const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ const OUString& rPropertyName) override;
+ virtual void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference<css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+ virtual void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+
+ // XTextContent
+ virtual void SAL_CALL attach(
+ const css::uno::Reference< css::text::XTextRange > & xTextRange) override;
+ virtual css::uno::Reference< css::text::XTextRange > SAL_CALL getAnchor() override;
+
+ // XDocumentIndexMark
+ virtual OUString SAL_CALL getMarkEntry() override;
+ virtual void SAL_CALL setMarkEntry(const OUString& rIndexEntry) override;
+
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unolinebreak.hxx b/sw/source/core/inc/unolinebreak.hxx
new file mode 100644
index 0000000000..700f35e3ff
--- /dev/null
+++ b/sw/source/core/inc/unolinebreak.hxx
@@ -0,0 +1,86 @@
+/* -*- 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_UNOLINEBREAK_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOLINEBREAK_HXX
+
+#include <cppuhelper/implbase.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/text/XTextContent.hpp>
+
+#include <unobaseclass.hxx>
+
+class SwDoc;
+class SwFormatLineBreak;
+
+/// UNO API wrapper around an SwFormatLineBreak, exposed as the com.sun.star.text.LineBreak service.
+class SwXLineBreak final
+ : public cppu::WeakImplHelper<css::beans::XPropertySet, css::lang::XServiceInfo,
+ css::text::XTextContent>
+{
+ class Impl;
+ ::sw::UnoImplPtr<Impl> m_pImpl;
+
+ SwXLineBreak(SwFormatLineBreak& rFormat);
+ SwXLineBreak();
+
+ ~SwXLineBreak() override;
+
+public:
+ static rtl::Reference<SwXLineBreak> CreateXLineBreak(SwFormatLineBreak* pLineBreakFormat);
+
+ // XPropertySet
+ css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() override;
+ void SAL_CALL setPropertyValue(const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ css::uno::Any SAL_CALL getPropertyValue(const OUString& rPropertyName) override;
+ void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference<css::beans::XPropertyChangeListener>& xListener) override;
+ void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference<css::beans::XPropertyChangeListener>& xListener) override;
+ void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference<css::beans::XVetoableChangeListener>& xListener) override;
+ void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference<css::beans::XVetoableChangeListener>& xListener) override;
+
+ // XServiceInfo
+ OUString SAL_CALL getImplementationName() override;
+ sal_Bool SAL_CALL supportsService(const OUString& rServiceName) override;
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+ // XTextContent
+ void SAL_CALL attach(const css::uno::Reference<css::text::XTextRange>& xTextRange) override;
+ css::uno::Reference<css::text::XTextRange> SAL_CALL getAnchor() override;
+
+ // XComponent, via XTextContent
+ void SAL_CALL dispose() override;
+ void SAL_CALL
+ addEventListener(const css::uno::Reference<css::lang::XEventListener>& xListener) override;
+ void SAL_CALL
+ removeEventListener(const css::uno::Reference<css::lang::XEventListener>& xListener) override;
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNOLINEBREAK_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unometa.hxx b/sw/source/core/inc/unometa.hxx
new file mode 100644
index 0000000000..c2e4f4c30f
--- /dev/null
+++ b/sw/source/core/inc/unometa.hxx
@@ -0,0 +1,265 @@
+/* -*- 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_UNOMETA_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOMETA_HXX
+
+#include <memory>
+#include <deque>
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/text/XTextContent.hpp>
+#include <com/sun/star/text/XTextField.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+#include <sfx2/Metadatable.hxx>
+
+#include <unobaseclass.hxx>
+
+class SwXTextPortion;
+class SwPaM;
+class SwTextNode;
+class SwXText;
+namespace sw {
+ class Meta;
+}
+
+typedef std::deque<
+ rtl::Reference<SwXTextPortion> >
+ TextRangeList_t;
+
+
+
+typedef ::cppu::ImplInheritanceHelper
+< ::sfx2::MetadatableMixin
+, css::lang::XServiceInfo
+, css::container::XChild
+, css::container::XEnumerationAccess
+, css::text::XTextContent
+, css::text::XText
+> SwXMeta_Base;
+
+class SwXMeta
+ : public SwXMeta_Base
+{
+
+public:
+
+ class Impl;
+
+protected:
+
+ ::sw::UnoImplPtr<Impl> m_pImpl;
+
+ /// @throws css::lang::IllegalArgumentException
+ /// @throws css::uno::RuntimeException
+ void AttachImpl(
+ const css::uno::Reference< css::text::XTextRange > & xTextRange,
+ const sal_uInt16 nWhich);
+
+ virtual ~SwXMeta() override;
+
+ SwXMeta(SwXMeta const&) = delete;
+ SwXMeta& operator=(SwXMeta const&) = delete;
+
+ /// @param pDoc and pMeta != 0, but not & because of ImplInheritanceHelper
+ SwXMeta(SwDoc *const pDoc, ::sw::Meta *const pMeta,
+ css::uno::Reference<SwXText> const& xParentText,
+ std::unique_ptr<TextRangeList_t const> pPortions);
+
+ SwXMeta(SwDoc *const pDoc);
+
+public:
+
+ static rtl::Reference<SwXMeta>
+ CreateXMeta(
+ ::sw::Meta & rMeta,
+ css::uno::Reference<SwXText> xParentText,
+ std::unique_ptr<TextRangeList_t const> && pPortions);
+
+ static rtl::Reference<SwXMeta>
+ CreateXMeta(SwDoc & rDoc, bool isField);
+
+ /// init params with position of the attribute content (w/out CH_TXTATR)
+ bool SetContentRange( SwTextNode *& rpNode, sal_Int32 & rStart, sal_Int32 & rEnd) const;
+ css::uno::Reference< SwXText > const & GetParentText() const;
+
+ /// @throws css::lang::IllegalArgumentException
+ /// @throws css::uno::RuntimeException
+ bool CheckForOwnMemberMeta(const SwPaM & rPam, const bool bAbsorb);
+
+ // MetadatableMixin
+ virtual ::sfx2::Metadatable * GetCoreObject() override;
+ virtual css::uno::Reference< css::frame::XModel >
+ GetModel() override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(
+ const OUString& rServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL
+ getSupportedServiceNames() override;
+
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+ virtual void SAL_CALL addEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+ virtual void SAL_CALL removeEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+
+ // XChild
+ virtual css::uno::Reference< css::uno::XInterface > SAL_CALL
+ getParent() override;
+ virtual void SAL_CALL setParent(
+ css::uno::Reference< css::uno::XInterface> const& xParent) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+
+ // XEnumerationAccess
+ virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL
+ createEnumeration() override;
+
+ // XTextContent
+ virtual void SAL_CALL attach(
+ const css::uno::Reference< css::text::XTextRange > & xTextRange) override;
+ virtual css::uno::Reference< css::text::XTextRange > SAL_CALL getAnchor() override;
+
+ // XTextRange
+ virtual css::uno::Reference< css::text::XText >
+ SAL_CALL getText() override;
+ virtual css::uno::Reference<
+ css::text::XTextRange > SAL_CALL getStart() override;
+ virtual css::uno::Reference<
+ css::text::XTextRange > SAL_CALL getEnd() override;
+ virtual OUString SAL_CALL getString() override;
+ virtual void SAL_CALL setString(const OUString& rString) override;
+
+ // XSimpleText
+ virtual css::uno::Reference< css::text::XTextCursor > SAL_CALL
+ createTextCursor() override;
+ virtual css::uno::Reference< css::text::XTextCursor > SAL_CALL
+ createTextCursorByRange(
+ const css::uno::Reference< css::text::XTextRange > & xTextPosition) override;
+ virtual void SAL_CALL insertString(
+ const css::uno::Reference< css::text::XTextRange > & xRange,
+ const OUString& aString, sal_Bool bAbsorb) override;
+ virtual void SAL_CALL insertControlCharacter(
+ const css::uno::Reference< css::text::XTextRange > & xRange,
+ sal_Int16 nControlCharacter, sal_Bool bAbsorb) override;
+
+ // XText
+ virtual void SAL_CALL insertTextContent(
+ const css::uno::Reference< css::text::XTextRange > & xRange,
+ const css::uno::Reference< css::text::XTextContent > & xContent,
+ sal_Bool bAbsorb) override;
+ virtual void SAL_CALL removeTextContent(
+ const css::uno::Reference< css::text::XTextContent > & xContent) override;
+
+};
+
+typedef ::cppu::ImplInheritanceHelper
+< SwXMeta
+, css::beans::XPropertySet
+, css::text::XTextField
+> SwXMetaField_Base;
+
+class SwXMetaField final
+ : public SwXMetaField_Base
+{
+
+private:
+
+ virtual ~SwXMetaField() override;
+
+ friend rtl::Reference<SwXMeta>
+ SwXMeta::CreateXMeta(::sw::Meta &,
+ css::uno::Reference<SwXText>,
+ std::unique_ptr<TextRangeList_t const> && pPortions);
+
+ SwXMetaField(SwDoc *const pDoc, ::sw::Meta *const pMeta,
+ css::uno::Reference<SwXText> const& xParentText,
+ std::unique_ptr<TextRangeList_t const> pPortions);
+
+ friend rtl::Reference<SwXMeta>
+ SwXMeta::CreateXMeta(SwDoc &, bool);
+
+ SwXMetaField(SwDoc *const pDoc);
+
+public:
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(
+ const OUString& ServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL
+ getSupportedServiceNames( ) override;
+
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+ virtual void SAL_CALL addEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+ virtual void SAL_CALL removeEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
+ getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(
+ const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ virtual css::uno::Any SAL_CALL
+ getPropertyValue(const OUString& rPropertyName) override;
+ virtual void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+ virtual void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+
+ // XTextContent
+ virtual void SAL_CALL attach(
+ const css::uno::Reference< css::text::XTextRange > & xTextRange) override;
+ virtual css::uno::Reference< css::text::XTextRange > SAL_CALL getAnchor() override;
+
+ // XTextField
+ virtual OUString SAL_CALL getPresentation(sal_Bool bShowCommand) override;
+
+};
+
+/// get prefix/suffix from the RDF repository. @throws RuntimeException
+void getPrefixAndSuffix(
+ const css::uno::Reference< css::frame::XModel>& xModel,
+ const css::uno::Reference< css::rdf::XMetadatable>& xMetaField,
+ OUString *const o_pPrefix, OUString *const o_pSuffix, OUString *const o_pShadowColor);
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNOMETA_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unoparaframeenum.hxx b/sw/source/core/inc/unoparaframeenum.hxx
new file mode 100644
index 0000000000..c44e0f660c
--- /dev/null
+++ b/sw/source/core/inc/unoparaframeenum.hxx
@@ -0,0 +1,79 @@
+/* -*- 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_UNOPARAFRAMEENUM_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOPARAFRAMEENUM_HXX
+
+#include <deque>
+
+#include <calbck.hxx>
+#include <unobaseclass.hxx>
+
+
+class SwNode;
+class SwNodeIndex;
+class SwPaM;
+class SwFrameFormat;
+
+namespace com { namespace sun { namespace star { namespace text { class XTextContent; } } } }
+
+namespace sw
+{
+ struct FrameClient final : public SwClient
+ {
+ FrameClient(sw::BroadcastingModify* pModify) : SwClient(pModify) {};
+ };
+}
+struct FrameClientSortListEntry
+{
+ sal_Int32 nIndex;
+ sal_uInt32 nOrder;
+ std::unique_ptr<sw::FrameClient> pFrameClient;
+
+ FrameClientSortListEntry (sal_Int32 const i_nIndex,
+ sal_uInt32 const i_nOrder, std::unique_ptr<sw::FrameClient> i_pClient)
+ : nIndex(i_nIndex), nOrder(i_nOrder), pFrameClient(std::move(i_pClient)) { }
+};
+
+typedef std::deque< FrameClientSortListEntry >
+ FrameClientSortList_t;
+
+// #i28701# - adjust 4th parameter
+void CollectFrameAtNode( const SwNode& rNd,
+ FrameClientSortList_t& rFrames,
+ const bool bAtCharAnchoredObjs );
+
+enum ParaFrameMode
+{
+ PARAFRAME_PORTION_PARAGRAPH,
+ PARAFRAME_PORTION_CHAR,
+ PARAFRAME_PORTION_TEXTRANGE,
+};
+
+struct SwXParaFrameEnumeration
+ : public SwSimpleEnumeration_Base
+{
+ static rtl::Reference<SwXParaFrameEnumeration> Create(const SwPaM& rPaM, const enum ParaFrameMode eParaFrameMode, SwFrameFormat* const pFormat = nullptr);
+};
+
+css::uno::Reference<css::text::XTextContent> FrameClientToXTextContent(sw::FrameClient* pClient);
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNOPARAFRAMEENUM_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unoport.hxx b/sw/source/core/inc/unoport.hxx
new file mode 100644
index 0000000000..d64936a703
--- /dev/null
+++ b/sw/source/core/inc/unoport.hxx
@@ -0,0 +1,314 @@
+/* -*- 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_UNOPORT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOPORT_HXX
+
+#include <memory>
+#include <deque>
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
+#include <com/sun/star/container/XEnumeration.hpp>
+#include <com/sun/star/container/XContentEnumerationAccess.hpp>
+#include <com/sun/star/beans/XPropertyState.hpp>
+#include <com/sun/star/beans/XMultiPropertySet.hpp>
+#include <com/sun/star/beans/XTolerantMultiPropertySet.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+#include <svl/itemprop.hxx>
+#include <svl/listener.hxx>
+
+#include <unocrsr.hxx>
+
+namespace com::sun::star::beans { struct PropertyValue; }
+namespace com::sun::star::text { class XTextField; }
+namespace com::sun::star::text { class XFootnote; }
+
+class SwFrameFormat;
+class SwRangeRedline;
+class SwTextRuby;
+class SwXText;
+class SwXTextPortion;
+
+typedef std::deque<
+ rtl::Reference<SwXTextPortion> >
+ TextRangeList_t;
+
+enum SwTextPortionType
+{
+ PORTION_TEXT,
+ PORTION_FIELD,
+ PORTION_FRAME,
+ PORTION_FOOTNOTE,
+ PORTION_REFMARK_START,
+ PORTION_REFMARK_END,
+ PORTION_TOXMARK_START,
+ PORTION_TOXMARK_END,
+ PORTION_BOOKMARK_START,
+ PORTION_BOOKMARK_END,
+ PORTION_REDLINE_START,
+ PORTION_REDLINE_END,
+ PORTION_RUBY_START,
+ PORTION_RUBY_END,
+ PORTION_SOFT_PAGEBREAK,
+ PORTION_META,
+ PORTION_FIELD_START,
+ PORTION_FIELD_SEP,
+ PORTION_FIELD_END,
+ PORTION_FIELD_START_END,
+ PORTION_ANNOTATION,
+ PORTION_ANNOTATION_END,
+ PORTION_LINEBREAK,
+ PORTION_CONTENT_CONTROL,
+ PORTION_LIST_AUTOFMT
+};
+
+class SwXTextPortion : public cppu::WeakImplHelper
+<
+ css::beans::XTolerantMultiPropertySet,
+ css::beans::XMultiPropertySet,
+ css::beans::XPropertySet,
+ css::text::XTextRange,
+ css::beans::XPropertyState,
+ css::container::XContentEnumerationAccess,
+ css::lang::XServiceInfo
+>,
+ public SvtListener
+{
+private:
+
+ const SfxItemPropertySet * m_pPropSet;
+ const css::uno::Reference< css::text::XText >
+ m_xParentText;
+ css::uno::Reference< css::text::XTextContent >
+ m_xRefMark;
+ css::uno::Reference< css::text::XTextContent >
+ m_xTOXMark;
+ css::uno::Reference< css::text::XTextContent >
+ m_xBookmark;
+ css::uno::Reference< css::text::XFootnote >
+ m_xFootnote;
+ css::uno::Reference< css::text::XTextField >
+ m_xTextField;
+ css::uno::Reference< css::text::XTextContent >
+ m_xMeta;
+ css::uno::Reference<css::text::XTextContent> m_xLineBreak;
+ css::uno::Reference<css::text::XTextContent> m_xContentControl;
+ std::optional< css::uno::Any > m_oRubyText;
+ std::optional< css::uno::Any > m_oRubyStyle;
+ std::optional< css::uno::Any > m_oRubyAdjust;
+ std::optional< css::uno::Any > m_oRubyIsAbove;
+ std::optional< css::uno::Any > m_oRubyPosition;
+ sw::UnoCursorPointer m_pUnoCursor;
+
+ SwFrameFormat* m_pFrameFormat;
+ const SwTextPortionType m_ePortionType;
+
+ bool m_bIsCollapsed;
+
+ /// Expose the paragraph's RES_PARATR_LIST_AUTOFMT, not the char props of the underlying (empty)
+ /// text.
+ bool m_bIsListAutoFormat;
+
+ void init(const SwUnoCursor* pPortionCursor);
+
+protected:
+ /// @throws css::beans::UnknownPropertyException
+ /// @throws css::beans::PropertyVetoException
+ /// @throws css::lang::IllegalArgumentException
+ /// @throws css::lang::WrappedTargetException
+ /// @throws css::uno::RuntimeException
+ void SetPropertyValues_Impl(
+ const css::uno::Sequence< OUString >& aPropertyNames,
+ const css::uno::Sequence< css::uno::Any >& aValues );
+ /// @throws css::beans::UnknownPropertyException
+ /// @throws css::lang::WrappedTargetException
+ /// @throws css::uno::RuntimeException
+ css::uno::Sequence< css::uno::Any > GetPropertyValues_Impl(
+ const css::uno::Sequence< OUString >& aPropertyNames );
+
+ void GetPropertyValue( css::uno::Any &rVal,
+ const SfxItemPropertyMapEntry& rEntry, SwUnoCursor *pUnoCursor, std::unique_ptr<SfxItemSet> &pSet );
+
+ /// @throws css::uno::RuntimeException
+ css::uno::Sequence<css::beans::GetDirectPropertyTolerantResult> GetPropertyValuesTolerant_Impl(
+ const css::uno::Sequence< OUString >& rPropertyNames, bool bDirectValuesOnly );
+
+ virtual ~SwXTextPortion() override;
+
+ virtual void Notify(const SfxHint& rHint) override;
+
+public:
+ SwXTextPortion(const SwUnoCursor* pPortionCursor, css::uno::Reference< css::text::XText > xParent, SwTextPortionType eType );
+ SwXTextPortion(const SwUnoCursor* pPortionCursor, css::uno::Reference< css::text::XText > xParent, SwFrameFormat& rFormat );
+
+ // for Ruby
+ SwXTextPortion(const SwUnoCursor* pPortionCursor,
+ SwTextRuby const& rAttr,
+ css::uno::Reference< css::text::XText > xParent,
+ bool bIsEnd );
+
+ //XTextRange
+ virtual css::uno::Reference< css::text::XText > SAL_CALL getText() override;
+ virtual css::uno::Reference< css::text::XTextRange > SAL_CALL getStart() override;
+ virtual css::uno::Reference< css::text::XTextRange > SAL_CALL getEnd() override;
+ virtual OUString SAL_CALL getString() override;
+ virtual void SAL_CALL setString(const OUString& aString) override;
+
+ //XTolerantMultiPropertySet
+ virtual css::uno::Sequence< css::beans::SetPropertyTolerantFailed > SAL_CALL setPropertyValuesTolerant( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Sequence< css::uno::Any >& aValues ) override;
+ virtual css::uno::Sequence< css::beans::GetPropertyTolerantResult > SAL_CALL getPropertyValuesTolerant( const css::uno::Sequence< OUString >& aPropertyNames ) override;
+ virtual css::uno::Sequence< css::beans::GetDirectPropertyTolerantResult > SAL_CALL getDirectPropertyValuesTolerant( const css::uno::Sequence< OUString >& aPropertyNames ) override;
+
+ //XMultiPropertySet
+ virtual void SAL_CALL setPropertyValues( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Sequence< css::uno::Any >& aValues ) override;
+ virtual css::uno::Sequence< css::uno::Any > SAL_CALL getPropertyValues( const css::uno::Sequence< OUString >& aPropertyNames ) override;
+ virtual void SAL_CALL addPropertiesChangeListener( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertiesChangeListener( const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override;
+ virtual void SAL_CALL firePropertiesChangeEvent( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override;
+
+ //XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override;
+ virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override;
+ virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override;
+ virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+ virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+
+ //XPropertyState
+ virtual css::beans::PropertyState SAL_CALL getPropertyState( const OUString& PropertyName ) override;
+ virtual css::uno::Sequence< css::beans::PropertyState > SAL_CALL getPropertyStates( const css::uno::Sequence< OUString >& aPropertyName ) override;
+ virtual void SAL_CALL setPropertyToDefault( const OUString& PropertyName ) override;
+ virtual css::uno::Any SAL_CALL getPropertyDefault( const OUString& aPropertyName ) override;
+
+ //XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
+
+ //XContentEnumerationAccess
+ virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createContentEnumeration(const OUString& aServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getAvailableServiceNames() override;
+
+ void SetRefMark( css::uno::Reference< css::text::XTextContent > const & xMark)
+ { m_xRefMark = xMark; }
+
+ void SetTOXMark( css::uno::Reference< css::text::XTextContent > const & xMark)
+ { m_xTOXMark = xMark; }
+
+ void SetBookmark( css::uno::Reference< css::text::XTextContent > const & xMark)
+ { m_xBookmark = xMark; }
+
+ void SetFootnote( css::uno::Reference< css::text::XFootnote > const & xNote)
+ { m_xFootnote = xNote; }
+
+ void SetTextField( css::uno::Reference< css::text::XTextField> const & xField)
+ { m_xTextField = xField; }
+
+ void SetMeta( css::uno::Reference< css::text::XTextContent > const & xMeta)
+ { m_xMeta = xMeta; }
+
+ void SetLineBreak(css::uno::Reference<css::text::XTextContent> const& xLineBreak)
+ {
+ m_xLineBreak = xLineBreak;
+ }
+
+ void SetContentControl(const css::uno::Reference<css::text::XTextContent>& xContentControl)
+ {
+ m_xContentControl = xContentControl;
+ }
+
+ void SetCollapsed(bool bSet) { m_bIsCollapsed = bSet;}
+
+ SwTextPortionType GetTextPortionType() const { return m_ePortionType; }
+
+ SwUnoCursor& GetCursor() const
+ { return *m_pUnoCursor; }
+};
+
+class SwXTextPortionEnumeration final
+ : public ::cppu::WeakImplHelper
+ < css::container::XEnumeration
+ , css::lang::XServiceInfo
+ >
+{
+ TextRangeList_t m_Portions; // contains all portions, filled by ctor
+ sw::UnoCursorPointer m_pUnoCursor;
+
+ virtual ~SwXTextPortionEnumeration() override;
+
+public:
+ /// @param bOnlyTextFields tries to return less data, but may return more than just text fields
+ SwXTextPortionEnumeration(SwPaM& rParaCursor,
+ css::uno::Reference< SwXText > const & xParent,
+ const sal_Int32 nStart, const sal_Int32 nEnd, bool bOnlyTextFields = false );
+
+ SwXTextPortionEnumeration(SwPaM& rParaCursor,
+ TextRangeList_t && rPortions );
+
+ //XEnumeration
+ virtual sal_Bool SAL_CALL hasMoreElements() override;
+ virtual css::uno::Any SAL_CALL nextElement() override;
+
+ //XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL
+ getSupportedServiceNames() override;
+};
+
+class SwXRedlinePortion final : public SwXTextPortion
+{
+private:
+ SwRangeRedline const& m_rRedline;
+
+ bool Validate();
+
+ using SwXTextPortion::GetPropertyValue;
+
+ virtual ~SwXRedlinePortion() override;
+
+public:
+ SwXRedlinePortion(
+ SwRangeRedline const& rRedline,
+ SwUnoCursor const* pPortionCursor,
+ css::uno::Reference< css::text::XText > const& xParent,
+ bool const bIsStart);
+
+ /// @throws std::exception
+ static css::uno::Any GetPropertyValue(
+ std::u16string_view PropertyName, SwRangeRedline const& rRedline);
+ /// @throws std::exception
+ static css::uno::Sequence< css::beans::PropertyValue > CreateRedlineProperties(
+ SwRangeRedline const& rRedline, bool const bIsStart);
+
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL
+ getImplementationId() override;
+
+ // XPropertySet
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ const OUString& rPropertyName) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unorefmark.hxx b/sw/source/core/inc/unorefmark.hxx
new file mode 100644
index 0000000000..6d5535973c
--- /dev/null
+++ b/sw/source/core/inc/unorefmark.hxx
@@ -0,0 +1,108 @@
+/* -*- 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_UNOREFMARK_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOREFMARK_HXX
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/text/XTextContent.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+#include <unobaseclass.hxx>
+
+class SwDoc;
+class SwFormatRefMark;
+
+typedef ::cppu::WeakImplHelper
+< css::lang::XServiceInfo
+, css::beans::XPropertySet
+, css::container::XNamed
+, css::text::XTextContent
+> SwXReferenceMark_Base;
+
+class SwXReferenceMark final
+ : public SwXReferenceMark_Base
+{
+
+private:
+
+ class Impl;
+ ::sw::UnoImplPtr<Impl> m_pImpl;
+
+ virtual ~SwXReferenceMark() override;
+
+ SwXReferenceMark(SwDoc *const pDoc, SwFormatRefMark *const pMark);
+
+public:
+
+ static rtl::Reference<SwXReferenceMark>
+ CreateXReferenceMark(SwDoc & rDoc, SwFormatRefMark * pMarkFormat);
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(
+ const OUString& rServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL
+ getSupportedServiceNames() override;
+
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+ virtual void SAL_CALL addEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+ virtual void SAL_CALL removeEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
+ getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(
+ const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ const OUString& rPropertyName) override;
+ virtual void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+ virtual void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+
+ // XNamed
+ virtual OUString SAL_CALL getName() override;
+ virtual void SAL_CALL setName(const OUString& rName) override;
+
+ // XTextContent
+ virtual void SAL_CALL attach(
+ const css::uno::Reference< css::text::XTextRange > & xTextRange) override;
+ virtual css::uno::Reference< css::text::XTextRange > SAL_CALL getAnchor() override;
+
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNOREFMARK_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unosection.hxx b/sw/source/core/inc/unosection.hxx
new file mode 100644
index 0000000000..7527a2f110
--- /dev/null
+++ b/sw/source/core/inc/unosection.hxx
@@ -0,0 +1,155 @@
+/* -*- 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_UNOSECTION_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOSECTION_HXX
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XPropertyState.hpp>
+#include <com/sun/star/beans/XMultiPropertySet.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/text/XTextSection.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+#include <sfx2/Metadatable.hxx>
+
+#include <unobaseclass.hxx>
+
+class SwSectionFormat;
+
+typedef ::cppu::ImplInheritanceHelper
+< ::sfx2::MetadatableMixin
+, css::lang::XServiceInfo
+, css::beans::XPropertySet
+, css::beans::XPropertyState
+, css::beans::XMultiPropertySet
+, css::container::XNamed
+, css::text::XTextSection
+> SwXTextSection_Base;
+
+class SwXTextSection final
+ : public SwXTextSection_Base
+{
+
+private:
+
+ class Impl;
+ ::sw::UnoImplPtr<Impl> m_pImpl;
+
+ SwXTextSection(SwSectionFormat *const pFormat, const bool bIndexHeader);
+
+ virtual ~SwXTextSection() override;
+
+public:
+
+ SwSectionFormat* GetFormat() const;
+
+ static rtl::Reference< SwXTextSection >
+ CreateXTextSection(SwSectionFormat *const pFormat,
+ const bool bIndexHeader = false);
+
+ // MetadatableMixin
+ virtual ::sfx2::Metadatable* GetCoreObject() override;
+ virtual css::uno::Reference< css::frame::XModel >
+ GetModel() override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(
+ const OUString& rServiceName) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL
+ getSupportedServiceNames() override;
+
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+ virtual void SAL_CALL addEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+ virtual void SAL_CALL removeEventListener(
+ const css::uno::Reference< css::lang::XEventListener > & xListener) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
+ getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(
+ const OUString& rPropertyName,
+ const css::uno::Any& rValue) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ const OUString& rPropertyName) override;
+ virtual void SAL_CALL addPropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL removePropertyChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) override;
+ virtual void SAL_CALL addVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+ virtual void SAL_CALL removeVetoableChangeListener(
+ const OUString& rPropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) override;
+
+ // XPropertyState
+ virtual css::beans::PropertyState SAL_CALL
+ getPropertyState(const OUString& rPropertyName) override;
+ virtual css::uno::Sequence< css::beans::PropertyState > SAL_CALL
+ getPropertyStates(
+ const css::uno::Sequence< OUString >& rPropertyNames) override;
+ virtual void SAL_CALL setPropertyToDefault(
+ const OUString& rPropertyName) override;
+ virtual css::uno::Any SAL_CALL getPropertyDefault(
+ const OUString& rPropertyName) override;
+
+ // XMultiPropertySet
+ virtual void SAL_CALL setPropertyValues(
+ const css::uno::Sequence< OUString >& rPropertyNames,
+ const css::uno::Sequence< css::uno::Any >& rValues) override;
+ virtual css::uno::Sequence< css::uno::Any >
+ SAL_CALL getPropertyValues(
+ const css::uno::Sequence< OUString >& rPropertyNames) override;
+ virtual void SAL_CALL addPropertiesChangeListener(
+ const css::uno::Sequence< OUString >& rPropertyNames,
+ const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener) override;
+ virtual void SAL_CALL removePropertiesChangeListener(
+ const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener) override;
+ virtual void SAL_CALL firePropertiesChangeEvent(
+ const css::uno::Sequence< OUString >& rPropertyNames,
+ const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener) override;
+
+ // XNamed
+ virtual OUString SAL_CALL getName() override;
+ virtual void SAL_CALL setName(const OUString& rName) override;
+
+ // XTextContent
+ virtual void SAL_CALL attach(
+ const css::uno::Reference< css::text::XTextRange > & xTextRange) override;
+ virtual css::uno::Reference< css::text::XTextRange > SAL_CALL getAnchor() override;
+
+ // XTextSection
+ virtual css::uno::Reference< css::text::XTextSection > SAL_CALL
+ getParentSection() override;
+ virtual css::uno::Sequence< css::uno::Reference< css::text::XTextSection > > SAL_CALL
+ getChildSections() override;
+
+};
+
+#endif // INCLUDED_SW_SOURCE_CORE_INC_UNOSECTION_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/unotextmarkup.hxx b/sw/source/core/inc/unotextmarkup.hxx
new file mode 100644
index 0000000000..4475bafdac
--- /dev/null
+++ b/sw/source/core/inc/unotextmarkup.hxx
@@ -0,0 +1,103 @@
+/* -*- 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_UNOTEXTMARKUP_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_UNOTEXTMARKUP_HXX
+
+#include <cppuhelper/implbase.hxx>
+
+#include <com/sun/star/text/XTextMarkup.hpp>
+#include <com/sun/star/text/XMultiTextMarkup.hpp>
+
+#include <unobaseclass.hxx>
+
+#include <map>
+
+namespace com::sun::star::container { class XStringKeyMap; }
+namespace com::sun::star::text { class XTextRange; }
+class SwTextNode;
+class ModelToViewHelper;
+
+/** Implementation of the css::text::XTextMarkup interface
+ */
+class SwXTextMarkup
+ : public ::cppu::WeakImplHelper
+ < css::text::XTextMarkup
+ , css::text::XMultiTextMarkup
+ >
+{
+public:
+ SwXTextMarkup(SwTextNode *const rTextNode,
+ const ModelToViewHelper& rConversionMap);
+ virtual ~SwXTextMarkup() override;
+
+ // css::text::XTextMarkup:
+ virtual css::uno::Reference< css::container::XStringKeyMap > SAL_CALL getMarkupInfoContainer() override;
+
+ virtual void SAL_CALL commitStringMarkup(::sal_Int32 nType, const OUString & aIdentifier, ::sal_Int32 nStart, ::sal_Int32 nLength,
+ const css::uno::Reference< css::container::XStringKeyMap > & xMarkupInfoContainer) override;
+
+ virtual void SAL_CALL commitTextRangeMarkup(::sal_Int32 nType, const OUString & aIdentifier, const css::uno::Reference< css::text::XTextRange> & xRange,
+ const css::uno::Reference< css::container::XStringKeyMap > & xMarkupInfoContainer) override;
+
+ // css::text::XMultiTextMarkup:
+ virtual void SAL_CALL commitMultiTextMarkup( const css::uno::Sequence< css::text::TextMarkupDescriptor >& aMarkups ) override;
+
+private:
+ SwXTextMarkup( const SwXTextMarkup & ) = delete;
+ SwXTextMarkup & operator =( const SwXTextMarkup & ) = delete;
+
+ struct Impl;
+ ::sw::UnoImplPtr<Impl> m_pImpl;
+
+protected:
+ SwTextNode* GetTextNode();
+ void ClearTextNode();
+ const ModelToViewHelper& GetConversionMap() const;
+};
+
+/** Implementation of the css::container::XStringKeyMap interface
+ */
+class SwXStringKeyMap final :
+ public ::cppu::WeakImplHelper<
+ css::container::XStringKeyMap>
+{
+public:
+ SwXStringKeyMap();
+
+ // css::container::XStringKeyMap:
+ virtual css::uno::Any SAL_CALL getValue(const OUString & aKey) override;
+ virtual sal_Bool SAL_CALL hasValue(const OUString & aKey) override;
+ virtual void SAL_CALL insertValue(const OUString & aKey, const css::uno::Any & aValue) override;
+ virtual ::sal_Int32 SAL_CALL getCount() override;
+ virtual OUString SAL_CALL getKeyByIndex(::sal_Int32 nIndex) override;
+ virtual css::uno::Any SAL_CALL getValueByIndex(::sal_Int32 nIndex) override;
+
+private:
+ SwXStringKeyMap(SwXStringKeyMap const &) = delete;
+ void operator =(SwXStringKeyMap const &) = delete;
+
+ virtual ~SwXStringKeyMap() override {}
+
+ std::map< OUString, css::uno::Any > maMap;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
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: */
diff --git a/sw/source/core/inc/visiturl.hxx b/sw/source/core/inc/visiturl.hxx
new file mode 100644
index 0000000000..f273f33bb7
--- /dev/null
+++ b/sw/source/core/inc/visiturl.hxx
@@ -0,0 +1,40 @@
+/* -*- 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_VISITURL_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_VISITURL_HXX
+
+#include <svl/lstner.hxx>
+
+class SwDoc;
+
+class SwURLStateChanged final : public SfxListener
+{
+ SwDoc& m_rDoc;
+
+public:
+ SwURLStateChanged(SwDoc& rD);
+ virtual ~SwURLStateChanged() override;
+
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/vprint.hxx b/sw/source/core/inc/vprint.hxx
new file mode 100644
index 0000000000..9d2c7fe372
--- /dev/null
+++ b/sw/source/core/inc/vprint.hxx
@@ -0,0 +1,34 @@
+/* -*- 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 .
+ */
+#pragma once
+
+#include <sal/types.h>
+
+class SwRootFrame;
+class SwPageFrame;
+class SwPrintData;
+
+SwPageFrame const* sw_getPage(SwRootFrame const& rLayout, sal_Int32 const nPage);
+
+namespace sw
+{
+bool IsShrinkPageForPostIts(SwViewShell const& rShell, SwPrintData const&);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/wrong.hxx b/sw/source/core/inc/wrong.hxx
new file mode 100644
index 0000000000..d4bef9d26d
--- /dev/null
+++ b/sw/source/core/inc/wrong.hxx
@@ -0,0 +1,413 @@
+/* -*- 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_WRONG_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_WRONG_HXX
+
+#include <com/sun/star/container/NoSuchElementException.hpp>
+#include <com/sun/star/container/XStringKeyMap.hpp>
+
+#include <com/sun/star/awt/FontUnderline.hpp>
+#include <com/sun/star/uno/Any.hxx>
+
+#include <vector>
+#include <memory>
+#include <optional>
+
+#include <tools/color.hxx>
+#include <swtypes.hxx>
+#include <viewopt.hxx>
+#include "TextFrameIndex.hxx"
+
+#if defined _MSC_VER
+// For MSVC (without /vmg) SwTextNode must consistently be defined for
+// WrongListIterator::m_pGetWrongList of pointer-to-SwTextNode-member type to consistently have the
+// same size in all translation units that include this file:
+#include <ndtxt.hxx>
+#endif
+
+class SwWrongList;
+
+enum WrongAreaLineType
+{
+ WRONGAREA_NONE,
+ WRONGAREA_WAVE,
+ WRONGAREA_BOLDWAVE,
+ WRONGAREA_BOLD,
+ WRONGAREA_DASHED
+};
+
+enum WrongListType
+{
+ WRONGLIST_SPELL,
+ WRONGLIST_GRAMMAR,
+ WRONGLIST_SMARTTAG,
+ WRONGLIST_CHANGETRACKING
+};
+
+// ST2
+class SwWrongArea
+{
+public:
+ OUString maType;
+ css::uno::Reference< css::container::XStringKeyMap > mxPropertyBag;
+ sal_Int32 mnPos;
+ sal_Int32 mnLen;
+ SwWrongList* mpSubList;
+
+ Color mColor;
+ WrongAreaLineType mLineType;
+
+ SwWrongArea( OUString aType,
+ WrongListType listType,
+ css::uno::Reference< css::container::XStringKeyMap > const & xPropertyBag,
+ sal_Int32 nPos,
+ sal_Int32 nLen);
+
+ SwWrongArea( OUString aType,
+ css::uno::Reference< css::container::XStringKeyMap > const & xPropertyBag,
+ sal_Int32 nPos,
+ sal_Int32 nLen,
+ SwWrongList* pSubList);
+private:
+
+ static Color getGrammarColor ( css::uno::Reference< css::container::XStringKeyMap > const & xPropertyBag)
+ {
+ try
+ {
+ if (xPropertyBag.is())
+ {
+ css::uno::Any aLineColor = xPropertyBag->getValue("LineColor");
+ ::Color lineColor;
+
+ if (aLineColor >>= lineColor)
+ {
+ return lineColor;
+ }
+ }
+ }
+ catch(const css::container::NoSuchElementException&)
+ {
+ }
+ catch(const css::uno::RuntimeException&)
+ {
+ }
+
+ return SwViewOption::GetCurrentViewOptions().GetGrammarColor();
+ }
+
+ static WrongAreaLineType getGrammarLineType( css::uno::Reference< css::container::XStringKeyMap > const & xPropertyBag )
+ {
+ try
+ {
+ if (xPropertyBag.is())
+ {
+ css::uno::Any aLineType = xPropertyBag->getValue("LineType");
+ ::sal_Int16 lineType = 0;
+
+ if (!(aLineType >>= lineType))
+ {
+ return WRONGAREA_WAVE;
+ }
+ if (css::awt::FontUnderline::BOLDWAVE == lineType)
+ {
+ return WRONGAREA_BOLDWAVE;
+ }
+ if (css::awt::FontUnderline::BOLD == lineType)
+ {
+ return WRONGAREA_BOLD;
+ }
+ if (css::awt::FontUnderline::DASH == lineType)
+ {
+ return WRONGAREA_DASHED;
+ }
+ if (css::awt::FontUnderline::SMALLWAVE == lineType)
+ {
+ return WRONGAREA_WAVE; //Code draws wave height based on space that fits.
+ }
+ }
+ }
+ catch(const css::container::NoSuchElementException&)
+ {
+ }
+ catch(const css::uno::RuntimeException&)
+ {
+ }
+
+ return WRONGAREA_WAVE;
+ }
+
+ static Color getSmartColor ( css::uno::Reference< css::container::XStringKeyMap > const & xPropertyBag)
+ {
+ try
+ {
+ if (xPropertyBag.is())
+ {
+ css::uno::Any aLineColor = xPropertyBag->getValue("LineColor");
+ ::Color lineColor;
+
+ if (aLineColor >>= lineColor)
+ {
+ return lineColor;
+ }
+ }
+ }
+ catch(const css::container::NoSuchElementException&)
+ {
+ }
+ catch(const css::uno::RuntimeException&)
+ {
+ }
+
+ return SwViewOption::GetCurrentViewOptions().GetSmarttagColor();
+ }
+
+ static WrongAreaLineType getSmartLineType( css::uno::Reference< css::container::XStringKeyMap > const & xPropertyBag )
+ {
+ try
+ {
+ if (xPropertyBag.is())
+ {
+ css::uno::Any aLineType = xPropertyBag->getValue("LineType");
+ ::sal_Int16 lineType = 0;
+
+ if (!(aLineType >>= lineType))
+ {
+ return WRONGAREA_DASHED;
+ }
+ if (css::awt::FontUnderline::WAVE == lineType)
+ {
+ return WRONGAREA_WAVE;
+ }
+ if (css::awt::FontUnderline::BOLDWAVE == lineType)
+ {
+ return WRONGAREA_BOLDWAVE;
+ }
+ if (css::awt::FontUnderline::BOLD == lineType)
+ {
+ return WRONGAREA_BOLD;
+ }
+ if (css::awt::FontUnderline::SMALLWAVE == lineType)
+ {
+ return WRONGAREA_WAVE; //Code draws wave height based on space that fits.
+ }
+ }
+ }
+ catch(const css::container::NoSuchElementException&)
+ {
+ }
+ catch(const css::uno::RuntimeException&)
+ {
+ }
+
+ return WRONGAREA_DASHED;
+ }
+
+ static Color getWrongAreaColor(WrongListType listType,
+ css::uno::Reference< css::container::XStringKeyMap > const & xPropertyBag )
+ {
+ if (WRONGLIST_SPELL == listType)
+ {
+ return SwViewOption::GetCurrentViewOptions().GetSpellColor();
+ }
+ else if (WRONGLIST_GRAMMAR == listType)
+ {
+ return getGrammarColor(xPropertyBag);
+ }
+ else if (WRONGLIST_SMARTTAG == listType)
+ {
+ return getSmartColor(xPropertyBag);
+ }
+
+ return SwViewOption::GetCurrentViewOptions().GetSpellColor();
+ }
+
+ static WrongAreaLineType getWrongAreaLineType(WrongListType listType,
+ css::uno::Reference< css::container::XStringKeyMap > const & xPropertyBag )
+ {
+ if (WRONGLIST_SPELL == listType)
+ {
+ return WRONGAREA_WAVE;
+ }
+ else if (WRONGLIST_GRAMMAR == listType)
+ {
+ return getGrammarLineType(xPropertyBag);
+ }
+ else if (WRONGLIST_SMARTTAG == listType)
+ {
+ return getSmartLineType(xPropertyBag);
+ }
+
+ return WRONGAREA_WAVE;
+ }
+
+};
+
+class SAL_DLLPUBLIC_RTTI SwWrongList
+{
+ std::vector<SwWrongArea> maList;
+ WrongListType meType;
+
+ sal_Int32 mnBeginInvalid; // Start of the invalid range
+ sal_Int32 mnEndInvalid; // End of the invalid range
+
+ static void ShiftLeft( sal_Int32 &rPos, sal_Int32 nStart, sal_Int32 nEnd )
+ { if( rPos > nStart ) rPos = rPos > nEnd ? rPos - nEnd + nStart : nStart; }
+ void Invalidate_( sal_Int32 nBegin, sal_Int32 nEnd );
+
+ void Insert(sal_uInt16 nWhere, std::vector<SwWrongArea>::iterator startPos, std::vector<SwWrongArea>::iterator const & endPos);
+ void Remove( sal_uInt16 nIdx, sal_uInt16 nLen );
+
+ SwWrongList& operator= (const SwWrongList &) = delete;
+ SwWrongList( const SwWrongList& rCpy ) = delete;
+
+public:
+ SwWrongList( WrongListType eType );
+
+ virtual ~SwWrongList();
+ virtual SwWrongList* Clone();
+ virtual void CopyFrom( const SwWrongList& rCopy );
+
+ WrongListType GetWrongListType() const { return meType; }
+ sal_Int32 GetBeginInv() const { return mnBeginInvalid; }
+ sal_Int32 GetEndInv() const { return mnEndInvalid; }
+ void SetInvalid( sal_Int32 nBegin, sal_Int32 nEnd );
+ void Validate(){ mnBeginInvalid = mnEndInvalid = COMPLETE_STRING; }
+ void Invalidate( sal_Int32 nBegin, sal_Int32 nEnd );
+ bool InvalidateWrong();
+ enum class FreshState { FRESH, CURSOR, NOTHING };
+ FreshState Fresh( sal_Int32 &rStart, sal_Int32 &rEnd, sal_Int32 nPos,
+ sal_Int32 nLen, sal_uInt16 nIndex, sal_Int32 nCursorPos );
+ sal_uInt16 GetWrongPos( sal_Int32 nValue ) const;
+
+ bool Check( sal_Int32 &rChk, sal_Int32 &rLn ) const;
+ bool InWrongWord( sal_Int32 &rChk, sal_Int32 &rLn ) const;
+ sal_Int32 NextWrong( sal_Int32 nChk ) const;
+
+ void Move( sal_Int32 nPos, sal_Int32 nDiff );
+ void ClearList();
+
+ // Divide the list into two part, the wrong words until nSplitPos will be
+ // removed and transferred to a new SwWrongList.
+ std::unique_ptr<SwWrongList> SplitList( sal_Int32 nSplitPos );
+ // Join the next SwWrongList, nInsertPos is my own text length, where
+ // the other wrong list has to be inserted.
+ void JoinList( SwWrongList* pNext, sal_Int32 nInsertPos );
+
+ sal_Int32 Len( sal_uInt16 nIdx ) const
+ {
+ return nIdx < maList.size() ? maList[nIdx].mnLen : 0;
+ }
+
+ sal_Int32 Pos( sal_uInt16 nIdx ) const
+ {
+ return nIdx < maList.size() ? maList[nIdx].mnPos : 0;
+ }
+
+ sal_uInt16 Count() const { return o3tl::narrowing<sal_uInt16>(maList.size()); }
+
+ void Insert( const OUString& rType,
+ css::uno::Reference< css::container::XStringKeyMap > const & xPropertyBag,
+ sal_Int32 nNewPos, sal_Int32 nNewLen, sal_uInt16 nWhere )
+ {
+ std::vector<SwWrongArea>::iterator i = maList.begin();
+ if ( nWhere >= maList.size() )
+ i = maList.end(); // robust
+ else
+ i += nWhere;
+
+ maList.insert(i, SwWrongArea( rType, meType, xPropertyBag, nNewPos, nNewLen) );
+ }
+
+ void Insert( const OUString& rType,
+ css::uno::Reference< css::container::XStringKeyMap > const & xPropertyBag,
+ sal_Int32 nNewPos, sal_Int32 nNewLen );
+
+ SwWrongList* SubList( sal_uInt16 nIdx ) const
+ {
+ return nIdx < maList.size() ? maList[nIdx].mpSubList : nullptr;
+ }
+
+ void InsertSubList( sal_Int32 nNewPos, sal_Int32 nNewLen, sal_uInt16 nWhere, SwWrongList* pSubList );
+
+ const SwWrongArea* GetElement( sal_uInt16 nIdx ) const
+ {
+ return nIdx < maList.size() ? &maList[nIdx] : nullptr;
+ }
+ void RemoveEntry( sal_Int32 nBegin, sal_Int32 nEnd );
+ bool LookForEntry( sal_Int32 nBegin, sal_Int32 nEnd );
+};
+
+class SwTextNode;
+class SwTextFrame;
+
+namespace sw {
+
+struct MergedPara;
+
+class WrongListIteratorBase
+{
+protected:
+ SwWrongList const* (SwTextNode::*const m_pGetWrongList)() const;
+ sw::MergedPara const*const m_pMergedPara;
+ size_t m_CurrentExtent;
+ TextFrameIndex m_CurrentIndex;
+ SwWrongList const*const m_pWrongList;
+
+public:
+ /// for the text frame
+ WrongListIteratorBase(SwTextFrame const& rFrame,
+ SwWrongList const* (SwTextNode::*pGetWrongList)() const);
+ /// for SwTextSlot
+ WrongListIteratorBase(SwWrongList const& rWrongList);
+};
+
+class WrongListIterator
+ : public WrongListIteratorBase
+{
+public:
+ /// for the text frame
+ WrongListIterator(SwTextFrame const& rFrame,
+ SwWrongList const* (SwTextNode::*pGetWrongList)() const);
+ /// for SwTextSlot
+ WrongListIterator(SwWrongList const& rWrongList);
+
+ bool Check(TextFrameIndex &rStart, TextFrameIndex &rLen);
+ const SwWrongArea* GetWrongElement(TextFrameIndex nStart);
+
+ bool LooksUseful() { return m_pMergedPara || m_pWrongList; }
+};
+
+class WrongListIteratorCounter
+ : public WrongListIteratorBase
+{
+public:
+ WrongListIteratorCounter(SwTextFrame const& rFrame,
+ SwWrongList const* (SwTextNode::*pGetWrongList)() const);
+ WrongListIteratorCounter(SwWrongList const& rWrongList);
+
+ sal_uInt16 GetElementCount();
+ std::optional<std::pair<TextFrameIndex, TextFrameIndex>> GetElementAt(sal_uInt16 nIndex);
+};
+
+} // namespace sw
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */