sw/qa/complex/writer/TextPortionEnumerationTest.java | 23 ++++++++++++++ sw/source/core/txtnode/thints.cxx | 30 ++++++++++++------- sw/source/uibase/wrtsh/wrtsh2.cxx | 8 ++--- 3 files changed, 46 insertions(+), 15 deletions(-)
New commits: commit 5aa299c034a89ffa9e332899bef33816d0b90963 Author: Julien Nabet <[email protected]> Date: Fri Oct 31 22:44:41 2014 +0100 fdo#85562: sw: fix crash on insert of input field and set variable field When a new field is inserted it doesn't have a SwFmtFld yet and it is also not yet in the document so it is not necessary to listen for its deletion. (regression from bbd97fe57d9ec184ef6aee36bd57d6d7e53b4719) Change-Id: I23c18aa8c490a6ad1de63a33f87679cc2358d7f5 diff --git a/sw/source/uibase/wrtsh/wrtsh2.cxx b/sw/source/uibase/wrtsh/wrtsh2.cxx index 484a551..fec7e86 100644 --- a/sw/source/uibase/wrtsh/wrtsh2.cxx +++ b/sw/source/uibase/wrtsh/wrtsh2.cxx @@ -211,24 +211,24 @@ bool SwWrtShell::StartInputFldDlg( SwField* pFld, bool bNextButton, FieldDeletionModify aModify(pDlg.get()); SwInputField *const pInputField(dynamic_cast<SwInputField*>(pFld)); SwSetExpField *const pSetExpFld(dynamic_cast<SwSetExpField*>(pFld)); - if (pInputField) + if (pInputField && pInputField->GetFmtFld()) { // Register for possible input field deletion while dialog is open pInputField->GetFmtFld()->Add(&aModify); } - else if (pSetExpFld) + else if (pSetExpFld && pSetExpFld->GetFmtFld()) { pSetExpFld->GetFmtFld()->Add(&aModify); } bool bRet = RET_CANCEL == pDlg->Execute(); - if (pInputField) + if (pInputField && pInputField->GetFmtFld()) { // Dialog closed, remove modification listener pInputField->GetFmtFld()->Remove(&aModify); } - else if (pSetExpFld) + else if (pSetExpFld && pSetExpFld->GetFmtFld()) { pSetExpFld->GetFmtFld()->Remove(&aModify); } commit 9b7542b0928f81b36365b13228a402e8cd64e8cd Author: Michael Stahl <[email protected]> Date: Fri Oct 31 22:06:40 2014 +0100 sw: fix insertion of hyperlink inside hyperlink... ... when either the start or the end position of the new hint is equal to an existing hint. There is not just 1 case here but 3 different ones; don't attempt to insert hints with start > end. Change-Id: I39cf8a352f67d77b56b0d01de5872f4d341f6bdd diff --git a/sw/qa/complex/writer/TextPortionEnumerationTest.java b/sw/qa/complex/writer/TextPortionEnumerationTest.java index 4e62d33..b793b9a 100644 --- a/sw/qa/complex/writer/TextPortionEnumerationTest.java +++ b/sw/qa/complex/writer/TextPortionEnumerationTest.java @@ -2051,6 +2051,29 @@ public class TextPortionEnumerationTest // this one gets eaten, but we still need to test inserting it (#i106930#) // .appendChild( url6.dup().appendChild( new TextNode("") ) ) .appendChild( new TextNode("89") ); + // inside (left-edge) + TreeNode url7 = new HyperlinkNode( mkName("url") ); + inserter.insertRange( new Range(0, 1, url7) ); + root = new TreeNode() + .appendChild( url7.dup().appendChild( new TextNode("1") ) ) + .appendChild( url2.dup().appendChild( new TextNode("2") ) ) + .appendChild( url1.dup().appendChild( new TextNode("3") ) ) + .appendChild( url4.dup().appendChild( new TextNode("4") ) ) + .appendChild( url5.dup().appendChild( new TextNode("56") ) ) + .appendChild( url4.dup().appendChild( new TextNode("7") ) ) + .appendChild( new TextNode("89") ); + // inside (right-edge) + TreeNode url8 = new HyperlinkNode( mkName("url") ); + inserter.insertRange( new Range(5, 6, url8) ); + root = new TreeNode() + .appendChild( url7.dup().appendChild( new TextNode("1") ) ) + .appendChild( url2.dup().appendChild( new TextNode("2") ) ) + .appendChild( url1.dup().appendChild( new TextNode("3") ) ) + .appendChild( url4.dup().appendChild( new TextNode("4") ) ) + .appendChild( url5.dup().appendChild( new TextNode("5") ) ) + .appendChild( url8.dup().appendChild( new TextNode("6") ) ) + .appendChild( url4.dup().appendChild( new TextNode("7") ) ) + .appendChild( new TextNode("89") ); doTest(root, false); } diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx index c29f87e..1494553 100644 --- a/sw/source/core/txtnode/thints.cxx +++ b/sw/source/core/txtnode/thints.cxx @@ -550,23 +550,31 @@ SwpHints::TryInsertNesting( SwTxtNode & rNode, SwTxtAttrNesting & rNewHint ) } else { - assert((nOtherStart < nNewStart) && (nNewEnd < nOtherEnd)); + assert((nOtherStart < nNewStart) || (nNewEnd < nOtherEnd)); // scenario: there is a RUBY, and contained within that a META; // now a RUBY is inserted within the META => the exising RUBY is split: // here it is not possible to simply insert the left/right fragment // of the existing RUBY because they <em>overlap</em> with the META! Delete( *itOther ); // this also does NoteInHistory! - *(*itOther)->GetEnd() = nNewStart; - bool bSuccess( TryInsertNesting(rNode, **itOther) ); - OSL_ENSURE(bSuccess, "recursive call 1 failed?"); - SwTxtAttrNesting * const pOtherRight( - MakeTxtAttrNesting( - rNode, **itOther, nNewEnd, nOtherEnd ) ); - bSuccess = TryInsertNesting(rNode, *pOtherRight); - OSL_ENSURE(bSuccess, "recursive call 2 failed?"); - (void)bSuccess; + if (nNewEnd < nOtherEnd) + { + SwTxtAttrNesting * const pOtherRight( + MakeTxtAttrNesting( + rNode, **itOther, nNewEnd, nOtherEnd ) ); + bool const bSuccess( TryInsertNesting(rNode, *pOtherRight) ); + SAL_WARN_IF(!bSuccess, "sw.core", "recursive call 1 failed?"); + } + if (nOtherStart < nNewStart) + { + *(*itOther)->GetEnd() = nNewStart; + bool const bSuccess( TryInsertNesting(rNode, **itOther) ); + SAL_WARN_IF(!bSuccess, "sw.core", "recursive call 2 failed?"); + } + else + { + rNode.DestroyAttr(*itOther); + } } - } return true; _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
