Kaydet (Commit) 74d942fb authored tarafından Caolán McNamara's avatar Caolán McNamara

Resolves: fdo#48039 use same algorithm for assigning get/set replacement ids

i.e. use the same algorithm for assigning replacement ids for both get and set
exp fields.

Otherwise, consider for ex.
1. fields exists with ids of 1 and 2 in master document
2. a field exists with id of 1 in subdocument and must be reassigned a new
id to not collide with the pre existing master ids

In get orig algorithm assigned first unused slot of master to subdocument field
i.e. 0 unused in master, so subdocument:1 converted to master:0

In set orig algorithm sorted all used master slots and assigned largest used id
plus 1 (therefore unused) to subdocument field i.e. largest id used in master is
2, so subdocument:1 converted to master:3

so get can't find set and error's out with:
Error: Reference source not found

Change-Id: Ie8758dc22cf8deeeeff079532284e57eeaf4a9bd
üst 4fae09f7
...@@ -993,14 +993,9 @@ void _RefIdsMap::Init( SwDoc& rDoc, SwDoc& rDestDoc, bool bField ) ...@@ -993,14 +993,9 @@ void _RefIdsMap::Init( SwDoc& rDoc, SwDoc& rDestDoc, bool bField )
GetFieldIdsFromDoc( rDestDoc, aIds ); GetFieldIdsFromDoc( rDestDoc, aIds );
GetFieldIdsFromDoc( rDoc, aDstIds ); GetFieldIdsFromDoc( rDoc, aDstIds );
// Define the mappings now // Map all the new src fields to the next available unused id
sal_uInt16 nMaxDstId = -1;
if ( !aIds.empty() )
nMaxDstId = *aIds.rbegin();
// Map all the src fields to their value + nMaxDstId
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( ++nMaxDstId, *pIt ); AddId( GetFirstUnusedId(aIds), *pIt );
// Change the Sequence number of all the SetExp fields in the destination document // Change the Sequence number of all the SetExp fields in the destination document
SwFieldType* pType = rDoc.GetFldType( RES_SETEXPFLD, aName, false ); SwFieldType* pType = rDoc.GetFldType( RES_SETEXPFLD, aName, false );
...@@ -1023,9 +1018,9 @@ void _RefIdsMap::Init( SwDoc& rDoc, SwDoc& rDestDoc, bool bField ) ...@@ -1023,9 +1018,9 @@ void _RefIdsMap::Init( SwDoc& rDoc, SwDoc& rDestDoc, bool bField )
bInit = true; bInit = true;
} }
/// Get the lowest unused ID in the passed set. /// Get the lowest number unused in the passed set.
/// @param[in] rIds The set of used ID numbers. /// @param[in] rIds The set of used ID numbers.
/// @returns The lowest unused ID. /// @returns The lowest number unused by the passed set
sal_uInt16 _RefIdsMap::GetFirstUnusedId( std::set<sal_uInt16> &rIds ) sal_uInt16 _RefIdsMap::GetFirstUnusedId( std::set<sal_uInt16> &rIds )
{ {
sal_uInt16 num(0); sal_uInt16 num(0);
......
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