diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
commit | 267c6f2ac71f92999e969232431ba04678e7437e (patch) | |
tree | 358c9467650e1d0a1d7227a21dac2e3d08b622b2 /sw/inc/IDocumentContentOperations.hxx | |
parent | Initial commit. (diff) | |
download | libreoffice-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/inc/IDocumentContentOperations.hxx')
-rw-r--r-- | sw/inc/IDocumentContentOperations.hxx | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/sw/inc/IDocumentContentOperations.hxx b/sw/inc/IDocumentContentOperations.hxx new file mode 100644 index 0000000000..eafc586886 --- /dev/null +++ b/sw/inc/IDocumentContentOperations.hxx @@ -0,0 +1,253 @@ +/* -*- 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> +#include <rtl/ustring.hxx> +#include "swtypes.hxx" + +class SwPaM; +struct SwPosition; +class SwNode; +class SwNodeRange; +class Graphic; +class SfxItemSet; +class SfxPoolItem; +class GraphicObject; +class SdrObject; +class SwFrameFormat; +class SwDrawFrameFormat; +class SwFlyFrameFormat; +class SwNodeIndex; +class SwRootFrame; +class SwTextAttr; + +namespace utl { class TransliterationWrapper; } +namespace svt { class EmbeddedObjectRef; } + +enum class SwMoveFlags +{ + DEFAULT = 0x00, + ALLFLYS = 0x01, + CREATEUNDOOBJ = 0x02, + REDLINES = 0x04, + NO_DELFRMS = 0x08 +}; +namespace o3tl +{ + template<> struct typed_flags<SwMoveFlags> : is_typed_flags<SwMoveFlags, 0x0f> {}; +} + +// constants for inserting text +enum class SwInsertFlags +{ + DEFAULT = 0x00, // no extras + EMPTYEXPAND = 0x01, // expand empty hints at insert position + NOHINTEXPAND = 0x02, // do not expand any hints at insert pos + FORCEHINTEXPAND = 0x04 // expand all hints at insert position +}; +namespace o3tl +{ + template<> struct typed_flags<SwInsertFlags> : is_typed_flags<SwInsertFlags, 0x07> {}; +} + +enum class SwCopyFlags +{ + Default = 0, + CopyAll = (1<<0), ///< copy break attributes even when source is single node + CheckPosInFly = (1<<1), ///< check if target position is in fly anchored at source range + IsMoveToFly = (1<<2), ///< MakeFlyAndMove + // TODO: mbCopyIsMove? mbIsRedlineMove? +}; +namespace o3tl +{ + template<> struct typed_flags<SwCopyFlags> : is_typed_flags<SwCopyFlags, 0x07> {}; +} + +enum class SwDeleteFlags +{ + Default = 0, + ArtificialSelection = (1<<0), ///< keyboard delete, artificial selection, avoid deleting flys +}; +namespace o3tl +{ + template<> struct typed_flags<SwDeleteFlags> : is_typed_flags<SwDeleteFlags, 0x01> {}; +} + +/** Text operation/manipulation interface +*/ +class IDocumentContentOperations +{ +public: +public: + /** Copy a selected content range to a position + + The position can be in the same or in an another document. It can also + be within the range! + + \warning The range has to include at least two nodes or has to be a + SwDoc::IsColumnSelection, because the rPam is treated [mark, point[. + + Normally this function should work only with content nodes. But there + is a special case used by SwDoc::Paste, which starts the SwPaM at the + content start node. This position doesn't contain any content: + + @code + SwNodeIndex aSourceIdx( rSource.GetNodes().GetEndOfExtras(), 1 ); + @endcode + + This is important, because it prevents merging of the first node of + the range into the node pointed to by \p rPos. + As a result this keeps all properties of the first real content node, + which is the 2nd, including the Flys and the page description. In this + case the first (fake) node is silently dropped and all other nodes are + just copied. + + @param rPam + The source node range to copy + + @param rPos + The target copy destination + + @param flags + SwCopyFlags::CheckPos: + If this function should check if rPos is in a fly frame anchored in + rPam. If false, then no such check will be performed, and it is assumed + that the caller took care of verifying this constraint already. + */ + virtual bool CopyRange(SwPaM& rPam, SwPosition& rPos, SwCopyFlags flags, sal_uInt32 nMovedID = 0) const = 0; + + /** Delete section containing the node. + */ + virtual void DeleteSection(SwNode* pNode) = 0; + + /** Delete a range SwFlyFrameFormat. + */ + virtual void DeleteRange(SwPaM&) = 0; + + /** Delete full paragraphs. + */ + virtual bool DelFullPara(SwPaM&) = 0; + + /** complete delete of a given PaM + */ + virtual bool DeleteAndJoin(SwPaM&, SwDeleteFlags flags = SwDeleteFlags::Default) = 0; + + virtual bool MoveRange(SwPaM&, SwPosition&, SwMoveFlags) = 0; + + virtual bool MoveNodeRange(SwNodeRange&, SwNode&, SwMoveFlags) = 0; + + /** Move a range. + */ + virtual void MoveAndJoin(SwPaM&, SwPosition&) = 0; + + /** Overwrite string in an existing text node. + */ + virtual bool Overwrite(const SwPaM &rRg, const OUString& rStr) = 0; + + /** Insert string into existing text node at position rRg.Point(). + */ + virtual bool InsertString(const SwPaM &rRg, const OUString&, + const SwInsertFlags nInsertMode = SwInsertFlags::EMPTYEXPAND ) = 0; + + /// States that the last inserted string came from IME. + virtual void SetIME(bool bIME) = 0; + + /// Did the last inserted string come from IME? + virtual bool GetIME() const = 0; + + /** change text to Upper/Lower/Hiragana/Katakana/... + */ + virtual void TransliterateText(const SwPaM& rPaM, utl::TransliterationWrapper&) = 0; + + /** Insert graphic or formula. The XXXX are copied. + */ + virtual SwFlyFrameFormat* InsertGraphic( + const SwPaM &rRg, const OUString& rGrfName, + const OUString& rFltName, const Graphic* pGraphic, + const SfxItemSet* pFlyAttrSet, const SfxItemSet* pGrfAttrSet, + SwFrameFormat*) = 0; + + /** Transpose graphic (with undo) + */ + virtual void ReRead(SwPaM&, const OUString& rGrfName, const OUString& rFltName, const Graphic* pGraphic) = 0; + + /** Insert a DrawObject. The object must be already registered + in DrawModel. + */ + virtual SwDrawFrameFormat* InsertDrawObj( + const SwPaM &rRg, SdrObject& rDrawObj, const SfxItemSet& rFlyAttrSet) = 0; + + /** Insert OLE-objects. + */ + virtual SwFlyFrameFormat* InsertEmbObject( + const SwPaM &rRg, const svt::EmbeddedObjectRef& xObj, + SfxItemSet* pFlyAttrSet) = 0; + + virtual SwFlyFrameFormat* InsertOLE( + const SwPaM &rRg, const OUString& rObjName, sal_Int64 nAspect, + const SfxItemSet* pFlyAttrSet, const SfxItemSet* pGrfAttrSet) = 0; + + /** Split a node at rPos (implemented only for TextNode). + */ + virtual bool SplitNode(const SwPosition &rPos, bool bChkTableStart) = 0; + + virtual bool AppendTextNode(SwPosition& rPos) = 0; + + /** Replace selected range in a TextNode with string. + Intended for search & replace. + bRegExpRplc - replace tabs (\\t) and insert the found string + ( not \& ). E.g.: Find: "zzz", Replace: "xx\t\\t..&..\&" + --> "xx\t<Tab>..zzz..&" + */ + virtual bool ReplaceRange(SwPaM& rPam, const OUString& rNewStr, + const bool bRegExReplace) = 0; + + /** Insert an attribute. If rRg spans several nodes the + attribute is split, provided it makes sense. + Nodes, where this attribute does not make sense are ignored. + In nodes completely enclosed in the selection the attribute + becomes hard-formatted, in all other (text-) nodes the attribute + is inserted into the attribute array. + For a character attribute, in cases where no selection exists + an "empty" hint is inserted. If there is a selection the attribute + is hard-formatted and added to the node at rRg.Start(). + If the attribute could not be inserted, the method returns + false. + */ + virtual bool InsertPoolItem(const SwPaM &rRg, const SfxPoolItem&, + const SetAttrMode nFlags = SetAttrMode::DEFAULT, + SwRootFrame const* pLayout = nullptr, + SwTextAttr **ppNewTextAttr = nullptr) = 0; + + virtual void InsertItemSet (const SwPaM &rRg, const SfxItemSet&, + const SetAttrMode nFlags = SetAttrMode::DEFAULT, + SwRootFrame const* pLayout = nullptr) = 0; + + /** Removes any leading white space from the paragraph + */ + virtual void RemoveLeadingWhiteSpace(const SwPosition & rPos ) = 0; + virtual void RemoveLeadingWhiteSpace(SwPaM& rPaM) = 0; + +protected: + virtual ~IDocumentContentOperations() {}; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |