1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #ifndef INCLUDED_SW_INC_IDOCUMENTREDLINEACCESS_HXX
21 #define INCLUDED_SW_INC_IDOCUMENTREDLINEACCESS_HXX
22 
23 #include <sal/config.h>
24 
25 #include <cstddef>
26 
27 #include <sal/types.h>
28 
29 #include <com/sun/star/uno/Sequence.h>
30 #include <o3tl/typed_flags_set.hxx>
31 #include <svx/ctredlin.hxx>
32 
33 #include "docary.hxx"
34 
35 class SwRangeRedline;
36 class SwTableRowRedline;
37 class SwTableCellRedline;
38 class SwPaM;
39 struct SwPosition;
40 class SwStartNode;
41 class SwNode;
42 
43 enum class RedlineFlags
44 {
45     NONE                 = 0x000, ///< no RedlineFlags
46     On                   = 0x001, ///< RedlineFlags on
47     Ignore               = 0x002, ///< ignore Redlines
48     ShowInsert           = 0x010, ///< show all inserts
49     ShowDelete           = 0x020, ///< show all deletes
50     ShowMask             = ShowInsert | ShowDelete,
51 
52     // For internal management:
53     // remove the original Redlines together with their content
54     // (Clipboard/text modules).
55     DeleteRedlines       = 0x100,
56     // don't combine any redlines. This flag may be only used in Undo.
57     DontCombineRedlines  = 0x400,
58 };
59 namespace o3tl
60 {
61     template<> struct typed_flags<RedlineFlags> : is_typed_flags<RedlineFlags, 0x533> {};
62 }
63 
SwRedlineTypeToOUString(RedlineType eType)64 inline OUString SwRedlineTypeToOUString(RedlineType eType)
65 {
66     OUString sRet;
67     switch(eType)
68     {
69         case RedlineType::Insert: sRet = "Insert"; break;
70         case RedlineType::Delete: sRet = "Delete"; break;
71         case RedlineType::Format: sRet = "Format"; break;
72         case RedlineType::ParagraphFormat: sRet = "ParagraphFormat"; break;
73         case RedlineType::Table:  sRet = "TextTable"; break;
74         case RedlineType::FmtColl:sRet = "Style"; break;
75         default: break;
76     }
77     return sRet;
78 };
79 
80 class IDocumentRedlineAccess
81 {
82      // Static helper functions
83 public:
IsShowChanges(const RedlineFlags eM)84     static bool IsShowChanges(const RedlineFlags eM)
85     { return (RedlineFlags::ShowInsert | RedlineFlags::ShowDelete) == (eM & RedlineFlags::ShowMask); }
86 
IsHideChanges(const RedlineFlags eM)87     static bool IsHideChanges(const RedlineFlags eM)
88     { return RedlineFlags::ShowInsert == (eM & RedlineFlags::ShowMask); }
89 
IsShowOriginal(const RedlineFlags eM)90     static bool IsShowOriginal(const RedlineFlags eM)
91     { return RedlineFlags::ShowDelete == (eM & RedlineFlags::ShowMask); }
92 
IsRedlineOn(const RedlineFlags eM)93     static bool IsRedlineOn(const RedlineFlags eM)
94     { return RedlineFlags::On == (eM & (RedlineFlags::On | RedlineFlags::Ignore )); }
95 
96 public:
97 
98     /** Query the currently set redline mode
99 
100         @returns
101         the currently set redline mode
102     */
103      virtual RedlineFlags GetRedlineFlags() const = 0;
104 
105     /** Set a new redline mode.
106 
107         @param eMode
108         [in] the new redline mode.
109     */
110     virtual void SetRedlineFlags_intern(/*[in]*/RedlineFlags eMode) = 0;
111 
112     /** Set a new redline mode.
113 
114         @param eMode
115         [in] the new redline mode.
116     */
117     virtual void SetRedlineFlags(/*[in]*/RedlineFlags eMode) = 0;
118 
119     /** Query if redlining is on.
120 
121         @returns
122         <TRUE/> if redlining is on <FALSE/> otherwise
123     */
124     virtual bool IsRedlineOn() const = 0;
125 
126     virtual bool IsIgnoreRedline() const = 0;
127 
128     virtual const SwRedlineTable& GetRedlineTable() const = 0;
129     virtual SwRedlineTable& GetRedlineTable() = 0;
130     virtual const SwExtraRedlineTable& GetExtraRedlineTable() const = 0;
131     virtual SwExtraRedlineTable& GetExtraRedlineTable() = 0;
132     virtual bool HasExtraRedlineTable() const = 0;
133 
134     virtual bool IsInRedlines(const SwNode& rNode) const = 0;
135 
136     enum class AppendResult { IGNORED, MERGED, APPENDED };
137     /** Append a new redline
138 
139         @param pNewRedl redline to insert
140 
141         @param bCallDelete
142             if set, then for a new DELETE redline that is inserted so that it
143             overlaps an existing INSERT redline with the same author, the
144             overlapping range is deleted, i.e. the new DELETE removes
145             existing INSERT for that range
146 
147         @returns
148             APPENDED if pNewRedl is still alive and was appended
149             MERGED if pNewRedl was deleted but has been merged with existing one
150             IGNORED if pNewRedl was deleted and ignored/invalid
151     */
152     virtual AppendResult AppendRedline(/*[in]*/SwRangeRedline* pNewRedl, /*[in]*/bool bCallDelete) = 0;
153 
154     virtual bool AppendTableRowRedline(/*[in]*/SwTableRowRedline* pPtr) = 0;
155     virtual bool AppendTableCellRedline(/*[in]*/SwTableCellRedline* pPtr) = 0;
156 
157     virtual bool SplitRedline(/*[in]*/const SwPaM& rPam) = 0;
158 
159     virtual bool DeleteRedline(
160         /*[in]*/const SwPaM& rPam,
161         /*[in]*/bool bSaveInUndo,
162         /*[in]*/RedlineType nDelType) = 0;
163 
164     virtual bool DeleteRedline(
165         /*[in]*/const SwStartNode& rSection,
166         /*[in]*/bool bSaveInUndo,
167         /*[in]*/RedlineType nDelType) = 0;
168 
169     virtual SwRedlineTable::size_type GetRedlinePos(
170         /*[in]*/const SwNode& rNode,
171         /*[in]*/RedlineType nType) const = 0;
172 
173     virtual void CompressRedlines() = 0;
174 
175     virtual const SwRangeRedline* GetRedline(
176         /*[in]*/const SwPosition& rPos,
177         /*[in]*/SwRedlineTable::size_type* pFndPos) const = 0;
178 
179     virtual bool IsRedlineMove() const = 0;
180 
181     virtual void SetRedlineMove(/*[in]*/bool bFlag) = 0;
182 
183     virtual bool AcceptRedline(/*[in]*/SwRedlineTable::size_type nPos, /*[in]*/bool bCallDelete) = 0;
184 
185     virtual bool AcceptRedline(/*[in]*/const SwPaM& rPam, /*[in]*/bool bCallDelete) = 0;
186 
187     virtual void AcceptRedlineParagraphFormatting(/*[in]*/const SwPaM& rPam ) = 0;
188 
189     virtual bool RejectRedline(/*[in]*/SwRedlineTable::size_type nPos, /*[in]*/bool bCallDelete) = 0;
190 
191     virtual bool RejectRedline(/*[in]*/const SwPaM& rPam, /*[in]*/bool bCallDelete) = 0;
192 
193     virtual const SwRangeRedline* SelNextRedline(/*[in]*/SwPaM& rPam) const = 0;
194 
195     virtual const SwRangeRedline* SelPrevRedline(/*[in]*/SwPaM& rPam) const = 0;
196 
197     virtual void AcceptAllRedline(/*[in]*/bool bAcceptReject) = 0;
198 
199     // Representation has changed, invalidate all Redlines.
200     virtual void UpdateRedlineAttr() = 0;
201 
202     // Create a new Author if required.
203     virtual std::size_t GetRedlineAuthor() = 0;
204 
205     // For Readers etc.: register new Author in table.
206     virtual std::size_t InsertRedlineAuthor(const OUString& rAuthor) = 0;
207 
208     // Place a comment at Redline at given position.
209     virtual bool SetRedlineComment(
210         /*[in]*/const SwPaM& rPam,
211         /*[in]*/const OUString& rComment) = 0;
212 
213     virtual const css::uno::Sequence <sal_Int8>& GetRedlinePassword() const = 0;
214 
215     virtual void SetRedlinePassword(
216         /*[in]*/const css::uno::Sequence <sal_Int8>& rNewPassword) = 0;
217 
218 protected:
~IDocumentRedlineAccess()219      virtual ~IDocumentRedlineAccess() {};
220 };
221 
222 #endif
223 
224 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
225