/[packages]/cauldron/libreoffice/pristine/SOURCES/0001-allow-comparing-documents-which-only-differ-by-frame.patch
ViewVC logotype

Contents of /cauldron/libreoffice/pristine/SOURCES/0001-allow-comparing-documents-which-only-differ-by-frame.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 812930 - (show annotations) (download)
Sat Jan 31 22:00:57 2015 UTC (9 years, 1 month ago) by schedbot
File size: 14677 byte(s)
Copying release 4.4.0.3-6.mga5 to pristine/ directory.
1 From 7adf5a76404205e3b2f1dbb4bb01a612d78ea0dc Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
3 Date: Tue, 13 Jan 2015 13:55:58 +0000
4 Subject: [PATCH] allow comparing documents which only differ by frame contents
5
6 if two documents have the same number of frames then have an additional stab at
7 comparing the contents of those frames
8
9 Change-Id: Ie7f1a8906d49d720a74620ad8d69fd97c76304e3
10 (cherry picked from commit 16916a14a2ce382aa4ff2a25f8e477108aba5a67)
11 ---
12 sw/source/core/doc/doccomp.cxx | 236 +++++++++++++++++++++++++----------------
13 1 file changed, 144 insertions(+), 92 deletions(-)
14
15 diff --git a/sw/source/core/doc/doccomp.cxx b/sw/source/core/doc/doccomp.cxx
16 index 8634835..043d2d4 100644
17 --- a/sw/source/core/doc/doccomp.cxx
18 +++ b/sw/source/core/doc/doccomp.cxx
19 @@ -38,6 +38,7 @@
20 #include <section.hxx>
21 #include <tox.hxx>
22 #include <docsh.hxx>
23 +#include <fmtcntnt.hxx>
24
25 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
26 #include <com/sun/star/document/XDocumentProperties.hpp>
27 @@ -65,18 +66,32 @@ public:
28
29 class CompareData
30 {
31 +protected:
32 + SwDoc& rDoc;
33 +private:
34 size_t* pIndex;
35 bool* pChangedFlag;
36
37 -protected:
38 + SwPaM *pInsRing, *pDelRing;
39 +
40 + sal_uLong PrevIdx( const SwNode* pNd );
41 + sal_uLong NextIdx( const SwNode* pNd );
42 +
43 vector< CompareLine* > aLines;
44 sal_uLong nSttLineNum;
45 + bool m_bRecordDiff;
46
47 // Truncate beginning and end and add all others to the LinesArray
48 - virtual void CheckRanges( CompareData& ) = 0;
49 + void CheckRanges( CompareData& );
50 +
51 + virtual const SwNode& GetEndOfContent() = 0;
52
53 public:
54 - CompareData();
55 + CompareData(SwDoc& rD, bool bRecordDiff)
56 + : rDoc( rD ), pIndex( 0 ), pChangedFlag( 0 ), pInsRing(0), pDelRing(0)
57 + , nSttLineNum( 0 ), m_bRecordDiff(bRecordDiff)
58 + {
59 + }
60 virtual ~CompareData();
61
62 // Are there differences?
63 @@ -89,10 +104,10 @@ public:
64 // Displaying the actually content is to be handled by the subclass!
65 sal_uLong ShowDiffs( const CompareData& rData );
66
67 - virtual void ShowInsert( sal_uLong nStt, sal_uLong nEnd );
68 - virtual void ShowDelete( const CompareData& rData, sal_uLong nStt,
69 + void ShowInsert( sal_uLong nStt, sal_uLong nEnd );
70 + void ShowDelete( const CompareData& rData, sal_uLong nStt,
71 sal_uLong nEnd, sal_uLong nInsPos );
72 - virtual void CheckForChangesInLine( const CompareData& rData,
73 + void CheckForChangesInLine( const CompareData& rData,
74 sal_uLong& nStt, sal_uLong& nEnd,
75 sal_uLong& nThisStt, sal_uLong& nThisEnd );
76
77 @@ -114,6 +129,38 @@ public:
78 { return aLines[ nLine ]; }
79 void InsertLine( CompareLine* pLine )
80 { aLines.push_back( pLine ); }
81 +
82 + void SetRedlinesToDoc( bool bUseDocInfo );
83 +};
84 +
85 +class CompareMainText : public CompareData
86 +{
87 +public:
88 + CompareMainText(SwDoc &rD, bool bRecordDiff=true)
89 + : CompareData(rD, bRecordDiff)
90 + {
91 + }
92 +
93 + virtual const SwNode& GetEndOfContent() SAL_OVERRIDE
94 + {
95 + return rDoc.GetNodes().GetEndOfContent();
96 + }
97 +};
98 +
99 +class CompareFrmFmtText : public CompareData
100 +{
101 + const SwNodeIndex &m_rIndex;
102 +public:
103 + CompareFrmFmtText(SwDoc &rD, const SwNodeIndex &rIndex, bool bRecordDiff=true)
104 + : CompareData(rD, bRecordDiff)
105 + , m_rIndex(rIndex)
106 + {
107 + }
108 +
109 + virtual const SwNode& GetEndOfContent() SAL_OVERRIDE
110 + {
111 + return *m_rIndex.GetNode().EndOfSectionNode();
112 + }
113 };
114
115 class Hash
116 @@ -328,13 +375,21 @@ public:
117
118 CompareLine::~CompareLine() {}
119
120 -CompareData::CompareData()
121 - : pIndex( 0 ), pChangedFlag( 0 ), nSttLineNum( 0 )
122 -{
123 -}
124 -
125 CompareData::~CompareData()
126 {
127 + if( pDelRing )
128 + {
129 + while( pDelRing->GetNext() != pDelRing )
130 + delete pDelRing->GetNext();
131 + delete pDelRing;
132 + }
133 + if( pInsRing )
134 + {
135 + while( pInsRing->GetNext() != pInsRing )
136 + delete pInsRing->GetNext();
137 + delete pInsRing;
138 + }
139 +
140 delete[] pIndex;
141 delete[] pChangedFlag;
142 }
143 @@ -393,9 +448,12 @@ sal_uLong CompareData::ShowDiffs( const CompareData& rData )
144 while( nStt1 < nLen1 && rData.GetChanged( nStt1 )) ++nStt1;
145 while( nStt2 < nLen2 && GetChanged( nStt2 )) ++nStt2;
146
147 - // Check if there are changed lines (only slightly different) and
148 - // compare them in detail.
149 - CheckForChangesInLine( rData, nSav1, nStt1, nSav2, nStt2 );
150 + if (m_bRecordDiff)
151 + {
152 + // Check if there are changed lines (only slightly different) and
153 + // compare them in detail.
154 + CheckForChangesInLine( rData, nSav1, nStt1, nSav2, nStt2 );
155 + }
156
157 ++nCnt;
158 }
159 @@ -422,19 +480,6 @@ bool CompareData::HasDiffs( const CompareData& rData ) const
160 return bRet;
161 }
162
163 -void CompareData::ShowInsert( sal_uLong, sal_uLong )
164 -{
165 -}
166 -
167 -void CompareData::ShowDelete( const CompareData&, sal_uLong, sal_uLong, sal_uLong )
168 -{
169 -}
170 -
171 -void CompareData::CheckForChangesInLine( const CompareData& ,
172 - sal_uLong&, sal_uLong&, sal_uLong&, sal_uLong& )
173 -{
174 -}
175 -
176 Hash::Hash( sal_uLong nSize )
177 : nCount(1)
178 {
179 @@ -972,30 +1017,6 @@ public:
180 OUString GetText() const;
181 };
182
183 -class SwCompareData : public CompareData
184 -{
185 - SwDoc& rDoc;
186 - SwPaM *pInsRing, *pDelRing;
187 -
188 - sal_uLong PrevIdx( const SwNode* pNd );
189 - sal_uLong NextIdx( const SwNode* pNd );
190 -
191 - virtual void CheckRanges( CompareData& ) SAL_OVERRIDE;
192 - virtual void ShowInsert( sal_uLong nStt, sal_uLong nEnd ) SAL_OVERRIDE;
193 - virtual void ShowDelete( const CompareData& rData, sal_uLong nStt,
194 - sal_uLong nEnd, sal_uLong nInsPos ) SAL_OVERRIDE;
195 -
196 - virtual void CheckForChangesInLine( const CompareData& rData,
197 - sal_uLong& nStt, sal_uLong& nEnd,
198 - sal_uLong& nThisStt, sal_uLong& nThisEnd ) SAL_OVERRIDE;
199 -
200 -public:
201 - SwCompareData( SwDoc& rD ) : rDoc( rD ), pInsRing(0), pDelRing(0) {}
202 - virtual ~SwCompareData();
203 -
204 - void SetRedlinesToDoc( bool bUseDocInfo );
205 -};
206 -
207 SwCompareLine::SwCompareLine( const SwNode& rNd )
208 : rNode( rNd )
209 {
210 @@ -1400,23 +1421,7 @@ bool SwCompareLine::ChangesInLine( const SwCompareLine& rLine,
211 return bRet;
212 }
213
214 -SwCompareData::~SwCompareData()
215 -{
216 - if( pDelRing )
217 - {
218 - while( pDelRing->GetNext() != pDelRing )
219 - delete pDelRing->GetNext();
220 - delete pDelRing;
221 - }
222 - if( pInsRing )
223 - {
224 - while( pInsRing->GetNext() != pInsRing )
225 - delete pInsRing->GetNext();
226 - delete pInsRing;
227 - }
228 -}
229 -
230 -sal_uLong SwCompareData::NextIdx( const SwNode* pNd )
231 +sal_uLong CompareData::NextIdx( const SwNode* pNd )
232 {
233 if( pNd->IsStartNode() )
234 {
235 @@ -1430,7 +1435,7 @@ sal_uLong SwCompareData::NextIdx( const SwNode* pNd )
236 return pNd->GetIndex() + 1;
237 }
238
239 -sal_uLong SwCompareData::PrevIdx( const SwNode* pNd )
240 +sal_uLong CompareData::PrevIdx( const SwNode* pNd )
241 {
242 if( pNd->IsEndNode() )
243 {
244 @@ -1444,13 +1449,13 @@ sal_uLong SwCompareData::PrevIdx( const SwNode* pNd )
245 return pNd->GetIndex() - 1;
246 }
247
248 -void SwCompareData::CheckRanges( CompareData& rData )
249 +void CompareData::CheckRanges( CompareData& rData )
250 {
251 - const SwNodes& rSrcNds = static_cast<SwCompareData&>(rData).rDoc.GetNodes();
252 + const SwNodes& rSrcNds = rData.rDoc.GetNodes();
253 const SwNodes& rDstNds = rDoc.GetNodes();
254
255 - const SwNode& rSrcEndNd = rSrcNds.GetEndOfContent();
256 - const SwNode& rDstEndNd = rDstNds.GetEndOfContent();
257 + const SwNode& rSrcEndNd = rData.GetEndOfContent();
258 + const SwNode& rDstEndNd = GetEndOfContent();
259
260 sal_uLong nSrcSttIdx = NextIdx( rSrcEndNd.StartOfSectionNode() );
261 sal_uLong nSrcEndIdx = rSrcEndNd.GetIndex();
262 @@ -1497,7 +1502,7 @@ void SwCompareData::CheckRanges( CompareData& rData )
263 }
264 }
265
266 -void SwCompareData::ShowInsert( sal_uLong nStt, sal_uLong nEnd )
267 +void CompareData::ShowInsert( sal_uLong nStt, sal_uLong nEnd )
268 {
269 SwPaM* pTmp = new SwPaM( static_cast<const SwCompareLine*>(GetLine( nStt ))->GetNode(), 0,
270 static_cast<const SwCompareLine*>(GetLine( nEnd-1 ))->GetEndNode(), 0,
271 @@ -1508,7 +1513,7 @@ void SwCompareData::ShowInsert( sal_uLong nStt, sal_uLong nEnd )
272 // #i65201#: These SwPaMs are calculated smaller than needed, see comment below
273 }
274
275 -void SwCompareData::ShowDelete(
276 +void CompareData::ShowDelete(
277 const CompareData& rData,
278 sal_uLong nStt,
279 sal_uLong nEnd,
280 @@ -1541,14 +1546,14 @@ void SwCompareData::ShowDelete(
281 }
282 else
283 {
284 - pLineNd = &rDoc.GetNodes().GetEndOfContent();
285 + pLineNd = &GetEndOfContent();
286 nOffset = 0;
287 }
288
289 SwNodeIndex aInsPos( *pLineNd, nOffset );
290 SwNodeIndex aSavePos( aInsPos, -1 );
291
292 - static_cast<const SwCompareData&>(rData).rDoc.GetDocumentContentOperationsManager().CopyWithFlyInFly( aRg, 0, aInsPos );
293 + rData.rDoc.GetDocumentContentOperationsManager().CopyWithFlyInFly( aRg, 0, aInsPos );
294 rDoc.getIDocumentState().SetModified();
295 ++aSavePos;
296
297 @@ -1572,7 +1577,7 @@ void SwCompareData::ShowDelete(
298 }
299 }
300
301 -void SwCompareData::CheckForChangesInLine( const CompareData& rData,
302 +void CompareData::CheckForChangesInLine( const CompareData& rData,
303 sal_uLong& rStt, sal_uLong& rEnd,
304 sal_uLong& rThisStt, sal_uLong& rThisEnd )
305 {
306 @@ -1625,7 +1630,7 @@ void SwCompareData::CheckForChangesInLine( const CompareData& rData,
307 }
308 }
309
310 -void SwCompareData::SetRedlinesToDoc( bool bUseDocInfo )
311 +void CompareData::SetRedlinesToDoc( bool bUseDocInfo )
312 {
313 SwPaM* pTmp = pDelRing;
314
315 @@ -1673,7 +1678,7 @@ void SwCompareData::SetRedlinesToDoc( bool bUseDocInfo )
316 }
317 // #i101009#
318 // prevent redlines that end on structural end node
319 - if (& rDoc.GetNodes().GetEndOfContent() ==
320 + if (& GetEndOfContent() ==
321 & pTmp->GetPoint()->nNode.GetNode())
322 {
323 pTmp->GetPoint()->nNode--;
324 @@ -1705,7 +1710,7 @@ void SwCompareData::SetRedlinesToDoc( bool bUseDocInfo )
325 }
326 // #i101009#
327 // prevent redlines that end on structural end node
328 - if (& rDoc.GetNodes().GetEndOfContent() ==
329 + if (& GetEndOfContent() ==
330 & pTmp->GetPoint()->nNode.GetNode())
331 {
332 pTmp->GetPoint()->nNode--;
333 @@ -1760,6 +1765,48 @@ void SwCompareData::SetRedlinesToDoc( bool bUseDocInfo )
334 }
335 }
336
337 +typedef std::shared_ptr<CompareData> CompareDataPtr;
338 +typedef std::pair<CompareDataPtr, CompareDataPtr> CompareDataPtrPair;
339 +typedef std::vector<CompareDataPtrPair> Comparators;
340 +
341 +namespace
342 +{
343 + Comparators buildComparators(SwDoc &rSrcDoc, SwDoc &rDestDoc)
344 + {
345 + Comparators aComparisons;
346 + //compare main text
347 + aComparisons.push_back(CompareDataPtrPair(CompareDataPtr(new CompareMainText(rSrcDoc)),
348 + CompareDataPtr(new CompareMainText(rDestDoc))));
349 +
350 + //if we have the same number of frames then try to compare within them
351 + const SwFrmFmts *pSrcFrmFmts = rSrcDoc.GetSpzFrmFmts();
352 + const SwFrmFmts *pDestFrmFmts = rDestDoc.GetSpzFrmFmts();
353 + if (pSrcFrmFmts->size() == pDestFrmFmts->size())
354 + {
355 + for (size_t i = 0; i < pSrcFrmFmts->size(); ++i)
356 + {
357 + const SwFrmFmt& rSrcFmt = *(*pSrcFrmFmts)[i];
358 + const SwFrmFmt& rDestFmt = *(*pDestFrmFmts)[i];
359 + const SwNodeIndex* pSrcIdx = rSrcFmt.GetCntnt().GetCntntIdx();
360 + const SwNodeIndex* pDestIdx = rDestFmt.GetCntnt().GetCntntIdx();
361 + if (!pSrcIdx && !pDestIdx)
362 + continue;
363 + if (!pSrcIdx || !pDestIdx)
364 + break;
365 + const SwNode* pSrcNode = pSrcIdx->GetNode().EndOfSectionNode();
366 + const SwNode* pDestNode = pDestIdx->GetNode().EndOfSectionNode();
367 + if (!pSrcNode && !pDestNode)
368 + continue;
369 + if (!pSrcNode || !pDestNode)
370 + break;
371 + aComparisons.push_back(CompareDataPtrPair(CompareDataPtr(new CompareFrmFmtText(rSrcDoc, *pSrcIdx)),
372 + CompareDataPtr(new CompareFrmFmtText(rDestDoc, *pDestIdx))));
373 + }
374 + }
375 + return aComparisons;
376 + }
377 +}
378 +
379 // Returns (the difference count?) if something is different
380 long SwDoc::CompareDoc( const SwDoc& rDoc )
381 {
382 @@ -1800,19 +1847,26 @@ long SwDoc::CompareDoc( const SwDoc& rDoc )
383 rSrcDoc.getIDocumentRedlineAccess().SetRedlineMode( nsRedlineMode_t::REDLINE_SHOW_INSERT );
384 getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT));
385
386 - SwCompareData aD0( rSrcDoc );
387 - SwCompareData aD1( *this );
388 -
389 - aD1.CompareLines( aD0 );
390 + Comparators aComparisons(buildComparators(rSrcDoc, *this));
391
392 - nRet = aD1.ShowDiffs( aD0 );
393 + for (auto& a : aComparisons)
394 + {
395 + CompareData& rD0 = *a.first.get();
396 + CompareData& rD1 = *a.second.get();
397 + rD1.CompareLines( rD0 );
398 + nRet |= rD1.ShowDiffs( rD0 );
399 + }
400
401 if( nRet )
402 {
403 - getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_ON |
404 + getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_ON |
405 nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE));
406
407 - aD1.SetRedlinesToDoc( !bDocWasModified );
408 + for (auto& a : aComparisons)
409 + {
410 + CompareData& rD1 = *a.second.get();
411 + rD1.SetRedlinesToDoc( !bDocWasModified );
412 + }
413 getIDocumentState().SetModified();
414 }
415
416 @@ -2016,11 +2070,9 @@ long SwDoc::MergeDoc( const SwDoc& rDoc )
417 rSrcDoc.getIDocumentRedlineAccess().SetRedlineMode( nsRedlineMode_t::REDLINE_SHOW_DELETE );
418 getIDocumentRedlineAccess().SetRedlineMode( nsRedlineMode_t::REDLINE_SHOW_DELETE );
419
420 - SwCompareData aD0( rSrcDoc );
421 - SwCompareData aD1( *this );
422 -
423 + CompareMainText aD0(rSrcDoc, false);
424 + CompareMainText aD1(*this, false);
425 aD1.CompareLines( aD0 );
426 -
427 if( !aD1.HasDiffs( aD0 ) )
428 {
429 // we want to get all redlines from the SourceDoc
430 --
431 1.9.3
432

  ViewVC Help
Powered by ViewVC 1.1.30