summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjoern Michaelsen <bjoern.michaelsen@canonical.com>2015-06-04 22:58:25 +0200
committerBjoern Michaelsen <bjoern.michaelsen@canonical.com>2015-06-09 12:55:00 +0200
commit30f3315d52df22716c086836c41465a6c4cb98b5 (patch)
treea82a7db96ad126dfc430d25802a7822e426e495a
parenta2c467a58ade9f55e0154b2935c747bb283ebd45 (diff)
use UnoCursorPointer in SwXTextCursor
Change-Id: I46d464405d5de6460b10a2965e0c1f011c8142b2
-rw-r--r--sw/inc/unocrsr.hxx25
-rw-r--r--sw/inc/unotextcursor.hxx4
-rw-r--r--sw/inc/unotxdoc.hxx4
-rw-r--r--sw/source/core/unocore/unoobj.cxx87
-rw-r--r--sw/source/uibase/uno/unotxdoc.cxx12
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;
}