diff options
author | Valentin Kettner <vakevk+libreoffice@gmail.com> | 2014-07-16 22:19:33 +0200 |
---|---|---|
committer | Valentin Kettner <vakevk+libreoffice@gmail.com> | 2014-08-12 23:26:36 +0200 |
commit | 274f1811b92b870b8d450423d9b280b0889ca130 (patch) | |
tree | 3a917bc576cc1ae8fdcc02074da08696e475a6ce | |
parent | b513f288275ae96f55e232f07bf94294c66e95a1 (diff) |
Refactored IDocumentRedlineAccess out of SwDoc.
Into the new class DocumentRedlineManager.
Added an non const version of GetRedlineTbl to the interface.
Also Moved SetAutoFmtRedlineComment which is not part of interface.
Change-Id: I600d5821d5d5831557f5fc5375fb1203fe67a295
83 files changed, 3470 insertions, 3224 deletions
diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk index 75f26b296a67..849ca27810d3 100644 --- a/sw/Library_sw.mk +++ b/sw/Library_sw.mk @@ -195,6 +195,7 @@ $(eval $(call gb_Library_add_exception_objects,sw,\ sw/source/core/doc/DocumentListsManager \ sw/source/core/doc/DocumentOutlineNodesManager \ sw/source/core/doc/DocumentContentOperationsManager \ + sw/source/core/doc/DocumentRedlineManager \ sw/source/core/doc/extinput \ sw/source/core/doc/fmtcol \ sw/source/core/doc/ftnidx \ diff --git a/sw/inc/IDocumentRedlineAccess.hxx b/sw/inc/IDocumentRedlineAccess.hxx index e9748806c293..4ff9600139bd 100644 --- a/sw/inc/IDocumentRedlineAccess.hxx +++ b/sw/inc/IDocumentRedlineAccess.hxx @@ -127,6 +127,7 @@ public: virtual bool IsIgnoreRedline() const = 0; virtual const SwRedlineTbl& GetRedlineTbl() const = 0; + virtual SwRedlineTbl& GetRedlineTbl() = 0; virtual const SwExtraRedlineTbl& GetExtraRedlineTbl() const = 0; virtual SwExtraRedlineTbl& GetExtraRedlineTbl() = 0; virtual bool HasExtraRedlineTbl() const = 0; diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx index 779df32d016a..0a1eb82172bf 100644 --- a/sw/inc/doc.hxx +++ b/sw/inc/doc.hxx @@ -22,7 +22,6 @@ // SwDoc interfaces #include <IInterface.hxx> #include <IDocumentMarkAccess.hxx> -#include <IDocumentRedlineAccess.hxx> #include <IDocumentFieldsAccess.hxx> #include <IDocumentStylePoolAccess.hxx> #include <IDocumentLineNumberAccess.hxx> @@ -193,6 +192,7 @@ class IDocumentListItems; class IDocumentListsAccess; class IDocumentOutlineNodes; class IDocumentContentOperations; +class IDocumentRedlineAccess; class _SetGetExpFlds; namespace sw { namespace mark { @@ -212,6 +212,7 @@ namespace sw { class DocumentListsManager; class DocumentOutlineNodesManager; class DocumentContentOperationsManager; + class DocumentRedlineManager; } namespace com { namespace sun { namespace star { @@ -249,7 +250,6 @@ void StartGrammarChecking( SwDoc &rDoc ); // Represents the model of a Writer document. class SW_DLLPUBLIC SwDoc : public IInterface, - public IDocumentRedlineAccess, public IDocumentFieldsAccess, public IDocumentStylePoolAccess, public IDocumentLineNumberAccess, @@ -274,7 +274,6 @@ class SW_DLLPUBLIC SwDoc : Timer maOLEModifiedTimer; //< Timer for update modified OLE-Objecs Timer maStatsUpdateTimer; //< Timer for asynchronous stats calculation SwDBData maDBData; //< database descriptor - ::com::sun::star::uno::Sequence <sal_Int8 > maRedlinePasswd; OUString msTOIAutoMarkURL; //< URL of table of index AutoMark file boost::ptr_vector< boost::nullable<OUString> > maPatternNms; // Array for names of document-templates com::sun::star::uno::Reference<com::sun::star::container::XNameContainer> @@ -284,6 +283,7 @@ class SW_DLLPUBLIC SwDoc : const ::boost::scoped_ptr< ::sw::mark::MarkManager> mpMarkManager; const ::boost::scoped_ptr< ::sw::MetaFieldManager > m_pMetaFieldManager; const ::boost::scoped_ptr< ::sw::DocumentDrawModelManager > m_pDocumentDrawModelManager; + const ::boost::scoped_ptr< ::sw::DocumentRedlineManager > m_pDocumentRedlineManager; const ::boost::scoped_ptr< ::sw::UndoManager > m_pUndoManager; const ::boost::scoped_ptr< ::sw::DocumentSettingManager > m_pDocumentSettingManager; const ::boost::scoped_ptr< ::sw::DocumentChartDataProviderManager > m_pDocumentChartDataProviderManager; @@ -343,10 +343,6 @@ class SW_DLLPUBLIC SwDoc : // Hash map to find numrules by name mutable boost::unordered_map<OUString, SwNumRule *, OUStringHash> maNumRuleMap; - SwRedlineTbl *mpRedlineTbl; //< List of all Ranged Redlines. - SwExtraRedlineTbl *mpExtraRedlineTbl; //< List of all Extra Redlines. - OUString *mpAutoFmtRedlnComment; //< Comment for Redlines inserted via AutoFormat. - SwUnoCrsrTbl *mpUnoCrsrTbl; SwPagePreviewPrtData *mpPgPViewPrtData; //< Indenting / spacing for printing of page view. @@ -374,11 +370,6 @@ private: sal_uInt16 mnUndoCnt; //< Count of Undo Actions. sal_uInt16 mnUndoSttEnd; //< != 0 -> within parentheses. - sal_uInt16 mnAutoFmtRedlnCommentNo; /**< SeqNo for conjoining of AutoFmt-Redlines. - by the UI. Managed by SwAutoFmt! */ - - RedlineMode_t meRedlineMode; //< Current Redline Mode. - sal_uInt32 mnRsid; //< current session ID of the document sal_uInt32 mnRsidRoot; //< session ID when the document was created @@ -410,7 +401,6 @@ private: bool mbIsRedlineMove : 1; //< True: Redlines are moved into to / out of the section. bool mbInsOnlyTxtGlssry : 1; //< True: insert 'only text' glossary into doc bool mbContains_MSVBasic : 1; //< True: MS-VBasic exist is in our storage - bool mbReadlineChecked : 1; //< sal_True: if the query was already shown bool mbClipBoard : 1; //< TRUE: this document represents the clipboard bool mbColumnSelection : 1; /**< TRUE: this content has bee created by a column selection (clipboard docs only) */ @@ -427,8 +417,6 @@ private: static SwAutoCompleteWord *mpACmpltWords; //< List of all words for AutoComplete // private methods - void checkRedlining(RedlineMode_t& _rReadlineMode); - SwFlyFrmFmt* _MakeFlySection( const SwPosition& rAnchPos, const SwCntntNode& rNode, RndStdIds eRequestId, const SfxItemSet* pFlyAttrSet, @@ -539,39 +527,11 @@ public: const IDocumentMarkAccess* getIDocumentMarkAccess() const; // IDocumentRedlineAccess - virtual RedlineMode_t GetRedlineMode() const SAL_OVERRIDE; - virtual void SetRedlineMode_intern(/*[in]*/RedlineMode_t eMode) SAL_OVERRIDE; - virtual void SetRedlineMode(/*[in]*/RedlineMode_t eMode) SAL_OVERRIDE; - virtual bool IsRedlineOn() const SAL_OVERRIDE; - virtual bool IsIgnoreRedline() const SAL_OVERRIDE; - virtual bool IsInRedlines(const SwNode& rNode) const SAL_OVERRIDE; - virtual const SwRedlineTbl& GetRedlineTbl() const SAL_OVERRIDE; - virtual const SwExtraRedlineTbl& GetExtraRedlineTbl() const SAL_OVERRIDE; - virtual SwExtraRedlineTbl& GetExtraRedlineTbl() SAL_OVERRIDE; - virtual bool HasExtraRedlineTbl() const SAL_OVERRIDE; - virtual bool AppendRedline(/*[in]*/SwRangeRedline* pPtr, /*[in]*/bool bCallDelete) SAL_OVERRIDE; - virtual bool AppendTableRowRedline(/*[in]*/SwTableRowRedline* pPtr, /*[in]*/bool bCallDelete) SAL_OVERRIDE; - virtual bool AppendTableCellRedline(/*[in]*/SwTableCellRedline* pPtr, /*[in]*/bool bCallDelete) SAL_OVERRIDE; - virtual bool SplitRedline(const SwPaM& rPam) SAL_OVERRIDE; - virtual bool DeleteRedline(/*[in]*/const SwPaM& rPam, /*[in]*/bool bSaveInUndo, /*[in]*/sal_uInt16 nDelType) SAL_OVERRIDE; - virtual bool DeleteRedline(/*[in]*/const SwStartNode& rSection, /*[in]*/bool bSaveInUndo, /*[in]*/sal_uInt16 nDelType) SAL_OVERRIDE; - virtual sal_uInt16 GetRedlinePos(/*[in]*/const SwNode& rNode, /*[in]*/sal_uInt16 nType) const SAL_OVERRIDE; - virtual void CompressRedlines() SAL_OVERRIDE; - virtual const SwRangeRedline* GetRedline(/*[in]*/const SwPosition& rPos, /*[in]*/sal_uInt16* pFndPos) const SAL_OVERRIDE; - virtual bool IsRedlineMove() const SAL_OVERRIDE; - virtual void SetRedlineMove(/*[in]*/bool bFlag) SAL_OVERRIDE; - virtual bool AcceptRedline(/*[in]*/sal_uInt16 nPos, /*[in]*/bool bCallDelete) SAL_OVERRIDE; - virtual bool AcceptRedline(/*[in]*/const SwPaM& rPam, /*[in]*/bool bCallDelete) SAL_OVERRIDE; - virtual bool RejectRedline(/*[in]*/sal_uInt16 nPos, /*[in]*/bool bCallDelete) SAL_OVERRIDE; - virtual bool RejectRedline(/*[in]*/const SwPaM& rPam, /*[in]*/bool bCallDelete) SAL_OVERRIDE; - virtual const SwRangeRedline* SelNextRedline(/*[in]*/SwPaM& rPam) const SAL_OVERRIDE; - virtual const SwRangeRedline* SelPrevRedline(/*[in]*/SwPaM& rPam) const SAL_OVERRIDE; - virtual void UpdateRedlineAttr() SAL_OVERRIDE; - virtual sal_uInt16 GetRedlineAuthor() SAL_OVERRIDE; - virtual sal_uInt16 InsertRedlineAuthor(const OUString& rAuthor) SAL_OVERRIDE; - virtual bool SetRedlineComment(/*[in]*/const SwPaM& rPam, /*[in]*/const OUString& rComment) SAL_OVERRIDE; - virtual const ::com::sun::star::uno::Sequence <sal_Int8>& GetRedlinePassword() const SAL_OVERRIDE; - virtual void SetRedlinePassword(/*[in]*/const ::com::sun::star::uno::Sequence <sal_Int8>& rNewPassword) SAL_OVERRIDE; + IDocumentRedlineAccess const& getIDocumentRedlineAccess() const; + IDocumentRedlineAccess& getIDocumentRedlineAccess(); + + ::sw::DocumentRedlineManager const& GetDocumentRedlineManager() const; + ::sw::DocumentRedlineManager& GetDocumentRedlineManager(); // IDocumentUndoRedo IDocumentUndoRedo & GetIDocumentUndoRedo(); @@ -1573,11 +1533,6 @@ public: // Merge two documents. long MergeDoc( const SwDoc& rDoc ); - /** Set comment-text for Redline. It then comes in via AppendRedLine. - Used by AutoFormat. 0-pointer resets mode. - Sequence number is for conjoining of Redlines by the UI. */ - void SetAutoFmtRedlineComment( const OUString* pTxt, sal_uInt16 nSeqNo = 0 ); - bool IsAutoFmtRedline() const { return mbIsAutoFmtRedline; } void SetAutoFmtRedline( bool bFlag ) { mbIsAutoFmtRedline = bFlag; } diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx index 75cbf77806bc..d58f5bc39f68 100644 --- a/sw/qa/core/uwriter.cxx +++ b/sw/qa/core/uwriter.cxx @@ -32,6 +32,7 @@ #include "breakit.hxx" #include "doc.hxx" +#include <IDocumentRedlineAccess.hxx> #include "docsh.hxx" #include "docstat.hxx" #include "docufld.hxx" @@ -252,9 +253,9 @@ void SwDocTest::testModelToViewHelper() aPaM.DeleteMark(); //turn on red-lining and show changes - m_pDoc->SetRedlineMode(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_DELETE|nsRedlineMode_t::REDLINE_SHOW_INSERT); - CPPUNIT_ASSERT_MESSAGE("redlining should be on", m_pDoc->IsRedlineOn()); - CPPUNIT_ASSERT_MESSAGE("redlines should be visible", IDocumentRedlineAccess::IsShowChanges(m_pDoc->GetRedlineMode())); + m_pDoc->getIDocumentRedlineAccess().SetRedlineMode(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_DELETE|nsRedlineMode_t::REDLINE_SHOW_INSERT); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", m_pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + CPPUNIT_ASSERT_MESSAGE("redlines should be visible", IDocumentRedlineAccess::IsShowChanges(m_pDoc->getIDocumentRedlineAccess().GetRedlineMode())); //set start of selection to last A aPaM.GetPoint()->nContent.Assign(aPaM.GetCntntNode(), 4); @@ -623,9 +624,9 @@ void SwDocTest::testSwScanner() CPPUNIT_ASSERT_EQUAL(aDocStat.nWord, static_cast<sal_uLong>(2)); //turn on red-lining and show changes - m_pDoc->SetRedlineMode(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_DELETE|nsRedlineMode_t::REDLINE_SHOW_INSERT); - CPPUNIT_ASSERT_MESSAGE("redlining should be on", m_pDoc->IsRedlineOn()); - CPPUNIT_ASSERT_MESSAGE("redlines should be visible", IDocumentRedlineAccess::IsShowChanges(m_pDoc->GetRedlineMode())); + m_pDoc->getIDocumentRedlineAccess().SetRedlineMode(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_DELETE|nsRedlineMode_t::REDLINE_SHOW_INSERT); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", m_pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + CPPUNIT_ASSERT_MESSAGE("redlines should be visible", IDocumentRedlineAccess::IsShowChanges(m_pDoc->getIDocumentRedlineAccess().GetRedlineMode())); //delete everything except the first word aPaM.SetMark(); //set start of selection to current pos @@ -642,9 +643,9 @@ void SwDocTest::testSwScanner() pTxtNode->SetWordCountDirty(true); //keep red-lining on but hide changes - m_pDoc->SetRedlineMode(nsRedlineMode_t::REDLINE_ON); - CPPUNIT_ASSERT_MESSAGE("redlining should be still on", m_pDoc->IsRedlineOn()); - CPPUNIT_ASSERT_MESSAGE("redlines should be invisible", !IDocumentRedlineAccess::IsShowChanges(m_pDoc->GetRedlineMode())); + m_pDoc->getIDocumentRedlineAccess().SetRedlineMode(nsRedlineMode_t::REDLINE_ON); + CPPUNIT_ASSERT_MESSAGE("redlining should be still on", m_pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + CPPUNIT_ASSERT_MESSAGE("redlines should be invisible", !IDocumentRedlineAccess::IsShowChanges(m_pDoc->getIDocumentRedlineAccess().GetRedlineMode())); aDocStat.Reset(); pTxtNode->CountWords(aDocStat, 0, pTxtNode->Len()); //but word-counting the text should only count the non-deleted text @@ -653,7 +654,7 @@ void SwDocTest::testSwScanner() OUString sLorem = pTxtNode->GetTxt(); CPPUNIT_ASSERT(sLorem == "Lorem"); - const SwRedlineTbl& rTbl = m_pDoc->GetRedlineTbl(); + const SwRedlineTbl& rTbl = m_pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); SwNodes& rNds = m_pDoc->GetNodes(); CPPUNIT_ASSERT(rTbl.size() == 1); @@ -876,7 +877,7 @@ getRandomPosition(SwDoc *pDoc, int /* nOffset */) void SwDocTest::randomTest() { - CPPUNIT_ASSERT_MESSAGE("SwDoc::IsRedlineOn()", !m_pDoc->IsRedlineOn()); + CPPUNIT_ASSERT_MESSAGE("SwDoc::IsRedlineOn()", !m_pDoc->getIDocumentRedlineAccess().IsRedlineOn()); RedlineMode_t modes[] = { nsRedlineMode_t::REDLINE_ON, nsRedlineMode_t::REDLINE_SHOW_MASK, @@ -896,7 +897,7 @@ void SwDocTest::randomTest() m_pDoc->ClearDoc(); // setup redlining - m_pDoc->SetRedlineMode(modes[rlm]); + m_pDoc->getIDocumentRedlineAccess().SetRedlineMode(modes[rlm]); SW_MOD()->SetRedlineAuthor(OUString::createFromAscii(authors[0])); for( int i = 0; i < 2000; i++ ) diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index f13d1c7c8d7f..10cb4545bb84 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -330,7 +330,7 @@ void SwUiWriterTest::testCp1000071() SwDoc* pDoc = createDoc("cp1000071.odt"); SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); - const SwRedlineTbl& rTbl = pDoc->GetRedlineTbl(); + const SwRedlineTbl& rTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); CPPUNIT_ASSERT_EQUAL( size_t( 2 ), rTbl.size()); sal_uLong redlineStart0NodeIndex = rTbl[ 0 ]->Start()->nNode.GetIndex(); sal_Int32 redlineStart0Index = rTbl[ 0 ]->Start()->nContent.GetIndex(); diff --git a/sw/source/core/access/accpara.cxx b/sw/source/core/access/accpara.cxx index 3ac13e295f5a..77ace642a3e6 100644 --- a/sw/source/core/access/accpara.cxx +++ b/sw/source/core/access/accpara.cxx @@ -51,6 +51,7 @@ #include <unocrsr.hxx> #include <unoport.hxx> #include <doc.hxx> +#include <IDocumentRedlineAccess.hxx> #include <crsskip.hxx> #include <txtatr.hxx> #include <acchyperlink.hxx> @@ -719,7 +720,7 @@ const SwRangeRedline* SwAccessibleParagraph::GetRedlineAtIndex( sal_Int32 ) const SwDoc* pDoc = pNode->GetDoc(); if ( pDoc ) { - pRedline = pDoc->GetRedline( *pStart, NULL ); + pRedline = pDoc->getIDocumentRedlineAccess().GetRedline( *pStart, NULL ); } } } diff --git a/sw/source/core/crsr/crstrvl.cxx b/sw/source/core/crsr/crstrvl.cxx index 7bdca7302112..856a5265ff3f 100644 --- a/sw/source/core/crsr/crstrvl.cxx +++ b/sw/source/core/crsr/crstrvl.cxx @@ -27,6 +27,7 @@ #include <crsrsh.hxx> #include <doc.hxx> #include <IDocumentUndoRedo.hxx> +#include <IDocumentRedlineAccess.hxx> #include <pagefrm.hxx> #include <cntfrm.hxx> #include <rootfrm.hxx> @@ -1412,7 +1413,7 @@ bool SwCrsrShell::GetContentAtPos( const Point& rPt, if( !bRet && SwContentAtPos::SW_REDLINE & rCntntAtPos.eCntntAtPos ) { - const SwRangeRedline* pRedl = GetDoc()->GetRedline(aPos, NULL); + const SwRangeRedline* pRedl = GetDoc()->getIDocumentRedlineAccess().GetRedline(aPos, NULL); if( pRedl ) { rCntntAtPos.aFnd.pRedl = pRedl; @@ -1941,7 +1942,7 @@ const SwRangeRedline* SwCrsrShell::SelNextRedline() SwCallLink aLk( *this ); // watch Crsr-Moves SwCrsrSaveState aSaveState( *m_pCurCrsr ); - pFnd = GetDoc()->SelNextRedline( *m_pCurCrsr ); + pFnd = GetDoc()->getIDocumentRedlineAccess().SelNextRedline( *m_pCurCrsr ); if( pFnd && !m_pCurCrsr->IsInProtectTable() && !m_pCurCrsr->IsSelOvr() ) UpdateCrsr( SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY); else @@ -1959,7 +1960,7 @@ const SwRangeRedline* SwCrsrShell::SelPrevRedline() SwCallLink aLk( *this ); // watch Crsr-Moves SwCrsrSaveState aSaveState( *m_pCurCrsr ); - pFnd = GetDoc()->SelPrevRedline( *m_pCurCrsr ); + pFnd = GetDoc()->getIDocumentRedlineAccess().SelPrevRedline( *m_pCurCrsr ); if( pFnd && !m_pCurCrsr->IsInProtectTable() && !m_pCurCrsr->IsSelOvr() ) UpdateCrsr( SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY); else @@ -1974,7 +1975,7 @@ const SwRangeRedline* SwCrsrShell::_GotoRedline( sal_uInt16 nArrPos, bool bSelec SwCallLink aLk( *this ); // watch Crsr-Moves SwCrsrSaveState aSaveState( *m_pCurCrsr ); - pFnd = GetDoc()->GetRedlineTbl()[ nArrPos ]; + pFnd = GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl()[ nArrPos ]; if( pFnd ) { *m_pCurCrsr->GetPoint() = *pFnd->Start(); @@ -2043,7 +2044,7 @@ const SwRangeRedline* SwCrsrShell::GotoRedline( sal_uInt16 nArrPos, bool bSelect { SET_CURR_SHELL( this ); - const SwRedlineTbl& rTbl = GetDoc()->GetRedlineTbl(); + const SwRedlineTbl& rTbl = GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl(); const SwRangeRedline* pTmp = rTbl[ nArrPos ]; sal_uInt16 nSeqNo = pTmp->GetSeqNo(); if( nSeqNo && bSelect ) diff --git a/sw/source/core/crsr/swcrsr.cxx b/sw/source/core/crsr/swcrsr.cxx index c93bfc77326a..396940aba967 100644 --- a/sw/source/core/crsr/swcrsr.cxx +++ b/sw/source/core/crsr/swcrsr.cxx @@ -30,6 +30,7 @@ #include <unocrsr.hxx> #include <doc.hxx> #include <IDocumentUndoRedo.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docary.hxx> #include <ndtxt.hxx> #include <section.hxx> @@ -1410,13 +1411,13 @@ static OUString lcl_MaskDeletedRedlines( const SwTxtNode* pTxtNd ) //mask deleted redlines OUString sNodeText(pTxtNd->GetTxt()); const SwDoc& rDoc = *pTxtNd->GetDoc(); - const bool nShowChg = IDocumentRedlineAccess::IsShowChanges( rDoc.GetRedlineMode() ); + const bool nShowChg = IDocumentRedlineAccess::IsShowChanges( rDoc.getIDocumentRedlineAccess().GetRedlineMode() ); if ( nShowChg ) { - sal_uInt16 nAct = rDoc.GetRedlinePos( *pTxtNd, USHRT_MAX ); - for ( ; nAct < rDoc.GetRedlineTbl().size(); nAct++ ) + sal_uInt16 nAct = rDoc.getIDocumentRedlineAccess().GetRedlinePos( *pTxtNd, USHRT_MAX ); + for ( ; nAct < rDoc.getIDocumentRedlineAccess().GetRedlineTbl().size(); nAct++ ) { - const SwRangeRedline* pRed = rDoc.GetRedlineTbl()[ nAct ]; + const SwRangeRedline* pRed = rDoc.getIDocumentRedlineAccess().GetRedlineTbl()[ nAct ]; if ( pRed->Start()->nNode > pTxtNd->GetIndex() ) break; diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx index fbcd83fd3380..8c777add8ba1 100644 --- a/sw/source/core/doc/DocumentContentOperationsManager.cxx +++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx @@ -20,6 +20,7 @@ #include <doc.hxx> #include <IDocumentUndoRedo.hxx> #include <IDocumentMarkAccess.hxx> +#include <DocumentRedlineManager.hxx> #include <UndoManager.hxx> #include <docary.hxx> #include <textboxhelper.hxx> @@ -284,7 +285,7 @@ namespace static void lcl_DeleteRedlines( const SwPaM& rPam, SwPaM& rCpyPam ) { const SwDoc* pSrcDoc = rPam.GetDoc(); - const SwRedlineTbl& rTbl = pSrcDoc->GetRedlineTbl(); + const SwRedlineTbl& rTbl = pSrcDoc->getIDocumentRedlineAccess().GetRedlineTbl(); if( !rTbl.empty() ) { SwDoc* pDestDoc = rCpyPam.GetDoc(); @@ -296,7 +297,7 @@ namespace SwNodeIndex aCorrIdx( pStt->nNode ); sal_uInt16 n = 0; - pSrcDoc->GetRedline( *pStt, &n ); + pSrcDoc->getIDocumentRedlineAccess().GetRedline( *pStt, &n ); for( ; n < rTbl.size(); ++n ) { const SwRangeRedline* pRedl = rTbl[ n ]; @@ -344,8 +345,8 @@ namespace if( pDelPam ) { - RedlineMode_t eOld = pDestDoc->GetRedlineMode(); - pDestDoc->SetRedlineMode_intern( (RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); + RedlineMode_t eOld = pDestDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDestDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); ::sw::UndoGuard const undoGuard(pDestDoc->GetIDocumentUndoRedo()); @@ -357,7 +358,7 @@ namespace } while( true ); delete pDelPam; - pDestDoc->SetRedlineMode_intern( eOld ); + pDestDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } } } @@ -365,7 +366,7 @@ namespace static void lcl_DeleteRedlines( const SwNodeRange& rRg, SwNodeRange& rCpyRg ) { SwDoc* pSrcDoc = rRg.aStart.GetNode().GetDoc(); - if( !pSrcDoc->GetRedlineTbl().empty() ) + if( !pSrcDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) { SwPaM aRgTmp( rRg.aStart, rRg.aEnd ); SwPaM aCpyTmp( rCpyRg.aStart, rCpyRg.aEnd ); @@ -625,17 +626,17 @@ namespace // get first relevant redline sal_uInt16 nCurrentRedline; - pDoc->GetRedline( *pStart, &nCurrentRedline ); + pDoc->getIDocumentRedlineAccess().GetRedline( *pStart, &nCurrentRedline ); if( nCurrentRedline > 0) nCurrentRedline--; // redline mode REDLINE_IGNORE|REDLINE_ON; save old mode - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern( (RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); // iterate over relevant redlines and decide for each whether it should // be saved, or split + saved - SwRedlineTbl& rRedlineTable = const_cast<SwRedlineTbl&>( pDoc->GetRedlineTbl() ); + SwRedlineTbl& rRedlineTable = const_cast<SwRedlineTbl&>( pDoc->getIDocumentRedlineAccess().GetRedlineTbl() ); for( ; nCurrentRedline < rRedlineTable.size(); nCurrentRedline++ ) { SwRangeRedline* pCurrent = rRedlineTable[ nCurrentRedline ]; @@ -660,7 +661,7 @@ namespace SwRangeRedline* pNewRedline = new SwRangeRedline( *pCurrent ); *pNewRedline->End() = *pStart; *pCurrent->Start() = *pStart; - pDoc->AppendRedline( pNewRedline, true ); + pDoc->getIDocumentRedlineAccess().AppendRedline( pNewRedline, true ); } // split end, if necessary @@ -670,7 +671,7 @@ namespace SwRangeRedline* pNewRedline = new SwRangeRedline( *pCurrent ); *pNewRedline->Start() = *pEnd; *pCurrent->End() = *pEnd; - pDoc->AppendRedline( pNewRedline, true ); + pDoc->getIDocumentRedlineAccess().AppendRedline( pNewRedline, true ); } // save the current redline @@ -680,21 +681,21 @@ namespace } // restore old redline mode - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } static void lcl_RestoreRedlines( SwDoc* pDoc, const SwPosition& rPos, _SaveRedlines& rArr ) { - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern( (RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); for( size_t n = 0; n < rArr.size(); ++n ) { rArr[ n ].SetPos( rPos ); - pDoc->AppendRedline( rArr[ n ].pRedl, true ); + pDoc->getIDocumentRedlineAccess().AppendRedline( rArr[ n ].pRedl, true ); } - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } static void lcl_SaveRedlines( const SwNodeRange& rRg, _SaveRedlines& rArr ) @@ -703,14 +704,14 @@ namespace sal_uInt16 nRedlPos; SwPosition aSrchPos( rRg.aStart ); aSrchPos.nNode--; aSrchPos.nContent.Assign( aSrchPos.nNode.GetNode().GetCntntNode(), 0 ); - if( pDoc->GetRedline( aSrchPos, &nRedlPos ) && nRedlPos ) + if( pDoc->getIDocumentRedlineAccess().GetRedline( aSrchPos, &nRedlPos ) && nRedlPos ) --nRedlPos; - else if( nRedlPos >= pDoc->GetRedlineTbl().size() ) + else if( nRedlPos >= pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size() ) return ; - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern( (RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); - SwRedlineTbl& rRedlTbl = (SwRedlineTbl&)pDoc->GetRedlineTbl(); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); + SwRedlineTbl& rRedlTbl = (SwRedlineTbl&)pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); do { SwRangeRedline* pTmp = rRedlTbl[ nRedlPos ]; @@ -773,28 +774,28 @@ namespace pTmpPos->nNode = rRg.aEnd; pTmpPos->nContent.Assign( pTmpPos->nNode.GetNode().GetCntntNode(), 0 ); - pDoc->AppendRedline( pTmp, true ); + pDoc->getIDocumentRedlineAccess().AppendRedline( pTmp, true ); } } else break; - } while( ++nRedlPos < pDoc->GetRedlineTbl().size() ); - pDoc->SetRedlineMode_intern( eOld ); + } while( ++nRedlPos < pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size() ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } static void lcl_RestoreRedlines( SwDoc* pDoc, sal_uInt32 nInsPos, _SaveRedlines& rArr ) { - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern( (RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); for( size_t n = 0; n < rArr.size(); ++n ) { rArr[ n ].SetPos( nInsPos ); - pDoc->AppendRedline( rArr[ n ].pRedl, true ); + pDoc->getIDocumentRedlineAccess().AppendRedline( rArr[ n ].pRedl, true ); } - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } static bool lcl_SaveFtn( const SwNodeIndex& rSttNd, const SwNodeIndex& rEndNd, @@ -1125,8 +1126,8 @@ namespace //local functions originally from docfmt.cxx bRet = history.InsertItems( aTxtSet, rSt.GetIndex(), rSt.GetIndex(), nFlags ) || bRet; - if (bRet && (pDoc->IsRedlineOn() || (!pDoc->IsIgnoreRedline() - && !pDoc->GetRedlineTbl().empty()))) + if (bRet && (pDoc->getIDocumentRedlineAccess().IsRedlineOn() || (!pDoc->getIDocumentRedlineAccess().IsIgnoreRedline() + && !pDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty()))) { SwPaM aPam( pStt->nNode, pStt->nContent.GetIndex()-1, pStt->nNode, pStt->nContent.GetIndex() ); @@ -1134,10 +1135,10 @@ namespace //local functions originally from docfmt.cxx if( pUndo ) pUndo->SaveRedlineData( aPam, true ); - if( pDoc->IsRedlineOn() ) - pDoc->AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) + pDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); else - pDoc->SplitRedline( aPam ); + pDoc->getIDocumentRedlineAccess().SplitRedline( aPam ); } } } @@ -1165,8 +1166,8 @@ namespace //local functions originally from docfmt.cxx bRet = history.InsertItems( aTxtSet, nInsCnt, nEnd, nFlags ) || bRet; - if (bRet && (pDoc->IsRedlineOn() || (!pDoc->IsIgnoreRedline() - && !pDoc->GetRedlineTbl().empty()))) + if (bRet && (pDoc->getIDocumentRedlineAccess().IsRedlineOn() || (!pDoc->getIDocumentRedlineAccess().IsIgnoreRedline() + && !pDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty()))) { // Was text content inserted? (RefMark/TOXMarks without an end) bool bTxtIns = nInsCnt != rSt.GetIndex(); @@ -1176,13 +1177,13 @@ namespace //local functions originally from docfmt.cxx if( pUndo ) pUndo->SaveRedlineData( aPam, bTxtIns ); - if( pDoc->IsRedlineOn() ) - pDoc->AppendRedline( + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) + pDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( bTxtIns ? nsRedlineType_t::REDLINE_INSERT : nsRedlineType_t::REDLINE_FORMAT, aPam ), true); else if( bTxtIns ) - pDoc->SplitRedline( aPam ); + pDoc->getIDocumentRedlineAccess().SplitRedline( aPam ); } } } @@ -1348,13 +1349,13 @@ namespace //local functions originally from docfmt.cxx bRet = history.InsertItems( *pCharSet, nMkPos, nPtPos, nFlags ) || bRet; - if( pDoc->IsRedlineOn() ) + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) { SwPaM aPam( *pNode, nMkPos, *pNode, nPtPos ); if( pUndo ) pUndo->SaveRedlineData( aPam, false ); - pDoc->AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_FORMAT, aPam ), true); + pDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_FORMAT, aPam ), true); } } if( pOtherSet && pOtherSet->Count() ) @@ -1374,11 +1375,11 @@ namespace //local functions originally from docfmt.cxx return bRet; } - if( pDoc->IsRedlineOn() && pCharSet && pCharSet->Count() ) + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() && pCharSet && pCharSet->Count() ) { if( pUndo ) pUndo->SaveRedlineData( rRg, false ); - pDoc->AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_FORMAT, rRg ), true); + pDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_FORMAT, rRg ), true); } /* now if range */ @@ -1606,11 +1607,11 @@ DocumentContentOperationsManager::CopyRange( SwPaM& rPam, SwPosition& rPos, cons } SwPaM* pRedlineRange = 0; - if( pDoc->IsRedlineOn() || - (!pDoc->IsIgnoreRedline() && !pDoc->GetRedlineTbl().empty() ) ) + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() || + (!pDoc->getIDocumentRedlineAccess().IsIgnoreRedline() && !pDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) ) pRedlineRange = new SwPaM( rPos ); - RedlineMode_t eOld = pDoc->GetRedlineMode(); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); bool bRet = false; @@ -1634,7 +1635,7 @@ DocumentContentOperationsManager::CopyRange( SwPaM& rPam, SwPosition& rPos, cons OSL_ENSURE( &m_rSwdoc == pDoc, " invalid copy branch!" ); OSL_FAIL("mst: i thought this could be dead code;" "please tell me what you did to get here!"); - pDoc->SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); // Then copy the area to the underlying document area // (with start/end nodes clamped) and move them to @@ -1694,13 +1695,13 @@ DocumentContentOperationsManager::CopyRange( SwPaM& rPam, SwPosition& rPos, cons bRet = true; } - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); if( pRedlineRange ) { - if( pDoc->IsRedlineOn() ) - pDoc->AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, *pRedlineRange ), true); + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) + pDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, *pRedlineRange ), true); else - pDoc->SplitRedline( *pRedlineRange ); + pDoc->getIDocumentRedlineAccess().SplitRedline( *pRedlineRange ); delete pRedlineRange; } @@ -1719,7 +1720,7 @@ void DocumentContentOperationsManager::DeleteSection( SwNode *pNode ) // delete all Flys, Bookmarks, ... DelFlyInRange( aSttIdx, aEndIdx ); - m_rSwdoc.DeleteRedline( *pSttNd, true, USHRT_MAX ); + m_rSwdoc.getIDocumentRedlineAccess().DeleteRedline( *pSttNd, true, USHRT_MAX ); _DelBookmarks(aSttIdx, aEndIdx); { @@ -1744,7 +1745,7 @@ bool DocumentContentOperationsManager::DelFullPara( SwPaM& rPam ) pNd->StartOfSectionIndex(); sal_uInt32 nNodeDiff = rEnd.nNode.GetIndex() - rStt.nNode.GetIndex(); - if ( nSectDiff-2 <= nNodeDiff || m_rSwdoc.IsRedlineOn() || + if ( nSectDiff-2 <= nNodeDiff || m_rSwdoc.getIDocumentRedlineAccess().IsRedlineOn() || /* #i9185# Prevent getting the node after the end node (see below) */ rEnd.nNode.GetIndex() + 1 == m_rSwdoc.GetNodes().Count() ) { @@ -1880,7 +1881,7 @@ bool DocumentContentOperationsManager::DeleteAndJoin( SwPaM & rPam, if ( lcl_StrLenOverflow( rPam ) ) return false; - return lcl_DoWithBreaks( *this, rPam, (m_rSwdoc.IsRedlineOn()) + return lcl_DoWithBreaks( *this, rPam, (m_rSwdoc.getIDocumentRedlineAccess().IsRedlineOn()) ? &DocumentContentOperationsManager::DeleteAndJoinWithRedlineImpl : &DocumentContentOperationsManager::DeleteAndJoinImpl, bForceJoinNext ); @@ -1902,7 +1903,7 @@ bool DocumentContentOperationsManager::MoveRange( SwPaM& rPaM, SwPosition& rPos, // save redlines (if DOC_MOVEREDLINES is used) _SaveRedlines aSaveRedl; - if( DOC_MOVEREDLINES & eMvFlags && !m_rSwdoc.GetRedlineTbl().empty() ) + if( DOC_MOVEREDLINES & eMvFlags && !m_rSwdoc.getIDocumentRedlineAccess().GetRedlineTbl().empty() ) { lcl_SaveRedlines( rPaM, aSaveRedl ); @@ -2150,25 +2151,25 @@ bool DocumentContentOperationsManager::MoveNodeRange( SwNodeRange& rRange, SwNod _SaveRedlines aSaveRedl; std::vector<SwRangeRedline*> aSavRedlInsPosArr; - if( DOC_MOVEREDLINES & eMvFlags && !m_rSwdoc.GetRedlineTbl().empty() ) + if( DOC_MOVEREDLINES & eMvFlags && !m_rSwdoc.getIDocumentRedlineAccess().GetRedlineTbl().empty() ) { lcl_SaveRedlines( rRange, aSaveRedl ); // Find all RedLines that end at the InsPos. // These have to be moved back to the "old" position after the Move. - sal_uInt16 nRedlPos = m_rSwdoc.GetRedlinePos( rPos.GetNode(), USHRT_MAX ); + sal_uInt16 nRedlPos = m_rSwdoc.getIDocumentRedlineAccess().GetRedlinePos( rPos.GetNode(), USHRT_MAX ); if( USHRT_MAX != nRedlPos ) { const SwPosition *pRStt, *pREnd; do { - SwRangeRedline* pTmp = m_rSwdoc.GetRedlineTbl()[ nRedlPos ]; + SwRangeRedline* pTmp = m_rSwdoc.getIDocumentRedlineAccess().GetRedlineTbl()[ nRedlPos ]; pRStt = pTmp->Start(); pREnd = pTmp->End(); if( pREnd->nNode == rPos && pRStt->nNode < rPos ) { aSavRedlInsPosArr.push_back( pTmp ); } - } while( pRStt->nNode < rPos && ++nRedlPos < m_rSwdoc.GetRedlineTbl().size()); + } while( pRStt->nNode < rPos && ++nRedlPos < m_rSwdoc.getIDocumentRedlineAccess().GetRedlineTbl().size()); } } @@ -2221,7 +2222,7 @@ bool DocumentContentOperationsManager::MoveNodeRange( SwNodeRange& rRange, SwNod for( sal_uInt16 n = 0; n < aSavRedlInsPosArr.size(); ++n ) { SwRangeRedline* pTmp = aSavRedlInsPosArr[ n ]; - if( m_rSwdoc.GetRedlineTbl().Contains( pTmp ) ) + if( m_rSwdoc.getIDocumentRedlineAccess().GetRedlineTbl().Contains( pTmp ) ) { SwPosition* pEnd = pTmp->End(); pEnd->nNode = aIdx; @@ -2370,17 +2371,17 @@ bool DocumentContentOperationsManager::Overwrite( const SwPaM &rRg, const OUStri } if (!m_rSwdoc.GetIDocumentUndoRedo().DoesUndo() && - !m_rSwdoc.IsIgnoreRedline() && !m_rSwdoc.GetRedlineTbl().empty()) + !m_rSwdoc.getIDocumentRedlineAccess().IsIgnoreRedline() && !m_rSwdoc.getIDocumentRedlineAccess().GetRedlineTbl().empty()) { SwPaM aPam( rPt.nNode, nStart, rPt.nNode, rPt.nContent.GetIndex() ); - m_rSwdoc.DeleteRedline( aPam, true, USHRT_MAX ); + m_rSwdoc.getIDocumentRedlineAccess().DeleteRedline( aPam, true, USHRT_MAX ); } - else if( m_rSwdoc.IsRedlineOn() ) + else if( m_rSwdoc.getIDocumentRedlineAccess().IsRedlineOn() ) { // FIXME: this redline is WRONG: there is no DELETE, and the skipped // characters are also included in aPam SwPaM aPam( rPt.nNode, nStart, rPt.nNode, rPt.nContent.GetIndex() ); - m_rSwdoc.AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); + m_rSwdoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); } m_rSwdoc.SetModified(); @@ -2464,18 +2465,18 @@ bool DocumentContentOperationsManager::InsertString( const SwPaM &rRg, const OUS } // To-Do - add 'SwExtraRedlineTbl' also ? - if( m_rSwdoc.IsRedlineOn() || (!m_rSwdoc.IsIgnoreRedline() && !m_rSwdoc.GetRedlineTbl().empty() )) + if( m_rSwdoc.getIDocumentRedlineAccess().IsRedlineOn() || (!m_rSwdoc.getIDocumentRedlineAccess().IsIgnoreRedline() && !m_rSwdoc.getIDocumentRedlineAccess().GetRedlineTbl().empty() )) { SwPaM aPam( rPos.nNode, aTmp.GetCntnt(), rPos.nNode, rPos.nContent.GetIndex()); - if( m_rSwdoc.IsRedlineOn() ) + if( m_rSwdoc.getIDocumentRedlineAccess().IsRedlineOn() ) { - m_rSwdoc.AppendRedline( + m_rSwdoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); } else { - m_rSwdoc.SplitRedline( aPam ); + m_rSwdoc.getIDocumentRedlineAccess().SplitRedline( aPam ); } } @@ -2887,15 +2888,15 @@ bool DocumentContentOperationsManager::SplitNode( const SwPosition &rPos, bool b pCntntStore->Restore( &m_rSwdoc, rPos.nNode.GetIndex()-1, 0, true ); // To-Do - add 'SwExtraRedlineTbl' also ? - if( m_rSwdoc.IsRedlineOn() || (!m_rSwdoc.IsIgnoreRedline() && !m_rSwdoc.GetRedlineTbl().empty() )) + if( m_rSwdoc.getIDocumentRedlineAccess().IsRedlineOn() || (!m_rSwdoc.getIDocumentRedlineAccess().IsIgnoreRedline() && !m_rSwdoc.getIDocumentRedlineAccess().GetRedlineTbl().empty() )) { SwPaM aPam( rPos ); aPam.SetMark(); aPam.Move( fnMoveBackward ); - if( m_rSwdoc.IsRedlineOn() ) - m_rSwdoc.AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); + if( m_rSwdoc.getIDocumentRedlineAccess().IsRedlineOn() ) + m_rSwdoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); else - m_rSwdoc.SplitRedline( aPam ); + m_rSwdoc.getIDocumentRedlineAccess().SplitRedline( aPam ); } } @@ -2926,15 +2927,15 @@ bool DocumentContentOperationsManager::AppendTxtNode( SwPosition& rPos ) } // To-Do - add 'SwExtraRedlineTbl' also ? - if( m_rSwdoc.IsRedlineOn() || (!m_rSwdoc.IsIgnoreRedline() && !m_rSwdoc.GetRedlineTbl().empty() )) + if( m_rSwdoc.getIDocumentRedlineAccess().IsRedlineOn() || (!m_rSwdoc.getIDocumentRedlineAccess().IsIgnoreRedline() && !m_rSwdoc.getIDocumentRedlineAccess().GetRedlineTbl().empty() )) { SwPaM aPam( rPos ); aPam.SetMark(); aPam.Move( fnMoveBackward ); - if( m_rSwdoc.IsRedlineOn() ) - m_rSwdoc.AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); + if( m_rSwdoc.getIDocumentRedlineAccess().IsRedlineOn() ) + m_rSwdoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); else - m_rSwdoc.SplitRedline( aPam ); + m_rSwdoc.getIDocumentRedlineAccess().SplitRedline( aPam ); } m_rSwdoc.SetModified(); @@ -2997,7 +2998,7 @@ bool DocumentContentOperationsManager::ReplaceRange( SwPaM& rPam, const OUString rStart.nContent = *iter + 1; if (rEnd.nContent != rStart.nContent) // check if part is empty { - bRet &= (m_rSwdoc.IsRedlineOn()) + bRet &= (m_rSwdoc.getIDocumentRedlineAccess().IsRedlineOn()) ? DeleteAndJoinWithRedlineImpl(aPam) : DeleteAndJoinImpl(aPam, false); } @@ -3159,7 +3160,7 @@ void DocumentContentOperationsManager::CopyWithFlyInFly( aCpyTmp ); } - if( bDelRedlines && ( nsRedlineMode_t::REDLINE_DELETE_REDLINES & pDest->GetRedlineMode() )) + if( bDelRedlines && ( nsRedlineMode_t::REDLINE_DELETE_REDLINES & pDest->getIDocumentRedlineAccess().GetRedlineMode() )) lcl_DeleteRedlines( rRg, aCpyRange ); pDest->GetNodes()._DelDummyNodes( aCpyRange ); @@ -3194,7 +3195,7 @@ void DocumentContentOperationsManager::CopyFlyInFlyImpl( (pAnchor->GetAnchorId() == FLY_AT_CHAR)) && (( bCopyFlyAtFly && FLY_AT_FLY == pAnchor->GetAnchorId() ) ? rRg.aStart <= pAPos->nNode.GetIndex() + 1 - : ( m_rSwdoc.IsRedlineMove() + : ( m_rSwdoc.getIDocumentRedlineAccess().IsRedlineMove() ? rRg.aStart < pAPos->nNode : rRg.aStart <= pAPos->nNode )) && pAPos->nNode <= rRg.aEnd ) @@ -3207,7 +3208,7 @@ void DocumentContentOperationsManager::CopyFlyInFlyImpl( bool bAdd = false; if( pAPos->nNode < rRg.aEnd ) bAdd = true; - if (!bAdd && !m_rSwdoc.IsRedlineMove()) // fdo#40599: not for redline move + if (!bAdd && !m_rSwdoc.getIDocumentRedlineAccess().IsRedlineMove()) // fdo#40599: not for redline move { bool bEmptyNode = false; bool bLastNode = false; @@ -3453,19 +3454,19 @@ DocumentContentOperationsManager::~DocumentContentOperationsManager() bool DocumentContentOperationsManager::DeleteAndJoinWithRedlineImpl( SwPaM & rPam, const bool ) { - OSL_ENSURE( m_rSwdoc.IsRedlineOn(), "DeleteAndJoinWithRedline: redline off" ); + OSL_ENSURE( m_rSwdoc.getIDocumentRedlineAccess().IsRedlineOn(), "DeleteAndJoinWithRedline: redline off" ); { SwUndoRedlineDelete* pUndo = 0; - RedlineMode_t eOld = m_rSwdoc.GetRedlineMode(); - m_rSwdoc.checkRedlining( eOld ); + RedlineMode_t eOld = m_rSwdoc.getIDocumentRedlineAccess().GetRedlineMode(); + m_rSwdoc.GetDocumentRedlineManager().checkRedlining( eOld ); if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) { /* please don't translate -- for cultural reasons this comment is protected until the redline implementation is finally fixed some day */ //JP 06.01.98: MUSS noch optimiert werden!!! - m_rSwdoc.SetRedlineMode( + m_rSwdoc.getIDocumentRedlineAccess().SetRedlineMode( (RedlineMode_t) ( nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE ) ); m_rSwdoc.GetIDocumentUndoRedo().StartUndo( UNDO_DELETE, NULL ); @@ -3474,7 +3475,7 @@ bool DocumentContentOperationsManager::DeleteAndJoinWithRedlineImpl( SwPaM & rPa } if ( *rPam.GetPoint() != *rPam.GetMark() ) - m_rSwdoc.AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_DELETE, rPam ), true ); + m_rSwdoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_DELETE, rPam ), true ); m_rSwdoc.SetModified(); if ( pUndo ) @@ -3501,7 +3502,7 @@ bool DocumentContentOperationsManager::DeleteAndJoinWithRedlineImpl( SwPaM & rPa } } //JP 06.01.98: MUSS noch optimiert werden!!! - m_rSwdoc.SetRedlineMode( eOld ); + m_rSwdoc.getIDocumentRedlineAccess().SetRedlineMode( eOld ); } return true; } @@ -3618,8 +3619,8 @@ bool DocumentContentOperationsManager::DeleteRangeImplImpl(SwPaM & rPam) return true; } - if( !m_rSwdoc.IsIgnoreRedline() && !m_rSwdoc.GetRedlineTbl().empty() ) - m_rSwdoc.DeleteRedline( rPam, true, USHRT_MAX ); + if( !m_rSwdoc.getIDocumentRedlineAccess().IsIgnoreRedline() && !m_rSwdoc.getIDocumentRedlineAccess().GetRedlineTbl().empty() ) + m_rSwdoc.getIDocumentRedlineAccess().DeleteRedline( rPam, true, USHRT_MAX ); // Delete and move all "Flys at the paragraph", which are within the Selection DelFlyInRange(rPam.GetMark()->nNode, rPam.GetPoint()->nNode); @@ -3721,8 +3722,8 @@ bool DocumentContentOperationsManager::DeleteRangeImplImpl(SwPaM & rPam) } while( false ); - if( !m_rSwdoc.IsIgnoreRedline() && !m_rSwdoc.GetRedlineTbl().empty() ) - m_rSwdoc.CompressRedlines(); + if( !m_rSwdoc.getIDocumentRedlineAccess().IsIgnoreRedline() && !m_rSwdoc.getIDocumentRedlineAccess().GetRedlineTbl().empty() ) + m_rSwdoc.getIDocumentRedlineAccess().CompressRedlines(); m_rSwdoc.SetModified(); return true; @@ -3763,10 +3764,10 @@ bool DocumentContentOperationsManager::ReplaceRangeImpl( SwPaM& rPam, const OUSt SwDataChanged aTmp( aDelPam ); - if( m_rSwdoc.IsRedlineOn() ) + if( m_rSwdoc.getIDocumentRedlineAccess().IsRedlineOn() ) { - RedlineMode_t eOld = m_rSwdoc.GetRedlineMode(); - m_rSwdoc.checkRedlining(eOld); + RedlineMode_t eOld = m_rSwdoc.getIDocumentRedlineAccess().GetRedlineMode(); + m_rSwdoc.GetDocumentRedlineManager().checkRedlining(eOld); if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) { m_rSwdoc.GetIDocumentUndoRedo().StartUndo(UNDO_EMPTY, NULL); @@ -3775,7 +3776,7 @@ bool DocumentContentOperationsManager::ReplaceRangeImpl( SwPaM& rPam, const OUSt const ::sw::mark::IMark* pBkmk = m_rSwdoc.getIDocumentMarkAccess()->makeMark( aDelPam, OUString(), IDocumentMarkAccess::UNO_BOOKMARK ); //JP 06.01.98: MUSS noch optimiert werden!!! - m_rSwdoc.SetRedlineMode( + m_rSwdoc.getIDocumentRedlineAccess().SetRedlineMode( (RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE )); *aDelPam.GetPoint() = pBkmk->GetMarkPos(); @@ -3855,7 +3856,7 @@ bool DocumentContentOperationsManager::ReplaceRangeImpl( SwPaM& rPam, const OUSt new SwUndoRedlineDelete( aDelPam, UNDO_REPLACE ); m_rSwdoc.GetIDocumentUndoRedo().AppendUndo(pUndoRD); } - m_rSwdoc.AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_DELETE, aDelPam ), true); + m_rSwdoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_DELETE, aDelPam ), true); *rPam.GetMark() = *aDelPam.GetMark(); if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) @@ -3873,7 +3874,7 @@ bool DocumentContentOperationsManager::ReplaceRangeImpl( SwPaM& rPam, const OUSt rPam.GetPoint()->nContent = rIdx; *rPam.GetMark() = *rPam.GetPoint(); //JP 06.01.98: MUSS noch optimiert werden!!! - m_rSwdoc.SetRedlineMode( eOld ); + m_rSwdoc.getIDocumentRedlineAccess().SetRedlineMode( eOld ); *rPam.GetPoint() = pBkmk->GetMarkPos(); if(pBkmk->IsExpanded()) @@ -3884,8 +3885,8 @@ bool DocumentContentOperationsManager::ReplaceRangeImpl( SwPaM& rPam, const OUSt } else { - if( !m_rSwdoc.IsIgnoreRedline() && m_rSwdoc.GetRedlineTbl().size() ) - m_rSwdoc.DeleteRedline( aDelPam, true, USHRT_MAX ); + if( !m_rSwdoc.getIDocumentRedlineAccess().IsIgnoreRedline() && m_rSwdoc.getIDocumentRedlineAccess().GetRedlineTbl().size() ) + m_rSwdoc.getIDocumentRedlineAccess().DeleteRedline( aDelPam, true, USHRT_MAX ); SwUndoReplace* pUndoRpl = 0; bool const bDoesUndo = m_rSwdoc.GetIDocumentUndoRedo().DoesUndo(); @@ -4018,8 +4019,8 @@ bool DocumentContentOperationsManager::CopyImpl( SwPaM& rPam, SwPosition& rPos, pDoc->GetIDocumentUndoRedo().AppendUndo( pUndo ); } - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); // Move the PaM one node back from the insert position, so that // the position doesn't get moved @@ -4448,7 +4449,7 @@ bool DocumentContentOperationsManager::CopyImpl( SwPaM& rPam, SwPosition& rPos, aListIdToPropagate, true, true ); } - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); pDoc->SetModified(); return true; diff --git a/sw/source/core/doc/DocumentRedlineManager.cxx b/sw/source/core/doc/DocumentRedlineManager.cxx new file mode 100644 index 000000000000..983df66760b1 --- /dev/null +++ b/sw/source/core/doc/DocumentRedlineManager.cxx @@ -0,0 +1,2676 @@ + +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +*/ +#include <DocumentRedlineManager.hxx> +#include <doc.hxx> +#include <IDocumentUndoRedo.hxx> +#include <redline.hxx> +#include <UndoRedline.hxx> +#include <docary.hxx> +#include <ndtxt.hxx> +#include <comcore.hrc> +#include <swmodule.hxx> +#include <editsh.hxx> +#include <vcl/layout.hxx> + +using namespace com::sun::star; + +#ifdef DBG_UTIL + + #define _ERROR_PREFIX "redline table corrupted: " + + namespace + { + // helper function for lcl_CheckRedline + // 1. make sure that pPos->nContent points into pPos->nNode + // (or into the 'special' no-content-node-IndexReg) + // 2. check that position is valid and doesn't point behind text + static void lcl_CheckPosition( const SwPosition* pPos ) + { + SwPosition aComparePos( *pPos ); + aComparePos.nContent.Assign( + aComparePos.nNode.GetNode().GetCntntNode(), 0 ); + OSL_ENSURE( pPos->nContent.GetIdxReg() == + aComparePos.nContent.GetIdxReg(), + _ERROR_PREFIX "illegal position" ); + + SwTxtNode* pTxtNode = pPos->nNode.GetNode().GetTxtNode(); + if( pTxtNode == NULL ) + { + OSL_ENSURE( pPos->nContent == 0, + _ERROR_PREFIX "non-text-node with content" ); + } + else + { + OSL_ENSURE( pPos->nContent >= 0 && + pPos->nContent <= pTxtNode->Len(), + _ERROR_PREFIX "index behind text" ); + } + } + + static void lcl_CheckPam( const SwPaM* pPam ) + { + OSL_ENSURE( pPam != NULL, _ERROR_PREFIX "illegal argument" ); + lcl_CheckPosition( pPam->GetPoint() ); + lcl_CheckPosition( pPam->GetMark() ); + } + + // check validity of the redline table. Checks redline bounds, and make + // sure the redlines are sorted and non-overlapping. + static void lcl_CheckRedline( IDocumentRedlineAccess& redlineAccess ) + { + const SwRedlineTbl& rTbl = redlineAccess.GetRedlineTbl(); + + // verify valid redline positions + for( sal_uInt16 i = 0; i < rTbl.size(); ++i ) + lcl_CheckPam( rTbl[ i ] ); + + for( sal_uInt16 j = 0; j < rTbl.size(); ++j ) + { + // check for empty redlines + OSL_ENSURE( ( *(rTbl[j]->GetPoint()) != *(rTbl[j]->GetMark()) ) || + ( rTbl[j]->GetContentIdx() != NULL ), + _ERROR_PREFIX "empty redline" ); + } + + // verify proper redline sorting + for( sal_uInt16 n = 1; n < rTbl.size(); ++n ) + { + const SwRangeRedline* pPrev = rTbl[ n-1 ]; + const SwRangeRedline* pCurrent = rTbl[ n ]; + + // check redline sorting + SAL_WARN_IF( *pPrev->Start() > *pCurrent->Start(), "sw", + _ERROR_PREFIX "not sorted correctly" ); + + // check for overlapping redlines + SAL_WARN_IF( *pPrev->End() > *pCurrent->Start(), "sw", + _ERROR_PREFIX "overlapping redlines" ); + } + } + } + + #define _CHECK_REDLINE( pDoc ) lcl_CheckRedline( pDoc ); + +#else + + #define _CHECK_REDLINE( pDoc ) + +#endif + +namespace +{ + static inline bool IsPrevPos( const SwPosition rPos1, const SwPosition rPos2 ) + { + const SwCntntNode* pCNd; + return 0 == rPos2.nContent.GetIndex() && + rPos2.nNode.GetIndex() - 1 == rPos1.nNode.GetIndex() && + 0 != ( pCNd = rPos1.nNode.GetNode().GetCntntNode() ) && + rPos1.nContent.GetIndex() == pCNd->Len(); + } + + static bool lcl_AcceptRedline( SwRedlineTbl& rArr, sal_uInt16& rPos, + bool bCallDelete, + const SwPosition* pSttRng = 0, + const SwPosition* pEndRng = 0 ) + { + bool bRet = true; + SwRangeRedline* pRedl = rArr[ rPos ]; + SwPosition *pRStt = 0, *pREnd = 0; + SwComparePosition eCmp = POS_OUTSIDE; + if( pSttRng && pEndRng ) + { + pRStt = pRedl->Start(); + pREnd = pRedl->End(); + eCmp = ComparePosition( *pSttRng, *pEndRng, *pRStt, *pREnd ); + } + + pRedl->InvalidateRange(); + + switch( pRedl->GetType() ) + { + case nsRedlineType_t::REDLINE_INSERT: + case nsRedlineType_t::REDLINE_FORMAT: + { + bool bCheck = false, bReplace = false; + switch( eCmp ) + { + case POS_INSIDE: + if( *pSttRng == *pRStt ) + pRedl->SetStart( *pEndRng, pRStt ); + else + { + if( *pEndRng != *pREnd ) + { + // split up + SwRangeRedline* pNew = new SwRangeRedline( *pRedl ); + pNew->SetStart( *pEndRng ); + rArr.Insert( pNew ); ++rPos; + } + pRedl->SetEnd( *pSttRng, pREnd ); + bCheck = true; + } + break; + + case POS_OVERLAP_BEFORE: + pRedl->SetStart( *pEndRng, pRStt ); + bReplace = true; + break; + + case POS_OVERLAP_BEHIND: + pRedl->SetEnd( *pSttRng, pREnd ); + bCheck = true; + break; + + case POS_OUTSIDE: + case POS_EQUAL: + rArr.DeleteAndDestroy( rPos-- ); + break; + + default: + bRet = false; + } + + if( bReplace || ( bCheck && !pRedl->HasValidRange() )) + { + // re-insert + rArr.Remove( pRedl ); + rArr.Insert( pRedl ); + } + } + break; + case nsRedlineType_t::REDLINE_DELETE: + { + SwDoc& rDoc = *pRedl->GetDoc(); + const SwPosition *pDelStt = 0, *pDelEnd = 0; + bool bDelRedl = false; + switch( eCmp ) + { + case POS_INSIDE: + if( bCallDelete ) + { + pDelStt = pSttRng; + pDelEnd = pEndRng; + } + break; + + case POS_OVERLAP_BEFORE: + if( bCallDelete ) + { + pDelStt = pRStt; + pDelEnd = pEndRng; + } + break; + case POS_OVERLAP_BEHIND: + if( bCallDelete ) + { + pDelStt = pREnd; + pDelEnd = pSttRng; + } + break; + + case POS_OUTSIDE: + case POS_EQUAL: + { + rArr.Remove( rPos-- ); + bDelRedl = true; + if( bCallDelete ) + { + pDelStt = pRedl->Start(); + pDelEnd = pRedl->End(); + } + } + break; + default: + bRet = false; + } + + if( pDelStt && pDelEnd ) + { + SwPaM aPam( *pDelStt, *pDelEnd ); + SwCntntNode* pCSttNd = pDelStt->nNode.GetNode().GetCntntNode(); + SwCntntNode* pCEndNd = pDelEnd->nNode.GetNode().GetCntntNode(); + + if( bDelRedl ) + delete pRedl; + + RedlineMode_t eOld = rDoc.getIDocumentRedlineAccess().GetRedlineMode(); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE))); + + if( pCSttNd && pCEndNd ) + rDoc.getIDocumentContentOperations().DeleteAndJoin( aPam ); + else + { + rDoc.getIDocumentContentOperations().DeleteRange( aPam ); + + if( pCSttNd && !pCEndNd ) + { + aPam.GetBound( true ).nContent.Assign( 0, 0 ); + aPam.GetBound( false ).nContent.Assign( 0, 0 ); + aPam.DeleteMark(); + rDoc.getIDocumentContentOperations().DelFullPara( aPam ); + } + } + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); + } + else if( bDelRedl ) + delete pRedl; + } + break; + + case nsRedlineType_t::REDLINE_FMTCOLL: + rArr.DeleteAndDestroy( rPos-- ); + break; + + default: + bRet = false; + } + return bRet; + } + + static bool lcl_RejectRedline( SwRedlineTbl& rArr, sal_uInt16& rPos, + bool bCallDelete, + const SwPosition* pSttRng = 0, + const SwPosition* pEndRng = 0 ) + { + bool bRet = true; + SwRangeRedline* pRedl = rArr[ rPos ]; + SwPosition *pRStt = 0, *pREnd = 0; + SwComparePosition eCmp = POS_OUTSIDE; + if( pSttRng && pEndRng ) + { + pRStt = pRedl->Start(); + pREnd = pRedl->End(); + eCmp = ComparePosition( *pSttRng, *pEndRng, *pRStt, *pREnd ); + } + + pRedl->InvalidateRange(); + + switch( pRedl->GetType() ) + { + case nsRedlineType_t::REDLINE_INSERT: + { + SwDoc& rDoc = *pRedl->GetDoc(); + const SwPosition *pDelStt = 0, *pDelEnd = 0; + bool bDelRedl = false; + switch( eCmp ) + { + case POS_INSIDE: + if( bCallDelete ) + { + pDelStt = pSttRng; + pDelEnd = pEndRng; + } + break; + + case POS_OVERLAP_BEFORE: + if( bCallDelete ) + { + pDelStt = pRStt; + pDelEnd = pEndRng; + } + break; + case POS_OVERLAP_BEHIND: + if( bCallDelete ) + { + pDelStt = pREnd; + pDelEnd = pSttRng; + } + break; + case POS_OUTSIDE: + case POS_EQUAL: + { + // delete the range again + rArr.Remove( rPos-- ); + bDelRedl = true; + if( bCallDelete ) + { + pDelStt = pRedl->Start(); + pDelEnd = pRedl->End(); + } + } + break; + + default: + bRet = false; + } + if( pDelStt && pDelEnd ) + { + SwPaM aPam( *pDelStt, *pDelEnd ); + + SwCntntNode* pCSttNd = pDelStt->nNode.GetNode().GetCntntNode(); + SwCntntNode* pCEndNd = pDelEnd->nNode.GetNode().GetCntntNode(); + + if( bDelRedl ) + delete pRedl; + + RedlineMode_t eOld = rDoc.getIDocumentRedlineAccess().GetRedlineMode(); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE))); + + if( pCSttNd && pCEndNd ) + rDoc.getIDocumentContentOperations().DeleteAndJoin( aPam ); + else + { + rDoc.getIDocumentContentOperations().DeleteRange( aPam ); + + if( pCSttNd && !pCEndNd ) + { + aPam.GetBound( true ).nContent.Assign( 0, 0 ); + aPam.GetBound( false ).nContent.Assign( 0, 0 ); + aPam.DeleteMark(); + rDoc.getIDocumentContentOperations().DelFullPara( aPam ); + } + } + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); + } + else if( bDelRedl ) + delete pRedl; + } + break; + case nsRedlineType_t::REDLINE_DELETE: + { + SwRangeRedline* pNew = 0; + bool bCheck = false, bReplace = false; + + switch( eCmp ) + { + case POS_INSIDE: + { + if( 1 < pRedl->GetStackCount() ) + { + pNew = new SwRangeRedline( *pRedl ); + pNew->PopData(); + } + if( *pSttRng == *pRStt ) + { + pRedl->SetStart( *pEndRng, pRStt ); + bReplace = true; + if( pNew ) + pNew->SetEnd( *pEndRng ); + } + else + { + if( *pEndRng != *pREnd ) + { + // split up + SwRangeRedline* pCpy = new SwRangeRedline( *pRedl ); + pCpy->SetStart( *pEndRng ); + rArr.Insert( pCpy ); ++rPos; + if( pNew ) + pNew->SetEnd( *pEndRng ); + } + + pRedl->SetEnd( *pSttRng, pREnd ); + bCheck = true; + if( pNew ) + pNew->SetStart( *pSttRng ); + } + } + break; + + case POS_OVERLAP_BEFORE: + if( 1 < pRedl->GetStackCount() ) + { + pNew = new SwRangeRedline( *pRedl ); + pNew->PopData(); + } + pRedl->SetStart( *pEndRng, pRStt ); + bReplace = true; + if( pNew ) + pNew->SetEnd( *pEndRng ); + break; + + case POS_OVERLAP_BEHIND: + if( 1 < pRedl->GetStackCount() ) + { + pNew = new SwRangeRedline( *pRedl ); + pNew->PopData(); + } + pRedl->SetEnd( *pSttRng, pREnd ); + bCheck = true; + if( pNew ) + pNew->SetStart( *pSttRng ); + break; + + case POS_OUTSIDE: + case POS_EQUAL: + if( !pRedl->PopData() ) + // deleting the RedlineObject is enough + rArr.DeleteAndDestroy( rPos-- ); + break; + + default: + bRet = false; + } + + if( pNew ) + { + rArr.Insert( pNew ); ++rPos; + } + + if( bReplace || ( bCheck && !pRedl->HasValidRange() )) + { + // re-insert + rArr.Remove( pRedl ); + rArr.Insert( pRedl ); + } + } + break; + + case nsRedlineType_t::REDLINE_FORMAT: + case nsRedlineType_t::REDLINE_FMTCOLL: + { + if( pRedl->GetExtraData() ) + pRedl->GetExtraData()->Reject( *pRedl ); + rArr.DeleteAndDestroy( rPos-- ); + } + break; + + default: + bRet = false; + } + return bRet; + } + + typedef bool (*Fn_AcceptReject)( SwRedlineTbl& rArr, sal_uInt16& rPos, + bool bCallDelete, + const SwPosition* pSttRng, + const SwPosition* pEndRng); + + + static int lcl_AcceptRejectRedl( Fn_AcceptReject fn_AcceptReject, + SwRedlineTbl& rArr, bool bCallDelete, + const SwPaM& rPam) + { + sal_uInt16 n = 0; + int nCount = 0; + + const SwPosition* pStt = rPam.Start(), + * pEnd = pStt == rPam.GetPoint() ? rPam.GetMark() + : rPam.GetPoint(); + const SwRangeRedline* pFnd = rArr.FindAtPosition( *pStt, n, true ); + if( pFnd && // Is new a part of it? + ( *pFnd->Start() != *pStt || *pFnd->End() > *pEnd )) + { + // Only revoke the partial selection + if( (*fn_AcceptReject)( rArr, n, bCallDelete, pStt, pEnd )) + nCount++; + ++n; + } + + for( ; n < rArr.size(); ++n ) + { + SwRangeRedline* pTmp = rArr[ n ]; + if( pTmp->HasMark() && pTmp->IsVisible() ) + { + if( *pTmp->End() <= *pEnd ) + { + if( (*fn_AcceptReject)( rArr, n, bCallDelete, 0, 0 )) + nCount++; + } + else + { + if( *pTmp->Start() < *pEnd ) + { + // Only revoke the partial selection + if( (*fn_AcceptReject)( rArr, n, bCallDelete, pStt, pEnd )) + nCount++; + } + break; + } + } + } + return nCount; + } + + static void lcl_AdjustRedlineRange( SwPaM& rPam ) + { + // The Selection is only in the ContentSection. If there are Redlines + // to Non-ContentNodes before or after that, then the Selections + // expand to them. + SwPosition* pStt = rPam.Start(), + * pEnd = pStt == rPam.GetPoint() ? rPam.GetMark() + : rPam.GetPoint(); + SwDoc* pDoc = rPam.GetDoc(); + if( !pStt->nContent.GetIndex() && + !pDoc->GetNodes()[ pStt->nNode.GetIndex() - 1 ]->IsCntntNode() ) + { + const SwRangeRedline* pRedl = pDoc->getIDocumentRedlineAccess().GetRedline( *pStt, 0 ); + if( pRedl ) + { + const SwPosition* pRStt = pRedl->Start(); + if( !pRStt->nContent.GetIndex() && pRStt->nNode.GetIndex() == + pStt->nNode.GetIndex() - 1 ) + *pStt = *pRStt; + } + } + if( pEnd->nNode.GetNode().IsCntntNode() && + !pDoc->GetNodes()[ pEnd->nNode.GetIndex() + 1 ]->IsCntntNode() && + pEnd->nContent.GetIndex() == pEnd->nNode.GetNode().GetCntntNode()->Len() ) + { + const SwRangeRedline* pRedl = pDoc->getIDocumentRedlineAccess().GetRedline( *pEnd, 0 ); + if( pRedl ) + { + const SwPosition* pREnd = pRedl->End(); + if( !pREnd->nContent.GetIndex() && pREnd->nNode.GetIndex() == + pEnd->nNode.GetIndex() + 1 ) + *pEnd = *pREnd; + } + } + } +} + +namespace sw +{ + +DocumentRedlineManager::DocumentRedlineManager( SwDoc& i_rSwdoc ) : m_rSwdoc( i_rSwdoc ), + meRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)), + mpRedlineTbl( new SwRedlineTbl ), + mpExtraRedlineTbl ( new SwExtraRedlineTbl ), + mpAutoFmtRedlnComment( 0 ), + mbIsRedlineMove(false), + mbReadlineChecked(false), + mnAutoFmtRedlnCommentNo( 0 ) +{ +} + +RedlineMode_t DocumentRedlineManager::GetRedlineMode() const +{ + return meRedlineMode; +} + +void DocumentRedlineManager::SetRedlineMode( RedlineMode_t eMode ) +{ + if( meRedlineMode != eMode ) + { + if( (nsRedlineMode_t::REDLINE_SHOW_MASK & meRedlineMode) != (nsRedlineMode_t::REDLINE_SHOW_MASK & eMode) + || 0 == (nsRedlineMode_t::REDLINE_SHOW_MASK & eMode) ) + { + bool bSaveInXMLImportFlag = m_rSwdoc.IsInXMLImport(); + m_rSwdoc.SetInXMLImport( false ); + // and then hide/display everything + void (SwRangeRedline::*pFnc)( sal_uInt16 ) = 0; + + switch( nsRedlineMode_t::REDLINE_SHOW_MASK & eMode ) + { + case nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE : + pFnc = &SwRangeRedline::Show; + break; + case nsRedlineMode_t::REDLINE_SHOW_INSERT: + pFnc = &SwRangeRedline::Hide; + break; + case nsRedlineMode_t::REDLINE_SHOW_DELETE: + pFnc = &SwRangeRedline::ShowOriginal; + break; + + default: + pFnc = &SwRangeRedline::Hide; + eMode = (RedlineMode_t)(eMode | nsRedlineMode_t::REDLINE_SHOW_INSERT); + break; + } + + _CHECK_REDLINE( *this ) + + if( pFnc ) + for( sal_uInt16 nLoop = 1; nLoop <= 2; ++nLoop ) + for( sal_uInt16 i = 0; i < mpRedlineTbl->size(); ++i ) + ((*mpRedlineTbl)[ i ]->*pFnc)( nLoop ); + _CHECK_REDLINE( *this ) + m_rSwdoc.SetInXMLImport( bSaveInXMLImportFlag ); + } + meRedlineMode = eMode; + m_rSwdoc.SetModified(); + } + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +bool DocumentRedlineManager::IsRedlineOn() const +{ + return IDocumentRedlineAccess::IsRedlineOn(meRedlineMode); +} + +bool DocumentRedlineManager::IsIgnoreRedline() const +{ + return (nsRedlineMode_t::REDLINE_IGNORE & meRedlineMode); +} + +void DocumentRedlineManager::SetRedlineMode_intern(RedlineMode_t eMode) +{ + meRedlineMode = eMode; +} + +const SwRedlineTbl& DocumentRedlineManager::GetRedlineTbl() const +{ + return *mpRedlineTbl; +} + +SwRedlineTbl& DocumentRedlineManager::GetRedlineTbl() +{ + return *mpRedlineTbl; +} + +const SwExtraRedlineTbl& DocumentRedlineManager::GetExtraRedlineTbl() const +{ + return *mpExtraRedlineTbl; +} + +SwExtraRedlineTbl& DocumentRedlineManager::GetExtraRedlineTbl() +{ + return *mpExtraRedlineTbl; +} + +bool DocumentRedlineManager::HasExtraRedlineTbl() const +{ + return mpExtraRedlineTbl ? true : false; +} + +bool DocumentRedlineManager::IsInRedlines(const SwNode & rNode) const +{ + SwPosition aPos(rNode); + SwNode & rEndOfRedlines = m_rSwdoc.GetNodes().GetEndOfRedlines(); + SwPaM aPam(SwPosition(*rEndOfRedlines.StartOfSectionNode()), + SwPosition(rEndOfRedlines)); + + return aPam.ContainsPosition(aPos); +} + +bool DocumentRedlineManager::IsRedlineMove() const +{ + return mbIsRedlineMove; +} + +void DocumentRedlineManager::SetRedlineMove(bool bFlag) +{ + mbIsRedlineMove = bFlag; +} + +/* +Text means Text not "polluted" by Redlines. + +Behaviour of Insert-Redline: + - in the Text - insert Redline Object + - in InsertRedline (own) - ignore, existing is extended + - in InsertRedline (others) - split up InsertRedline and + insert Redline Object + - in DeleteRedline - split up DeleteRedline or + move at the end/beginning + +Behaviour of Delete-Redline: + - in the Text - insert Redline Object + - in DeleteRedline (own/others) - ignore + - in InsertRedline (own) - ignore, but delete character + - in InsertRedline (others) - split up InsertRedline and + insert Redline Object + - Text and own Insert overlap - delete Text in the own Insert, + extend in the other Text + (up to the Insert!) + - Text and other Insert overlap - insert Redline Object, the + other Insert is overlapped by + the Delete +*/ +bool DocumentRedlineManager::AppendRedline( SwRangeRedline* pNewRedl, bool bCallDelete ) +{ + bool bMerged = false; + _CHECK_REDLINE( *this ) + + if (IsRedlineOn() && !IsShowOriginal(meRedlineMode)) + { + pNewRedl->InvalidateRange(); + + if( m_rSwdoc.IsAutoFmtRedline() ) + { + pNewRedl->SetAutoFmtFlag(); + if( mpAutoFmtRedlnComment && !mpAutoFmtRedlnComment->isEmpty() ) + { + pNewRedl->SetComment( *mpAutoFmtRedlnComment ); + pNewRedl->SetSeqNo( mnAutoFmtRedlnCommentNo ); + } + } + + SwPosition* pStt = pNewRedl->Start(), + * pEnd = pStt == pNewRedl->GetPoint() ? pNewRedl->GetMark() + : pNewRedl->GetPoint(); + { + SwTxtNode* pTxtNode = pStt->nNode.GetNode().GetTxtNode(); + if( pTxtNode == NULL ) + { + if( pStt->nContent > 0 ) + { + OSL_ENSURE( false, "Redline start: non-text-node with content" ); + pStt->nContent = 0; + } + } + else + { + if( pStt->nContent > pTxtNode->Len() ) + { + OSL_ENSURE( false, "Redline start: index behind text" ); + pStt->nContent = pTxtNode->Len(); + } + } + pTxtNode = pEnd->nNode.GetNode().GetTxtNode(); + if( pTxtNode == NULL ) + { + if( pEnd->nContent > 0 ) + { + OSL_ENSURE( false, "Redline end: non-text-node with content" ); + pEnd->nContent = 0; + } + } + else + { + if( pEnd->nContent > pTxtNode->Len() ) + { + OSL_ENSURE( false, "Redline end: index behind text" ); + pEnd->nContent = pTxtNode->Len(); + } + } + } + if( ( *pStt == *pEnd ) && + ( pNewRedl->GetContentIdx() == NULL ) ) + { // Do not insert empty redlines + delete pNewRedl; + return false; + } + bool bCompress = false; + sal_uInt16 n = 0; + // look up the first Redline for the starting position + if( !GetRedline( *pStt, &n ) && n ) + --n; + bool bDec = false; + + for( ; pNewRedl && n < mpRedlineTbl->size(); bDec ? n : ++n ) + { + bDec = false; + + SwRangeRedline* pRedl = (*mpRedlineTbl)[ n ]; + SwPosition* pRStt = pRedl->Start(), + * pREnd = pRStt == pRedl->GetPoint() ? pRedl->GetMark() + : pRedl->GetPoint(); + + // #i8518# remove empty redlines while we're at it + if( ( *pRStt == *pREnd ) && + ( pRedl->GetContentIdx() == NULL ) ) + { + mpRedlineTbl->DeleteAndDestroy(n); + continue; + } + + SwComparePosition eCmpPos = ComparePosition( *pStt, *pEnd, *pRStt, *pREnd ); + + switch( pNewRedl->GetType() ) + { + case nsRedlineType_t::REDLINE_INSERT: + switch( pRedl->GetType() ) + { + case nsRedlineType_t::REDLINE_INSERT: + if( pRedl->IsOwnRedline( *pNewRedl ) ) + { + bool bDelete = false; + + // Merge if applicable? + if( (( POS_BEHIND == eCmpPos && + IsPrevPos( *pREnd, *pStt ) ) || + ( POS_COLLIDE_START == eCmpPos ) || + ( POS_OVERLAP_BEHIND == eCmpPos ) ) && + pRedl->CanCombine( *pNewRedl ) && + ( n+1 >= (sal_uInt16)mpRedlineTbl->size() || + ( *(*mpRedlineTbl)[ n+1 ]->Start() >= *pEnd && + *(*mpRedlineTbl)[ n+1 ]->Start() != *pREnd ) ) ) + { + pRedl->SetEnd( *pEnd, pREnd ); + if( !pRedl->HasValidRange() ) + { + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl ); + } + + bMerged = true; + bDelete = true; + } + else if( (( POS_BEFORE == eCmpPos && + IsPrevPos( *pEnd, *pRStt ) ) || + ( POS_COLLIDE_END == eCmpPos ) || + ( POS_OVERLAP_BEFORE == eCmpPos ) ) && + pRedl->CanCombine( *pNewRedl ) && + ( !n || + *(*mpRedlineTbl)[ n-1 ]->End() != *pRStt )) + { + pRedl->SetStart( *pStt, pRStt ); + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl ); + + bMerged = true; + bDelete = true; + } + else if ( POS_OUTSIDE == eCmpPos ) + { + // own insert-over-insert redlines: + // just scrap the inside ones + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + } + else if( POS_OVERLAP_BEHIND == eCmpPos ) + { + *pStt = *pREnd; + if( ( *pStt == *pEnd ) && + ( pNewRedl->GetContentIdx() == NULL ) ) + bDelete = true; + } + else if( POS_OVERLAP_BEFORE == eCmpPos ) + { + *pEnd = *pRStt; + if( ( *pStt == *pEnd ) && + ( pNewRedl->GetContentIdx() == NULL ) ) + bDelete = true; + } + else if( POS_INSIDE == eCmpPos || POS_EQUAL == eCmpPos) + bDelete = true; + + if( bDelete ) + { + delete pNewRedl, pNewRedl = 0; + bCompress = true; + } + } + else if( POS_INSIDE == eCmpPos ) + { + // split up + if( *pEnd != *pREnd ) + { + SwRangeRedline* pCpy = new SwRangeRedline( *pRedl ); + pCpy->SetStart( *pEnd ); + mpRedlineTbl->Insert( pCpy ); + } + pRedl->SetEnd( *pStt, pREnd ); + if( ( *pStt == *pRStt ) && + ( pRedl->GetContentIdx() == NULL ) ) + { + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + } + else if( !pRedl->HasValidRange() ) + { + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl ); + } + } + else if ( POS_OUTSIDE == eCmpPos ) + { + // handle overlapping redlines in broken documents + + // split up the new redline, since it covers the + // existing redline. Insert the first part, and + // progress with the remainder as usual + SwRangeRedline* pSplit = new SwRangeRedline( *pNewRedl ); + pSplit->SetEnd( *pRStt ); + pNewRedl->SetStart( *pREnd ); + mpRedlineTbl->Insert( pSplit ); + if( *pStt == *pEnd && pNewRedl->GetContentIdx() == NULL ) + { + delete pNewRedl; + pNewRedl = 0; + bCompress = true; + } + } + else if ( POS_OVERLAP_BEHIND == eCmpPos ) + { + // handle overlapping redlines in broken documents + pNewRedl->SetStart( *pREnd ); + } + else if ( POS_OVERLAP_BEFORE == eCmpPos ) + { + // handle overlapping redlines in broken documents + *pEnd = *pRStt; + if( ( *pStt == *pEnd ) && + ( pNewRedl->GetContentIdx() == NULL ) ) + { + delete pNewRedl; + pNewRedl = 0; + bCompress = true; + } + } + break; + case nsRedlineType_t::REDLINE_DELETE: + if( POS_INSIDE == eCmpPos ) + { + // split up + if( *pEnd != *pREnd ) + { + SwRangeRedline* pCpy = new SwRangeRedline( *pRedl ); + pCpy->SetStart( *pEnd ); + mpRedlineTbl->Insert( pCpy ); + } + pRedl->SetEnd( *pStt, pREnd ); + if( ( *pStt == *pRStt ) && + ( pRedl->GetContentIdx() == NULL ) ) + { + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + } + else if( !pRedl->HasValidRange() ) + { + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl, n ); + } + } + else if ( POS_OUTSIDE == eCmpPos ) + { + // handle overlapping redlines in broken documents + + // split up the new redline, since it covers the + // existing redline. Insert the first part, and + // progress with the remainder as usual + SwRangeRedline* pSplit = new SwRangeRedline( *pNewRedl ); + pSplit->SetEnd( *pRStt ); + pNewRedl->SetStart( *pREnd ); + mpRedlineTbl->Insert( pSplit ); + if( *pStt == *pEnd && pNewRedl->GetContentIdx() == NULL ) + { + delete pNewRedl; + pNewRedl = 0; + bCompress = true; + } + } + else if ( POS_EQUAL == eCmpPos ) + { + // handle identical redlines in broken documents + // delete old (delete) redline + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + } + else if ( POS_OVERLAP_BEHIND == eCmpPos ) + { // Another workaround for broken redlines + pNewRedl->SetStart( *pREnd ); + } + break; + case nsRedlineType_t::REDLINE_FORMAT: + switch( eCmpPos ) + { + case POS_OVERLAP_BEFORE: + pRedl->SetStart( *pEnd, pRStt ); + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl, n ); + bDec = true; + break; + + case POS_OVERLAP_BEHIND: + pRedl->SetEnd( *pStt, pREnd ); + if( *pStt == *pRStt && pRedl->GetContentIdx() == NULL ) + { + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + } + break; + + case POS_EQUAL: + case POS_OUTSIDE: + // Overlaps the current one completely or has the + // same dimension, delete the old one + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + break; + + case POS_INSIDE: + // Overlaps the current one completely, + // split or shorten the new one + if( *pEnd != *pREnd ) + { + if( *pEnd != *pRStt ) + { + SwRangeRedline* pNew = new SwRangeRedline( *pRedl ); + pNew->SetStart( *pEnd ); + pRedl->SetEnd( *pStt, pREnd ); + if( *pStt == *pRStt && pRedl->GetContentIdx() == NULL ) + mpRedlineTbl->DeleteAndDestroy( n ); + AppendRedline( pNew, bCallDelete ); + n = 0; // re-initialize + bDec = true; + } + } + else + pRedl->SetEnd( *pStt, pREnd ); + break; + default: + break; + } + break; + default: + break; + } + break; + + case nsRedlineType_t::REDLINE_DELETE: + switch( pRedl->GetType() ) + { + case nsRedlineType_t::REDLINE_DELETE: + switch( eCmpPos ) + { + case POS_OUTSIDE: + { + // Overlaps the current one completely, + // split the new one + if( *pEnd != *pREnd ) + { + SwRangeRedline* pNew = new SwRangeRedline( *pNewRedl ); + pNew->SetStart( *pREnd ); + pNewRedl->SetEnd( *pRStt, pEnd ); + AppendRedline( pNew, bCallDelete ); + n = 0; // re-initialize + bDec = true; + } + else + pNewRedl->SetEnd( *pRStt, pEnd ); + } + break; + + case POS_INSIDE: + case POS_EQUAL: + delete pNewRedl, pNewRedl = 0; + bCompress = true; + break; + + case POS_OVERLAP_BEFORE: + case POS_OVERLAP_BEHIND: + if( pRedl->IsOwnRedline( *pNewRedl ) && + pRedl->CanCombine( *pNewRedl )) + { + // If that's the case we can merge it, meaning + // the new one covers this well + if( POS_OVERLAP_BEHIND == eCmpPos ) + pNewRedl->SetStart( *pRStt, pStt ); + else + pNewRedl->SetEnd( *pREnd, pEnd ); + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + } + else if( POS_OVERLAP_BEHIND == eCmpPos ) + pNewRedl->SetStart( *pREnd, pStt ); + else + pNewRedl->SetEnd( *pRStt, pEnd ); + break; + + case POS_COLLIDE_START: + case POS_COLLIDE_END: + if( pRedl->IsOwnRedline( *pNewRedl ) && + pRedl->CanCombine( *pNewRedl ) ) + { + if( IsHideChanges( meRedlineMode )) + { + // Before we can merge, we make it visible! + // We insert temporarily so that pNew is + // also dealt with when moving the indices. + mpRedlineTbl->Insert( pNewRedl ); + pRedl->Show(); + mpRedlineTbl->Remove( pNewRedl ); + pRStt = pRedl->Start(); + pREnd = pRedl->End(); + } + + // If that's the case we can merge it, meaning + // the new one covers this well + if( POS_COLLIDE_START == eCmpPos ) + pNewRedl->SetStart( *pRStt, pStt ); + else + pNewRedl->SetEnd( *pREnd, pEnd ); + + // delete current (below), and restart process with + // previous + sal_uInt16 nToBeDeleted = n; + bDec = true; + + if( *(pNewRedl->Start()) <= *pREnd ) + { + // Whoooah, we just extended the new 'redline' + // beyond previous redlines, so better start + // again. Of course this is not supposed to + // happen, and in an ideal world it doesn't, + // but unfortunately this code is buggy and + // totally rotten so it does happen and we + // better fix it. + n = 0; + bDec = true; + } + + mpRedlineTbl->DeleteAndDestroy( nToBeDeleted ); + } + break; + default: + break; + } + break; + + case nsRedlineType_t::REDLINE_INSERT: + { + // b62341295: Do not throw away redlines + // even if they are not allowed to be combined + RedlineMode_t eOld = meRedlineMode; + if( !( eOld & nsRedlineMode_t::REDLINE_DONTCOMBINE_REDLINES ) && + pRedl->IsOwnRedline( *pNewRedl ) ) + { + + // Set to NONE, so that the Delete::Redo merges the Redline data correctly! + // The ShowMode needs to be retained! + meRedlineMode = (RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE)); + switch( eCmpPos ) + { + case POS_EQUAL: + bCompress = true; + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + // no break! + + case POS_INSIDE: + if( bCallDelete ) + { + meRedlineMode = (RedlineMode_t)(meRedlineMode | nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES); + + // DeleteAndJoin does not yield the + // desired result if there is no paragraph to + // join with, i.e. at the end of the document. + // For this case, we completely delete the + // paragraphs (if, of course, we also start on + // a paragraph boundary). + if( (pStt->nContent == 0) && + pEnd->nNode.GetNode().IsEndNode() ) + { + pEnd->nNode--; + pEnd->nContent.Assign( + pEnd->nNode.GetNode().GetTxtNode(), 0); + m_rSwdoc.getIDocumentContentOperations().DelFullPara( *pNewRedl ); + } + else + m_rSwdoc.getIDocumentContentOperations().DeleteAndJoin( *pNewRedl ); + + bCompress = true; + } + delete pNewRedl, pNewRedl = 0; + break; + + case POS_OUTSIDE: + { + mpRedlineTbl->Remove( n ); + bDec = true; + // We insert temporarily so that pNew is + // also dealt with when moving the indices. + if( bCallDelete ) + { + mpRedlineTbl->Insert( pNewRedl ); + m_rSwdoc.getIDocumentContentOperations().DeleteAndJoin( *pRedl ); + if( !mpRedlineTbl->Remove( pNewRedl ) ) + pNewRedl = 0; + } + delete pRedl; + } + break; + + case POS_OVERLAP_BEFORE: + { + SwPaM aPam( *pRStt, *pEnd ); + + if( *pEnd == *pREnd ) + mpRedlineTbl->DeleteAndDestroy( n ); + else + { + pRedl->SetStart( *pEnd, pRStt ); + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl, n ); + } + + if( bCallDelete ) + { + // We insert temporarily so that pNew is + // also dealt with when moving the indices. + mpRedlineTbl->Insert( pNewRedl ); + m_rSwdoc.getIDocumentContentOperations().DeleteAndJoin( aPam ); + if( !mpRedlineTbl->Remove( pNewRedl ) ) + pNewRedl = 0; + n = 0; // re-initialize + } + bDec = true; + } + break; + + case POS_OVERLAP_BEHIND: + { + SwPaM aPam( *pStt, *pREnd ); + + if( *pStt == *pRStt ) + { + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + } + else + pRedl->SetEnd( *pStt, pREnd ); + + if( bCallDelete ) + { + // We insert temporarily so that pNew is + // also dealt with when moving the indices. + mpRedlineTbl->Insert( pNewRedl ); + m_rSwdoc.getIDocumentContentOperations().DeleteAndJoin( aPam ); + if( !mpRedlineTbl->Remove( pNewRedl ) ) + pNewRedl = 0; + n = 0; // re-initialize + bDec = true; + } + } + break; + default: + break; + } + + meRedlineMode = eOld; + } + else + { + // it may be necessary to split the existing redline in + // two. In this case, pRedl will be changed to cover + // only part of it's former range, and pNew will cover + // the remainder. + SwRangeRedline* pNew = 0; + + switch( eCmpPos ) + { + case POS_EQUAL: + { + pRedl->PushData( *pNewRedl ); + delete pNewRedl, pNewRedl = 0; + if( IsHideChanges( meRedlineMode )) + pRedl->Hide(); + bCompress = true; + } + break; + + case POS_INSIDE: + { + if( *pRStt == *pStt ) + { + // #i97421# + // redline w/out extent loops + if (*pStt != *pEnd) + { + pNewRedl->PushData( *pRedl, false ); + pRedl->SetStart( *pEnd, pRStt ); + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl, n ); + bDec = true; + } + } + else + { + pNewRedl->PushData( *pRedl, false ); + if( *pREnd != *pEnd ) + { + pNew = new SwRangeRedline( *pRedl ); + pNew->SetStart( *pEnd ); + } + pRedl->SetEnd( *pStt, pREnd ); + if( !pRedl->HasValidRange() ) + { + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl, n ); + } + } + } + break; + + case POS_OUTSIDE: + { + pRedl->PushData( *pNewRedl ); + if( *pEnd == *pREnd ) + pNewRedl->SetEnd( *pRStt, pEnd ); + else + { + pNew = new SwRangeRedline( *pNewRedl ); + pNew->SetEnd( *pRStt ); + pNewRedl->SetStart( *pREnd, pStt ); + } + bCompress = true; + } + break; + + case POS_OVERLAP_BEFORE: + { + if( *pEnd == *pREnd ) + { + pRedl->PushData( *pNewRedl ); + pNewRedl->SetEnd( *pRStt, pEnd ); + if( IsHideChanges( meRedlineMode )) + { + mpRedlineTbl->Insert( pNewRedl ); + pRedl->Hide(); + mpRedlineTbl->Remove( pNewRedl ); + } + } + else + { + pNew = new SwRangeRedline( *pRedl ); + pNew->PushData( *pNewRedl ); + pNew->SetEnd( *pEnd ); + pNewRedl->SetEnd( *pRStt, pEnd ); + pRedl->SetStart( *pNew->End(), pRStt ) ; + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl ); + bDec = true; + } + } + break; + + case POS_OVERLAP_BEHIND: + { + if( *pStt == *pRStt ) + { + pRedl->PushData( *pNewRedl ); + pNewRedl->SetStart( *pREnd, pStt ); + if( IsHideChanges( meRedlineMode )) + { + mpRedlineTbl->Insert( pNewRedl ); + pRedl->Hide(); + mpRedlineTbl->Remove( pNewRedl ); + } + } + else + { + pNew = new SwRangeRedline( *pRedl ); + pNew->PushData( *pNewRedl ); + pNew->SetStart( *pStt ); + pNewRedl->SetStart( *pREnd, pStt ); + pRedl->SetEnd( *pNew->Start(), pREnd ); + if( !pRedl->HasValidRange() ) + { + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl ); + } + } + } + break; + default: + break; + } + + // insert the pNew part (if it exists) + if( pNew ) + { + mpRedlineTbl->Insert( pNew ); + + // pNew must be deleted if Insert() wasn't + // successful. But that can't happen, since pNew is + // part of the original pRedl redline. + // OSL_ENSURE( bRet, "Can't insert existing redline?" ); + + // restart (now with pRedl being split up) + n = 0; + bDec = true; + } + } + } + break; + + case nsRedlineType_t::REDLINE_FORMAT: + switch( eCmpPos ) + { + case POS_OVERLAP_BEFORE: + pRedl->SetStart( *pEnd, pRStt ); + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl, n ); + bDec = true; + break; + + case POS_OVERLAP_BEHIND: + pRedl->SetEnd( *pStt, pREnd ); + break; + + case POS_EQUAL: + case POS_OUTSIDE: + // Overlaps the current one completely or has the + // same dimension, delete the old one + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + break; + + case POS_INSIDE: + // Overlaps the current one completely, + // split or shorten the new one + if( *pEnd != *pREnd ) + { + if( *pEnd != *pRStt ) + { + SwRangeRedline* pNew = new SwRangeRedline( *pRedl ); + pNew->SetStart( *pEnd ); + pRedl->SetEnd( *pStt, pREnd ); + if( ( *pStt == *pRStt ) && + ( pRedl->GetContentIdx() == NULL ) ) + mpRedlineTbl->DeleteAndDestroy( n ); + AppendRedline( pNew, bCallDelete ); + n = 0; // re-initialize + bDec = true; + } + } + else + pRedl->SetEnd( *pStt, pREnd ); + break; + default: + break; + } + break; + default: + break; + } + break; + + case nsRedlineType_t::REDLINE_FORMAT: + switch( pRedl->GetType() ) + { + case nsRedlineType_t::REDLINE_INSERT: + case nsRedlineType_t::REDLINE_DELETE: + switch( eCmpPos ) + { + case POS_OVERLAP_BEFORE: + pNewRedl->SetEnd( *pRStt, pEnd ); + break; + + case POS_OVERLAP_BEHIND: + pNewRedl->SetStart( *pREnd, pStt ); + break; + + case POS_EQUAL: + case POS_INSIDE: + delete pNewRedl, pNewRedl = 0; + break; + + case POS_OUTSIDE: + // Overlaps the current one completely, + // split or shorten the new one + if( *pEnd != *pREnd ) + { + if( *pEnd != *pRStt ) + { + SwRangeRedline* pNew = new SwRangeRedline( *pNewRedl ); + pNew->SetStart( *pREnd ); + pNewRedl->SetEnd( *pRStt, pEnd ); + AppendRedline( pNew, bCallDelete ); + n = 0; // re-initialize + bDec = true; + } + } + else + pNewRedl->SetEnd( *pRStt, pEnd ); + break; + default: + break; + } + break; + case nsRedlineType_t::REDLINE_FORMAT: + switch( eCmpPos ) + { + case POS_OUTSIDE: + case POS_EQUAL: + { + // Overlaps the current one completely or has the + // same dimension, delete the old one + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + } + break; + + case POS_INSIDE: + if( pRedl->IsOwnRedline( *pNewRedl ) && + pRedl->CanCombine( *pNewRedl )) + // own one can be ignored completely + delete pNewRedl, pNewRedl = 0; + + else if( *pREnd == *pEnd ) + // or else only shorten the current one + pRedl->SetEnd( *pStt, pREnd ); + else if( *pRStt == *pStt ) + { + // or else only shorten the current one + pRedl->SetStart( *pEnd, pRStt ); + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl, n ); + bDec = true; + } + else + { + // If it lies completely within the current one + // we need to split it + SwRangeRedline* pNew = new SwRangeRedline( *pRedl ); + pNew->SetStart( *pEnd ); + pRedl->SetEnd( *pStt, pREnd ); + AppendRedline( pNew, bCallDelete ); + n = 0; // re-initialize + bDec = true; + } + break; + + case POS_OVERLAP_BEFORE: + case POS_OVERLAP_BEHIND: + if( pRedl->IsOwnRedline( *pNewRedl ) && + pRedl->CanCombine( *pNewRedl )) + { + // If that's the case we can merge it, meaning + // the new one covers this well + if( POS_OVERLAP_BEHIND == eCmpPos ) + pNewRedl->SetStart( *pRStt, pStt ); + else + pNewRedl->SetEnd( *pREnd, pEnd ); + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = false; + } + else if( POS_OVERLAP_BEHIND == eCmpPos ) + pNewRedl->SetStart( *pREnd, pStt ); + else + pNewRedl->SetEnd( *pRStt, pEnd ); + break; + + case POS_COLLIDE_END: + if( pRedl->IsOwnRedline( *pNewRedl ) && + pRedl->CanCombine( *pNewRedl ) && n && + *(*mpRedlineTbl)[ n-1 ]->End() < *pStt ) + { + // If that's the case we can merge it, meaning + // the new one covers this well + pNewRedl->SetEnd( *pREnd, pEnd ); + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + } + break; + case POS_COLLIDE_START: + if( pRedl->IsOwnRedline( *pNewRedl ) && + pRedl->CanCombine( *pNewRedl ) && + n+1 < (sal_uInt16)mpRedlineTbl->size() && + *(*mpRedlineTbl)[ n+1 ]->Start() < *pEnd ) + { + // If that's the case we can merge it, meaning + // the new one covers this well + pNewRedl->SetStart( *pRStt, pStt ); + mpRedlineTbl->DeleteAndDestroy( n ); + bDec = true; + } + break; + default: + break; + } + break; + default: + break; + } + break; + + case nsRedlineType_t::REDLINE_FMTCOLL: + // How should we behave here? + // insert as is + break; + default: + break; + } + } + + if( pNewRedl ) + { + if( ( *pStt == *pEnd ) && + ( pNewRedl->GetContentIdx() == NULL ) ) + { // Do not insert empty redlines + delete pNewRedl; + pNewRedl = 0; + } + else + mpRedlineTbl->Insert( pNewRedl ); + } + + if( bCompress ) + CompressRedlines(); + } + else + { + if( bCallDelete && nsRedlineType_t::REDLINE_DELETE == pNewRedl->GetType() ) + { + RedlineMode_t eOld = meRedlineMode; + // Set to NONE, so that the Delete::Redo merges the Redline data correctly! + // The ShowMode needs to be retained! + meRedlineMode = (RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE)); + m_rSwdoc.getIDocumentContentOperations().DeleteAndJoin( *pNewRedl ); + meRedlineMode = eOld; + } + delete pNewRedl, pNewRedl = 0; + } + _CHECK_REDLINE( *this ) + + return ( 0 != pNewRedl ) || bMerged; +} + +bool DocumentRedlineManager::AppendTableRowRedline( SwTableRowRedline* pNewRedl, bool bCallDelete ) +{ + (void)bCallDelete; + + // #TODO - equivelant for 'SwTableRowRedline' + bool bMerged = false; + /* + _CHECK_REDLINE( this ) + */ + + if (IsRedlineOn() && !IsShowOriginal(meRedlineMode)) + { + // #TODO - equivelant for 'SwTableRowRedline' + /* + pNewRedl->InvalidateRange(); + */ + + // Make equivelant of 'AppendRedline' checks inside here too + + mpExtraRedlineTbl->Insert( pNewRedl ); + } + else + { + // TO DO - equivelant for 'SwTableRowRedline' + /* + if( bCallDelete && nsRedlineType_t::REDLINE_DELETE == pNewRedl->GetType() ) + { + RedlineMode_t eOld = meRedlineMode; + // Set to NONE, so that the Delete::Redo merges the Redline data correctly! + // The ShowMode needs to be retained! + meRedlineMode = (RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE)); + DeleteAndJoin( *pNewRedl ); + meRedlineMode = eOld; + } + delete pNewRedl, pNewRedl = 0; + */ + } + // #TODO - equivelant for 'SwTableRowRedline' + /* + _CHECK_REDLINE( this ) + */ + + return ( 0 != pNewRedl ) || bMerged; +} + +bool DocumentRedlineManager::AppendTableCellRedline( SwTableCellRedline* pNewRedl, bool bCallDelete ) +{ + (void)bCallDelete; + + // #TODO - equivelant for 'SwTableCellRedline' + bool bMerged = false; + /* + _CHECK_REDLINE( this ) + */ + + if (IsRedlineOn() && !IsShowOriginal(meRedlineMode)) + { + // #TODO - equivelant for 'SwTableCellRedline' + /* + pNewRedl->InvalidateRange(); + */ + + // Make equivelant of 'AppendRedline' checks inside here too + + mpExtraRedlineTbl->Insert( pNewRedl ); + } + else + { + // TO DO - equivelant for 'SwTableCellRedline' + /* + if( bCallDelete && nsRedlineType_t::REDLINE_DELETE == pNewRedl->GetType() ) + { + RedlineMode_t eOld = meRedlineMode; + // Set to NONE, so that the Delete::Redo merges the Redline data correctly! + // The ShowMode needs to be retained! + meRedlineMode = (RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE)); + DeleteAndJoin( *pNewRedl ); + meRedlineMode = eOld; + } + delete pNewRedl, pNewRedl = 0; + */ + } + // #TODO - equivelant for 'SwTableCellRedline' + /* + _CHECK_REDLINE( this ) + */ + + return ( 0 != pNewRedl ) || bMerged; +} + +void DocumentRedlineManager::CompressRedlines() +{ + _CHECK_REDLINE( *this ) + + void (SwRangeRedline::*pFnc)(sal_uInt16) = 0; + switch( nsRedlineMode_t::REDLINE_SHOW_MASK & meRedlineMode ) + { + case nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE: + pFnc = &SwRangeRedline::Show; + break; + case nsRedlineMode_t::REDLINE_SHOW_INSERT: + pFnc = &SwRangeRedline::Hide; + break; + } + + // Try to merge identical ones + for( sal_uInt16 n = 1; n < mpRedlineTbl->size(); ++n ) + { + SwRangeRedline* pPrev = (*mpRedlineTbl)[ n-1 ], + * pCur = (*mpRedlineTbl)[ n ]; + const SwPosition* pPrevStt = pPrev->Start(), + * pPrevEnd = pPrevStt == pPrev->GetPoint() + ? pPrev->GetMark() : pPrev->GetPoint(); + const SwPosition* pCurStt = pCur->Start(), + * pCurEnd = pCurStt == pCur->GetPoint() + ? pCur->GetMark() : pCur->GetPoint(); + if( *pPrevEnd == *pCurStt && pPrev->CanCombine( *pCur ) && + pPrevStt->nNode.GetNode().StartOfSectionNode() == + pCurEnd->nNode.GetNode().StartOfSectionNode() && + !pCurEnd->nNode.GetNode().StartOfSectionNode()->IsTableNode() ) + { + // we then can merge them + pPrev->Show(); + pCur->Show(); + + pPrev->SetEnd( *pCur->End() ); + mpRedlineTbl->DeleteAndDestroy( n ); + --n; + if( pFnc ) + (pPrev->*pFnc)(0); + } + } + _CHECK_REDLINE( *this ) + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +bool DocumentRedlineManager::SplitRedline( const SwPaM& rRange ) +{ + bool bChg = false; + sal_uInt16 n = 0; + const SwPosition* pStt = rRange.Start(), + * pEnd = pStt == rRange.GetPoint() ? rRange.GetMark() + : rRange.GetPoint(); + GetRedline( *pStt, &n ); + for( ; n < mpRedlineTbl->size() ; ++n ) + { + SwRangeRedline* pTmp = (*mpRedlineTbl)[ n ]; + SwPosition* pTStt = pTmp->Start(), + * pTEnd = pTStt == pTmp->GetPoint() ? pTmp->GetMark() + : pTmp->GetPoint(); + if( *pTStt <= *pStt && *pStt <= *pTEnd && + *pTStt <= *pEnd && *pEnd <= *pTEnd ) + { + bChg = true; + int nn = 0; + if( *pStt == *pTStt ) + nn += 1; + if( *pEnd == *pTEnd ) + nn += 2; + + SwRangeRedline* pNew = 0; + switch( nn ) + { + case 0: + pNew = new SwRangeRedline( *pTmp ); + pTmp->SetEnd( *pStt, pTEnd ); + pNew->SetStart( *pEnd ); + break; + + case 1: + *pTStt = *pEnd; + break; + + case 2: + *pTEnd = *pStt; + break; + + case 3: + pTmp->InvalidateRange(); + mpRedlineTbl->DeleteAndDestroy( n-- ); + pTmp = 0; + break; + } + if( pTmp && !pTmp->HasValidRange() ) + { + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pTmp, n ); + } + if( pNew ) + mpRedlineTbl->Insert( pNew, n ); + } + else if( *pEnd < *pTStt ) + break; + } + return bChg; + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +bool DocumentRedlineManager::DeleteRedline( const SwPaM& rRange, bool bSaveInUndo, + sal_uInt16 nDelType ) +{ + if( nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES & meRedlineMode || + !rRange.HasMark() || *rRange.GetMark() == *rRange.GetPoint() ) + return false; + + bool bChg = false; + + if (bSaveInUndo && m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) + { + SwUndoRedline* pUndo = new SwUndoRedline( UNDO_REDLINE, rRange ); + if( pUndo->GetRedlSaveCount() ) + { + m_rSwdoc.GetIDocumentUndoRedo().AppendUndo(pUndo); + } + else + delete pUndo; + } + + const SwPosition* pStt = rRange.Start(), + * pEnd = pStt == rRange.GetPoint() ? rRange.GetMark() + : rRange.GetPoint(); + sal_uInt16 n = 0; + GetRedline( *pStt, &n ); + for( ; n < mpRedlineTbl->size() ; ++n ) + { + SwRangeRedline* pRedl = (*mpRedlineTbl)[ n ]; + if( USHRT_MAX != nDelType && nDelType != pRedl->GetType() ) + continue; + + SwPosition* pRStt = pRedl->Start(), + * pREnd = pRStt == pRedl->GetPoint() ? pRedl->GetMark() + : pRedl->GetPoint(); + switch( ComparePosition( *pStt, *pEnd, *pRStt, *pREnd ) ) + { + case POS_EQUAL: + case POS_OUTSIDE: + pRedl->InvalidateRange(); + mpRedlineTbl->DeleteAndDestroy( n-- ); + bChg = true; + break; + + case POS_OVERLAP_BEFORE: + pRedl->InvalidateRange(); + pRedl->SetStart( *pEnd, pRStt ); + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl ); + --n; + break; + + case POS_OVERLAP_BEHIND: + pRedl->InvalidateRange(); + pRedl->SetEnd( *pStt, pREnd ); + if( !pRedl->HasValidRange() ) + { + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl ); + --n; + } + break; + + case POS_INSIDE: + { + // this one needs to be splitted + pRedl->InvalidateRange(); + if( *pRStt == *pStt ) + { + pRedl->SetStart( *pEnd, pRStt ); + // re-insert + mpRedlineTbl->Remove( n ); + mpRedlineTbl->Insert( pRedl ); + --n; + } + else + { + SwRangeRedline* pCpy; + if( *pREnd != *pEnd ) + { + pCpy = new SwRangeRedline( *pRedl ); + pCpy->SetStart( *pEnd ); + } + else + pCpy = 0; + pRedl->SetEnd( *pStt, pREnd ); + if( !pRedl->HasValidRange() ) + { + // re-insert + mpRedlineTbl->Remove( pRedl ); + mpRedlineTbl->Insert( pRedl ); + --n; + } + if( pCpy ) + mpRedlineTbl->Insert( pCpy ); + } + } + break; + + case POS_COLLIDE_END: + case POS_BEFORE: + n = mpRedlineTbl->size(); + break; + default: + break; + } + } + + if( bChg ) + m_rSwdoc.SetModified(); + + return bChg; + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +bool DocumentRedlineManager::DeleteRedline( const SwStartNode& rNode, bool bSaveInUndo, + sal_uInt16 nDelType ) +{ + SwPaM aTemp(*rNode.EndOfSectionNode(), rNode); + return DeleteRedline(aTemp, bSaveInUndo, nDelType); +} + +sal_uInt16 DocumentRedlineManager::GetRedlinePos( const SwNode& rNd, sal_uInt16 nType ) const +{ + const sal_uLong nNdIdx = rNd.GetIndex(); + for( sal_uInt16 n = 0; n < mpRedlineTbl->size() ; ++n ) + { + const SwRangeRedline* pTmp = (*mpRedlineTbl)[ n ]; + sal_uLong nPt = pTmp->GetPoint()->nNode.GetIndex(), + nMk = pTmp->GetMark()->nNode.GetIndex(); + if( nPt < nMk ) { long nTmp = nMk; nMk = nPt; nPt = nTmp; } + + if( ( USHRT_MAX == nType || nType == pTmp->GetType()) && + nMk <= nNdIdx && nNdIdx <= nPt ) + return n; + + if( nMk > nNdIdx ) + break; + } + return USHRT_MAX; + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +const SwRangeRedline* DocumentRedlineManager::GetRedline( const SwPosition& rPos, + sal_uInt16* pFndPos ) const +{ + sal_uInt16 nO = mpRedlineTbl->size(), nM, nU = 0; + if( nO > 0 ) + { + nO--; + while( nU <= nO ) + { + nM = nU + ( nO - nU ) / 2; + const SwRangeRedline* pRedl = (*mpRedlineTbl)[ nM ]; + const SwPosition* pStt = pRedl->Start(); + const SwPosition* pEnd = pStt == pRedl->GetPoint() + ? pRedl->GetMark() + : pRedl->GetPoint(); + if( pEnd == pStt + ? *pStt == rPos + : ( *pStt <= rPos && rPos < *pEnd ) ) + { + while( nM && rPos == *(*mpRedlineTbl)[ nM - 1 ]->End() && + rPos == *(*mpRedlineTbl)[ nM - 1 ]->Start() ) + { + --nM; + pRedl = (*mpRedlineTbl)[ nM ]; + } + // if there are format and insert changes in the same position + // show insert change first. + // since the redlines are sorted by position, only check the redline + // before and after the current redline + if( nsRedlineType_t::REDLINE_FORMAT == pRedl->GetType() ) + { + if( nM && rPos >= *(*mpRedlineTbl)[ nM - 1 ]->Start() && + rPos <= *(*mpRedlineTbl)[ nM - 1 ]->End() && + ( nsRedlineType_t::REDLINE_INSERT == (*mpRedlineTbl)[ nM - 1 ]->GetType() ) ) + { + --nM; + pRedl = (*mpRedlineTbl)[ nM ]; + } + else if( ( nM + 1 ) <= nO && rPos >= *(*mpRedlineTbl)[ nM + 1 ]->Start() && + rPos <= *(*mpRedlineTbl)[ nM + 1 ]->End() && + ( nsRedlineType_t::REDLINE_INSERT == (*mpRedlineTbl)[ nM + 1 ]->GetType() ) ) + { + ++nM; + pRedl = (*mpRedlineTbl)[ nM ]; + } + } + + if( pFndPos ) + *pFndPos = nM; + return pRedl; + } + else if( *pEnd <= rPos ) + nU = nM + 1; + else if( nM == 0 ) + { + if( pFndPos ) + *pFndPos = nU; + return 0; + } + else + nO = nM - 1; + } + } + if( pFndPos ) + *pFndPos = nU; + return 0; + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +bool DocumentRedlineManager::AcceptRedline( sal_uInt16 nPos, bool bCallDelete ) +{ + bool bRet = false; + + // Switch to visible in any case + if( (nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE) != + (nsRedlineMode_t::REDLINE_SHOW_MASK & meRedlineMode) ) + SetRedlineMode( (RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE | meRedlineMode)); + + SwRangeRedline* pTmp = (*mpRedlineTbl)[ nPos ]; + if( pTmp->HasMark() && pTmp->IsVisible() ) + { + if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) + { + SwRewriter aRewriter; + + aRewriter.AddRule(UndoArg1, pTmp->GetDescr()); + m_rSwdoc.GetIDocumentUndoRedo().StartUndo(UNDO_ACCEPT_REDLINE, &aRewriter); + } + + int nLoopCnt = 2; + sal_uInt16 nSeqNo = pTmp->GetSeqNo(); + + do { + + if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) + { + SwUndo *const pUndo( new SwUndoAcceptRedline(*pTmp) ); + m_rSwdoc.GetIDocumentUndoRedo().AppendUndo(pUndo); + } + + bRet |= lcl_AcceptRedline( *mpRedlineTbl, nPos, bCallDelete ); + + if( nSeqNo ) + { + if( USHRT_MAX == nPos ) + nPos = 0; + sal_uInt16 nFndPos = 2 == nLoopCnt + ? mpRedlineTbl->FindNextSeqNo( nSeqNo, nPos ) + : mpRedlineTbl->FindPrevSeqNo( nSeqNo, nPos ); + if( USHRT_MAX != nFndPos || ( 0 != ( --nLoopCnt ) && + USHRT_MAX != ( nFndPos = + mpRedlineTbl->FindPrevSeqNo( nSeqNo, nPos ))) ) + pTmp = (*mpRedlineTbl)[ nPos = nFndPos ]; + else + nLoopCnt = 0; + } + else + nLoopCnt = 0; + + } while( nLoopCnt ); + + if( bRet ) + { + CompressRedlines(); + m_rSwdoc.SetModified(); + } + + if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) + { + m_rSwdoc.GetIDocumentUndoRedo().EndUndo(UNDO_END, 0); + } + } + return bRet; + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +bool DocumentRedlineManager::AcceptRedline( const SwPaM& rPam, bool bCallDelete ) +{ + // Switch to visible in any case + if( (nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE) != + (nsRedlineMode_t::REDLINE_SHOW_MASK & meRedlineMode) ) + SetRedlineMode( (RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE | meRedlineMode)); + + // The Selection is only in the ContentSection. If there are Redlines + // to Non-ContentNodes before or after that, then the Selections + // expand to them. + SwPaM aPam( *rPam.GetMark(), *rPam.GetPoint() ); + lcl_AdjustRedlineRange( aPam ); + + if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) + { + m_rSwdoc.GetIDocumentUndoRedo().StartUndo( UNDO_ACCEPT_REDLINE, NULL ); + m_rSwdoc.GetIDocumentUndoRedo().AppendUndo( new SwUndoAcceptRedline( aPam )); + } + + int nRet = lcl_AcceptRejectRedl( lcl_AcceptRedline, *mpRedlineTbl, + bCallDelete, aPam ); + if( nRet > 0 ) + { + CompressRedlines(); + m_rSwdoc.SetModified(); + } + if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) + { + OUString aTmpStr; + + { + SwRewriter aRewriter; + aRewriter.AddRule(UndoArg1, OUString::number(nRet)); + aTmpStr = aRewriter.Apply(OUString(SW_RES(STR_N_REDLINES))); + } + + SwRewriter aRewriter; + aRewriter.AddRule(UndoArg1, aTmpStr); + + m_rSwdoc.GetIDocumentUndoRedo().EndUndo( UNDO_ACCEPT_REDLINE, &aRewriter ); + } + return nRet != 0; + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +bool DocumentRedlineManager::RejectRedline( sal_uInt16 nPos, bool bCallDelete ) +{ + bool bRet = false; + + // Switch to visible in any case + if( (nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE) != + (nsRedlineMode_t::REDLINE_SHOW_MASK & meRedlineMode) ) + SetRedlineMode( (RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE | meRedlineMode)); + + SwRangeRedline* pTmp = (*mpRedlineTbl)[ nPos ]; + if( pTmp->HasMark() && pTmp->IsVisible() ) + { + if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) + { + SwRewriter aRewriter; + + aRewriter.AddRule(UndoArg1, pTmp->GetDescr()); + m_rSwdoc.GetIDocumentUndoRedo().StartUndo(UNDO_REJECT_REDLINE, &aRewriter); + } + + int nLoopCnt = 2; + sal_uInt16 nSeqNo = pTmp->GetSeqNo(); + + do { + + if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) + { + SwUndo *const pUndo( new SwUndoRejectRedline( *pTmp ) ); + m_rSwdoc.GetIDocumentUndoRedo().AppendUndo(pUndo); + } + + bRet |= lcl_RejectRedline( *mpRedlineTbl, nPos, bCallDelete ); + + if( nSeqNo ) + { + if( USHRT_MAX == nPos ) + nPos = 0; + sal_uInt16 nFndPos = 2 == nLoopCnt + ? mpRedlineTbl->FindNextSeqNo( nSeqNo, nPos ) + : mpRedlineTbl->FindPrevSeqNo( nSeqNo, nPos ); + if( USHRT_MAX != nFndPos || ( 0 != ( --nLoopCnt ) && + USHRT_MAX != ( nFndPos = + mpRedlineTbl->FindPrevSeqNo( nSeqNo, nPos ))) ) + pTmp = (*mpRedlineTbl)[ nPos = nFndPos ]; + else + nLoopCnt = 0; + } + else + nLoopCnt = 0; + + } while( nLoopCnt ); + + if( bRet ) + { + CompressRedlines(); + m_rSwdoc.SetModified(); + } + + if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) + { + m_rSwdoc.GetIDocumentUndoRedo().EndUndo(UNDO_END, 0); + } + } + return bRet; + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +bool DocumentRedlineManager::RejectRedline( const SwPaM& rPam, bool bCallDelete ) +{ + // Switch to visible in any case + if( (nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE) != + (nsRedlineMode_t::REDLINE_SHOW_MASK & meRedlineMode) ) + SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE | meRedlineMode)); + + // The Selection is only in the ContentSection. If there are Redlines + // to Non-ContentNodes before or after that, then the Selections + // expand to them. + SwPaM aPam( *rPam.GetMark(), *rPam.GetPoint() ); + lcl_AdjustRedlineRange( aPam ); + + if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) + { + m_rSwdoc.GetIDocumentUndoRedo().StartUndo( UNDO_REJECT_REDLINE, NULL ); + m_rSwdoc.GetIDocumentUndoRedo().AppendUndo( new SwUndoRejectRedline(aPam) ); + } + + int nRet = lcl_AcceptRejectRedl( lcl_RejectRedline, *mpRedlineTbl, + bCallDelete, aPam ); + if( nRet > 0 ) + { + CompressRedlines(); + m_rSwdoc.SetModified(); + } + if (m_rSwdoc.GetIDocumentUndoRedo().DoesUndo()) + { + OUString aTmpStr; + + { + SwRewriter aRewriter; + aRewriter.AddRule(UndoArg1, OUString::number(nRet)); + aTmpStr = aRewriter.Apply(OUString(SW_RES(STR_N_REDLINES))); + } + + SwRewriter aRewriter; + aRewriter.AddRule(UndoArg1, aTmpStr); + + m_rSwdoc.GetIDocumentUndoRedo().EndUndo( UNDO_REJECT_REDLINE, &aRewriter ); + } + + return nRet != 0; + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +const SwRangeRedline* DocumentRedlineManager::SelNextRedline( SwPaM& rPam ) const +{ + rPam.DeleteMark(); + rPam.SetMark(); + + SwPosition& rSttPos = *rPam.GetPoint(); + SwPosition aSavePos( rSttPos ); + bool bRestart; + + // If the starting position points to the last valid ContentNode, + // we take the next Redline in any case. + sal_uInt16 n = 0; + const SwRangeRedline* pFnd = GetRedlineTbl().FindAtPosition( rSttPos, n, true ); + if( pFnd ) + { + const SwPosition* pEnd = pFnd->End(); + if( !pEnd->nNode.GetNode().IsCntntNode() ) + { + SwNodeIndex aTmp( pEnd->nNode ); + SwCntntNode* pCNd = m_rSwdoc.GetNodes().GoPrevSection( &aTmp ); + if( !pCNd || ( aTmp == rSttPos.nNode && + pCNd->Len() == rSttPos.nContent.GetIndex() )) + pFnd = 0; + } + if( pFnd ) + rSttPos = *pFnd->End(); + } + + do { + bRestart = false; + + for( ; !pFnd && n < mpRedlineTbl->size(); ++n ) + { + pFnd = (*mpRedlineTbl)[ n ]; + if( pFnd->HasMark() && pFnd->IsVisible() ) + { + *rPam.GetMark() = *pFnd->Start(); + rSttPos = *pFnd->End(); + break; + } + else + pFnd = 0; + } + + if( pFnd ) + { + // Merge all of the same type and author that are + // consecutive into one Selection. + const SwPosition* pPrevEnd = pFnd->End(); + while( ++n < mpRedlineTbl->size() ) + { + const SwRangeRedline* pTmp = (*mpRedlineTbl)[ n ]; + if( pTmp->HasMark() && pTmp->IsVisible() ) + { + const SwPosition *pRStt; + if( pFnd->GetType() == pTmp->GetType() && + pFnd->GetAuthor() == pTmp->GetAuthor() && + ( *pPrevEnd == *( pRStt = pTmp->Start() ) || + IsPrevPos( *pPrevEnd, *pRStt )) ) + { + pPrevEnd = pTmp->End(); + rSttPos = *pPrevEnd; + } + else + break; + } + } + } + + if( pFnd ) + { + const SwRangeRedline* pSaveFnd = pFnd; + + SwCntntNode* pCNd; + SwNodeIndex* pIdx = &rPam.GetMark()->nNode; + if( !pIdx->GetNode().IsCntntNode() && + 0 != ( pCNd = m_rSwdoc.GetNodes().GoNextSection( pIdx )) ) + { + if( *pIdx <= rPam.GetPoint()->nNode ) + rPam.GetMark()->nContent.Assign( pCNd, 0 ); + else + pFnd = 0; + } + + if( pFnd ) + { + pIdx = &rPam.GetPoint()->nNode; + if( !pIdx->GetNode().IsCntntNode() && + 0 != ( pCNd = m_rSwdoc.GetNodes().GoPrevSection( pIdx )) ) + { + if( *pIdx >= rPam.GetMark()->nNode ) + rPam.GetPoint()->nContent.Assign( pCNd, pCNd->Len() ); + else + pFnd = 0; + } + } + + if( !pFnd || *rPam.GetMark() == *rPam.GetPoint() ) + { + if( n < mpRedlineTbl->size() ) + { + bRestart = true; + *rPam.GetPoint() = *pSaveFnd->End(); + } + else + { + rPam.DeleteMark(); + *rPam.GetPoint() = aSavePos; + } + pFnd = 0; + } + } + } while( bRestart ); + + return pFnd; + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +const SwRangeRedline* DocumentRedlineManager::SelPrevRedline( SwPaM& rPam ) const +{ + rPam.DeleteMark(); + rPam.SetMark(); + + SwPosition& rSttPos = *rPam.GetPoint(); + SwPosition aSavePos( rSttPos ); + bool bRestart; + + // If the starting position points to the last valid ContentNode, + // we take the previous Redline in any case. + sal_uInt16 n = 0; + const SwRangeRedline* pFnd = GetRedlineTbl().FindAtPosition( rSttPos, n, false ); + if( pFnd ) + { + const SwPosition* pStt = pFnd->Start(); + if( !pStt->nNode.GetNode().IsCntntNode() ) + { + SwNodeIndex aTmp( pStt->nNode ); + SwCntntNode* pCNd = m_rSwdoc.GetNodes().GoNextSection( &aTmp ); + if( !pCNd || ( aTmp == rSttPos.nNode && + !rSttPos.nContent.GetIndex() )) + pFnd = 0; + } + if( pFnd ) + rSttPos = *pFnd->Start(); + } + + do { + bRestart = false; + + while( !pFnd && 0 < n ) + { + pFnd = (*mpRedlineTbl)[ --n ]; + if( pFnd->HasMark() && pFnd->IsVisible() ) + { + *rPam.GetMark() = *pFnd->End(); + rSttPos = *pFnd->Start(); + } + else + pFnd = 0; + } + + if( pFnd ) + { + // Merge all of the same type and author that are + // consecutive into one Selection. + const SwPosition* pNextStt = pFnd->Start(); + while( 0 < n ) + { + const SwRangeRedline* pTmp = (*mpRedlineTbl)[ --n ]; + if( pTmp->HasMark() && pTmp->IsVisible() ) + { + const SwPosition *pREnd; + if( pFnd->GetType() == pTmp->GetType() && + pFnd->GetAuthor() == pTmp->GetAuthor() && + ( *pNextStt == *( pREnd = pTmp->End() ) || + IsPrevPos( *pREnd, *pNextStt )) ) + { + pNextStt = pTmp->Start(); + rSttPos = *pNextStt; + } + else + { + ++n; + break; + } + } + } + } + + if( pFnd ) + { + const SwRangeRedline* pSaveFnd = pFnd; + + SwCntntNode* pCNd; + SwNodeIndex* pIdx = &rPam.GetMark()->nNode; + if( !pIdx->GetNode().IsCntntNode() && + 0 != ( pCNd = m_rSwdoc.GetNodes().GoPrevSection( pIdx )) ) + { + if( *pIdx >= rPam.GetPoint()->nNode ) + rPam.GetMark()->nContent.Assign( pCNd, pCNd->Len() ); + else + pFnd = 0; + } + + if( pFnd ) + { + pIdx = &rPam.GetPoint()->nNode; + if( !pIdx->GetNode().IsCntntNode() && + 0 != ( pCNd = m_rSwdoc.GetNodes().GoNextSection( pIdx )) ) + { + if( *pIdx <= rPam.GetMark()->nNode ) + rPam.GetPoint()->nContent.Assign( pCNd, 0 ); + else + pFnd = 0; + } + } + + if( !pFnd || *rPam.GetMark() == *rPam.GetPoint() ) + { + if( n ) + { + bRestart = true; + *rPam.GetPoint() = *pSaveFnd->Start(); + } + else + { + rPam.DeleteMark(); + *rPam.GetPoint() = aSavePos; + } + pFnd = 0; + } + } + } while( bRestart ); + + return pFnd; + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +// Set comment at the Redline +bool DocumentRedlineManager::SetRedlineComment( const SwPaM& rPaM, const OUString& rS ) +{ + bool bRet = false; + const SwPosition* pStt = rPaM.Start(), + * pEnd = pStt == rPaM.GetPoint() ? rPaM.GetMark() + : rPaM.GetPoint(); + sal_uInt16 n = 0; + if( GetRedlineTbl().FindAtPosition( *pStt, n, true ) ) + { + for( ; n < mpRedlineTbl->size(); ++n ) + { + bRet = true; + SwRangeRedline* pTmp = (*mpRedlineTbl)[ n ]; + if( pStt != pEnd && *pTmp->Start() > *pEnd ) + break; + + pTmp->SetComment( rS ); + if( *pTmp->End() >= *pEnd ) + break; + } + } + if( bRet ) + m_rSwdoc.SetModified(); + + return bRet; + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +// Create a new author if necessary +sal_uInt16 DocumentRedlineManager::GetRedlineAuthor() +{ + return SW_MOD()->GetRedlineAuthor(); +} + +/// Insert new author into the Table for the Readers etc. +sal_uInt16 DocumentRedlineManager::InsertRedlineAuthor( const OUString& rNew ) +{ + return SW_MOD()->InsertRedlineAuthor(rNew); +} + +void DocumentRedlineManager::UpdateRedlineAttr() +{ + const SwRedlineTbl& rTbl = GetRedlineTbl(); + for( sal_uInt16 n = 0; n < rTbl.size(); ++n ) + { + SwRangeRedline* pRedl = rTbl[ n ]; + if( pRedl->IsVisible() ) + pRedl->InvalidateRange(); + } + + // #TODO - add 'SwExtraRedlineTbl' also ? +} + +const uno::Sequence <sal_Int8>& DocumentRedlineManager::GetRedlinePassword() const +{ + return maRedlinePasswd; +} + +void DocumentRedlineManager::SetRedlinePassword( + /*[in]*/const uno::Sequence <sal_Int8>& rNewPassword) +{ + maRedlinePasswd = rNewPassword; + m_rSwdoc.SetModified(); +} + +/// Set comment text for the Redline, which is inserted later on via +/// AppendRedline. Is used by Autoformat. +/// A null pointer resets the mode. The pointer is not copied, so it +/// needs to stay valid! +void DocumentRedlineManager::SetAutoFmtRedlineComment( const OUString* pTxt, sal_uInt16 nSeqNo ) +{ + m_rSwdoc.SetAutoFmtRedline( 0 != pTxt ); + if( pTxt ) + { + if( !mpAutoFmtRedlnComment ) + mpAutoFmtRedlnComment = new OUString( *pTxt ); + else + *mpAutoFmtRedlnComment = *pTxt; + } + else + delete mpAutoFmtRedlnComment, mpAutoFmtRedlnComment = 0; + + mnAutoFmtRedlnCommentNo = nSeqNo; +} + +#define MAX_REDLINE_COUNT 250 + +void DocumentRedlineManager::checkRedlining(RedlineMode_t& _rReadlineMode) +{ + const SwRedlineTbl& rRedlineTbl = GetRedlineTbl(); + SwEditShell* pEditShell = m_rSwdoc.GetEditShell(); + Window* pParent = pEditShell ? pEditShell->GetWin() : NULL; + if ( pParent && !mbReadlineChecked && rRedlineTbl.size() > MAX_REDLINE_COUNT + && !((_rReadlineMode & nsRedlineMode_t::REDLINE_SHOW_DELETE) == nsRedlineMode_t::REDLINE_SHOW_DELETE) ) + { + MessageDialog aQuery(pParent, "QueryShowChangesDialog", "modules/swriter/ui/queryshowchangesdialog.ui"); + sal_uInt16 nResult = aQuery.Execute(); + mbReadlineChecked = true; + if ( nResult == RET_YES ) + { + sal_Int32 nMode = (sal_Int32)_rReadlineMode; + nMode |= nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE; + _rReadlineMode = (RedlineMode_t)nMode; + } + } +} + +DocumentRedlineManager::~DocumentRedlineManager() +{ + delete mpRedlineTbl; mpRedlineTbl = 0; + delete mpExtraRedlineTbl; mpExtraRedlineTbl = 0; + delete mpAutoFmtRedlnComment; mpAutoFmtRedlnComment = 0; +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx index c6d3fcd88c6d..a7034e405865 100644 --- a/sw/source/core/doc/doc.cxx +++ b/sw/source/core/doc/doc.cxx @@ -28,6 +28,7 @@ #include <DocumentListsManager.hxx> #include <DocumentOutlineNodesManager.hxx> #include <DocumentContentOperationsManager.hxx> +#include <DocumentRedlineManager.hxx> #include <UndoManager.hxx> #include <hintids.hxx> #include <tools/shl.hxx> @@ -361,6 +362,27 @@ IDocumentContentOperations & SwDoc::getIDocumentContentOperations() return *m_pDocumentContentOperationsManager; } +//IDocumentRedlineAccess +IDocumentRedlineAccess const & SwDoc::getIDocumentRedlineAccess() const +{ + return *m_pDocumentRedlineManager; +} + +IDocumentRedlineAccess& SwDoc::getIDocumentRedlineAccess() +{ + return *m_pDocumentRedlineManager; +} + +::sw::DocumentRedlineManager const & SwDoc::GetDocumentRedlineManager() const +{ + return *m_pDocumentRedlineManager; +} + +::sw::DocumentRedlineManager& SwDoc::GetDocumentRedlineManager() +{ + return *m_pDocumentRedlineManager; +} + /* Implementations the next Interface here */ /* diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index 233637c34d88..68499060670c 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -27,6 +27,7 @@ #include <annotationmark.hxx> #include <dcontact.hxx> #include <doc.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docary.hxx> #include <xmloff/odffields.hxx> #include <editsh.hxx> @@ -1267,7 +1268,7 @@ void _DelBookmarks( // Copy all Redlines which are in the move area into an array // which holds all position information as offset. // Assignement happens after moving. - SwRedlineTbl& rTbl = (SwRedlineTbl&)pDoc->GetRedlineTbl(); + SwRedlineTbl& rTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); for(sal_uInt16 nCnt = 0; nCnt < rTbl.size(); ++nCnt ) { // Is at position? diff --git a/sw/source/core/doc/doccomp.cxx b/sw/source/core/doc/doccomp.cxx index 33ea33f5f44b..a03c3be42d07 100644 --- a/sw/source/core/doc/doccomp.cxx +++ b/sw/source/core/doc/doccomp.cxx @@ -28,6 +28,7 @@ #include <doc.hxx> #include <IDocumentUndoRedo.hxx> #include <DocumentContentOperationsManager.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docary.hxx> #include <pam.hxx> #include <ndtxt.hxx> @@ -1628,7 +1629,7 @@ void SwCompareData::SetRedlinesToDoc( bool bUseDocInfo ) SwPaM* pTmp = pDelRing; // get the Author / TimeStamp from the "other" document info - sal_uInt16 nAuthor = rDoc.GetRedlineAuthor(); + sal_uInt16 nAuthor = rDoc.getIDocumentRedlineAccess().GetRedlineAuthor(); DateTime aTimeStamp( DateTime::SYSTEM ); SwDocShell *pDocShell(rDoc.GetDocShell()); OSL_ENSURE(pDocShell, "no SwDocShell"); @@ -1652,7 +1653,7 @@ void SwCompareData::SetRedlinesToDoc( bool bUseDocInfo ) if( !aTmp.isEmpty() ) { - nAuthor = rDoc.InsertRedlineAuthor( aTmp ); + nAuthor = rDoc.getIDocumentRedlineAccess().InsertRedlineAuthor( aTmp ); aTimeStamp = aDT; } } @@ -1680,14 +1681,14 @@ void SwCompareData::SetRedlinesToDoc( bool bUseDocInfo ) (pContentNode) ? pContentNode->Len() : 0 ); } - rDoc.DeleteRedline( *pTmp, false, USHRT_MAX ); + rDoc.getIDocumentRedlineAccess().DeleteRedline( *pTmp, false, USHRT_MAX ); if (rDoc.GetIDocumentUndoRedo().DoesUndo()) { SwUndo *const pUndo(new SwUndoCompDoc( *pTmp, false )) ; rDoc.GetIDocumentUndoRedo().AppendUndo(pUndo); } - rDoc.AppendRedline( new SwRangeRedline( aRedlnData, *pTmp ), true ); + rDoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( aRedlnData, *pTmp ), true ); } while( pDelRing != ( pTmp = (SwPaM*)pTmp->GetNext() )); } @@ -1748,7 +1749,7 @@ void SwCompareData::SetRedlinesToDoc( bool bUseDocInfo ) } do { - if( rDoc.AppendRedline( new SwRangeRedline( aRedlnData, *pTmp ), true) && + if( rDoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( aRedlnData, *pTmp ), true) && rDoc.GetIDocumentUndoRedo().DoesUndo()) { SwUndo *const pUndo(new SwUndoCompDoc( *pTmp, true )); @@ -1805,9 +1806,9 @@ long SwDoc::CompareDoc( const SwDoc& rDoc ) SwDoc& rSrcDoc = (SwDoc&)rDoc; bool bSrcModified = rSrcDoc.IsModified(); - RedlineMode_t eSrcRedlMode = rSrcDoc.GetRedlineMode(); - rSrcDoc.SetRedlineMode( nsRedlineMode_t::REDLINE_SHOW_INSERT ); - SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT)); + RedlineMode_t eSrcRedlMode = rSrcDoc.getIDocumentRedlineAccess().GetRedlineMode(); + rSrcDoc.getIDocumentRedlineAccess().SetRedlineMode( nsRedlineMode_t::REDLINE_SHOW_INSERT ); + getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT)); SwCompareData aD0( rSrcDoc ); SwCompareData aD1( *this ); @@ -1818,15 +1819,15 @@ long SwDoc::CompareDoc( const SwDoc& rDoc ) if( nRet ) { - SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | + getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)); aD1.SetRedlinesToDoc( !bDocWasModified ); SetModified(); } - rSrcDoc.SetRedlineMode( eSrcRedlMode ); - SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)); + rSrcDoc.getIDocumentRedlineAccess().SetRedlineMode( eSrcRedlMode ); + getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)); if( !bSrcModified ) rSrcDoc.ResetModified(); @@ -1885,14 +1886,14 @@ sal_uInt16 _SaveMergeRedlines::InsertRedline() SwNodeIndex aSaveNd( pDestRedl->GetPoint()->nNode, -1 ); const sal_Int32 nSaveCnt = pDestRedl->GetPoint()->nContent.GetIndex(); - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); pSrcRedl->GetDoc()->getIDocumentContentOperations().CopyRange( *const_cast<SwPaM*>(static_cast<const SwPaM*>(pSrcRedl)), *pDestRedl->GetPoint(), false ); - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); pDestRedl->SetMark(); ++aSaveNd; @@ -1916,10 +1917,10 @@ sal_uInt16 _SaveMergeRedlines::InsertRedline() sal_uInt16 n = 0; // find the first redline for StartPos - if( !pDoc->GetRedline( *pDStt, &n ) && n ) + if( !pDoc->getIDocumentRedlineAccess().GetRedline( *pDStt, &n ) && n ) --n; - const SwRedlineTbl& rRedlineTbl = pDoc->GetRedlineTbl(); + const SwRedlineTbl& rRedlineTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); for( ; n < rRedlineTbl.size(); ++n ) { SwRangeRedline* pRedl = rRedlineTbl[ n ]; @@ -1958,7 +1959,7 @@ sal_uInt16 _SaveMergeRedlines::InsertRedline() ? new SwUndoCompDoc( *pCpyRedl ) : 0; // now modify doc: append redline, undo (and count) - pDoc->AppendRedline( pCpyRedl, true ); + pDoc->getIDocumentRedlineAccess().AppendRedline( pCpyRedl, true ); if( pUndo ) { pDoc->GetIDocumentUndoRedo().AppendUndo(pUndo); @@ -1993,7 +1994,7 @@ sal_uInt16 _SaveMergeRedlines::InsertRedline() ? new SwUndoCompDoc( *pDestRedl ) : 0; // now modify doc: append redline, undo (and count) - bool bRedlineAccepted = pDoc->AppendRedline( pDestRedl, true ); + bool bRedlineAccepted = pDoc->getIDocumentRedlineAccess().AppendRedline( pDestRedl, true ); if( pUndo ) { pDoc->GetIDocumentUndoRedo().AppendUndo( pUndo ); @@ -2023,9 +2024,9 @@ long SwDoc::MergeDoc( const SwDoc& rDoc ) SwDoc& rSrcDoc = (SwDoc&)rDoc; bool bSrcModified = rSrcDoc.IsModified(); - RedlineMode_t eSrcRedlMode = rSrcDoc.GetRedlineMode(); - rSrcDoc.SetRedlineMode( nsRedlineMode_t::REDLINE_SHOW_DELETE ); - SetRedlineMode( nsRedlineMode_t::REDLINE_SHOW_DELETE ); + RedlineMode_t eSrcRedlMode = rSrcDoc.getIDocumentRedlineAccess().GetRedlineMode(); + rSrcDoc.getIDocumentRedlineAccess().SetRedlineMode( nsRedlineMode_t::REDLINE_SHOW_DELETE ); + getIDocumentRedlineAccess().SetRedlineMode( nsRedlineMode_t::REDLINE_SHOW_DELETE ); SwCompareData aD0( rSrcDoc ); SwCompareData aD1( *this ); @@ -2038,7 +2039,7 @@ long SwDoc::MergeDoc( const SwDoc& rDoc ) // look for all insert redlines from the SourceDoc and determine their position in the DestDoc _SaveMergeRedlines* pRing = 0; - const SwRedlineTbl& rSrcRedlTbl = rSrcDoc.GetRedlineTbl(); + const SwRedlineTbl& rSrcRedlTbl = rSrcDoc.getIDocumentRedlineAccess().GetRedlineTbl(); sal_uLong nEndOfExtra = rSrcDoc.GetNodes().GetEndOfExtras().GetIndex(); sal_uLong nMyEndOfExtra = GetNodes().GetEndOfExtras().GetIndex(); for( sal_uInt16 n = 0; n < rSrcRedlTbl.size(); ++n ) @@ -2064,9 +2065,9 @@ long SwDoc::MergeDoc( const SwDoc& rDoc ) if( pRing ) { // Carry over all into DestDoc - rSrcDoc.SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)); + rSrcDoc.getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)); - SetRedlineMode((RedlineMode_t)( + getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)( nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)); @@ -2083,11 +2084,11 @@ long SwDoc::MergeDoc( const SwDoc& rDoc ) } } - rSrcDoc.SetRedlineMode( eSrcRedlMode ); + rSrcDoc.getIDocumentRedlineAccess().SetRedlineMode( eSrcRedlMode ); if( !bSrcModified ) rSrcDoc.ResetModified(); - SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)); + getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)); GetIDocumentUndoRedo().EndUndo(UNDO_EMPTY, NULL); diff --git a/sw/source/core/doc/doccorr.cxx b/sw/source/core/doc/doccorr.cxx index 8891e1b12bb0..898809912971 100644 --- a/sw/source/core/doc/doccorr.cxx +++ b/sw/source/core/doc/doccorr.cxx @@ -188,7 +188,7 @@ void SwDoc::CorrAbs(const SwNodeIndex& rOldNode, getIDocumentMarkAccess()->correctMarksAbsolute(rOldNode, rNewPos, nOffset); // fix redlines { - SwRedlineTbl& rTbl = *mpRedlineTbl; + SwRedlineTbl& rTbl = getIDocumentRedlineAccess().GetRedlineTbl(); for (sal_uInt16 n = 0; n < rTbl.size(); ) { // is on position ?? @@ -306,7 +306,7 @@ void SwDoc::CorrRel(const SwNodeIndex& rOldNode, getIDocumentMarkAccess()->correctMarksRelative(rOldNode, rNewPos, nOffset); { // fix the Redlines - SwRedlineTbl& rTbl = *mpRedlineTbl; + SwRedlineTbl& rTbl = getIDocumentRedlineAccess().GetRedlineTbl(); SwPosition aNewPos(rNewPos); for( sal_uInt16 n = 0; n < rTbl.size(); ++n ) { diff --git a/sw/source/core/doc/docedt.cxx b/sw/source/core/doc/docedt.cxx index 4e081598720d..8520791fdc38 100644 --- a/sw/source/core/doc/docedt.cxx +++ b/sw/source/core/doc/docedt.cxx @@ -22,6 +22,7 @@ #include <txtftn.hxx> #include <acorrect.hxx> #include <UndoManager.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docsh.hxx> #include <docary.hxx> #include <doctxm.hxx> @@ -228,15 +229,15 @@ _SaveRedlEndPosForRestore::_SaveRedlEndPosForRestore( const SwNodeIndex& rInsIdx { SwNode& rNd = rInsIdx.GetNode(); SwDoc* pDest = rNd.GetDoc(); - if( !pDest->GetRedlineTbl().empty() ) + if( !pDest->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) { sal_uInt16 nFndPos; const SwPosition* pEnd; SwPosition aSrcPos( rInsIdx, SwIndex( rNd.GetCntntNode(), nCnt )); - pDest->GetRedline( aSrcPos, &nFndPos ); + pDest->getIDocumentRedlineAccess().GetRedline( aSrcPos, &nFndPos ); const SwRangeRedline* pRedl; while( nFndPos-- - && *( pEnd = ( pRedl = pDest->GetRedlineTbl()[ nFndPos ] )->End() ) == aSrcPos + && *( pEnd = ( pRedl = pDest->getIDocumentRedlineAccess().GetRedlineTbl()[ nFndPos ] )->End() ) == aSrcPos && *pRedl->Start() < aSrcPos ) { if( !pSavArr ) @@ -798,28 +799,6 @@ void SwDoc::DeleteAutoCorrExceptWord() mpACEWord = 0; } -#define MAX_REDLINE_COUNT 250 - -void SwDoc::checkRedlining(RedlineMode_t& _rReadlineMode) -{ - const SwRedlineTbl& rRedlineTbl = GetRedlineTbl(); - SwEditShell* pEditShell = GetEditShell(); - Window* pParent = pEditShell ? pEditShell->GetWin() : NULL; - if ( pParent && !mbReadlineChecked && rRedlineTbl.size() > MAX_REDLINE_COUNT - && !((_rReadlineMode & nsRedlineMode_t::REDLINE_SHOW_DELETE) == nsRedlineMode_t::REDLINE_SHOW_DELETE) ) - { - MessageDialog aQuery(pParent, "QueryShowChangesDialog", "modules/swriter/ui/queryshowchangesdialog.ui"); - sal_uInt16 nResult = aQuery.Execute(); - mbReadlineChecked = true; - if ( nResult == RET_YES ) - { - sal_Int32 nMode = (sal_Int32)_rReadlineMode; - nMode |= nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE; - _rReadlineMode = (RedlineMode_t)nMode; - } - } -} - void SwDoc::CountWords( const SwPaM& rPaM, SwDocStat& rStat ) const { // This is a modified version of SwDoc::TransliterateText diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx index 38b8f15f5c9b..cf594d229f1a 100644 --- a/sw/source/core/doc/docfmt.cxx +++ b/sw/source/core/doc/docfmt.cxx @@ -1764,7 +1764,7 @@ void SwDoc::SetTxtFmtCollByAutoFmt( const SwPosition& rPos, sal_uInt16 nPoolId, pRedl->SetExtraData( &aExtraData ); //TODO: Undo is still missing! - AppendRedline( pRedl, true ); + getIDocumentRedlineAccess().AppendRedline( pRedl, true ); } SetTxtFmtColl( aPam, GetTxtCollFromPool( nPoolId ) ); @@ -1782,7 +1782,7 @@ void SwDoc::SetFmtItemByAutoFmt( const SwPaM& rPam, const SfxItemSet& rSet ) SwTxtNode* pTNd = rPam.GetPoint()->nNode.GetNode().GetTxtNode(); assert(pTNd); - RedlineMode_t eOld = GetRedlineMode(); + RedlineMode_t eOld = getIDocumentRedlineAccess().GetRedlineMode(); if (mbIsAutoFmtRedline) { @@ -1798,9 +1798,9 @@ void SwDoc::SetFmtItemByAutoFmt( const SwPaM& rPam, const SfxItemSet& rSet ) pRedl->SetExtraData( &aExtraData ); //TODO: Undo is still missing! - AppendRedline( pRedl, true ); + getIDocumentRedlineAccess().AppendRedline( pRedl, true ); - SetRedlineMode_intern( (RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); + getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); } const sal_Int32 nEnd(rPam.End()->nContent.GetIndex()); @@ -1828,7 +1828,7 @@ void SwDoc::SetFmtItemByAutoFmt( const SwPaM& rPam, const SfxItemSet& rSet ) endPam.SetMark(); getIDocumentContentOperations().InsertItemSet(endPam, currentSet, nsSetAttrMode::SETATTR_DEFAULT); - SetRedlineMode_intern( eOld ); + getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } void SwDoc::ChgFmt(SwFmt & rFmt, const SfxItemSet & rSet) diff --git a/sw/source/core/doc/docglbl.cxx b/sw/source/core/doc/docglbl.cxx index 5a94cc808cfa..b74340a7f6f8 100644 --- a/sw/source/core/doc/docglbl.cxx +++ b/sw/source/core/doc/docglbl.cxx @@ -32,6 +32,7 @@ #include <fmtanchr.hxx> #include <doc.hxx> #include <IDocumentUndoRedo.hxx> +#include <IDocumentRedlineAccess.hxx> #include <DocumentSettingManager.hxx> #include <DocumentContentOperationsManager.hxx> #include <docary.hxx> @@ -214,7 +215,7 @@ bool SwDoc::SplitDoc( sal_uInt16 eDocType, const OUString& rPath, bool bOutline, // Deactivate Undo/Redline in any case GetIDocumentUndoRedo().DoUndo(false); - SetRedlineMode_intern( (RedlineMode_t)(GetRedlineMode() & ~nsRedlineMode_t::REDLINE_ON)); + getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)(getIDocumentRedlineAccess().GetRedlineMode() & ~nsRedlineMode_t::REDLINE_ON)); OUString sExt = pFilter->GetSuffixes().getToken(0, ','); if( sExt.isEmpty() ) diff --git a/sw/source/core/doc/doclay.cxx b/sw/source/core/doc/doclay.cxx index e96fb1e06bd5..3595506b482d 100644 --- a/sw/source/core/doc/doclay.cxx +++ b/sw/source/core/doc/doclay.cxx @@ -62,6 +62,7 @@ #include <ndole.hxx> #include <doc.hxx> #include <IDocumentUndoRedo.hxx> +#include <IDocumentRedlineAccess.hxx> #include <DocumentSettingManager.hxx> #include <IDocumentDrawModelAccess.hxx> #include <DocumentContentOperationsManager.hxx> @@ -826,10 +827,10 @@ SwFlyFrmFmt* SwDoc::MakeFlyAndMove( const SwPaM& rPam, const SfxItemSet& rSet, SwPaM* pTmp = (SwPaM*)&rPam; bool bOldFlag = mbCopyIsMove; bool const bOldUndo = GetIDocumentUndoRedo().DoesUndo(); - bool const bOldRedlineMove(IsRedlineMove()); + bool const bOldRedlineMove(getIDocumentRedlineAccess().IsRedlineMove()); mbCopyIsMove = true; GetIDocumentUndoRedo().DoUndo(false); - SetRedlineMove(true); + getIDocumentRedlineAccess().SetRedlineMove(true); do { if( pTmp->HasMark() && *pTmp->GetPoint() != *pTmp->GetMark() ) @@ -838,7 +839,7 @@ SwFlyFrmFmt* SwDoc::MakeFlyAndMove( const SwPaM& rPam, const SfxItemSet& rSet, } pTmp = static_cast<SwPaM*>(pTmp->GetNext()); } while ( &rPam != pTmp ); - SetRedlineMove(bOldRedlineMove); + getIDocumentRedlineAccess().SetRedlineMove(bOldRedlineMove); mbCopyIsMove = bOldFlag; GetIDocumentUndoRedo().DoUndo(bOldUndo); diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx index 3320f61ec013..23ea7e02093d 100644 --- a/sw/source/core/doc/docnew.cxx +++ b/sw/source/core/doc/docnew.cxx @@ -97,6 +97,7 @@ #include <DocumentListsManager.hxx> #include <DocumentOutlineNodesManager.hxx> #include <DocumentContentOperationsManager.hxx> +#include <DocumentRedlineManager.hxx> #include <unochart.hxx> #include <fldbas.hxx> @@ -198,8 +199,9 @@ SwDoc::SwDoc() mpMarkManager(new ::sw::mark::MarkManager(*this)), m_pMetaFieldManager(new ::sw::MetaFieldManager()), m_pDocumentDrawModelManager( new ::sw::DocumentDrawModelManager( *this ) ), + m_pDocumentRedlineManager( new ::sw::DocumentRedlineManager( *this ) ), m_pUndoManager(new ::sw::UndoManager( - boost::shared_ptr<SwNodes>(new SwNodes(this)), *m_pDocumentDrawModelManager, *this, *this)), + boost::shared_ptr<SwNodes>(new SwNodes(this)), *m_pDocumentDrawModelManager, *m_pDocumentRedlineManager, *this)), m_pDocumentSettingManager(new ::sw::DocumentSettingManager(*this)), m_pDocumentChartDataProviderManager( new sw::DocumentChartDataProviderManager( *this ) ), m_pDeviceAccess( new ::sw::DocumentDeviceManager( *this ) ), @@ -239,9 +241,6 @@ SwDoc::SwDoc() mpURLStateChgd( 0 ), mpNumberFormatter( 0 ), mpNumRuleTbl( new SwNumRuleTbl ), - mpRedlineTbl( new SwRedlineTbl ), - mpExtraRedlineTbl ( new SwExtraRedlineTbl ), - mpAutoFmtRedlnComment( 0 ), mpUnoCrsrTbl( new SwUnoCrsrTbl() ), mpPgPViewPrtData( 0 ), mpExtInputRing( 0 ), @@ -251,8 +250,6 @@ SwDoc::SwDoc() mpUnoCallBack(new SwModify(0)), mpGrammarContact(createGrammarContact()), m_pXmlIdRegistry(), - mnAutoFmtRedlnCommentNo( 0 ), - meRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)), mReferenceCount(0), mnLockExpFld( 0 ), mbGlossDoc(false), @@ -272,10 +269,8 @@ SwDoc::SwDoc() mbIsAutoFmtRedline(false), mbOLEPrtNotifyPending(false), mbAllOLENotify(false), - mbIsRedlineMove(false), mbInsOnlyTxtGlssry(false), mbContains_MSVBasic(false), - mbReadlineChecked(false), mbClipBoard( false ), mbColumnSelection( false ), mbIsPrepareSelAll(false), @@ -473,10 +468,11 @@ SwDoc::~SwDoc() mbDtor = true; - delete mpRedlineTbl; - delete mpExtraRedlineTbl, mpExtraRedlineTbl = 0; + //Clear the redline table before the nodes array is destroyed + getIDocumentRedlineAccess().GetRedlineTbl().DeleteAndDestroyAll(); + getIDocumentRedlineAccess().GetExtraRedlineTbl().DeleteAndDestroyAll(); + delete mpUnoCrsrTbl; - delete mpAutoFmtRedlnComment; delete mpUpdtFlds; delete mpACEWord; @@ -696,8 +692,8 @@ void SwDoc::ClearDoc() OSL_ENSURE( !GetDocumentDrawModelManager().GetDrawModel() || !GetDocumentDrawModelManager().GetDrawModel()->GetPage(0)->GetObjCount(), "not all DrawObjects removed from the page" ); - mpRedlineTbl->DeleteAndDestroyAll(); - mpExtraRedlineTbl->DeleteAndDestroyAll(); + getIDocumentRedlineAccess().GetRedlineTbl().DeleteAndDestroyAll(); + getIDocumentRedlineAccess().GetExtraRedlineTbl().DeleteAndDestroyAll(); delete mpACEWord; diff --git a/sw/source/core/doc/docnum.cxx b/sw/source/core/doc/docnum.cxx index b20c6ec2283c..decdb5a7b0a7 100644 --- a/sw/source/core/doc/docnum.cxx +++ b/sw/source/core/doc/docnum.cxx @@ -26,6 +26,7 @@ #include <doc.hxx> #include <IDocumentUndoRedo.hxx> #include <IDocumentListsAccess.hxx> +#include <DocumentRedlineManager.hxx> #include <pam.hxx> #include <ndtxt.hxx> #include <doctxm.hxx> @@ -1784,9 +1785,9 @@ bool SwDoc::MoveParagraph( const SwPaM& rPam, long nOffset, bool bIsOutlMv ) } // Test for Redlining - Can the Selection be moved at all, actually? - if( !IsIgnoreRedline() ) + if( !getIDocumentRedlineAccess().IsIgnoreRedline() ) { - sal_uInt16 nRedlPos = GetRedlinePos( pStt->nNode.GetNode(), nsRedlineType_t::REDLINE_DELETE ); + sal_uInt16 nRedlPos = getIDocumentRedlineAccess().GetRedlinePos( pStt->nNode.GetNode(), nsRedlineType_t::REDLINE_DELETE ); if( USHRT_MAX != nRedlPos ) { SwPosition aStPos( *pStt ), aEndPos( *pEnd ); @@ -1796,9 +1797,9 @@ bool SwDoc::MoveParagraph( const SwPaM& rPam, long nOffset, bool bIsOutlMv ) bool bCheckDel = true; // There is a some Redline Delete Object for the range - for( ; nRedlPos < GetRedlineTbl().size(); ++nRedlPos ) + for( ; nRedlPos < getIDocumentRedlineAccess().GetRedlineTbl().size(); ++nRedlPos ) { - const SwRangeRedline* pTmp = GetRedlineTbl()[ nRedlPos ]; + const SwRangeRedline* pTmp = getIDocumentRedlineAccess().GetRedlineTbl()[ nRedlPos ]; if( !bCheckDel || nsRedlineType_t::REDLINE_DELETE == pTmp->GetType() ) { const SwPosition *pRStt = pTmp->Start(), *pREnd = pTmp->End(); @@ -1806,7 +1807,7 @@ bool SwDoc::MoveParagraph( const SwPaM& rPam, long nOffset, bool bIsOutlMv ) { case POS_COLLIDE_START: case POS_BEHIND: // Pos1 comes after Pos2 - nRedlPos = GetRedlineTbl().size(); + nRedlPos = getIDocumentRedlineAccess().GetRedlineTbl().size(); break; case POS_COLLIDE_END: @@ -1840,13 +1841,13 @@ bool SwDoc::MoveParagraph( const SwPaM& rPam, long nOffset, bool bIsOutlMv ) SwNodeRange aMvRg( pStt->nNode, 0, pEnd->nNode, +1 ); SwRangeRedline* pOwnRedl = 0; - if( IsRedlineOn() ) + if( getIDocumentRedlineAccess().IsRedlineOn() ) { // If the range is completely in the own Redline, we can move it! - sal_uInt16 nRedlPos = GetRedlinePos( pStt->nNode.GetNode(), nsRedlineType_t::REDLINE_INSERT ); + sal_uInt16 nRedlPos = getIDocumentRedlineAccess().GetRedlinePos( pStt->nNode.GetNode(), nsRedlineType_t::REDLINE_INSERT ); if( USHRT_MAX != nRedlPos ) { - SwRangeRedline* pTmp = GetRedlineTbl()[ nRedlPos ]; + SwRangeRedline* pTmp = getIDocumentRedlineAccess().GetRedlineTbl()[ nRedlPos ]; const SwPosition *pRStt = pTmp->Start(), *pREnd = pTmp->End(); SwRangeRedline aTmpRedl( nsRedlineType_t::REDLINE_INSERT, rPam ); const SwCntntNode* pCEndNd = pEnd->nNode.GetNode().GetCntntNode(); @@ -1860,9 +1861,9 @@ bool SwDoc::MoveParagraph( const SwPaM& rPam, long nOffset, bool bIsOutlMv ) : !pREnd->nContent.GetIndex() )) ) { pOwnRedl = pTmp; - if( nRedlPos + 1 < (sal_uInt16)GetRedlineTbl().size() ) + if( nRedlPos + 1 < (sal_uInt16)getIDocumentRedlineAccess().GetRedlineTbl().size() ) { - pTmp = GetRedlineTbl()[ nRedlPos+1 ]; + pTmp = getIDocumentRedlineAccess().GetRedlineTbl()[ nRedlPos+1 ]; if( *pTmp->Start() == *pREnd ) // then don't! pOwnRedl = 0; @@ -1929,9 +1930,9 @@ bool SwDoc::MoveParagraph( const SwPaM& rPam, long nOffset, bool bIsOutlMv ) // All, that are in the to-be-deleted Node, need to be // moved to the next Node SwPosition* pPos; - for( sal_uInt16 n = 0; n < GetRedlineTbl().size(); ++n ) + for( sal_uInt16 n = 0; n < getIDocumentRedlineAccess().GetRedlineTbl().size(); ++n ) { - SwRangeRedline* pTmp = GetRedlineTbl()[ n ]; + SwRangeRedline* pTmp = getIDocumentRedlineAccess().GetRedlineTbl()[ n ]; if( ( pPos = &pTmp->GetBound(true))->nNode == aIdx ) { pPos->nNode++; @@ -1952,12 +1953,12 @@ bool SwDoc::MoveParagraph( const SwPaM& rPam, long nOffset, bool bIsOutlMv ) rOrigPam.GetPoint()->nNode++; rOrigPam.GetPoint()->nContent.Assign( rOrigPam.GetCntntNode(), 0 ); - RedlineMode_t eOld = GetRedlineMode(); - checkRedlining(eOld); + RedlineMode_t eOld = getIDocumentRedlineAccess().GetRedlineMode(); + GetDocumentRedlineManager().checkRedlining(eOld); if (GetIDocumentUndoRedo().DoesUndo()) { // Still NEEDS to be optimized (even after 14 years) - SetRedlineMode( + getIDocumentRedlineAccess().SetRedlineMode( (RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)); SwUndo *const pUndo(new SwUndoRedlineDelete(aPam, UNDO_DELETE)); GetIDocumentUndoRedo().AppendUndo(pUndo); @@ -1971,10 +1972,10 @@ bool SwDoc::MoveParagraph( const SwPaM& rPam, long nOffset, bool bIsOutlMv ) aPam.GetBound(true).nContent.Assign( NULL, 0 ); aPam.GetBound(false).nContent.Assign( NULL, 0 ); - AppendRedline( pNewRedline, true ); + getIDocumentRedlineAccess().AppendRedline( pNewRedline, true ); // Still NEEDS to be optimized! - SetRedlineMode( eOld ); + getIDocumentRedlineAccess().SetRedlineMode( eOld ); GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL ); SetModified(); @@ -1982,10 +1983,10 @@ bool SwDoc::MoveParagraph( const SwPaM& rPam, long nOffset, bool bIsOutlMv ) } } - if( !pOwnRedl && !IsIgnoreRedline() && !GetRedlineTbl().empty() ) + if( !pOwnRedl && !getIDocumentRedlineAccess().IsIgnoreRedline() && !getIDocumentRedlineAccess().GetRedlineTbl().empty() ) { SwPaM aTemp(aIdx); - SplitRedline(aTemp); + getIDocumentRedlineAccess().SplitRedline(aTemp); } sal_uLong nRedlSttNd(0), nRedlEndNd(0); diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx index 43a5aad5c31d..236dd16f4963 100644 --- a/sw/source/core/doc/docredln.cxx +++ b/sw/source/core/doc/docredln.cxx @@ -29,6 +29,7 @@ #include <docredln.hxx> #include <IDocumentUndoRedo.hxx> #include <DocumentContentOperationsManager.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docary.hxx> #include <ndtxt.hxx> #include <redline.hxx> @@ -49,82 +50,10 @@ TYPEINIT1(SwRedlineHint, SfxHint); #ifdef DBG_UTIL - #define _ERROR_PREFIX "redline table corrupted: " - - // helper function for lcl_CheckRedline - // 1. make sure that pPos->nContent points into pPos->nNode - // (or into the 'special' no-content-node-IndexReg) - // 2. check that position is valid and doesn't point behind text - static void lcl_CheckPosition( const SwPosition* pPos ) - { - SwPosition aComparePos( *pPos ); - aComparePos.nContent.Assign( - aComparePos.nNode.GetNode().GetCntntNode(), 0 ); - OSL_ENSURE( pPos->nContent.GetIdxReg() == - aComparePos.nContent.GetIdxReg(), - _ERROR_PREFIX "illegal position" ); - - SwTxtNode* pTxtNode = pPos->nNode.GetNode().GetTxtNode(); - if( pTxtNode == NULL ) - { - OSL_ENSURE( pPos->nContent == 0, - _ERROR_PREFIX "non-text-node with content" ); - } - else - { - OSL_ENSURE( pPos->nContent >= 0 && - pPos->nContent <= pTxtNode->Len(), - _ERROR_PREFIX "index behind text" ); - } - } - - static void lcl_CheckPam( const SwPaM* pPam ) - { - OSL_ENSURE( pPam != NULL, _ERROR_PREFIX "illegal argument" ); - lcl_CheckPosition( pPam->GetPoint() ); - lcl_CheckPosition( pPam->GetMark() ); - } - - // check validity of the redline table. Checks redline bounds, and make - // sure the redlines are sorted and non-overlapping. - static void lcl_CheckRedline( const SwDoc* pDoc ) - { - const SwRedlineTbl& rTbl = pDoc->GetRedlineTbl(); - - // verify valid redline positions - for( sal_uInt16 i = 0; i < rTbl.size(); ++i ) - lcl_CheckPam( rTbl[ i ] ); - - for( sal_uInt16 j = 0; j < rTbl.size(); ++j ) - { - // check for empty redlines - OSL_ENSURE( ( *(rTbl[j]->GetPoint()) != *(rTbl[j]->GetMark()) ) || - ( rTbl[j]->GetContentIdx() != NULL ), - _ERROR_PREFIX "empty redline" ); - } - - // verify proper redline sorting - for( sal_uInt16 n = 1; n < rTbl.size(); ++n ) - { - const SwRangeRedline* pPrev = rTbl[ n-1 ]; - const SwRangeRedline* pCurrent = rTbl[ n ]; - - // check redline sorting - SAL_WARN_IF( *pPrev->Start() > *pCurrent->Start(), "sw", - _ERROR_PREFIX "not sorted correctly" ); - - // check for overlapping redlines - SAL_WARN_IF( *pPrev->End() > *pCurrent->Start(), "sw", - _ERROR_PREFIX "overlapping redlines" ); - } - } - - #define _CHECK_REDLINE( pDoc ) lcl_CheckRedline( pDoc ); - void sw_DebugRedline( const SwDoc* pDoc ) { static sal_uInt16 nWatch = 0; - const SwRedlineTbl& rTbl = pDoc->GetRedlineTbl(); + const SwRedlineTbl& rTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); for( sal_uInt16 n = 0; n < rTbl.size(); ++n ) { sal_uInt16 nDummy = 0; @@ -137,127 +66,14 @@ TYPEINIT1(SwRedlineHint, SfxHint); } } -#else - - #define _CHECK_REDLINE( pDoc ) - #endif -RedlineMode_t SwDoc::GetRedlineMode() const -{ - return meRedlineMode; -} - -void SwDoc::SetRedlineMode( RedlineMode_t eMode ) -{ - if( meRedlineMode != eMode ) - { - if( (nsRedlineMode_t::REDLINE_SHOW_MASK & meRedlineMode) != (nsRedlineMode_t::REDLINE_SHOW_MASK & eMode) - || 0 == (nsRedlineMode_t::REDLINE_SHOW_MASK & eMode) ) - { - bool bSaveInXMLImportFlag = IsInXMLImport(); - SetInXMLImport( false ); - // and then hide/display everything - void (SwRangeRedline::*pFnc)( sal_uInt16 ) = 0; - - switch( nsRedlineMode_t::REDLINE_SHOW_MASK & eMode ) - { - case nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE : - pFnc = &SwRangeRedline::Show; - break; - case nsRedlineMode_t::REDLINE_SHOW_INSERT: - pFnc = &SwRangeRedline::Hide; - break; - case nsRedlineMode_t::REDLINE_SHOW_DELETE: - pFnc = &SwRangeRedline::ShowOriginal; - break; - - default: - pFnc = &SwRangeRedline::Hide; - eMode = (RedlineMode_t)(eMode | nsRedlineMode_t::REDLINE_SHOW_INSERT); - break; - } - - _CHECK_REDLINE( this ) - - if( pFnc ) - for( sal_uInt16 nLoop = 1; nLoop <= 2; ++nLoop ) - for( sal_uInt16 i = 0; i < mpRedlineTbl->size(); ++i ) - ((*mpRedlineTbl)[ i ]->*pFnc)( nLoop ); - _CHECK_REDLINE( this ) - SetInXMLImport( bSaveInXMLImportFlag ); - } - meRedlineMode = eMode; - SetModified(); - } - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -bool SwDoc::IsRedlineOn() const -{ - return IDocumentRedlineAccess::IsRedlineOn(meRedlineMode); -} - -bool SwDoc::IsIgnoreRedline() const -{ - return (nsRedlineMode_t::REDLINE_IGNORE & meRedlineMode); -} - -void SwDoc::SetRedlineMode_intern(RedlineMode_t eMode) -{ - meRedlineMode = eMode; -} - -const SwRedlineTbl& SwDoc::GetRedlineTbl() const -{ - return *mpRedlineTbl; -} - -const SwExtraRedlineTbl& SwDoc::GetExtraRedlineTbl() const -{ - return *mpExtraRedlineTbl; -} SwExtraRedlineTbl::~SwExtraRedlineTbl() { DeleteAndDestroyAll(); } -SwExtraRedlineTbl& SwDoc::GetExtraRedlineTbl() -{ - return *mpExtraRedlineTbl; -} - -bool SwDoc::HasExtraRedlineTbl() const -{ - return mpExtraRedlineTbl ? true : false; -} - -bool SwDoc::IsRedlineMove() const -{ - return mbIsRedlineMove; -} - -void SwDoc::SetRedlineMove(bool bFlag) -{ - mbIsRedlineMove = bFlag; -} - -const uno::Sequence <sal_Int8>& SwDoc::GetRedlinePassword() const -{ - return maRedlinePasswd; -} - -inline bool IsPrevPos( const SwPosition rPos1, const SwPosition rPos2 ) -{ - const SwCntntNode* pCNd; - return 0 == rPos2.nContent.GetIndex() && - rPos2.nNode.GetIndex() - 1 == rPos1.nNode.GetIndex() && - 0 != ( pCNd = rPos1.nNode.GetNode().GetCntntNode() ) && - rPos1.nContent.GetIndex() == pCNd->Len(); -} - #if OSL_DEBUG_LEVEL > 0 bool CheckPosition( const SwPosition* pStt, const SwPosition* pEnd ) { @@ -284,1234 +100,9 @@ bool CheckPosition( const SwPosition* pStt, const SwPosition* pEnd ) } #endif -/* -Text means Text not "polluted" by Redlines. - -Behaviour of Insert-Redline: - - in the Text - insert Redline Object - - in InsertRedline (own) - ignore, existing is extended - - in InsertRedline (others) - split up InsertRedline and - insert Redline Object - - in DeleteRedline - split up DeleteRedline or - move at the end/beginning - -Behaviour of Delete-Redline: - - in the Text - insert Redline Object - - in DeleteRedline (own/others) - ignore - - in InsertRedline (own) - ignore, but delete character - - in InsertRedline (others) - split up InsertRedline and - insert Redline Object - - Text and own Insert overlap - delete Text in the own Insert, - extend in the other Text - (up to the Insert!) - - Text and other Insert overlap - insert Redline Object, the - other Insert is overlapped by - the Delete -*/ -bool SwDoc::AppendRedline( SwRangeRedline* pNewRedl, bool bCallDelete ) -{ - bool bMerged = false; - _CHECK_REDLINE( this ) - - if (IsRedlineOn() && !IsShowOriginal(meRedlineMode)) - { - pNewRedl->InvalidateRange(); - - if( mbIsAutoFmtRedline ) - { - pNewRedl->SetAutoFmtFlag(); - if( mpAutoFmtRedlnComment && !mpAutoFmtRedlnComment->isEmpty() ) - { - pNewRedl->SetComment( *mpAutoFmtRedlnComment ); - pNewRedl->SetSeqNo( mnAutoFmtRedlnCommentNo ); - } - } - - SwPosition* pStt = pNewRedl->Start(), - * pEnd = pStt == pNewRedl->GetPoint() ? pNewRedl->GetMark() - : pNewRedl->GetPoint(); - { - SwTxtNode* pTxtNode = pStt->nNode.GetNode().GetTxtNode(); - if( pTxtNode == NULL ) - { - if( pStt->nContent > 0 ) - { - OSL_ENSURE( false, "Redline start: non-text-node with content" ); - pStt->nContent = 0; - } - } - else - { - if( pStt->nContent > pTxtNode->Len() ) - { - OSL_ENSURE( false, "Redline start: index behind text" ); - pStt->nContent = pTxtNode->Len(); - } - } - pTxtNode = pEnd->nNode.GetNode().GetTxtNode(); - if( pTxtNode == NULL ) - { - if( pEnd->nContent > 0 ) - { - OSL_ENSURE( false, "Redline end: non-text-node with content" ); - pEnd->nContent = 0; - } - } - else - { - if( pEnd->nContent > pTxtNode->Len() ) - { - OSL_ENSURE( false, "Redline end: index behind text" ); - pEnd->nContent = pTxtNode->Len(); - } - } - } - if( ( *pStt == *pEnd ) && - ( pNewRedl->GetContentIdx() == NULL ) ) - { // Do not insert empty redlines - delete pNewRedl; - return false; - } - bool bCompress = false; - sal_uInt16 n = 0; - // look up the first Redline for the starting position - if( !GetRedline( *pStt, &n ) && n ) - --n; - bool bDec = false; - - for( ; pNewRedl && n < mpRedlineTbl->size(); bDec ? n : ++n ) - { - bDec = false; - - SwRangeRedline* pRedl = (*mpRedlineTbl)[ n ]; - SwPosition* pRStt = pRedl->Start(), - * pREnd = pRStt == pRedl->GetPoint() ? pRedl->GetMark() - : pRedl->GetPoint(); - - // #i8518# remove empty redlines while we're at it - if( ( *pRStt == *pREnd ) && - ( pRedl->GetContentIdx() == NULL ) ) - { - mpRedlineTbl->DeleteAndDestroy(n); - continue; - } - - SwComparePosition eCmpPos = ComparePosition( *pStt, *pEnd, *pRStt, *pREnd ); - - switch( pNewRedl->GetType() ) - { - case nsRedlineType_t::REDLINE_INSERT: - switch( pRedl->GetType() ) - { - case nsRedlineType_t::REDLINE_INSERT: - if( pRedl->IsOwnRedline( *pNewRedl ) ) - { - bool bDelete = false; - - // Merge if applicable? - if( (( POS_BEHIND == eCmpPos && - IsPrevPos( *pREnd, *pStt ) ) || - ( POS_COLLIDE_START == eCmpPos ) || - ( POS_OVERLAP_BEHIND == eCmpPos ) ) && - pRedl->CanCombine( *pNewRedl ) && - ( n+1 >= (sal_uInt16)mpRedlineTbl->size() || - ( *(*mpRedlineTbl)[ n+1 ]->Start() >= *pEnd && - *(*mpRedlineTbl)[ n+1 ]->Start() != *pREnd ) ) ) - { - pRedl->SetEnd( *pEnd, pREnd ); - if( !pRedl->HasValidRange() ) - { - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl ); - } - - bMerged = true; - bDelete = true; - } - else if( (( POS_BEFORE == eCmpPos && - IsPrevPos( *pEnd, *pRStt ) ) || - ( POS_COLLIDE_END == eCmpPos ) || - ( POS_OVERLAP_BEFORE == eCmpPos ) ) && - pRedl->CanCombine( *pNewRedl ) && - ( !n || - *(*mpRedlineTbl)[ n-1 ]->End() != *pRStt )) - { - pRedl->SetStart( *pStt, pRStt ); - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl ); - - bMerged = true; - bDelete = true; - } - else if ( POS_OUTSIDE == eCmpPos ) - { - // own insert-over-insert redlines: - // just scrap the inside ones - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - } - else if( POS_OVERLAP_BEHIND == eCmpPos ) - { - *pStt = *pREnd; - if( ( *pStt == *pEnd ) && - ( pNewRedl->GetContentIdx() == NULL ) ) - bDelete = true; - } - else if( POS_OVERLAP_BEFORE == eCmpPos ) - { - *pEnd = *pRStt; - if( ( *pStt == *pEnd ) && - ( pNewRedl->GetContentIdx() == NULL ) ) - bDelete = true; - } - else if( POS_INSIDE == eCmpPos || POS_EQUAL == eCmpPos) - bDelete = true; - - if( bDelete ) - { - delete pNewRedl, pNewRedl = 0; - bCompress = true; - } - } - else if( POS_INSIDE == eCmpPos ) - { - // split up - if( *pEnd != *pREnd ) - { - SwRangeRedline* pCpy = new SwRangeRedline( *pRedl ); - pCpy->SetStart( *pEnd ); - mpRedlineTbl->Insert( pCpy ); - } - pRedl->SetEnd( *pStt, pREnd ); - if( ( *pStt == *pRStt ) && - ( pRedl->GetContentIdx() == NULL ) ) - { - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - } - else if( !pRedl->HasValidRange() ) - { - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl ); - } - } - else if ( POS_OUTSIDE == eCmpPos ) - { - // handle overlapping redlines in broken documents - - // split up the new redline, since it covers the - // existing redline. Insert the first part, and - // progress with the remainder as usual - SwRangeRedline* pSplit = new SwRangeRedline( *pNewRedl ); - pSplit->SetEnd( *pRStt ); - pNewRedl->SetStart( *pREnd ); - mpRedlineTbl->Insert( pSplit ); - if( *pStt == *pEnd && pNewRedl->GetContentIdx() == NULL ) - { - delete pNewRedl; - pNewRedl = 0; - bCompress = true; - } - } - else if ( POS_OVERLAP_BEHIND == eCmpPos ) - { - // handle overlapping redlines in broken documents - pNewRedl->SetStart( *pREnd ); - } - else if ( POS_OVERLAP_BEFORE == eCmpPos ) - { - // handle overlapping redlines in broken documents - *pEnd = *pRStt; - if( ( *pStt == *pEnd ) && - ( pNewRedl->GetContentIdx() == NULL ) ) - { - delete pNewRedl; - pNewRedl = 0; - bCompress = true; - } - } - break; - case nsRedlineType_t::REDLINE_DELETE: - if( POS_INSIDE == eCmpPos ) - { - // split up - if( *pEnd != *pREnd ) - { - SwRangeRedline* pCpy = new SwRangeRedline( *pRedl ); - pCpy->SetStart( *pEnd ); - mpRedlineTbl->Insert( pCpy ); - } - pRedl->SetEnd( *pStt, pREnd ); - if( ( *pStt == *pRStt ) && - ( pRedl->GetContentIdx() == NULL ) ) - { - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - } - else if( !pRedl->HasValidRange() ) - { - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl, n ); - } - } - else if ( POS_OUTSIDE == eCmpPos ) - { - // handle overlapping redlines in broken documents - - // split up the new redline, since it covers the - // existing redline. Insert the first part, and - // progress with the remainder as usual - SwRangeRedline* pSplit = new SwRangeRedline( *pNewRedl ); - pSplit->SetEnd( *pRStt ); - pNewRedl->SetStart( *pREnd ); - mpRedlineTbl->Insert( pSplit ); - if( *pStt == *pEnd && pNewRedl->GetContentIdx() == NULL ) - { - delete pNewRedl; - pNewRedl = 0; - bCompress = true; - } - } - else if ( POS_EQUAL == eCmpPos ) - { - // handle identical redlines in broken documents - // delete old (delete) redline - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - } - else if ( POS_OVERLAP_BEHIND == eCmpPos ) - { // Another workaround for broken redlines - pNewRedl->SetStart( *pREnd ); - } - break; - case nsRedlineType_t::REDLINE_FORMAT: - switch( eCmpPos ) - { - case POS_OVERLAP_BEFORE: - pRedl->SetStart( *pEnd, pRStt ); - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl, n ); - bDec = true; - break; - - case POS_OVERLAP_BEHIND: - pRedl->SetEnd( *pStt, pREnd ); - if( *pStt == *pRStt && pRedl->GetContentIdx() == NULL ) - { - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - } - break; - - case POS_EQUAL: - case POS_OUTSIDE: - // Overlaps the current one completely or has the - // same dimension, delete the old one - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - break; - - case POS_INSIDE: - // Overlaps the current one completely, - // split or shorten the new one - if( *pEnd != *pREnd ) - { - if( *pEnd != *pRStt ) - { - SwRangeRedline* pNew = new SwRangeRedline( *pRedl ); - pNew->SetStart( *pEnd ); - pRedl->SetEnd( *pStt, pREnd ); - if( *pStt == *pRStt && pRedl->GetContentIdx() == NULL ) - mpRedlineTbl->DeleteAndDestroy( n ); - AppendRedline( pNew, bCallDelete ); - n = 0; // re-initialize - bDec = true; - } - } - else - pRedl->SetEnd( *pStt, pREnd ); - break; - default: - break; - } - break; - default: - break; - } - break; - - case nsRedlineType_t::REDLINE_DELETE: - switch( pRedl->GetType() ) - { - case nsRedlineType_t::REDLINE_DELETE: - switch( eCmpPos ) - { - case POS_OUTSIDE: - { - // Overlaps the current one completely, - // split the new one - if( *pEnd != *pREnd ) - { - SwRangeRedline* pNew = new SwRangeRedline( *pNewRedl ); - pNew->SetStart( *pREnd ); - pNewRedl->SetEnd( *pRStt, pEnd ); - AppendRedline( pNew, bCallDelete ); - n = 0; // re-initialize - bDec = true; - } - else - pNewRedl->SetEnd( *pRStt, pEnd ); - } - break; - - case POS_INSIDE: - case POS_EQUAL: - delete pNewRedl, pNewRedl = 0; - bCompress = true; - break; - - case POS_OVERLAP_BEFORE: - case POS_OVERLAP_BEHIND: - if( pRedl->IsOwnRedline( *pNewRedl ) && - pRedl->CanCombine( *pNewRedl )) - { - // If that's the case we can merge it, meaning - // the new one covers this well - if( POS_OVERLAP_BEHIND == eCmpPos ) - pNewRedl->SetStart( *pRStt, pStt ); - else - pNewRedl->SetEnd( *pREnd, pEnd ); - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - } - else if( POS_OVERLAP_BEHIND == eCmpPos ) - pNewRedl->SetStart( *pREnd, pStt ); - else - pNewRedl->SetEnd( *pRStt, pEnd ); - break; - - case POS_COLLIDE_START: - case POS_COLLIDE_END: - if( pRedl->IsOwnRedline( *pNewRedl ) && - pRedl->CanCombine( *pNewRedl ) ) - { - if( IsHideChanges( meRedlineMode )) - { - // Before we can merge, we make it visible! - // We insert temporarily so that pNew is - // also dealt with when moving the indices. - mpRedlineTbl->Insert( pNewRedl ); - pRedl->Show(); - mpRedlineTbl->Remove( pNewRedl ); - pRStt = pRedl->Start(); - pREnd = pRedl->End(); - } - - // If that's the case we can merge it, meaning - // the new one covers this well - if( POS_COLLIDE_START == eCmpPos ) - pNewRedl->SetStart( *pRStt, pStt ); - else - pNewRedl->SetEnd( *pREnd, pEnd ); - - // delete current (below), and restart process with - // previous - sal_uInt16 nToBeDeleted = n; - bDec = true; - - if( *(pNewRedl->Start()) <= *pREnd ) - { - // Whoooah, we just extended the new 'redline' - // beyond previous redlines, so better start - // again. Of course this is not supposed to - // happen, and in an ideal world it doesn't, - // but unfortunately this code is buggy and - // totally rotten so it does happen and we - // better fix it. - n = 0; - bDec = true; - } - - mpRedlineTbl->DeleteAndDestroy( nToBeDeleted ); - } - break; - default: - break; - } - break; - - case nsRedlineType_t::REDLINE_INSERT: - { - // b62341295: Do not throw away redlines - // even if they are not allowed to be combined - RedlineMode_t eOld = meRedlineMode; - if( !( eOld & nsRedlineMode_t::REDLINE_DONTCOMBINE_REDLINES ) && - pRedl->IsOwnRedline( *pNewRedl ) ) - { - - // Set to NONE, so that the Delete::Redo merges the Redline data correctly! - // The ShowMode needs to be retained! - meRedlineMode = (RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE)); - switch( eCmpPos ) - { - case POS_EQUAL: - bCompress = true; - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - // no break! - - case POS_INSIDE: - if( bCallDelete ) - { - meRedlineMode = (RedlineMode_t)(meRedlineMode | nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES); - - // DeleteAndJoin does not yield the - // desired result if there is no paragraph to - // join with, i.e. at the end of the document. - // For this case, we completely delete the - // paragraphs (if, of course, we also start on - // a paragraph boundary). - if( (pStt->nContent == 0) && - pEnd->nNode.GetNode().IsEndNode() ) - { - pEnd->nNode--; - pEnd->nContent.Assign( - pEnd->nNode.GetNode().GetTxtNode(), 0); - getIDocumentContentOperations().DelFullPara( *pNewRedl ); - } - else - getIDocumentContentOperations().DeleteAndJoin( *pNewRedl ); - - bCompress = true; - } - delete pNewRedl, pNewRedl = 0; - break; - - case POS_OUTSIDE: - { - mpRedlineTbl->Remove( n ); - bDec = true; - // We insert temporarily so that pNew is - // also dealt with when moving the indices. - if( bCallDelete ) - { - mpRedlineTbl->Insert( pNewRedl ); - getIDocumentContentOperations().DeleteAndJoin( *pRedl ); - if( !mpRedlineTbl->Remove( pNewRedl ) ) - pNewRedl = 0; - } - delete pRedl; - } - break; - - case POS_OVERLAP_BEFORE: - { - SwPaM aPam( *pRStt, *pEnd ); - - if( *pEnd == *pREnd ) - mpRedlineTbl->DeleteAndDestroy( n ); - else - { - pRedl->SetStart( *pEnd, pRStt ); - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl, n ); - } - - if( bCallDelete ) - { - // We insert temporarily so that pNew is - // also dealt with when moving the indices. - mpRedlineTbl->Insert( pNewRedl ); - getIDocumentContentOperations().DeleteAndJoin( aPam ); - if( !mpRedlineTbl->Remove( pNewRedl ) ) - pNewRedl = 0; - n = 0; // re-initialize - } - bDec = true; - } - break; - - case POS_OVERLAP_BEHIND: - { - SwPaM aPam( *pStt, *pREnd ); - - if( *pStt == *pRStt ) - { - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - } - else - pRedl->SetEnd( *pStt, pREnd ); - - if( bCallDelete ) - { - // We insert temporarily so that pNew is - // also dealt with when moving the indices. - mpRedlineTbl->Insert( pNewRedl ); - getIDocumentContentOperations().DeleteAndJoin( aPam ); - if( !mpRedlineTbl->Remove( pNewRedl ) ) - pNewRedl = 0; - n = 0; // re-initialize - bDec = true; - } - } - break; - default: - break; - } - - meRedlineMode = eOld; - } - else - { - // it may be necessary to split the existing redline in - // two. In this case, pRedl will be changed to cover - // only part of it's former range, and pNew will cover - // the remainder. - SwRangeRedline* pNew = 0; - - switch( eCmpPos ) - { - case POS_EQUAL: - { - pRedl->PushData( *pNewRedl ); - delete pNewRedl, pNewRedl = 0; - if( IsHideChanges( meRedlineMode )) - pRedl->Hide(); - bCompress = true; - } - break; - - case POS_INSIDE: - { - if( *pRStt == *pStt ) - { - // #i97421# - // redline w/out extent loops - if (*pStt != *pEnd) - { - pNewRedl->PushData( *pRedl, false ); - pRedl->SetStart( *pEnd, pRStt ); - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl, n ); - bDec = true; - } - } - else - { - pNewRedl->PushData( *pRedl, false ); - if( *pREnd != *pEnd ) - { - pNew = new SwRangeRedline( *pRedl ); - pNew->SetStart( *pEnd ); - } - pRedl->SetEnd( *pStt, pREnd ); - if( !pRedl->HasValidRange() ) - { - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl, n ); - } - } - } - break; - - case POS_OUTSIDE: - { - pRedl->PushData( *pNewRedl ); - if( *pEnd == *pREnd ) - pNewRedl->SetEnd( *pRStt, pEnd ); - else - { - pNew = new SwRangeRedline( *pNewRedl ); - pNew->SetEnd( *pRStt ); - pNewRedl->SetStart( *pREnd, pStt ); - } - bCompress = true; - } - break; - - case POS_OVERLAP_BEFORE: - { - if( *pEnd == *pREnd ) - { - pRedl->PushData( *pNewRedl ); - pNewRedl->SetEnd( *pRStt, pEnd ); - if( IsHideChanges( meRedlineMode )) - { - mpRedlineTbl->Insert( pNewRedl ); - pRedl->Hide(); - mpRedlineTbl->Remove( pNewRedl ); - } - } - else - { - pNew = new SwRangeRedline( *pRedl ); - pNew->PushData( *pNewRedl ); - pNew->SetEnd( *pEnd ); - pNewRedl->SetEnd( *pRStt, pEnd ); - pRedl->SetStart( *pNew->End(), pRStt ) ; - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl ); - bDec = true; - } - } - break; - - case POS_OVERLAP_BEHIND: - { - if( *pStt == *pRStt ) - { - pRedl->PushData( *pNewRedl ); - pNewRedl->SetStart( *pREnd, pStt ); - if( IsHideChanges( meRedlineMode )) - { - mpRedlineTbl->Insert( pNewRedl ); - pRedl->Hide(); - mpRedlineTbl->Remove( pNewRedl ); - } - } - else - { - pNew = new SwRangeRedline( *pRedl ); - pNew->PushData( *pNewRedl ); - pNew->SetStart( *pStt ); - pNewRedl->SetStart( *pREnd, pStt ); - pRedl->SetEnd( *pNew->Start(), pREnd ); - if( !pRedl->HasValidRange() ) - { - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl ); - } - } - } - break; - default: - break; - } - - // insert the pNew part (if it exists) - if( pNew ) - { - mpRedlineTbl->Insert( pNew ); - - // pNew must be deleted if Insert() wasn't - // successful. But that can't happen, since pNew is - // part of the original pRedl redline. - // OSL_ENSURE( bRet, "Can't insert existing redline?" ); - - // restart (now with pRedl being split up) - n = 0; - bDec = true; - } - } - } - break; - - case nsRedlineType_t::REDLINE_FORMAT: - switch( eCmpPos ) - { - case POS_OVERLAP_BEFORE: - pRedl->SetStart( *pEnd, pRStt ); - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl, n ); - bDec = true; - break; - - case POS_OVERLAP_BEHIND: - pRedl->SetEnd( *pStt, pREnd ); - break; - - case POS_EQUAL: - case POS_OUTSIDE: - // Overlaps the current one completely or has the - // same dimension, delete the old one - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - break; - - case POS_INSIDE: - // Overlaps the current one completely, - // split or shorten the new one - if( *pEnd != *pREnd ) - { - if( *pEnd != *pRStt ) - { - SwRangeRedline* pNew = new SwRangeRedline( *pRedl ); - pNew->SetStart( *pEnd ); - pRedl->SetEnd( *pStt, pREnd ); - if( ( *pStt == *pRStt ) && - ( pRedl->GetContentIdx() == NULL ) ) - mpRedlineTbl->DeleteAndDestroy( n ); - AppendRedline( pNew, bCallDelete ); - n = 0; // re-initialize - bDec = true; - } - } - else - pRedl->SetEnd( *pStt, pREnd ); - break; - default: - break; - } - break; - default: - break; - } - break; - - case nsRedlineType_t::REDLINE_FORMAT: - switch( pRedl->GetType() ) - { - case nsRedlineType_t::REDLINE_INSERT: - case nsRedlineType_t::REDLINE_DELETE: - switch( eCmpPos ) - { - case POS_OVERLAP_BEFORE: - pNewRedl->SetEnd( *pRStt, pEnd ); - break; - - case POS_OVERLAP_BEHIND: - pNewRedl->SetStart( *pREnd, pStt ); - break; - - case POS_EQUAL: - case POS_INSIDE: - delete pNewRedl, pNewRedl = 0; - break; - - case POS_OUTSIDE: - // Overlaps the current one completely, - // split or shorten the new one - if( *pEnd != *pREnd ) - { - if( *pEnd != *pRStt ) - { - SwRangeRedline* pNew = new SwRangeRedline( *pNewRedl ); - pNew->SetStart( *pREnd ); - pNewRedl->SetEnd( *pRStt, pEnd ); - AppendRedline( pNew, bCallDelete ); - n = 0; // re-initialize - bDec = true; - } - } - else - pNewRedl->SetEnd( *pRStt, pEnd ); - break; - default: - break; - } - break; - case nsRedlineType_t::REDLINE_FORMAT: - switch( eCmpPos ) - { - case POS_OUTSIDE: - case POS_EQUAL: - { - // Overlaps the current one completely or has the - // same dimension, delete the old one - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - } - break; - - case POS_INSIDE: - if( pRedl->IsOwnRedline( *pNewRedl ) && - pRedl->CanCombine( *pNewRedl )) - // own one can be ignored completely - delete pNewRedl, pNewRedl = 0; - - else if( *pREnd == *pEnd ) - // or else only shorten the current one - pRedl->SetEnd( *pStt, pREnd ); - else if( *pRStt == *pStt ) - { - // or else only shorten the current one - pRedl->SetStart( *pEnd, pRStt ); - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl, n ); - bDec = true; - } - else - { - // If it lies completely within the current one - // we need to split it - SwRangeRedline* pNew = new SwRangeRedline( *pRedl ); - pNew->SetStart( *pEnd ); - pRedl->SetEnd( *pStt, pREnd ); - AppendRedline( pNew, bCallDelete ); - n = 0; // re-initialize - bDec = true; - } - break; - - case POS_OVERLAP_BEFORE: - case POS_OVERLAP_BEHIND: - if( pRedl->IsOwnRedline( *pNewRedl ) && - pRedl->CanCombine( *pNewRedl )) - { - // If that's the case we can merge it, meaning - // the new one covers this well - if( POS_OVERLAP_BEHIND == eCmpPos ) - pNewRedl->SetStart( *pRStt, pStt ); - else - pNewRedl->SetEnd( *pREnd, pEnd ); - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = false; - } - else if( POS_OVERLAP_BEHIND == eCmpPos ) - pNewRedl->SetStart( *pREnd, pStt ); - else - pNewRedl->SetEnd( *pRStt, pEnd ); - break; - - case POS_COLLIDE_END: - if( pRedl->IsOwnRedline( *pNewRedl ) && - pRedl->CanCombine( *pNewRedl ) && n && - *(*mpRedlineTbl)[ n-1 ]->End() < *pStt ) - { - // If that's the case we can merge it, meaning - // the new one covers this well - pNewRedl->SetEnd( *pREnd, pEnd ); - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - } - break; - case POS_COLLIDE_START: - if( pRedl->IsOwnRedline( *pNewRedl ) && - pRedl->CanCombine( *pNewRedl ) && - n+1 < (sal_uInt16)mpRedlineTbl->size() && - *(*mpRedlineTbl)[ n+1 ]->Start() < *pEnd ) - { - // If that's the case we can merge it, meaning - // the new one covers this well - pNewRedl->SetStart( *pRStt, pStt ); - mpRedlineTbl->DeleteAndDestroy( n ); - bDec = true; - } - break; - default: - break; - } - break; - default: - break; - } - break; - - case nsRedlineType_t::REDLINE_FMTCOLL: - // How should we behave here? - // insert as is - break; - default: - break; - } - } - - if( pNewRedl ) - { - if( ( *pStt == *pEnd ) && - ( pNewRedl->GetContentIdx() == NULL ) ) - { // Do not insert empty redlines - delete pNewRedl; - pNewRedl = 0; - } - else - mpRedlineTbl->Insert( pNewRedl ); - } - - if( bCompress ) - CompressRedlines(); - } - else - { - if( bCallDelete && nsRedlineType_t::REDLINE_DELETE == pNewRedl->GetType() ) - { - RedlineMode_t eOld = meRedlineMode; - // Set to NONE, so that the Delete::Redo merges the Redline data correctly! - // The ShowMode needs to be retained! - meRedlineMode = (RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE)); - getIDocumentContentOperations().DeleteAndJoin( *pNewRedl ); - meRedlineMode = eOld; - } - delete pNewRedl, pNewRedl = 0; - } - _CHECK_REDLINE( this ) - - return ( 0 != pNewRedl ) || bMerged; -} - -void SwDoc::CompressRedlines() -{ - _CHECK_REDLINE( this ) - - void (SwRangeRedline::*pFnc)(sal_uInt16) = 0; - switch( nsRedlineMode_t::REDLINE_SHOW_MASK & meRedlineMode ) - { - case nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE: - pFnc = &SwRangeRedline::Show; - break; - case nsRedlineMode_t::REDLINE_SHOW_INSERT: - pFnc = &SwRangeRedline::Hide; - break; - } - - // Try to merge identical ones - for( sal_uInt16 n = 1; n < mpRedlineTbl->size(); ++n ) - { - SwRangeRedline* pPrev = (*mpRedlineTbl)[ n-1 ], - * pCur = (*mpRedlineTbl)[ n ]; - const SwPosition* pPrevStt = pPrev->Start(), - * pPrevEnd = pPrevStt == pPrev->GetPoint() - ? pPrev->GetMark() : pPrev->GetPoint(); - const SwPosition* pCurStt = pCur->Start(), - * pCurEnd = pCurStt == pCur->GetPoint() - ? pCur->GetMark() : pCur->GetPoint(); - if( *pPrevEnd == *pCurStt && pPrev->CanCombine( *pCur ) && - pPrevStt->nNode.GetNode().StartOfSectionNode() == - pCurEnd->nNode.GetNode().StartOfSectionNode() && - !pCurEnd->nNode.GetNode().StartOfSectionNode()->IsTableNode() ) - { - // we then can merge them - pPrev->Show(); - pCur->Show(); - - pPrev->SetEnd( *pCur->End() ); - mpRedlineTbl->DeleteAndDestroy( n ); - --n; - if( pFnc ) - (pPrev->*pFnc)(0); - } - } - _CHECK_REDLINE( this ) - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -bool SwDoc::SplitRedline( const SwPaM& rRange ) -{ - bool bChg = false; - sal_uInt16 n = 0; - const SwPosition* pStt = rRange.Start(), - * pEnd = pStt == rRange.GetPoint() ? rRange.GetMark() - : rRange.GetPoint(); - GetRedline( *pStt, &n ); - for( ; n < mpRedlineTbl->size() ; ++n ) - { - SwRangeRedline* pTmp = (*mpRedlineTbl)[ n ]; - SwPosition* pTStt = pTmp->Start(), - * pTEnd = pTStt == pTmp->GetPoint() ? pTmp->GetMark() - : pTmp->GetPoint(); - if( *pTStt <= *pStt && *pStt <= *pTEnd && - *pTStt <= *pEnd && *pEnd <= *pTEnd ) - { - bChg = true; - int nn = 0; - if( *pStt == *pTStt ) - nn += 1; - if( *pEnd == *pTEnd ) - nn += 2; - - SwRangeRedline* pNew = 0; - switch( nn ) - { - case 0: - pNew = new SwRangeRedline( *pTmp ); - pTmp->SetEnd( *pStt, pTEnd ); - pNew->SetStart( *pEnd ); - break; - - case 1: - *pTStt = *pEnd; - break; - - case 2: - *pTEnd = *pStt; - break; - - case 3: - pTmp->InvalidateRange(); - mpRedlineTbl->DeleteAndDestroy( n-- ); - pTmp = 0; - break; - } - if( pTmp && !pTmp->HasValidRange() ) - { - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pTmp, n ); - } - if( pNew ) - mpRedlineTbl->Insert( pNew, n ); - } - else if( *pEnd < *pTStt ) - break; - } - return bChg; - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -bool SwDoc::DeleteRedline( const SwPaM& rRange, bool bSaveInUndo, - sal_uInt16 nDelType ) -{ - if( nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES & meRedlineMode || - !rRange.HasMark() || *rRange.GetMark() == *rRange.GetPoint() ) - return false; - - bool bChg = false; - - if (bSaveInUndo && GetIDocumentUndoRedo().DoesUndo()) - { - SwUndoRedline* pUndo = new SwUndoRedline( UNDO_REDLINE, rRange ); - if( pUndo->GetRedlSaveCount() ) - { - GetIDocumentUndoRedo().AppendUndo(pUndo); - } - else - delete pUndo; - } - - const SwPosition* pStt = rRange.Start(), - * pEnd = pStt == rRange.GetPoint() ? rRange.GetMark() - : rRange.GetPoint(); - sal_uInt16 n = 0; - GetRedline( *pStt, &n ); - for( ; n < mpRedlineTbl->size() ; ++n ) - { - SwRangeRedline* pRedl = (*mpRedlineTbl)[ n ]; - if( USHRT_MAX != nDelType && nDelType != pRedl->GetType() ) - continue; - - SwPosition* pRStt = pRedl->Start(), - * pREnd = pRStt == pRedl->GetPoint() ? pRedl->GetMark() - : pRedl->GetPoint(); - switch( ComparePosition( *pStt, *pEnd, *pRStt, *pREnd ) ) - { - case POS_EQUAL: - case POS_OUTSIDE: - pRedl->InvalidateRange(); - mpRedlineTbl->DeleteAndDestroy( n-- ); - bChg = true; - break; - - case POS_OVERLAP_BEFORE: - pRedl->InvalidateRange(); - pRedl->SetStart( *pEnd, pRStt ); - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl ); - --n; - break; - - case POS_OVERLAP_BEHIND: - pRedl->InvalidateRange(); - pRedl->SetEnd( *pStt, pREnd ); - if( !pRedl->HasValidRange() ) - { - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl ); - --n; - } - break; - - case POS_INSIDE: - { - // this one needs to be splitted - pRedl->InvalidateRange(); - if( *pRStt == *pStt ) - { - pRedl->SetStart( *pEnd, pRStt ); - // re-insert - mpRedlineTbl->Remove( n ); - mpRedlineTbl->Insert( pRedl ); - --n; - } - else - { - SwRangeRedline* pCpy; - if( *pREnd != *pEnd ) - { - pCpy = new SwRangeRedline( *pRedl ); - pCpy->SetStart( *pEnd ); - } - else - pCpy = 0; - pRedl->SetEnd( *pStt, pREnd ); - if( !pRedl->HasValidRange() ) - { - // re-insert - mpRedlineTbl->Remove( pRedl ); - mpRedlineTbl->Insert( pRedl ); - --n; - } - if( pCpy ) - mpRedlineTbl->Insert( pCpy ); - } - } - break; - - case POS_COLLIDE_END: - case POS_BEFORE: - n = mpRedlineTbl->size(); - break; - default: - break; - } - } - - if( bChg ) - SetModified(); - - return bChg; - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -bool SwDoc::DeleteRedline( const SwStartNode& rNode, bool bSaveInUndo, - sal_uInt16 nDelType ) -{ - SwPaM aTemp(*rNode.EndOfSectionNode(), rNode); - return DeleteRedline(aTemp, bSaveInUndo, nDelType); -} - -sal_uInt16 SwDoc::GetRedlinePos( const SwNode& rNd, sal_uInt16 nType ) const -{ - const sal_uLong nNdIdx = rNd.GetIndex(); - for( sal_uInt16 n = 0; n < mpRedlineTbl->size() ; ++n ) - { - const SwRangeRedline* pTmp = (*mpRedlineTbl)[ n ]; - sal_uLong nPt = pTmp->GetPoint()->nNode.GetIndex(), - nMk = pTmp->GetMark()->nNode.GetIndex(); - if( nPt < nMk ) { long nTmp = nMk; nMk = nPt; nPt = nTmp; } - - if( ( USHRT_MAX == nType || nType == pTmp->GetType()) && - nMk <= nNdIdx && nNdIdx <= nPt ) - return n; - - if( nMk > nNdIdx ) - break; - } - return USHRT_MAX; - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - bool SwExtraRedlineTbl::DeleteAllTableRedlines( SwDoc* pDoc, const SwTable& rTable, bool bSaveInUndo, sal_uInt16 nRedlineTypeToDelete ) { - if( nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES & pDoc->GetRedlineMode() ) + if( nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES & pDoc->getIDocumentRedlineAccess().GetRedlineMode() ) return false; bool bChg = false; @@ -1585,7 +176,7 @@ bool SwExtraRedlineTbl::DeleteAllTableRedlines( SwDoc* pDoc, const SwTable& rTab bool SwExtraRedlineTbl::DeleteTableRowRedline( SwDoc* pDoc, const SwTableLine& rTableLine, bool bSaveInUndo, sal_uInt16 nRedlineTypeToDelete ) { - if( nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES & pDoc->GetRedlineMode() ) + if( nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES & pDoc->getIDocumentRedlineAccess().GetRedlineMode() ) return false; bool bChg = false; @@ -1632,7 +223,7 @@ bool SwExtraRedlineTbl::DeleteTableRowRedline( SwDoc* pDoc, const SwTableLine& r bool SwExtraRedlineTbl::DeleteTableCellRedline( SwDoc* pDoc, const SwTableBox& rTableBox, bool bSaveInUndo, sal_uInt16 nRedlineTypeToDelete ) { - if( nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES & pDoc->GetRedlineMode() ) + if( nsRedlineMode_t::REDLINE_IGNOREDELETE_REDLINES & pDoc->getIDocumentRedlineAccess().GetRedlineMode() ) return false; bool bChg = false; @@ -1677,1076 +268,6 @@ bool SwExtraRedlineTbl::DeleteTableCellRedline( SwDoc* pDoc, const SwTableBox& r return bChg; } -const SwRangeRedline* SwDoc::GetRedline( const SwPosition& rPos, - sal_uInt16* pFndPos ) const -{ - sal_uInt16 nO = mpRedlineTbl->size(), nM, nU = 0; - if( nO > 0 ) - { - nO--; - while( nU <= nO ) - { - nM = nU + ( nO - nU ) / 2; - const SwRangeRedline* pRedl = (*mpRedlineTbl)[ nM ]; - const SwPosition* pStt = pRedl->Start(); - const SwPosition* pEnd = pStt == pRedl->GetPoint() - ? pRedl->GetMark() - : pRedl->GetPoint(); - if( pEnd == pStt - ? *pStt == rPos - : ( *pStt <= rPos && rPos < *pEnd ) ) - { - while( nM && rPos == *(*mpRedlineTbl)[ nM - 1 ]->End() && - rPos == *(*mpRedlineTbl)[ nM - 1 ]->Start() ) - { - --nM; - pRedl = (*mpRedlineTbl)[ nM ]; - } - // if there are format and insert changes in the same position - // show insert change first. - // since the redlines are sorted by position, only check the redline - // before and after the current redline - if( nsRedlineType_t::REDLINE_FORMAT == pRedl->GetType() ) - { - if( nM && rPos >= *(*mpRedlineTbl)[ nM - 1 ]->Start() && - rPos <= *(*mpRedlineTbl)[ nM - 1 ]->End() && - ( nsRedlineType_t::REDLINE_INSERT == (*mpRedlineTbl)[ nM - 1 ]->GetType() ) ) - { - --nM; - pRedl = (*mpRedlineTbl)[ nM ]; - } - else if( ( nM + 1 ) <= nO && rPos >= *(*mpRedlineTbl)[ nM + 1 ]->Start() && - rPos <= *(*mpRedlineTbl)[ nM + 1 ]->End() && - ( nsRedlineType_t::REDLINE_INSERT == (*mpRedlineTbl)[ nM + 1 ]->GetType() ) ) - { - ++nM; - pRedl = (*mpRedlineTbl)[ nM ]; - } - } - - if( pFndPos ) - *pFndPos = nM; - return pRedl; - } - else if( *pEnd <= rPos ) - nU = nM + 1; - else if( nM == 0 ) - { - if( pFndPos ) - *pFndPos = nU; - return 0; - } - else - nO = nM - 1; - } - } - if( pFndPos ) - *pFndPos = nU; - return 0; - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -typedef bool (*Fn_AcceptReject)( SwRedlineTbl& rArr, sal_uInt16& rPos, - bool bCallDelete, - const SwPosition* pSttRng, - const SwPosition* pEndRng); - -static bool lcl_AcceptRedline( SwRedlineTbl& rArr, sal_uInt16& rPos, - bool bCallDelete, - const SwPosition* pSttRng = 0, - const SwPosition* pEndRng = 0 ) -{ - bool bRet = true; - SwRangeRedline* pRedl = rArr[ rPos ]; - SwPosition *pRStt = 0, *pREnd = 0; - SwComparePosition eCmp = POS_OUTSIDE; - if( pSttRng && pEndRng ) - { - pRStt = pRedl->Start(); - pREnd = pRedl->End(); - eCmp = ComparePosition( *pSttRng, *pEndRng, *pRStt, *pREnd ); - } - - pRedl->InvalidateRange(); - - switch( pRedl->GetType() ) - { - case nsRedlineType_t::REDLINE_INSERT: - case nsRedlineType_t::REDLINE_FORMAT: - { - bool bCheck = false, bReplace = false; - switch( eCmp ) - { - case POS_INSIDE: - if( *pSttRng == *pRStt ) - pRedl->SetStart( *pEndRng, pRStt ); - else - { - if( *pEndRng != *pREnd ) - { - // split up - SwRangeRedline* pNew = new SwRangeRedline( *pRedl ); - pNew->SetStart( *pEndRng ); - rArr.Insert( pNew ); ++rPos; - } - pRedl->SetEnd( *pSttRng, pREnd ); - bCheck = true; - } - break; - - case POS_OVERLAP_BEFORE: - pRedl->SetStart( *pEndRng, pRStt ); - bReplace = true; - break; - - case POS_OVERLAP_BEHIND: - pRedl->SetEnd( *pSttRng, pREnd ); - bCheck = true; - break; - - case POS_OUTSIDE: - case POS_EQUAL: - rArr.DeleteAndDestroy( rPos-- ); - break; - - default: - bRet = false; - } - - if( bReplace || ( bCheck && !pRedl->HasValidRange() )) - { - // re-insert - rArr.Remove( pRedl ); - rArr.Insert( pRedl ); - } - } - break; - case nsRedlineType_t::REDLINE_DELETE: - { - SwDoc& rDoc = *pRedl->GetDoc(); - const SwPosition *pDelStt = 0, *pDelEnd = 0; - bool bDelRedl = false; - switch( eCmp ) - { - case POS_INSIDE: - if( bCallDelete ) - { - pDelStt = pSttRng; - pDelEnd = pEndRng; - } - break; - - case POS_OVERLAP_BEFORE: - if( bCallDelete ) - { - pDelStt = pRStt; - pDelEnd = pEndRng; - } - break; - case POS_OVERLAP_BEHIND: - if( bCallDelete ) - { - pDelStt = pREnd; - pDelEnd = pSttRng; - } - break; - - case POS_OUTSIDE: - case POS_EQUAL: - { - rArr.Remove( rPos-- ); - bDelRedl = true; - if( bCallDelete ) - { - pDelStt = pRedl->Start(); - pDelEnd = pRedl->End(); - } - } - break; - default: - bRet = false; - } - - if( pDelStt && pDelEnd ) - { - SwPaM aPam( *pDelStt, *pDelEnd ); - SwCntntNode* pCSttNd = pDelStt->nNode.GetNode().GetCntntNode(); - SwCntntNode* pCEndNd = pDelEnd->nNode.GetNode().GetCntntNode(); - - if( bDelRedl ) - delete pRedl; - - RedlineMode_t eOld = rDoc.GetRedlineMode(); - rDoc.SetRedlineMode_intern( (RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE))); - - if( pCSttNd && pCEndNd ) - rDoc.getIDocumentContentOperations().DeleteAndJoin( aPam ); - else - { - rDoc.getIDocumentContentOperations().DeleteRange( aPam ); - - if( pCSttNd && !pCEndNd ) - { - aPam.GetBound( true ).nContent.Assign( 0, 0 ); - aPam.GetBound( false ).nContent.Assign( 0, 0 ); - aPam.DeleteMark(); - rDoc.getIDocumentContentOperations().DelFullPara( aPam ); - } - } - rDoc.SetRedlineMode_intern( eOld ); - } - else if( bDelRedl ) - delete pRedl; - } - break; - - case nsRedlineType_t::REDLINE_FMTCOLL: - rArr.DeleteAndDestroy( rPos-- ); - break; - - default: - bRet = false; - } - return bRet; -} - -static bool lcl_RejectRedline( SwRedlineTbl& rArr, sal_uInt16& rPos, - bool bCallDelete, - const SwPosition* pSttRng = 0, - const SwPosition* pEndRng = 0 ) -{ - bool bRet = true; - SwRangeRedline* pRedl = rArr[ rPos ]; - SwPosition *pRStt = 0, *pREnd = 0; - SwComparePosition eCmp = POS_OUTSIDE; - if( pSttRng && pEndRng ) - { - pRStt = pRedl->Start(); - pREnd = pRedl->End(); - eCmp = ComparePosition( *pSttRng, *pEndRng, *pRStt, *pREnd ); - } - - pRedl->InvalidateRange(); - - switch( pRedl->GetType() ) - { - case nsRedlineType_t::REDLINE_INSERT: - { - SwDoc& rDoc = *pRedl->GetDoc(); - const SwPosition *pDelStt = 0, *pDelEnd = 0; - bool bDelRedl = false; - switch( eCmp ) - { - case POS_INSIDE: - if( bCallDelete ) - { - pDelStt = pSttRng; - pDelEnd = pEndRng; - } - break; - - case POS_OVERLAP_BEFORE: - if( bCallDelete ) - { - pDelStt = pRStt; - pDelEnd = pEndRng; - } - break; - case POS_OVERLAP_BEHIND: - if( bCallDelete ) - { - pDelStt = pREnd; - pDelEnd = pSttRng; - } - break; - case POS_OUTSIDE: - case POS_EQUAL: - { - // delete the range again - rArr.Remove( rPos-- ); - bDelRedl = true; - if( bCallDelete ) - { - pDelStt = pRedl->Start(); - pDelEnd = pRedl->End(); - } - } - break; - - default: - bRet = false; - } - if( pDelStt && pDelEnd ) - { - SwPaM aPam( *pDelStt, *pDelEnd ); - - SwCntntNode* pCSttNd = pDelStt->nNode.GetNode().GetCntntNode(); - SwCntntNode* pCEndNd = pDelEnd->nNode.GetNode().GetCntntNode(); - - if( bDelRedl ) - delete pRedl; - - RedlineMode_t eOld = rDoc.GetRedlineMode(); - rDoc.SetRedlineMode_intern( (RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE))); - - if( pCSttNd && pCEndNd ) - rDoc.getIDocumentContentOperations().DeleteAndJoin( aPam ); - else - { - rDoc.getIDocumentContentOperations().DeleteRange( aPam ); - - if( pCSttNd && !pCEndNd ) - { - aPam.GetBound( true ).nContent.Assign( 0, 0 ); - aPam.GetBound( false ).nContent.Assign( 0, 0 ); - aPam.DeleteMark(); - rDoc.getIDocumentContentOperations().DelFullPara( aPam ); - } - } - rDoc.SetRedlineMode_intern( eOld ); - } - else if( bDelRedl ) - delete pRedl; - } - break; - case nsRedlineType_t::REDLINE_DELETE: - { - SwRangeRedline* pNew = 0; - bool bCheck = false, bReplace = false; - - switch( eCmp ) - { - case POS_INSIDE: - { - if( 1 < pRedl->GetStackCount() ) - { - pNew = new SwRangeRedline( *pRedl ); - pNew->PopData(); - } - if( *pSttRng == *pRStt ) - { - pRedl->SetStart( *pEndRng, pRStt ); - bReplace = true; - if( pNew ) - pNew->SetEnd( *pEndRng ); - } - else - { - if( *pEndRng != *pREnd ) - { - // split up - SwRangeRedline* pCpy = new SwRangeRedline( *pRedl ); - pCpy->SetStart( *pEndRng ); - rArr.Insert( pCpy ); ++rPos; - if( pNew ) - pNew->SetEnd( *pEndRng ); - } - - pRedl->SetEnd( *pSttRng, pREnd ); - bCheck = true; - if( pNew ) - pNew->SetStart( *pSttRng ); - } - } - break; - - case POS_OVERLAP_BEFORE: - if( 1 < pRedl->GetStackCount() ) - { - pNew = new SwRangeRedline( *pRedl ); - pNew->PopData(); - } - pRedl->SetStart( *pEndRng, pRStt ); - bReplace = true; - if( pNew ) - pNew->SetEnd( *pEndRng ); - break; - - case POS_OVERLAP_BEHIND: - if( 1 < pRedl->GetStackCount() ) - { - pNew = new SwRangeRedline( *pRedl ); - pNew->PopData(); - } - pRedl->SetEnd( *pSttRng, pREnd ); - bCheck = true; - if( pNew ) - pNew->SetStart( *pSttRng ); - break; - - case POS_OUTSIDE: - case POS_EQUAL: - if( !pRedl->PopData() ) - // deleting the RedlineObject is enough - rArr.DeleteAndDestroy( rPos-- ); - break; - - default: - bRet = false; - } - - if( pNew ) - { - rArr.Insert( pNew ); ++rPos; - } - - if( bReplace || ( bCheck && !pRedl->HasValidRange() )) - { - // re-insert - rArr.Remove( pRedl ); - rArr.Insert( pRedl ); - } - } - break; - - case nsRedlineType_t::REDLINE_FORMAT: - case nsRedlineType_t::REDLINE_FMTCOLL: - { - if( pRedl->GetExtraData() ) - pRedl->GetExtraData()->Reject( *pRedl ); - rArr.DeleteAndDestroy( rPos-- ); - } - break; - - default: - bRet = false; - } - return bRet; -} - -static int lcl_AcceptRejectRedl( Fn_AcceptReject fn_AcceptReject, - SwRedlineTbl& rArr, bool bCallDelete, - const SwPaM& rPam) -{ - sal_uInt16 n = 0; - int nCount = 0; - - const SwPosition* pStt = rPam.Start(), - * pEnd = pStt == rPam.GetPoint() ? rPam.GetMark() - : rPam.GetPoint(); - const SwRangeRedline* pFnd = rArr.FindAtPosition( *pStt, n, true ); - if( pFnd && // Is new a part of it? - ( *pFnd->Start() != *pStt || *pFnd->End() > *pEnd )) - { - // Only revoke the partial selection - if( (*fn_AcceptReject)( rArr, n, bCallDelete, pStt, pEnd )) - nCount++; - ++n; - } - - for( ; n < rArr.size(); ++n ) - { - SwRangeRedline* pTmp = rArr[ n ]; - if( pTmp->HasMark() && pTmp->IsVisible() ) - { - if( *pTmp->End() <= *pEnd ) - { - if( (*fn_AcceptReject)( rArr, n, bCallDelete, 0, 0 )) - nCount++; - } - else - { - if( *pTmp->Start() < *pEnd ) - { - // Only revoke the partial selection - if( (*fn_AcceptReject)( rArr, n, bCallDelete, pStt, pEnd )) - nCount++; - } - break; - } - } - } - return nCount; -} - -static void lcl_AdjustRedlineRange( SwPaM& rPam ) -{ - // The Selection is only in the ContentSection. If there are Redlines - // to Non-ContentNodes before or after that, then the Selections - // expand to them. - SwPosition* pStt = rPam.Start(), - * pEnd = pStt == rPam.GetPoint() ? rPam.GetMark() - : rPam.GetPoint(); - SwDoc* pDoc = rPam.GetDoc(); - if( !pStt->nContent.GetIndex() && - !pDoc->GetNodes()[ pStt->nNode.GetIndex() - 1 ]->IsCntntNode() ) - { - const SwRangeRedline* pRedl = pDoc->GetRedline( *pStt, 0 ); - if( pRedl ) - { - const SwPosition* pRStt = pRedl->Start(); - if( !pRStt->nContent.GetIndex() && pRStt->nNode.GetIndex() == - pStt->nNode.GetIndex() - 1 ) - *pStt = *pRStt; - } - } - if( pEnd->nNode.GetNode().IsCntntNode() && - !pDoc->GetNodes()[ pEnd->nNode.GetIndex() + 1 ]->IsCntntNode() && - pEnd->nContent.GetIndex() == pEnd->nNode.GetNode().GetCntntNode()->Len() ) - { - const SwRangeRedline* pRedl = pDoc->GetRedline( *pEnd, 0 ); - if( pRedl ) - { - const SwPosition* pREnd = pRedl->End(); - if( !pREnd->nContent.GetIndex() && pREnd->nNode.GetIndex() == - pEnd->nNode.GetIndex() + 1 ) - *pEnd = *pREnd; - } - } -} - -bool SwDoc::AcceptRedline( sal_uInt16 nPos, bool bCallDelete ) -{ - bool bRet = false; - - // Switch to visible in any case - if( (nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE) != - (nsRedlineMode_t::REDLINE_SHOW_MASK & meRedlineMode) ) - SetRedlineMode( (RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE | meRedlineMode)); - - SwRangeRedline* pTmp = (*mpRedlineTbl)[ nPos ]; - if( pTmp->HasMark() && pTmp->IsVisible() ) - { - if (GetIDocumentUndoRedo().DoesUndo()) - { - SwRewriter aRewriter; - - aRewriter.AddRule(UndoArg1, pTmp->GetDescr()); - GetIDocumentUndoRedo().StartUndo(UNDO_ACCEPT_REDLINE, &aRewriter); - } - - int nLoopCnt = 2; - sal_uInt16 nSeqNo = pTmp->GetSeqNo(); - - do { - - if (GetIDocumentUndoRedo().DoesUndo()) - { - SwUndo *const pUndo( new SwUndoAcceptRedline(*pTmp) ); - GetIDocumentUndoRedo().AppendUndo(pUndo); - } - - bRet |= lcl_AcceptRedline( *mpRedlineTbl, nPos, bCallDelete ); - - if( nSeqNo ) - { - if( USHRT_MAX == nPos ) - nPos = 0; - sal_uInt16 nFndPos = 2 == nLoopCnt - ? mpRedlineTbl->FindNextSeqNo( nSeqNo, nPos ) - : mpRedlineTbl->FindPrevSeqNo( nSeqNo, nPos ); - if( USHRT_MAX != nFndPos || ( 0 != ( --nLoopCnt ) && - USHRT_MAX != ( nFndPos = - mpRedlineTbl->FindPrevSeqNo( nSeqNo, nPos ))) ) - pTmp = (*mpRedlineTbl)[ nPos = nFndPos ]; - else - nLoopCnt = 0; - } - else - nLoopCnt = 0; - - } while( nLoopCnt ); - - if( bRet ) - { - CompressRedlines(); - SetModified(); - } - - if (GetIDocumentUndoRedo().DoesUndo()) - { - GetIDocumentUndoRedo().EndUndo(UNDO_END, 0); - } - } - return bRet; - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -bool SwDoc::AcceptRedline( const SwPaM& rPam, bool bCallDelete ) -{ - // Switch to visible in any case - if( (nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE) != - (nsRedlineMode_t::REDLINE_SHOW_MASK & meRedlineMode) ) - SetRedlineMode( (RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE | meRedlineMode)); - - // The Selection is only in the ContentSection. If there are Redlines - // to Non-ContentNodes before or after that, then the Selections - // expand to them. - SwPaM aPam( *rPam.GetMark(), *rPam.GetPoint() ); - lcl_AdjustRedlineRange( aPam ); - - if (GetIDocumentUndoRedo().DoesUndo()) - { - GetIDocumentUndoRedo().StartUndo( UNDO_ACCEPT_REDLINE, NULL ); - GetIDocumentUndoRedo().AppendUndo( new SwUndoAcceptRedline( aPam )); - } - - int nRet = lcl_AcceptRejectRedl( lcl_AcceptRedline, *mpRedlineTbl, - bCallDelete, aPam ); - if( nRet > 0 ) - { - CompressRedlines(); - SetModified(); - } - if (GetIDocumentUndoRedo().DoesUndo()) - { - OUString aTmpStr; - - { - SwRewriter aRewriter; - aRewriter.AddRule(UndoArg1, OUString::number(nRet)); - aTmpStr = aRewriter.Apply(OUString(SW_RES(STR_N_REDLINES))); - } - - SwRewriter aRewriter; - aRewriter.AddRule(UndoArg1, aTmpStr); - - GetIDocumentUndoRedo().EndUndo( UNDO_ACCEPT_REDLINE, &aRewriter ); - } - return nRet != 0; - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -bool SwDoc::RejectRedline( sal_uInt16 nPos, bool bCallDelete ) -{ - bool bRet = false; - - // Switch to visible in any case - if( (nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE) != - (nsRedlineMode_t::REDLINE_SHOW_MASK & meRedlineMode) ) - SetRedlineMode( (RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE | meRedlineMode)); - - SwRangeRedline* pTmp = (*mpRedlineTbl)[ nPos ]; - if( pTmp->HasMark() && pTmp->IsVisible() ) - { - if (GetIDocumentUndoRedo().DoesUndo()) - { - SwRewriter aRewriter; - - aRewriter.AddRule(UndoArg1, pTmp->GetDescr()); - GetIDocumentUndoRedo().StartUndo(UNDO_REJECT_REDLINE, &aRewriter); - } - - int nLoopCnt = 2; - sal_uInt16 nSeqNo = pTmp->GetSeqNo(); - - do { - - if (GetIDocumentUndoRedo().DoesUndo()) - { - SwUndo *const pUndo( new SwUndoRejectRedline( *pTmp ) ); - GetIDocumentUndoRedo().AppendUndo(pUndo); - } - - bRet |= lcl_RejectRedline( *mpRedlineTbl, nPos, bCallDelete ); - - if( nSeqNo ) - { - if( USHRT_MAX == nPos ) - nPos = 0; - sal_uInt16 nFndPos = 2 == nLoopCnt - ? mpRedlineTbl->FindNextSeqNo( nSeqNo, nPos ) - : mpRedlineTbl->FindPrevSeqNo( nSeqNo, nPos ); - if( USHRT_MAX != nFndPos || ( 0 != ( --nLoopCnt ) && - USHRT_MAX != ( nFndPos = - mpRedlineTbl->FindPrevSeqNo( nSeqNo, nPos ))) ) - pTmp = (*mpRedlineTbl)[ nPos = nFndPos ]; - else - nLoopCnt = 0; - } - else - nLoopCnt = 0; - - } while( nLoopCnt ); - - if( bRet ) - { - CompressRedlines(); - SetModified(); - } - - if (GetIDocumentUndoRedo().DoesUndo()) - { - GetIDocumentUndoRedo().EndUndo(UNDO_END, 0); - } - } - return bRet; - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -bool SwDoc::RejectRedline( const SwPaM& rPam, bool bCallDelete ) -{ - // Switch to visible in any case - if( (nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE) != - (nsRedlineMode_t::REDLINE_SHOW_MASK & meRedlineMode) ) - SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE | meRedlineMode)); - - // The Selection is only in the ContentSection. If there are Redlines - // to Non-ContentNodes before or after that, then the Selections - // expand to them. - SwPaM aPam( *rPam.GetMark(), *rPam.GetPoint() ); - lcl_AdjustRedlineRange( aPam ); - - if (GetIDocumentUndoRedo().DoesUndo()) - { - GetIDocumentUndoRedo().StartUndo( UNDO_REJECT_REDLINE, NULL ); - GetIDocumentUndoRedo().AppendUndo( new SwUndoRejectRedline(aPam) ); - } - - int nRet = lcl_AcceptRejectRedl( lcl_RejectRedline, *mpRedlineTbl, - bCallDelete, aPam ); - if( nRet > 0 ) - { - CompressRedlines(); - SetModified(); - } - if (GetIDocumentUndoRedo().DoesUndo()) - { - OUString aTmpStr; - - { - SwRewriter aRewriter; - aRewriter.AddRule(UndoArg1, OUString::number(nRet)); - aTmpStr = aRewriter.Apply(OUString(SW_RES(STR_N_REDLINES))); - } - - SwRewriter aRewriter; - aRewriter.AddRule(UndoArg1, aTmpStr); - - GetIDocumentUndoRedo().EndUndo( UNDO_REJECT_REDLINE, &aRewriter ); - } - - return nRet != 0; - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -const SwRangeRedline* SwDoc::SelNextRedline( SwPaM& rPam ) const -{ - rPam.DeleteMark(); - rPam.SetMark(); - - SwPosition& rSttPos = *rPam.GetPoint(); - SwPosition aSavePos( rSttPos ); - bool bRestart; - - // If the starting position points to the last valid ContentNode, - // we take the next Redline in any case. - sal_uInt16 n = 0; - const SwRangeRedline* pFnd = GetRedlineTbl().FindAtPosition( rSttPos, n, true ); - if( pFnd ) - { - const SwPosition* pEnd = pFnd->End(); - if( !pEnd->nNode.GetNode().IsCntntNode() ) - { - SwNodeIndex aTmp( pEnd->nNode ); - SwCntntNode* pCNd = GetNodes().GoPrevSection( &aTmp ); - if( !pCNd || ( aTmp == rSttPos.nNode && - pCNd->Len() == rSttPos.nContent.GetIndex() )) - pFnd = 0; - } - if( pFnd ) - rSttPos = *pFnd->End(); - } - - do { - bRestart = false; - - for( ; !pFnd && n < mpRedlineTbl->size(); ++n ) - { - pFnd = (*mpRedlineTbl)[ n ]; - if( pFnd->HasMark() && pFnd->IsVisible() ) - { - *rPam.GetMark() = *pFnd->Start(); - rSttPos = *pFnd->End(); - break; - } - else - pFnd = 0; - } - - if( pFnd ) - { - // Merge all of the same type and author that are - // consecutive into one Selection. - const SwPosition* pPrevEnd = pFnd->End(); - while( ++n < mpRedlineTbl->size() ) - { - const SwRangeRedline* pTmp = (*mpRedlineTbl)[ n ]; - if( pTmp->HasMark() && pTmp->IsVisible() ) - { - const SwPosition *pRStt; - if( pFnd->GetType() == pTmp->GetType() && - pFnd->GetAuthor() == pTmp->GetAuthor() && - ( *pPrevEnd == *( pRStt = pTmp->Start() ) || - IsPrevPos( *pPrevEnd, *pRStt )) ) - { - pPrevEnd = pTmp->End(); - rSttPos = *pPrevEnd; - } - else - break; - } - } - } - - if( pFnd ) - { - const SwRangeRedline* pSaveFnd = pFnd; - - SwCntntNode* pCNd; - SwNodeIndex* pIdx = &rPam.GetMark()->nNode; - if( !pIdx->GetNode().IsCntntNode() && - 0 != ( pCNd = GetNodes().GoNextSection( pIdx )) ) - { - if( *pIdx <= rPam.GetPoint()->nNode ) - rPam.GetMark()->nContent.Assign( pCNd, 0 ); - else - pFnd = 0; - } - - if( pFnd ) - { - pIdx = &rPam.GetPoint()->nNode; - if( !pIdx->GetNode().IsCntntNode() && - 0 != ( pCNd = GetNodes().GoPrevSection( pIdx )) ) - { - if( *pIdx >= rPam.GetMark()->nNode ) - rPam.GetPoint()->nContent.Assign( pCNd, pCNd->Len() ); - else - pFnd = 0; - } - } - - if( !pFnd || *rPam.GetMark() == *rPam.GetPoint() ) - { - if( n < mpRedlineTbl->size() ) - { - bRestart = true; - *rPam.GetPoint() = *pSaveFnd->End(); - } - else - { - rPam.DeleteMark(); - *rPam.GetPoint() = aSavePos; - } - pFnd = 0; - } - } - } while( bRestart ); - - return pFnd; - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -const SwRangeRedline* SwDoc::SelPrevRedline( SwPaM& rPam ) const -{ - rPam.DeleteMark(); - rPam.SetMark(); - - SwPosition& rSttPos = *rPam.GetPoint(); - SwPosition aSavePos( rSttPos ); - bool bRestart; - - // If the starting position points to the last valid ContentNode, - // we take the previous Redline in any case. - sal_uInt16 n = 0; - const SwRangeRedline* pFnd = GetRedlineTbl().FindAtPosition( rSttPos, n, false ); - if( pFnd ) - { - const SwPosition* pStt = pFnd->Start(); - if( !pStt->nNode.GetNode().IsCntntNode() ) - { - SwNodeIndex aTmp( pStt->nNode ); - SwCntntNode* pCNd = GetNodes().GoNextSection( &aTmp ); - if( !pCNd || ( aTmp == rSttPos.nNode && - !rSttPos.nContent.GetIndex() )) - pFnd = 0; - } - if( pFnd ) - rSttPos = *pFnd->Start(); - } - - do { - bRestart = false; - - while( !pFnd && 0 < n ) - { - pFnd = (*mpRedlineTbl)[ --n ]; - if( pFnd->HasMark() && pFnd->IsVisible() ) - { - *rPam.GetMark() = *pFnd->End(); - rSttPos = *pFnd->Start(); - } - else - pFnd = 0; - } - - if( pFnd ) - { - // Merge all of the same type and author that are - // consecutive into one Selection. - const SwPosition* pNextStt = pFnd->Start(); - while( 0 < n ) - { - const SwRangeRedline* pTmp = (*mpRedlineTbl)[ --n ]; - if( pTmp->HasMark() && pTmp->IsVisible() ) - { - const SwPosition *pREnd; - if( pFnd->GetType() == pTmp->GetType() && - pFnd->GetAuthor() == pTmp->GetAuthor() && - ( *pNextStt == *( pREnd = pTmp->End() ) || - IsPrevPos( *pREnd, *pNextStt )) ) - { - pNextStt = pTmp->Start(); - rSttPos = *pNextStt; - } - else - { - ++n; - break; - } - } - } - } - - if( pFnd ) - { - const SwRangeRedline* pSaveFnd = pFnd; - - SwCntntNode* pCNd; - SwNodeIndex* pIdx = &rPam.GetMark()->nNode; - if( !pIdx->GetNode().IsCntntNode() && - 0 != ( pCNd = GetNodes().GoPrevSection( pIdx )) ) - { - if( *pIdx >= rPam.GetPoint()->nNode ) - rPam.GetMark()->nContent.Assign( pCNd, pCNd->Len() ); - else - pFnd = 0; - } - - if( pFnd ) - { - pIdx = &rPam.GetPoint()->nNode; - if( !pIdx->GetNode().IsCntntNode() && - 0 != ( pCNd = GetNodes().GoNextSection( pIdx )) ) - { - if( *pIdx <= rPam.GetMark()->nNode ) - rPam.GetPoint()->nContent.Assign( pCNd, 0 ); - else - pFnd = 0; - } - } - - if( !pFnd || *rPam.GetMark() == *rPam.GetPoint() ) - { - if( n ) - { - bRestart = true; - *rPam.GetPoint() = *pSaveFnd->Start(); - } - else - { - rPam.DeleteMark(); - *rPam.GetPoint() = aSavePos; - } - pFnd = 0; - } - } - } while( bRestart ); - - return pFnd; - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -// Set comment at the Redline -bool SwDoc::SetRedlineComment( const SwPaM& rPaM, const OUString& rS ) -{ - bool bRet = false; - const SwPosition* pStt = rPaM.Start(), - * pEnd = pStt == rPaM.GetPoint() ? rPaM.GetMark() - : rPaM.GetPoint(); - sal_uInt16 n = 0; - if( GetRedlineTbl().FindAtPosition( *pStt, n, true ) ) - { - for( ; n < mpRedlineTbl->size(); ++n ) - { - bRet = true; - SwRangeRedline* pTmp = (*mpRedlineTbl)[ n ]; - if( pStt != pEnd && *pTmp->Start() > *pEnd ) - break; - - pTmp->SetComment( rS ); - if( *pTmp->End() >= *pEnd ) - break; - } - } - if( bRet ) - SetModified(); - - return bRet; - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -// Create a new author if necessary -sal_uInt16 SwDoc::GetRedlineAuthor() -{ - return SW_MOD()->GetRedlineAuthor(); -} - -/// Insert new author into the Table for the Readers etc. -sal_uInt16 SwDoc::InsertRedlineAuthor( const OUString& rNew ) -{ - return SW_MOD()->InsertRedlineAuthor(rNew); -} - -void SwDoc::UpdateRedlineAttr() -{ - const SwRedlineTbl& rTbl = GetRedlineTbl(); - for( sal_uInt16 n = 0; n < rTbl.size(); ++n ) - { - SwRangeRedline* pRedl = rTbl[ n ]; - if( pRedl->IsVisible() ) - pRedl->InvalidateRange(); - } - - // #TODO - add 'SwExtraRedlineTbl' also ? -} - -/// Set comment text for the Redline, which is inserted later on via -/// AppendRedline. Is used by Autoformat. -/// A null pointer resets the mode. The pointer is not copied, so it -/// needs to stay valid! -void SwDoc::SetAutoFmtRedlineComment( const OUString* pTxt, sal_uInt16 nSeqNo ) -{ - mbIsAutoFmtRedline = 0 != pTxt; - if( pTxt ) - { - if( !mpAutoFmtRedlnComment ) - mpAutoFmtRedlnComment = new OUString( *pTxt ); - else - *mpAutoFmtRedlnComment = *pTxt; - } - else - delete mpAutoFmtRedlnComment, mpAutoFmtRedlnComment = 0; - - mnAutoFmtRedlnCommentNo = nSeqNo; -} - -void SwDoc::SetRedlinePassword( - /*[in]*/const uno::Sequence <sal_Int8>& rNewPassword) -{ - maRedlinePasswd = rNewPassword; - SetModified(); -} - bool SwRedlineTbl::Insert( SwRangeRedline* p, bool bIns ) { bool bRet = false; @@ -3165,8 +686,8 @@ void SwRedlineExtraData_Format::Reject( SwPaM& rPam ) const { SwDoc* pDoc = rPam.GetDoc(); - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern((RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE))); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE))); // Actually we need to reset the Attribute here! std::vector<sal_uInt16>::const_iterator it; @@ -3176,7 +697,7 @@ void SwRedlineExtraData_Format::Reject( SwPaM& rPam ) const nsSetAttrMode::SETATTR_DONTEXPAND ); } - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } bool SwRedlineExtraData_Format::operator == ( const SwRedlineExtraData& rCmp ) const @@ -3310,7 +831,7 @@ OUString SwRedlineData::GetDescr() const SwRangeRedline::SwRangeRedline(RedlineType_t eTyp, const SwPaM& rPam ) : SwPaM( *rPam.GetMark(), *rPam.GetPoint() ), - pRedlineData( new SwRedlineData( eTyp, GetDoc()->GetRedlineAuthor() ) ), + pRedlineData( new SwRedlineData( eTyp, GetDoc()->getIDocumentRedlineAccess().GetRedlineAuthor() ) ), pCntntSect( 0 ) { bDelLastPara = bIsLastParaDelete = false; @@ -3380,7 +901,7 @@ bool SwRangeRedline::HasValidRange() const void SwRangeRedline::CallDisplayFunc( sal_uInt16 nLoop ) { - switch( nsRedlineMode_t::REDLINE_SHOW_MASK & GetDoc()->GetRedlineMode() ) + switch( nsRedlineMode_t::REDLINE_SHOW_MASK & GetDoc()->getIDocumentRedlineAccess().GetRedlineMode() ) { case nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE: Show( nLoop ); @@ -3399,8 +920,8 @@ void SwRangeRedline::Show( sal_uInt16 nLoop ) if( 1 <= nLoop ) { SwDoc* pDoc = GetDoc(); - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo()); switch( GetType() ) @@ -3422,15 +943,15 @@ void SwRangeRedline::Show( sal_uInt16 nLoop ) default: break; } - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } } void SwRangeRedline::Hide( sal_uInt16 nLoop ) { SwDoc* pDoc = GetDoc(); - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo()); switch( GetType() ) @@ -3459,16 +980,16 @@ void SwRangeRedline::Hide( sal_uInt16 nLoop ) default: break; } - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } void SwRangeRedline::ShowOriginal( sal_uInt16 nLoop ) { SwDoc* pDoc = GetDoc(); - RedlineMode_t eOld = pDoc->GetRedlineMode(); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); SwRedlineData* pCur; - pDoc->SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo()); // Determine the Type, it's the first on Stack @@ -3501,7 +1022,7 @@ void SwRangeRedline::ShowOriginal( sal_uInt16 nLoop ) default: break; } - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } void SwRangeRedline::InvalidateRange() // trigger the Layout @@ -3586,7 +1107,7 @@ void SwRangeRedline::MoveToSection() { // In order to not move other Redlines' indices, we set them // to the end (is exclusive) - const SwRedlineTbl& rTbl = pDoc->GetRedlineTbl(); + const SwRedlineTbl& rTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); for( sal_uInt16 n = 0; n < rTbl.size(); ++n ) { SwRangeRedline* pRedl = rTbl[ n ]; @@ -3659,7 +1180,7 @@ void SwRangeRedline::CopyToSection() SwNodes& rNds = pDoc->GetNodes(); bool bSaveCopyFlag = pDoc->IsCopyIsMove(), - bSaveRdlMoveFlg = pDoc->IsRedlineMove(); + bSaveRdlMoveFlg = pDoc->getIDocumentRedlineAccess().IsRedlineMove(); pDoc->SetCopyIsMove( true ); // The IsRedlineMove() flag causes the behaviour of the @@ -3667,7 +1188,7 @@ void SwRangeRedline::CopyToSection() // called by the pDoc->Copy line below (through SwDoc::_Copy, // SwDoc::CopyWithFlyInFly). This rather obscure bugfix // apparently never really worked. - pDoc->SetRedlineMove( pStt->nContent == 0 ); + pDoc->getIDocumentRedlineAccess().SetRedlineMove( pStt->nContent == 0 ); if( pCSttNd ) { @@ -3719,7 +1240,7 @@ void SwRangeRedline::CopyToSection() pCntntSect = new SwNodeIndex( *pSttNd ); pDoc->SetCopyIsMove( bSaveCopyFlag ); - pDoc->SetRedlineMove( bSaveRdlMoveFlg ); + pDoc->getIDocumentRedlineAccess().SetRedlineMove( bSaveRdlMoveFlg ); } } @@ -3739,7 +1260,7 @@ void SwRangeRedline::DelCopyOfSection() { // In order to not move other Redlines' indices, we set them // to the end (is exclusive) - const SwRedlineTbl& rTbl = pDoc->GetRedlineTbl(); + const SwRedlineTbl& rTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); for( sal_uInt16 n = 0; n < rTbl.size(); ++n ) { SwRangeRedline* pRedl = rTbl[ n ]; @@ -3769,7 +1290,7 @@ void SwRangeRedline::DelCopyOfSection() // table are sorted and the pEnd position is an endnode (see // bDelLastPara condition above), only redlines before the // current ones can be affected. - const SwRedlineTbl& rTbl = pDoc->GetRedlineTbl(); + const SwRedlineTbl& rTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); sal_uInt16 n = rTbl.GetPos( this ); OSL_ENSURE( n != USHRT_MAX, "How strange. We don't exist!" ); for( bool bBreak = false; !bBreak && n > 0; ) @@ -3816,7 +1337,7 @@ void SwRangeRedline::MoveFromSection() if( pCntntSect ) { SwDoc* pDoc = GetDoc(); - const SwRedlineTbl& rTbl = pDoc->GetRedlineTbl(); + const SwRedlineTbl& rTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); std::vector<SwPosition*> aBeforeArr, aBehindArr; sal_uInt16 nMyPos = rTbl.GetPos( this ); OSL_ENSURE( this, "this is not in the array?" ); @@ -4085,16 +1606,6 @@ OUString SwRangeRedline::GetDescr(sal_uInt16 nPos) return aResult; } -bool SwDoc::IsInRedlines(const SwNode & rNode) const -{ - SwPosition aPos(rNode); - SwNode & rEndOfRedlines = GetNodes().GetEndOfRedlines(); - SwPaM aPam(SwPosition(*rEndOfRedlines.StartOfSectionNode()), - SwPosition(rEndOfRedlines)); - - return aPam.ContainsPosition(aPos); -} - bool SwExtraRedlineTbl::Insert( SwExtraRedline* p ) { m_aExtraRedlines.push_back( p ); @@ -4142,51 +1653,6 @@ SwTableRowRedline::~SwTableRowRedline() { } -bool SwDoc::AppendTableRowRedline( SwTableRowRedline* pNewRedl, bool bCallDelete ) -{ - (void)bCallDelete; - - // #TODO - equivelant for 'SwTableRowRedline' - bool bMerged = false; - /* - _CHECK_REDLINE( this ) - */ - - if (IsRedlineOn() && !IsShowOriginal(meRedlineMode)) - { - // #TODO - equivelant for 'SwTableRowRedline' - /* - pNewRedl->InvalidateRange(); - */ - - // Make equivelant of 'AppendRedline' checks inside here too - - mpExtraRedlineTbl->Insert( pNewRedl ); - } - else - { - // TO DO - equivelant for 'SwTableRowRedline' - /* - if( bCallDelete && nsRedlineType_t::REDLINE_DELETE == pNewRedl->GetType() ) - { - RedlineMode_t eOld = meRedlineMode; - // Set to NONE, so that the Delete::Redo merges the Redline data correctly! - // The ShowMode needs to be retained! - meRedlineMode = (RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE)); - DeleteAndJoin( *pNewRedl ); - meRedlineMode = eOld; - } - delete pNewRedl, pNewRedl = 0; - */ - } - // #TODO - equivelant for 'SwTableRowRedline' - /* - _CHECK_REDLINE( this ) - */ - - return ( 0 != pNewRedl ) || bMerged; -} - SwTableCellRedline::SwTableCellRedline(const SwRedlineData& rData, const SwTableBox& rTableBox) : m_aRedlineData(rData) , m_rTableBox(rTableBox) @@ -4197,50 +1663,5 @@ SwTableCellRedline::~SwTableCellRedline() { } -bool SwDoc::AppendTableCellRedline( SwTableCellRedline* pNewRedl, bool bCallDelete ) -{ - (void)bCallDelete; - - // #TODO - equivelant for 'SwTableCellRedline' - bool bMerged = false; - /* - _CHECK_REDLINE( this ) - */ - - if (IsRedlineOn() && !IsShowOriginal(meRedlineMode)) - { - // #TODO - equivelant for 'SwTableCellRedline' - /* - pNewRedl->InvalidateRange(); - */ - - // Make equivelant of 'AppendRedline' checks inside here too - - mpExtraRedlineTbl->Insert( pNewRedl ); - } - else - { - // TO DO - equivelant for 'SwTableCellRedline' - /* - if( bCallDelete && nsRedlineType_t::REDLINE_DELETE == pNewRedl->GetType() ) - { - RedlineMode_t eOld = meRedlineMode; - // Set to NONE, so that the Delete::Redo merges the Redline data correctly! - // The ShowMode needs to be retained! - meRedlineMode = (RedlineMode_t)(eOld & ~(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_IGNORE)); - DeleteAndJoin( *pNewRedl ); - meRedlineMode = eOld; - } - delete pNewRedl, pNewRedl = 0; - */ - } - // #TODO - equivelant for 'SwTableCellRedline' - /* - _CHECK_REDLINE( this ) - */ - - return ( 0 != pNewRedl ) || bMerged; -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/doc/docsort.cxx b/sw/source/core/doc/docsort.cxx index d53c7303747b..687cc7885c17 100644 --- a/sw/source/core/doc/docsort.cxx +++ b/sw/source/core/doc/docsort.cxx @@ -326,14 +326,14 @@ bool SwDoc::SortText(const SwPaM& rPaM, const SwSortOptions& rOpt) SwUndoSort* pUndoSort = 0; // To-Do - add 'SwExtraRedlineTbl' also ? - if( IsRedlineOn() || (!IsIgnoreRedline() && !mpRedlineTbl->empty() )) + if( getIDocumentRedlineAccess().IsRedlineOn() || (!getIDocumentRedlineAccess().IsIgnoreRedline() && !getIDocumentRedlineAccess().GetRedlineTbl().empty() )) { pRedlPam = new SwPaM( pStart->nNode, pEnd->nNode, -1, 1 ); SwCntntNode* pCNd = pRedlPam->GetCntntNode( false ); if( pCNd ) pRedlPam->GetMark()->nContent = pCNd->Len(); - if( IsRedlineOn() && !IsShowOriginal( GetRedlineMode() ) ) + if( getIDocumentRedlineAccess().IsRedlineOn() && !IDocumentRedlineAccess::IsShowOriginal( getIDocumentRedlineAccess().GetRedlineMode() ) ) { if( bUndo ) { @@ -346,7 +346,7 @@ bool SwDoc::SortText(const SwPaM& rPaM, const SwSortOptions& rOpt) GetNodes()._Copy( aRg, aEndIdx ); // range is new from pEnd->nNode+1 to aEndIdx - DeleteRedline( *pRedlPam, true, USHRT_MAX ); + getIDocumentRedlineAccess().DeleteRedline( *pRedlPam, true, USHRT_MAX ); pRedlPam->GetMark()->nNode.Assign( pEnd->nNode.GetNode(), 1 ); pCNd = pRedlPam->GetCntntNode( false ); @@ -368,7 +368,7 @@ bool SwDoc::SortText(const SwPaM& rPaM, const SwSortOptions& rOpt) } else { - DeleteRedline( *pRedlPam, true, USHRT_MAX ); + getIDocumentRedlineAccess().DeleteRedline( *pRedlPam, true, USHRT_MAX ); delete pRedlPam, pRedlPam = 0; } } @@ -442,10 +442,10 @@ bool SwDoc::SortText(const SwPaM& rPaM, const SwSortOptions& rOpt) SwCntntNode* pCNd = aSttIdx.GetNode().GetCntntNode(); pRedlPam->GetPoint()->nContent.Assign( pCNd, 0 ); - AppendRedline(pDeleteRedline, true); + getIDocumentRedlineAccess().AppendRedline(pDeleteRedline, true); // the sorted range is inserted - AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, *pRedlPam ), true); + getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, *pRedlPam ), true); if( pRedlUndo ) { @@ -492,8 +492,8 @@ bool SwDoc::SortTbl(const SwSelBoxes& rBoxes, const SwSortOptions& rOpt) if(aFndBox.GetLines().empty()) return false; - if( !IsIgnoreRedline() && !GetRedlineTbl().empty() ) - DeleteRedline( *pTblNd, true, USHRT_MAX ); + if( !getIDocumentRedlineAccess().IsIgnoreRedline() && !getIDocumentRedlineAccess().GetRedlineTbl().empty() ) + getIDocumentRedlineAccess().DeleteRedline( *pTblNd, true, USHRT_MAX ); sal_uInt16 nStart = 0; if( pTblNd->GetTable().GetRowsToRepeat() > 0 && rOpt.eDirection == SRT_ROWS ) diff --git a/sw/source/core/doc/doctxm.cxx b/sw/source/core/doc/doctxm.cxx index 9a4d68324393..7cb16d3e4c56 100644 --- a/sw/source/core/doc/doctxm.cxx +++ b/sw/source/core/doc/doctxm.cxx @@ -37,6 +37,7 @@ #include <doc.hxx> #include <IDocumentUndoRedo.hxx> #include <DocumentSettingManager.hxx> +#include <IDocumentRedlineAccess.hxx> #include <pagefrm.hxx> #include <ndtxt.hxx> #include <swtable.hxx> @@ -841,7 +842,7 @@ void SwTOXBaseSection::Update(const SfxItemSet* pAttr, // remove old content an insert one empty textnode (to hold the layout!) SwTxtNode* pFirstEmptyNd; { - pDoc->DeleteRedline( *pSectNd, true, USHRT_MAX ); + pDoc->getIDocumentRedlineAccess().DeleteRedline( *pSectNd, true, USHRT_MAX ); SwNodeIndex aSttIdx( *pSectNd, +1 ); SwNodeIndex aEndIdx( *pSectNd->EndOfSectionNode() ); diff --git a/sw/source/core/doc/tblcpy.cxx b/sw/source/core/doc/tblcpy.cxx index 27809b7b6a26..bcf61c1099ac 100644 --- a/sw/source/core/doc/tblcpy.cxx +++ b/sw/source/core/doc/tblcpy.cxx @@ -24,6 +24,7 @@ #include <doc.hxx> #include <IDocumentUndoRedo.hxx> #include <DocumentContentOperationsManager.hxx> +#include <IDocumentRedlineAccess.hxx> #include <cntfrm.hxx> #include <pam.hxx> #include <swtable.hxx> @@ -529,7 +530,7 @@ static void lcl_CpyBox( const SwTable& rCpyTbl, const SwTableBox* pCpyBox, if( pUndo ) pUndo->AddBoxBefore( *pDstBox, bDelCntnt ); - bool bUndoRedline = pUndo && pDoc->IsRedlineOn(); + bool bUndoRedline = pUndo && pDoc->getIDocumentRedlineAccess().IsRedlineOn(); ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo()); SwNodeIndex aSavePos( aInsIdx, -1 ); diff --git a/sw/source/core/doc/tblrwcl.cxx b/sw/source/core/doc/tblrwcl.cxx index fb11fb9c3626..7101be27602f 100644 --- a/sw/source/core/doc/tblrwcl.cxx +++ b/sw/source/core/doc/tblrwcl.cxx @@ -32,6 +32,7 @@ #include <IDocumentSettingAccess.hxx> #include <IDocumentChartDataProviderAccess.hxx> #include <DocumentContentOperationsManager.hxx> +#include <IDocumentRedlineAccess.hxx> #include <cntfrm.hxx> #include <tabfrm.hxx> #include <frmtool.hxx> @@ -758,8 +759,8 @@ void _DeleteBox( SwTable& rTbl, SwTableBox* pBox, SwUndo* pUndo, pShareFmts->RemoveFormat( *rTblBoxes[ nDelPos ]->GetFrmFmt() ); // Before deleting the 'Table Box' from memory - delete any redlines attached to it - if ( rTbl.GetFrmFmt()->GetDoc()->HasExtraRedlineTbl() ) - rTbl.GetFrmFmt()->GetDoc()->GetExtraRedlineTbl().DeleteTableCellRedline( rTbl.GetFrmFmt()->GetDoc(), *(rTblBoxes[nDelPos]), true, USHRT_MAX ); + if ( rTbl.GetFrmFmt()->GetDoc()->getIDocumentRedlineAccess().HasExtraRedlineTbl() ) + rTbl.GetFrmFmt()->GetDoc()->getIDocumentRedlineAccess().GetExtraRedlineTbl().DeleteTableCellRedline( rTbl.GetFrmFmt()->GetDoc(), *(rTblBoxes[nDelPos]), true, USHRT_MAX ); delete rTblBoxes[nDelPos]; rTblBoxes.erase( rTblBoxes.begin() + nDelPos ); @@ -811,8 +812,8 @@ void _DeleteBox( SwTable& rTbl, SwTableBox* pBox, SwUndo* pUndo, SwTableLine* pTabLineToDelete = rTbl.GetTabLines()[ nDelPos ]; // Before deleting the 'Table Line' from memory - delete any redlines attached to it - if ( rTbl.GetFrmFmt()->GetDoc()->HasExtraRedlineTbl() ) - rTbl.GetFrmFmt()->GetDoc()->GetExtraRedlineTbl().DeleteTableRowRedline( rTbl.GetFrmFmt()->GetDoc(), *pTabLineToDelete, true, USHRT_MAX ); + if ( rTbl.GetFrmFmt()->GetDoc()->getIDocumentRedlineAccess().HasExtraRedlineTbl() ) + rTbl.GetFrmFmt()->GetDoc()->getIDocumentRedlineAccess().GetExtraRedlineTbl().DeleteTableRowRedline( rTbl.GetFrmFmt()->GetDoc(), *pTabLineToDelete, true, USHRT_MAX ); delete pTabLineToDelete; rTbl.GetTabLines().erase( rTbl.GetTabLines().begin() + nDelPos ); break; // we cannot delete more @@ -826,8 +827,8 @@ void _DeleteBox( SwTable& rTbl, SwTableBox* pBox, SwUndo* pUndo, SwTableLine* pTabLineToDelete = pBox->GetTabLines()[ nDelPos ]; // Before deleting the 'Table Line' from memory - delete any redlines attached to it - if ( rTbl.GetFrmFmt()->GetDoc()->HasExtraRedlineTbl() ) - rTbl.GetFrmFmt()->GetDoc()->GetExtraRedlineTbl().DeleteTableRowRedline( rTbl.GetFrmFmt()->GetDoc(), *pTabLineToDelete, true, USHRT_MAX ); + if ( rTbl.GetFrmFmt()->GetDoc()->getIDocumentRedlineAccess().HasExtraRedlineTbl() ) + rTbl.GetFrmFmt()->GetDoc()->getIDocumentRedlineAccess().GetExtraRedlineTbl().DeleteTableRowRedline( rTbl.GetFrmFmt()->GetDoc(), *pTabLineToDelete, true, USHRT_MAX ); delete pTabLineToDelete; pBox->GetTabLines().erase( pBox->GetTabLines().begin() + nDelPos ); } while( pBox->GetTabLines().empty() ); diff --git a/sw/source/core/docnode/ndsect.cxx b/sw/source/core/docnode/ndsect.cxx index e622c4066b8c..5f3312e6ec10 100644 --- a/sw/source/core/docnode/ndsect.cxx +++ b/sw/source/core/docnode/ndsect.cxx @@ -194,8 +194,8 @@ SwDoc::InsertSwSection(SwPaM const& rRange, SwSectionData & rNewData, SwSectionNode* pNewSectNode = 0; - RedlineMode_t eOld = GetRedlineMode(); - SetRedlineMode_intern( (RedlineMode_t)((eOld & ~nsRedlineMode_t::REDLINE_SHOW_MASK) | nsRedlineMode_t::REDLINE_IGNORE)); + RedlineMode_t eOld = getIDocumentRedlineAccess().GetRedlineMode(); + getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)((eOld & ~nsRedlineMode_t::REDLINE_SHOW_MASK) | nsRedlineMode_t::REDLINE_IGNORE)); if( rRange.HasMark() ) { @@ -316,19 +316,19 @@ SwDoc::InsertSwSection(SwPaM const& rRange, SwSectionData & rNewData, pNewSectNode->CheckSectionCondColl(); //FEATURE::CONDCOLL - SetRedlineMode_intern( eOld ); + getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); // To-Do - add 'SwExtraRedlineTbl' also ? - if( IsRedlineOn() || (!IsIgnoreRedline() && !mpRedlineTbl->empty() )) + if( getIDocumentRedlineAccess().IsRedlineOn() || (!getIDocumentRedlineAccess().IsIgnoreRedline() && !getIDocumentRedlineAccess().GetRedlineTbl().empty() )) { SwPaM aPam( *pNewSectNode->EndOfSectionNode(), *pNewSectNode, 1 ); - if( IsRedlineOn() ) + if( getIDocumentRedlineAccess().IsRedlineOn() ) { - AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); + getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); } else { - SplitRedline( aPam ); + getIDocumentRedlineAccess().SplitRedline( aPam ); } } diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx index 0b5476838530..380ba88fd77d 100644 --- a/sw/source/core/docnode/ndtbl.cxx +++ b/sw/source/core/docnode/ndtbl.cxx @@ -42,6 +42,7 @@ #include <UndoManager.hxx> #include <DocumentSettingManager.hxx> #include <IDocumentChartDataProviderAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <cntfrm.hxx> #include <pam.hxx> #include <swcrsr.hxx> @@ -537,13 +538,13 @@ const SwTable* SwDoc::InsertTable( const SwInsertTableOptions& rInsTblOpts, pTblNd->MakeFrms( &aNdIdx ); // To-Do - add 'SwExtraRedlineTbl' also ? - if( IsRedlineOn() || (!IsIgnoreRedline() && !mpRedlineTbl->empty() )) + if( getIDocumentRedlineAccess().IsRedlineOn() || (!getIDocumentRedlineAccess().IsIgnoreRedline() && !getIDocumentRedlineAccess().GetRedlineTbl().empty() )) { SwPaM aPam( *pTblNd->EndOfSectionNode(), *pTblNd, 1 ); - if( IsRedlineOn() ) - AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); + if( getIDocumentRedlineAccess().IsRedlineOn() ) + getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); else - SplitRedline( aPam ); + getIDocumentRedlineAccess().SplitRedline( aPam ); } SetModified(); @@ -2216,8 +2217,8 @@ sal_uInt16 SwDoc::MergeTbl( SwPaM& rPam ) // #i33394# GetIDocumentUndoRedo().StartUndo( UNDO_TABLE_MERGE, NULL ); - RedlineMode_t eOld = GetRedlineMode(); - SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); + RedlineMode_t eOld = getIDocumentRedlineAccess().GetRedlineMode(); + getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); SwUndoTblMerge *const pUndo( (GetIDocumentUndoRedo().DoesUndo()) ? new SwUndoTblMerge( rPam ) @@ -2230,7 +2231,7 @@ sal_uInt16 SwDoc::MergeTbl( SwPaM& rPam ) if( !rTable.PrepareMerge( rPam, aBoxes, aMerged, &pMergeBox, pUndo ) ) { // No cells found to merge - SetRedlineMode_intern( eOld ); + getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); if( pUndo ) { delete pUndo; @@ -2294,7 +2295,7 @@ sal_uInt16 SwDoc::MergeTbl( SwPaM& rPam ) rPam.Move(); ::ClearFEShellTabCols(); - SetRedlineMode_intern( eOld ); + getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } GetIDocumentUndoRedo().EndUndo( UNDO_TABLE_MERGE, NULL ); return nRet; @@ -2449,8 +2450,8 @@ void SwTableNode::RemoveRedlines() if (pDoc) { SwTable& rTbl = GetTable(); - if ( pDoc->HasExtraRedlineTbl() ) - pDoc->GetExtraRedlineTbl().DeleteAllTableRedlines( pDoc, rTbl, true, USHRT_MAX ); + if ( pDoc->getIDocumentRedlineAccess().HasExtraRedlineTbl() ) + pDoc->getIDocumentRedlineAccess().GetExtraRedlineTbl().DeleteAllTableRedlines( pDoc, rTbl, true, USHRT_MAX ); } } @@ -4260,9 +4261,9 @@ bool SwDoc::InsCopyOfTbl( SwPosition& rInsPos, const SwSelBoxes& rBoxes, } else { - RedlineMode_t eOld = GetRedlineMode(); - if( IsRedlineOn() ) - SetRedlineMode( (RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | + RedlineMode_t eOld = getIDocumentRedlineAccess().GetRedlineMode(); + if( getIDocumentRedlineAccess().IsRedlineOn() ) + getIDocumentRedlineAccess().SetRedlineMode( (RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)); @@ -4358,7 +4359,7 @@ bool SwDoc::InsCopyOfTbl( SwPosition& rInsPos, const SwSelBoxes& rBoxes, rInsPos.nNode = *pSttNd; rInsPos.nContent.Assign( GetNodes().GoNext( &rInsPos.nNode ), 0 ); } - SetRedlineMode( eOld ); + getIDocumentRedlineAccess().SetRedlineMode( eOld ); } if( bRet ) diff --git a/sw/source/core/docnode/node.cxx b/sw/source/core/docnode/node.cxx index 027a38c63cae..8d31f7f0d3a0 100644 --- a/sw/source/core/docnode/node.cxx +++ b/sw/source/core/docnode/node.cxx @@ -62,6 +62,7 @@ #include <IDocumentListItems.hxx> #include <DocumentSettingManager.hxx> #include <IDocumentLinksAdministration.hxx> +#include <IDocumentRedlineAccess.hxx> #include <switerator.hxx> #include "ndole.hxx" @@ -1910,7 +1911,7 @@ drawinglayer::attribute::SdrAllFillAttributesHelperPtr SwCntntNode::getSdrAllFil */ const IDocumentSettingAccess* SwNode::getIDocumentSettingAccess() const { return &GetDoc()->GetDocumentSettingManager(); } const IDocumentDeviceAccess* SwNode::getIDocumentDeviceAccess() const { return &GetDoc()->getIDocumentDeviceAccess(); } -const IDocumentRedlineAccess* SwNode::getIDocumentRedlineAccess() const { return GetDoc(); } +const IDocumentRedlineAccess* SwNode::getIDocumentRedlineAccess() const { return &GetDoc()->getIDocumentRedlineAccess(); } const IDocumentStylePoolAccess* SwNode::getIDocumentStylePoolAccess() const { return GetDoc(); } const IDocumentLineNumberAccess* SwNode::getIDocumentLineNumberAccess() const { return GetDoc(); } const IDocumentDrawModelAccess* SwNode::getIDocumentDrawModelAccess() const { return & GetDoc()->getIDocumentDrawModelAccess(); } @@ -1932,7 +1933,7 @@ bool SwNode::IsInRedlines() const bool bResult = false; if (pDoc != NULL) - bResult = pDoc->IsInRedlines(*this); + bResult = pDoc->getIDocumentRedlineAccess().IsInRedlines(*this); return bResult; } diff --git a/sw/source/core/docnode/nodedump.cxx b/sw/source/core/docnode/nodedump.cxx index e082caffbff4..23f61fb3e24f 100644 --- a/sw/source/core/docnode/nodedump.cxx +++ b/sw/source/core/docnode/nodedump.cxx @@ -10,6 +10,7 @@ #include "doc.hxx" #include "drawdoc.hxx" #include <IDocumentDrawModelAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <UndoManager.hxx> #include "ndtxt.hxx" #include "MarkManager.hxx" @@ -190,8 +191,8 @@ void SwDoc::dumpAsXml( xmlTextWriterPtr w ) mpSpzFrmFmtTbl->dumpAsXml( writer, "spzFrmFmtTbl" ); mpSectionFmtTbl->dumpAsXml( writer ); mpNumRuleTbl->dumpAsXml( writer ); - mpRedlineTbl->dumpAsXml( writer ); - mpExtraRedlineTbl->dumpAsXml( writer ); + getIDocumentRedlineAccess().GetRedlineTbl().dumpAsXml( writer ); + getIDocumentRedlineAccess().GetExtraRedlineTbl().dumpAsXml( writer ); lcl_dumpSdrModel( writer, getIDocumentDrawModelAccess().GetDrawModel() ); writer.startElement("mbModified"); diff --git a/sw/source/core/docnode/section.cxx b/sw/source/core/docnode/section.cxx index 000d2fddcd6d..0e570565dec2 100644 --- a/sw/source/core/docnode/section.cxx +++ b/sw/source/core/docnode/section.cxx @@ -35,6 +35,7 @@ #include <IDocumentUndoRedo.hxx> #include <DocumentLinksAdministrationManager.hxx> #include <DocumentContentOperationsManager.hxx> +#include <IDocumentRedlineAccess.hxx> #include <node.hxx> #include <pam.hxx> #include <frmtool.hxx> @@ -1263,8 +1264,8 @@ static void lcl_UpdateLinksInSect( SwBaseLink& rUpdLnk, SwSectionNode& rSectNd ) if( nRet ) { SwDoc* pSrcDoc = ((SwDocShell*)&xDocSh)->GetDoc(); - eOldRedlineMode = pSrcDoc->GetRedlineMode(); - pSrcDoc->SetRedlineMode( nsRedlineMode_t::REDLINE_SHOW_INSERT ); + eOldRedlineMode = pSrcDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pSrcDoc->getIDocumentRedlineAccess().SetRedlineMode( nsRedlineMode_t::REDLINE_SHOW_INSERT ); } } @@ -1374,7 +1375,7 @@ static void lcl_UpdateLinksInSect( SwBaseLink& rUpdLnk, SwSectionNode& rSectNd ) if( 2 == nRet ) xDocSh->DoClose(); else if( ((SwDocShell*)&xDocSh)->GetDoc() ) - ((SwDocShell*)&xDocSh)->GetDoc()->SetRedlineMode( + ((SwDocShell*)&xDocSh)->GetDoc()->getIDocumentRedlineAccess().SetRedlineMode( eOldRedlineMode ); } } diff --git a/sw/source/core/edit/autofmt.cxx b/sw/source/core/edit/autofmt.cxx index 4c40b2d51b54..c13e18c34b9f 100644 --- a/sw/source/core/edit/autofmt.cxx +++ b/sw/source/core/edit/autofmt.cxx @@ -40,6 +40,7 @@ #include <fmtanchr.hxx> #include <doc.hxx> #include <IDocumentUndoRedo.hxx> +#include <DocumentRedlineManager.hxx> #include <docary.hxx> #include <editsh.hxx> #include <index.hxx> @@ -221,7 +222,7 @@ class SwAutoFormat bool SetRedlineTxt( sal_uInt16 nId ) { if( m_aFlags.bWithRedlining ) _SetRedlineTxt( nId ); return true; } bool ClearRedlineTxt() - { if( m_aFlags.bWithRedlining ) m_pDoc->SetAutoFmtRedlineComment(0); return true; } + { if( m_aFlags.bWithRedlining ) m_pDoc->GetDocumentRedlineManager().SetAutoFmtRedlineComment(0); return true; } public: SwAutoFormat( SwEditShell* pEdShell, SvxSwAutoFmtFlags& rFlags, @@ -284,7 +285,7 @@ void SwAutoFormat::_SetRedlineTxt( sal_uInt16 nActionId ) sTxt = "Action text is missing"; #endif - m_pDoc->SetAutoFmtRedlineComment( &sTxt, nSeqNo ); + m_pDoc->GetDocumentRedlineManager().SetAutoFmtRedlineComment( &sTxt, nSeqNo ); } OUString SwAutoFormat::GoNextPara() @@ -1749,7 +1750,7 @@ void SwAutoFormat::BuildHeadLine( sal_uInt16 nLvl ) OUString sTxt(SwViewShell::GetShellRes()->GetAutoFmtNameLst()[ STR_AUTOFMTREDL_SET_TMPL_HEADLINE ] ); sTxt = sTxt.replaceAll( "$(ARG1)", OUString::number( nLvl + 1 ) ); - m_pDoc->SetAutoFmtRedlineComment( &sTxt ); + m_pDoc->GetDocumentRedlineManager().SetAutoFmtRedlineComment( &sTxt ); } SetColl( static_cast<sal_uInt16>(RES_POOLCOLL_HEADLINE1 + nLvl ), true ); @@ -1947,7 +1948,7 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) aFInfo.SetFrm( 0 ); } //#125102# in case of the mode REDLINE_SHOW_DELETE the ** are still contained in pTxt - if(0 == (m_pDoc->GetRedlineMode() & nsRedlineMode_t::REDLINE_SHOW_DELETE)) + if(0 == (m_pDoc->getIDocumentRedlineAccess().GetRedlineMode() & nsRedlineMode_t::REDLINE_SHOW_DELETE)) nPos = m_aDelPam.GetPoint()->nContent.GetIndex() - 1; // Was a character deleted before starting? if (cBlank && cBlank != (*pTxt)[nSttPos - 1]) @@ -2120,7 +2121,7 @@ SwAutoFormat::SwAutoFormat( SwEditShell* pEdShell, SvxSwAutoFmtFlags& rFlags, m_nEndNdIdx = m_aEndNdIdx.GetIndex(), m_pDoc->GetDocShell() ); - RedlineMode_t eRedlMode = m_pDoc->GetRedlineMode(), eOldMode = eRedlMode; + RedlineMode_t eRedlMode = m_pDoc->getIDocumentRedlineAccess().GetRedlineMode(), eOldMode = eRedlMode; if( m_aFlags.bWithRedlining ) { m_pDoc->SetAutoFmtRedline( true ); @@ -2128,7 +2129,7 @@ SwAutoFormat::SwAutoFormat( SwEditShell* pEdShell, SvxSwAutoFmtFlags& rFlags, } else eRedlMode = (RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_IGNORE); - m_pDoc->SetRedlineMode( eRedlMode ); + m_pDoc->getIDocumentRedlineAccess().SetRedlineMode( eRedlMode ); // save undo state (might be turned off) bool const bUndoState = m_pDoc->GetIDocumentUndoRedo().DoesUndo(); @@ -2505,7 +2506,7 @@ SwAutoFormat::SwAutoFormat( SwEditShell* pEdShell, SvxSwAutoFmtFlags& rFlags, if( m_aFlags.bWithRedlining ) m_pDoc->SetAutoFmtRedline( false ); - m_pDoc->SetRedlineMode( eOldMode ); + m_pDoc->getIDocumentRedlineAccess().SetRedlineMode( eOldMode ); // restore undo (in case it has been changed) m_pDoc->GetIDocumentUndoRedo().DoUndo(bUndoState); diff --git a/sw/source/core/edit/edglss.cxx b/sw/source/core/edit/edglss.cxx index a4f0d5feb84e..e3ab17944f7d 100644 --- a/sw/source/core/edit/edglss.cxx +++ b/sw/source/core/edit/edglss.cxx @@ -22,6 +22,7 @@ #include <hintids.hxx> #include <svl/urihelper.hxx> #include <doc.hxx> +#include <IDocumentRedlineAccess.hxx> #include <pam.hxx> #include <docary.hxx> #include <editsh.hxx> @@ -64,9 +65,9 @@ sal_uInt16 SwEditShell::MakeGlossary( SwTextBlocks& rBlks, const OUString& rName rBlks.ClearDoc(); if( rBlks.BeginPutDoc( rShortName, rName ) ) { - rBlks.GetDoc()->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_DELETE_REDLINES ); + rBlks.GetDoc()->getIDocumentRedlineAccess().SetRedlineMode_intern( nsRedlineMode_t::REDLINE_DELETE_REDLINES ); _CopySelToDoc( pGDoc ); - rBlks.GetDoc()->SetRedlineMode_intern( (RedlineMode_t)0 ); + rBlks.GetDoc()->getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)0 ); nRet = rBlks.PutDoc(); } else diff --git a/sw/source/core/edit/edlingu.cxx b/sw/source/core/edit/edlingu.cxx index 5b13e2828730..a009f0fef255 100644 --- a/sw/source/core/edit/edlingu.cxx +++ b/sw/source/core/edit/edlingu.cxx @@ -38,6 +38,7 @@ #include <editsh.hxx> #include <doc.hxx> #include <IDocumentUndoRedo.hxx> +#include <IDocumentRedlineAccess.hxx> #include <rootfrm.hxx> #include <pam.hxx> #include <swundo.hxx> @@ -1255,18 +1256,18 @@ static SpellContentPositions lcl_CollectDeletedRedlines(SwEditShell* pSh) { SpellContentPositions aRedlines; SwDoc* pDoc = pSh->GetDoc(); - const bool bShowChg = IDocumentRedlineAccess::IsShowChanges( pDoc->GetRedlineMode() ); + const bool bShowChg = IDocumentRedlineAccess::IsShowChanges( pDoc->getIDocumentRedlineAccess().GetRedlineMode() ); if ( bShowChg ) { SwPaM *pCrsr = pSh->GetCrsr(); const SwPosition* pStartPos = pCrsr->Start(); const SwTxtNode* pTxtNode = pCrsr->GetNode().GetTxtNode(); - sal_uInt16 nAct = pDoc->GetRedlinePos( *pTxtNode, USHRT_MAX ); + sal_uInt16 nAct = pDoc->getIDocumentRedlineAccess().GetRedlinePos( *pTxtNode, USHRT_MAX ); const sal_Int32 nStartIndex = pStartPos->nContent.GetIndex(); - for ( ; nAct < pDoc->GetRedlineTbl().size(); nAct++ ) + for ( ; nAct < pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size(); nAct++ ) { - const SwRangeRedline* pRed = pDoc->GetRedlineTbl()[ nAct ]; + const SwRangeRedline* pRed = pDoc->getIDocumentRedlineAccess().GetRedlineTbl()[ nAct ]; if ( pRed->Start()->nNode > pTxtNode->GetIndex() ) break; diff --git a/sw/source/core/edit/edredln.cxx b/sw/source/core/edit/edredln.cxx index aff204031f0c..d77f621152b3 100644 --- a/sw/source/core/edit/edredln.cxx +++ b/sw/source/core/edit/edredln.cxx @@ -28,33 +28,33 @@ sal_uInt16 SwEditShell::GetRedlineMode() const { - return GetDoc()->GetRedlineMode(); + return GetDoc()->getIDocumentRedlineAccess().GetRedlineMode(); } void SwEditShell::SetRedlineMode( sal_uInt16 eMode ) { - if( eMode != GetDoc()->GetRedlineMode() ) + if( eMode != GetDoc()->getIDocumentRedlineAccess().GetRedlineMode() ) { SET_CURR_SHELL( this ); StartAllAction(); - GetDoc()->SetRedlineMode( (RedlineMode_t)eMode ); + GetDoc()->getIDocumentRedlineAccess().SetRedlineMode( (RedlineMode_t)eMode ); EndAllAction(); } } bool SwEditShell::IsRedlineOn() const { - return GetDoc()->IsRedlineOn(); + return GetDoc()->getIDocumentRedlineAccess().IsRedlineOn(); } sal_uInt16 SwEditShell::GetRedlineCount() const { - return GetDoc()->GetRedlineTbl().size(); + return GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl().size(); } const SwRangeRedline& SwEditShell::GetRedline( sal_uInt16 nPos ) const { - return *GetDoc()->GetRedlineTbl()[ nPos ]; + return *GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl()[ nPos ]; } static void lcl_InvalidateAll( SwViewShell* pSh ) @@ -73,7 +73,7 @@ bool SwEditShell::AcceptRedline( sal_uInt16 nPos ) { SET_CURR_SHELL( this ); StartAllAction(); - bool bRet = GetDoc()->AcceptRedline( nPos, true ); + bool bRet = GetDoc()->getIDocumentRedlineAccess().AcceptRedline( nPos, true ); if( !nPos && !::IsExtraData( GetDoc() ) ) lcl_InvalidateAll( this ); EndAllAction(); @@ -84,7 +84,7 @@ bool SwEditShell::RejectRedline( sal_uInt16 nPos ) { SET_CURR_SHELL( this ); StartAllAction(); - bool bRet = GetDoc()->RejectRedline( nPos, true ); + bool bRet = GetDoc()->getIDocumentRedlineAccess().RejectRedline( nPos, true ); if( !nPos && !::IsExtraData( GetDoc() ) ) lcl_InvalidateAll( this ); EndAllAction(); @@ -95,7 +95,7 @@ bool SwEditShell::AcceptRedlinesInSelection() { SET_CURR_SHELL( this ); StartAllAction(); - bool bRet = GetDoc()->AcceptRedline( *GetCrsr(), true ); + bool bRet = GetDoc()->getIDocumentRedlineAccess().AcceptRedline( *GetCrsr(), true ); EndAllAction(); return bRet; } @@ -104,7 +104,7 @@ bool SwEditShell::RejectRedlinesInSelection() { SET_CURR_SHELL( this ); StartAllAction(); - bool bRet = GetDoc()->RejectRedline( *GetCrsr(), true ); + bool bRet = GetDoc()->getIDocumentRedlineAccess().RejectRedline( *GetCrsr(), true ); EndAllAction(); return bRet; } @@ -114,7 +114,7 @@ bool SwEditShell::SetRedlineComment( const OUString& rS ) { bool bRet = false; FOREACHPAM_START(GetCrsr()) - bRet = bRet || GetDoc()->SetRedlineComment( *PCURCRSR, rS ); + bRet = bRet || GetDoc()->getIDocumentRedlineAccess().SetRedlineComment( *PCURCRSR, rS ); FOREACHPAM_END() return bRet; @@ -122,18 +122,18 @@ bool SwEditShell::SetRedlineComment( const OUString& rS ) const SwRangeRedline* SwEditShell::GetCurrRedline() const { - return GetDoc()->GetRedline( *GetCrsr()->GetPoint(), 0 ); + return GetDoc()->getIDocumentRedlineAccess().GetRedline( *GetCrsr()->GetPoint(), 0 ); } void SwEditShell::UpdateRedlineAttr() { if( ( nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE ) == - ( nsRedlineMode_t::REDLINE_SHOW_MASK & GetDoc()->GetRedlineMode() )) + ( nsRedlineMode_t::REDLINE_SHOW_MASK & GetDoc()->getIDocumentRedlineAccess().GetRedlineMode() )) { SET_CURR_SHELL( this ); StartAllAction(); - GetDoc()->UpdateRedlineAttr(); + GetDoc()->getIDocumentRedlineAccess().UpdateRedlineAttr(); EndAllAction(); } @@ -145,7 +145,7 @@ void SwEditShell::UpdateRedlineAttr() */ sal_uInt16 SwEditShell::FindRedlineOfData( const SwRedlineData& rData ) const { - const SwRedlineTbl& rTbl = GetDoc()->GetRedlineTbl(); + const SwRedlineTbl& rTbl = GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl(); for( sal_uInt16 i = 0, nCnt = rTbl.size(); i < nCnt; ++i ) if( &rTbl[ i ]->GetRedlineData() == &rData ) diff --git a/sw/source/core/edit/edundo.cxx b/sw/source/core/edit/edundo.cxx index 84539b5b6026..73c98c53482f 100644 --- a/sw/source/core/edit/edundo.cxx +++ b/sw/source/core/edit/edundo.cxx @@ -24,6 +24,7 @@ #include <doc.hxx> #include <IDocumentUndoRedo.hxx> #include <IDocumentContentOperations.hxx> +#include <IDocumentRedlineAccess.hxx> #include <pam.hxx> #include <UndoCore.hxx> #include <swundo.hxx> @@ -122,7 +123,7 @@ bool SwEditShell::Undo(sal_uInt16 const nCount) // Destroy stored TableBoxPtr. A dection is only permitted for the new "Box"! ClearTblBoxCntnt(); - const RedlineMode_t eOld = GetDoc()->GetRedlineMode(); + const RedlineMode_t eOld = GetDoc()->getIDocumentRedlineAccess().GetRedlineMode(); try { for (sal_uInt16 i = 0; i < nCount; ++i) @@ -142,8 +143,8 @@ bool SwEditShell::Undo(sal_uInt16 const nCount) } Pop( !bRestoreCrsr ); - GetDoc()->SetRedlineMode( eOld ); - GetDoc()->CompressRedlines(); + GetDoc()->getIDocumentRedlineAccess().SetRedlineMode( eOld ); + GetDoc()->getIDocumentRedlineAccess().CompressRedlines(); // automatic detection of the new "Box" SaveTblBoxCntnt(); @@ -179,7 +180,7 @@ bool SwEditShell::Redo(sal_uInt16 const nCount) // Destroy stored TableBoxPtr. A dection is only permitted for the new "Box"! ClearTblBoxCntnt(); - RedlineMode_t eOld = GetDoc()->GetRedlineMode(); + RedlineMode_t eOld = GetDoc()->getIDocumentRedlineAccess().GetRedlineMode(); try { for (sal_uInt16 i = 0; i < nCount; ++i) @@ -195,8 +196,8 @@ bool SwEditShell::Redo(sal_uInt16 const nCount) Pop( !bRestoreCrsr ); - GetDoc()->SetRedlineMode( eOld ); - GetDoc()->CompressRedlines(); + GetDoc()->getIDocumentRedlineAccess().SetRedlineMode( eOld ); + GetDoc()->getIDocumentRedlineAccess().CompressRedlines(); // automatic detection of the new "Box" SaveTblBoxCntnt(); diff --git a/sw/source/core/frmedt/fecopy.cxx b/sw/source/core/frmedt/fecopy.cxx index 5d052c763ed3..d66182b25eb5 100644 --- a/sw/source/core/frmedt/fecopy.cxx +++ b/sw/source/core/frmedt/fecopy.cxx @@ -55,6 +55,7 @@ #include <doc.hxx> #include <IDocumentUndoRedo.hxx> #include <IDocumentDrawModelAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <rootfrm.hxx> #include <ndtxt.hxx> #include <pam.hxx> @@ -115,7 +116,7 @@ bool SwFEShell::Copy( SwDoc* pClpDoc, const OUString* pNewClpTxt ) } pClpDoc->LockExpFlds(); - pClpDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_DELETE_REDLINES ); + pClpDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( nsRedlineMode_t::REDLINE_DELETE_REDLINES ); bool bRet; // do we want to copy a FlyFrame? @@ -214,7 +215,7 @@ bool SwFEShell::Copy( SwDoc* pClpDoc, const OUString* pNewClpTxt ) else bRet = _CopySelToDoc( pClpDoc, 0 ); // copy the selections - pClpDoc->SetRedlineMode_intern((RedlineMode_t)0 ); + pClpDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)0 ); pClpDoc->UnlockExpFlds(); if( !pClpDoc->IsExpFldsLocked() ) pClpDoc->UpdateExpFlds(NULL, true); @@ -456,8 +457,8 @@ bool SwFEShell::Copy( SwFEShell* pDestShell, const Point& rSttPt, // set a flag in Doc, handled in TextNodes mpDoc->SetCopyIsMove( true ); - RedlineMode_t eOldRedlMode = pDestShell->GetDoc()->GetRedlineMode(); - pDestShell->GetDoc()->SetRedlineMode_intern( (RedlineMode_t)(eOldRedlMode | nsRedlineMode_t::REDLINE_DELETE_REDLINES)); + RedlineMode_t eOldRedlMode = pDestShell->GetDoc()->getIDocumentRedlineAccess().GetRedlineMode(); + pDestShell->GetDoc()->getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)(eOldRedlMode | nsRedlineMode_t::REDLINE_DELETE_REDLINES)); // If there are table formulas in the area, then display the table first // so that the table formula can calculate a new value first @@ -638,7 +639,7 @@ bool SwFEShell::Copy( SwFEShell* pDestShell, const Point& rSttPt, bRet = 0 != SwEditShell::Copy( pDestShell ); } - pDestShell->GetDoc()->SetRedlineMode_intern( eOldRedlMode ); + pDestShell->GetDoc()->getIDocumentRedlineAccess().SetRedlineMode_intern( eOldRedlMode ); mpDoc->SetCopyIsMove( bCopyIsMove ); // have new table formules been inserted? diff --git a/sw/source/core/inc/DocumentRedlineManager.hxx b/sw/source/core/inc/DocumentRedlineManager.hxx new file mode 100644 index 000000000000..0c63c493086b --- /dev/null +++ b/sw/source/core/inc/DocumentRedlineManager.hxx @@ -0,0 +1,144 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTREDLINEMANAGER_HXX +#define INCLUDED_SW_SOURCE_CORE_INC_DOCUMENTREDLINEMANAGER_HXX + +#include <IDocumentRedlineAccess.hxx> +#include <boost/utility.hpp> + +class SwDoc; + +namespace sw +{ + +class DocumentRedlineManager : public IDocumentRedlineAccess, + public ::boost::noncopyable +{ +public: + DocumentRedlineManager( SwDoc& i_rSwdoc ); + + virtual RedlineMode_t GetRedlineMode() const SAL_OVERRIDE; + + virtual void SetRedlineMode_intern(/*[in]*/RedlineMode_t eMode) SAL_OVERRIDE; + + virtual void SetRedlineMode(/*[in]*/RedlineMode_t eMode) SAL_OVERRIDE; + + virtual bool IsRedlineOn() const SAL_OVERRIDE; + + virtual bool IsIgnoreRedline() const SAL_OVERRIDE; + + virtual const SwRedlineTbl& GetRedlineTbl() const SAL_OVERRIDE; + virtual SwRedlineTbl& GetRedlineTbl() SAL_OVERRIDE; + virtual const SwExtraRedlineTbl& GetExtraRedlineTbl() const SAL_OVERRIDE; + virtual SwExtraRedlineTbl& GetExtraRedlineTbl() SAL_OVERRIDE; + virtual bool HasExtraRedlineTbl() const SAL_OVERRIDE; + + virtual bool IsInRedlines(const SwNode& rNode) const SAL_OVERRIDE; + + virtual bool AppendRedline(/*[in]*/SwRangeRedline* pPtr, /*[in]*/bool bCallDelete) SAL_OVERRIDE; + + virtual bool AppendTableRowRedline(/*[in]*/SwTableRowRedline* pPtr, /*[in]*/bool bCallDelete) SAL_OVERRIDE; + virtual bool AppendTableCellRedline(/*[in]*/SwTableCellRedline* pPtr, /*[in]*/bool bCallDelete) SAL_OVERRIDE; + + virtual bool SplitRedline(/*[in]*/const SwPaM& rPam) SAL_OVERRIDE; + + virtual bool DeleteRedline( + /*[in]*/const SwPaM& rPam, + /*[in]*/bool bSaveInUndo, + /*[in]*/sal_uInt16 nDelType) SAL_OVERRIDE; + + virtual bool DeleteRedline( + /*[in]*/const SwStartNode& rSection, + /*[in]*/bool bSaveInUndo, + /*[in]*/sal_uInt16 nDelType) SAL_OVERRIDE; + + virtual sal_uInt16 GetRedlinePos( + /*[in]*/const SwNode& rNode, + /*[in]*/sal_uInt16 nType) const SAL_OVERRIDE; + + virtual void CompressRedlines() SAL_OVERRIDE; + + virtual const SwRangeRedline* GetRedline( + /*[in]*/const SwPosition& rPos, + /*[in]*/sal_uInt16* pFndPos) const SAL_OVERRIDE; + + virtual bool IsRedlineMove() const SAL_OVERRIDE; + + virtual void SetRedlineMove(/*[in]*/bool bFlag) SAL_OVERRIDE; + + virtual bool AcceptRedline(/*[in]*/sal_uInt16 nPos, /*[in]*/bool bCallDelete) SAL_OVERRIDE; + + virtual bool AcceptRedline(/*[in]*/const SwPaM& rPam, /*[in]*/bool bCallDelete) SAL_OVERRIDE; + + virtual bool RejectRedline(/*[in]*/sal_uInt16 nPos, /*[in]*/bool bCallDelete) SAL_OVERRIDE; + + virtual bool RejectRedline(/*[in]*/const SwPaM& rPam, /*[in]*/bool bCallDelete) SAL_OVERRIDE; + + virtual const SwRangeRedline* SelNextRedline(/*[in]*/SwPaM& rPam) const SAL_OVERRIDE; + + virtual const SwRangeRedline* SelPrevRedline(/*[in]*/SwPaM& rPam) const SAL_OVERRIDE; + + virtual void UpdateRedlineAttr() SAL_OVERRIDE; + + virtual sal_uInt16 GetRedlineAuthor() SAL_OVERRIDE; + + virtual sal_uInt16 InsertRedlineAuthor(const OUString& rAuthor) SAL_OVERRIDE; + + virtual bool SetRedlineComment( + /*[in]*/const SwPaM& rPam, + /*[in]*/const OUString& rComment) SAL_OVERRIDE; + + virtual const ::com::sun::star::uno::Sequence <sal_Int8>& GetRedlinePassword() const SAL_OVERRIDE; + + virtual void SetRedlinePassword( + /*[in]*/const ::com::sun::star::uno::Sequence <sal_Int8>& rNewPassword) SAL_OVERRIDE; + + + //Non Interface methods; + + /** Set comment-text for Redline. It then comes in via AppendRedLine. + Used by AutoFormat. 0-pointer resets mode. + Sequence number is for conjoining of Redlines by the UI. */ + void SetAutoFmtRedlineComment( const OUString* pTxt, sal_uInt16 nSeqNo = 0 ); + + void checkRedlining(RedlineMode_t& _rReadlineMode); + + + virtual ~DocumentRedlineManager(); + +private: + SwDoc& m_rSwdoc; + + RedlineMode_t meRedlineMode; //< Current Redline Mode. + SwRedlineTbl *mpRedlineTbl; //< List of all Ranged Redlines. + SwExtraRedlineTbl *mpExtraRedlineTbl; //< List of all Extra Redlines. + OUString *mpAutoFmtRedlnComment; //< Comment for Redlines inserted via AutoFormat. + bool mbIsRedlineMove; //< True: Redlines are moved into to / out of the section. + bool mbReadlineChecked; //< sal_True: if the query was already shown + sal_uInt16 mnAutoFmtRedlnCommentNo; /**< SeqNo for conjoining of AutoFmt-Redlines. + by the UI. Managed by SwAutoFmt! */ + ::com::sun::star::uno::Sequence <sal_Int8 > maRedlinePasswd; +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx index 38ca293929c5..965bda821a63 100644 --- a/sw/source/core/layout/frmtool.cxx +++ b/sw/source/core/layout/frmtool.cxx @@ -63,6 +63,7 @@ #include <switerator.hxx> #include <DocumentSettingManager.hxx> #include <IDocumentTimerAccess.hxx> +#include <IDocumentRedlineAccess.hxx> //UUUU #include <svx/sdr/attribute/sdrallfillattributeshelper.hxx> @@ -3322,7 +3323,7 @@ bool IsExtraData( const SwDoc *pDoc ) return rInf.IsPaintLineNumbers() || rInf.IsCountInFlys() || ((sal_Int16)SW_MOD()->GetRedlineMarkPos() != text::HoriOrientation::NONE && - !pDoc->GetRedlineTbl().empty()); + !pDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty()); } // OD 22.09.2003 #110978# diff --git a/sw/source/core/table/swtable.cxx b/sw/source/core/table/swtable.cxx index 9e1e655ab643..0604a623665f 100644 --- a/sw/source/core/table/swtable.cxx +++ b/sw/source/core/table/swtable.cxx @@ -35,6 +35,7 @@ #include <frmatr.hxx> #include <doc.hxx> #include <IDocumentLinksAdministration.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docary.hxx> #include <frame.hxx> #include <swtable.hxx> @@ -2040,10 +2041,10 @@ void ChgTextToNum( SwTableBox& rBox, const OUString& rTxt, const Color* pCol, pTNd->DontExpandFmt( aResetIdx, false, false ); } - if( !pDoc->IsIgnoreRedline() && !pDoc->GetRedlineTbl().empty() ) + if( !pDoc->getIDocumentRedlineAccess().IsIgnoreRedline() && !pDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) { SwPaM aTemp(*pTNd, 0, *pTNd, rOrig.getLength()); - pDoc->DeleteRedline(aTemp, true, USHRT_MAX); + pDoc->getIDocumentRedlineAccess().DeleteRedline(aTemp, true, USHRT_MAX); } pTNd->EraseText( aIdx, n, @@ -2051,10 +2052,10 @@ void ChgTextToNum( SwTableBox& rBox, const OUString& rTxt, const Color* pCol, pTNd->InsertText( rTxt, aIdx, IDocumentContentOperations::INS_EMPTYEXPAND ); - if( pDoc->IsRedlineOn() ) + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) { SwPaM aTemp(*pTNd, 0, *pTNd, rTxt.getLength()); - pDoc->AppendRedline(new SwRangeRedline(nsRedlineType_t::REDLINE_INSERT, aTemp), true); + pDoc->getIDocumentRedlineAccess().AppendRedline(new SwRangeRedline(nsRedlineType_t::REDLINE_INSERT, aTemp), true); } } diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx index 15917b888a6a..b5c686a3d59a 100644 --- a/sw/source/core/text/redlnitr.cxx +++ b/sw/source/core/text/redlnitr.cxx @@ -28,6 +28,7 @@ #include <itratr.hxx> #include <ndtxt.hxx> #include <doc.hxx> +#include <IDocumentRedlineAccess.hxx> #include <rootfrm.hxx> #include <breakit.hxx> #include <vcl/keycodes.hxx> @@ -223,16 +224,16 @@ short SwRedlineItr::_Seek(SwFont& rFnt, sal_Int32 nNew, sal_Int32 nOld) nStart = COMPLETE_STRING; nEnd = COMPLETE_STRING; - for( ; nAct < (sal_Int32)rDoc.GetRedlineTbl().size() ; ++nAct ) + for( ; nAct < (sal_Int32)rDoc.getIDocumentRedlineAccess().GetRedlineTbl().size() ; ++nAct ) { - rDoc.GetRedlineTbl()[ nAct ]->CalcStartEnd( nNdIdx, nStart, nEnd ); + rDoc.getIDocumentRedlineAccess().GetRedlineTbl()[ nAct ]->CalcStartEnd( nNdIdx, nStart, nEnd ); if( nNew < nEnd ) { if( nNew >= nStart ) // der einzig moegliche Kandidat { bOn = true; - const SwRangeRedline *pRed = rDoc.GetRedlineTbl()[ nAct ]; + const SwRangeRedline *pRed = rDoc.getIDocumentRedlineAccess().GetRedlineTbl()[ nAct ]; if (pSet) pSet->ClearItem(); @@ -344,7 +345,7 @@ sal_Int32 SwRedlineItr::_GetNextRedln( sal_Int32 nNext ) if( COMPLETE_STRING == nAct ) { nAct = nFirst; - rDoc.GetRedlineTbl()[ nAct ]->CalcStartEnd( nNdIdx, nStart, nEnd ); + rDoc.getIDocumentRedlineAccess().GetRedlineTbl()[ nAct ]->CalcStartEnd( nNdIdx, nStart, nEnd ); } if( bOn || !nStart ) { @@ -382,9 +383,9 @@ bool SwRedlineItr::CheckLine( sal_Int32 nChkStart, sal_Int32 nChkEnd ) sal_Int32 nOldAct = nAct; bool bRet = false; - for( nAct = nFirst; nAct < (sal_Int32)rDoc.GetRedlineTbl().size() ; ++nAct ) + for( nAct = nFirst; nAct < (sal_Int32)rDoc.getIDocumentRedlineAccess().GetRedlineTbl().size() ; ++nAct ) { - rDoc.GetRedlineTbl()[ nAct ]->CalcStartEnd( nNdIdx, nStart, nEnd ); + rDoc.getIDocumentRedlineAccess().GetRedlineTbl()[ nAct ]->CalcStartEnd( nNdIdx, nStart, nEnd ); if( nChkEnd < nStart ) break; if( nChkStart <= nEnd && ( nChkEnd > nStart || COMPLETE_STRING == nEnd ) ) diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx index 8489f7c8e6d8..cc2c5cd2cd55 100644 --- a/sw/source/core/txtnode/ndtxt.cxx +++ b/sw/source/core/txtnode/ndtxt.cxx @@ -53,6 +53,7 @@ #include <IDocumentUndoRedo.hxx> #include <IDocumentSettingAccess.hxx> #include <IDocumentListsAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docary.hxx> #include <pam.hxx> #include <fldbas.hxx> @@ -1024,7 +1025,7 @@ void SwTxtNode::Update( SwIndexReg aTmpIdxReg; if ( !bNegative && !bDelete ) { - const SwRedlineTbl& rTbl = GetDoc()->GetRedlineTbl(); + const SwRedlineTbl& rTbl = GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl(); for ( size_t i = 0; i < rTbl.size(); ++i ) { SwRangeRedline *const pRedl = rTbl[ i ]; @@ -3345,14 +3346,14 @@ OUString SwTxtNode::GetRedlineTxt( sal_Int32 nIdx, sal_Int32 nLen, { std::vector<sal_Int32> aRedlArr; const SwDoc* pDoc = GetDoc(); - sal_uInt16 nRedlPos = pDoc->GetRedlinePos( *this, nsRedlineType_t::REDLINE_DELETE ); + sal_uInt16 nRedlPos = pDoc->getIDocumentRedlineAccess().GetRedlinePos( *this, nsRedlineType_t::REDLINE_DELETE ); if( USHRT_MAX != nRedlPos ) { // es existiert fuer den Node irgendein Redline-Delete-Object const sal_uLong nNdIdx = GetIndex(); - for( ; nRedlPos < pDoc->GetRedlineTbl().size() ; ++nRedlPos ) + for( ; nRedlPos < pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size() ; ++nRedlPos ) { - const SwRangeRedline* pTmp = pDoc->GetRedlineTbl()[ nRedlPos ]; + const SwRangeRedline* pTmp = pDoc->getIDocumentRedlineAccess().GetRedlineTbl()[ nRedlPos ]; if( nsRedlineType_t::REDLINE_DELETE == pTmp->GetType() ) { const SwPosition *pRStt = pTmp->Start(), *pREnd = pTmp->End(); diff --git a/sw/source/core/txtnode/txtedt.cxx b/sw/source/core/txtnode/txtedt.cxx index 260c697db767..3a02a7ad709f 100644 --- a/sw/source/core/txtnode/txtedt.cxx +++ b/sw/source/core/txtnode/txtedt.cxx @@ -36,6 +36,7 @@ #include <viewopt.hxx> #include <acmplwrd.hxx> #include <doc.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docsh.hxx> #include <txtfld.hxx> #include <fmtfld.hxx> @@ -105,9 +106,9 @@ lcl_MaskRedlines( const SwTxtNode& rNode, OUStringBuffer& rText, const SwDoc& rDoc = *rNode.GetDoc(); - for ( size_t nAct = rDoc.GetRedlinePos( rNode, USHRT_MAX ); nAct < rDoc.GetRedlineTbl().size(); ++nAct ) + for ( size_t nAct = rDoc.GetRedlinePos( rNode, USHRT_MAX ); nAct < rDoc.getIDocumentRedlineAccess().GetRedlineTbl().size(); ++nAct ) { - const SwRangeRedline* pRed = rDoc.GetRedlineTbl()[ nAct ]; + const SwRangeRedline* pRed = rDoc.getIDocumentRedlineAccess().GetRedlineTbl()[ nAct ]; if ( pRed->Start()->nNode > rNode.GetIndex() ) break; @@ -150,7 +151,7 @@ lcl_MaskRedlinesAndHiddenText( const SwTxtNode& rNode, OUStringBuffer& rText, sal_Int32 nHiddenCharsMasked = 0; const SwDoc& rDoc = *rNode.GetDoc(); - const bool bShowChg = IDocumentRedlineAccess::IsShowChanges( rDoc.GetRedlineMode() ); + const bool bShowChg = IDocumentRedlineAccess::IsShowChanges( rDoc.getIDocumentRedlineAccess().GetRedlineMode() ); // If called from word count or from spell checking, deleted redlines // should be masked: diff --git a/sw/source/core/undo/docundo.cxx b/sw/source/core/undo/docundo.cxx index a8733771ba39..f02a79967e54 100644 --- a/sw/source/core/undo/docundo.cxx +++ b/sw/source/core/undo/docundo.cxx @@ -35,6 +35,7 @@ #include <unobaseclass.hxx> #include <limits> #include <IDocumentDrawModelAccess.hxx> +#include <IDocumentRedlineAccess.hxx> using namespace ::com::sun::star; diff --git a/sw/source/core/undo/unattr.cxx b/sw/source/core/undo/unattr.cxx index 26e27b6617dd..d582d979eac2 100644 --- a/sw/source/core/undo/unattr.cxx +++ b/sw/source/core/undo/unattr.cxx @@ -35,6 +35,7 @@ #include <doc.hxx> #include <IDocumentUndoRedo.hxx> #include <IDocumentDrawModelAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <IShellCursorSupplier.hxx> #include <docary.hxx> #include <swundo.hxx> @@ -774,12 +775,12 @@ SwUndoAttr::~SwUndoAttr() void SwUndoAttr::SaveRedlineData( const SwPaM& rPam, bool bIsCntnt ) { SwDoc* pDoc = rPam.GetDoc(); - if ( pDoc->IsRedlineOn() ) + if ( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) { m_pRedlineData.reset( new SwRedlineData( bIsCntnt ? nsRedlineType_t::REDLINE_INSERT : nsRedlineType_t::REDLINE_FORMAT, - pDoc->GetRedlineAuthor() ) ); + pDoc->getIDocumentRedlineAccess().GetRedlineAuthor() ) ); } m_pRedlineSaveData.reset( new SwRedlineSaveDatas ); @@ -788,7 +789,7 @@ void SwUndoAttr::SaveRedlineData( const SwPaM& rPam, bool bIsCntnt ) m_pRedlineSaveData.reset(0); } - SetRedlineMode( pDoc->GetRedlineMode() ); + SetRedlineMode( pDoc->getIDocumentRedlineAccess().GetRedlineMode() ); if ( bIsCntnt ) { m_nNodeIndex = rPam.GetPoint()->nNode.GetIndex(); @@ -811,13 +812,13 @@ void SwUndoAttr::UndoImpl(::sw::UndoRedoContext & rContext) aPam.GetPoint()->nContent.Assign( aPam.GetCntntNode(), nSttCntnt ); aPam.SetMark(); aPam.GetPoint()->nContent++; - pDoc->DeleteRedline(aPam, false, USHRT_MAX); + pDoc->getIDocumentRedlineAccess().DeleteRedline(aPam, false, USHRT_MAX); } else { // remove all format redlines, will be recreated if needed SetPaM(aPam); - pDoc->DeleteRedline(aPam, false, nsRedlineType_t::REDLINE_FORMAT); + pDoc->getIDocumentRedlineAccess().DeleteRedline(aPam, false, nsRedlineType_t::REDLINE_FORMAT); if ( m_pRedlineSaveData.get() ) { SetSaveData( *pDoc, *m_pRedlineSaveData ); @@ -862,8 +863,8 @@ void SwUndoAttr::RedoImpl(::sw::UndoRedoContext & rContext) if ( m_pRedlineData.get() && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() ) ) { - RedlineMode_t eOld = rDoc.GetRedlineMode(); - rDoc.SetRedlineMode_intern(static_cast<RedlineMode_t>( + RedlineMode_t eOld = rDoc.getIDocumentRedlineAccess().GetRedlineMode(); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern(static_cast<RedlineMode_t>( eOld & ~nsRedlineMode_t::REDLINE_IGNORE)); rDoc.getIDocumentContentOperations().InsertItemSet( rPam, m_AttrSet, m_nInsertFlags ); @@ -872,17 +873,17 @@ void SwUndoAttr::RedoImpl(::sw::UndoRedoContext & rContext) rPam.SetMark(); if ( rPam.Move( fnMoveBackward ) ) { - rDoc.AppendRedline( new SwRangeRedline( *m_pRedlineData, rPam ), + rDoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( *m_pRedlineData, rPam ), true); } rPam.DeleteMark(); } else { - rDoc.AppendRedline( new SwRangeRedline( *m_pRedlineData, rPam ), true); + rDoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( *m_pRedlineData, rPam ), true); } - rDoc.SetRedlineMode_intern( eOld ); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } else { diff --git a/sw/source/core/undo/undel.cxx b/sw/source/core/undo/undel.cxx index 353b3a9587bf..ceebdc08b202 100644 --- a/sw/source/core/undo/undel.cxx +++ b/sw/source/core/undo/undel.cxx @@ -26,6 +26,7 @@ #include <fmtanchr.hxx> #include <doc.hxx> #include <UndoManager.hxx> +#include <IDocumentRedlineAccess.hxx> #include <swtable.hxx> #include <swundo.hxx> #include <pam.hxx> @@ -124,7 +125,7 @@ SwUndoDelete::SwUndoDelete( SwDoc * pDoc = rPam.GetDoc(); - if( !pDoc->IsIgnoreRedline() && !pDoc->GetRedlineTbl().empty() ) + if( !pDoc->getIDocumentRedlineAccess().IsIgnoreRedline() && !pDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) { pRedlSaveData = new SwRedlineSaveDatas; if( !FillSaveData( rPam, *pRedlSaveData )) @@ -489,7 +490,7 @@ bool SwUndoDelete::CanGrouping( SwDoc* pDoc, const SwPaM& rDelPam ) if( !bOk ) return false; - pDoc->DeleteRedline( rDelPam, false, USHRT_MAX ); + pDoc->getIDocumentRedlineAccess().DeleteRedline( rDelPam, false, USHRT_MAX ); } // Both 'deletes' can be consolidated, so 'move' the related character diff --git a/sw/source/core/undo/undobj.cxx b/sw/source/core/undo/undobj.cxx index ff2a30b72e54..6c94f665abca 100644 --- a/sw/source/core/undo/undobj.cxx +++ b/sw/source/core/undo/undobj.cxx @@ -24,6 +24,7 @@ #include <frmfmt.hxx> #include <doc.hxx> #include <UndoManager.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docary.hxx> #include <swundo.hxx> #include <pam.hxx> @@ -196,7 +197,7 @@ class UndoRedoRedlineGuard { public: UndoRedoRedlineGuard(::sw::UndoRedoContext & rContext, SwUndo & rUndo) - : m_rRedlineAccess(rContext.GetDoc()) + : m_rRedlineAccess(rContext.GetDoc().getIDocumentRedlineAccess()) , m_eMode(m_rRedlineAccess.GetRedlineMode()) { RedlineMode_t const eTmpMode = @@ -958,7 +959,7 @@ SwRedlineSaveData::SwRedlineSaveData( } #if OSL_DEBUG_LEVEL > 0 - nRedlineCount = rSttPos.nNode.GetNode().GetDoc()->GetRedlineTbl().size(); + nRedlineCount = rSttPos.nNode.GetNode().GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl().size(); #endif } @@ -983,18 +984,18 @@ void SwRedlineSaveData::RedlineToDoc( SwPaM& rPam ) // First, delete the "old" so that in an Append no unexpected things will // happen, e.g. a delete in an insert. In the latter case the just restored // content will be deleted and not the one you originally wanted. - rDoc.DeleteRedline( *pRedl, false, USHRT_MAX ); + rDoc.getIDocumentRedlineAccess().DeleteRedline( *pRedl, false, USHRT_MAX ); - RedlineMode_t eOld = rDoc.GetRedlineMode(); - rDoc.SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_DONTCOMBINE_REDLINES)); + RedlineMode_t eOld = rDoc.getIDocumentRedlineAccess().GetRedlineMode(); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_DONTCOMBINE_REDLINES)); //#i92154# let UI know about a new redline with comment if (rDoc.GetDocShell() && (!pRedl->GetComment().isEmpty()) ) rDoc.GetDocShell()->Broadcast(SwRedlineHint(pRedl,SWREDLINE_INSERTED)); - bool const bSuccess = rDoc.AppendRedline( pRedl, true ); + bool const bSuccess = rDoc.getIDocumentRedlineAccess().AppendRedline( pRedl, true ); assert(bSuccess); // SwRedlineSaveData::RedlineToDoc: insert redline failed (void) bSuccess; // unused in non-debug - rDoc.SetRedlineMode_intern( eOld ); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } bool SwUndo::FillSaveData( @@ -1008,9 +1009,9 @@ bool SwUndo::FillSaveData( SwRedlineSaveData* pNewData; const SwPosition* pStt = rRange.Start(); const SwPosition* pEnd = rRange.End(); - const SwRedlineTbl& rTbl = rRange.GetDoc()->GetRedlineTbl(); + const SwRedlineTbl& rTbl = rRange.GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl(); sal_uInt16 n = 0; - rRange.GetDoc()->GetRedline( *pStt, &n ); + rRange.GetDoc()->getIDocumentRedlineAccess().GetRedline( *pStt, &n ); for ( ; n < rTbl.size(); ++n ) { SwRangeRedline* pRedl = rTbl[n]; @@ -1028,7 +1029,7 @@ bool SwUndo::FillSaveData( } if( !rSData.empty() && bDelRange ) { - rRange.GetDoc()->DeleteRedline( rRange, false, USHRT_MAX ); + rRange.GetDoc()->getIDocumentRedlineAccess().DeleteRedline( rRange, false, USHRT_MAX ); } return !rSData.empty(); } @@ -1041,9 +1042,9 @@ bool SwUndo::FillSaveDataForFmt( SwRedlineSaveData* pNewData; const SwPosition *pStt = rRange.Start(), *pEnd = rRange.End(); - const SwRedlineTbl& rTbl = rRange.GetDoc()->GetRedlineTbl(); + const SwRedlineTbl& rTbl = rRange.GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl(); sal_uInt16 n = 0; - rRange.GetDoc()->GetRedline( *pStt, &n ); + rRange.GetDoc()->getIDocumentRedlineAccess().GetRedline( *pStt, &n ); for ( ; n < rTbl.size(); ++n ) { SwRangeRedline* pRedl = rTbl[n]; @@ -1067,8 +1068,8 @@ bool SwUndo::FillSaveDataForFmt( void SwUndo::SetSaveData( SwDoc& rDoc, const SwRedlineSaveDatas& rSData ) { - RedlineMode_t eOld = rDoc.GetRedlineMode(); - rDoc.SetRedlineMode_intern( (RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); + RedlineMode_t eOld = rDoc.getIDocumentRedlineAccess().GetRedlineMode(); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); SwPaM aPam( rDoc.GetNodes().GetEndOfContent() ); for( size_t n = rSData.size(); n; ) @@ -1077,11 +1078,11 @@ void SwUndo::SetSaveData( SwDoc& rDoc, const SwRedlineSaveDatas& rSData ) #if OSL_DEBUG_LEVEL > 0 // check redline count against count saved in RedlineSaveData object assert(rSData.empty() || - (rSData[0]->nRedlineCount == rDoc.GetRedlineTbl().size())); + (rSData[0]->nRedlineCount == rDoc.getIDocumentRedlineAccess().GetRedlineTbl().size())); // "redline count not restored properly" #endif - rDoc.SetRedlineMode_intern( eOld ); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } bool SwUndo::HasHiddenRedlines( const SwRedlineSaveDatas& rSData ) diff --git a/sw/source/core/undo/unins.cxx b/sw/source/core/undo/unins.cxx index bf3d63d6fc0c..f3875e07a752 100644 --- a/sw/source/core/undo/unins.cxx +++ b/sw/source/core/undo/unins.cxx @@ -32,6 +32,7 @@ #include <doc.hxx> #include <IDocumentUndoRedo.hxx> #include <IDocumentDrawModelAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <swundo.hxx> #include <pam.hxx> #include <ndtxt.hxx> @@ -91,11 +92,11 @@ void SwUndoInsert::Init(const SwNodeIndex & rNd) { // consider Redline pDoc = rNd.GetNode().GetDoc(); - if( pDoc->IsRedlineOn() ) + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) { pRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_INSERT, - pDoc->GetRedlineAuthor() ); - SetRedlineMode( pDoc->GetRedlineMode() ); + pDoc->getIDocumentRedlineAccess().GetRedlineAuthor() ); + SetRedlineMode( pDoc->getIDocumentRedlineAccess().GetRedlineMode() ); } pUndoTxt = GetTxtFromDoc(); @@ -156,7 +157,7 @@ bool SwUndoInsert::CanGrouping( const SwPosition& rPos ) { // consider Redline SwDoc& rDoc = *rPos.nNode.GetNode().GetDoc(); - if( ( ~nsRedlineMode_t::REDLINE_SHOW_MASK & rDoc.GetRedlineMode() ) == + if( ( ~nsRedlineMode_t::REDLINE_SHOW_MASK & rDoc.getIDocumentRedlineAccess().GetRedlineMode() ) == ( ~nsRedlineMode_t::REDLINE_SHOW_MASK & GetRedlineMode() ) ) { bRet = true; @@ -164,10 +165,10 @@ bool SwUndoInsert::CanGrouping( const SwPosition& rPos ) // than there is or was still an active Redline: // Check if there is another Redline at the InsPosition. If the // same exists only once, it can be combined. - const SwRedlineTbl& rTbl = rDoc.GetRedlineTbl(); + const SwRedlineTbl& rTbl = rDoc.getIDocumentRedlineAccess().GetRedlineTbl(); if( !rTbl.empty() ) { - SwRedlineData aRData( nsRedlineType_t::REDLINE_INSERT, rDoc.GetRedlineAuthor() ); + SwRedlineData aRData( nsRedlineType_t::REDLINE_INSERT, rDoc.getIDocumentRedlineAccess().GetRedlineAuthor() ); const SwIndexReg* pIReg = rPos.nContent.GetIdxReg(); SwIndex* pIdx; for( size_t i = 0; i < rTbl.size(); ++i ) @@ -221,7 +222,7 @@ void SwUndoInsert::UndoImpl(::sw::UndoRedoContext & rContext) pPam->SetMark(); pPam->Move( fnMoveBackward ); pPam->Exchange(); - pTmpDoc->DeleteRedline( *pPam, true, USHRT_MAX ); + pTmpDoc->getIDocumentRedlineAccess().DeleteRedline( *pPam, true, USHRT_MAX ); } pPam->DeleteMark(); pTmpDoc->getIDocumentContentOperations().DelFullPara( *pPam ); @@ -244,7 +245,7 @@ void SwUndoInsert::UndoImpl(::sw::UndoRedoContext & rContext) { aPaM.GetPoint()->nContent -= nLen; if( IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) - pTmpDoc->DeleteRedline( aPaM, true, USHRT_MAX ); + pTmpDoc->getIDocumentRedlineAccess().DeleteRedline( aPaM, true, USHRT_MAX ); if (m_bWithRsid) { // RSID was added: remove any CHARFMT/AUTOFMT that may be @@ -265,7 +266,7 @@ void SwUndoInsert::UndoImpl(::sw::UndoRedoContext & rContext) { aPaM.Move(fnMoveBackward); if( IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) - pTmpDoc->DeleteRedline( aPaM, true, USHRT_MAX ); + pTmpDoc->getIDocumentRedlineAccess().DeleteRedline( aPaM, true, USHRT_MAX ); RemoveIdxFromRange( aPaM, false ); } @@ -310,14 +311,14 @@ void SwUndoInsert::RedoImpl(::sw::UndoRedoContext & rContext) if( pRedlData && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) { - RedlineMode_t eOld = pTmpDoc->GetRedlineMode(); - pTmpDoc->SetRedlineMode_intern((RedlineMode_t)(eOld & ~nsRedlineMode_t::REDLINE_IGNORE)); - pTmpDoc->AppendRedline( new SwRangeRedline( *pRedlData, *pPam ), true); - pTmpDoc->SetRedlineMode_intern( eOld ); + RedlineMode_t eOld = pTmpDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pTmpDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld & ~nsRedlineMode_t::REDLINE_IGNORE)); + pTmpDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( *pRedlData, *pPam ), true); + pTmpDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } else if( !( nsRedlineMode_t::REDLINE_IGNORE & GetRedlineMode() ) && - !pTmpDoc->GetRedlineTbl().empty() ) - pTmpDoc->SplitRedline( *pPam ); + !pTmpDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) + pTmpDoc->getIDocumentRedlineAccess().SplitRedline( *pPam ); pPam->DeleteMark(); } @@ -361,15 +362,15 @@ void SwUndoInsert::RedoImpl(::sw::UndoRedoContext & rContext) pPam->Exchange(); if( pRedlData && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) { - RedlineMode_t eOld = pTmpDoc->GetRedlineMode(); - pTmpDoc->SetRedlineMode_intern((RedlineMode_t)(eOld & ~nsRedlineMode_t::REDLINE_IGNORE)); - pTmpDoc->AppendRedline( new SwRangeRedline( *pRedlData, + RedlineMode_t eOld = pTmpDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pTmpDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld & ~nsRedlineMode_t::REDLINE_IGNORE)); + pTmpDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( *pRedlData, *pPam ), true); - pTmpDoc->SetRedlineMode_intern( eOld ); + pTmpDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } else if( !( nsRedlineMode_t::REDLINE_IGNORE & GetRedlineMode() ) && - !pTmpDoc->GetRedlineTbl().empty() ) - pTmpDoc->SplitRedline(*pPam); + !pTmpDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) + pTmpDoc->getIDocumentRedlineAccess().SplitRedline(*pPam); } } diff --git a/sw/source/core/undo/unovwr.cxx b/sw/source/core/undo/unovwr.cxx index a3520b88c1d9..abc29667f548 100644 --- a/sw/source/core/undo/unovwr.cxx +++ b/sw/source/core/undo/unovwr.cxx @@ -24,6 +24,7 @@ #include <comphelper/processfactory.hxx> #include <doc.hxx> #include <IDocumentUndoRedo.hxx> +#include <IDocumentRedlineAccess.hxx> #include <IShellCursorSupplier.hxx> #include <swundo.hxx> #include <pam.hxx> @@ -44,7 +45,7 @@ SwUndoOverwrite::SwUndoOverwrite( SwDoc* pDoc, SwPosition& rPos, : SwUndo(UNDO_OVERWRITE), pRedlSaveData( 0 ), bGroup( false ) { - if( !pDoc->IsIgnoreRedline() && !pDoc->GetRedlineTbl().empty() ) + if( !pDoc->getIDocumentRedlineAccess().IsIgnoreRedline() && !pDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) { SwPaM aPam( rPos.nNode, rPos.nContent.GetIndex(), rPos.nNode, rPos.nContent.GetIndex()+1 ); @@ -135,7 +136,7 @@ bool SwUndoOverwrite::CanGrouping( SwDoc* pDoc, SwPosition& rPos, if( !bOk ) return false; - pDoc->DeleteRedline( aPam, false, USHRT_MAX ); + pDoc->getIDocumentRedlineAccess().DeleteRedline( aPam, false, USHRT_MAX ); } // both 'overwrites' can be combined so 'move' the corresponding character @@ -268,7 +269,7 @@ void SwUndoOverwrite::RedoImpl(::sw::UndoRedoContext & rContext) rIdx.Assign( pTxtNd, nSttCntnt ); pAktPam->SetMark(); pAktPam->GetMark()->nContent += aInsStr.getLength(); - pDoc->DeleteRedline( *pAktPam, false, USHRT_MAX ); + pDoc->getIDocumentRedlineAccess().DeleteRedline( *pAktPam, false, USHRT_MAX ); pAktPam->DeleteMark(); } rIdx.Assign( pTxtNd, !aDelStr.isEmpty() ? nSttCntnt+1 : nSttCntnt ); diff --git a/sw/source/core/undo/unredln.cxx b/sw/source/core/undo/unredln.cxx index 7aaea3b38827..1f0a49b7af07 100644 --- a/sw/source/core/undo/unredln.cxx +++ b/sw/source/core/undo/unredln.cxx @@ -21,6 +21,7 @@ #include <hintids.hxx> #include <unotools/charclass.hxx> #include <doc.hxx> +#include <IDocumentRedlineAccess.hxx> #include <swundo.hxx> #include <pam.hxx> #include <ndtxt.hxx> @@ -39,18 +40,18 @@ SwUndoRedline::SwUndoRedline( SwUndoId nUsrId, const SwPaM& rRange ) { // consider Redline SwDoc& rDoc = *rRange.GetDoc(); - if( rDoc.IsRedlineOn() ) + if( rDoc.getIDocumentRedlineAccess().IsRedlineOn() ) { switch( mnUserId ) { case UNDO_DELETE: case UNDO_REPLACE: - mpRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_DELETE, rDoc.GetRedlineAuthor() ); + mpRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_DELETE, rDoc.getIDocumentRedlineAccess().GetRedlineAuthor() ); break; default: ; } - SetRedlineMode( rDoc.GetRedlineMode() ); + SetRedlineMode( rDoc.getIDocumentRedlineAccess().GetRedlineMode() ); } sal_uLong nEndExtra = rDoc.GetNodes().GetEndOfExtras().GetIndex(); @@ -107,8 +108,8 @@ void SwUndoRedline::UndoImpl(::sw::UndoRedoContext & rContext) void SwUndoRedline::RedoImpl(::sw::UndoRedoContext & rContext) { SwDoc *const pDoc = & rContext.GetDoc(); - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern((RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); SwPaM & rPam( AddUndoRedoPaM(rContext) ); if( mpRedlSaveData && mbHiddenRedlines ) @@ -124,7 +125,7 @@ void SwUndoRedline::RedoImpl(::sw::UndoRedoContext & rContext) RedoRedlineImpl(*pDoc, rPam); SetPaM(rPam, true); - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } void SwUndoRedline::UndoRedlineImpl(SwDoc &, SwPaM &) @@ -134,7 +135,7 @@ void SwUndoRedline::UndoRedlineImpl(SwDoc &, SwPaM &) // default: remove redlines void SwUndoRedline::RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) { - rDoc.DeleteRedline(rPam, true, USHRT_MAX); + rDoc.getIDocumentRedlineAccess().DeleteRedline(rPam, true, USHRT_MAX); } SwUndoRedlineDelete::SwUndoRedlineDelete( const SwPaM& rRange, SwUndoId nUsrId ) @@ -161,14 +162,14 @@ SwUndoRedlineDelete::SwUndoRedlineDelete( const SwPaM& rRange, SwUndoId nUsrId ) void SwUndoRedlineDelete::UndoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) { - rDoc.DeleteRedline(rPam, true, USHRT_MAX); + rDoc.getIDocumentRedlineAccess().DeleteRedline(rPam, true, USHRT_MAX); } void SwUndoRedlineDelete::RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) { if (rPam.GetPoint() != rPam.GetMark()) { - rDoc.AppendRedline( new SwRangeRedline(*mpRedlData, rPam), false ); + rDoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline(*mpRedlData, rPam), false ); } } @@ -230,18 +231,18 @@ void SwUndoRedlineSort::UndoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) SwNodeIndex aPrevIdx( pStart->nNode, -1 ); sal_uLong nOffsetTemp = pEnd->nNode.GetIndex() - pStart->nNode.GetIndex(); - if( 0 == ( nsRedlineMode_t::REDLINE_SHOW_DELETE & rDoc.GetRedlineMode()) ) + if( 0 == ( nsRedlineMode_t::REDLINE_SHOW_DELETE & rDoc.getIDocumentRedlineAccess().GetRedlineMode()) ) { // Search both Redline objects and make them visible to make the nodes // consistent again. The 'delete' one is hidden, thus search for the // 'insert' Redline object. The former is located directly after the latter. - sal_uInt16 nFnd = rDoc.GetRedlinePos( + sal_uInt16 nFnd = rDoc.getIDocumentRedlineAccess().GetRedlinePos( *rDoc.GetNodes()[ nSttNode + 1 ], nsRedlineType_t::REDLINE_INSERT ); - OSL_ENSURE( USHRT_MAX != nFnd && nFnd+1 < (sal_uInt16)rDoc.GetRedlineTbl().size(), + OSL_ENSURE( USHRT_MAX != nFnd && nFnd+1 < (sal_uInt16)rDoc.getIDocumentRedlineAccess().GetRedlineTbl().size(), "could not find an Insert object" ); ++nFnd; - rDoc.GetRedlineTbl()[nFnd]->Show( 1 ); + rDoc.getIDocumentRedlineAccess().GetRedlineTbl()[nFnd]->Show( 1 ); } { @@ -250,7 +251,7 @@ void SwUndoRedlineSort::UndoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) aTmp.SetMark(); aTmp.GetPoint()->nNode = nSaveEndNode; aTmp.GetPoint()->nContent.Assign( aTmp.GetCntntNode(), nSaveEndCntnt ); - rDoc.DeleteRedline( aTmp, true, USHRT_MAX ); + rDoc.getIDocumentRedlineAccess().DeleteRedline( aTmp, true, USHRT_MAX ); } rDoc.getIDocumentContentOperations().DelFullPara(rPam); @@ -327,12 +328,12 @@ SwUndoAcceptRedline::SwUndoAcceptRedline( const SwPaM& rRange ) void SwUndoAcceptRedline::RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) { - rDoc.AcceptRedline(rPam, false); + rDoc.getIDocumentRedlineAccess().AcceptRedline(rPam, false); } void SwUndoAcceptRedline::RepeatImpl(::sw::RepeatContext & rContext) { - rContext.GetDoc().AcceptRedline(rContext.GetRepeatPaM(), true); + rContext.GetDoc().getIDocumentRedlineAccess().AcceptRedline(rContext.GetRepeatPaM(), true); } SwUndoRejectRedline::SwUndoRejectRedline( const SwPaM& rRange ) @@ -342,12 +343,12 @@ SwUndoRejectRedline::SwUndoRejectRedline( const SwPaM& rRange ) void SwUndoRejectRedline::RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) { - rDoc.RejectRedline(rPam, false); + rDoc.getIDocumentRedlineAccess().RejectRedline(rPam, false); } void SwUndoRejectRedline::RepeatImpl(::sw::RepeatContext & rContext) { - rContext.GetDoc().RejectRedline(rContext.GetRepeatPaM(), true); + rContext.GetDoc().getIDocumentRedlineAccess().RejectRedline(rContext.GetRepeatPaM(), true); } SwUndoCompDoc::SwUndoCompDoc( const SwPaM& rRg, bool bIns ) @@ -355,11 +356,11 @@ SwUndoCompDoc::SwUndoCompDoc( const SwPaM& rRg, bool bIns ) pUnDel( 0 ), pUnDel2( 0 ), pRedlSaveData( 0 ), bInsert( bIns ) { SwDoc* pDoc = (SwDoc*)rRg.GetDoc(); - if( pDoc->IsRedlineOn() ) + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) { RedlineType_t eTyp = bInsert ? nsRedlineType_t::REDLINE_INSERT : nsRedlineType_t::REDLINE_DELETE; - pRedlData = new SwRedlineData( eTyp, pDoc->GetRedlineAuthor() ); - SetRedlineMode( pDoc->GetRedlineMode() ); + pRedlData = new SwRedlineData( eTyp, pDoc->getIDocumentRedlineAccess().GetRedlineAuthor() ); + SetRedlineMode( pDoc->getIDocumentRedlineAccess().GetRedlineMode() ); } } @@ -370,10 +371,10 @@ SwUndoCompDoc::SwUndoCompDoc( const SwRangeRedline& rRedl ) bInsert( nsRedlineType_t::REDLINE_DELETE == rRedl.GetType() ) { SwDoc* pDoc = (SwDoc*)rRedl.GetDoc(); - if( pDoc->IsRedlineOn() ) + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) { pRedlData = new SwRedlineData( rRedl.GetRedlineData() ); - SetRedlineMode( pDoc->GetRedlineMode() ); + SetRedlineMode( pDoc->getIDocumentRedlineAccess().GetRedlineMode() ); } pRedlSaveData = new SwRedlineSaveDatas; @@ -397,12 +398,12 @@ void SwUndoCompDoc::UndoImpl(::sw::UndoRedoContext & rContext) if( !bInsert ) { // delete Redlines - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern((RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON)); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON)); - pDoc->DeleteRedline( *pPam, true, USHRT_MAX ); + pDoc->getIDocumentRedlineAccess().DeleteRedline( *pPam, true, USHRT_MAX ); - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); // per definition Point is end (in SwUndRng!) SwCntntNode* pCSttNd = pPam->GetCntntNode( false ); @@ -444,7 +445,7 @@ void SwUndoCompDoc::UndoImpl(::sw::UndoRedoContext & rContext) { if( IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) { - pDoc->DeleteRedline( *pPam, true, USHRT_MAX ); + pDoc->getIDocumentRedlineAccess().DeleteRedline( *pPam, true, USHRT_MAX ); if( pRedlSaveData ) SetSaveData( *pDoc, *pRedlSaveData ); @@ -463,12 +464,12 @@ void SwUndoCompDoc::RedoImpl(::sw::UndoRedoContext & rContext) if( pRedlData && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) { SwRangeRedline* pTmp = new SwRangeRedline( *pRedlData, *pPam ); - ((SwRedlineTbl&)pDoc->GetRedlineTbl()).Insert( pTmp ); + ((SwRedlineTbl&)pDoc->getIDocumentRedlineAccess().GetRedlineTbl()).Insert( pTmp ); pTmp->InvalidateRange(); } else if( !( nsRedlineMode_t::REDLINE_IGNORE & GetRedlineMode() ) && - !pDoc->GetRedlineTbl().empty() ) - pDoc->SplitRedline( *pPam ); + !pDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) + pDoc->getIDocumentRedlineAccess().SplitRedline( *pPam ); } else { @@ -483,7 +484,7 @@ void SwUndoCompDoc::RedoImpl(::sw::UndoRedoContext & rContext) SetPaM( *pPam ); SwRangeRedline* pTmp = new SwRangeRedline( *pRedlData, *pPam ); - ((SwRedlineTbl&)pDoc->GetRedlineTbl()).Insert( pTmp ); + ((SwRedlineTbl&)pDoc->getIDocumentRedlineAccess().GetRedlineTbl()).Insert( pTmp ); pTmp->InvalidateRange(); } diff --git a/sw/source/core/undo/unsect.cxx b/sw/source/core/undo/unsect.cxx index 0fb81476809d..cd69474fa6d8 100644 --- a/sw/source/core/undo/unsect.cxx +++ b/sw/source/core/undo/unsect.cxx @@ -23,6 +23,7 @@ #include <fmtcntnt.hxx> #include <doc.hxx> #include <IDocumentLinksAdministration.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docary.hxx> #include <swundo.hxx> #include <pam.hxx> @@ -78,11 +79,11 @@ SwUndoInsSection::SwUndoInsSection( , m_bUpdateFtn(false) { SwDoc& rDoc = *(SwDoc*)rPam.GetDoc(); - if( rDoc.IsRedlineOn() ) + if( rDoc.getIDocumentRedlineAccess().IsRedlineOn() ) { m_pRedlData.reset(new SwRedlineData( nsRedlineType_t::REDLINE_INSERT, - rDoc.GetRedlineAuthor() )); - SetRedlineMode( rDoc.GetRedlineMode() ); + rDoc.getIDocumentRedlineAccess().GetRedlineAuthor() )); + SetRedlineMode( rDoc.getIDocumentRedlineAccess().GetRedlineMode() ); } m_pRedlineSaveData.reset( new SwRedlineSaveDatas ); if( !FillSaveData( rPam, *m_pRedlineSaveData, false )) @@ -121,7 +122,7 @@ void SwUndoInsSection::UndoImpl(::sw::UndoRedoContext & rContext) OSL_ENSURE( pNd, "wo ist mein SectionNode?" ); if( IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) - rDoc.DeleteRedline( *pNd, true, USHRT_MAX ); + rDoc.getIDocumentRedlineAccess().DeleteRedline( *pNd, true, USHRT_MAX ); // no selection? SwNodeIndex aIdx( *pNd ); @@ -187,18 +188,18 @@ void SwUndoInsSection::RedoImpl(::sw::UndoRedoContext & rContext) if (m_pRedlData.get() && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode())) { - RedlineMode_t eOld = rDoc.GetRedlineMode(); - rDoc.SetRedlineMode_intern((RedlineMode_t)(eOld & ~nsRedlineMode_t::REDLINE_IGNORE)); + RedlineMode_t eOld = rDoc.getIDocumentRedlineAccess().GetRedlineMode(); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld & ~nsRedlineMode_t::REDLINE_IGNORE)); SwPaM aPam( *pSectNd->EndOfSectionNode(), *pSectNd, 1 ); - rDoc.AppendRedline( new SwRangeRedline( *m_pRedlData, aPam ), true); - rDoc.SetRedlineMode_intern( eOld ); + rDoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( *m_pRedlData, aPam ), true); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } else if( !( nsRedlineMode_t::REDLINE_IGNORE & GetRedlineMode() ) && - !rDoc.GetRedlineTbl().empty() ) + !rDoc.getIDocumentRedlineAccess().GetRedlineTbl().empty() ) { SwPaM aPam( *pSectNd->EndOfSectionNode(), *pSectNd, 1 ); - rDoc.SplitRedline( aPam ); + rDoc.getIDocumentRedlineAccess().SplitRedline( aPam ); } if( pUpdateTOX ) diff --git a/sw/source/core/undo/unspnd.cxx b/sw/source/core/undo/unspnd.cxx index 2e8aa3b23797..7aada6f5d2e9 100644 --- a/sw/source/core/undo/unspnd.cxx +++ b/sw/source/core/undo/unspnd.cxx @@ -19,6 +19,7 @@ #include <UndoSplitMove.hxx> #include "doc.hxx" +#include <IDocumentRedlineAccess.hxx> #include "pam.hxx" #include "swtable.hxx" #include "ndtxt.hxx" @@ -51,10 +52,10 @@ SwUndoSplitNode::SwUndoSplitNode( SwDoc* pDoc, const SwPosition& rPos, DELETEZ( pHistory ); } // consider Redline - if( pDoc->IsRedlineOn() ) + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) { - pRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_INSERT, pDoc->GetRedlineAuthor() ); - SetRedlineMode( pDoc->GetRedlineMode() ); + pRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_INSERT, pDoc->getIDocumentRedlineAccess().GetRedlineAuthor() ); + SetRedlineMode( pDoc->getIDocumentRedlineAccess().GetRedlineMode() ); } nParRsid = pTxtNd->GetParRsid(); @@ -118,7 +119,7 @@ void SwUndoSplitNode::UndoImpl(::sw::UndoRedoContext & rContext) rPam.GetMark()->nNode++; rPam.GetMark()->nContent.Assign( rPam.GetMark()-> nNode.GetNode().GetCntntNode(), 0 ); - pDoc->DeleteRedline( rPam, true, USHRT_MAX ); + pDoc->getIDocumentRedlineAccess().DeleteRedline( rPam, true, USHRT_MAX ); rPam.DeleteMark(); } @@ -163,20 +164,20 @@ void SwUndoSplitNode::RedoImpl(::sw::UndoRedoContext & rContext) if( ( pRedlData && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) || ( !( nsRedlineMode_t::REDLINE_IGNORE & GetRedlineMode() ) && - !pDoc->GetRedlineTbl().empty() )) + !pDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty() )) { rPam.SetMark(); if( rPam.Move( fnMoveBackward )) { if( pRedlData && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) { - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern((RedlineMode_t)(eOld & ~nsRedlineMode_t::REDLINE_IGNORE)); - pDoc->AppendRedline( new SwRangeRedline( *pRedlData, rPam ), true); - pDoc->SetRedlineMode_intern( eOld ); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld & ~nsRedlineMode_t::REDLINE_IGNORE)); + pDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( *pRedlData, rPam ), true); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } else - pDoc->SplitRedline( rPam ); + pDoc->getIDocumentRedlineAccess().SplitRedline( rPam ); rPam.Exchange(); } rPam.DeleteMark(); diff --git a/sw/source/core/undo/untbl.cxx b/sw/source/core/undo/untbl.cxx index 7e4d36b1ece5..9f3d31a0a24b 100644 --- a/sw/source/core/undo/untbl.cxx +++ b/sw/source/core/undo/untbl.cxx @@ -36,6 +36,7 @@ #include <docredln.hxx> #include <IDocumentUndoRedo.hxx> #include <IDocumentChartDataProviderAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <editsh.hxx> #include <docary.hxx> #include <ndtxt.hxx> @@ -236,10 +237,10 @@ SwUndoInsTbl::SwUndoInsTbl( const SwPosition& rPos, sal_uInt16 nCl, sal_uInt16 n // consider redline SwDoc& rDoc = *rPos.nNode.GetNode().GetDoc(); - if( rDoc.IsRedlineOn() ) + if( rDoc.getIDocumentRedlineAccess().IsRedlineOn() ) { - pRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_INSERT, rDoc.GetRedlineAuthor() ); - SetRedlineMode( rDoc.GetRedlineMode() ); + pRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_INSERT, rDoc.getIDocumentRedlineAccess().GetRedlineAuthor() ); + SetRedlineMode( rDoc.getIDocumentRedlineAccess().GetRedlineMode() ); } sTblNm = rName; @@ -263,7 +264,7 @@ void SwUndoInsTbl::UndoImpl(::sw::UndoRedoContext & rContext) pTblNd->DelFrms(); if( IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) - rDoc.DeleteRedline( *pTblNd, true, USHRT_MAX ); + rDoc.getIDocumentRedlineAccess().DeleteRedline( *pTblNd, true, USHRT_MAX ); RemoveIdxFromSection( rDoc, nSttNode ); // move hard page breaks into next node @@ -318,7 +319,7 @@ void SwUndoInsTbl::RedoImpl(::sw::UndoRedoContext & rContext) if( (pRedlData && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) || ( !( nsRedlineMode_t::REDLINE_IGNORE & GetRedlineMode() ) && - !rDoc.GetRedlineTbl().empty() )) + !rDoc.getIDocumentRedlineAccess().GetRedlineTbl().empty() )) { SwPaM aPam( *pTblNode->EndOfSectionNode(), *pTblNode, 1 ); SwCntntNode* pCNd = aPam.GetCntntNode( false ); @@ -327,14 +328,14 @@ void SwUndoInsTbl::RedoImpl(::sw::UndoRedoContext & rContext) if( pRedlData && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() ) ) { - RedlineMode_t eOld = rDoc.GetRedlineMode(); - rDoc.SetRedlineMode_intern((RedlineMode_t)(eOld & ~nsRedlineMode_t::REDLINE_IGNORE)); + RedlineMode_t eOld = rDoc.getIDocumentRedlineAccess().GetRedlineMode(); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)(eOld & ~nsRedlineMode_t::REDLINE_IGNORE)); - rDoc.AppendRedline( new SwRangeRedline( *pRedlData, aPam ), true); - rDoc.SetRedlineMode_intern( eOld ); + rDoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( *pRedlData, aPam ), true); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } else - rDoc.SplitRedline( aPam ); + rDoc.getIDocumentRedlineAccess().SplitRedline( aPam ); } } @@ -2248,7 +2249,7 @@ void SwUndoTblNumFmt::UndoImpl(::sw::UndoRedoContext & rContext) // the same here. if( pTxtNd->GetTxt() != aStr ) { - rDoc.DeleteRedline( *( pBox->GetSttNd() ), false, USHRT_MAX ); + rDoc.getIDocumentRedlineAccess().DeleteRedline( *( pBox->GetSttNd() ), false, USHRT_MAX ); SwIndex aIdx( pTxtNd, 0 ); if( !aStr.isEmpty() ) @@ -2296,15 +2297,15 @@ RedlineModeInternGuard::RedlineModeInternGuard( RedlineMode_t eNewRedlineMode, RedlineMode_t eRedlineModeMask ) : mrDoc( rDoc ), - meOldRedlineMode( rDoc.GetRedlineMode() ) + meOldRedlineMode( rDoc.getIDocumentRedlineAccess().GetRedlineMode() ) { - mrDoc.SetRedlineMode_intern((RedlineMode_t)( ( meOldRedlineMode & ~eRedlineModeMask ) | + mrDoc.getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)( ( meOldRedlineMode & ~eRedlineModeMask ) | ( eNewRedlineMode & eRedlineModeMask ) )); } RedlineModeInternGuard::~RedlineModeInternGuard() { - mrDoc.SetRedlineMode_intern( meOldRedlineMode ); + mrDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( meOldRedlineMode ); } void SwUndoTblNumFmt::RedoImpl(::sw::UndoRedoContext & rContext) @@ -2501,7 +2502,7 @@ void SwUndoTblCpyTbl::UndoImpl(::sw::UndoRedoContext & rContext) *aPam.GetPoint() = SwPosition( aTmpIdx ); } } - rDoc.DeleteRedline( aPam, true, USHRT_MAX ); + rDoc.getIDocumentRedlineAccess().DeleteRedline( aPam, true, USHRT_MAX ); if( pEntry->pUndo ) { @@ -2676,7 +2677,7 @@ void SwUndoTblCpyTbl::AddBoxBefore( const SwTableBox& rBox, bool bDelCntnt ) pDoc->GetNodes().MakeTxtNode( aInsIdx, (SwTxtFmtColl*)pDoc->GetDfltTxtFmtColl() ); SwPaM aPam( aInsIdx.GetNode(), *rBox.GetSttNd()->EndOfSectionNode() ); - if( !pDoc->IsRedlineOn() ) + if( !pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) pEntry->pUndo = new SwUndoDelete( aPam, true ); } @@ -2699,7 +2700,7 @@ void SwUndoTblCpyTbl::AddBoxAfter( const SwTableBox& rBox, const SwNodeIndex& rI SwDoc* pDoc = rBox.GetFrmFmt()->GetDoc(); _DEBUG_REDLINE( pDoc ) - if( pDoc->IsRedlineOn() ) + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) { SwPosition aTmpPos( rIdx ); pEntry->pUndo = PrepareRedline( pDoc, rBox, aTmpPos, pEntry->bJoin, false ); @@ -2727,8 +2728,8 @@ SwUndo* SwUndoTblCpyTbl::PrepareRedline( SwDoc* pDoc, const SwTableBox& rBox, // Mark the cell content before rIdx as insertion, // mark the cell content behind rIdx as deletion // merge text nodes at rIdx if possible - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern((RedlineMode_t)( ( eOld | nsRedlineMode_t::REDLINE_DONTCOMBINE_REDLINES ) & + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)( ( eOld | nsRedlineMode_t::REDLINE_DONTCOMBINE_REDLINES ) & ~nsRedlineMode_t::REDLINE_IGNORE )); SwPosition aInsertEnd( rPos ); SwTxtNode* pTxt; @@ -2767,7 +2768,7 @@ SwUndo* SwUndoTblCpyTbl::PrepareRedline( SwDoc* pDoc, const SwTableBox& rBox, { // If the old (deleted) part is not empty, here we are... SwPaM aDeletePam( aDeleteStart, aCellEnd ); pUndo = new SwUndoRedlineDelete( aDeletePam, UNDO_DELETE ); - pDoc->AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_DELETE, aDeletePam ), true ); + pDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_DELETE, aDeletePam ), true ); } else if( !rJoin ) // If the old part is empty and joined, we are finished { // if it is not joined, we have to delete this empty paragraph @@ -2783,10 +2784,10 @@ SwUndo* SwUndoTblCpyTbl::PrepareRedline( SwDoc* pDoc, const SwTableBox& rBox, if( aCellStart != aInsertEnd ) // An empty insertion will not been marked { SwPaM aTmpPam( aCellStart, aInsertEnd ); - pDoc->AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aTmpPam ), true ); + pDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aTmpPam ), true ); } - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); return pUndo; } diff --git a/sw/source/core/undo/untblk.cxx b/sw/source/core/undo/untblk.cxx index 6ef58f56ad32..ab0637c8a2cb 100644 --- a/sw/source/core/undo/untblk.cxx +++ b/sw/source/core/undo/untblk.cxx @@ -22,6 +22,7 @@ #include <frmfmt.hxx> #include <doc.hxx> #include <IDocumentUndoRedo.hxx> +#include <IDocumentRedlineAccess.hxx> #include <IShellCursorSupplier.hxx> #include <docary.hxx> #include <swundo.hxx> @@ -68,10 +69,10 @@ SwUndoInserts::SwUndoInserts( SwUndoId nUndoId, const SwPaM& rPam ) } } // consider Redline - if( pDoc->IsRedlineOn() ) + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) { - pRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_INSERT, pDoc->GetRedlineAuthor() ); - SetRedlineMode( pDoc->GetRedlineMode() ); + pRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_INSERT, pDoc->getIDocumentRedlineAccess().GetRedlineAuthor() ); + SetRedlineMode( pDoc->getIDocumentRedlineAccess().GetRedlineMode() ); } } @@ -149,7 +150,7 @@ void SwUndoInserts::UndoImpl(::sw::UndoRedoContext & rContext) SwPaM *const pPam = & AddUndoRedoPaM(rContext); if( IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) - pDoc->DeleteRedline( *pPam, true, USHRT_MAX ); + pDoc->getIDocumentRedlineAccess().DeleteRedline( *pPam, true, USHRT_MAX ); // if Point and Mark are different text nodes so a JoinNext has to be done bool bJoinNext = nSttNode != nEndNode && @@ -292,14 +293,14 @@ void SwUndoInserts::RedoImpl(::sw::UndoRedoContext & rContext) if( pRedlData && IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() )) { - RedlineMode_t eOld = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode_intern((RedlineMode_t)( eOld & ~nsRedlineMode_t::REDLINE_IGNORE )); - pDoc->AppendRedline( new SwRangeRedline( *pRedlData, *pPam ), true); - pDoc->SetRedlineMode_intern( eOld ); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)( eOld & ~nsRedlineMode_t::REDLINE_IGNORE )); + pDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( *pRedlData, *pPam ), true); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); } else if( !( nsRedlineMode_t::REDLINE_IGNORE & GetRedlineMode() ) && - !pDoc->GetRedlineTbl().empty() ) - pDoc->SplitRedline( *pPam ); + !pDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) + pDoc->getIDocumentRedlineAccess().SplitRedline( *pPam ); } void SwUndoInserts::RepeatImpl(::sw::RepeatContext & rContext) diff --git a/sw/source/core/unocore/unocrsrhelper.cxx b/sw/source/core/unocore/unocrsrhelper.cxx index 0f11fad92743..6c2afc64dc44 100644 --- a/sw/source/core/unocore/unocrsrhelper.cxx +++ b/sw/source/core/unocore/unocrsrhelper.cxx @@ -1159,7 +1159,7 @@ void makeRedline( SwPaM& rPaM, const uno::Sequence< beans::PropertyValue >& rRedlineProperties ) throw (lang::IllegalArgumentException, uno::RuntimeException) { - IDocumentRedlineAccess* pRedlineAccess = rPaM.GetDoc(); + IDocumentRedlineAccess* pRedlineAccess = &rPaM.GetDoc()->getIDocumentRedlineAccess(); RedlineType_t eType; if ( rRedlineType == "Insert" ) @@ -1282,7 +1282,7 @@ void makeTableRowRedline( SwTableLine& rTableLine, const uno::Sequence< beans::PropertyValue >& rRedlineProperties ) throw (lang::IllegalArgumentException, uno::RuntimeException) { - IDocumentRedlineAccess* pRedlineAccess = rTableLine.GetFrmFmt()->GetDoc(); + IDocumentRedlineAccess* pRedlineAccess = &rTableLine.GetFrmFmt()->GetDoc()->getIDocumentRedlineAccess(); RedlineType_t eType; if ( rRedlineType == "TableRowInsert" ) @@ -1339,7 +1339,7 @@ void makeTableCellRedline( SwTableBox& rTableBox, const uno::Sequence< beans::PropertyValue >& rRedlineProperties ) throw (lang::IllegalArgumentException, uno::RuntimeException) { - IDocumentRedlineAccess* pRedlineAccess = rTableBox.GetFrmFmt()->GetDoc(); + IDocumentRedlineAccess* pRedlineAccess = &rTableBox.GetFrmFmt()->GetDoc()->getIDocumentRedlineAccess(); RedlineType_t eType; if ( rRedlineType == "TableCellInsert" ) diff --git a/sw/source/core/unocore/unoportenum.cxx b/sw/source/core/unocore/unoportenum.cxx index 8057f1de726f..971e1816ca8a 100644 --- a/sw/source/core/unocore/unoportenum.cxx +++ b/sw/source/core/unocore/unoportenum.cxx @@ -22,6 +22,7 @@ #include <crossrefbookmark.hxx> #include <annotationmark.hxx> #include <doc.hxx> +#include <IDocumentRedlineAccess.hxx> #include <txatbase.hxx> #include <txtatr.hxx> #include <ndhints.hxx> @@ -1031,7 +1032,7 @@ static void lcl_FillRedlineArray( SwUnoCrsr const & rUnoCrsr, SwXRedlinePortion_ImplList& rRedArr ) { - const SwRedlineTbl& rRedTbl = rDoc.GetRedlineTbl(); + const SwRedlineTbl& rRedTbl = rDoc.getIDocumentRedlineAccess().GetRedlineTbl(); const size_t nRedTblCount = rRedTbl.size(); if ( nRedTblCount > 0 ) diff --git a/sw/source/core/unocore/unoredline.cxx b/sw/source/core/unocore/unoredline.cxx index 69434d06d69e..f6f0c401ae49 100644 --- a/sw/source/core/unocore/unoredline.cxx +++ b/sw/source/core/unocore/unoredline.cxx @@ -275,7 +275,7 @@ void SwXRedlinePortion::Validate() throw( uno::RuntimeException ) throw uno::RuntimeException(); //search for the redline SwDoc* pDoc = pUnoCrsr->GetDoc(); - const SwRedlineTbl& rRedTbl = pDoc->GetRedlineTbl(); + const SwRedlineTbl& rRedTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); bool bFound = false; for(size_t nRed = 0; nRed < rRedTbl.size() && !bFound; nRed++) bFound = &m_rRedline == rRedTbl[nRed]; diff --git a/sw/source/core/unocore/unoredlines.cxx b/sw/source/core/unocore/unoredlines.cxx index 22da9bd94adb..639dda3d9343 100644 --- a/sw/source/core/unocore/unoredlines.cxx +++ b/sw/source/core/unocore/unoredlines.cxx @@ -49,7 +49,7 @@ sal_Int32 SwXRedlines::getCount( ) throw(uno::RuntimeException, std::exception) SolarMutexGuard aGuard; if(!IsValid()) throw uno::RuntimeException(); - const SwRedlineTbl& rRedTbl = GetDoc()->GetRedlineTbl(); + const SwRedlineTbl& rRedTbl = GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl(); return rRedTbl.size(); } @@ -59,7 +59,7 @@ uno::Any SwXRedlines::getByIndex(sal_Int32 nIndex) SolarMutexGuard aGuard; if(!IsValid()) throw uno::RuntimeException(); - const SwRedlineTbl& rRedTbl = GetDoc()->GetRedlineTbl(); + const SwRedlineTbl& rRedTbl = GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl(); uno::Any aRet; if ((rRedTbl.size() > static_cast<size_t>(nIndex)) && (nIndex >= 0)) { @@ -90,7 +90,7 @@ sal_Bool SwXRedlines::hasElements( ) throw(uno::RuntimeException, std::exceptio SolarMutexGuard aGuard; if(!IsValid()) throw uno::RuntimeException(); - const SwRedlineTbl& rRedTbl = GetDoc()->GetRedlineTbl(); + const SwRedlineTbl& rRedTbl = GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl(); return rRedTbl.size() > 0; } @@ -143,7 +143,7 @@ sal_Bool SwXRedlineEnumeration::hasMoreElements(void) throw( uno::RuntimeExcepti { if(!pDoc) throw uno::RuntimeException(); - return pDoc->GetRedlineTbl().size() > nCurrentIndex; + return pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size() > nCurrentIndex; } uno::Any SwXRedlineEnumeration::nextElement(void) @@ -151,7 +151,7 @@ uno::Any SwXRedlineEnumeration::nextElement(void) { if(!pDoc) throw uno::RuntimeException(); - const SwRedlineTbl& rRedTbl = pDoc->GetRedlineTbl(); + const SwRedlineTbl& rRedTbl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); if( rRedTbl.size() <= nCurrentIndex ) throw container::NoSuchElementException(); uno::Reference <beans::XPropertySet> xRet = SwXRedlines::GetObject( *rRedTbl[nCurrentIndex++], *pDoc ); diff --git a/sw/source/core/unocore/unosect.cxx b/sw/source/core/unocore/unosect.cxx index 89b662d3f843..a47875bfe875 100644 --- a/sw/source/core/unocore/unosect.cxx +++ b/sw/source/core/unocore/unosect.cxx @@ -1134,7 +1134,7 @@ throw (beans::UnknownPropertyException, lang::WrappedTargetException, pSectNode = pSectNode->EndOfSectionNode(); } const SwRedlineTbl& rRedTbl = - pFmt->GetDoc()->GetRedlineTbl(); + pFmt->GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl(); for (size_t nRed = 0; nRed < rRedTbl.size(); ++nRed) { const SwRangeRedline* pRedline = rRedTbl[nRed]; diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx index 00aae9721ceb..61d770e51ec7 100644 --- a/sw/source/core/unocore/unotbl.cxx +++ b/sw/source/core/unocore/unotbl.cxx @@ -312,7 +312,7 @@ static uno::Any lcl_GetSpecialProperty(SwFrmFmt* pFmt, const SfxItemPropertySimp SwNode* pTblNode = pTable->GetTableNode(); if(FN_UNO_REDLINE_NODE_END == pEntry->nWID) pTblNode = pTblNode->EndOfSectionNode(); - const SwRedlineTbl& rRedTbl = pFmt->GetDoc()->GetRedlineTbl(); + const SwRedlineTbl& rRedTbl = pFmt->GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl(); for(size_t nRed = 0; nRed < rRedTbl.size(); ++nRed) { const SwRangeRedline* pRedline = rRedTbl[nRed]; diff --git a/sw/source/core/unocore/unotext.cxx b/sw/source/core/unocore/unotext.cxx index 83a07f341db4..fc0227af1f92 100644 --- a/sw/source/core/unocore/unotext.cxx +++ b/sw/source/core/unocore/unotext.cxx @@ -1154,7 +1154,7 @@ throw (beans::UnknownPropertyException, lang::WrappedTargetException, // break; case FN_UNO_REDLINE_NODE_END: { - const SwRedlineTbl& rRedTbl = GetDoc()->GetRedlineTbl(); + const SwRedlineTbl& rRedTbl = GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl(); const size_t nRedTblCount = rRedTbl.size(); if (nRedTblCount > 0) { diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx index db4b07cc2280..540224af8696 100644 --- a/sw/source/core/view/viewsh.cxx +++ b/sw/source/core/view/viewsh.cxx @@ -2528,8 +2528,8 @@ const IDocumentMarkAccess* SwViewShell::getIDocumentMarkAccess() const { return IDocumentMarkAccess* SwViewShell::getIDocumentMarkAccess() { return mpDoc->getIDocumentMarkAccess(); } const IDocumentDrawModelAccess* SwViewShell::getIDocumentDrawModelAccess() const { return & mpDoc->getIDocumentDrawModelAccess(); } IDocumentDrawModelAccess* SwViewShell::getIDocumentDrawModelAccess() { return & mpDoc->getIDocumentDrawModelAccess(); } -const IDocumentRedlineAccess* SwViewShell::getIDocumentRedlineAccess() const { return mpDoc; } -IDocumentRedlineAccess* SwViewShell::getIDocumentRedlineAccess() { return mpDoc; } +const IDocumentRedlineAccess* SwViewShell::getIDocumentRedlineAccess() const { return &mpDoc->getIDocumentRedlineAccess(); } +IDocumentRedlineAccess* SwViewShell::getIDocumentRedlineAccess() { return &mpDoc->getIDocumentRedlineAccess(); } const IDocumentLayoutAccess* SwViewShell::getIDocumentLayoutAccess() const { return mpDoc; } IDocumentLayoutAccess* SwViewShell::getIDocumentLayoutAccess() { return mpDoc; } IDocumentContentOperations* SwViewShell::getIDocumentContentOperations() { return &mpDoc->getIDocumentContentOperations(); } diff --git a/sw/source/filter/basflt/shellio.cxx b/sw/source/filter/basflt/shellio.cxx index 8a1bb01991f5..322e6092c014 100644 --- a/sw/source/filter/basflt/shellio.cxx +++ b/sw/source/filter/basflt/shellio.cxx @@ -40,6 +40,7 @@ #include <IDocumentSettingAccess.hxx> #include <IDocumentDeviceAccess.hxx> #include <IDocumentLinksAdministration.hxx> +#include <IDocumentRedlineAccess.hxx> #include <pam.hxx> #include <editsh.hxx> #include <undobj.hxx> @@ -128,7 +129,7 @@ sal_uLong SwReader::Read( const Reader& rOptions ) SwNodeIndex aSplitIdx( pDoc->GetNodes() ); - RedlineMode_t eOld = pDoc->GetRedlineMode(); + RedlineMode_t eOld = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); RedlineMode_t ePostReadRedlineMode( nsRedlineMode_t::REDLINE_IGNORE ); // Array of FlyFormats @@ -141,7 +142,7 @@ sal_uLong SwReader::Read( const Reader& rOptions ) if( bSaveUndo ) pUndo = new SwUndoInsDoc( *pPam ); - pDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE ); SwPaM* pUndoPam = 0; if( bDocUndo || pCrsr ) @@ -165,14 +166,14 @@ sal_uLong SwReader::Read( const Reader& rOptions ) sal_Int32 nEndCntnt = pCNd ? pCNd->Len() - nSttCntnt : 0; SwNodeIndex aEndPos( pPam->GetPoint()->nNode, 1 ); - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); nError = po->Read( *pDoc, GetBaseURL(), *pPam, aFileName ); // an ODF document may contain redline mode in settings.xml; save it! - ePostReadRedlineMode = pDoc->GetRedlineMode(); + ePostReadRedlineMode = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); - pDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE ); if( !IsError( nError )) // set the End position already { @@ -257,13 +258,13 @@ sal_uLong SwReader::Read( const Reader& rOptions ) { if( bSaveUndo ) { - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); // UGLY: temp. enable undo pDoc->GetIDocumentUndoRedo().DoUndo(true); pDoc->GetIDocumentUndoRedo().AppendUndo( new SwUndoInsLayFmt( pFrmFmt,0,0 ) ); pDoc->GetIDocumentUndoRedo().DoUndo(false); - pDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE ); } if( pFrmFmt->GetDepends() ) { @@ -291,22 +292,22 @@ sal_uLong SwReader::Read( const Reader& rOptions ) if( !aFlyFrmArr.empty() ) aFlyFrmArr.clear(); - pDoc->SetRedlineMode_intern( eOld ); - if( pDoc->IsRedlineOn() ) - pDoc->AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, *pUndoPam ), true); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); + if( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) + pDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, *pUndoPam ), true); else - pDoc->SplitRedline( *pUndoPam ); - pDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE ); + pDoc->getIDocumentRedlineAccess().SplitRedline( *pUndoPam ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE ); } if( bSaveUndo ) { - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); pUndo->SetInsertRange( *pUndoPam, false ); // UGLY: temp. enable undo pDoc->GetIDocumentUndoRedo().DoUndo(true); pDoc->GetIDocumentUndoRedo().AppendUndo( pUndo ); pDoc->GetIDocumentUndoRedo().DoUndo(false); - pDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE ); } delete pUndoPam; @@ -345,9 +346,9 @@ sal_uLong SwReader::Read( const Reader& rOptions ) { if( bSaveUndo ) { - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); pDoc->GetIDocumentUndoRedo().EndUndo( UNDO_INSDOKUMENT, NULL ); - pDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( nsRedlineMode_t::REDLINE_IGNORE ); } } @@ -368,7 +369,7 @@ sal_uLong SwReader::Read( const Reader& rOptions ) pDoc->SetFieldsDirty(false, NULL, 0); } - pDoc->SetRedlineMode_intern( eOld ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( eOld ); pDoc->SetOle2Link( aOLELink ); if( pCrsr ) // das Doc ist jetzt modifiziert diff --git a/sw/source/filter/html/swhtml.cxx b/sw/source/filter/html/swhtml.cxx index 906254b7de8c..e1f8a07c829e 100644 --- a/sw/source/filter/html/swhtml.cxx +++ b/sw/source/filter/html/swhtml.cxx @@ -80,6 +80,7 @@ #include <IDocumentUndoRedo.hxx> #include <IDocumentSettingAccess.hxx> #include <IDocumentLinksAdministration.hxx> +#include <IDocumentRedlineAccess.hxx> #include <pam.hxx> #include <ndtxt.hxx> #include <mdiexp.hxx> @@ -521,7 +522,7 @@ SvParserState SwHTMLParser::CallParser() aInsertionRangePam.SetMark(); *aInsertionRangePam.GetPoint() = *pPam->GetPoint(); aInsertionRangePam.Move( fnMoveBackward ); - pDoc->SplitRedline( aInsertionRangePam ); + pDoc->getIDocumentRedlineAccess().SplitRedline( aInsertionRangePam ); pDoc->SetTxtFmtColl( *pPam, pCSS1Parser->GetTxtCollFromPool( RES_POOLCOLL_STANDARD )); diff --git a/sw/source/filter/ww1/fltshell.cxx b/sw/source/filter/ww1/fltshell.cxx index a84907e1b83a..87df0bd8786a 100644 --- a/sw/source/filter/ww1/fltshell.cxx +++ b/sw/source/filter/ww1/fltshell.cxx @@ -45,6 +45,7 @@ #include <redline.hxx> #include <pam.hxx> #include <doc.hxx> +#include <IDocumentRedlineAccess.hxx> #include <ndtxt.hxx> #include <frmatr.hxx> #include <fldbas.hxx> @@ -637,7 +638,7 @@ void SwFltControlStack::SetAttrInDoc(const SwPosition& rTmpPos, { if (rEntry.MakeRegion(pDoc, aRegion, true)) { - pDoc->SetRedlineMode((RedlineMode_t)( nsRedlineMode_t::REDLINE_ON + pDoc->getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)( nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE )); SwFltRedline& rFltRedline = *((SwFltRedline*)rEntry.pAttr); @@ -650,7 +651,7 @@ void SwFltControlStack::SetAttrInDoc(const SwPosition& rTmpPos, OUString(), 0 ); - pDoc->AppendRedline(new SwRangeRedline(aData, aRegion), true); + pDoc->getIDocumentRedlineAccess().AppendRedline(new SwRangeRedline(aData, aRegion), true); } SwRedlineData aData(rFltRedline.eType, rFltRedline.nAutorNo, @@ -658,8 +659,8 @@ void SwFltControlStack::SetAttrInDoc(const SwPosition& rTmpPos, OUString(), 0 ); - pDoc->AppendRedline( new SwRangeRedline(aData, aRegion), true ); - pDoc->SetRedlineMode((RedlineMode_t)( nsRedlineMode_t::REDLINE_NONE + pDoc->getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline(aData, aRegion), true ); + pDoc->getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)( nsRedlineMode_t::REDLINE_NONE | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE )); } diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index edd69c254b8f..59dd510b507a 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -113,6 +113,7 @@ #include <docsh.hxx> #include <docary.hxx> #include <IDocumentSettingAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <osl/file.hxx> #include <vcl/embeddedfontshelper.hxx> @@ -3392,7 +3393,7 @@ void DocxAttributeOutput::TableRowRedline( ww8::WW8TableNodeInfoInner::Pointer_t const SwTableLine * pTabLine = pTabBox->GetUpper(); // search next Redline - const SwExtraRedlineTbl& aExtraRedlineTbl = m_rExport.pDoc->GetExtraRedlineTbl(); + const SwExtraRedlineTbl& aExtraRedlineTbl = m_rExport.pDoc->getIDocumentRedlineAccess().GetExtraRedlineTbl(); for(sal_uInt16 nCurRedlinePos = 0; nCurRedlinePos < aExtraRedlineTbl.GetSize(); ++nCurRedlinePos ) { SwExtraRedline* pExtraRedline = aExtraRedlineTbl.GetRedline(nCurRedlinePos); @@ -3438,7 +3439,7 @@ void DocxAttributeOutput::TableCellRedline( ww8::WW8TableNodeInfoInner::Pointer_ const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox(); // search next Redline - const SwExtraRedlineTbl& aExtraRedlineTbl = m_rExport.pDoc->GetExtraRedlineTbl(); + const SwExtraRedlineTbl& aExtraRedlineTbl = m_rExport.pDoc->getIDocumentRedlineAccess().GetExtraRedlineTbl(); for(sal_uInt16 nCurRedlinePos = 0; nCurRedlinePos < aExtraRedlineTbl.GetSize(); ++nCurRedlinePos ) { SwExtraRedline* pExtraRedline = aExtraRedlineTbl.GetRedline(nCurRedlinePos); diff --git a/sw/source/filter/ww8/rtfexport.cxx b/sw/source/filter/ww8/rtfexport.cxx index 7b0f746b48ea..7a42f441bb6a 100644 --- a/sw/source/filter/ww8/rtfexport.cxx +++ b/sw/source/filter/ww8/rtfexport.cxx @@ -268,7 +268,7 @@ void RtfExport::WriteNumbering() void RtfExport::WriteRevTab() { - int nRevAuthors = pDoc->GetRedlineTbl().size(); + int nRevAuthors = pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size(); if (nRevAuthors < 1) return; @@ -276,9 +276,9 @@ void RtfExport::WriteRevTab() // RTF always seems to use Unknown as the default first entry GetRedline(OUString("Unknown")); - for (sal_uInt16 i = 0; i < pDoc->GetRedlineTbl().size(); ++i) + for (sal_uInt16 i = 0; i < pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size(); ++i) { - const SwRangeRedline* pRedl = pDoc->GetRedlineTbl()[ i ]; + const SwRangeRedline* pRedl = pDoc->getIDocumentRedlineAccess().GetRedlineTbl()[ i ]; GetRedline(SW_MOD()->GetRedlineAuthor(pRedl->GetAuthor())); } diff --git a/sw/source/filter/ww8/writerhelper.cxx b/sw/source/filter/ww8/writerhelper.cxx index 85891c3d72aa..c4475e6e482b 100644 --- a/sw/source/filter/ww8/writerhelper.cxx +++ b/sw/source/filter/ww8/writerhelper.cxx @@ -757,7 +757,7 @@ namespace sw (*aRegion.GetPoint() != *aRegion.GetMark()) ) { - mrDoc.SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | + mrDoc.getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)); const SwFltRedline *pFltRedline = static_cast<const SwFltRedline*> (pEntry->pAttr); @@ -768,7 +768,7 @@ namespace sw pFltRedline->nAutorNoPrev, pFltRedline->aStampPrev, OUString(), 0); - mrDoc.AppendRedline(new SwRangeRedline(aData, aRegion), true); + mrDoc.getIDocumentRedlineAccess().AppendRedline(new SwRangeRedline(aData, aRegion), true); } SwRedlineData aData(pFltRedline->eType, pFltRedline->nAutorNo, @@ -779,8 +779,8 @@ namespace sw // the PaM somewhere safe aRegion.DeleteMark(); *aRegion.GetPoint() = SwPosition(SwNodeIndex(mrDoc.GetNodes())); - mrDoc.AppendRedline(pNewRedline, true); - mrDoc.SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_NONE | nsRedlineMode_t::REDLINE_SHOW_INSERT | + mrDoc.getIDocumentRedlineAccess().AppendRedline(pNewRedline, true); + mrDoc.getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_NONE | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE )); } delete pEntry; diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx index bcb17cdbfa7c..266997bfdf2b 100644 --- a/sw/source/filter/ww8/wrtw8nds.cxx +++ b/sw/source/filter/ww8/wrtw8nds.cxx @@ -216,10 +216,10 @@ SwWW8AttrIter::SwWW8AttrIter(MSWordExportBase& rWr, const SwTxtNode& rTxtNd) : maFlyIter = maFlyFrms.begin(); - if ( !m_rExport.pDoc->GetRedlineTbl().empty() ) + if ( !m_rExport.pDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) { SwPosition aPosition( rNd, SwIndex( (SwTxtNode*)&rNd ) ); - pCurRedline = m_rExport.pDoc->GetRedline( aPosition, &nCurRedlinePos ); + pCurRedline = m_rExport.pDoc->getIDocumentRedlineAccess().GetRedline( aPosition, &nCurRedlinePos ); } nAktSwPos = SearchNext(1); @@ -264,16 +264,16 @@ sal_Int32 SwWW8AttrIter::SearchNext( sal_Int32 nStartPos ) } } - if ( nCurRedlinePos < m_rExport.pDoc->GetRedlineTbl().size() ) + if ( nCurRedlinePos < m_rExport.pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size() ) { // nCurRedlinePos point to the next redline sal_uInt16 nRedLinePos = nCurRedlinePos; if( pCurRedline ) ++nRedLinePos; - for ( ; nRedLinePos < m_rExport.pDoc->GetRedlineTbl().size(); ++nRedLinePos ) + for ( ; nRedLinePos < m_rExport.pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size(); ++nRedLinePos ) { - const SwRangeRedline* pRedl = m_rExport.pDoc->GetRedlineTbl()[ nRedLinePos ]; + const SwRangeRedline* pRedl = m_rExport.pDoc->getIDocumentRedlineAccess().GetRedlineTbl()[ nRedLinePos ]; const SwPosition* pStt = pRedl->Start(); const SwPosition* pEnd = pStt == pRedl->GetPoint() @@ -1256,9 +1256,9 @@ bool SwWW8AttrIter::IsRedlineAtEnd( sal_Int32 nEnd ) const { // search next Redline for( sal_uInt16 nPos = nCurRedlinePos; - nPos < m_rExport.pDoc->GetRedlineTbl().size(); ++nPos ) + nPos < m_rExport.pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size(); ++nPos ) { - const SwPosition* pEnd = m_rExport.pDoc->GetRedlineTbl()[ nPos ]->End(); + const SwPosition* pEnd = m_rExport.pDoc->getIDocumentRedlineAccess().GetRedlineTbl()[ nPos ]->End(); if( pEnd->nNode != rNd ) { break; @@ -1277,9 +1277,9 @@ const SwRedlineData* SwWW8AttrIter::GetParagraphLevelRedline( ) pCurRedline = NULL; // ToDo : this is not the most ideal ... should start maybe from 'nCurRedlinePos' - for( sal_uInt16 nRedlinePos = 0; nRedlinePos < m_rExport.pDoc->GetRedlineTbl().size(); ++nRedlinePos ) + for( sal_uInt16 nRedlinePos = 0; nRedlinePos < m_rExport.pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size(); ++nRedlinePos ) { - const SwRangeRedline* pRedl = m_rExport.pDoc->GetRedlineTbl()[ nRedlinePos ]; + const SwRangeRedline* pRedl = m_rExport.pDoc->getIDocumentRedlineAccess().GetRedlineTbl()[ nRedlinePos ]; const SwPosition* pCheckedStt = pRedl->Start(); @@ -1331,10 +1331,10 @@ const SwRedlineData* SwWW8AttrIter::GetRunLevelRedline( sal_Int32 nPos ) if( !pCurRedline ) { // search next Redline - for( ; nCurRedlinePos < m_rExport.pDoc->GetRedlineTbl().size(); + for( ; nCurRedlinePos < m_rExport.pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size(); ++nCurRedlinePos ) { - const SwRangeRedline* pRedl = m_rExport.pDoc->GetRedlineTbl()[ nCurRedlinePos ]; + const SwRangeRedline* pRedl = m_rExport.pDoc->getIDocumentRedlineAccess().GetRedlineTbl()[ nCurRedlinePos ]; const SwPosition* pStt = pRedl->Start(); const SwPosition* pEnd = pStt == pRedl->GetPoint() @@ -1591,10 +1591,10 @@ OUString SwWW8AttrIter::GetSnippet(const OUString &rStr, sal_Int32 nAktPos, static SwTxtFmtColl& lcl_getFormatCollection( MSWordExportBase& rExport, const SwTxtNode* pTxtNode ) { sal_uInt16 nPos = 0; - sal_uInt16 nMax = rExport.pDoc->GetRedlineTbl().size(); + sal_uInt16 nMax = rExport.pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size(); while( nPos < nMax ) { - const SwRangeRedline* pRedl = rExport.pDoc->GetRedlineTbl()[ nPos++ ]; + const SwRangeRedline* pRedl = rExport.pDoc->getIDocumentRedlineAccess().GetRedlineTbl()[ nPos++ ]; const SwPosition* pStt = pRedl->Start(); const SwPosition* pEnd = pStt == pRedl->GetPoint() ? pRedl->GetMark() diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx index 3fb650280e6a..6b10c89528df 100644 --- a/sw/source/filter/ww8/wrtww8.cxx +++ b/sw/source/filter/ww8/wrtww8.cxx @@ -3046,10 +3046,10 @@ void MSWordExportBase::ExportDocument( bool bWriteAll ) // #i81405# - Collect anchored objects before changing the redline mode. maFrames = GetFrames( *pDoc, bWriteAll? NULL : pOrigPam ); - mnRedlineMode = pDoc->GetRedlineMode(); - if ( !pDoc->GetRedlineTbl().empty() ) + mnRedlineMode = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + if ( !pDoc->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) { - pDoc->SetRedlineMode( (RedlineMode_t)(mnRedlineMode | nsRedlineMode_t::REDLINE_SHOW_DELETE | + pDoc->getIDocumentRedlineAccess().SetRedlineMode( (RedlineMode_t)(mnRedlineMode | nsRedlineMode_t::REDLINE_SHOW_DELETE | nsRedlineMode_t::REDLINE_SHOW_INSERT) ); } @@ -3064,8 +3064,8 @@ void MSWordExportBase::ExportDocument( bool bWriteAll ) ExportDocument_Impl(); - if ( mnRedlineMode != pDoc->GetRedlineMode() ) - pDoc->SetRedlineMode( (RedlineMode_t)(mnRedlineMode) ); + if ( mnRedlineMode != pDoc->getIDocumentRedlineAccess().GetRedlineMode() ) + pDoc->getIDocumentRedlineAccess().SetRedlineMode( (RedlineMode_t)(mnRedlineMode) ); } bool SwWW8Writer::InitStd97CodecUpdateMedium( ::msfilter::MSCodec_Std97& rCodec ) diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index e938acd8d7fb..3568ca7143c6 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -5578,9 +5578,9 @@ void AttributeOutputBase::FormatCharBorder( const SvxBoxItem& rBox ) const SwRedlineData* AttributeOutputBase::GetParagraphMarkerRedline( const SwTxtNode& rNode, RedlineType_t aRedlineType) { // ToDo : this is not the most ideal ... should start maybe from 'nCurRedlinePos' - for( sal_uInt16 nRedlinePos = 0; nRedlinePos < GetExport().pDoc->GetRedlineTbl().size(); ++nRedlinePos ) + for( sal_uInt16 nRedlinePos = 0; nRedlinePos < GetExport().pDoc->getIDocumentRedlineAccess().GetRedlineTbl().size(); ++nRedlinePos ) { - const SwRangeRedline* pRedl = GetExport().pDoc->GetRedlineTbl()[ nRedlinePos ]; + const SwRangeRedline* pRedl = GetExport().pDoc->getIDocumentRedlineAccess().GetRedlineTbl()[ nRedlinePos ]; // Only check redlines that are of type 'Delete' if ( pRedl->GetRedlineData().GetType() != aRedlineType ) diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index e78c62bdc714..a56a97ea94c7 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -5341,7 +5341,7 @@ sal_uLong SwWW8ImplReader::CoreLoad(WW8Glossary *pGloss, const SwPosition &rPos) // delete the pam before the call for hide all redlines (Bug 73683) if (mbNewDoc) - rDoc.SetRedlineMode((RedlineMode_t)( eMode )); + rDoc.getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)( eMode )); UpdatePageDescs(rDoc, nPageDescOffset); diff --git a/sw/source/filter/ww8/ww8par4.cxx b/sw/source/filter/ww8/ww8par4.cxx index 53075c9dcfeb..b09fec67d5bf 100644 --- a/sw/source/filter/ww8/ww8par4.cxx +++ b/sw/source/filter/ww8/ww8par4.cxx @@ -456,7 +456,7 @@ void SwWW8ImplReader::ReadRevMarkAuthorStrTabl( SvStream& rStrm, for( sal_uInt16 nAuthor = 0; nAuthor < nCount; ++nAuthor ) { // Store author in doc - sal_uInt16 nSWId = rDocOut.InsertRedlineAuthor(aAuthorNames[nAuthor]); + sal_uInt16 nSWId = rDocOut.getIDocumentRedlineAccess().InsertRedlineAuthor(aAuthorNames[nAuthor]); // Store matchpair m_aAuthorInfos[nAuthor] = nSWId; } diff --git a/sw/source/filter/xml/XMLRedlineImportHelper.cxx b/sw/source/filter/xml/XMLRedlineImportHelper.cxx index dd34a4063f04..846905b7ff62 100644 --- a/sw/source/filter/xml/XMLRedlineImportHelper.cxx +++ b/sw/source/filter/xml/XMLRedlineImportHelper.cxx @@ -685,9 +685,9 @@ void XMLRedlineImportHelper::InsertIntoDocument(RedlineInfo* pRedlineInfo) } // set redline mode (without doing the associated book-keeping) - pDoc->SetRedlineMode_intern(nsRedlineMode_t::REDLINE_ON); - pDoc->AppendRedline(pRedline, false); - pDoc->SetRedlineMode_intern(nsRedlineMode_t::REDLINE_NONE); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern(nsRedlineMode_t::REDLINE_ON); + pDoc->getIDocumentRedlineAccess().AppendRedline(pRedline, false); + pDoc->getIDocumentRedlineAccess().SetRedlineMode_intern(nsRedlineMode_t::REDLINE_NONE); } } @@ -698,7 +698,7 @@ SwRedlineData* XMLRedlineImportHelper::ConvertRedline( // convert info: // 1) Author String -> Author ID (default to zero) sal_uInt16 nAuthorId = (NULL == pDoc) ? 0 : - pDoc->InsertRedlineAuthor( pRedlineInfo->sAuthor ); + pDoc->getIDocumentRedlineAccess().InsertRedlineAuthor( pRedlineInfo->sAuthor ); // 2) util::DateTime -> DateTime DateTime aDT( DateTime::EMPTY ); diff --git a/sw/source/filter/xml/swxml.cxx b/sw/source/filter/xml/swxml.cxx index 4c0c0089c873..acc6352d8a17 100644 --- a/sw/source/filter/xml/swxml.cxx +++ b/sw/source/filter/xml/swxml.cxx @@ -52,6 +52,7 @@ #include <doc.hxx> #include <IDocumentSettingAccess.hxx> #include <IDocumentDrawModelAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docary.hxx> #include <docsh.hxx> #include <unotextrange.hxx> @@ -786,17 +787,17 @@ sal_uLong XMLReader::Read( SwDoc &rDoc, const OUString& rBaseURL, SwPaM &rPaM, c const OUString sShowChanges("ShowChanges"); const OUString sRecordChanges("RecordChanges"); const OUString sRedlineProtectionKey("RedlineProtectionKey"); - bTmp = IDocumentRedlineAccess::IsShowChanges( rDoc.GetRedlineMode() ); + bTmp = IDocumentRedlineAccess::IsShowChanges( rDoc.getIDocumentRedlineAccess().GetRedlineMode() ); aAny.setValue( &bTmp, ::getBooleanCppuType() ); xInfoSet->setPropertyValue( sShowChanges, aAny ); - bTmp = IDocumentRedlineAccess::IsRedlineOn(rDoc.GetRedlineMode()); + bTmp = IDocumentRedlineAccess::IsRedlineOn(rDoc.getIDocumentRedlineAccess().GetRedlineMode()); aAny.setValue( &bTmp, ::getBooleanCppuType() ); xInfoSet->setPropertyValue( sRecordChanges, aAny ); - aAny <<= rDoc.GetRedlinePassword(); + aAny <<= rDoc.getIDocumentRedlineAccess().GetRedlinePassword(); xInfoSet->setPropertyValue( sRedlineProtectionKey, aAny ); // force redline mode to "none" - rDoc.SetRedlineMode_intern( nsRedlineMode_t::REDLINE_NONE ); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( nsRedlineMode_t::REDLINE_NONE ); const bool bOASIS = ( SotStorage::GetVersion( xStorage ) > SOFFICE_FILEFORMAT_60 ); // #i28749# - set property <ShapePositionInHoriL2R> @@ -911,7 +912,7 @@ sal_uLong XMLReader::Read( SwDoc &rDoc, const OUString& rBaseURL, SwPaM &rPaM, c aAny = xInfoSet->getPropertyValue( sRedlineProtectionKey ); Sequence<sal_Int8> aKey; aAny >>= aKey; - rDoc.SetRedlinePassword( aKey ); + rDoc.getIDocumentRedlineAccess().SetRedlinePassword( aKey ); // restore redline mode from import info property set sal_Int16 nRedlineMode = nsRedlineMode_t::REDLINE_SHOW_INSERT; @@ -925,10 +926,10 @@ sal_uLong XMLReader::Read( SwDoc &rDoc, const OUString& rBaseURL, SwPaM &rPaM, c nRedlineMode |= nsRedlineMode_t::REDLINE_NONE; // ... restore redline mode - // (First set bogus mode to make sure the mode in SetRedlineMode() + // (First set bogus mode to make sure the mode in getIDocumentRedlineAccess().SetRedlineMode() // is different from it's previous mode.) - rDoc.SetRedlineMode_intern((RedlineMode_t)( ~nRedlineMode )); - rDoc.SetRedlineMode( (RedlineMode_t)( nRedlineMode )); + rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)( ~nRedlineMode )); + rDoc.getIDocumentRedlineAccess().SetRedlineMode( (RedlineMode_t)( nRedlineMode )); lcl_EnsureValidPam( rPaM ); // move Pam into valid content diff --git a/sw/source/filter/xml/wrtxml.cxx b/sw/source/filter/xml/wrtxml.cxx index 9fa3e9178a11..c6f6bba39d80 100644 --- a/sw/source/filter/xml/wrtxml.cxx +++ b/sw/source/filter/xml/wrtxml.cxx @@ -38,6 +38,7 @@ #include <sfx2/docfile.hxx> #include <pam.hxx> #include <doc.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docstat.hxx> #include <docsh.hxx> @@ -181,14 +182,14 @@ sal_uInt32 SwXMLWriter::_Write( const uno::Reference < task::XStatusIndicator >& // save show redline mode ... const OUString sShowChanges("ShowChanges"); - sal_uInt16 nRedlineMode = pDoc->GetRedlineMode(); + sal_uInt16 nRedlineMode = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); sal_Bool bShowChanges( IDocumentRedlineAccess::IsShowChanges( nRedlineMode ) ); aAny.setValue( &bShowChanges, ::getBooleanCppuType() ); xInfoSet->setPropertyValue( sShowChanges, aAny ); // ... and hide redlines for export nRedlineMode &= ~nsRedlineMode_t::REDLINE_SHOW_MASK; nRedlineMode |= nsRedlineMode_t::REDLINE_SHOW_INSERT; - pDoc->SetRedlineMode((RedlineMode_t)( nRedlineMode )); + pDoc->getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)( nRedlineMode )); // Set base URI xInfoSet->setPropertyValue( "BaseURI", makeAny( GetBaseURL() ) ); @@ -405,12 +406,12 @@ sal_uInt32 SwXMLWriter::_Write( const uno::Reference < task::XStatusIndicator >& // restore redline mode aAny = xInfoSet->getPropertyValue( sShowChanges ); - nRedlineMode = pDoc->GetRedlineMode(); + nRedlineMode = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); nRedlineMode &= ~nsRedlineMode_t::REDLINE_SHOW_MASK; nRedlineMode |= nsRedlineMode_t::REDLINE_SHOW_INSERT; if ( *(sal_Bool*)aAny.getValue() ) nRedlineMode |= nsRedlineMode_t::REDLINE_SHOW_DELETE; - pDoc->SetRedlineMode((RedlineMode_t)( nRedlineMode )); + pDoc->getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)( nRedlineMode )); if (xStatusIndicator.is()) { diff --git a/sw/source/filter/xml/xmlexp.cxx b/sw/source/filter/xml/xmlexp.cxx index 19fabca7d708..90de156fb866 100644 --- a/sw/source/filter/xml/xmlexp.cxx +++ b/sw/source/filter/xml/xmlexp.cxx @@ -61,6 +61,7 @@ #include <osl/mutex.hxx> #include <IDocumentSettingAccess.hxx> #include <IDocumentDrawModelAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <pausethreadstarting.hxx> #include <drawdoc.hxx> @@ -287,12 +288,12 @@ sal_uInt32 SwXMLExport::exportDoc( enum XMLTokenEnum eClass ) } } sal_uInt16 nRedlineMode = 0; - bSavedShowChanges = IDocumentRedlineAccess::IsShowChanges( pDoc->GetRedlineMode() ); + bSavedShowChanges = IDocumentRedlineAccess::IsShowChanges( pDoc->getIDocumentRedlineAccess().GetRedlineMode() ); if( bSaveRedline ) { // now save and switch redline mode - nRedlineMode = pDoc->GetRedlineMode(); - pDoc->SetRedlineMode( + nRedlineMode = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); + pDoc->getIDocumentRedlineAccess().SetRedlineMode( (RedlineMode_t)(( nRedlineMode & nsRedlineMode_t::REDLINE_SHOW_MASK ) | nsRedlineType_t::REDLINE_INSERT )); } @@ -301,7 +302,7 @@ sal_uInt32 SwXMLExport::exportDoc( enum XMLTokenEnum eClass ) // now we can restore the redline mode (if we changed it previously) if( bSaveRedline ) { - pDoc->SetRedlineMode( (RedlineMode_t)(nRedlineMode )); + pDoc->getIDocumentRedlineAccess().SetRedlineMode( (RedlineMode_t)(nRedlineMode )); } if( pGraphicResolver ) diff --git a/sw/source/ui/vba/vbarevision.cxx b/sw/source/ui/vba/vbarevision.cxx index ceac995b5ac7..e1133dd430a4 100644 --- a/sw/source/ui/vba/vbarevision.cxx +++ b/sw/source/ui/vba/vbarevision.cxx @@ -23,6 +23,7 @@ #include "wordvbahelper.hxx" #include <docsh.hxx> #include <doc.hxx> +#include <IDocumentRedlineAccess.hxx> using namespace ::ooo::vba; using namespace ::com::sun::star; @@ -62,7 +63,7 @@ SwVbaRevision::Accept() throw ( css::uno::RuntimeException, std::exception ) { SwDoc* pDoc = word::getDocShell( mxModel )->GetDoc(); if( pDoc ) - pDoc->AcceptRedline( GetPosition(), true ); + pDoc->getIDocumentRedlineAccess().AcceptRedline( GetPosition(), true ); } void SAL_CALL @@ -70,7 +71,7 @@ SwVbaRevision::Reject( ) throw ( css::uno::RuntimeException, std::exception ) { SwDoc* pDoc = word::getDocShell( mxModel )->GetDoc(); if( pDoc ) - pDoc->RejectRedline( GetPosition(), true ); + pDoc->getIDocumentRedlineAccess().RejectRedline( GetPosition(), true ); } OUString diff --git a/sw/source/uibase/app/docsh.cxx b/sw/source/uibase/app/docsh.cxx index 1227d93a0efd..bf762a47bc10 100644 --- a/sw/source/uibase/app/docsh.cxx +++ b/sw/source/uibase/app/docsh.cxx @@ -73,6 +73,7 @@ #include <IDocumentLinksAdministration.hxx> #include <IDocumentDeviceAccess.hxx> #include <IDocumentDrawModelAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docstat.hxx> #include <pagedesc.hxx> #include <pview.hxx> @@ -904,7 +905,7 @@ sal_uInt16 SwDocShell::GetHiddenInformationState( sal_uInt16 nStates ) if ( nStates & HIDDENINFORMATION_RECORDEDCHANGES ) { - if ( !GetDoc()->GetRedlineTbl().empty() ) + if ( !GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl().empty() ) nState |= HIDDENINFORMATION_RECORDEDCHANGES; } if ( nStates & HIDDENINFORMATION_NOTES ) diff --git a/sw/source/uibase/uiview/view2.cxx b/sw/source/uibase/uiview/view2.cxx index fdc8b1d4e565..e41205f4e52b 100644 --- a/sw/source/uibase/uiview/view2.cxx +++ b/sw/source/uibase/uiview/view2.cxx @@ -682,7 +682,7 @@ void SwView::Execute(SfxRequest &rReq) // point at the *end* of the redline and the mark at the start (so GetRedline // would return NULL if called on the point) sal_uInt16 nRedline = 0; - const SwRangeRedline *pRedline = pDoc->GetRedline(*pCursor->Start(), &nRedline); + const SwRangeRedline *pRedline = pDoc->getIDocumentRedlineAccess().GetRedline(*pCursor->Start(), &nRedline); assert(pRedline != 0); if (pRedline) { diff --git a/sw/source/uibase/uiview/viewstat.cxx b/sw/source/uibase/uiview/viewstat.cxx index 171ee44c355f..0148ffd53318 100644 --- a/sw/source/uibase/uiview/viewstat.cxx +++ b/sw/source/uibase/uiview/viewstat.cxx @@ -306,7 +306,7 @@ void SwView::GetState(SfxItemSet &rSet) else if (pCursor->HasMark()) { // If the selection does not contain redlines, disable accepting/rejecting changes. sal_uInt16 index = 0; - const SwRedlineTbl& table = pDoc->GetRedlineTbl(); + const SwRedlineTbl& table = pDoc->getIDocumentRedlineAccess().GetRedlineTbl(); const SwRangeRedline* redline = table.FindAtPosition( *pCursor->Start(), index ); if( redline != NULL && *redline->Start() == *pCursor->End()) redline = NULL; @@ -331,7 +331,7 @@ void SwView::GetState(SfxItemSet &rSet) { // If the cursor position isn't on a redline, disable // accepting/rejecting changes. - if (0 == pDoc->GetRedline(*pCursor->Start(), 0)) + if (0 == pDoc->getIDocumentRedlineAccess().GetRedline(*pCursor->Start(), 0)) rSet.DisableItem(nWhich); } } diff --git a/sw/source/uibase/uno/SwXDocumentSettings.cxx b/sw/source/uibase/uno/SwXDocumentSettings.cxx index b515077f484b..c8494ac4a1fe 100644 --- a/sw/source/uibase/uno/SwXDocumentSettings.cxx +++ b/sw/source/uibase/uno/SwXDocumentSettings.cxx @@ -28,6 +28,7 @@ #include <doc.hxx> #include <IDocumentSettingAccess.hxx> #include <IDocumentDeviceAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <docsh.hxx> #include <fldupde.hxx> #include <linkenum.hxx> @@ -594,12 +595,12 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf Sequence <sal_Int8> aNew; if(rValue >>= aNew) { - mpDoc->SetRedlinePassword(aNew); + mpDoc->getIDocumentRedlineAccess().SetRedlinePassword(aNew); if(aNew.getLength()) { - sal_uInt16 eMode = mpDoc->GetRedlineMode(); + sal_uInt16 eMode = mpDoc->getIDocumentRedlineAccess().GetRedlineMode(); eMode = eMode|nsRedlineMode_t::REDLINE_ON; - mpDoc->SetRedlineMode((RedlineMode_t)( eMode )); + mpDoc->getIDocumentRedlineAccess().SetRedlineMode((RedlineMode_t)( eMode )); } } } @@ -1041,7 +1042,7 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf break; case HANDLE_CHANGES_PASSWORD: { - rValue <<= mpDoc->GetRedlinePassword(); + rValue <<= mpDoc->getIDocumentRedlineAccess().GetRedlinePassword(); } break; case HANDLE_CONSIDER_WRAP_ON_OBJPOS: diff --git a/sw/source/uibase/uno/unoatxt.cxx b/sw/source/uibase/uno/unoatxt.cxx index 5c640246a362..0c98fc4aafb5 100644 --- a/sw/source/uibase/uno/unoatxt.cxx +++ b/sw/source/uibase/uno/unoatxt.cxx @@ -40,6 +40,7 @@ #include <unocrsr.hxx> #include <IMark.hxx> #include <IDocumentContentOperations.hxx> +#include <IDocumentRedlineAccess.hxx> #include <unoprnms.hxx> #include <docsh.hxx> #include <swmodule.hxx> @@ -409,9 +410,9 @@ uno::Reference< text::XAutoTextEntry > SwXAutoTextGroup::insertNewByName(const pGlosGroup->ClearDoc(); if( pGlosGroup->BeginPutDoc( sShortName, sLongName ) ) { - pGDoc->SetRedlineMode_intern( nsRedlineMode_t::REDLINE_DELETE_REDLINES ); + pGDoc->getIDocumentRedlineAccess().SetRedlineMode_intern( nsRedlineMode_t::REDLINE_DELETE_REDLINES ); lcl_CopySelToDoc( pGDoc, pxCursor, pxRange ); - pGDoc->SetRedlineMode_intern((RedlineMode_t)( 0 )); + pGDoc->getIDocumentRedlineAccess().SetRedlineMode_intern((RedlineMode_t)( 0 )); nRet = pGlosGroup->PutDoc(); } } diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx index 1dc5f54656d8..9c78bdc5c014 100644 --- a/sw/source/uibase/uno/unotxdoc.cxx +++ b/sw/source/uibase/uno/unotxdoc.cxx @@ -99,6 +99,7 @@ #include <IDocumentDrawModelAccess.hxx> #include <IDocumentChartDataProviderAccess.hxx> #include <IDocumentLinksAdministration.hxx> +#include <IDocumentRedlineAccess.hxx> #include <editeng/forbiddencharacterstable.hxx> #include <svl/zforlist.hxx> #include <drawdoc.hxx> @@ -1848,7 +1849,7 @@ void SwXTextDocument::setPropertyValue(const OUString& rPropertyName, const Any& case WID_DOC_CHANGES_SHOW: { bool bSet = *(sal_Bool*)aValue.getValue(); - sal_uInt16 eMode = pDocShell->GetDoc()->GetRedlineMode(); + sal_uInt16 eMode = pDocShell->GetDoc()->getIDocumentRedlineAccess().GetRedlineMode(); if(WID_DOC_CHANGES_SHOW == pEntry->nWID) { eMode &= ~(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE); @@ -1860,7 +1861,7 @@ void SwXTextDocument::setPropertyValue(const OUString& rPropertyName, const Any& { eMode = bSet ? eMode|nsRedlineMode_t::REDLINE_ON : eMode&~nsRedlineMode_t::REDLINE_ON; } - pDocShell->GetDoc()->SetRedlineMode( (RedlineMode_t)(eMode )); + pDocShell->GetDoc()->getIDocumentRedlineAccess().SetRedlineMode( (RedlineMode_t)(eMode )); } break; case WID_DOC_CHANGES_PASSWORD: @@ -1869,12 +1870,12 @@ void SwXTextDocument::setPropertyValue(const OUString& rPropertyName, const Any& if(aValue >>= aNew) { SwDoc* pDoc = pDocShell->GetDoc(); - pDoc->SetRedlinePassword(aNew); + pDoc->getIDocumentRedlineAccess().SetRedlinePassword(aNew); if(aNew.getLength()) { - sal_uInt16 eMode = pDoc->GetRedlineMode(); + sal_uInt16 eMode = pDoc->getIDocumentRedlineAccess().GetRedlineMode(); eMode = eMode|nsRedlineMode_t::REDLINE_ON; - pDoc->SetRedlineMode( (RedlineMode_t)(eMode )); + pDoc->getIDocumentRedlineAccess().SetRedlineMode( (RedlineMode_t)(eMode )); } } } @@ -1891,7 +1892,7 @@ void SwXTextDocument::setPropertyValue(const OUString& rPropertyName, const Any& break; case WID_DOC_REDLINE_DISPLAY: { - sal_Int16 eRedMode = pDocShell->GetDoc()->GetRedlineMode(); + sal_Int16 eRedMode = pDocShell->GetDoc()->getIDocumentRedlineAccess().GetRedlineMode(); eRedMode = eRedMode & (~nsRedlineMode_t::REDLINE_SHOW_MASK); sal_Int16 nSet = 0; aValue >>= nSet; @@ -1905,7 +1906,7 @@ void SwXTextDocument::setPropertyValue(const OUString& rPropertyName, const Any& break; default: throw IllegalArgumentException(); } - pDocShell->GetDoc()->SetRedlineMode(eRedMode); + pDocShell->GetDoc()->getIDocumentRedlineAccess().SetRedlineMode(eRedMode); } break; case WID_DOC_TWO_DIGIT_YEAR: @@ -2032,7 +2033,7 @@ Any SwXTextDocument::getPropertyValue(const OUString& rPropertyName) case WID_DOC_CHANGES_RECORD: case WID_DOC_CHANGES_SHOW: { - const sal_uInt16 eMode = pDocShell->GetDoc()->GetRedlineMode(); + const sal_uInt16 eMode = pDocShell->GetDoc()->getIDocumentRedlineAccess().GetRedlineMode(); bool bSet = false; if(WID_DOC_CHANGES_SHOW == pEntry->nWID) { @@ -2050,7 +2051,7 @@ Any SwXTextDocument::getPropertyValue(const OUString& rPropertyName) case WID_DOC_CHANGES_PASSWORD: { SwDoc* pDoc = pDocShell->GetDoc(); - aAny <<= pDoc->GetRedlinePassword(); + aAny <<= pDoc->getIDocumentRedlineAccess().GetRedlinePassword(); } break; case WID_DOC_AUTO_MARK_URL : @@ -2064,7 +2065,7 @@ Any SwXTextDocument::getPropertyValue(const OUString& rPropertyName) break; case WID_DOC_REDLINE_DISPLAY: { - sal_Int16 eRedMode = pDocShell->GetDoc()->GetRedlineMode(); + sal_Int16 eRedMode = pDocShell->GetDoc()->getIDocumentRedlineAccess().GetRedlineMode(); eRedMode = eRedMode & nsRedlineMode_t::REDLINE_SHOW_MASK; sal_Int16 nRet = RedlineDisplayType::NONE; if(nsRedlineMode_t::REDLINE_SHOW_INSERT == eRedMode) |