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 /sw/source/core/unocore/unoobj.cxx | |
parent | 96898cd49830333d752b9aa56fe91a8e21c9dca8 (diff) |
new unocrsrs for SwXTextCursor
Change-Id: I5932f75ee4814ca42f16d349094c7fa8bbb2ee63
Diffstat (limited to 'sw/source/core/unocore/unoobj.cxx')
-rw-r--r-- | sw/source/core/unocore/unoobj.cxx | 71 |
1 files changed, 36 insertions, 35 deletions
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()); |