Kaydet (Commit) bb665aff authored tarafından Michael Stahl's avatar Michael Stahl

fdo#63553: sw: fix copy/paste of cross references

If one of aIds or aDestIds contains nSeqNo then adding an identity
mapping for it will actually re-define a previous mapping.  Likely this
can only happen when clipboard document is the source.

(regression from 44f97150)

(also it looks like 4b0b0a5b has subtly
 changed what the "else" branch does when it is erroneously taken -
 results are differently wrong)

Change-Id: I34e2979e45cffeb62ebf3d7b3e5ac6d2afff0c2b
üst 1b4aadeb
...@@ -997,7 +997,7 @@ void _RefIdsMap::Init( SwDoc& rDoc, SwDoc& rDestDoc, bool bField ) ...@@ -997,7 +997,7 @@ void _RefIdsMap::Init( SwDoc& rDoc, SwDoc& rDestDoc, bool bField )
for ( std::set<sal_uInt16>::iterator pIt = aDstIds.begin(); pIt != aDstIds.end(); ++pIt ) for ( std::set<sal_uInt16>::iterator pIt = aDstIds.begin(); pIt != aDstIds.end(); ++pIt )
AddId( GetFirstUnusedId(aIds), *pIt ); AddId( GetFirstUnusedId(aIds), *pIt );
// Change the Sequence number of all the SetExp fields in the destination document // Change the Sequence number of all SetExp fields in the source document
SwFieldType* pType = rDoc.GetFldType( RES_SETEXPFLD, aName, false ); SwFieldType* pType = rDoc.GetFldType( RES_SETEXPFLD, aName, false );
if( pType ) if( pType )
{ {
...@@ -1053,16 +1053,24 @@ void _RefIdsMap::Check( SwDoc& rDoc, SwDoc& rDestDoc, SwGetRefField& rFld, ...@@ -1053,16 +1053,24 @@ void _RefIdsMap::Check( SwDoc& rDoc, SwDoc& rDestDoc, SwGetRefField& rFld,
{ {
Init( rDoc, rDestDoc, bField); Init( rDoc, rDestDoc, bField);
// dann teste mal, ob die Nummer schon vergeben ist
// oder ob eine neue bestimmt werden muss.
sal_uInt16 nSeqNo = rFld.GetSeqNo(); sal_uInt16 nSeqNo = rFld.GetSeqNo();
if( aIds.count( nSeqNo ) && aDstIds.count( nSeqNo ))
// Check if the number is used in both documents
// Note: For fields, aIds contains both the ids of SetExp from rDestDoc
// and the targets of the already remapped ones from rDoc.
// It is possible that aDstIds contains numbers that aIds does not contain!
// For example, copying a selection to clipboard that does not contain
// the first SwSetExpField will result in id 0 missing, then pasting that
// into empty document gives a mapping 1->0 ... N->N-1 (fdo#63553).
if (aIds.count(nSeqNo) || aDstIds.count(nSeqNo))
{ {
// Number already taken, so need a new one. // Number already taken, so need a new one.
if( sequencedIds.count(nSeqNo) ) if( sequencedIds.count(nSeqNo) )
rFld.SetSeqNo( sequencedIds[nSeqNo] ); rFld.SetSeqNo( sequencedIds[nSeqNo] );
else else
{ {
assert(!bField || !aDstIds.count(nSeqNo)); // postcond of Init
sal_uInt16 n = GetFirstUnusedId( aIds ); sal_uInt16 n = GetFirstUnusedId( aIds );
// die neue SeqNo eintragen, damit die "belegt" ist // die neue SeqNo eintragen, damit die "belegt" ist
...@@ -1084,7 +1092,7 @@ void _RefIdsMap::Check( SwDoc& rDoc, SwDoc& rDestDoc, SwGetRefField& rFld, ...@@ -1084,7 +1092,7 @@ void _RefIdsMap::Check( SwDoc& rDoc, SwDoc& rDestDoc, SwGetRefField& rFld,
} }
else else
{ {
AddId( nSeqNo, nSeqNo ); AddId( nSeqNo, nSeqNo ); // this requires that nSeqNo is unused in both!
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment