diff options
author | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2015-05-22 16:42:23 +0200 |
---|---|---|
committer | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2015-05-26 00:51:11 +0200 |
commit | 50356872b9421303b9c7b4a3135b3cdcc3a0af50 (patch) | |
tree | e87d19df1c26853d567516f37f08344f287fbe72 | |
parent | 96898cd49830333d752b9aa56fe91a8e21c9dca8 (diff) |
new unocrsrs for SwXTextCursor
Change-Id: I5932f75ee4814ca42f16d349094c7fa8bbb2ee63
-rw-r--r-- | sw/inc/unotextcursor.hxx | 4 | ||||
-rw-r--r-- | sw/inc/unotxdoc.hxx | 4 | ||||
-rw-r--r-- | sw/source/core/unocore/unoftn.cxx | 2 | ||||
-rw-r--r-- | sw/source/core/unocore/unoobj.cxx | 71 | ||||
-rw-r--r-- | sw/source/core/unocore/unoredline.cxx | 4 | ||||
-rw-r--r-- | sw/source/core/unocore/unotbl.cxx | 2 | ||||
-rw-r--r-- | sw/source/core/unocore/unotext.cxx | 4 | ||||
-rw-r--r-- | sw/source/uibase/uno/unotxdoc.cxx | 18 |
8 files changed, 54 insertions, 55 deletions
diff --git a/sw/inc/unotextcursor.hxx b/sw/inc/unotextcursor.hxx index 8cfc15e1fc3b..c86b07254cc8 100644 --- a/sw/inc/unotextcursor.hxx +++ b/sw/inc/unotextcursor.hxx @@ -91,8 +91,8 @@ public: SwPaM const& rSourceCursor, const enum CursorType eType = CURSOR_ALL); - SwUnoCrsr * GetCursor(); - const SwUnoCrsr * GetCursor() const; + std::shared_ptr<SwUnoCrsr> GetCursor(); + //const SwUnoCrsr* GetConstCursor() const; bool IsAtEndOfMeta() const; diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx index 90e7f02b9335..c3a2f67c5f15 100644 --- a/sw/inc/unotxdoc.hxx +++ b/sw/inc/unotxdoc.hxx @@ -432,8 +432,8 @@ public: void InitNewDoc(); - SwUnoCrsr* CreateCursorForSearch(css::uno::Reference< css::text::XTextCursor > & xCrsr); - SwUnoCrsr* FindAny(const css::uno::Reference< css::util::XSearchDescriptor > & xDesc, + std::shared_ptr<SwUnoCrsr> CreateCursorForSearch(css::uno::Reference< css::text::XTextCursor > & xCrsr); + std::shared_ptr<SwUnoCrsr> FindAny(const css::uno::Reference< css::util::XSearchDescriptor > & xDesc, css::uno::Reference< css::text::XTextCursor > & xCrsr, bool bAll, sal_Int32& nResult, css::uno::Reference< css::uno::XInterface > xLastResult); diff --git a/sw/source/core/unocore/unoftn.cxx b/sw/source/core/unocore/unoftn.cxx index c2915233210c..e83b81c9d5f1 100644 --- a/sw/source/core/unocore/unoftn.cxx +++ b/sw/source/core/unocore/unoftn.cxx @@ -431,7 +431,7 @@ SwXFootnote::createTextCursor() throw (uno::RuntimeException, std::exception) SwPosition aPos( *pTextFootnote->GetStartNode() ); SwXTextCursor *const pXCursor = new SwXTextCursor(*GetDoc(), this, CURSOR_FOOTNOTE, aPos); - SwUnoCrsr *const pUnoCrsr = pXCursor->GetCursor(); + auto pUnoCrsr(pXCursor->GetCursor()); pUnoCrsr->Move(fnMoveForward, fnGoNode); const uno::Reference< text::XTextCursor > xRet = static_cast<text::XWordCursor*>(pXCursor); diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx index ce0254b3c2a8..b6cb1246b7e9 100644 --- a/sw/source/core/unocore/unoobj.cxx +++ b/sw/source/core/unocore/unoobj.cxx @@ -661,82 +661,83 @@ public: const SfxItemPropertySet & m_rPropSet; const enum CursorType m_eType; const uno::Reference< text::XText > m_xParentText; - bool m_bIsDisposed; + std::shared_ptr<SwUnoCrsr> m_pUnoCursor; Impl( SwDoc & rDoc, const enum CursorType eType, uno::Reference<text::XText> xParent, SwPosition const& rPoint, SwPosition const*const pMark) - : SwClient(rDoc.CreateUnoCrsr(rPoint, false)) - , m_rPropSet(*aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_CURSOR)) + : m_rPropSet(*aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_CURSOR)) , m_eType(eType) , m_xParentText(xParent) - , m_bIsDisposed(false) + , m_pUnoCursor(rDoc.CreateUnoCrsr2(rPoint, false)) { + m_pUnoCursor->Add(this); if (pMark) { GetCursor()->SetMark(); *GetCursor()->GetMark() = *pMark; } } - - virtual ~Impl() { - // Impl owns the cursor; delete it here: SolarMutex is locked - delete GetRegisteredIn(); + virtual ~Impl() + { + Invalidate(); } - SwUnoCrsr * GetCursor() { - return (m_bIsDisposed) ? 0 : - static_cast<SwUnoCrsr*>(const_cast<SwModify*>(GetRegisteredIn())); + std::shared_ptr<SwUnoCrsr> GetCursor() { + return m_pUnoCursor; } - - SwUnoCrsr & GetCursorOrThrow() { - SwUnoCrsr *const pUnoCursor( GetCursor() ); - if (!pUnoCursor) { + SwUnoCrsr& GetCursorOrThrow() { + if(!m_pUnoCursor) throw uno::RuntimeException("SwXTextCursor: disposed or invalid", 0); - } - return *pUnoCursor; + return *m_pUnoCursor.get(); } void Invalidate() { - m_bIsDisposed = true; + if(m_pUnoCursor) + { + if(GetRegisteredIn() == m_pUnoCursor.get()) + m_pUnoCursor->Remove(this); + m_pUnoCursor.reset(); + } } protected: // SwClient virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) SAL_OVERRIDE; - + virtual void SwClientNotify(const SwModify& rModify, const SfxHint& rHint) SAL_OVERRIDE; }; void SwXTextCursor::Impl::Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) { ClientModify(this, pOld, pNew); - - if (!GetRegisteredIn() || - // if the cursor leaves its designated section, it becomes invalid - ((pOld != NULL) && (pOld->Which() == RES_UNOCURSOR_LEAVES_SECTION))) - { + // if the cursor leaves its designated section, it becomes invalid + if (((pOld != NULL) && (pOld->Which() == RES_UNOCURSOR_LEAVES_SECTION))) Invalidate(); - } } -SwUnoCrsr const* SwXTextCursor::GetCursor() const +void SwXTextCursor::Impl::SwClientNotify(const SwModify& rModify, const SfxHint& rHint) { - return m_pImpl->GetCursor(); + SwClient::SwClientNotify(rModify, rHint); + if(m_pUnoCursor && typeid(rHint) == typeid(sw::DocDisposingHint)) + { + assert(m_pUnoCursor->m_bSaneOwnership); + Invalidate(); + } } -SwUnoCrsr * SwXTextCursor::GetCursor() +std::shared_ptr<SwUnoCrsr> SwXTextCursor::GetCursor() { return m_pImpl->GetCursor(); } SwPaM const* SwXTextCursor::GetPaM() const { - return m_pImpl->GetCursor(); + return m_pImpl->GetCursor().get(); } SwPaM * SwXTextCursor::GetPaM() { - return m_pImpl->GetCursor(); + return m_pImpl->GetCursor().get(); } SwDoc const* SwXTextCursor::GetDoc() const @@ -774,7 +775,7 @@ SwXTextCursor::~SwXTextCursor() void SwXTextCursor::DeleteAndInsert(const OUString& rText, const bool bForceExpandHints) { - SwUnoCrsr *const pUnoCrsr = m_pImpl->GetCursor(); + auto pUnoCrsr = m_pImpl->GetCursor(); if(pUnoCrsr) { // Start/EndAction @@ -782,7 +783,7 @@ void SwXTextCursor::DeleteAndInsert(const OUString& rText, UnoActionContext aAction(pDoc); const sal_Int32 nTextLen = rText.getLength(); pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_INSERT, NULL); - SwCursor * pCurrent = pUnoCrsr; + SwCursor * pCurrent = pUnoCrsr.get(); do { if (pCurrent->HasMark()) @@ -802,7 +803,7 @@ void SwXTextCursor::DeleteAndInsert(const OUString& rText, CRSR_SKIP_CHARS, false, false); } pCurrent = static_cast<SwCursor *>(pCurrent->GetNext()); - } while (pCurrent != pUnoCrsr); + } while (pCurrent != pUnoCrsr.get()); pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_INSERT, NULL); } } @@ -857,7 +858,7 @@ bool SwXTextCursor::IsAtEndOfMeta() const { if (CURSOR_META == m_pImpl->m_eType) { - SwUnoCrsr const * const pCursor( m_pImpl->GetCursor() ); + auto pCursor( m_pImpl->GetCursor() ); SwXMeta const*const pXMeta( dynamic_cast<SwXMeta*>(m_pImpl->m_xParentText.get()) ); OSL_ENSURE(pXMeta, "no meta?"); @@ -971,7 +972,7 @@ sal_Bool SAL_CALL SwXTextCursor::isCollapsed() throw (uno::RuntimeException, std SolarMutexGuard aGuard; bool bRet = true; - SwUnoCrsr *const pUnoCrsr = m_pImpl->GetCursor(); + auto pUnoCrsr(m_pImpl->GetCursor()); if(pUnoCrsr && pUnoCrsr->GetMark()) { bRet = (*pUnoCrsr->GetPoint() == *pUnoCrsr->GetMark()); diff --git a/sw/source/core/unocore/unoredline.cxx b/sw/source/core/unocore/unoredline.cxx index a4254de50f7c..95fc457467a4 100644 --- a/sw/source/core/unocore/unoredline.cxx +++ b/sw/source/core/unocore/unoredline.cxx @@ -110,7 +110,7 @@ uno::Reference<text::XTextCursor> SwXRedlineText::createTextCursor() SwPosition aPos(aNodeIndex); SwXTextCursor *const pXCursor = new SwXTextCursor(*GetDoc(), this, CURSOR_REDLINE, aPos); - SwUnoCrsr *const pUnoCursor = pXCursor->GetCursor(); + auto pUnoCursor(pXCursor->GetCursor()); pUnoCursor->Move(fnMoveForward, fnGoNode); // #101929# prevent a newly created text cursor from running inside a table @@ -567,7 +567,7 @@ uno::Reference< text::XTextCursor > SwXRedline::createTextCursor() throw( uno:: SwPosition aPos(*pNodeIndex); SwXTextCursor *const pXCursor = new SwXTextCursor(*pDoc, this, CURSOR_REDLINE, aPos); - SwUnoCrsr *const pUnoCrsr = pXCursor->GetCursor(); + auto pUnoCrsr(pXCursor->GetCursor()); pUnoCrsr->Move(fnMoveForward, fnGoNode); // is here a table? diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx index 7db370f31225..c317ee0e2deb 100644 --- a/sw/source/core/unocore/unotbl.cxx +++ b/sw/source/core/unocore/unotbl.cxx @@ -968,7 +968,7 @@ uno::Reference<text::XTextCursor> SwXCell::createTextCursor() throw( uno::Runtim SwPosition aPos(*pSttNd); SwXTextCursor* const pXCursor = new SwXTextCursor(*GetDoc(), this, CURSOR_TBLTEXT, aPos); - SwUnoCrsr* const pUnoCrsr = pXCursor->GetCursor(); + auto pUnoCrsr(pXCursor->GetCursor()); pUnoCrsr->Move(fnMoveForward, fnGoNode); return static_cast<text::XWordCursor*>(pXCursor); } diff --git a/sw/source/core/unocore/unotext.cxx b/sw/source/core/unocore/unotext.cxx index 5b4d7b34ac15..e039b52637c9 100644 --- a/sw/source/core/unocore/unotext.cxx +++ b/sw/source/core/unocore/unotext.cxx @@ -1382,7 +1382,7 @@ SwXText::insertTextPortion( OUString sMessage; m_pImpl->m_pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_INSERT, NULL); - SwUnoCrsr *const pCursor = pTextCursor->GetCursor(); + auto pCursor(pTextCursor->GetCursor()); m_pImpl->m_pDoc->DontExpandFormat( *pCursor->Start() ); if (!rText.isEmpty()) @@ -2745,7 +2745,7 @@ SwXHeadFootText::createTextCursor() throw (uno::RuntimeException, std::exception SwPosition aPos(rNode); SwXTextCursor *const pXCursor = new SwXTextCursor(*GetDoc(), this, (m_pImpl->m_bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER, aPos); - SwUnoCrsr *const pUnoCrsr = pXCursor->GetCursor(); + auto pUnoCrsr(pXCursor->GetCursor()); pUnoCrsr->Move(fnMoveForward, fnGoNode); // save current start node to be able to check if there is content diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx index 8a61199b9688..21e932eb5ee0 100644 --- a/sw/source/uibase/uno/unotxdoc.cxx +++ b/sw/source/uibase/uno/unotxdoc.cxx @@ -711,7 +711,7 @@ Reference< util::XReplaceDescriptor > SwXTextDocument::createReplaceDescriptor( return xRet; } -SwUnoCrsr* SwXTextDocument::CreateCursorForSearch(Reference< XTextCursor > & xCrsr) +std::shared_ptr<SwUnoCrsr> SwXTextDocument::CreateCursorForSearch(Reference< XTextCursor > & xCrsr) { getText(); XText *const pText = xBodyText.get(); @@ -719,7 +719,7 @@ SwUnoCrsr* SwXTextDocument::CreateCursorForSearch(Reference< XTextCursor > & xC SwXTextCursor *const pXTextCursor = pBText->CreateTextCursor(true); xCrsr.set( static_cast<text::XWordCursor*>(pXTextCursor) ); - SwUnoCrsr *const pUnoCrsr = pXTextCursor->GetCursor(); + auto pUnoCrsr(pXTextCursor->GetCursor()); pUnoCrsr->SetRemainInSection(false); return pUnoCrsr; } @@ -733,7 +733,7 @@ sal_Int32 SwXTextDocument::replaceAll(const Reference< util::XSearchDescriptor > throw RuntimeException(); Reference< XTextCursor > xCrsr; - SwUnoCrsr* pUnoCrsr = CreateCursorForSearch(xCrsr); + auto pUnoCrsr(CreateCursorForSearch(xCrsr)); const SwXTextSearch* pSearch = reinterpret_cast<const SwXTextSearch*>( xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId())); @@ -808,7 +808,7 @@ Reference< util::XSearchDescriptor > SwXTextDocument::createSearchDescriptor() // Used for findAll/First/Next -SwUnoCrsr* SwXTextDocument::FindAny(const Reference< util::XSearchDescriptor > & xDesc, +std::shared_ptr<SwUnoCrsr> SwXTextDocument::FindAny(const Reference< util::XSearchDescriptor > & xDesc, Reference< XTextCursor > & xCrsr, bool bAll, sal_Int32& nResult, @@ -818,7 +818,7 @@ SwUnoCrsr* SwXTextDocument::FindAny(const Reference< util::XSearchDescriptor > if(!IsValid() || !xDescTunnel.is() || !xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId())) return 0; - SwUnoCrsr* pUnoCrsr = CreateCursorForSearch(xCrsr); + std::shared_ptr<SwUnoCrsr> pUnoCrsr(CreateCursorForSearch(xCrsr)); const SwXTextSearch* pSearch = reinterpret_cast<const SwXTextSearch*>( xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId())); @@ -938,7 +938,7 @@ Reference< XIndexAccess > Reference< XInterface > xTmp; sal_Int32 nResult = 0; Reference< XTextCursor > xCrsr; - boost::scoped_ptr<SwUnoCrsr> pResultCrsr(FindAny(xDesc, xCrsr, true, nResult, xTmp)); + auto pResultCrsr(FindAny(xDesc, xCrsr, true, nResult, xTmp)); if(!pResultCrsr) throw RuntimeException(); Reference< XIndexAccess > xRet; @@ -953,7 +953,7 @@ Reference< XInterface > SwXTextDocument::findFirst(const Reference< util::XSear Reference< XInterface > xTmp; sal_Int32 nResult = 0; Reference< XTextCursor > xCrsr; - SwUnoCrsr* pResultCrsr = FindAny(xDesc, xCrsr, false, nResult, xTmp); + auto pResultCrsr(FindAny(xDesc, xCrsr, false, nResult, xTmp)); if(!pResultCrsr) throw RuntimeException(); Reference< XInterface > xRet; @@ -963,7 +963,6 @@ Reference< XInterface > SwXTextDocument::findFirst(const Reference< util::XSear ::sw::CreateParentXText(*pDocShell->GetDoc(), *pResultCrsr->GetPoint()); xRet = *new SwXTextCursor(xParent, *pResultCrsr); - delete pResultCrsr; } return xRet; } @@ -978,7 +977,7 @@ Reference< XInterface > SwXTextDocument::findNext(const Reference< XInterface > Reference< XTextCursor > xCrsr; if(!xStartAt.is()) throw RuntimeException(); - SwUnoCrsr* pResultCrsr = FindAny(xDesc, xCrsr, false, nResult, xStartAt); + auto pResultCrsr(FindAny(xDesc, xCrsr, false, nResult, xStartAt)); if(!pResultCrsr) throw RuntimeException(); Reference< XInterface > xRet; @@ -989,7 +988,6 @@ Reference< XInterface > SwXTextDocument::findNext(const Reference< XInterface > *pResultCrsr->GetPoint()); xRet = *new SwXTextCursor(xParent, *pResultCrsr); - delete pResultCrsr; } return xRet; } |