summaryrefslogtreecommitdiff
path: root/sw/source/core/unocore/unoobj.cxx
diff options
context:
space:
mode:
authorBjoern Michaelsen <bjoern.michaelsen@canonical.com>2015-05-22 16:42:23 +0200
committerBjoern Michaelsen <bjoern.michaelsen@canonical.com>2015-05-26 00:51:11 +0200
commit50356872b9421303b9c7b4a3135b3cdcc3a0af50 (patch)
treee87d19df1c26853d567516f37f08344f287fbe72 /sw/source/core/unocore/unoobj.cxx
parent96898cd49830333d752b9aa56fe91a8e21c9dca8 (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.cxx71
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());