diff options
author | Caolán McNamara <caolanm@redhat.com> | 2015-01-30 10:13:04 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2015-01-30 10:16:17 +0000 |
commit | 95f4b2f4a6dfe47842336116d94edd175a6da960 (patch) | |
tree | 9b89240310430edeb970156b262b3c1d3da9ec0c | |
parent | 8b58e38b4383f440bdd95285978d5655c80904fb (diff) |
Resolves: tdf#82942 updating field contents with incorrect attribute positions
Updating a SwTxtInputFld requires expanding the contents of the node.
Expanding the contents of the node requires all the positions of fields in the
node to be correct in order to expand them to the right place.
So on updating a SwTxtNode wait until all the attributes positions are adjusted
to be correct before expanding the SwTxtInputFlds in that node
Change-Id: I76500239a103e56be412707a708a303a58236070
-rw-r--r-- | sw/source/core/txtnode/ndtxt.cxx | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx index 1afaea285b94..cb5c1e130269 100644 --- a/sw/source/core/txtnode/ndtxt.cxx +++ b/sw/source/core/txtnode/ndtxt.cxx @@ -854,6 +854,8 @@ void SwTxtNode::Update( { if ( bNegative ) { + std::vector<SwTxtInputFld*> aTxtInputFlds; + const sal_Int32 nChangeEnd = nChangePos + nChangeLen; for ( size_t n = 0; n < m_pSwpHints->Count(); ++n ) { @@ -896,12 +898,17 @@ void SwTxtNode::Update( { SwTxtInputFld* pTxtInputFld = dynamic_cast<SwTxtInputFld*>(pHint); if ( pTxtInputFld ) - { - pTxtInputFld->UpdateFieldContent(); - } + aTxtInputFlds.push_back(pTxtInputFld); } } + //wait until all the attribute positions are correct + //before updating the field contents + for (SwTxtInputFld* pTxtInputFld : aTxtInputFlds) + { + pTxtInputFld->UpdateFieldContent(); + } + m_pSwpHints->MergePortions( *this ); } else @@ -910,6 +917,7 @@ void SwTxtNode::Update( bool bResort = false; bool bMergePortionsNeeded = false; const int coArrSz = RES_TXTATR_WITHEND_END - RES_CHRATR_BEGIN; + std::vector<SwTxtInputFld*> aTxtInputFlds; bool aDontExp[ coArrSz ]; memset( &aDontExp, 0, coArrSz * sizeof(bool) ); @@ -1001,11 +1009,17 @@ void SwTxtNode::Update( { SwTxtInputFld* pTxtInputFld = dynamic_cast<SwTxtInputFld*>(pHint); if ( pTxtInputFld ) - { - pTxtInputFld->UpdateFieldContent(); - } + aTxtInputFlds.push_back(pTxtInputFld); } } + + //wait until all the attribute positions are correct + //before updating the field contents + for (SwTxtInputFld* pTxtInputFld : aTxtInputFlds) + { + pTxtInputFld->UpdateFieldContent(); + } + if (bMergePortionsNeeded) { m_pSwpHints->MergePortions(*this); // does Resort too |