sw/inc/IDocumentMarkAccess.hxx | 2 sw/inc/doc.hxx | 27 +++- sw/source/core/crsr/annotationmark.cxx | 1 sw/source/core/doc/docbm.cxx | 189 ++++++++++++++++++++------------- sw/source/core/doc/doccorr.cxx | 20 +-- sw/source/core/undo/undobj.cxx | 13 +- sw/source/core/unocore/unoobj.cxx | 72 +++++++----- sw/source/ui/docvw/SidebarWin.cxx | 25 +++- sw/source/ui/shells/textfld.cxx | 3 sw/source/ui/wrtsh/wrtsh2.cxx | 21 ++- xmloff/source/text/txtfldi.cxx | 4 11 files changed, 246 insertions(+), 131 deletions(-)
New commits: commit afbf61890a4d5e846c4aa09380d8b641d99ceefd Author: Oliver-Rainer Wittmann <o...@apache.org> Date: Thu Jan 16 11:47:18 2014 +0000 Resolves: cp#1000079 i#124030 do not delete UNO mark which are not expanded... and only touch the start of the given range. (cherry picked from commit ae295f7d009842cdceb50c4daffe948ede2b4b88) Conflicts: sw/source/core/doc/docbm.cxx (cherry picked from commit 4b6b51182a9a600805729313278eb707c6ebfb14) Change-Id: Id7317eeb8e9c063c9d8b30bca97ed0afee3ec8c5 diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index 856bbc6..3deaccc 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -50,7 +50,6 @@ #include <edimp.hxx> #include <stdio.h> -using namespace ::std; using namespace ::boost; using namespace ::sw::mark; @@ -58,12 +57,19 @@ namespace { static bool lcl_GreaterThan( const SwPosition& rPos, const SwNodeIndex& rNdIdx, const SwIndex* pIdx ) { - return pIdx ? ( rPos.nNode > rNdIdx || ( rPos.nNode == rNdIdx && rPos.nContent >= pIdx->GetIndex() )) : rPos.nNode >= rNdIdx; + return pIdx != NULL + ? ( rPos.nNode > rNdIdx + || ( rPos.nNode == rNdIdx + && rPos.nContent >= pIdx->GetIndex() ) ) + : rPos.nNode >= rNdIdx; } static bool lcl_Lower( const SwPosition& rPos, const SwNodeIndex& rNdIdx, const SwIndex* pIdx ) { - return rPos.nNode < rNdIdx || ( pIdx && rPos.nNode == rNdIdx && rPos.nContent < pIdx->GetIndex() ); + return rPos.nNode < rNdIdx + || ( pIdx != NULL + && rPos.nNode == rNdIdx + && rPos.nContent < pIdx->GetIndex() ); } static bool lcl_MarkOrderingByStart(const IDocumentMarkAccess::pMark_t& rpFirst, @@ -91,9 +97,9 @@ namespace } SAL_WNODEPRECATED_DECLARATIONS_PUSH - static inline auto_ptr<SwPosition> lcl_PositionFromCntntNode(SwCntntNode * const pCntntNode, const bool bAtEnd=false) + static inline ::std::auto_ptr<SwPosition> lcl_PositionFromCntntNode(SwCntntNode * const pCntntNode, const bool bAtEnd=false) { - auto_ptr<SwPosition> pResult(new SwPosition(*pCntntNode)); + ::std::auto_ptr<SwPosition> pResult(new SwPosition(*pCntntNode)); pResult->nContent.Assign(pCntntNode, bAtEnd ? pCntntNode->Len() : 0); return pResult; } @@ -104,7 +110,7 @@ namespace // else set it to the end of the node before rStt // else set it to the CntntNode of the Pos outside the Range SAL_WNODEPRECATED_DECLARATIONS_PUSH - static inline auto_ptr<SwPosition> lcl_FindExpelPosition(const SwNodeIndex& rStt, + static inline ::std::auto_ptr<SwPosition> lcl_FindExpelPosition(const SwNodeIndex& rStt, const SwNodeIndex& rEnd, const SwPosition& rOtherPosition) { @@ -118,7 +124,7 @@ namespace pNode = rStt.GetNodes().GoPrevious(&aStt), bAtEnd = true; if(pNode) return lcl_PositionFromCntntNode(pNode, bAtEnd); - return auto_ptr<SwPosition>(new SwPosition(rOtherPosition)); + return ::std::auto_ptr<SwPosition>(new SwPosition(rOtherPosition)); } SAL_WNODEPRECATED_DECLARATIONS_POP @@ -149,7 +155,7 @@ namespace rMarks.begin(), pCandidatesEnd, back_inserter(vCandidates), - boost::bind(logical_not<bool>(), boost::bind(&IMark::EndsBefore, _1, rPos))); + boost::bind( ::std::logical_not<bool>(), boost::bind( &IMark::EndsBefore, _1, rPos ) ) ); // no candidate left => we are in front of the first mark or there are none if(!vCandidates.size()) return NULL; // return the highest (last) candidate using mark end ordering @@ -630,8 +636,8 @@ namespace sw { namespace mark const SwIndex* pSttIdx, const SwIndex* pEndIdx ) { - vector<const_iterator_t> vMarksToDelete; - bool isSortingNeeded = false; + ::std::vector<const_iterator_t> vMarksToDelete; + bool bIsSortingNeeded = false; // copy all bookmarks in the move area to a vector storing all position data as offset // reassignment is performed after the move @@ -646,61 +652,77 @@ namespace sw { namespace mark ::sw::mark::MarkBase* pMark = dynamic_cast< ::sw::mark::MarkBase* >(ppMark->get()); // on position ?? - bool isPosInRange = (lcl_GreaterThan(pMark->GetMarkPos(), rStt, pSttIdx) && - lcl_Lower(pMark->GetMarkPos(), rEnd, pEndIdx)); - bool isOtherPosInRange = (pMark->IsExpanded() && - lcl_GreaterThan(pMark->GetOtherMarkPos(), rStt, pSttIdx) && - lcl_Lower(pMark->GetOtherMarkPos(), rEnd, pEndIdx)); + bool bIsPosInRange = lcl_GreaterThan(pMark->GetMarkPos(), rStt, pSttIdx) + && lcl_Lower(pMark->GetMarkPos(), rEnd, pEndIdx); + bool bIsOtherPosInRange = pMark->IsExpanded() + && lcl_GreaterThan(pMark->GetOtherMarkPos(), rStt, pSttIdx) + && lcl_Lower(pMark->GetOtherMarkPos(), rEnd, pEndIdx); // special case: completely in range, touching the end? if ( pEndIdx != NULL - && ( ( isOtherPosInRange + && ( ( bIsOtherPosInRange && pMark->GetMarkPos().nNode == rEnd && pMark->GetMarkPos().nContent == *pEndIdx ) - || ( isPosInRange + || ( bIsPosInRange && pMark->IsExpanded() && pMark->GetOtherMarkPos().nNode == rEnd && pMark->GetOtherMarkPos().nContent == *pEndIdx ) ) ) { - isPosInRange = true, isOtherPosInRange = true; + bIsPosInRange = true, bIsOtherPosInRange = true; } - if(isPosInRange && (isOtherPosInRange || !pMark->IsExpanded())) + if ( bIsPosInRange + && ( bIsOtherPosInRange + || !pMark->IsExpanded() ) ) { // completely in range - // #i92125# - bool bKeepCrossRefBkmk( false ); + bool bDeleteMark = true; { - if ( rStt == rEnd && - ( IDocumentMarkAccess::GetType(*pMark) == - IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK || - IDocumentMarkAccess::GetType(*pMark) == - IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK ) ) + switch ( IDocumentMarkAccess::GetType( *pMark ) ) { - bKeepCrossRefBkmk = true; + case IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK: + case IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK: + // no delete of cross-reference bookmarks, if range is inside one paragraph + bDeleteMark = rStt != rEnd; + break; + case IDocumentMarkAccess::UNO_BOOKMARK: + // no delete of UNO mark, if it is not expanded and only touches the start of the range + bDeleteMark = bIsOtherPosInRange + || pMark->IsExpanded() + || pSttIdx == NULL + || !( pMark->GetMarkPos().nNode == rStt + && pMark->GetMarkPos().nContent == *pSttIdx ); + break; + default: + bDeleteMark = true; + break; } } - if ( !bKeepCrossRefBkmk ) + + if ( bDeleteMark ) { - if(pSaveBkmk) - pSaveBkmk->push_back(SaveBookmark(true, true, *pMark, rStt, pSttIdx)); + if ( pSaveBkmk ) + { + pSaveBkmk->push_back( SaveBookmark( true, true, *pMark, rStt, pSttIdx ) ); + } vMarksToDelete.push_back(ppMark); } } - else if ( isPosInRange ^ isOtherPosInRange ) + else if ( bIsPosInRange ^ bIsOtherPosInRange ) { // the bookmark is partitially in the range // move position of that is in the range out of it + SAL_WNODEPRECATED_DECLARATIONS_PUSH - auto_ptr< SwPosition > pNewPos; + ::std::auto_ptr< SwPosition > pNewPos; { if ( pEndIdx != NULL ) { - pNewPos = auto_ptr< SwPosition >( new SwPosition( rEnd, *pEndIdx ) ); + pNewPos = ::std::auto_ptr< SwPosition >( new SwPosition( rEnd, *pEndIdx ) ); } else { - pNewPos = lcl_FindExpelPosition( rStt, rEnd, isPosInRange ? pMark->GetOtherMarkPos() : pMark->GetMarkPos() ); + pNewPos = lcl_FindExpelPosition( rStt, rEnd, bIsPosInRange ? pMark->GetOtherMarkPos() : pMark->GetMarkPos() ); } } @@ -725,13 +747,13 @@ namespace sw { namespace mark SAL_WNODEPRECATED_DECLARATIONS_POP if ( bMoveMark ) { - if ( isPosInRange ) + if ( bIsPosInRange ) pMark->SetMarkPos(*pNewPos); else pMark->SetOtherMarkPos(*pNewPos); // illegal selection? collapse the mark and restore sorting later - isSortingNeeded |= lcl_FixCorrectedMark( isPosInRange, isOtherPosInRange, pMark ); + bIsSortingNeeded |= lcl_FixCorrectedMark( bIsPosInRange, bIsOtherPosInRange, pMark ); } } } @@ -740,13 +762,13 @@ namespace sw { namespace mark // fdo#61016 delay the deletion of the fieldmark characters // to prevent that from deleting the marks on that position // which would invalidate the iterators in vMarksToDelete - vector< ::boost::shared_ptr<ILazyDeleter> > vDelay; + std::vector< ::boost::shared_ptr<ILazyDeleter> > vDelay; vDelay.reserve(vMarksToDelete.size()); // we just remembered the iterators to delete, so we do not need to // search for the boost::shared_ptr<> (the entry in m_vAllMarks) again. // reverse iteration, since erasing an entry invalidates iterators // behind it (the iterators in vMarksToDelete are sorted) - for (vector<const_iterator_t>::reverse_iterator pppMark + for (std::vector<const_iterator_t>::reverse_iterator pppMark = vMarksToDelete.rbegin(); pppMark != vMarksToDelete.rend(); ++pppMark) @@ -754,7 +776,7 @@ namespace sw { namespace mark vDelay.push_back(deleteMark(*pppMark)); } } // scope to kill vDelay - if(isSortingNeeded) + if(bIsSortingNeeded) sortMarks(); #if 0 OSL_TRACE("deleteMarks"); @@ -875,7 +897,7 @@ namespace sw { namespace mark find_if( pMarkLow, pMarkHigh, - boost::bind(equal_to<const IMark*>(), boost::bind(&boost::shared_ptr<IMark>::get, _1), pMark)); + boost::bind( ::std::equal_to<const IMark*>(), boost::bind(&boost::shared_ptr<IMark>::get, _1), pMark ) ); if(pMarkFound != pMarkHigh) deleteMark(pMarkFound); } @@ -1305,6 +1327,7 @@ void SaveBookmark::SetInDoc( } } + // _DelBookmarks, _{Save,Restore}CntntIdx void _DelBookmarks( commit 9caa7237deaf3aa6aa6dafdeee810f659c8548da Author: Oliver-Rainer Wittmann <o...@apache.org> Date: Wed Jan 8 14:20:43 2014 +0000 Related: cp#1000079, i#123792 correction for comments/annotations on ... ... table cell ranges (cherry picked from commit c25523dd3a302d1bd36297a817a869afb3605d1f) Conflicts: sw/inc/IDocumentMarkAccess.hxx sw/inc/doc.hxx sw/source/core/doc/docbm.cxx sw/source/core/undo/undobj.cxx sw/source/ui/shells/textfld.cxx xmloff/source/text/txtfldi.cxx (cherry picked from commit 6af2caab7271e11d9501fd6a597e05194d33fd10) Change-Id: Ic2e12f47e7775ee16f31bedf89d5644b18734d7a diff --git a/sw/inc/IDocumentMarkAccess.hxx b/sw/inc/IDocumentMarkAccess.hxx index 917a57f..271266f 100644 --- a/sw/inc/IDocumentMarkAccess.hxx +++ b/sw/inc/IDocumentMarkAccess.hxx @@ -262,7 +262,7 @@ class IDocumentMarkAccess /** Returns the MarkType used to create the mark */ - static MarkType SAL_DLLPUBLIC_EXPORT GetType(const ::sw::mark::IMark& rMark); + static SAL_DLLPUBLIC_EXPORT MarkType GetType(const ::sw::mark::IMark& rMark); static SAL_DLLPUBLIC_EXPORT OUString GetCrossRefHeadingBookmarkNamePrefix(); static SAL_DLLPUBLIC_EXPORT bool IsLegalPaMForCrossRefHeadingBookmark( const SwPaM& rPaM ); diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx index 73efd7d..7de655f 100644 --- a/sw/inc/doc.hxx +++ b/sw/inc/doc.hxx @@ -1451,20 +1451,31 @@ public: // If bMoveCrsr is set move Crsr too. /// Set everything in rOldNode on rNewPos + Offset. - void CorrAbs( const SwNodeIndex& rOldNode, const SwPosition& rNewPos, - const xub_StrLen nOffset = 0, sal_Bool bMoveCrsr = sal_False ); + void CorrAbs( + const SwNodeIndex& rOldNode, + const SwPosition& rNewPos, + const xub_StrLen nOffset = 0, + sal_Bool bMoveCrsr = sal_False ); /// Set everything in the range of [rStartNode, rEndNode] to rNewPos. - void CorrAbs( const SwNodeIndex& rStartNode, const SwNodeIndex& rEndNode, - const SwPosition& rNewPos, sal_Bool bMoveCrsr = sal_False ); + void CorrAbs( + const SwNodeIndex& rStartNode, + const SwNodeIndex& rEndNode, + const SwPosition& rNewPos, + sal_Bool bMoveCrsr = sal_False ); /// Set everything in this range from rRange to rNewPos. - void CorrAbs( const SwPaM& rRange, const SwPosition& rNewPos, - sal_Bool bMoveCrsr = sal_False ); + void CorrAbs( + const SwPaM& rRange, + const SwPosition& rNewPos, + sal_Bool bMoveCrsr = sal_False ); /// Set everything in rOldNode to relative Pos. - void CorrRel( const SwNodeIndex& rOldNode, const SwPosition& rNewPos, - const xub_StrLen nOffset = 0, sal_Bool bMoveCrsr = sal_False ); + void CorrRel( + const SwNodeIndex& rOldNode, + const SwPosition& rNewPos, + const xub_StrLen nOffset = 0, + sal_Bool bMoveCrsr = sal_False ); /// Query / set rules for Outline. inline SwNumRule* GetOutlineNumRule() const diff --git a/sw/source/core/crsr/annotationmark.cxx b/sw/source/core/crsr/annotationmark.cxx index 964e736..80751a4 100644 --- a/sw/source/core/crsr/annotationmark.cxx +++ b/sw/source/core/crsr/annotationmark.cxx @@ -54,6 +54,7 @@ namespace sw { namespace mark SwTxtFld* pTxtFld = GetMarkEnd().nNode.GetNode().GetTxtNode()->GetFldTxtAttrAt( GetMarkEnd().nContent.GetIndex()-1, true ); + OSL_ENSURE( pTxtFld != NULL, "<AnnotationMark::InitDoc(..)> - missing text attribute for annotation field!" ); if ( pTxtFld != NULL ) { const SwPostItField* pPostItField = dynamic_cast< const SwPostItField* >(pTxtFld->GetFmtFld().GetField()); diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index 7ac32fa..856bbc6 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -156,18 +156,34 @@ namespace return max_element(vCandidates.begin(), vCandidates.end(), &lcl_MarkOrderingByEnd)->get(); } - static bool lcl_FixCorrectedMark(bool bChangedPos, bool bChangedOPos, MarkBase* io_pMark) + static bool lcl_FixCorrectedMark( + const bool bChangedPos, + const bool bChangedOPos, + MarkBase* io_pMark ) { - if( (bChangedPos || bChangedOPos) && io_pMark->IsExpanded() && - io_pMark->GetOtherMarkPos().nNode.GetNode().FindTableBoxStartNode() != - io_pMark->GetMarkPos().nNode.GetNode().FindTableBoxStartNode() ) + if ( IDocumentMarkAccess::GetType(*io_pMark) == IDocumentMarkAccess::ANNOTATIONMARK ) { - if(!bChangedOPos) - io_pMark->SetMarkPos(io_pMark->GetOtherMarkPos()); + // annotation marks are allowed to span a table cell range. + // but trigger sorting to be save + return true; + } + + if ( ( bChangedPos || bChangedOPos ) + && io_pMark->IsExpanded() + && io_pMark->GetOtherMarkPos().nNode.GetNode().FindTableBoxStartNode() != + io_pMark->GetMarkPos().nNode.GetNode().FindTableBoxStartNode() ) + { + if ( !bChangedOPos ) + { + io_pMark->SetMarkPos( io_pMark->GetOtherMarkPos() ); + } io_pMark->ClearOtherMarkPos(); DdeBookmark * const pDdeBkmk = dynamic_cast< DdeBookmark*>(io_pMark); - if(pDdeBkmk && pDdeBkmk->IsServer()) + if ( pDdeBkmk != NULL + && pDdeBkmk->IsServer() ) + { pDdeBkmk->SetRefObject(NULL); + } return true; } return false; @@ -636,14 +652,14 @@ namespace sw { namespace mark lcl_GreaterThan(pMark->GetOtherMarkPos(), rStt, pSttIdx) && lcl_Lower(pMark->GetOtherMarkPos(), rEnd, pEndIdx)); // special case: completely in range, touching the end? - if(pEndIdx && - ((isOtherPosInRange - && pMark->GetMarkPos().nNode == rEnd - && pMark->GetMarkPos().nContent == *pEndIdx) - || (isPosInRange - && pMark->IsExpanded() - && pMark->GetOtherMarkPos().nNode == rEnd - && pMark->GetOtherMarkPos().nContent == *pEndIdx))) + if ( pEndIdx != NULL + && ( ( isOtherPosInRange + && pMark->GetMarkPos().nNode == rEnd + && pMark->GetMarkPos().nContent == *pEndIdx ) + || ( isPosInRange + && pMark->IsExpanded() + && pMark->GetOtherMarkPos().nNode == rEnd + && pMark->GetOtherMarkPos().nContent == *pEndIdx ) ) ) { isPosInRange = true, isOtherPosInRange = true; } @@ -671,39 +687,51 @@ namespace sw { namespace mark vMarksToDelete.push_back(ppMark); } } - else if(isPosInRange ^ isOtherPosInRange) + else if ( isPosInRange ^ isOtherPosInRange ) { // the bookmark is partitially in the range // move position of that is in the range out of it SAL_WNODEPRECATED_DECLARATIONS_PUSH - auto_ptr<SwPosition> pNewPos; - if(pEndIdx) - pNewPos = auto_ptr<SwPosition>(new SwPosition( - rEnd, - *pEndIdx)); - else - pNewPos = lcl_FindExpelPosition( - rStt, - rEnd, - isPosInRange ? pMark->GetOtherMarkPos() : pMark->GetMarkPos()); - SAL_WNODEPRECATED_DECLARATIONS_POP + auto_ptr< SwPosition > pNewPos; + { + if ( pEndIdx != NULL ) + { + pNewPos = auto_ptr< SwPosition >( new SwPosition( rEnd, *pEndIdx ) ); + } + else + { + pNewPos = lcl_FindExpelPosition( rStt, rEnd, isPosInRange ? pMark->GetOtherMarkPos() : pMark->GetMarkPos() ); + } + } - // #i92125# - // no move of position for cross-reference bookmarks, - // if move occurs inside a certain node - if ( ( IDocumentMarkAccess::GetType(*pMark) != - IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK && - IDocumentMarkAccess::GetType(*pMark) != - IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK ) || - pMark->GetMarkPos().nNode != pNewPos->nNode ) + bool bMoveMark = true; + { + switch ( IDocumentMarkAccess::GetType( *pMark ) ) + { + case IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK: + case IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK: + // no move of cross-reference bookmarks, if move occurs inside a certain node + bMoveMark = pMark->GetMarkPos().nNode != pNewPos->nNode; + break; + case IDocumentMarkAccess::ANNOTATIONMARK: + // no move of annotation marks, if method is called to collect deleted marks + bMoveMark = pSaveBkmk == NULL; + break; + default: + bMoveMark = true; + break; + } + } + SAL_WNODEPRECATED_DECLARATIONS_POP + if ( bMoveMark ) { - if(isPosInRange) + if ( isPosInRange ) pMark->SetMarkPos(*pNewPos); else pMark->SetOtherMarkPos(*pNewPos); // illegal selection? collapse the mark and restore sorting later - isSortingNeeded |= lcl_FixCorrectedMark(isPosInRange, isOtherPosInRange, pMark); + isSortingNeeded |= lcl_FixCorrectedMark( isPosInRange, isOtherPosInRange, pMark ); } } } @@ -847,7 +875,7 @@ namespace sw { namespace mark find_if( pMarkLow, pMarkHigh, - boost::bind(equal_to<const IMark*>(), boost::bind(&boost::shared_ptr<IMark>::get, _1), pMark) ); + boost::bind(equal_to<const IMark*>(), boost::bind(&boost::shared_ptr<IMark>::get, _1), pMark)); if(pMarkFound != pMarkHigh) deleteMark(pMarkFound); } diff --git a/sw/source/core/doc/doccorr.cxx b/sw/source/core/doc/doccorr.cxx index cd6065f..6d4b0d7 100644 --- a/sw/source/core/doc/doccorr.cxx +++ b/sw/source/core/doc/doccorr.cxx @@ -214,26 +214,28 @@ void SwDoc::CorrAbs(const SwNodeIndex& rOldNode, } } -void SwDoc::CorrAbs(const SwPaM& rRange, +void SwDoc::CorrAbs( + const SwPaM& rRange, const SwPosition& rNewPos, - sal_Bool bMoveCrsr) + sal_Bool bMoveCrsr ) { SwPosition aStart(*rRange.Start()); SwPosition aEnd(*rRange.End()); SwPosition aNewPos(rNewPos); - _DelBookmarks(aStart.nNode, aEnd.nNode, NULL, - &aStart.nContent, &aEnd.nContent); + _DelBookmarks( aStart.nNode, aEnd.nNode, NULL, &aStart.nContent, &aEnd.nContent ); + if(bMoveCrsr) ::PaMCorrAbs(rRange, rNewPos); } -void SwDoc::CorrAbs(const SwNodeIndex& rStartNode, - const SwNodeIndex& rEndNode, - const SwPosition& rNewPos, - sal_Bool bMoveCrsr) +void SwDoc::CorrAbs( + const SwNodeIndex& rStartNode, + const SwNodeIndex& rEndNode, + const SwPosition& rNewPos, + sal_Bool bMoveCrsr ) { - _DelBookmarks(rStartNode, rEndNode); + _DelBookmarks( rStartNode, rEndNode ); if(bMoveCrsr) { diff --git a/sw/source/core/undo/undobj.cxx b/sw/source/core/undo/undobj.cxx index e108f3c..f552dc9 100644 --- a/sw/source/core/undo/undobj.cxx +++ b/sw/source/core/undo/undobj.cxx @@ -826,12 +826,21 @@ void SwUndoSaveSection::SaveSection( SwDoc* pDoc, const SwNodeIndex& rSttIdx ) SaveSection( pDoc, aRg ); } -void SwUndoSaveSection::SaveSection( SwDoc* , const SwNodeRange& rRange ) +void SwUndoSaveSection::SaveSection( + SwDoc* pDoc, + const SwNodeRange& rRange ) { SwPaM aPam( rRange.aStart, rRange.aEnd ); - // delete all Footnotes / FlyFrames / Bookmarks / Directories + // delete all footnotes, fly frames, bookmarks and indexes DelCntntIndex( *aPam.GetMark(), *aPam.GetPoint() ); + { + // move certain indexes out of deleted range + SwNodeIndex aSttIdx( aPam.Start()->nNode.GetNode() ); + SwNodeIndex aEndIdx( aPam.End()->nNode.GetNode() ); + SwNodeIndex aMvStt( aEndIdx, 1 ); + pDoc->CorrAbs( aSttIdx, aEndIdx, SwPosition( aMvStt ), sal_True ); + } pRedlSaveData = new SwRedlineSaveDatas; if( !SwUndo::FillSaveData( aPam, *pRedlSaveData, sal_True, sal_True )) diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx index 844f374..68aa3f3 100644 --- a/sw/source/core/unocore/unoobj.cxx +++ b/sw/source/core/unocore/unoobj.cxx @@ -1143,22 +1143,6 @@ throw (uno::RuntimeException) throw uno::RuntimeException(); } - SwStartNodeType eSearchNodeType = SwNormalStartNode; - switch (m_pImpl->m_eType) - { - case CURSOR_FRAME: eSearchNodeType = SwFlyStartNode; break; - case CURSOR_TBLTEXT: eSearchNodeType = SwTableBoxStartNode; break; - case CURSOR_FOOTNOTE: eSearchNodeType = SwFootnoteStartNode; break; - case CURSOR_HEADER: eSearchNodeType = SwHeaderStartNode; break; - case CURSOR_FOOTER: eSearchNodeType = SwFooterStartNode; break; - //case CURSOR_INVALID: - //case CURSOR_BODY: - default: - ; - } - const SwStartNode* pOwnStartNode = - rOwnCursor.GetNode()->FindSttNodeByType(eSearchNodeType); - SwPaM aPam(GetDoc()->GetNodes()); const SwPaM * pPam(0); if (pCursor) @@ -1177,21 +1161,51 @@ throw (uno::RuntimeException) { throw uno::RuntimeException(); } - const SwStartNode* pTmp = - pPam->GetNode()->FindSttNodeByType(eSearchNodeType); - //SectionNodes ueberspringen - while(pTmp && pTmp->IsSectionNode()) { - pTmp = pTmp->StartOfSectionNode(); - } - while(pOwnStartNode && pOwnStartNode->IsSectionNode()) - { - pOwnStartNode = pOwnStartNode->StartOfSectionNode(); - } - if(pOwnStartNode != pTmp) - { - throw uno::RuntimeException(); + SwStartNodeType eSearchNodeType = SwNormalStartNode; + switch (m_pImpl->m_eType) + { + case CURSOR_FRAME: eSearchNodeType = SwFlyStartNode; break; + case CURSOR_TBLTEXT: eSearchNodeType = SwTableBoxStartNode; break; + case CURSOR_FOOTNOTE: eSearchNodeType = SwFootnoteStartNode; break; + case CURSOR_HEADER: eSearchNodeType = SwHeaderStartNode; break; + case CURSOR_FOOTER: eSearchNodeType = SwFooterStartNode; break; + //case CURSOR_INVALID: + //case CURSOR_BODY: + default: + ; + } + + const SwStartNode* pOwnStartNode = rOwnCursor.GetNode()->FindSttNodeByType(eSearchNodeType); + while ( pOwnStartNode != NULL + && pOwnStartNode->IsSectionNode()) + { + pOwnStartNode = pOwnStartNode->StartOfSectionNode(); + } + + const SwStartNode* pTmp = + pPam->GetNode()->FindSttNodeByType(eSearchNodeType); + while ( pTmp != NULL + && pTmp->IsSectionNode() ) + { + pTmp = pTmp->StartOfSectionNode(); + } + + if ( eSearchNodeType == SwTableBoxStartNode ) + { + if ( pOwnStartNode->FindTableNode() != pTmp->FindTableNode() ) + { + throw uno::RuntimeException(); + } + } + else + { + if ( pOwnStartNode != pTmp ) + { + throw uno::RuntimeException(); + } + } } if (CURSOR_META == m_pImpl->m_eType) diff --git a/sw/source/ui/docvw/SidebarWin.cxx b/sw/source/ui/docvw/SidebarWin.cxx index ff696df..527cc29 100644 --- a/sw/source/ui/docvw/SidebarWin.cxx +++ b/sw/source/ui/docvw/SidebarWin.cxx @@ -641,11 +641,26 @@ void SwSidebarWin::SetPosAndSize() SwNodes& rNds = pTxtNode->GetDoc()->GetNodes(); SwCntntNode* const pCntntNd = rNds[mrSidebarItem.maLayoutInfo.mnStartNodeIdx]->GetCntntNode(); SwPosition aStartPos( *pCntntNd, mrSidebarItem.maLayoutInfo.mnStartContent ); - ::boost::scoped_ptr<SwShellCrsr> pTmpCrsrForAnnotationTextRange( - new SwShellCrsr( DocView().GetWrtShell(), aStartPos ) ); - pTmpCrsrForAnnotationTextRange->SetMark(); - pTmpCrsrForAnnotationTextRange->GetMark()->nNode = *pTxtNode; - pTmpCrsrForAnnotationTextRange->GetMark()->nContent.Assign( pTxtNode, *(pTxtAnnotationFld->GetStart())+1 ); + SwShellCrsr* pTmpCrsr = NULL; + const bool bTableCrsrNeeded = pTxtNode->FindTableBoxStartNode() != pCntntNd->FindTableBoxStartNode(); + if ( bTableCrsrNeeded ) + { + SwShellTableCrsr* pTableCrsr = new SwShellTableCrsr( DocView().GetWrtShell(), aStartPos ); + pTableCrsr->SetMark(); + pTableCrsr->GetMark()->nNode = *pTxtNode; + pTableCrsr->GetMark()->nContent.Assign( pTxtNode, *(pTxtAnnotationFld->GetStart())+1 ); + pTableCrsr->NewTableSelection(); + pTmpCrsr = pTableCrsr; + } + else + { + SwShellCrsr* pCrsr = new SwShellCrsr( DocView().GetWrtShell(), aStartPos ); + pCrsr->SetMark(); + pCrsr->GetMark()->nNode = *pTxtNode; + pCrsr->GetMark()->nContent.Assign( pTxtNode, *(pTxtAnnotationFld->GetStart())+1 ); + pTmpCrsr = pCrsr; + } + ::boost::scoped_ptr<SwShellCrsr> pTmpCrsrForAnnotationTextRange( pTmpCrsr ); pTmpCrsrForAnnotationTextRange->FillRects(); diff --git a/sw/source/ui/shells/textfld.cxx b/sw/source/ui/shells/textfld.cxx index 63b7323..9afcce6 100644 --- a/sw/source/ui/shells/textfld.cxx +++ b/sw/source/ui/shells/textfld.cxx @@ -358,9 +358,8 @@ void SwTextShell::ExecField(SfxRequest &rReq) if( (sAuthor = aUserOpt.GetID()).isEmpty() ) sAuthor = SW_RES( STR_REDLINE_UNKNOWN_AUTHOR ); - if( rSh.HasSelection() ) + if ( rSh.HasSelection() && !rSh.IsTableMode() ) { - rSh.NormalizePam(false); rSh.KillPams(); } diff --git a/sw/source/ui/wrtsh/wrtsh2.cxx b/sw/source/ui/wrtsh/wrtsh2.cxx index 38d8ee6..6a277ed 100644 --- a/sw/source/ui/wrtsh/wrtsh2.cxx +++ b/sw/source/ui/wrtsh/wrtsh2.cxx @@ -85,10 +85,23 @@ void SwWrtShell::Insert(SwField &rFld) { // for annotation fields: // - keep the current selection in order to create a corresponding annotation mark - // - collapse cursur to its point - const SwPaM& rCurrPaM = GetCurrentShellCursor(); - pAnnotationTextRange = new SwPaM( *rCurrPaM.GetPoint(), *rCurrPaM.GetMark() ); - ClearMark(); + // - collapse cursor to its end + if ( IsTableMode() ) + { + GetTblCrs()->Normalize( sal_False ); + const SwPosition rStartPos( *(GetTblCrs()->GetMark()->nNode.GetNode().GetCntntNode()), 0 ); + KillPams(); + EndPara(); + const SwPosition rEndPos( *GetCurrentShellCursor().GetPoint() ); + pAnnotationTextRange = new SwPaM( rStartPos, rEndPos ); + } + else + { + NormalizePam( sal_False ); + const SwPaM& rCurrPaM = GetCurrentShellCursor(); + pAnnotationTextRange = new SwPaM( *rCurrPaM.GetPoint(), *rCurrPaM.GetMark() ); + ClearMark(); + } } else { diff --git a/xmloff/source/text/txtfldi.cxx b/xmloff/source/text/txtfldi.cxx index 349cd37..349f5ca 100644 --- a/xmloff/source/text/txtfldi.cxx +++ b/xmloff/source/text/txtfldi.cxx @@ -3755,8 +3755,8 @@ void XMLAnnotationImportContext::EndElement() // let's create a text range covering the old and the current position. uno::Reference<text::XText> xText = GetImportHelper().GetText(); uno::Reference<text::XTextCursor> xCursor = - xText->createTextCursorByRange(xPrevField->getAnchor()); - xCursor->gotoRange(GetImportHelper().GetCursorAsRange(), true); + xText->createTextCursorByRange(GetImportHelper().GetCursorAsRange()); + xCursor->gotoRange(xPrevField->getAnchor(), true); uno::Reference<text::XTextRange> xTextRange(xCursor, uno::UNO_QUERY); xText->insertTextContent(xTextRange, xPrevField, !xCursor->isCollapsed()); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits