xref: /trunk/main/sw/source/core/access/parachangetrackinginfo.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*efeef26fSAndrew Rist  * distributed with this work for additional information
6*efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9*efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15*efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17*efeef26fSAndrew Rist  * specific language governing permissions and limitations
18*efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*efeef26fSAndrew Rist  *************************************************************/
21*efeef26fSAndrew Rist 
22*efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "precompiled_sw.hxx"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include <parachangetrackinginfo.hxx>
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <errhdl.hxx>
29cdf0e10cSrcweir #include <wrong.hxx>
30cdf0e10cSrcweir #include <com/sun/star/text/TextMarkupType.hpp>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include <txtfrm.hxx>
33cdf0e10cSrcweir #include <ndtxt.hxx>
34cdf0e10cSrcweir #include <IDocumentRedlineAccess.hxx>
35cdf0e10cSrcweir #include <docary.hxx>
36cdf0e10cSrcweir #include <redline.hxx>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir namespace css = com::sun::star;
39cdf0e10cSrcweir 
40cdf0e10cSrcweir namespace {
initChangeTrackTextMarkupLists(const SwTxtFrm & rTxtFrm,SwWrongList * & opChangeTrackInsertionTextMarkupList,SwWrongList * & opChangeTrackDeletionTextMarkupList,SwWrongList * & opChangeTrackFormatChangeTextMarkupList)41cdf0e10cSrcweir     void initChangeTrackTextMarkupLists( const SwTxtFrm& rTxtFrm,
42cdf0e10cSrcweir                                          SwWrongList*& opChangeTrackInsertionTextMarkupList,
43cdf0e10cSrcweir                                          SwWrongList*& opChangeTrackDeletionTextMarkupList,
44cdf0e10cSrcweir                                          SwWrongList*& opChangeTrackFormatChangeTextMarkupList )
45cdf0e10cSrcweir     {
46cdf0e10cSrcweir         opChangeTrackInsertionTextMarkupList = new SwWrongList( WRONGLIST_CHANGETRACKING );
47cdf0e10cSrcweir         opChangeTrackDeletionTextMarkupList = new SwWrongList( WRONGLIST_CHANGETRACKING );
48cdf0e10cSrcweir         opChangeTrackFormatChangeTextMarkupList = new SwWrongList( WRONGLIST_CHANGETRACKING );
49cdf0e10cSrcweir 
50cdf0e10cSrcweir         if ( !rTxtFrm.GetTxtNode() )
51cdf0e10cSrcweir         {
52cdf0e10cSrcweir             ASSERT( false,
53cdf0e10cSrcweir                     "<initChangeTrackTextMarkupLists(..) - missing <SwTxtNode> instance!" );
54cdf0e10cSrcweir             return;
55cdf0e10cSrcweir         }
56cdf0e10cSrcweir         const SwTxtNode& rTxtNode( *(rTxtFrm.GetTxtNode()) );
57cdf0e10cSrcweir 
58cdf0e10cSrcweir         const IDocumentRedlineAccess* pIDocChangeTrack( rTxtNode.getIDocumentRedlineAccess() );
59cdf0e10cSrcweir         if ( !pIDocChangeTrack )
60cdf0e10cSrcweir         {
61cdf0e10cSrcweir             ASSERT( false,
62cdf0e10cSrcweir                     "<initChangeTrackTextMarkupLists(..) - missing <IDocumentRedlineAccess> instance!" );
63cdf0e10cSrcweir             return;
64cdf0e10cSrcweir         }
65cdf0e10cSrcweir 
66cdf0e10cSrcweir         if ( !IDocumentRedlineAccess::IsShowChanges( pIDocChangeTrack->GetRedlineMode() ) ||
67cdf0e10cSrcweir              pIDocChangeTrack->GetRedlineTbl().Count() == 0 )
68cdf0e10cSrcweir         {
69cdf0e10cSrcweir             // nothing to do --> empty change track text markup lists.
70cdf0e10cSrcweir             return;
71cdf0e10cSrcweir         }
72cdf0e10cSrcweir 
73cdf0e10cSrcweir         const sal_uInt16 nIdxOfFirstRedlineForTxtNode =
74cdf0e10cSrcweir                     pIDocChangeTrack->GetRedlinePos( rTxtNode, USHRT_MAX );
75cdf0e10cSrcweir         if ( nIdxOfFirstRedlineForTxtNode == USHRT_MAX )
76cdf0e10cSrcweir         {
77cdf0e10cSrcweir             // nothing to do --> empty change track text markup lists.
78cdf0e10cSrcweir             return;
79cdf0e10cSrcweir         }
80cdf0e10cSrcweir 
81cdf0e10cSrcweir         const xub_StrLen nTxtFrmTextStartPos = rTxtFrm.IsFollow()
82cdf0e10cSrcweir                                                ? rTxtFrm.GetOfst()
83cdf0e10cSrcweir                                                : 0;
84cdf0e10cSrcweir         const xub_StrLen nTxtFrmTextEndPos = rTxtFrm.HasFollow()
85cdf0e10cSrcweir                                              ? rTxtFrm.GetFollow()->GetOfst()
86cdf0e10cSrcweir                                              : rTxtFrm.GetTxt().Len();
87cdf0e10cSrcweir 
88cdf0e10cSrcweir         // iteration over the redlines which overlap with the text node.
89cdf0e10cSrcweir         const SwRedlineTbl& rRedlineTbl = pIDocChangeTrack->GetRedlineTbl();
90cdf0e10cSrcweir         const sal_uInt16 nRedlineCount( rRedlineTbl.Count() );
91cdf0e10cSrcweir         for ( sal_uInt16 nActRedline = nIdxOfFirstRedlineForTxtNode;
92cdf0e10cSrcweir               nActRedline < nRedlineCount;
93cdf0e10cSrcweir               ++nActRedline)
94cdf0e10cSrcweir         {
95cdf0e10cSrcweir             const SwRedline* pActRedline = rRedlineTbl[ nActRedline ];
96cdf0e10cSrcweir             if ( pActRedline->Start()->nNode > rTxtNode.GetIndex() )
97cdf0e10cSrcweir             {
98cdf0e10cSrcweir                 break;
99cdf0e10cSrcweir             }
100cdf0e10cSrcweir 
101cdf0e10cSrcweir             xub_StrLen nTxtNodeChangeTrackStart( STRING_LEN );
102cdf0e10cSrcweir             xub_StrLen nTxtNodeChangeTrackEnd( STRING_LEN );
103cdf0e10cSrcweir             pActRedline->CalcStartEnd( rTxtNode.GetIndex(),
104cdf0e10cSrcweir                                        nTxtNodeChangeTrackStart,
105cdf0e10cSrcweir                                        nTxtNodeChangeTrackEnd );
106cdf0e10cSrcweir             if ( nTxtNodeChangeTrackStart > nTxtFrmTextEndPos ||
107cdf0e10cSrcweir                  nTxtNodeChangeTrackEnd < nTxtFrmTextStartPos )
108cdf0e10cSrcweir             {
109cdf0e10cSrcweir                 // Consider only redlines which overlap with the text frame's text.
110cdf0e10cSrcweir                 continue;
111cdf0e10cSrcweir             }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir             SwWrongList* pMarkupList( 0 );
114cdf0e10cSrcweir             switch ( pActRedline->GetType() )
115cdf0e10cSrcweir             {
116cdf0e10cSrcweir                 case nsRedlineType_t::REDLINE_INSERT:
117cdf0e10cSrcweir                 {
118cdf0e10cSrcweir                     pMarkupList = opChangeTrackInsertionTextMarkupList;
119cdf0e10cSrcweir                 }
120cdf0e10cSrcweir                 break;
121cdf0e10cSrcweir                 case nsRedlineType_t::REDLINE_DELETE:
122cdf0e10cSrcweir                 {
123cdf0e10cSrcweir                     pMarkupList = opChangeTrackDeletionTextMarkupList;
124cdf0e10cSrcweir                 }
125cdf0e10cSrcweir                 break;
126cdf0e10cSrcweir                 case nsRedlineType_t::REDLINE_FORMAT:
127cdf0e10cSrcweir                 {
128cdf0e10cSrcweir                     pMarkupList = opChangeTrackFormatChangeTextMarkupList;
129cdf0e10cSrcweir                 }
130cdf0e10cSrcweir                 break;
131cdf0e10cSrcweir                 default:
132cdf0e10cSrcweir                 {
133cdf0e10cSrcweir                     // other types are not considered
134cdf0e10cSrcweir                 }
135cdf0e10cSrcweir             }
136cdf0e10cSrcweir             if ( pMarkupList )
137cdf0e10cSrcweir             {
138cdf0e10cSrcweir                 const xub_StrLen nTxtFrmChangeTrackStart =
139cdf0e10cSrcweir                                     nTxtNodeChangeTrackStart <= nTxtFrmTextStartPos
140cdf0e10cSrcweir                                     ? nTxtFrmTextStartPos
141cdf0e10cSrcweir                                     : nTxtNodeChangeTrackStart;
142cdf0e10cSrcweir 
143cdf0e10cSrcweir                 const xub_StrLen nTxtFrmChangeTrackEnd =
144cdf0e10cSrcweir                                     nTxtNodeChangeTrackEnd >= nTxtFrmTextEndPos
145cdf0e10cSrcweir                                     ? nTxtFrmTextEndPos
146cdf0e10cSrcweir                                     : nTxtNodeChangeTrackEnd;
147cdf0e10cSrcweir 
148cdf0e10cSrcweir                 pMarkupList->Insert( rtl::OUString(), 0,
149cdf0e10cSrcweir                                      nTxtFrmChangeTrackStart,
150cdf0e10cSrcweir                                      nTxtFrmChangeTrackEnd - nTxtFrmChangeTrackStart,
151cdf0e10cSrcweir                                      pMarkupList->Count() );
152cdf0e10cSrcweir             }
153cdf0e10cSrcweir         } // eof iteration over the redlines which overlap with the text node
154cdf0e10cSrcweir     }
155cdf0e10cSrcweir } // eof anonymous namespace
156cdf0e10cSrcweir 
SwParaChangeTrackingInfo(const SwTxtFrm & rTxtFrm)157cdf0e10cSrcweir SwParaChangeTrackingInfo::SwParaChangeTrackingInfo( const SwTxtFrm& rTxtFrm )
158cdf0e10cSrcweir     : mrTxtFrm( rTxtFrm )
159cdf0e10cSrcweir     , mpChangeTrackInsertionTextMarkupList( 0 )
160cdf0e10cSrcweir     , mpChangeTrackDeletionTextMarkupList( 0 )
161cdf0e10cSrcweir     , mpChangeTrackFormatChangeTextMarkupList( 0 )
162cdf0e10cSrcweir {
163cdf0e10cSrcweir }
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 
~SwParaChangeTrackingInfo()166cdf0e10cSrcweir SwParaChangeTrackingInfo::~SwParaChangeTrackingInfo()
167cdf0e10cSrcweir {
168cdf0e10cSrcweir     reset();
169cdf0e10cSrcweir }
170cdf0e10cSrcweir 
reset()171cdf0e10cSrcweir void SwParaChangeTrackingInfo::reset()
172cdf0e10cSrcweir {
173cdf0e10cSrcweir     delete mpChangeTrackInsertionTextMarkupList;
174cdf0e10cSrcweir     mpChangeTrackInsertionTextMarkupList = 0;
175cdf0e10cSrcweir 
176cdf0e10cSrcweir     delete mpChangeTrackDeletionTextMarkupList;
177cdf0e10cSrcweir     mpChangeTrackDeletionTextMarkupList = 0;
178cdf0e10cSrcweir 
179cdf0e10cSrcweir     delete mpChangeTrackFormatChangeTextMarkupList;
180cdf0e10cSrcweir     mpChangeTrackFormatChangeTextMarkupList = 0;
181cdf0e10cSrcweir }
182cdf0e10cSrcweir 
getChangeTrackingTextMarkupList(const sal_Int32 nTextMarkupType)183cdf0e10cSrcweir const SwWrongList* SwParaChangeTrackingInfo::getChangeTrackingTextMarkupList( const sal_Int32 nTextMarkupType )
184cdf0e10cSrcweir {
185cdf0e10cSrcweir     SwWrongList* pChangeTrackingTextMarkupList = 0;
186cdf0e10cSrcweir 
187cdf0e10cSrcweir     if ( mpChangeTrackInsertionTextMarkupList == 0 )
188cdf0e10cSrcweir     {
189cdf0e10cSrcweir         ASSERT( mpChangeTrackDeletionTextMarkupList == 0,
190cdf0e10cSrcweir                 "<SwParaChangeTrackingInfo::getChangeTrackingTextMarkupList(..) - <mpChangeTrackDeletionTextMarkupList> expected to be NULL." );
191cdf0e10cSrcweir         ASSERT( mpChangeTrackFormatChangeTextMarkupList == 0,
192cdf0e10cSrcweir                 "<SwParaChangeTrackingInfo::getChangeTrackingTextMarkupList(..) - <mpChangeTrackFormatChangeTextMarkupList> expected to be NULL." );
193cdf0e10cSrcweir         initChangeTrackTextMarkupLists( mrTxtFrm,
194cdf0e10cSrcweir                                         mpChangeTrackInsertionTextMarkupList,
195cdf0e10cSrcweir                                         mpChangeTrackDeletionTextMarkupList,
196cdf0e10cSrcweir                                         mpChangeTrackFormatChangeTextMarkupList );
197cdf0e10cSrcweir     }
198cdf0e10cSrcweir 
199cdf0e10cSrcweir     switch ( nTextMarkupType )
200cdf0e10cSrcweir     {
201cdf0e10cSrcweir         case css::text::TextMarkupType::TRACK_CHANGE_INSERTION:
202cdf0e10cSrcweir         {
203cdf0e10cSrcweir             pChangeTrackingTextMarkupList = mpChangeTrackInsertionTextMarkupList;
204cdf0e10cSrcweir         }
205cdf0e10cSrcweir         break;
206cdf0e10cSrcweir         case css::text::TextMarkupType::TRACK_CHANGE_DELETION:
207cdf0e10cSrcweir         {
208cdf0e10cSrcweir             pChangeTrackingTextMarkupList = mpChangeTrackDeletionTextMarkupList;
209cdf0e10cSrcweir         }
210cdf0e10cSrcweir         break;
211cdf0e10cSrcweir         case css::text::TextMarkupType::TRACK_CHANGE_FORMATCHANGE:
212cdf0e10cSrcweir         {
213cdf0e10cSrcweir             pChangeTrackingTextMarkupList = mpChangeTrackFormatChangeTextMarkupList;
214cdf0e10cSrcweir         }
215cdf0e10cSrcweir         break;
216cdf0e10cSrcweir         default:
217cdf0e10cSrcweir         {
218cdf0e10cSrcweir             ASSERT( false,
219cdf0e10cSrcweir                     "<SwParaChangeTrackingInfo::getChangeTrackingTextMarkupList(..)> - misusage - unexpected text markup type for change tracking." );
220cdf0e10cSrcweir         }
221cdf0e10cSrcweir     }
222cdf0e10cSrcweir 
223cdf0e10cSrcweir     return pChangeTrackingTextMarkupList;
224cdf0e10cSrcweir }
225