[Libreoffice-commits] core.git: 29 commits - sw/inc sw/qa sw/source

Bjoern Michaelsen bjoern.michaelsen at canonical.com
Mon May 25 15:52:35 PDT 2015


 sw/inc/doc.hxx                                          |    7 
 sw/inc/docary.hxx                                       |    6 
 sw/inc/unochart.hxx                                     |    7 
 sw/inc/unocrsr.hxx                                      |   13 +
 sw/inc/unoparagraph.hxx                                 |    2 
 sw/inc/unotbl.hxx                                       |   14 -
 sw/inc/unotextcursor.hxx                                |    4 
 sw/inc/unotxdoc.hxx                                     |    4 
 sw/qa/core/macros-test.cxx                              |    2 
 sw/source/core/access/accpara.cxx                       |    5 
 sw/source/core/attr/calbck.cxx                          |    1 
 sw/source/core/attr/format.cxx                          |    1 
 sw/source/core/doc/CntntIdxStore.cxx                    |   13 -
 sw/source/core/doc/DocumentContentOperationsManager.cxx |    2 
 sw/source/core/doc/doc.cxx                              |   12 -
 sw/source/core/doc/doccorr.cxx                          |   32 +--
 sw/source/core/doc/docnew.cxx                           |   11 +
 sw/source/core/inc/unoport.hxx                          |    5 
 sw/source/core/unocore/unochart.cxx                     |   89 ++++-----
 sw/source/core/unocore/unocrsr.cxx                      |   43 +---
 sw/source/core/unocore/unoframe.cxx                     |   16 -
 sw/source/core/unocore/unoftn.cxx                       |    9 -
 sw/source/core/unocore/unoobj.cxx                       |   81 ++++-----
 sw/source/core/unocore/unoobj2.cxx                      |   81 ++++++---
 sw/source/core/unocore/unoparagraph.cxx                 |    3 
 sw/source/core/unocore/unoport.cxx                      |   26 +-
 sw/source/core/unocore/unoportenum.cxx                  |   34 ++-
 sw/source/core/unocore/unoredline.cxx                   |   24 +-
 sw/source/core/unocore/unotbl.cxx                       |  144 +++++++---------
 sw/source/core/unocore/unotext.cxx                      |   18 --
 sw/source/filter/ww8/ww8par.cxx                         |    6 
 sw/source/filter/ww8/ww8par.hxx                         |    1 
 sw/source/uibase/inc/navmgr.hxx                         |    9 -
 sw/source/uibase/shells/grfsh.cxx                       |    2 
 sw/source/uibase/uno/unotxdoc.cxx                       |   18 --
 sw/source/uibase/wrtsh/navmgr.cxx                       |   37 ++--
 36 files changed, 397 insertions(+), 385 deletions(-)

New commits:
commit 692c886f937c525d6bfcb541917a5114b085efa9
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat May 23 13:25:12 2015 +0200

    remove the weak_ptrs on destruction too
    
    Change-Id: I65f5867c41417539a70eef15754988d9931394a4

diff --git a/sw/source/core/unocore/unocrsr.cxx b/sw/source/core/unocore/unocrsr.cxx
index 3d3c1d1..88c627e 100644
--- a/sw/source/core/unocore/unocrsr.cxx
+++ b/sw/source/core/unocore/unocrsr.cxx
@@ -23,6 +23,7 @@
 #include <swtable.hxx>
 #include <docary.hxx>
 #include <rootfrm.hxx>
+#include <calbck.hxx>
 
 IMPL_FIXEDMEMPOOL_NEWDEL( SwUnoCrsr )
 
@@ -39,7 +40,13 @@ SwUnoCrsr::~SwUnoCrsr()
     SwDoc* pDoc = GetDoc();
     if( !pDoc->IsInDtor() )
     {
-        //assert(!SwIterator<SwClient,SwUnoCrsr>(this).First());
+#ifdef DBG_UTIL
+        SwIterator<SwClient, SwUnoCrsr> pClient(*this);
+        assert(!pClient.First());
+#endif
+        // remove the weak_ptr the document keeps to notify about document death
+        pDoc->mvUnoCrsrTbl.remove_if(
+            [this](const std::weak_ptr<SwUnoCrsr>& pWeakPtr) -> bool { return pWeakPtr.lock().get() == this; });
     }
 
     // delete the whole ring
commit 1ef03cad1ac3d593b4ac361ef582b3fd4fc96677
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat May 23 12:44:07 2015 +0200

    now rename the new CreateUnoCrsr2 to CreateUnoCrsr, as the old stuff is gone
    
    Change-Id: I82f8ed0560750d4f7bec71ea8bd3c8089b884da7

diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index 51ee53a..656ebb5 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -1490,7 +1490,7 @@ public:
     void SetOLEObjModified();
 
     // Uno - Interfaces
-    std::shared_ptr<SwUnoCrsr> CreateUnoCrsr2( const SwPosition& rPos, bool bTableCrsr = false );
+    std::shared_ptr<SwUnoCrsr> CreateUnoCrsr( const SwPosition& rPos, bool bTableCrsr = false );
 
     // FeShell - Interfaces
     // !!! These assume always an existing layout !!!
@@ -1664,7 +1664,7 @@ public:
     void dumpAsXml(struct _xmlTextWriter* = 0) const;
 
     std::set<Color> GetDocColors();
-    std::list< std::weak_ptr<SwUnoCrsr> > mvUnoCrsrTbl2;
+    std::list< std::weak_ptr<SwUnoCrsr> > mvUnoCrsrTbl;
 
 private:
     // Copies master header to left / first one, if necessary - used by ChgPageDesc().
diff --git a/sw/qa/core/macros-test.cxx b/sw/qa/core/macros-test.cxx
index fde13f4..4887199 100644
--- a/sw/qa/core/macros-test.cxx
+++ b/sw/qa/core/macros-test.cxx
@@ -440,7 +440,7 @@ void SwMacrosTest::testFindReplace()
     SwDoc *const pDoc = pTextDoc->GetDocShell()->GetDoc();
     SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1);
     // use a UnoCrsr so it will be corrected when deleting nodes
-    auto pPaM(pDoc->CreateUnoCrsr2(SwPosition(aIdx), false));
+    auto pPaM(pDoc->CreateUnoCrsr(SwPosition(aIdx), false));
 
     IDocumentContentOperations & rIDCO(pDoc->getIDocumentContentOperations());
     rIDCO.InsertString(*pPaM, OUString("foo"));
diff --git a/sw/source/core/access/accpara.cxx b/sw/source/core/access/accpara.cxx
index 8296c0f..efda517 100644
--- a/sw/source/core/access/accpara.cxx
+++ b/sw/source/core/access/accpara.cxx
@@ -640,7 +640,7 @@ SwXTextPortion* SwAccessibleParagraph::CreateUnoPortion(
     SwTextNode* pTextNode = const_cast<SwTextNode*>( GetTextNode() );
     SwIndex aIndex( pTextNode, nStart );
     SwPosition aStartPos( *pTextNode, aIndex );
-    auto pUnoCursor(pTextNode->GetDoc()->CreateUnoCrsr2( aStartPos ));
+    auto pUnoCursor(pTextNode->GetDoc()->CreateUnoCrsr( aStartPos ));
     pUnoCursor->SetMark();
     pUnoCursor->GetMark()->nContent = nEnd;
 
diff --git a/sw/source/core/doc/CntntIdxStore.cxx b/sw/source/core/doc/CntntIdxStore.cxx
index 70ec055..ef7bab4 100644
--- a/sw/source/core/doc/CntntIdxStore.cxx
+++ b/sw/source/core/doc/CntntIdxStore.cxx
@@ -379,7 +379,7 @@ void ContentIdxStoreImpl::RestoreFlys(SwDoc* pDoc, updater_t& rUpdater, bool bAu
 
 void ContentIdxStoreImpl::SaveUnoCrsrs(SwDoc* pDoc, sal_uLong nNode, sal_Int32 nContent)
 {
-    for (auto pWeakUnoCrsr : pDoc->mvUnoCrsrTbl2)
+    for (auto pWeakUnoCrsr : pDoc->mvUnoCrsrTbl)
     {
         auto pUnoCrsr(pWeakUnoCrsr.lock());
         if(!pUnoCrsr)
diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx
index 9b78238..bdf56b5 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -4091,7 +4091,7 @@ bool DocumentContentOperationsManager::CopyImpl( SwPaM& rPam, SwPosition& rPos,
     SwUndoCpyDoc* pUndo = 0;
     // lcl_DeleteRedlines may delete the start or end node of the cursor when
     // removing the redlines so use cursor that is corrected by PaMCorrAbs
-    std::shared_ptr<SwUnoCrsr> const pCopyPam(pDoc->CreateUnoCrsr2(rPos));
+    std::shared_ptr<SwUnoCrsr> const pCopyPam(pDoc->CreateUnoCrsr(rPos));
 
     SwTableNumFormatMerge aTNFM( m_rDoc, *pDoc );
 
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx
index 89ae7bc..a25a641 100644
--- a/sw/source/core/doc/doc.cxx
+++ b/sw/source/core/doc/doc.cxx
@@ -1679,7 +1679,7 @@ bool SwDoc::ContainsHiddenChars() const
     return false;
 }
 
-std::shared_ptr<SwUnoCrsr> SwDoc::CreateUnoCrsr2( const SwPosition& rPos, bool bTblCrsr )
+std::shared_ptr<SwUnoCrsr> SwDoc::CreateUnoCrsr( const SwPosition& rPos, bool bTblCrsr )
 {
     std::shared_ptr<SwUnoCrsr> pNew;
     if( bTblCrsr )
@@ -1687,7 +1687,7 @@ std::shared_ptr<SwUnoCrsr> SwDoc::CreateUnoCrsr2( const SwPosition& rPos, bool b
     else
         pNew.reset(new SwUnoCrsr( rPos ));
 
-    mvUnoCrsrTbl2.push_back( pNew );
+    mvUnoCrsrTbl.push_back( pNew );
     return pNew;
 }
 
diff --git a/sw/source/core/doc/doccorr.cxx b/sw/source/core/doc/doccorr.cxx
index 49a98f2..323e475 100644
--- a/sw/source/core/doc/doccorr.cxx
+++ b/sw/source/core/doc/doccorr.cxx
@@ -121,7 +121,7 @@ void PaMCorrAbs( const SwPaM& rRange,
         }
     }
     {
-        for(auto pWeakUnoCrsr : pDoc->mvUnoCrsrTbl2)
+        for(auto pWeakUnoCrsr : pDoc->mvUnoCrsrTbl)
         {
             auto pUnoCursor(pWeakUnoCrsr.lock());
             if(!pUnoCursor)
@@ -275,7 +275,7 @@ void PaMCorrRel( const SwNodeIndex &rOldNode,
        }
     }
     {
-        for(auto pWeakUnoCrsr : pDoc->mvUnoCrsrTbl2)
+        for(auto pWeakUnoCrsr : pDoc->mvUnoCrsrTbl)
         {
             auto pUnoCrsr(pWeakUnoCrsr.lock());
             if(!pUnoCrsr)
diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx
index f546d87..ec44cb5 100644
--- a/sw/source/core/doc/docnew.cxx
+++ b/sw/source/core/doc/docnew.cxx
@@ -424,7 +424,7 @@ SwDoc::~SwDoc()
     getIDocumentRedlineAccess().GetExtraRedlineTable().DeleteAndDestroyAll();
 
     const sw::DocDisposingHint aHint;
-    std::vector< std::weak_ptr<SwUnoCrsr> > vCursorsToKill(mvUnoCrsrTbl2.begin(), mvUnoCrsrTbl2.end());
+    std::vector< std::weak_ptr<SwUnoCrsr> > vCursorsToKill(mvUnoCrsrTbl.begin(), mvUnoCrsrTbl.end());
     for(auto& pWeakCursor : vCursorsToKill)
     {
         auto pCursor(pWeakCursor.lock());
diff --git a/sw/source/core/unocore/unochart.cxx b/sw/source/core/unocore/unochart.cxx
index 399db4b..969fdbc 100644
--- a/sw/source/core/unocore/unochart.cxx
+++ b/sw/source/core/unocore/unochart.cxx
@@ -412,7 +412,7 @@ static void GetFormatAndCreateCursorFromRangeRep(
                 SwPosition aPos(*pSttNd);
 
                 // set cursor to top left box of range
-                auto pUnoCrsr = pTableFormat->GetDoc()->CreateUnoCrsr2(aPos, true);
+                auto pUnoCrsr = pTableFormat->GetDoc()->CreateUnoCrsr(aPos, true);
                 pUnoCrsr->Move( fnMoveForward, fnGoNode );
                 pUnoCrsr->SetRemainInSection( false );
 
diff --git a/sw/source/core/unocore/unocrsr.cxx b/sw/source/core/unocore/unocrsr.cxx
index 0a534c6..3d3c1d1 100644
--- a/sw/source/core/unocore/unocrsr.cxx
+++ b/sw/source/core/unocore/unocrsr.cxx
@@ -53,7 +53,7 @@ SwUnoCrsr::~SwUnoCrsr()
 
 std::shared_ptr<SwUnoCrsr> SwUnoTableCrsr::Clone() const
 {
-    auto pNewCrsr(GetDoc()->CreateUnoCrsr2(*GetPoint(), true));
+    auto pNewCrsr(GetDoc()->CreateUnoCrsr(*GetPoint(), true));
     if(HasMark())
     {
         pNewCrsr->SetMark();
diff --git a/sw/source/core/unocore/unoframe.cxx b/sw/source/core/unocore/unoframe.cxx
index 9ab7f70..4ad4ef8 100644
--- a/sw/source/core/unocore/unoframe.cxx
+++ b/sw/source/core/unocore/unoframe.cxx
@@ -3289,7 +3289,7 @@ uno::Reference< container::XEnumeration >  SwXTextFrame::createEnumeration() thr
     if(!pFormat)
         return nullptr;
     SwPosition aPos(pFormat->GetContent().GetContentIdx()->GetNode());
-    auto pUnoCursor(GetDoc()->CreateUnoCrsr2(aPos, false));
+    auto pUnoCursor(GetDoc()->CreateUnoCrsr(aPos, false));
     pUnoCursor->Move(fnMoveForward, fnGoNode);
     return new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_FRAME);
 }
diff --git a/sw/source/core/unocore/unoftn.cxx b/sw/source/core/unocore/unoftn.cxx
index e83b81c..12b4c4f 100644
--- a/sw/source/core/unocore/unoftn.cxx
+++ b/sw/source/core/unocore/unoftn.cxx
@@ -478,7 +478,7 @@ SwXFootnote::createEnumeration() throw (uno::RuntimeException, std::exception)
 
     SwTextFootnote const*const pTextFootnote = rFormat.GetTextFootnote();
     SwPosition aPos( *pTextFootnote->GetStartNode() );
-    auto pUnoCursor(GetDoc()->CreateUnoCrsr2(aPos, false));
+    auto pUnoCursor(GetDoc()->CreateUnoCrsr(aPos, false));
     pUnoCursor->Move(fnMoveForward, fnGoNode);
     return new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_FOOTNOTE);
 }
diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx
index f35d0d2..726e3c9 100644
--- a/sw/source/core/unocore/unoobj.cxx
+++ b/sw/source/core/unocore/unoobj.cxx
@@ -670,7 +670,7 @@ public:
         : m_rPropSet(*aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_CURSOR))
         , m_eType(eType)
         , m_xParentText(xParent)
-        , m_pUnoCursor(rDoc.CreateUnoCrsr2(rPoint, false))
+        , m_pUnoCursor(rDoc.CreateUnoCrsr(rPoint, false))
     {
         m_pUnoCursor->Add(this);
         if (pMark)
@@ -2050,7 +2050,7 @@ lcl_SelectParaAndReset( SwPaM &rPaM, SwDoc & rDoc,
     // if we are reseting paragraph attributes, we need to select the full paragraph first
     SwPosition aStart = *rPaM.Start();
     SwPosition aEnd = *rPaM.End();
-    auto pTemp ( rDoc.CreateUnoCrsr2(aStart, false) );
+    auto pTemp ( rDoc.CreateUnoCrsr(aStart, false) );
     if(!SwUnoCursorHelper::IsStartOfPara(*pTemp))
     {
         pTemp->MovePara(fnParaCurr, fnParaStart);
@@ -3017,7 +3017,7 @@ SwXTextCursor::createEnumeration() throw (uno::RuntimeException, std::exception)
         throw uno::RuntimeException();
     }
 
-    auto pNewCrsr(rUnoCursor.GetDoc()->CreateUnoCrsr2(*rUnoCursor.GetPoint()) );
+    auto pNewCrsr(rUnoCursor.GetDoc()->CreateUnoCrsr(*rUnoCursor.GetPoint()) );
     if (rUnoCursor.HasMark())
     {
         pNewCrsr->SetMark();
diff --git a/sw/source/core/unocore/unoobj2.cxx b/sw/source/core/unocore/unoobj2.cxx
index e558ae8..aa4ecaa 100644
--- a/sw/source/core/unocore/unoobj2.cxx
+++ b/sw/source/core/unocore/unoobj2.cxx
@@ -601,7 +601,7 @@ throw (container::NoSuchElementException, lang::WrappedTargetException,
          (CURSOR_SELECTION_IN_TABLE == m_eCursorType)))
     {
         SwPosition* pStart = pUnoCrsr->Start();
-        auto aNewCrsr(pUnoCrsr->GetDoc()->CreateUnoCrsr2(*pStart, false));
+        auto aNewCrsr(pUnoCrsr->GetDoc()->CreateUnoCrsr(*pStart, false));
         // one may also go into tables here
         if ((CURSOR_TBLTEXT != m_eCursorType) &&
             (CURSOR_SELECTION_IN_TABLE != m_eCursorType))
@@ -1146,7 +1146,7 @@ SwXTextRange::CreateXTextRange(
 {
     const uno::Reference<text::XText> xParentText(
             ::sw::CreateParentXText(rDoc, rPos));
-    const auto pNewCrsr(rDoc.CreateUnoCrsr2(rPos, false));
+    const auto pNewCrsr(rDoc.CreateUnoCrsr(rPos, false));
     if(pMark)
     {
         pNewCrsr->SetMark();
@@ -1280,7 +1280,7 @@ throw (uno::RuntimeException, std::exception)
         throw uno::RuntimeException();
     }
     const SwPosition aPos(GetDoc()->GetNodes().GetEndOfContent());
-    const auto pNewCrsr(m_pImpl->m_rDoc.CreateUnoCrsr2(aPos, false));
+    const auto pNewCrsr(m_pImpl->m_rDoc.CreateUnoCrsr(aPos, false));
     if (!GetPositions(*pNewCrsr))
     {
         throw uno::RuntimeException();
@@ -1301,7 +1301,7 @@ SwXTextRange::createEnumeration() throw (uno::RuntimeException, std::exception)
         throw uno::RuntimeException();
     }
     const SwPosition aPos(GetDoc()->GetNodes().GetEndOfContent());
-    auto pNewCrsr(m_pImpl->m_rDoc.CreateUnoCrsr2(aPos, false));
+    auto pNewCrsr(m_pImpl->m_rDoc.CreateUnoCrsr(aPos, false));
     if (!GetPositions(*pNewCrsr))
     {
         throw uno::RuntimeException();
@@ -1513,7 +1513,7 @@ public:
     {
         if (pPaM)
         {
-            m_pUnoCursor = pPaM->GetDoc()->CreateUnoCrsr2(*pPaM->GetPoint());
+            m_pUnoCursor = pPaM->GetDoc()->CreateUnoCrsr(*pPaM->GetPoint());
             m_pUnoCursor->Add(this);
             ::sw::DeepCopyPaM(*pPaM, *GetCursor());
         }
@@ -1701,7 +1701,7 @@ public:
     ::std::shared_ptr<SwUnoCrsr> m_pUnoCursor;
 
     Impl(SwPaM const & rPaM)
-        : m_pUnoCursor(rPaM.GetDoc()->CreateUnoCrsr2(*rPaM.GetPoint(), false))
+        : m_pUnoCursor(rPaM.GetDoc()->CreateUnoCrsr(*rPaM.GetPoint(), false))
     {
         m_pUnoCursor->Add(this);
         if (rPaM.HasMark())
diff --git a/sw/source/core/unocore/unoparagraph.cxx b/sw/source/core/unocore/unoparagraph.cxx
index 7c038e6..a745110 100644
--- a/sw/source/core/unocore/unoparagraph.cxx
+++ b/sw/source/core/unocore/unoparagraph.cxx
@@ -1181,7 +1181,7 @@ throw (beans::UnknownPropertyException, uno::RuntimeException, std::exception)
             // to paragraph boundaries
             SwPosition aStart( *aCursor.Start() );
             SwPosition aEnd  ( *aCursor.End()   );
-            auto pTemp( aCursor.GetDoc()->CreateUnoCrsr2(aStart, false) );
+            auto pTemp( aCursor.GetDoc()->CreateUnoCrsr(aStart, false) );
             if(!SwUnoCursorHelper::IsStartOfPara(*pTemp))
             {
                 pTemp->MovePara(fnParaCurr, fnParaStart);
diff --git a/sw/source/core/unocore/unoport.cxx b/sw/source/core/unocore/unoport.cxx
index 0a0f138..3ffb5cd 100644
--- a/sw/source/core/unocore/unoport.cxx
+++ b/sw/source/core/unocore/unoport.cxx
@@ -63,7 +63,7 @@ public:
 
 void SwXTextPortion::init(const SwUnoCrsr* pPortionCursor)
 {
-    m_pUnoCursor = pPortionCursor->GetDoc()->CreateUnoCrsr2(*pPortionCursor->GetPoint());
+    m_pUnoCursor = pPortionCursor->GetDoc()->CreateUnoCrsr(*pPortionCursor->GetPoint());
     if (pPortionCursor->HasMark())
     {
         m_pUnoCursor->SetMark();
diff --git a/sw/source/core/unocore/unoportenum.cxx b/sw/source/core/unocore/unoportenum.cxx
index 02fe76f..8b578ff 100644
--- a/sw/source/core/unocore/unoportenum.cxx
+++ b/sw/source/core/unocore/unoportenum.cxx
@@ -363,7 +363,7 @@ SwXTextPortionEnumeration::SwXTextPortionEnumeration(
         const sal_Int32 nEnd )
     : m_Portions()
 {
-    m_pUnoCrsr = rParaCrsr.GetDoc()->CreateUnoCrsr2(*rParaCrsr.GetPoint(), false);
+    m_pUnoCrsr = rParaCrsr.GetDoc()->CreateUnoCrsr(*rParaCrsr.GetPoint(), false);
     m_pUnoCrsr->Add(this);
 
     OSL_ENSURE(nEnd == -1 || (nStart <= nEnd &&
@@ -381,7 +381,7 @@ SwXTextPortionEnumeration::SwXTextPortionEnumeration(
         TextRangeList_t const & rPortions )
     : m_Portions( rPortions )
 {
-    m_pUnoCrsr = rParaCrsr.GetDoc()->CreateUnoCrsr2(*rParaCrsr.GetPoint(), false);
+    m_pUnoCrsr = rParaCrsr.GetDoc()->CreateUnoCrsr(*rParaCrsr.GetPoint(), false);
     m_pUnoCrsr->Add(this);
 }
 
diff --git a/sw/source/core/unocore/unoredline.cxx b/sw/source/core/unocore/unoredline.cxx
index 95fc457..2183994 100644
--- a/sw/source/core/unocore/unoredline.cxx
+++ b/sw/source/core/unocore/unoredline.cxx
@@ -161,7 +161,7 @@ uno::Reference<container::XEnumeration> SwXRedlineText::createEnumeration()
     SolarMutexGuard aGuard;
     SwPaM aPam(aNodeIndex);
     aPam.Move(fnMoveForward, fnGoNode);
-    auto pUnoCursor(GetDoc()->CreateUnoCrsr2(*aPam.Start(), false));
+    auto pUnoCursor(GetDoc()->CreateUnoCrsr(*aPam.Start(), false));
     return new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_REDLINE);
 }
 
@@ -538,7 +538,7 @@ uno::Reference< container::XEnumeration >  SwXRedline::createEnumeration() throw
         return nullptr;
     SwPaM aPam(*pNodeIndex);
     aPam.Move(fnMoveForward, fnGoNode);
-    auto pUnoCursor(GetDoc()->CreateUnoCrsr2(*aPam.Start(), false));
+    auto pUnoCursor(GetDoc()->CreateUnoCrsr(*aPam.Start(), false));
     return new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_REDLINE);
 }
 
diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx
index 845afcf..c698cd2 100644
--- a/sw/source/core/unocore/unotbl.cxx
+++ b/sw/source/core/unocore/unotbl.cxx
@@ -1112,7 +1112,7 @@ uno::Reference<container::XEnumeration> SwXCell::createEnumeration() throw( uno:
         return uno::Reference<container::XEnumeration>();
     const SwStartNode* pSttNd = pBox->GetSttNd();
     SwPosition aPos(*pSttNd);
-    auto pUnoCursor(GetDoc()->CreateUnoCrsr2(aPos, false));
+    auto pUnoCursor(GetDoc()->CreateUnoCrsr(aPos, false));
     pUnoCursor->Move(fnMoveForward, fnGoNode);
     // remember table and start node for later travelling
     // (used in export of tables in tables)
@@ -1417,7 +1417,7 @@ SwXTextTableCursor::SwXTextTableCursor(SwFrameFormat* pFormat, SwTableBox* pBox)
     SwDoc* pDoc = pFormat->GetDoc();
     const SwStartNode* pSttNd = pBox->GetSttNd();
     SwPosition aPos(*pSttNd);
-    m_pUnoCrsr = pDoc->CreateUnoCrsr2(aPos, true);
+    m_pUnoCrsr = pDoc->CreateUnoCrsr(aPos, true);
     m_pUnoCrsr->Move( fnMoveForward, fnGoNode );
     m_pUnoCrsr->Add(&aCrsrDepend);
     SwUnoTableCrsr& rTableCrsr = dynamic_cast<SwUnoTableCrsr&>(*m_pUnoCrsr.get());
@@ -1429,7 +1429,7 @@ SwXTextTableCursor::SwXTextTableCursor(SwFrameFormat& rTableFormat, const SwTabl
     aCrsrDepend(this, 0),
     m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_TABLE_CURSOR))
 {
-    m_pUnoCrsr = pTableSelection->GetDoc()->CreateUnoCrsr2(*pTableSelection->GetPoint(), true);
+    m_pUnoCrsr = pTableSelection->GetDoc()->CreateUnoCrsr(*pTableSelection->GetPoint(), true);
     if(pTableSelection->HasMark())
     {
         m_pUnoCrsr->SetMark();
@@ -2202,7 +2202,7 @@ uno::Reference<table::XCellRange>  SwXTextTable::GetRangeByName(SwFrameFormat* p
     const SwStartNode* pSttNd = pTLBox->GetSttNd();
     SwPosition aPos(*pSttNd);
     // set cursor to the upper-left cell of the range
-    auto pUnoCrsr(pFormat->GetDoc()->CreateUnoCrsr2(aPos, true));
+    auto pUnoCrsr(pFormat->GetDoc()->CreateUnoCrsr(aPos, true));
     pUnoCrsr->Move(fnMoveForward, fnGoNode);
     pUnoCrsr->SetRemainInSection(false);
     const SwTableBox* pBRBox(pTable->GetTableBox(rBRName));
@@ -2579,7 +2579,7 @@ void SwXTextTable::setPropertyValue(const OUString& rPropertyName, const uno::An
                     const SwStartNode* pSttNd = pTLBox->GetSttNd();
                     SwPosition aPos(*pSttNd);
                     // set cursor to top left cell
-                    auto pUnoCrsr(pDoc->CreateUnoCrsr2(aPos, true));
+                    auto pUnoCrsr(pDoc->CreateUnoCrsr(aPos, true));
                     pUnoCrsr->Move( fnMoveForward, fnGoNode );
                     pUnoCrsr->SetRemainInSection( false );
 
@@ -2768,7 +2768,7 @@ uno::Any SwXTextTable::getPropertyValue(const OUString& rPropertyName)
                     const SwStartNode* pSttNd = pTLBox->GetSttNd();
                     SwPosition aPos(*pSttNd);
                     // set cursor to top left cell
-                    auto pUnoCrsr(pDoc->CreateUnoCrsr2(aPos, true));
+                    auto pUnoCrsr(pDoc->CreateUnoCrsr(aPos, true));
                     pUnoCrsr->Move( fnMoveForward, fnGoNode );
                     pUnoCrsr->SetRemainInSection( false );
 
@@ -3219,7 +3219,7 @@ uno::Reference< table::XCellRange >  SwXCellRange::getCellRangeByPosition(
                 const SwStartNode* pSttNd = pTLBox->GetSttNd();
                 SwPosition aPos(*pSttNd);
                 // set cursor in the upper-left cell of the range
-                auto pUnoCrsr(pFormat->GetDoc()->CreateUnoCrsr2(aPos, true));
+                auto pUnoCrsr(pFormat->GetDoc()->CreateUnoCrsr(aPos, true));
                 pUnoCrsr->Move( fnMoveForward, fnGoNode );
                 pUnoCrsr->SetRemainInSection( false );
                 const SwTableBox* pBRBox = pTable->GetTableBox( sBRName );
@@ -3994,7 +3994,7 @@ void SwXTableRows::insertByIndex(sal_Int32 nIndex, sal_Int32 nCount)
     SwPosition aPos(*pSttNd);
     // set cursor to the upper-left cell of the range
     UnoActionContext aAction(pFrameFormat->GetDoc());
-    auto pUnoCrsr(pFrameFormat->GetDoc()->CreateUnoCrsr2(aPos, true));
+    auto pUnoCrsr(pFrameFormat->GetDoc()->CreateUnoCrsr(aPos, true));
     pUnoCrsr->Move( fnMoveForward, fnGoNode );
     {
         // remove actions
@@ -4024,7 +4024,7 @@ void SwXTableRows::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount)
     const SwStartNode* pSttNd = pTLBox->GetSttNd();
     SwPosition aPos(*pSttNd);
     // set cursor to the upper-left cell of the range
-    auto pUnoCrsr(pFrameFormat->GetDoc()->CreateUnoCrsr2(aPos, true));
+    auto pUnoCrsr(pFrameFormat->GetDoc()->CreateUnoCrsr(aPos, true));
     pUnoCrsr->Move(fnMoveForward, fnGoNode);
     pUnoCrsr->SetRemainInSection( false );
     const OUString sBLName = sw_GetCellName(0, nIndex + nCount - 1);
@@ -4132,7 +4132,7 @@ void SwXTableColumns::insertByIndex(sal_Int32 nIndex, sal_Int32 nCount)
     const SwStartNode* pSttNd = pTLBox->GetSttNd();
     SwPosition aPos(*pSttNd);
     UnoActionContext aAction(pFrameFormat->GetDoc());
-    auto pUnoCrsr(pFrameFormat->GetDoc()->CreateUnoCrsr2(aPos, true));
+    auto pUnoCrsr(pFrameFormat->GetDoc()->CreateUnoCrsr(aPos, true));
     pUnoCrsr->Move(fnMoveForward, fnGoNode);
 
     {
@@ -4165,7 +4165,7 @@ void SwXTableColumns::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount)
     const SwStartNode* pSttNd = pTLBox->GetSttNd();
     SwPosition aPos(*pSttNd);
     // set cursor to the upper-left cell of the range
-    auto pUnoCrsr(pFrameFormat->GetDoc()->CreateUnoCrsr2(aPos, true));
+    auto pUnoCrsr(pFrameFormat->GetDoc()->CreateUnoCrsr(aPos, true));
     pUnoCrsr->Move(fnMoveForward, fnGoNode);
     pUnoCrsr->SetRemainInSection(false);
     const OUString sTRName = sw_GetCellName(nIndex + nCount - 1, 0);
diff --git a/sw/source/core/unocore/unotext.cxx b/sw/source/core/unocore/unotext.cxx
index e039b52..5f08022 100644
--- a/sw/source/core/unocore/unotext.cxx
+++ b/sw/source/core/unocore/unotext.cxx
@@ -2564,7 +2564,7 @@ throw (uno::RuntimeException, std::exception)
 
     SwNode& rNode = GetDoc()->GetNodes().GetEndOfContent();
     SwPosition aPos(rNode);
-    auto pUnoCursor(GetDoc()->CreateUnoCrsr2(aPos, false));
+    auto pUnoCursor(GetDoc()->CreateUnoCrsr(aPos, false));
     pUnoCursor->Move(fnMoveBackward, fnGoDoc);
     return new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_BODY);
 }
@@ -2826,7 +2826,7 @@ throw (uno::RuntimeException, std::exception)
     const SwFormatContent& rFlyContent = rHeadFootFormat.GetContent();
     const SwNode& rNode = rFlyContent.GetContentIdx()->GetNode();
     SwPosition aPos(rNode);
-    auto pUnoCursor(GetDoc()->CreateUnoCrsr2(aPos, false));
+    auto pUnoCursor(GetDoc()->CreateUnoCrsr(aPos, false));
     pUnoCursor->Move(fnMoveForward, fnGoNode);
     return new SwXParagraphEnumeration(this, pUnoCursor,
                 (m_pImpl->m_bIsHeader) ? CURSOR_HEADER : CURSOR_FOOTER);
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index 8df50e7..b4121b0 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -4900,7 +4900,7 @@ sal_uLong SwWW8ImplReader::CoreLoad(WW8Glossary *pGloss, const SwPosition &rPos)
             pDocShell->SetReadOnlyUI(true);
     }
 
-    mpCrsr = m_rDoc.CreateUnoCrsr2(rPos);
+    mpCrsr = m_rDoc.CreateUnoCrsr(rPos);
     m_pPaM = mpCrsr.get();
 
     m_pCtrlStck = new SwWW8FltControlStack( &m_rDoc, m_nFieldFlags, *this );
diff --git a/sw/source/uibase/shells/grfsh.cxx b/sw/source/uibase/shells/grfsh.cxx
index 93fafb9..5504911 100644
--- a/sw/source/uibase/shells/grfsh.cxx
+++ b/sw/source/uibase/shells/grfsh.cxx
@@ -91,7 +91,7 @@ public:
     SwExternalToolEdit(SwWrtShell *const pShell)
         : m_pShell(pShell)
         , m_pCursor( // need only Point, must point to SwGrfNode
-            pShell->GetDoc()->CreateUnoCrsr2(
+            pShell->GetDoc()->CreateUnoCrsr(
                 *pShell->GetCurrentShellCursor().GetPoint()))
     {
     }
diff --git a/sw/source/uibase/wrtsh/navmgr.cxx b/sw/source/uibase/wrtsh/navmgr.cxx
index d843e37..6740fa5 100644
--- a/sw/source/uibase/wrtsh/navmgr.cxx
+++ b/sw/source/uibase/wrtsh/navmgr.cxx
@@ -162,7 +162,7 @@ bool SwNavigationMgr::addEntry(const SwPosition& rPos) {
 
         if (*m_entries.back()->GetPoint() != rPos)
         {
-            std::shared_ptr<SwUnoCrsr> pCursor(m_rMyShell.GetDoc()->CreateUnoCrsr2(rPos));
+            std::shared_ptr<SwUnoCrsr> pCursor(m_rMyShell.GetDoc()->CreateUnoCrsr(rPos));
             m_entries.push_back(pCursor);
             pCursor->Add(this);
         }
@@ -170,7 +170,7 @@ bool SwNavigationMgr::addEntry(const SwPosition& rPos) {
     }
     else {
         if ( (!m_entries.empty() && *m_entries.back()->GetPoint() != rPos) || m_entries.empty() ) {
-            auto pCursor(m_rMyShell.GetDoc()->CreateUnoCrsr2(rPos));
+            auto pCursor(m_rMyShell.GetDoc()->CreateUnoCrsr(rPos));
             m_entries.push_back(pCursor);
             pCursor->Add(this);
             bRet = true;
commit 0509dbec0e3c9e9c64f5b487f5197ca4602838cc
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat May 23 12:01:03 2015 +0200

    remove SaneOwnership distinction
    
    Change-Id: I0639a960916ffa30d7eaf865755e407f706e9f13

diff --git a/sw/inc/unocrsr.hxx b/sw/inc/unocrsr.hxx
index e091cc0..bfc8ebc 100644
--- a/sw/inc/unocrsr.hxx
+++ b/sw/inc/unocrsr.hxx
@@ -40,7 +40,6 @@ private:
 public:
     SwUnoCrsr( const SwPosition &rPos, SwPaM* pRing = 0 );
     virtual ~SwUnoCrsr();
-    bool m_bSaneOwnership;
 
 protected:
 
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx
index 995aad9..89ae7bc 100644
--- a/sw/source/core/doc/doc.cxx
+++ b/sw/source/core/doc/doc.cxx
@@ -1687,7 +1687,6 @@ std::shared_ptr<SwUnoCrsr> SwDoc::CreateUnoCrsr2( const SwPosition& rPos, bool b
     else
         pNew.reset(new SwUnoCrsr( rPos ));
 
-    pNew->m_bSaneOwnership = true;
     mvUnoCrsrTbl2.push_back( pNew );
     return pNew;
 }
diff --git a/sw/source/core/unocore/unocrsr.cxx b/sw/source/core/unocore/unocrsr.cxx
index df918f4..0a534c6 100644
--- a/sw/source/core/unocore/unocrsr.cxx
+++ b/sw/source/core/unocore/unocrsr.cxx
@@ -32,7 +32,6 @@ SwUnoCrsr::SwUnoCrsr( const SwPosition &rPos, SwPaM* pRing )
     , m_bRemainInSection(true)
     , m_bSkipOverHiddenSections(false)
     , m_bSkipOverProtectSections(false)
-    , m_bSaneOwnership(false)
 {}
 
 SwUnoCrsr::~SwUnoCrsr()
@@ -40,10 +39,7 @@ SwUnoCrsr::~SwUnoCrsr()
     SwDoc* pDoc = GetDoc();
     if( !pDoc->IsInDtor() )
     {
-        if(m_bSaneOwnership)
-        {
-            //assert(!SwIterator<SwClient,SwUnoCrsr>(this).First());
-        }
+        //assert(!SwIterator<SwClient,SwUnoCrsr>(this).First());
     }
 
     // delete the whole ring
@@ -57,7 +53,6 @@ SwUnoCrsr::~SwUnoCrsr()
 
 std::shared_ptr<SwUnoCrsr> SwUnoTableCrsr::Clone() const
 {
-    assert(m_bSaneOwnership);
     auto pNewCrsr(GetDoc()->CreateUnoCrsr2(*GetPoint(), true));
     if(HasMark())
     {
diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx
index b6cb124..f35d0d2 100644
--- a/sw/source/core/unocore/unoobj.cxx
+++ b/sw/source/core/unocore/unoobj.cxx
@@ -720,7 +720,6 @@ void SwXTextCursor::Impl::SwClientNotify(const SwModify& rModify, const SfxHint&
     SwClient::SwClientNotify(rModify, rHint);
     if(m_pUnoCursor && typeid(rHint) == typeid(sw::DocDisposingHint))
     {
-        assert(m_pUnoCursor->m_bSaneOwnership);
         Invalidate();
     }
 }
diff --git a/sw/source/core/unocore/unoobj2.cxx b/sw/source/core/unocore/unoobj2.cxx
index c4b9b1f..e558ae8 100644
--- a/sw/source/core/unocore/unoobj2.cxx
+++ b/sw/source/core/unocore/unoobj2.cxx
@@ -486,13 +486,11 @@ protected:
 
 void SwXParagraphEnumeration::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew)
 {
-    assert(m_pCrsr->m_bSaneOwnership);
     ClientModify(this, pOld, pNew);
 }
 
 void SwXParagraphEnumeration::Impl::SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
 {
-    assert(m_pCrsr->m_bSaneOwnership);
     SwClient::SwClientNotify(rModify, rHint);
     if(m_pCrsr && typeid(rHint) == typeid(sw::DocDisposingHint))
     {
@@ -1550,7 +1548,6 @@ void SwXTextRanges::Impl::SwClientNotify(const SwModify& rModify, const SfxHint&
     SwClient::SwClientNotify(rModify, rHint);
     if(m_pUnoCursor && typeid(rHint) == typeid(sw::DocDisposingHint))
     {
-        assert(m_pUnoCursor->m_bSaneOwnership);
         m_pUnoCursor->Remove(this);
         m_pUnoCursor.reset();
     }
@@ -1757,7 +1754,6 @@ void SwXParaFrameEnumeration::Impl::SwClientNotify(const SwModify& rModify, cons
     SwClient::SwClientNotify(rModify, rHint);
     if(m_pUnoCursor && typeid(rHint) == typeid(sw::DocDisposingHint))
     {
-        assert(m_pUnoCursor->m_bSaneOwnership);
         m_pUnoCursor->Remove(this);
         m_pUnoCursor.reset();
     }
diff --git a/sw/source/core/unocore/unoport.cxx b/sw/source/core/unocore/unoport.cxx
index 502a9dd..0a0f138 100644
--- a/sw/source/core/unocore/unoport.cxx
+++ b/sw/source/core/unocore/unoport.cxx
@@ -931,7 +931,6 @@ void SwXTextPortion::SwClientNotify(const SwModify& rModify, const SfxHint& rHin
     SwClient::SwClientNotify(rModify, rHint);
     if(m_pUnoCursor && typeid(rHint) == typeid(sw::DocDisposingHint))
     {
-        assert(m_pUnoCursor->m_bSaneOwnership);
         m_pUnoCursor->Remove(this);
         m_pUnoCursor.reset();
     }
diff --git a/sw/source/core/unocore/unoportenum.cxx b/sw/source/core/unocore/unoportenum.cxx
index b33b1fe..02fe76f 100644
--- a/sw/source/core/unocore/unoportenum.cxx
+++ b/sw/source/core/unocore/unoportenum.cxx
@@ -1411,7 +1411,6 @@ void SwXTextPortionEnumeration::SwClientNotify(const SwModify& rModify, const Sf
     SwClient::SwClientNotify(rModify, rHint);
     if(!GetRegisteredIn() || typeid(rHint) == typeid(sw::DocDisposingHint))
     {
-        assert(m_pUnoCrsr->m_bSaneOwnership);
         m_pUnoCrsr->Remove(this);
         m_pUnoCrsr.reset();
     }
diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx
index c317ee0..845afcf 100644
--- a/sw/source/core/unocore/unotbl.cxx
+++ b/sw/source/core/unocore/unotbl.cxx
@@ -1744,7 +1744,6 @@ void SwXTextTableCursor::SwClientNotify(const SwModify& rModify, const SfxHint&
     SwClient::SwClientNotify(rModify, rHint);
     if(m_pUnoCrsr && typeid(rHint) == typeid(sw::DocDisposingHint))
     {
-        assert(m_pUnoCrsr->m_bSaneOwnership);
         m_pUnoCrsr->Remove(&aCrsrDepend);
         m_pUnoCrsr.reset();
     }
@@ -3150,7 +3149,6 @@ SwXCellRange::SwXCellRange(std::shared_ptr<SwUnoCrsr> pCrsr, SwFrameFormat& rFra
     , m_bFirstRowAsLabel(false)
     , m_bFirstColumnAsLabel(false)
 {
-    assert(m_pTableCrsr->m_bSaneOwnership);
     m_pTableCrsr->Add(&aCursorDepend);
     aRgDesc.Normalize();
 }
commit b23eb203cc696926c748cc81584dff38050224cd
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat May 23 11:49:33 2015 +0200

    remove old SwUnoCrsrTbl and CreateUnoCrsr
    
    Change-Id: I91e4c7f0e0231b7783affdce63c6ab395a4e219b

diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index 0346079..51ee53a 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -145,7 +145,6 @@ class SwTextFormatColl;
 class SwTextFormatColls;
 class SwURLStateChanged;
 class SwUnoCrsr;
-class SwUnoCrsrTable;
 class SwViewShell;
 class _SetGetExpField;
 class SwDrawContact;
@@ -333,8 +332,6 @@ class SW_DLLPUBLIC SwDoc :
     // Hash map to find numrules by name
     mutable std::unordered_map<OUString, SwNumRule *, OUStringHash> maNumRuleMap;
 
-    SwUnoCrsrTable    *mpUnoCrsrTable;
-
     SwPagePreviewPrtData *mpPgPViewPrtData;  //< Indenting / spacing for printing of page view.
     SwPaM           *mpExtInputRing;
 
@@ -1493,8 +1490,6 @@ public:
     void SetOLEObjModified();
 
     // Uno - Interfaces
-    const SwUnoCrsrTable& GetUnoCrsrTable() const       { return *mpUnoCrsrTable; }
-    SwUnoCrsr* CreateUnoCrsr( const SwPosition& rPos, bool bTableCrsr = false );
     std::shared_ptr<SwUnoCrsr> CreateUnoCrsr2( const SwPosition& rPos, bool bTableCrsr = false );
 
     // FeShell - Interfaces
diff --git a/sw/inc/docary.hxx b/sw/inc/docary.hxx
index 2d2871f..5544dab 100644
--- a/sw/inc/docary.hxx
+++ b/sw/inc/docary.hxx
@@ -262,12 +262,6 @@ public:
     bool DeleteTableCellRedline( SwDoc* pDoc, const SwTableBox& rTableBox, bool bSaveInUndo, sal_uInt16 nRedlineTypeToDelete );
 };
 
-class SwUnoCrsrTable : public std::set<SwUnoCrsr*> {
-public:
-    /// the destructor will free all objects still in the set
-    ~SwUnoCrsrTable();
-};
-
 typedef std::vector<SwOLENode*> SwOLENodes;
 
 #endif // INCLUDED_SW_INC_DOCARY_HXX
diff --git a/sw/source/core/doc/CntntIdxStore.cxx b/sw/source/core/doc/CntntIdxStore.cxx
index b9dc0e5..70ec055 100644
--- a/sw/source/core/doc/CntntIdxStore.cxx
+++ b/sw/source/core/doc/CntntIdxStore.cxx
@@ -379,21 +379,6 @@ void ContentIdxStoreImpl::RestoreFlys(SwDoc* pDoc, updater_t& rUpdater, bool bAu
 
 void ContentIdxStoreImpl::SaveUnoCrsrs(SwDoc* pDoc, sal_uLong nNode, sal_Int32 nContent)
 {
-    for (const SwUnoCrsr* pUnoCrsr : pDoc->GetUnoCrsrTable())
-    {
-        for(SwPaM& rPaM : (const_cast<SwUnoCrsr*>(pUnoCrsr))->GetRingContainer())
-        {
-            lcl_ChkPaMBoth( m_aUnoCrsrEntries, nNode, nContent, rPaM);
-        }
-        const SwUnoTableCrsr* pUnoTableCrsr = dynamic_cast<const SwUnoTableCrsr*>(pUnoCrsr);
-        if( pUnoTableCrsr )
-        {
-            for(SwPaM& rPaM : (&(const_cast<SwUnoTableCrsr*>(pUnoTableCrsr))->GetSelRing())->GetRingContainer())
-            {
-                lcl_ChkPaMBoth( m_aUnoCrsrEntries, nNode, nContent, rPaM);
-            }
-        }
-    }
     for (auto pWeakUnoCrsr : pDoc->mvUnoCrsrTbl2)
     {
         auto pUnoCrsr(pWeakUnoCrsr.lock());
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx
index 454ea0a..995aad9 100644
--- a/sw/source/core/doc/doc.cxx
+++ b/sw/source/core/doc/doc.cxx
@@ -1679,17 +1679,6 @@ bool SwDoc::ContainsHiddenChars() const
     return false;
 }
 
-SwUnoCrsr* SwDoc::CreateUnoCrsr( const SwPosition& rPos, bool bTableCrsr )
-{
-    SwUnoCrsr* pNew;
-    if( bTableCrsr )
-        pNew = new SwUnoTableCrsr( rPos );
-    else
-        pNew = new SwUnoCrsr( rPos );
-
-    mpUnoCrsrTable->insert( pNew );
-    return pNew;
-}
 std::shared_ptr<SwUnoCrsr> SwDoc::CreateUnoCrsr2( const SwPosition& rPos, bool bTblCrsr )
 {
     std::shared_ptr<SwUnoCrsr> pNew;
diff --git a/sw/source/core/doc/doccorr.cxx b/sw/source/core/doc/doccorr.cxx
index 7f75cd4..49a98f2 100644
--- a/sw/source/core/doc/doccorr.cxx
+++ b/sw/source/core/doc/doccorr.cxx
@@ -121,47 +121,6 @@ void PaMCorrAbs( const SwPaM& rRange,
         }
     }
     {
-        SwUnoCrsrTable& rTable = const_cast<SwUnoCrsrTable&>(pDoc->GetUnoCrsrTable());
-
-        for( SwUnoCrsrTable::iterator it = rTable.begin(); it != rTable.end(); ++it )
-        {
-            SwUnoCrsr *const pUnoCursor = *it;
-
-            bool bChange = false; // has the UNO cursor been corrected?
-
-            // determine whether the UNO cursor will leave it's designated
-            // section
-            bool const bLeaveSection =
-                pUnoCursor->IsRemainInSection() &&
-                ( lcl_FindUnoCrsrSection( aNewPos.nNode.GetNode() ) !=
-                  lcl_FindUnoCrsrSection(
-                      pUnoCursor->GetPoint()->nNode.GetNode() ) );
-
-            for(SwPaM& rPaM : pUnoCursor->GetRingContainer())
-            {
-                bChange |= lcl_PaMCorrAbs( rPaM, aStart, aEnd, aNewPos );
-            }
-
-            SwUnoTableCrsr *const pUnoTableCrsr =
-                dynamic_cast<SwUnoTableCrsr *>(*it);
-            if( pUnoTableCrsr )
-            {
-                for(SwPaM& rPaM : (&pUnoTableCrsr->GetSelRing())->GetRingContainer())
-                {
-                    bChange |=
-                        lcl_PaMCorrAbs( rPaM, aStart, aEnd, aNewPos );
-                }
-            }
-
-            // if a UNO cursor leaves its designated section, we must inform
-            // (and invalidate) said cursor
-            if (bChange && bLeaveSection)
-            {
-                // the UNO cursor has left its section. We need to notify it!
-                SwMsgPoolItem aHint( RES_UNOCURSOR_LEAVES_SECTION );
-                pUnoCursor->ModifyNotification( &aHint, NULL );
-            }
-        }
         for(auto pWeakUnoCrsr : pDoc->mvUnoCrsrTbl2)
         {
             auto pUnoCursor(pWeakUnoCrsr.lock());
@@ -316,24 +275,6 @@ void PaMCorrRel( const SwNodeIndex &rOldNode,
        }
     }
     {
-        SwUnoCrsrTable& rTable = (SwUnoCrsrTable&)pDoc->GetUnoCrsrTable();
-        for( SwUnoCrsrTable::iterator it = rTable.begin(); it != rTable.end(); ++it )
-        {
-            for(SwPaM& rPaM : (*it)->GetRingContainer())
-            {
-                lcl_PaMCorrRel1( &rPaM, pOldNode, aNewPos, nCntIdx );
-            }
-
-            SwUnoTableCrsr* pUnoTableCrsr =
-                dynamic_cast<SwUnoTableCrsr*>(*it);
-            if( pUnoTableCrsr )
-            {
-                for(SwPaM& rPaM : (&pUnoTableCrsr->GetSelRing())->GetRingContainer())
-                {
-                    lcl_PaMCorrRel1( &rPaM, pOldNode, aNewPos, nCntIdx );
-                }
-            }
-        }
         for(auto pWeakUnoCrsr : pDoc->mvUnoCrsrTbl2)
         {
             auto pUnoCrsr(pWeakUnoCrsr.lock());
diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx
index 379f844..f546d87 100644
--- a/sw/source/core/doc/docnew.cxx
+++ b/sw/source/core/doc/docnew.cxx
@@ -250,7 +250,6 @@ SwDoc::SwDoc()
     mpURLStateChgd( 0 ),
     mpNumberFormatter( 0 ),
     mpNumRuleTable( new SwNumRuleTable ),
-    mpUnoCrsrTable( new SwUnoCrsrTable() ),
     mpPgPViewPrtData( 0 ),
     mpExtInputRing( 0 ),
     mpStyleAccess( 0 ),
@@ -424,7 +423,6 @@ SwDoc::~SwDoc()
     getIDocumentRedlineAccess().GetRedlineTable().DeleteAndDestroyAll();
     getIDocumentRedlineAccess().GetExtraRedlineTable().DeleteAndDestroyAll();
 
-    delete mpUnoCrsrTable;
     const sw::DocDisposingHint aHint;
     std::vector< std::weak_ptr<SwUnoCrsr> > vCursorsToKill(mvUnoCrsrTbl2.begin(), mvUnoCrsrTbl2.end());
     for(auto& pWeakCursor : vCursorsToKill)
diff --git a/sw/source/core/unocore/unocrsr.cxx b/sw/source/core/unocore/unocrsr.cxx
index bfdb692..df918f4 100644
--- a/sw/source/core/unocore/unocrsr.cxx
+++ b/sw/source/core/unocore/unocrsr.cxx
@@ -44,15 +44,6 @@ SwUnoCrsr::~SwUnoCrsr()
         {
             //assert(!SwIterator<SwClient,SwUnoCrsr>(this).First());
         }
-        else
-        {
-            // then remove cursor from array
-            SwUnoCrsrTable& rTable = (SwUnoCrsrTable&)pDoc->GetUnoCrsrTable();
-            if( !rTable.erase( this ) )
-            {
-                OSL_ENSURE( false, "UNO Cursor nicht mehr im Array" );
-            }
-        }
     }
 
     // delete the whole ring
@@ -238,13 +229,4 @@ void SwUnoTableCrsr::MakeBoxSels()
     }
 }
 
-SwUnoCrsrTable::~SwUnoCrsrTable()
-{
-    while (!empty())
-    {
-        delete *begin();
-        erase( begin() );
-    }
-}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 6ab4c4f9c7b12c6058b08e44d35eb8b386348c55
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat May 23 11:20:17 2015 +0200

    use new unocrsrs for SwXParaFrameEnumeration
    
    Change-Id: I0b02b32b0852cc97d4ffcbafdd0405da64b2a9af

diff --git a/sw/source/core/unocore/unoobj2.cxx b/sw/source/core/unocore/unoobj2.cxx
index a6b238e..c4b9b1f 100644
--- a/sw/source/core/unocore/unoobj2.cxx
+++ b/sw/source/core/unocore/unoobj2.cxx
@@ -1701,10 +1701,12 @@ public:
     // created by hasMoreElements
     uno::Reference< text::XTextContent > m_xNextObject;
     FrameDependList_t m_Frames;
+    ::std::shared_ptr<SwUnoCrsr> m_pUnoCursor;
 
     Impl(SwPaM const & rPaM)
-        : SwClient(rPaM.GetDoc()->CreateUnoCrsr(*rPaM.GetPoint(), false))
+        : m_pUnoCursor(rPaM.GetDoc()->CreateUnoCrsr2(*rPaM.GetPoint(), false))
     {
+        m_pUnoCursor->Add(this);
         if (rPaM.HasMark())
         {
             GetCursor()->SetMark();
@@ -1714,7 +1716,6 @@ public:
 
     virtual ~Impl() {
         // Impl owns the cursor; delete it here: SolarMutex is locked
-        delete GetRegisteredIn();
     }
 
     SwUnoCrsr * GetCursor() {
@@ -1725,6 +1726,7 @@ public:
 protected:
     // SwClient
     virtual void Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew) SAL_OVERRIDE;
+    virtual void SwClientNotify(const SwModify& rModify, const SfxHint& rHint) SAL_OVERRIDE;
 };
 
 struct InvalidFrameDepend {
@@ -1750,6 +1752,17 @@ void SwXParaFrameEnumeration::Impl::Modify( const SfxPoolItem *pOld, const SfxPo
     }
 }
 
+void SwXParaFrameEnumeration::Impl::SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
+{
+    SwClient::SwClientNotify(rModify, rHint);
+    if(m_pUnoCursor && typeid(rHint) == typeid(sw::DocDisposingHint))
+    {
+        assert(m_pUnoCursor->m_bSaneOwnership);
+        m_pUnoCursor->Remove(this);
+        m_pUnoCursor.reset();
+    }
+}
+
 static bool
 lcl_CreateNextObject(SwUnoCrsr& i_rUnoCrsr,
         uno::Reference<text::XTextContent> & o_rNextObject,
commit 9a949b9c404def205dc39f2f6068a67993c051ad
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat May 23 11:19:37 2015 +0200

    use new unocrsrs for SwXTextRanges
    
    Change-Id: Id338cfff7bf266878f1287aa964f5e2674428e24

diff --git a/sw/source/core/unocore/unoobj2.cxx b/sw/source/core/unocore/unoobj2.cxx
index ce3c3e4..a6b238e 100644
--- a/sw/source/core/unocore/unoobj2.cxx
+++ b/sw/source/core/unocore/unoobj2.cxx
@@ -1509,22 +1509,22 @@ class SwXTextRanges::Impl
 {
 public:
     ::std::vector< uno::Reference< text::XTextRange > > m_Ranges;
+    std::shared_ptr<SwUnoCrsr> m_pUnoCursor;
 
     Impl(SwPaM *const pPaM)
-        : SwClient( (pPaM)
-            ? pPaM->GetDoc()->CreateUnoCrsr(*pPaM->GetPoint())
-            : 0 )
     {
         if (pPaM)
         {
+            m_pUnoCursor = pPaM->GetDoc()->CreateUnoCrsr2(*pPaM->GetPoint());
+            m_pUnoCursor->Add(this);
             ::sw::DeepCopyPaM(*pPaM, *GetCursor());
         }
         MakeRanges();
     }
 
     virtual ~Impl() {
-        // Impl owns the cursor; delete it here: SolarMutex is locked
-        delete GetRegisteredIn();
+        if(m_pUnoCursor)
+            m_pUnoCursor->Remove(this);
     }
 
     SwUnoCrsr * GetCursor() {
@@ -1537,6 +1537,7 @@ public:
 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 SwXTextRanges::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew)
@@ -1544,6 +1545,17 @@ void SwXTextRanges::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pN
     ClientModify(this, pOld, pNew);
 }
 
+void SwXTextRanges::Impl::SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
+{
+    SwClient::SwClientNotify(rModify, rHint);
+    if(m_pUnoCursor && typeid(rHint) == typeid(sw::DocDisposingHint))
+    {
+        assert(m_pUnoCursor->m_bSaneOwnership);
+        m_pUnoCursor->Remove(this);
+        m_pUnoCursor.reset();
+    }
+}
+
 void SwXTextRanges::Impl::MakeRanges()
 {
     if (GetCursor())
commit 2d80fe10a8d59eca45bd8d1ec551fc58398779f9
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat May 23 11:12:23 2015 +0200

    use new unocrsrs
    
    Change-Id: I7d355e23209e94ce76961e15b6c77214a18edb4e

diff --git a/sw/source/core/unocore/unoobj2.cxx b/sw/source/core/unocore/unoobj2.cxx
index 3064ca6..ce3c3e4 100644
--- a/sw/source/core/unocore/unoobj2.cxx
+++ b/sw/source/core/unocore/unoobj2.cxx
@@ -603,8 +603,7 @@ throw (container::NoSuchElementException, lang::WrappedTargetException,
          (CURSOR_SELECTION_IN_TABLE == m_eCursorType)))
     {
         SwPosition* pStart = pUnoCrsr->Start();
-        const ::std::unique_ptr<SwUnoCrsr> aNewCrsr(
-            pUnoCrsr->GetDoc()->CreateUnoCrsr(*pStart, false) );
+        auto aNewCrsr(pUnoCrsr->GetDoc()->CreateUnoCrsr2(*pStart, false));
         // one may also go into tables here
         if ((CURSOR_TBLTEXT != m_eCursorType) &&
             (CURSOR_SELECTION_IN_TABLE != m_eCursorType))
@@ -1149,8 +1148,7 @@ SwXTextRange::CreateXTextRange(
 {
     const uno::Reference<text::XText> xParentText(
             ::sw::CreateParentXText(rDoc, rPos));
-    const ::std::unique_ptr<SwUnoCrsr> pNewCrsr(
-            rDoc.CreateUnoCrsr(rPos, false));
+    const auto pNewCrsr(rDoc.CreateUnoCrsr2(rPos, false));
     if(pMark)
     {
         pNewCrsr->SetMark();
@@ -1284,8 +1282,7 @@ throw (uno::RuntimeException, std::exception)
         throw uno::RuntimeException();
     }
     const SwPosition aPos(GetDoc()->GetNodes().GetEndOfContent());
-    const ::std::unique_ptr<SwUnoCrsr> pNewCrsr(
-            m_pImpl->m_rDoc.CreateUnoCrsr(aPos, false));
+    const auto pNewCrsr(m_pImpl->m_rDoc.CreateUnoCrsr2(aPos, false));
     if (!GetPositions(*pNewCrsr))
     {
         throw uno::RuntimeException();
commit 9ebb551c85909952f8837c174c0e10400170df49
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Fri May 22 17:42:53 2015 +0200

    new unocrsrs for SwXTextPortion
    
    Change-Id: If2cb4ca0b650e0f5188350763e4b5bbbb4a0dbb8

diff --git a/sw/source/core/inc/unoport.hxx b/sw/source/core/inc/unoport.hxx
index 46a275a..4e66097 100644
--- a/sw/source/core/inc/unoport.hxx
+++ b/sw/source/core/inc/unoport.hxx
@@ -114,6 +114,7 @@ private:
     ::std::unique_ptr< ::com::sun::star::uno::Any > m_pRubyStyle;
     ::std::unique_ptr< ::com::sun::star::uno::Any > m_pRubyAdjust;
     ::std::unique_ptr< ::com::sun::star::uno::Any > m_pRubyIsAbove;
+    std::shared_ptr<SwUnoCrsr> m_pUnoCursor;
 
     const SwDepend              m_FrameDepend;
     SwFrameFormat *                  m_pFrameFormat;
@@ -150,6 +151,8 @@ protected:
 
     //SwClient
     virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) SAL_OVERRIDE;
+    virtual void SwClientNotify(const SwModify& rModify, const SfxHint& rHint) SAL_OVERRIDE;
+
 
 public:
     SwXTextPortion(const SwUnoCrsr* pPortionCrsr, ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > const& rParent, SwTextPortionType   eType   );
diff --git a/sw/source/core/unocore/unoport.cxx b/sw/source/core/unocore/unoport.cxx
index 54db643..502a9dd 100644
--- a/sw/source/core/unocore/unoport.cxx
+++ b/sw/source/core/unocore/unoport.cxx
@@ -63,14 +63,13 @@ public:
 
 void SwXTextPortion::init(const SwUnoCrsr* pPortionCursor)
 {
-    SwUnoCrsr* pUnoCursor =
-        pPortionCursor->GetDoc()->CreateUnoCrsr(*pPortionCursor->GetPoint());
+    m_pUnoCursor = pPortionCursor->GetDoc()->CreateUnoCrsr2(*pPortionCursor->GetPoint());
     if (pPortionCursor->HasMark())
     {
-        pUnoCursor->SetMark();
-        *pUnoCursor->GetMark() = *pPortionCursor->GetMark();
+        m_pUnoCursor->SetMark();
+        *m_pUnoCursor->GetMark() = *pPortionCursor->GetMark();
     }
-    pUnoCursor->Add(this);
+    m_pUnoCursor->Add(this);
 }
 
 SwXTextPortion::SwXTextPortion(
@@ -138,12 +137,7 @@ SwXTextPortion::SwXTextPortion(
     }
 }
 
-SwXTextPortion::~SwXTextPortion()
-{
-    SolarMutexGuard aGuard;
-    SwUnoCrsr* pUnoCrsr = GetCursor();
-    delete pUnoCrsr;
-}
+SwXTextPortion::~SwXTextPortion() {};
 
 uno::Reference< text::XText >  SwXTextPortion::getText()
 throw( uno::RuntimeException, std::exception )
@@ -932,4 +926,15 @@ void SwXTextPortion::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
     }
 }
 
+void SwXTextPortion::SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
+{
+    SwClient::SwClientNotify(rModify, rHint);
+    if(m_pUnoCursor && typeid(rHint) == typeid(sw::DocDisposingHint))
+    {
+        assert(m_pUnoCursor->m_bSaneOwnership);
+        m_pUnoCursor->Remove(this);
+        m_pUnoCursor.reset();
+    }
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 50356872b9421303b9c7b4a3135b3cdcc3a0af50
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Fri May 22 16:42:23 2015 +0200

    new unocrsrs for SwXTextCursor
    
    Change-Id: I5932f75ee4814ca42f16d349094c7fa8bbb2ee63

diff --git a/sw/inc/unotextcursor.hxx b/sw/inc/unotextcursor.hxx
index 8cfc15e..c86b072 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 90e7f02..c3a2f67 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 c291523..e83b81c 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 ce0254b..b6cb124 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 a4254de..95fc457 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 7db370f..c317ee0 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 5b4d7b3..e039b52 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 8a61199..21e932e 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;
 }
commit 96898cd49830333d752b9aa56fe91a8e21c9dca8
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Thu May 21 15:31:32 2015 +0200

    new unocrsrs for SwXTextPortionEnumeration
    
    Change-Id: I5c509d3e65a92824090930d10849b9b1b430971f

diff --git a/sw/source/core/inc/unoport.hxx b/sw/source/core/inc/unoport.hxx
index 4c35e00..46a275a 100644
--- a/sw/source/core/inc/unoport.hxx
+++ b/sw/source/core/inc/unoport.hxx
@@ -251,6 +251,7 @@ class SwXTextPortionEnumeration
    , public SwClient
 {
     TextRangeList_t m_Portions; // contains all portions, filled by ctor
+    std::shared_ptr<SwUnoCrsr>  m_pUnoCrsr;
 
     SwUnoCrsr*          GetCursor() const
     {return static_cast<SwUnoCrsr*>(const_cast<SwModify*>(GetRegisteredIn()));}
@@ -293,6 +294,7 @@ public:
 protected:
     //SwClient
     virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) SAL_OVERRIDE;
+    virtual void SwClientNotify(const SwModify&, const SfxHint&) SAL_OVERRIDE;
 };
 
 class SwXRedlinePortion : public SwXTextPortion
diff --git a/sw/source/core/unocore/unoportenum.cxx b/sw/source/core/unocore/unoportenum.cxx
index 932ca27..b33b1fe 100644
--- a/sw/source/core/unocore/unoportenum.cxx
+++ b/sw/source/core/unocore/unoportenum.cxx
@@ -363,18 +363,17 @@ SwXTextPortionEnumeration::SwXTextPortionEnumeration(
         const sal_Int32 nEnd )
     : m_Portions()
 {
-    SwUnoCrsr* pUnoCrsr =
-       rParaCrsr.GetDoc()->CreateUnoCrsr(*rParaCrsr.GetPoint(), false);
-    pUnoCrsr->Add(this);
+    m_pUnoCrsr = rParaCrsr.GetDoc()->CreateUnoCrsr2(*rParaCrsr.GetPoint(), false);
+    m_pUnoCrsr->Add(this);
 
     OSL_ENSURE(nEnd == -1 || (nStart <= nEnd &&
-        nEnd <= pUnoCrsr->Start()->nNode.GetNode().GetTextNode()->GetText().getLength()),
+        nEnd <= m_pUnoCrsr->Start()->nNode.GetNode().GetTextNode()->GetText().getLength()),
             "start or end value invalid!");
 
     // find all frames, graphics and OLEs that are bound AT character in para
     FrameDependSortList_t frames;
-    ::CollectFrameAtNode(*this, pUnoCrsr->GetPoint()->nNode, frames, true);
-    lcl_CreatePortions(m_Portions, xParentText, pUnoCrsr, frames, nStart, nEnd);
+    ::CollectFrameAtNode(*this, m_pUnoCrsr->GetPoint()->nNode, frames, true);
+    lcl_CreatePortions(m_Portions, xParentText, m_pUnoCrsr.get(), frames, nStart, nEnd);
 }
 
 SwXTextPortionEnumeration::SwXTextPortionEnumeration(
@@ -382,17 +381,14 @@ SwXTextPortionEnumeration::SwXTextPortionEnumeration(
         TextRangeList_t const & rPortions )
     : m_Portions( rPortions )
 {
-    SwUnoCrsr* const pUnoCrsr =
-       rParaCrsr.GetDoc()->CreateUnoCrsr(*rParaCrsr.GetPoint(), false);
-    pUnoCrsr->Add(this);
+    m_pUnoCrsr = rParaCrsr.GetDoc()->CreateUnoCrsr2(*rParaCrsr.GetPoint(), false);
+    m_pUnoCrsr->Add(this);
 }
 
 SwXTextPortionEnumeration::~SwXTextPortionEnumeration()
 {
-    SolarMutexGuard aGuard;
-
-    SwUnoCrsr* pUnoCrsr = GetCursor();
-    delete pUnoCrsr;
+    if(m_pUnoCrsr)
+        m_pUnoCrsr->Remove(this);
 }
 
 sal_Bool SwXTextPortionEnumeration::hasMoreElements()
@@ -1405,9 +1401,20 @@ static void lcl_CreatePortions(
             "CreatePortions: stack error" );
 }
 
-void    SwXTextPortionEnumeration::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
+void SwXTextPortionEnumeration::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
 {
     ClientModify(this, pOld, pNew);
 }
 
+void SwXTextPortionEnumeration::SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
+{
+    SwClient::SwClientNotify(rModify, rHint);
+    if(!GetRegisteredIn() || typeid(rHint) == typeid(sw::DocDisposingHint))
+    {
+        assert(m_pUnoCrsr->m_bSaneOwnership);
+        m_pUnoCrsr->Remove(this);
+        m_pUnoCrsr.reset();
+    }
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 99614f6a9a738989cca82c8bbd4532fc2d35c1cc
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Thu May 21 13:19:02 2015 +0200

    use new unocrsrs in SwGrfShell
    
    - propably this should listen for ~SwDoc killing the cursor
    - but it didnt before, so leaving that out for now
    
    Change-Id: I1addaba3c7cc339b1e1dae1569418deae142a7d6

diff --git a/sw/source/uibase/shells/grfsh.cxx b/sw/source/uibase/shells/grfsh.cxx
index 39e18fd..93fafb9 100644
--- a/sw/source/uibase/shells/grfsh.cxx
+++ b/sw/source/uibase/shells/grfsh.cxx
@@ -85,13 +85,13 @@ class SwGrfShell::SwExternalToolEdit
 {
 private:
     SwWrtShell *const m_pShell;
-    ::std::unique_ptr<SwUnoCrsr> const m_pCursor;
+    ::std::shared_ptr<SwUnoCrsr> const m_pCursor;
 
 public:
     SwExternalToolEdit(SwWrtShell *const pShell)
         : m_pShell(pShell)
         , m_pCursor( // need only Point, must point to SwGrfNode
-            pShell->GetDoc()->CreateUnoCrsr(
+            pShell->GetDoc()->CreateUnoCrsr2(
                 *pShell->GetCurrentShellCursor().GetPoint()))
     {
     }
commit c844a15c7d39ee1c60d2fbf969d502f94a0cdfff
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Wed May 20 19:39:15 2015 +0200

    use new unocrsrs in SwXTextTableCursor
    
    Change-Id: I7389794f1ca493a1f7e04c7b24d650223443bf7e

diff --git a/sw/inc/unotbl.hxx b/sw/inc/unotbl.hxx
index ec15c45..405d1d4 100644
--- a/sw/inc/unotbl.hxx
+++ b/sw/inc/unotbl.hxx
@@ -213,8 +213,6 @@ class SW_DLLPUBLIC SwXTextTableCursor : public SwXTextTableCursor_Base
     SwDepend                aCrsrDepend;
     const SfxItemPropertySet*   m_pPropSet;
 
-protected:
-    virtual ~SwXTextTableCursor();
 public:
     SwXTextTableCursor(SwFrameFormat* pFormat, SwTableBox* pBox);
     SwXTextTableCursor(SwFrameFormat& rTableFormat,
@@ -265,7 +263,8 @@ public:
     virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
 
     //SwClient
-   virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) SAL_OVERRIDE;
+    virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) SAL_OVERRIDE;
+    virtual void SwClientNotify(const SwModify&, const SfxHint&) SAL_OVERRIDE;
 
     // ITextCursorHelper
     virtual const SwPaM*        GetPaM() const SAL_OVERRIDE;
@@ -275,6 +274,7 @@ public:
 
     const SwUnoCrsr*            GetCrsr() const;
     SwUnoCrsr*                  GetCrsr();
+    std::shared_ptr<SwUnoCrsr> m_pUnoCrsr;
     SwFrameFormat*       GetFrameFormat() const { return const_cast<SwFrameFormat*>(static_cast<const SwFrameFormat*>(GetRegisteredIn())); }
 };
 
diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx
index 59589a3..7db370f 100644
--- a/sw/source/core/unocore/unotbl.cxx
+++ b/sw/source/core/unocore/unotbl.cxx
@@ -1417,10 +1417,10 @@ SwXTextTableCursor::SwXTextTableCursor(SwFrameFormat* pFormat, SwTableBox* pBox)
     SwDoc* pDoc = pFormat->GetDoc();
     const SwStartNode* pSttNd = pBox->GetSttNd();
     SwPosition aPos(*pSttNd);
-    SwUnoCrsr* pUnoCrsr = pDoc->CreateUnoCrsr(aPos, true);
-    pUnoCrsr->Move( fnMoveForward, fnGoNode );
-    pUnoCrsr->Add(&aCrsrDepend);
-    SwUnoTableCrsr& rTableCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
+    m_pUnoCrsr = pDoc->CreateUnoCrsr2(aPos, true);
+    m_pUnoCrsr->Move( fnMoveForward, fnGoNode );
+    m_pUnoCrsr->Add(&aCrsrDepend);
+    SwUnoTableCrsr& rTableCrsr = dynamic_cast<SwUnoTableCrsr&>(*m_pUnoCrsr.get());
     rTableCrsr.MakeBoxSels();
 }
 
@@ -1429,26 +1429,18 @@ SwXTextTableCursor::SwXTextTableCursor(SwFrameFormat& rTableFormat, const SwTabl
     aCrsrDepend(this, 0),
     m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_TABLE_CURSOR))
 {
-    SwUnoCrsr* pUnoCrsr = pTableSelection->GetDoc()->CreateUnoCrsr(*pTableSelection->GetPoint(), true);
+    m_pUnoCrsr = pTableSelection->GetDoc()->CreateUnoCrsr2(*pTableSelection->GetPoint(), true);
     if(pTableSelection->HasMark())
     {
-        pUnoCrsr->SetMark();
-        *pUnoCrsr->GetMark() = *pTableSelection->GetMark();
+        m_pUnoCrsr->SetMark();
+        *m_pUnoCrsr->GetMark() = *pTableSelection->GetMark();
     }
     const SwSelBoxes& rBoxes = pTableSelection->GetSelectedBoxes();
-    SwTableCursor& rTableCrsr = dynamic_cast<SwTableCursor&>(*pUnoCrsr);
+    SwUnoTableCrsr& rTableCrsr = dynamic_cast<SwUnoTableCrsr&>(*m_pUnoCrsr);
     for(auto pBox : rBoxes)
         rTableCrsr.InsertBox(*pBox);
-    pUnoCrsr->Add(&aCrsrDepend);
-    SwUnoTableCrsr& rUnoTableCursor = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
-    rUnoTableCursor.MakeBoxSels();
-}
-
-SwXTextTableCursor::~SwXTextTableCursor()
-{
-    SolarMutexGuard aGuard;
-    SwUnoCrsr* pUnoCrsr = GetCrsr();
-    delete pUnoCrsr;
+    m_pUnoCrsr->Add(&aCrsrDepend);
+    rTableCrsr.MakeBoxSels();
 }
 
 OUString SwXTextTableCursor::getRangeName()
@@ -1747,6 +1739,17 @@ void SwXTextTableCursor::removeVetoableChangeListener(const OUString& /*rPropert
 void SwXTextTableCursor::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
     { ClientModify(this, pOld, pNew); }
 
+void SwXTextTableCursor::SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
+{
+    SwClient::SwClientNotify(rModify, rHint);
+    if(m_pUnoCrsr && typeid(rHint) == typeid(sw::DocDisposingHint))
+    {
+        assert(m_pUnoCrsr->m_bSaneOwnership);
+        m_pUnoCrsr->Remove(&aCrsrDepend);
+        m_pUnoCrsr.reset();
+    }
+}
+
 class SwXTextTable::Impl
 {
 private:
commit 5f5e1568710f8a24af9f54be8bf05e30f6f4f66a
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Wed May 20 18:43:53 2015 +0200

    use new unocrsrs in other writer tables
    
    Change-Id: I0cc178da5ca2493cc50bf6582493790d6b4ba536

diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx
index bebc119..59589a3 100644
--- a/sw/source/core/unocore/unotbl.cxx
+++ b/sw/source/core/unocore/unotbl.cxx
@@ -2577,7 +2577,7 @@ void SwXTextTable::setPropertyValue(const OUString& rPropertyName, const uno::An
                     const SwStartNode* pSttNd = pTLBox->GetSttNd();
                     SwPosition aPos(*pSttNd);
                     // set cursor to top left cell
-                    SwUnoCrsr* pUnoCrsr = pDoc->CreateUnoCrsr(aPos, true);
+                    auto pUnoCrsr(pDoc->CreateUnoCrsr2(aPos, true));
                     pUnoCrsr->Move( fnMoveForward, fnGoNode );
                     pUnoCrsr->SetRemainInSection( false );
 
@@ -2621,7 +2621,6 @@ void SwXTextTable::setPropertyValue(const OUString& rPropertyName, const uno::An
                     aSet.Put(aBoxInfo);
 
                     pDoc->SetTabBorders(rCrsr, aSet);
-                    delete pUnoCrsr;
                 }
                 break;
 
@@ -2767,7 +2766,7 @@ uno::Any SwXTextTable::getPropertyValue(const OUString& rPropertyName)
                     const SwStartNode* pSttNd = pTLBox->GetSttNd();
                     SwPosition aPos(*pSttNd);
                     // set cursor to top left cell
-                    SwUnoCrsr* pUnoCrsr = pDoc->CreateUnoCrsr(aPos, true);
+                    auto pUnoCrsr(pDoc->CreateUnoCrsr2(aPos, true));
                     pUnoCrsr->Move( fnMoveForward, fnGoNode );
                     pUnoCrsr->SetRemainInSection( false );
 
@@ -2828,7 +2827,6 @@ uno::Any SwXTextTable::getPropertyValue(const OUString& rPropertyName)
                         aTableBorder.IsDistanceValid        = rBoxInfoItem.IsValid(SvxBoxInfoItemValidFlags::DISTANCE);
                         aRet <<= aTableBorder;
                     }
-                    delete pUnoCrsr;
                 }
                 break;
 
commit 4020f9bbd92becd3662cdc3b24ad70b370307e5e
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Wed May 20 18:33:26 2015 +0200

    use new unocrsrs in other writer tables
    
    Change-Id: I61d8956135d65676b449637beb9d588cdc83b7d8

diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx
index 99450ab..bebc119 100644
--- a/sw/source/core/unocore/unotbl.cxx
+++ b/sw/source/core/unocore/unotbl.cxx
@@ -3995,14 +3995,13 @@ void SwXTableRows::insertByIndex(sal_Int32 nIndex, sal_Int32 nCount)
     SwPosition aPos(*pSttNd);
     // set cursor to the upper-left cell of the range
     UnoActionContext aAction(pFrameFormat->GetDoc());
-    SwUnoCrsr* pUnoCrsr = pFrameFormat->GetDoc()->CreateUnoCrsr(aPos, true);
+    auto pUnoCrsr(pFrameFormat->GetDoc()->CreateUnoCrsr2(aPos, true));
     pUnoCrsr->Move( fnMoveForward, fnGoNode );
     {
         // remove actions
         UnoActionRemoveContext aRemoveContext(pUnoCrsr->GetDoc());
     }
     pFrameFormat->GetDoc()->InsertRow(*pUnoCrsr, (sal_uInt16)nCount, bAppend);
-    delete pUnoCrsr;
 }
 
 void SwXTableRows::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount)
@@ -4026,7 +4025,7 @@ void SwXTableRows::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount)
     const SwStartNode* pSttNd = pTLBox->GetSttNd();
     SwPosition aPos(*pSttNd);
     // set cursor to the upper-left cell of the range
-    SwUnoCrsr* pUnoCrsr = pFrameFormat->GetDoc()->CreateUnoCrsr(aPos, true);
+    auto pUnoCrsr(pFrameFormat->GetDoc()->CreateUnoCrsr2(aPos, true));
     pUnoCrsr->Move(fnMoveForward, fnGoNode);
     pUnoCrsr->SetRemainInSection( false );
     const OUString sBLName = sw_GetCellName(0, nIndex + nCount - 1);
@@ -4036,12 +4035,12 @@ void SwXTableRows::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount)
     pUnoCrsr->SetMark();
     pUnoCrsr->GetPoint()->nNode = *pBLBox->GetSttNd();
     pUnoCrsr->Move(fnMoveForward, fnGoNode);
-    SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+    SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr.get());
     pCrsr->MakeBoxSels();
     {   // these braces are important
         UnoActionContext aAction(pFrameFormat->GetDoc());
         pFrameFormat->GetDoc()->DeleteRow(*pUnoCrsr);
-        delete pUnoCrsr;
+        pUnoCrsr.reset();
     }
     {
         // invalidate all actions
@@ -4134,7 +4133,7 @@ void SwXTableColumns::insertByIndex(sal_Int32 nIndex, sal_Int32 nCount)
     const SwStartNode* pSttNd = pTLBox->GetSttNd();
     SwPosition aPos(*pSttNd);
     UnoActionContext aAction(pFrameFormat->GetDoc());
-    SwUnoCrsr* pUnoCrsr = pFrameFormat->GetDoc()->CreateUnoCrsr(aPos, true);
+    auto pUnoCrsr(pFrameFormat->GetDoc()->CreateUnoCrsr2(aPos, true));
     pUnoCrsr->Move(fnMoveForward, fnGoNode);
 
     {
@@ -4143,7 +4142,6 @@ void SwXTableColumns::insertByIndex(sal_Int32 nIndex, sal_Int32 nCount)
     }
 
     pFrameFormat->GetDoc()->InsertCol(*pUnoCrsr, (sal_uInt16)nCount, bAppend);
-    delete pUnoCrsr;
 }
 
 ///@see SwXTableRows::removeByIndex (TODO: seems to be copy and paste programming here)
@@ -4168,7 +4166,7 @@ void SwXTableColumns::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount)
     const SwStartNode* pSttNd = pTLBox->GetSttNd();
     SwPosition aPos(*pSttNd);
     // set cursor to the upper-left cell of the range
-    SwUnoCrsr* pUnoCrsr = pFrameFormat->GetDoc()->CreateUnoCrsr(aPos, true);
+    auto pUnoCrsr(pFrameFormat->GetDoc()->CreateUnoCrsr2(aPos, true));
     pUnoCrsr->Move(fnMoveForward, fnGoNode);
     pUnoCrsr->SetRemainInSection(false);
     const OUString sTRName = sw_GetCellName(nIndex + nCount - 1, 0);
@@ -4178,12 +4176,12 @@ void SwXTableColumns::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount)
     pUnoCrsr->SetMark();
     pUnoCrsr->GetPoint()->nNode = *pTRBox->GetSttNd();
     pUnoCrsr->Move(fnMoveForward, fnGoNode);
-    SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+    SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr.get());
     pCrsr->MakeBoxSels();
     {   // these braces are important
         UnoActionContext aAction(pFrameFormat->GetDoc());
         pFrameFormat->GetDoc()->DeleteCol(*pUnoCrsr);
-        delete pUnoCrsr;
+        pUnoCrsr.reset();
     }
     {
         // invalidate all actions
commit a90df339dfcf491af30a3e3b3407c1d8a99453c8
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Wed May 20 18:17:56 2015 +0200

    use new unocrsrs in SwXCellRange
    
    Change-Id: I8ab1c9c0329bdf3f6ac759012dbd0057f4463231

diff --git a/sw/inc/unocrsr.hxx b/sw/inc/unocrsr.hxx
index 66d8a70..e091cc0 100644
--- a/sw/inc/unocrsr.hxx
+++ b/sw/inc/unocrsr.hxx
@@ -95,7 +95,7 @@ public:
                                   nsSwCursorSelOverFlags::SELOVER_TOGGLE |
                                   nsSwCursorSelOverFlags::SELOVER_CHANGEPOS )) SAL_OVERRIDE;
 
-    SwUnoTableCrsr * Clone() const;
+    std::shared_ptr<SwUnoCrsr> Clone() const;
 
     void MakeBoxSels();
 
diff --git a/sw/inc/unotbl.hxx b/sw/inc/unotbl.hxx
index 11b30a3..ec15c45 100644
--- a/sw/inc/unotbl.hxx
+++ b/sw/inc/unotbl.hxx
@@ -457,7 +457,7 @@ class SwXCellRange : public cppu::WeakImplHelper
     SwRangeDescriptor           aRgDesc;
     const SfxItemPropertySet*   m_pPropSet;
 
-    SwUnoCrsr*                  pTableCrsr;
+    std::shared_ptr<SwUnoCrsr> m_pTableCrsr;
 
     bool m_bFirstRowAsLabel;
     bool m_bFirstColumnAsLabel;
@@ -466,11 +466,10 @@ class SwXCellRange : public cppu::WeakImplHelper
     void setLabelDescriptions(const css::uno::Sequence<OUString>& rDesc, bool bRow);
 
 public:
-    SwXCellRange(SwUnoCrsr* pCrsr, SwFrameFormat& rFrameFormat, SwRangeDescriptor& rDesc);
+    SwXCellRange(std::shared_ptr<SwUnoCrsr> pCrsr, SwFrameFormat& rFrameFormat, SwRangeDescriptor& rDesc);
     void SetLabels(bool bFirstRowAsLabel, bool bFirstColumnAsLabel)
         { m_bFirstRowAsLabel = bFirstRowAsLabel, m_bFirstColumnAsLabel = bFirstColumnAsLabel; }
     std::vector< css::uno::Reference< css::table::XCell > > getCells();
-    virtual ~SwXCellRange();
 
     TYPEINFO_OVERRIDE();
 
@@ -536,7 +535,8 @@ public:
     virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
 
     //SwClient
-   virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) SAL_OVERRIDE;
+    virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) SAL_OVERRIDE;
+    virtual void SwClientNotify(const SwModify&, const SfxHint&) SAL_OVERRIDE;
 
     SwFrameFormat*   GetFrameFormat() const { return const_cast<SwFrameFormat*>(static_cast<const SwFrameFormat*>(GetRegisteredIn())); }
     sal_uInt16      getRowCount();
diff --git a/sw/source/core/unocore/unocrsr.cxx b/sw/source/core/unocore/unocrsr.cxx
index cfc07b1..bfdb692 100644
--- a/sw/source/core/unocore/unocrsr.cxx
+++ b/sw/source/core/unocore/unocrsr.cxx
@@ -64,14 +64,11 @@ SwUnoCrsr::~SwUnoCrsr()
     }
 }
 
-SwUnoTableCrsr * SwUnoTableCrsr::Clone() const
+std::shared_ptr<SwUnoCrsr> SwUnoTableCrsr::Clone() const
 {
-    assert(!m_bSaneOwnership);
-    SwUnoTableCrsr * pNewCrsr = dynamic_cast<SwUnoTableCrsr*>(
-        GetDoc()->CreateUnoCrsr(
-            *GetPoint(), true /* create SwUnoTableCrsr */ ) );
-    OSL_ENSURE(pNewCrsr, "Clone: cannot create SwUnoTableCrsr?");
-    if (pNewCrsr && HasMark())
+    assert(m_bSaneOwnership);
+    auto pNewCrsr(GetDoc()->CreateUnoCrsr2(*GetPoint(), true));
+    if(HasMark())
     {
         pNewCrsr->SetMark();
         *pNewCrsr->GetMark() = *GetMark();
diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx
index 27faa44..99450ab 100644
--- a/sw/source/core/unocore/unotbl.cxx
+++ b/sw/source/core/unocore/unotbl.cxx
@@ -2200,19 +2200,16 @@ uno::Reference<table::XCellRange>  SwXTextTable::GetRangeByName(SwFrameFormat* p
     const SwStartNode* pSttNd = pTLBox->GetSttNd();
     SwPosition aPos(*pSttNd);
     // set cursor to the upper-left cell of the range
-    SwUnoCrsr* pUnoCrsr = pFormat->GetDoc()->CreateUnoCrsr(aPos, true);
+    auto pUnoCrsr(pFormat->GetDoc()->CreateUnoCrsr2(aPos, true));
     pUnoCrsr->Move(fnMoveForward, fnGoNode);
     pUnoCrsr->SetRemainInSection(false);
     const SwTableBox* pBRBox(pTable->GetTableBox(rBRName));
     if(!pBRBox)
-    {
-        delete pUnoCrsr;
         return nullptr;
-    }
     pUnoCrsr->SetMark();
     pUnoCrsr->GetPoint()->nNode = *pBRBox->GetSttNd();
     pUnoCrsr->Move( fnMoveForward, fnGoNode );
-    SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+    SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr.get());
     pCrsr->MakeBoxSels();
     // pUnoCrsr will be provided and will not be deleted
     return new SwXCellRange(pUnoCrsr, *pFormat, rDesc);
@@ -3141,18 +3138,19 @@ uno::Sequence<OUString> SwXCellRange::getSupportedServiceNames() throw( uno::Run
         "com.sun.star.style.ParagraphPropertiesComplex" };
 }
 
-SwXCellRange::SwXCellRange(SwUnoCrsr* pCrsr, SwFrameFormat& rFrameFormat,
+SwXCellRange::SwXCellRange(std::shared_ptr<SwUnoCrsr> pCrsr, SwFrameFormat& rFrameFormat,
     SwRangeDescriptor& rDesc)
     : SwClient(&rFrameFormat)
-    , aCursorDepend(this, pCrsr)
+    , aCursorDepend(this, nullptr)
     , m_ChartListeners(m_Mutex)
-    ,
-    aRgDesc(rDesc),
-    m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TABLE_RANGE)),
-    pTableCrsr(pCrsr),
-    m_bFirstRowAsLabel(false),
-    m_bFirstColumnAsLabel(false)
-{
+    , aRgDesc(rDesc)
+    , m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TABLE_RANGE))
+    , m_pTableCrsr(pCrsr)
+    , m_bFirstRowAsLabel(false)
+    , m_bFirstColumnAsLabel(false)
+{
+    assert(m_pTableCrsr->m_bSaneOwnership);
+    m_pTableCrsr->Add(&aCursorDepend);
     aRgDesc.Normalize();
 }
 
@@ -3169,12 +3167,6 @@ std::vector< uno::Reference< table::XCell > > SwXCellRange::getCells()
     return vResult;
 }
 
-SwXCellRange::~SwXCellRange()
-{
-    SolarMutexGuard aGuard;
-    delete pTableCrsr;
-}
-
 uno::Reference< table::XCell >  SwXCellRange::getCellByPosition(sal_Int32 nColumn, sal_Int32 nRow)
     throw( uno::RuntimeException, lang::IndexOutOfBoundsException, std::exception )
 {
@@ -3228,7 +3220,7 @@ uno::Reference< table::XCellRange >  SwXCellRange::getCellRangeByPosition(
                 const SwStartNode* pSttNd = pTLBox->GetSttNd();
                 SwPosition aPos(*pSttNd);
                 // set cursor in the upper-left cell of the range
-                SwUnoCrsr* pUnoCrsr = pFormat->GetDoc()->CreateUnoCrsr(aPos, true);
+                auto pUnoCrsr(pFormat->GetDoc()->CreateUnoCrsr2(aPos, true));
                 pUnoCrsr->Move( fnMoveForward, fnGoNode );
                 pUnoCrsr->SetRemainInSection( false );
                 const SwTableBox* pBRBox = pTable->GetTableBox( sBRName );
@@ -3237,14 +3229,12 @@ uno::Reference< table::XCellRange >  SwXCellRange::getCellRangeByPosition(
                     pUnoCrsr->SetMark();
                     pUnoCrsr->GetPoint()->nNode = *pBRBox->GetSttNd();
                     pUnoCrsr->Move( fnMoveForward, fnGoNode );
-                    SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+                    SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr.get());
                     pCrsr->MakeBoxSels();
                     // pUnoCrsr will be provided and will not be deleted
                     SwXCellRange* pCellRange = new SwXCellRange(pUnoCrsr, *pFormat, aNewDesc);
                     aRet = pCellRange;
                 }
-                else
-                    delete pUnoCrsr;
             }
         }
     }
@@ -3296,21 +3286,21 @@ void SwXCellRange::setPropertyValue(const OUString& rPropertyName, const uno::An
             if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
                 throw beans::PropertyVetoException("Property is read-only: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
 
-            SwDoc* pDoc = pTableCrsr->GetDoc();
+            SwDoc* pDoc = m_pTableCrsr->GetDoc();
             {
                 // remove actions to enable box selection
                 UnoActionRemoveContext aRemoveContext(pDoc);
             }
-            SwUnoTableCrsr& rCrsr = dynamic_cast<SwUnoTableCrsr&>(*pTableCrsr);
+            SwUnoTableCrsr& rCrsr = dynamic_cast<SwUnoTableCrsr&>(*m_pTableCrsr);
             rCrsr.MakeBoxSels();
             switch(pEntry->nWID )
             {
                 case FN_UNO_TABLE_CELL_BACKGROUND:
                 {
                     SvxBrushItem aBrush( RES_BACKGROUND );
-                    SwDoc::GetBoxAttr( *pTableCrsr, aBrush );
+                    pDoc->GetBoxAttr( *m_pTableCrsr, aBrush );
                     ((SfxPoolItem&)aBrush).PutValue(aValue, pEntry->nMemberId);
-                    pDoc->SetBoxAttr( *pTableCrsr, aBrush );
+                    pDoc->SetBoxAttr( *m_pTableCrsr, aBrush );
 
                 }
                 break;
@@ -3345,7 +3335,7 @@ void SwXCellRange::setPropertyValue(const OUString& rPropertyName, const uno::An
                     SvxBoxItem aBoxItem(static_cast<const SvxBoxItem&>(aSet.Get(RES_BOX)));
                     ((SfxPoolItem&)aBoxItem).PutValue(aValue, pEntry->nMemberId);
                     aSet.Put(aBoxItem);
-                    pDoc->SetTabBorders( *pTableCrsr, aSet );
+                    pDoc->SetTabBorders( *m_pTableCrsr, aSet );
                 }
                 break;
                 case RES_BOXATR_FORMAT:
@@ -3416,20 +3406,20 @@ uno::Any SwXCellRange::getPropertyValue(const OUString& rPropertyName)
                 case FN_UNO_TABLE_CELL_BACKGROUND:
                 {
                     SvxBrushItem aBrush( RES_BACKGROUND );
-                    if(SwDoc::GetBoxAttr( *pTableCrsr, aBrush ))
+                    if(m_pTableCrsr->GetDoc()->GetBoxAttr( *m_pTableCrsr, aBrush ))
                         aBrush.QueryValue(aRet, pEntry->nMemberId);
 
                 }
                 break;
                 case RES_BOX :
                 {
-                    SwDoc* pDoc = pTableCrsr->GetDoc();
+                    SwDoc* pDoc = m_pTableCrsr->GetDoc();
                     SfxItemSet aSet(pDoc->GetAttrPool(),
                                     RES_BOX, RES_BOX,
                                     SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
                                     0);
                     aSet.Put(SvxBoxInfoItem( SID_ATTR_BORDER_INNER ));
-                    SwDoc::GetTabBorders(*pTableCrsr, aSet);
+                    pDoc->GetTabBorders(*m_pTableCrsr, aSet);
                     const SvxBoxItem& rBoxItem = static_cast<const SvxBoxItem&>(aSet.Get(RES_BOX));
                     rBoxItem.QueryValue(aRet, pEntry->nMemberId);
                 }
@@ -3440,7 +3430,7 @@ uno::Any SwXCellRange::getPropertyValue(const OUString& rPropertyName)
                 case FN_UNO_PARA_STYLE:
                 {
                     SwFormatColl *const pTmpFormat =
-                        SwUnoCursorHelper::GetCurTextFormatColl(*pTableCrsr, false);
+                        SwUnoCursorHelper::GetCurTextFormatColl(*m_pTableCrsr, false);
                     OUString sRet;
                     if(pFormat)
                         sRet = pTmpFormat->GetName();
@@ -3455,13 +3445,13 @@ uno::Any SwXCellRange::getPropertyValue(const OUString& rPropertyName)
                 break;
                 default:
                 {
-                    SfxItemSet aSet(pTableCrsr->GetDoc()->GetAttrPool(),
+                    SfxItemSet aSet(m_pTableCrsr->GetDoc()->GetAttrPool(),
                         RES_CHRATR_BEGIN,       RES_FRMATR_END -1,
                         RES_TXTATR_UNKNOWN_CONTAINER, RES_TXTATR_UNKNOWN_CONTAINER,
                         RES_UNKNOWNATR_CONTAINER, RES_UNKNOWNATR_CONTAINER,
                         0L);
                     // first look at the attributes of the cursor
-                    SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pTableCrsr);
+                    SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(m_pTableCrsr.get());
                     SwUnoCursorHelper::GetCrsrAttr(pCrsr->GetSelRing(), aSet);
                     m_pPropSet->getPropertyValue(*pEntry, aSet, aRet);
                 }
@@ -3574,7 +3564,7 @@ void SwXCellRange::GetDataSequence(
                             // from the text in the cell...
 
                             sal_uInt32 nFIndex;
-                            SvNumberFormatter* pNumFormatter = pTableCrsr->GetDoc()->GetNumberFormatter();
+                            SvNumberFormatter* pNumFormatter = m_pTableCrsr->GetDoc()->GetNumberFormatter();
 
                             // look for SwTableBoxNumFormat value in parents as well
                             const SfxPoolItem* pItem;
@@ -3860,7 +3850,7 @@ void SAL_CALL SwXCellRange::sort(const uno::Sequence< beans::PropertyValue >& rD
     SwFrameFormat* pFormat(GetFrameFormat());
     if(pFormat && SwUnoCursorHelper::ConvertSortProperties(rDescriptor, aSortOpt))
     {
-        SwUnoTableCrsr& rTableCrsr = dynamic_cast<SwUnoTableCrsr&>(*pTableCrsr);
+        SwUnoTableCrsr& rTableCrsr = dynamic_cast<SwUnoTableCrsr&>(*m_pTableCrsr);
         rTableCrsr.MakeBoxSels();
         UnoActionContext aContext(pFormat->GetDoc());
         pFormat->GetDoc()->SortTable(rTableCrsr.GetSelectedBoxes(), aSortOpt);
@@ -3876,7 +3866,7 @@ sal_uInt16 SwXCellRange::getRowCount()
 const SwUnoCrsr* SwXCellRange::GetTableCrsr() const
 {
     SwFrameFormat* pFormat = GetFrameFormat();
-    return pFormat ? pTableCrsr : nullptr;
+    return pFormat ? m_pTableCrsr.get() : nullptr;
 }
 
 void SwXCellRange::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
@@ -3890,7 +3880,7 @@ void SwXCellRange::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
          * if(!aCursorDepend.GetRegisteredIn())
             delete pTableCrsr;
          */
-        pTableCrsr = 0;
+        m_pTableCrsr.reset();
         lang::EventObject const ev(static_cast< ::cppu::OWeakObject&>(*this));
         m_ChartListeners.disposeAndClear(ev);
     }
@@ -3900,6 +3890,17 @@ void SwXCellRange::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
     }
 }
 
+void SwXCellRange::SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
+{
+    //assert(m_pTblCrsr->m_bSaneOwnership);
+    SwClient::SwClientNotify(rModify, rHint);
+    if(m_pTableCrsr && typeid(rHint) == typeid(sw::DocDisposingHint))
+    {
+        m_pTableCrsr->Remove(&aCursorDepend);
+        m_pTableCrsr.reset();
+    }
+}
+
 //  SwXTableRows
 
 OUString SwXTableRows::getImplementationName() throw( uno::RuntimeException, std::exception )
commit f7a3cc7af22a802322c92a84363676d114bb788e
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Wed May 20 17:01:12 2015 +0200

    kill faux polymophic SwUnoCrsr::Clone()
    
    - SwUnoCrsr::Clone() is dead code that is never used
    - SwUnoTblCrsr::Clone() is the only implemenation that is used, in a
      context that assumes it to be a SwUnoTblCrsr anyway
    => make this non-virtual
    
    Change-Id: I28ddf314eda3d234f2a383bf386dfbe251966038

diff --git a/sw/inc/unocrsr.hxx b/sw/inc/unocrsr.hxx
index 767c534..66d8a70 100644
--- a/sw/inc/unocrsr.hxx
+++ b/sw/inc/unocrsr.hxx
@@ -72,9 +72,6 @@ public:
     void SetSkipOverHiddenSections( bool bFlag )
                                     { m_bSkipOverHiddenSections = bFlag; }
 
-    // make copy of cursor
-    virtual SwUnoCrsr * Clone() const;
-
     DECL_FIXEDMEMPOOL_NEWDEL( SwUnoCrsr )
 };
 
@@ -98,7 +95,7 @@ public:
                                   nsSwCursorSelOverFlags::SELOVER_TOGGLE |
                                   nsSwCursorSelOverFlags::SELOVER_CHANGEPOS )) SAL_OVERRIDE;
 
-    virtual SwUnoTableCrsr * Clone() const SAL_OVERRIDE;
+    SwUnoTableCrsr * Clone() const;
 
     void MakeBoxSels();
 
diff --git a/sw/source/core/unocore/unochart.cxx b/sw/source/core/unocore/unochart.cxx
index 3bfa98e..399db4b 100644
--- a/sw/source/core/unocore/unochart.cxx
+++ b/sw/source/core/unocore/unochart.cxx
@@ -1947,7 +1947,7 @@ SwChartDataSequence::SwChartDataSequence( const SwChartDataSequence &rObj ) :
     aColLabelText( SW_RES(STR_CHART2_COL_LABEL_TEXT) ),
     xDataProvider( rObj.pDataProvider ),
     pDataProvider( rObj.pDataProvider ),
-    pTableCrsr( rObj.pTableCrsr->Clone() ),
+    pTableCrsr( dynamic_cast<SwUnoTableCrsr*>(rObj.pTableCrsr.get())->Clone() ),
     aCursorDepend( this, pTableCrsr.get() ),
     _pPropSet( rObj._pPropSet )
 {
@@ -2032,7 +2032,7 @@ uno::Sequence< uno::Any > SAL_CALL SwChartDataSequence::getData()
                 // keep original cursor and make copy of it that gets handed
                 // over to the SwXCellRange object which takes ownership and
                 // thus will destroy the copy later.
-                SwXCellRange aRange( pTableCrsr->Clone(), *pTableFormat, aDesc );
+                SwXCellRange aRange( dynamic_cast<SwUnoTableCrsr*>(pTableCrsr.get())->Clone(), *pTableFormat, aDesc );
                 aRange.GetDataSequence( &aRes, 0, 0 );
             }
         }
diff --git a/sw/source/core/unocore/unocrsr.cxx b/sw/source/core/unocore/unocrsr.cxx
index 3ee3444..cfc07b1 100644
--- a/sw/source/core/unocore/unocrsr.cxx
+++ b/sw/source/core/unocore/unocrsr.cxx
@@ -64,18 +64,6 @@ SwUnoCrsr::~SwUnoCrsr()
     }
 }
 
-SwUnoCrsr * SwUnoCrsr::Clone() const
-{
-    assert(!m_bSaneOwnership);
-    SwUnoCrsr * pNewCrsr = GetDoc()->CreateUnoCrsr( *GetPoint() );
-    if (HasMark())
-    {
-        pNewCrsr->SetMark();
-        *pNewCrsr->GetMark() = *GetMark();
-    }
-    return pNewCrsr;
-}
-
 SwUnoTableCrsr * SwUnoTableCrsr::Clone() const
 {
     assert(!m_bSaneOwnership);
commit 63536161c82c21d5574fc98e0d374517fbb1205b
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sun May 17 15:45:17 2015 +0200

    use new unocrsrs in SwXParagraphEnumeration
    
    Change-Id: Ia57a04e617b1d7301d098524ebb55acd1d0e60b3

diff --git a/sw/inc/unoparagraph.hxx b/sw/inc/unoparagraph.hxx
index 5bca49d..0c8d87e 100644
--- a/sw/inc/unoparagraph.hxx
+++ b/sw/inc/unoparagraph.hxx
@@ -319,7 +319,7 @@ public:
     SwXParagraphEnumeration(
             ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >
                 const & xParent,
-            ::std::unique_ptr<SwUnoCrsr> && pCursor,
+            std::shared_ptr<SwUnoCrsr> pCursor,
             const CursorType eType,
             SwStartNode const*const pStartNode = 0,
             SwTable const*const pTable = 0);
diff --git a/sw/source/core/unocore/unoframe.cxx b/sw/source/core/unocore/unoframe.cxx
index 54a5b6b..9ab7f70 100644
--- a/sw/source/core/unocore/unoframe.cxx
+++ b/sw/source/core/unocore/unoframe.cxx
@@ -3285,17 +3285,13 @@ uno::Reference< text::XTextCursor >  SwXTextFrame::createTextCursorByRange(const
 uno::Reference< container::XEnumeration >  SwXTextFrame::createEnumeration() throw( uno::RuntimeException, std::exception )
 {
     SolarMutexGuard aGuard;
-    uno::Reference< container::XEnumeration >  aRef;
     SwFrameFormat* pFormat = GetFrameFormat();
-    if(pFormat)
-    {
-        SwPosition aPos(pFormat->GetContent().GetContentIdx()->GetNode());
-        ::std::unique_ptr<SwUnoCrsr> pUnoCursor(
-                GetDoc()->CreateUnoCrsr(aPos, false));
-        pUnoCursor->Move(fnMoveForward, fnGoNode);
-        aRef = new SwXParagraphEnumeration(this, std::move(pUnoCursor), CURSOR_FRAME);
-    }
-    return aRef;
+    if(!pFormat)
+        return nullptr;
+    SwPosition aPos(pFormat->GetContent().GetContentIdx()->GetNode());
+    auto pUnoCursor(GetDoc()->CreateUnoCrsr2(aPos, false));
+    pUnoCursor->Move(fnMoveForward, fnGoNode);
+    return new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_FRAME);
 }
 
 uno::Type  SwXTextFrame::getElementType() throw( uno::RuntimeException, std::exception )
diff --git a/sw/source/core/unocore/unoftn.cxx b/sw/source/core/unocore/unoftn.cxx
index 535603b..c291523 100644
--- a/sw/source/core/unocore/unoftn.cxx
+++ b/sw/source/core/unocore/unoftn.cxx
@@ -478,12 +478,9 @@ SwXFootnote::createEnumeration() throw (uno::RuntimeException, std::exception)
 
     SwTextFootnote const*const pTextFootnote = rFormat.GetTextFootnote();
     SwPosition aPos( *pTextFootnote->GetStartNode() );
-    ::std::unique_ptr<SwUnoCrsr> pUnoCursor(
-        GetDoc()->CreateUnoCrsr(aPos, false));

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list