diff options
author | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2015-06-04 22:58:25 +0200 |
---|---|---|
committer | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2015-06-09 12:55:00 +0200 |
commit | 30f3315d52df22716c086836c41465a6c4cb98b5 (patch) | |
tree | a82a7db96ad126dfc430d25802a7822e426e495a | |
parent | a2c467a58ade9f55e0154b2935c747bb283ebd45 (diff) |
use UnoCursorPointer in SwXTextCursor
Change-Id: I46d464405d5de6460b10a2965e0c1f011c8142b2
-rw-r--r-- | sw/inc/unocrsr.hxx | 25 | ||||
-rw-r--r-- | sw/inc/unotextcursor.hxx | 4 | ||||
-rw-r--r-- | sw/inc/unotxdoc.hxx | 4 | ||||
-rw-r--r-- | sw/source/core/unocore/unoobj.cxx | 87 | ||||
-rw-r--r-- | sw/source/uibase/uno/unotxdoc.cxx | 12 |
5 files changed, 46 insertions, 86 deletions
diff --git a/sw/inc/unocrsr.hxx b/sw/inc/unocrsr.hxx index 323607395151..6f382ef8870c 100644 --- a/sw/inc/unocrsr.hxx +++ b/sw/inc/unocrsr.hxx @@ -108,16 +108,17 @@ namespace sw { public: UnoCursorPointer() - : m_pCursor(nullptr) + : m_pCursor(nullptr), m_bSectionRestricted(false) {} - UnoCursorPointer(std::shared_ptr<SwUnoCrsr> pCursor) - : m_pCursor(pCursor) + UnoCursorPointer(std::shared_ptr<SwUnoCrsr> pCursor, bool bSectionRestricted=false) + : m_pCursor(pCursor), m_bSectionRestricted(bSectionRestricted) { m_pCursor->Add(this); } - UnoCursorPointer(const UnoCursorPointer& pOther) + UnoCursorPointer(const UnoCursorPointer& rOther) : SwClient(nullptr) - , m_pCursor(pOther.m_pCursor) + , m_pCursor(rOther.m_pCursor) + , m_bSectionRestricted(rOther.m_bSectionRestricted) { if(m_pCursor) m_pCursor->Add(this); @@ -130,8 +131,17 @@ namespace sw virtual void SwClientNotify(const SwModify& rModify, const SfxHint& rHint) SAL_OVERRIDE { SwClient::SwClientNotify(rModify, rHint); - if(m_pCursor && typeid(rHint) == typeid(sw::DocDisposingHint)) - m_pCursor->Remove(this); + if(m_pCursor) + { + if(typeid(rHint) == typeid(DocDisposingHint)) + m_pCursor->Remove(this); + else if(m_bSectionRestricted && typeid(rHint) == typeid(LegacyModifyHint)) + { + const auto pLegacyHint = static_cast<const LegacyModifyHint*>(&rHint); + if(pLegacyHint->m_pOld && pLegacyHint->m_pOld->Which() == RES_UNOCURSOR_LEAVES_SECTION) + m_pCursor->Remove(this); + } + } if(!GetRegisteredIn()) m_pCursor.reset(); }; @@ -158,6 +168,7 @@ namespace sw } private: std::shared_ptr<SwUnoCrsr> m_pCursor; + const bool m_bSectionRestricted; }; } #endif diff --git a/sw/inc/unotextcursor.hxx b/sw/inc/unotextcursor.hxx index c86b07254cc8..b54bca4cecd4 100644 --- a/sw/inc/unotextcursor.hxx +++ b/sw/inc/unotextcursor.hxx @@ -91,9 +91,7 @@ public: SwPaM const& rSourceCursor, const enum CursorType eType = CURSOR_ALL); - std::shared_ptr<SwUnoCrsr> GetCursor(); - //const SwUnoCrsr* GetConstCursor() const; - + SwUnoCrsr* GetCursor(); bool IsAtEndOfMeta() const; void DeleteAndInsert(OUString const& rText, diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx index c3a2f67c5f15..0f7a44674869 100644 --- a/sw/inc/unotxdoc.hxx +++ b/sw/inc/unotxdoc.hxx @@ -432,8 +432,8 @@ public: void InitNewDoc(); - 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, + SwUnoCrsr* CreateCursorForSearch(css::uno::Reference< css::text::XTextCursor > & xCrsr); + 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/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx index af25437f0584..ab03d80a9fef 100644 --- a/sw/source/core/unocore/unoobj.cxx +++ b/sw/source/core/unocore/unoobj.cxx @@ -654,14 +654,13 @@ SwUnoCursorHelper::GetCurTextFormatColl(SwPaM & rPaM, const bool bConditional) } class SwXTextCursor::Impl - : public SwClient { public: const SfxItemPropertySet & m_rPropSet; const enum CursorType m_eType; const uno::Reference< text::XText > m_xParentText; - std::shared_ptr<SwUnoCrsr> m_pUnoCursor; + sw::UnoCursorPointer m_pUnoCursor; Impl( SwDoc & rDoc, const enum CursorType eType, @@ -670,84 +669,36 @@ public: : m_rPropSet(*aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_CURSOR)) , m_eType(eType) , m_xParentText(xParent) - , m_pUnoCursor(rDoc.CreateUnoCrsr(rPoint, false)) + , m_pUnoCursor(rDoc.CreateUnoCrsr(rPoint, false), true) { - m_pUnoCursor->Add(this); if (pMark) { - GetCursor()->SetMark(); - *GetCursor()->GetMark() = *pMark; + m_pUnoCursor->SetMark(); + *m_pUnoCursor->GetMark() = *pMark; } } - virtual ~Impl() - { - Invalidate(); - } - std::shared_ptr<SwUnoCrsr> GetCursor() { - return m_pUnoCursor; - } SwUnoCrsr& GetCursorOrThrow() { if(!m_pUnoCursor) throw uno::RuntimeException("SwXTextCursor: disposed or invalid", 0); - return *m_pUnoCursor.get(); - } - - void Invalidate() { - if(m_pUnoCursor) - { - if(GetRegisteredIn() == m_pUnoCursor.get()) - m_pUnoCursor->Remove(this); - m_pUnoCursor.reset(); - } + return *m_pUnoCursor; } -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 the cursor leaves its designated section, it becomes invalid - if (((pOld != NULL) && (pOld->Which() == RES_UNOCURSOR_LEAVES_SECTION))) - Invalidate(); -} - -void SwXTextCursor::Impl::SwClientNotify(const SwModify& rModify, const SfxHint& rHint) -{ - SwClient::SwClientNotify(rModify, rHint); - if(m_pUnoCursor && typeid(rHint) == typeid(sw::DocDisposingHint)) - { - Invalidate(); - } -} - -std::shared_ptr<SwUnoCrsr> SwXTextCursor::GetCursor() -{ - return m_pImpl->GetCursor(); -} +SwUnoCrsr*SwXTextCursor::GetCursor() + { return &(*m_pImpl->m_pUnoCursor); } SwPaM const* SwXTextCursor::GetPaM() const -{ - return m_pImpl->GetCursor().get(); -} + { return &(*m_pImpl->m_pUnoCursor); } -SwPaM * SwXTextCursor::GetPaM() -{ - return m_pImpl->GetCursor().get(); -} +SwPaM* SwXTextCursor::GetPaM() + { return &(*m_pImpl->m_pUnoCursor); } SwDoc const* SwXTextCursor::GetDoc() const -{ - return m_pImpl->GetCursor() ? m_pImpl->GetCursor()->GetDoc() : 0; -} + { return m_pImpl->m_pUnoCursor ? m_pImpl->m_pUnoCursor->GetDoc() : nullptr; } -SwDoc * SwXTextCursor::GetDoc() -{ - return m_pImpl->GetCursor() ? m_pImpl->GetCursor()->GetDoc() : 0; -} +SwDoc* SwXTextCursor::GetDoc() + { return m_pImpl->m_pUnoCursor ? m_pImpl->m_pUnoCursor->GetDoc() : nullptr; } SwXTextCursor::SwXTextCursor( SwDoc & rDoc, @@ -774,7 +725,7 @@ SwXTextCursor::~SwXTextCursor() void SwXTextCursor::DeleteAndInsert(const OUString& rText, const bool bForceExpandHints) { - auto pUnoCrsr = m_pImpl->GetCursor(); + auto pUnoCrsr = static_cast<SwCursor*>(&(*m_pImpl->m_pUnoCursor)); if(pUnoCrsr) { // Start/EndAction @@ -782,7 +733,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.get(); + auto pCurrent = static_cast<SwCursor*>(pUnoCrsr); do { if (pCurrent->HasMark()) @@ -801,8 +752,8 @@ void SwXTextCursor::DeleteAndInsert(const OUString& rText, pCurrent->Left(rText.getLength(), CRSR_SKIP_CHARS, false, false); } - pCurrent = static_cast<SwCursor *>(pCurrent->GetNext()); - } while (pCurrent != pUnoCrsr.get()); + pCurrent = static_cast<SwCursor*>(pCurrent->GetNext()); + } while (pCurrent != pUnoCrsr); pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_INSERT, NULL); } } @@ -857,7 +808,7 @@ bool SwXTextCursor::IsAtEndOfMeta() const { if (CURSOR_META == m_pImpl->m_eType) { - auto pCursor( m_pImpl->GetCursor() ); + auto pCursor( m_pImpl->m_pUnoCursor ); SwXMeta const*const pXMeta( dynamic_cast<SwXMeta*>(m_pImpl->m_xParentText.get()) ); OSL_ENSURE(pXMeta, "no meta?"); @@ -971,7 +922,7 @@ sal_Bool SAL_CALL SwXTextCursor::isCollapsed() throw (uno::RuntimeException, std SolarMutexGuard aGuard; bool bRet = true; - auto pUnoCrsr(m_pImpl->GetCursor()); + auto pUnoCrsr(m_pImpl->m_pUnoCursor); if(pUnoCrsr && pUnoCrsr->GetMark()) { bRet = (*pUnoCrsr->GetPoint() == *pUnoCrsr->GetMark()); diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx index e0e89c50a8d4..5b73f62e9f46 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; } -std::shared_ptr<SwUnoCrsr> SwXTextDocument::CreateCursorForSearch(Reference< XTextCursor > & xCrsr) +SwUnoCrsr* SwXTextDocument::CreateCursorForSearch(Reference< XTextCursor > & xCrsr) { getText(); XText *const pText = xBodyText.get(); @@ -808,7 +808,7 @@ Reference< util::XSearchDescriptor > SwXTextDocument::createSearchDescriptor() // Used for findAll/First/Next -std::shared_ptr<SwUnoCrsr> SwXTextDocument::FindAny(const Reference< util::XSearchDescriptor > & xDesc, +SwUnoCrsr* SwXTextDocument::FindAny(const Reference< util::XSearchDescriptor > & xDesc, Reference< XTextCursor > & xCrsr, bool bAll, sal_Int32& nResult, @@ -816,9 +816,9 @@ std::shared_ptr<SwUnoCrsr> SwXTextDocument::FindAny(const Reference< util::XSea { Reference< XUnoTunnel > xDescTunnel(xDesc, UNO_QUERY); if(!IsValid() || !xDescTunnel.is() || !xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId())) - return 0; + return nullptr; - std::shared_ptr<SwUnoCrsr> pUnoCrsr(CreateCursorForSearch(xCrsr)); + auto pUnoCrsr(CreateCursorForSearch(xCrsr)); const SwXTextSearch* pSearch = reinterpret_cast<const SwXTextSearch*>( xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId())); @@ -847,7 +847,7 @@ std::shared_ptr<SwUnoCrsr> SwXTextDocument::FindAny(const Reference< util::XSea SwXTextRange::getUnoTunnelId())); } if(!pRange) - return 0; + return nullptr; pRange->GetPositions(*pUnoCrsr); if(pUnoCrsr->HasMark()) { @@ -942,7 +942,7 @@ Reference< XIndexAccess > if(!pResultCrsr) throw RuntimeException(); Reference< XIndexAccess > xRet; - xRet = SwXTextRanges::Create( (nResult) ? pResultCrsr.get() : nullptr ); + xRet = SwXTextRanges::Create( (nResult) ? &(*pResultCrsr) : nullptr ); return xRet; } |