xref: /AOO41X/main/sw/source/filter/xml/XMLRedlineImportHelper.hxx (revision 1d2dbeb0b7301723c6d13094e87a8714ef81a328)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _XMLREDLINEIMPORTHELPER_HXX
24 #define _XMLREDLINEIMPORTHELPER_HXX
25 
26 #include <rtl/ustring.hxx>
27 #include <com/sun/star/uno/Reference.h>
28 #include <com/sun/star/uno/Sequence.h>
29 #include <com/sun/star/util/DateTime.hpp>
30 #include "redline.hxx"
31 
32 #include <map>
33 
34 class RedlineInfo;
35 class SwRedlineData;
36 class SwDoc;
37 namespace com { namespace sun { namespace star {
38     namespace text { class XTextCursor; }
39     namespace text { class XTextRange; }
40     namespace frame { class XModel; }
41 } } }
42 
43 
44 typedef ::std::map< ::rtl::OUString, RedlineInfo* > RedlineMapType;
45 
46 class XMLRedlineImportHelper
47 {
48     const ::rtl::OUString sEmpty;
49     const ::rtl::OUString sInsertion;
50     const ::rtl::OUString sDeletion;
51     const ::rtl::OUString sFormatChange;
52     const ::rtl::OUString sShowChanges;
53     const ::rtl::OUString sRecordChanges;
54     const ::rtl::OUString sRedlineProtectionKey;
55 
56     RedlineMapType aRedlineMap;
57 
58     /// if sal_True, no redlines should be inserted into document
59     /// (This typically happen when a document is loaded in 'insert'-mode.)
60     sal_Bool bIgnoreRedlines;
61 
62     /// save information for saving and reconstruction of the redline mode
63     ::com::sun::star::uno::Reference<
64         ::com::sun::star::beans::XPropertySet> xModelPropertySet;
65     ::com::sun::star::uno::Reference<
66         ::com::sun::star::beans::XPropertySet> xImportInfoPropertySet;
67     sal_Bool bShowChanges;
68     sal_Bool bRecordChanges;
69     ::com::sun::star::uno::Sequence<sal_Int8> aProtectionKey;
70 
71 public:
72 
73     XMLRedlineImportHelper(
74         sal_Bool bIgnoreRedlines,       /// ignore redlines mode
75 
76         // property sets of model + import info for saving + restoring the
77         // redline mode
78         const ::com::sun::star::uno::Reference<
79             ::com::sun::star::beans::XPropertySet> & rModel,
80         const ::com::sun::star::uno::Reference<
81             ::com::sun::star::beans::XPropertySet> & rImportInfoSet );
82     virtual ~XMLRedlineImportHelper();
83 
84     /// create a redline object
85     /// (The redline will be inserted into the document after both start
86     ///  and end cursor has been set.)
87     void Add(
88         const ::rtl::OUString& rType,       /// redline type (insert, del,... )
89         const ::rtl::OUString& rId,         /// use to identify this redline
90         const ::rtl::OUString& rAuthor,     /// name of the author
91         const ::rtl::OUString& rComment,    /// redline comment
92         const ::com::sun::star::util::DateTime& rDateTime, /// date+time
93         sal_Bool bMergeLastParagraph);      /// merge last paragraph?
94 
95     /// create a text section for the redline, and return an
96     /// XText/XTextCursor that may be used to write into it.
97     ::com::sun::star::uno::Reference<
98         ::com::sun::star::text::XTextCursor> CreateRedlineTextSection(
99             ::com::sun::star::uno::Reference<   /// needed to get the document
100                     ::com::sun::star::text::XTextCursor> xOldCursor,
101             const ::rtl::OUString& rId);    /// ID used to RedlineAdd() call
102 
103     /// Set start or end position for a redline in the text body.
104     /// Accepts XTextRange objects.
105     void SetCursor(
106         const ::rtl::OUString& rId,     /// ID used in RedlineAdd() call
107         sal_Bool bStart,                /// start or end Range
108         ::com::sun::star::uno::Reference<   /// the actual XTextRange
109             ::com::sun::star::text::XTextRange> & rRange,
110         /// text range is (from an XML view) outside of a paragraph
111         /// (i.e. before a table)
112         sal_Bool bIsOusideOfParagraph);
113 
114     /**
115      * Adjust the start (end) position for a redline that begins in a
116      * start node. It takes the cursor positions _inside_ the redlined
117      * element (e.g. section or table).
118      *
119      * We will do sanity checking of the given text range: It will
120      * only be considered valid if it points to the next text node
121      * after the position given in a previous SetCursor */
122     void AdjustStartNodeCursor(
123         const ::rtl::OUString& rId,     /// ID used in RedlineAdd() call
124         sal_Bool bStart,
125         /// XTextRange _inside_ a table/section
126         ::com::sun::star::uno::Reference<
127             ::com::sun::star::text::XTextRange> & rRange);
128 
129     /// set redline mode: show changes
130     void SetShowChanges( sal_Bool bShowChanges );
131 
132     /// set redline mode: record changes
133     void SetRecordChanges( sal_Bool bRecordChanges );
134 
135     /// set redline protection key
136     void SetProtectionKey(
137         const ::com::sun::star::uno::Sequence<sal_Int8> & rKey );
138 
139 private:
140 
141     inline sal_Bool IsReady(RedlineInfo* pRedline);
142 
143     void InsertIntoDocument(RedlineInfo* pRedline);
144 
145     SwRedlineData* ConvertRedline(
146         RedlineInfo* pRedline,  /// RedlineInfo to be converted
147         SwDoc* pDoc);           /// document needed for Author-ID conversion
148 
149     /** save the redline mode (if rPropertySet is non-null) */
150     void SaveRedlineMode(
151         const ::com::sun::star::uno::Reference<
152         ::com::sun::star::beans::XPropertySet> & rPropertySet);
153 
154     /** don't restore the saved redline mode */
155     void DontRestoreRedlineMode();
156 
157 };
158 
159 #endif
160 
161