summaryrefslogtreecommitdiff
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
parent96898cd49830333d752b9aa56fe91a8e21c9dca8 (diff)
new unocrsrs for SwXTextCursor
Change-Id: I5932f75ee4814ca42f16d349094c7fa8bbb2ee63
-rw-r--r--sw/inc/unotextcursor.hxx4
-rw-r--r--sw/inc/unotxdoc.hxx4
-rw-r--r--sw/source/core/unocore/unoftn.cxx2
-rw-r--r--sw/source/core/unocore/unoobj.cxx71
-rw-r--r--sw/source/core/unocore/unoredline.cxx4
-rw-r--r--sw/source/core/unocore/unotbl.cxx2
-rw-r--r--sw/source/core/unocore/unotext.cxx4
-rw-r--r--sw/source/uibase/uno/unotxdoc.cxx18
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;
}