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