[Libreoffice-commits] core.git: Branch 'libreoffice-4-4' - 5 commits - sax/source sw/qa sw/source

Matúš Kukan matus.kukan at collabora.com
Thu Dec 11 13:31:53 PST 2014


 sax/source/fastparser/fastparser.cxx |    6 ++-
 sw/qa/extras/uiwriter/uiwriter.cxx   |   36 ++++++++++++++++++++
 sw/source/core/crsr/bookmrk.cxx      |   12 ++++++
 sw/source/core/doc/docbm.cxx         |   16 ++++++++
 sw/source/core/inc/UndoBookmark.hxx  |   25 +++++++++++++
 sw/source/core/inc/bookmrk.hxx       |    4 +-
 sw/source/core/undo/unbkmk.cxx       |   63 +++++++++++++++++++++++++++++++++++
 sw/source/core/unocore/unobkm.cxx    |   23 ------------
 8 files changed, 159 insertions(+), 26 deletions(-)

New commits:
commit 95b7cf6cef5edc920adee62c18fd97668a9ed3a8
Author: Matúš Kukan <matus.kukan at collabora.com>
Date:   Thu Dec 11 15:24:40 2014 +0100

    Add undo operation for deleting a bookmark + unit test, related fdo#51741
    
    (cherry picked from commit 9338bea6e8dfab8d360fe8ab19dd5d75071bfc2a)
    
    Conflicts:
    	sw/qa/extras/uiwriter/uiwriter.cxx
    	sw/source/core/undo/unbkmk.cxx
    
    Change-Id: I79d8d3c30b6b0b2cc253963fdd50019aec033e12

diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index 2ed5298..23b1e7d 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -57,6 +57,7 @@ public:
     void testChineseConversionTraditionalToSimplified();
     void testChineseConversionSimplifiedToTraditional();
     void testFdo85554();
+    void testBookmarkUndo();
 
     CPPUNIT_TEST_SUITE(SwUiWriterTest);
     CPPUNIT_TEST(testReplaceForward);
@@ -80,6 +81,7 @@ public:
     CPPUNIT_TEST(testChineseConversionTraditionalToSimplified);
     CPPUNIT_TEST(testChineseConversionSimplifiedToTraditional);
     CPPUNIT_TEST(testFdo85554);
+    CPPUNIT_TEST(testBookmarkUndo);
 
     CPPUNIT_TEST_SUITE_END();
 
@@ -586,6 +588,40 @@ void SwUiWriterTest::testFdo85554()
     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), xDrawPage->getCount());
 }
 
+void SwUiWriterTest::testBookmarkUndo()
+{
+    SwDoc* pDoc = createDoc();
+    sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
+    IDocumentMarkAccess* const pMarkAccess = pDoc->getIDocumentMarkAccess();
+    SwPaM aPaM( SwNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1) );
+
+    pMarkAccess->makeMark(aPaM, OUString("Mark"), IDocumentMarkAccess::BOOKMARK);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+    rUndoManager.Undo();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pMarkAccess->getAllMarksCount());
+    rUndoManager.Redo();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+
+    IDocumentMarkAccess::const_iterator_t ppBkmk = pMarkAccess->findMark("Mark");
+    CPPUNIT_ASSERT(ppBkmk != pMarkAccess->getAllMarksEnd());
+
+    pMarkAccess->renameMark(ppBkmk->get(), "Mark_");
+    CPPUNIT_ASSERT(pMarkAccess->findMark("Mark") == pMarkAccess->getAllMarksEnd());
+    CPPUNIT_ASSERT(pMarkAccess->findMark("Mark_") != pMarkAccess->getAllMarksEnd());
+    rUndoManager.Undo();
+    CPPUNIT_ASSERT(pMarkAccess->findMark("Mark") != pMarkAccess->getAllMarksEnd());
+    CPPUNIT_ASSERT(pMarkAccess->findMark("Mark_") == pMarkAccess->getAllMarksEnd());
+    rUndoManager.Redo();
+    CPPUNIT_ASSERT(pMarkAccess->findMark("Mark") == pMarkAccess->getAllMarksEnd());
+    CPPUNIT_ASSERT(pMarkAccess->findMark("Mark_") != pMarkAccess->getAllMarksEnd());
+
+    pMarkAccess->deleteMark( pMarkAccess->findMark("Mark_") );
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pMarkAccess->getAllMarksCount());
+    rUndoManager.Undo();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+    rUndoManager.Redo();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pMarkAccess->getAllMarksCount());
+}
 
 CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest);
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/core/crsr/bookmrk.cxx b/sw/source/core/crsr/bookmrk.cxx
index d79fffc..666a118 100644
--- a/sw/source/core/crsr/bookmrk.cxx
+++ b/sw/source/core/crsr/bookmrk.cxx
@@ -276,7 +276,11 @@ namespace sw { namespace mark
     {
         DdeBookmark::DeregisterFromDoc(io_pDoc);
 
-        // fdo#51741 Bookmark should mark document as modified when deleted
+        if (io_pDoc->GetIDocumentUndoRedo().DoesUndo())
+        {
+            io_pDoc->GetIDocumentUndoRedo().AppendUndo(
+                    new SwUndoDeleteBookmark(*this));
+        }
         io_pDoc->getIDocumentState().SetModified();
     }
 
diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx
index d6d3d27..9567c3a 100644
--- a/sw/source/core/doc/docbm.cxx
+++ b/sw/source/core/doc/docbm.cxx
@@ -29,6 +29,7 @@
 #include <doc.hxx>
 #include <IDocumentRedlineAccess.hxx>
 #include <IDocumentState.hxx>
+#include <IDocumentUndoRedo.hxx>
 #include <docary.hxx>
 #include <xmloff/odffields.hxx>
 #include <editsh.hxx>
@@ -49,6 +50,7 @@
 #include <sfx2/linkmgr.hxx>
 #include <swserv.hxx>
 #include <swundo.hxx>
+#include <UndoBookmark.hxx>
 #include <unocrsr.hxx>
 #include <viscrs.hxx>
 #include <edimp.hxx>
@@ -550,12 +552,18 @@ namespace sw { namespace mark
             return false;
         if (::sw::mark::MarkBase* pMarkBase = dynamic_cast< ::sw::mark::MarkBase* >(io_pMark))
         {
-            m_aMarkNamesSet.erase(pMarkBase->GetName());
+            const OUString sOldName(pMarkBase->GetName());
+            m_aMarkNamesSet.erase(sOldName);
             m_aMarkNamesSet.insert(rNewName);
             pMarkBase->SetName(rNewName);
 
-            // fdo#51741 Bookmark should mark document as modified when renamed
-            if (dynamic_cast< ::sw::mark::Bookmark* >(io_pMark)) {
+            if (dynamic_cast< ::sw::mark::Bookmark* >(io_pMark))
+            {
+                if (m_pDoc->GetIDocumentUndoRedo().DoesUndo())
+                {
+                    m_pDoc->GetIDocumentUndoRedo().AppendUndo(
+                            new SwUndoRenameBookmark(sOldName, rNewName));
+                }
                 m_pDoc->getIDocumentState().SetModified();
             }
         }
diff --git a/sw/source/core/inc/UndoBookmark.hxx b/sw/source/core/inc/UndoBookmark.hxx
index eaa0fcb..c4215e2 100644
--- a/sw/source/core/inc/UndoBookmark.hxx
+++ b/sw/source/core/inc/UndoBookmark.hxx
@@ -67,15 +67,22 @@ public:
     virtual void RedoImpl( ::sw::UndoRedoContext & ) SAL_OVERRIDE;
 };
 
+class SwUndoDeleteBookmark : public SwUndoBookmark
+{
+public:
+    SwUndoDeleteBookmark( const ::sw::mark::IMark& );
+
+    virtual void UndoImpl( ::sw::UndoRedoContext & ) SAL_OVERRIDE;
+    virtual void RedoImpl( ::sw::UndoRedoContext & ) SAL_OVERRIDE;
+};
+
 class SwUndoRenameBookmark : public SwUndo
 {
     const OUString m_sOldName;
     const OUString m_sNewName;
-    const sal_uLong m_nNode;
-    const sal_Int32 m_nCntnt;
 
 public:
-    SwUndoRenameBookmark( const ::sw::mark::IMark&, const OUString& rNewName );
+    SwUndoRenameBookmark( const OUString& rOldName, const OUString& rNewName );
     virtual ~SwUndoRenameBookmark();
 
 private:
diff --git a/sw/source/core/undo/unbkmk.cxx b/sw/source/core/undo/unbkmk.cxx
index 3501ed5..ef0ad13 100644
--- a/sw/source/core/undo/unbkmk.cxx
+++ b/sw/source/core/undo/unbkmk.cxx
@@ -86,12 +86,25 @@ void SwUndoInsBookmark::RedoImpl(::sw::UndoRedoContext & rContext)
     SetInDoc( &rContext.GetDoc() );
 }
 
-SwUndoRenameBookmark::SwUndoRenameBookmark( const ::sw::mark::IMark& rBkmk, const OUString& rOldName )
+SwUndoDeleteBookmark::SwUndoDeleteBookmark( const ::sw::mark::IMark& rBkmk )
+    : SwUndoBookmark( UNDO_DELBOOKMARK, rBkmk )
+{
+}
+
+void SwUndoDeleteBookmark::UndoImpl(::sw::UndoRedoContext & rContext)
+{
+    SetInDoc( &rContext.GetDoc() );
+}
+
+void SwUndoDeleteBookmark::RedoImpl(::sw::UndoRedoContext & rContext)
+{
+    ResetInDoc( &rContext.GetDoc() );
+}
+
+SwUndoRenameBookmark::SwUndoRenameBookmark( const OUString& rOldName, const OUString& rNewName )
     : SwUndo( UNDO_BOOKMARK_RENAME )
     , m_sOldName( rOldName )
-    , m_sNewName( rBkmk.GetName() )
-    , m_nNode( rBkmk.GetMarkPos().nNode.GetIndex() )
-    , m_nCntnt( rBkmk.GetMarkPos().nContent.GetIndex() )
+    , m_sNewName( rNewName )
 {
 }
 
diff --git a/sw/source/core/unocore/unobkm.cxx b/sw/source/core/unocore/unobkm.cxx
index f42beb3..2f252f9 100644
--- a/sw/source/core/unocore/unobkm.cxx
+++ b/sw/source/core/unocore/unobkm.cxx
@@ -24,7 +24,6 @@
 #include <vcl/svapp.hxx>
 
 #include <TextCursorHelper.hxx>
-#include <UndoBookmark.hxx>
 #include <unotextrange.hxx>
 #include <unomap.hxx>
 #include <unoprnms.hxx>
@@ -32,7 +31,6 @@
 #include <crossrefbookmark.hxx>
 #include <doc.hxx>
 #include <IDocumentState.hxx>
-#include <IDocumentUndoRedo.hxx>
 #include <docary.hxx>
 #include <swundo.hxx>
 #include <docsh.hxx>
@@ -349,15 +347,7 @@ throw (uno::RuntimeException, std::exception)
         *aPam.GetMark() = m_pImpl->m_pRegisteredBookmark->GetOtherMarkPos();
     }
 
-    const OUString sOldName(m_pImpl->m_pRegisteredBookmark->GetName());
-    if (pMarkAccess->renameMark(m_pImpl->m_pRegisteredBookmark, rName))
-    {
-        if (m_pImpl->m_pDoc->GetIDocumentUndoRedo().DoesUndo())
-        {
-            m_pImpl->m_pDoc->GetIDocumentUndoRedo().AppendUndo(
-                    new SwUndoRenameBookmark(*m_pImpl->m_pRegisteredBookmark, sOldName));
-        }
-    }
+    pMarkAccess->renameMark(m_pImpl->m_pRegisteredBookmark, rName);
 }
 
 OUString SAL_CALL
commit b4000bac50431b75d9e1157b88c2fb137e684591
Author: Renato Ferreira <renato.wolp at gmail.com>
Date:   Sat Nov 15 00:22:57 2014 -0500

    fdo#51741 Mark document as modified on bookmark rename / delete
    
    Change-Id: I378037ea546d0f2dc4ab9e0b0e6f9bf65c8db5b4
    Deletion: overrided DdeBookmark::DeregisterFromDoc in Bookmark
    Renaming: in MarkManager::renameMark
    Reviewed-on: https://gerrit.libreoffice.org/12436
    Reviewed-by: Michael Stahl <mstahl at redhat.com>
    Tested-by: Michael Stahl <mstahl at redhat.com>
    (cherry picked from commit f0c4cd51cb160492d78c2796f71ecd88da25fa59)

diff --git a/sw/source/core/crsr/bookmrk.cxx b/sw/source/core/crsr/bookmrk.cxx
index 35fc43e..d79fffc 100644
--- a/sw/source/core/crsr/bookmrk.cxx
+++ b/sw/source/core/crsr/bookmrk.cxx
@@ -272,6 +272,14 @@ namespace sw { namespace mark
         io_pDoc->getIDocumentState().SetModified();
     }
 
+    void Bookmark::DeregisterFromDoc(SwDoc* const io_pDoc)
+    {
+        DdeBookmark::DeregisterFromDoc(io_pDoc);
+
+        // fdo#51741 Bookmark should mark document as modified when deleted
+        io_pDoc->getIDocumentState().SetModified();
+    }
+
     ::sfx2::IXmlIdRegistry& Bookmark::GetRegistry()
     {
         SwDoc *const pDoc( GetMarkPos().GetDoc() );
diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx
index b7487ec..d6d3d27 100644
--- a/sw/source/core/doc/docbm.cxx
+++ b/sw/source/core/doc/docbm.cxx
@@ -28,6 +28,7 @@
 #include <dcontact.hxx>
 #include <doc.hxx>
 #include <IDocumentRedlineAccess.hxx>
+#include <IDocumentState.hxx>
 #include <docary.hxx>
 #include <xmloff/odffields.hxx>
 #include <editsh.hxx>
@@ -552,6 +553,11 @@ namespace sw { namespace mark
             m_aMarkNamesSet.erase(pMarkBase->GetName());
             m_aMarkNamesSet.insert(rNewName);
             pMarkBase->SetName(rNewName);
+
+            // fdo#51741 Bookmark should mark document as modified when renamed
+            if (dynamic_cast< ::sw::mark::Bookmark* >(io_pMark)) {
+                m_pDoc->getIDocumentState().SetModified();
+            }
         }
         return true;
     }
diff --git a/sw/source/core/inc/bookmrk.hxx b/sw/source/core/inc/bookmrk.hxx
index b5eef56..d5bc95c 100644
--- a/sw/source/core/inc/bookmrk.hxx
+++ b/sw/source/core/inc/bookmrk.hxx
@@ -152,7 +152,7 @@ namespace sw {
 
             void SetRefObject( SwServerObject* pObj );
 
-            void DeregisterFromDoc(SwDoc* const pDoc);
+            virtual void DeregisterFromDoc(SwDoc* const pDoc);
             virtual ~DdeBookmark();
 
         private:
@@ -171,6 +171,8 @@ namespace sw {
                 const OUString& rShortName);
             virtual void InitDoc(SwDoc* const io_Doc) SAL_OVERRIDE;
 
+            virtual void DeregisterFromDoc(SwDoc* const io_pDoc) SAL_OVERRIDE;
+
             virtual const OUString& GetShortName() const SAL_OVERRIDE
                 { return m_sShortName; }
             virtual const vcl::KeyCode& GetKeyCode() const SAL_OVERRIDE
diff --git a/sw/source/core/unocore/unobkm.cxx b/sw/source/core/unocore/unobkm.cxx
index 3697649..f42beb3 100644
--- a/sw/source/core/unocore/unobkm.cxx
+++ b/sw/source/core/unocore/unobkm.cxx
@@ -357,7 +357,6 @@ throw (uno::RuntimeException, std::exception)
             m_pImpl->m_pDoc->GetIDocumentUndoRedo().AppendUndo(
                     new SwUndoRenameBookmark(*m_pImpl->m_pRegisteredBookmark, sOldName));
         }
-        m_pImpl->m_pDoc->getIDocumentState().SetModified();
     }
 }
 
commit 68420e81edb7275cc66bae110d7279b24a8913a6
Author: Matúš Kukan <matus.kukan at collabora.com>
Date:   Mon Dec 1 13:32:05 2014 +0100

    Add message to exception
    
    Change-Id: I0e7cf850b51343e4afc1ea0a0409ad2c4e596435
    (cherry picked from commit 373daf55d98ba706d3dea131e755da3a00eb259f)

diff --git a/sax/source/fastparser/fastparser.cxx b/sax/source/fastparser/fastparser.cxx
index d0d6979..fc1f5a9 100644
--- a/sax/source/fastparser/fastparser.cxx
+++ b/sax/source/fastparser/fastparser.cxx
@@ -661,7 +661,8 @@ sal_Int32 FastSaxParserImpl::GetTokenWithPrefix( const xmlChar* pPrefix, int nPr
         }
 
         if( !nNamespace )
-            throw SAXException(); // prefix that has no defined namespace url
+            throw SAXException("No namespace defined for " + OUString(XML_CAST(pPrefix),
+                    nPrefixLen, RTL_TEXTENCODING_UTF8), Reference< XInterface >(), Any());
     }
 
     if( nNamespaceToken != FastToken::DONTKNOW )
@@ -694,7 +695,8 @@ OUString FastSaxParserImpl::GetNamespaceURL( const OString& rPrefix ) throw (SAX
                 return rEntity.maNamespaceDefines[nNamespace]->maNamespaceURL;
     }
 
-    throw SAXException(); // prefix that has no defined namespace url
+    throw SAXException("No namespace defined for " + OUString::fromUtf8(rPrefix),
+            Reference< XInterface >(), Any());
 }
 
 sal_Int32 FastSaxParserImpl::GetTokenWithContextNamespace( sal_Int32 nNamespaceToken, const xmlChar* pName, int nNameLen )
commit 7b5184a8a19fe080f4b897e62bed99460b64002a
Author: Matúš Kukan <matus.kukan at collabora.com>
Date:   Wed Nov 26 21:26:06 2014 +0100

    Use IDocumentMarkAccess::findMark here
    
    Presumably, the names should be unique, so it's the same.
    
    Change-Id: I74907b97bc25f9512d4f7514162360e8b21ad4a5
    (cherry picked from commit 43a803ccf8d392561bd168dc3b64695c4dcf93ce)

diff --git a/sw/source/core/undo/unbkmk.cxx b/sw/source/core/undo/unbkmk.cxx
index eb11aa9..3501ed5 100644
--- a/sw/source/core/undo/unbkmk.cxx
+++ b/sw/source/core/undo/unbkmk.cxx
@@ -118,17 +118,10 @@ SwRewriter SwUndoRenameBookmark::GetRewriter() const
 void SwUndoRenameBookmark::Rename(::sw::UndoRedoContext & rContext, const OUString& sFrom, const OUString& sTo)
 {
     IDocumentMarkAccess* const pMarkAccess = rContext.GetDoc().getIDocumentMarkAccess();
-    for ( IDocumentMarkAccess::const_iterator_t ppBkmk = pMarkAccess->getAllMarksBegin();
-          ppBkmk != pMarkAccess->getAllMarksEnd();
-          ++ppBkmk )
+    IDocumentMarkAccess::const_iterator_t ppBkmk = pMarkAccess->findMark(sFrom);
+    if (ppBkmk != pMarkAccess->getAllMarksEnd())
     {
-        if ( m_nNode == ppBkmk->get()->GetMarkPos().nNode.GetIndex()
-             && m_nCntnt == ppBkmk->get()->GetMarkPos().nContent.GetIndex()
-             && sFrom == ppBkmk->get()->GetName() )
-        {
-            pMarkAccess->renameMark( ppBkmk->get(), sTo );
-            break;
-        }
+        pMarkAccess->renameMark( ppBkmk->get(), sTo );
     }
 }
 
commit acf5d1693c184ee480c1663dd3bdfabcd49ef802
Author: Matúš Kukan <matus.kukan at collabora.com>
Date:   Wed Nov 26 11:58:13 2014 +0100

    Writer: Set document as modified and add undo when renaming bookmarks
    
    Change-Id: Id0d4695b6a7c5eae0493e679345bd41d4687d6d7
    (cherry picked from commit c7fa6687e544e7f9702da23aadbd31c1f2e0115e)

diff --git a/sw/source/core/inc/UndoBookmark.hxx b/sw/source/core/inc/UndoBookmark.hxx
index b7e0d56..eaa0fcb 100644
--- a/sw/source/core/inc/UndoBookmark.hxx
+++ b/sw/source/core/inc/UndoBookmark.hxx
@@ -67,6 +67,24 @@ public:
     virtual void RedoImpl( ::sw::UndoRedoContext & ) SAL_OVERRIDE;
 };
 
+class SwUndoRenameBookmark : public SwUndo
+{
+    const OUString m_sOldName;
+    const OUString m_sNewName;
+    const sal_uLong m_nNode;
+    const sal_Int32 m_nCntnt;
+
+public:
+    SwUndoRenameBookmark( const ::sw::mark::IMark&, const OUString& rNewName );
+    virtual ~SwUndoRenameBookmark();
+
+private:
+    virtual SwRewriter GetRewriter() const SAL_OVERRIDE;
+    void Rename( ::sw::UndoRedoContext &, const OUString& sFrom, const OUString& sTo );
+    virtual void UndoImpl( ::sw::UndoRedoContext & ) SAL_OVERRIDE;
+    virtual void RedoImpl( ::sw::UndoRedoContext & ) SAL_OVERRIDE;
+};
+
 #endif // INCLUDED_SW_SOURCE_CORE_INC_UNDOBOOKMARK_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/undo/unbkmk.cxx b/sw/source/core/undo/unbkmk.cxx
index 569fe21..eb11aa9 100644
--- a/sw/source/core/undo/unbkmk.cxx
+++ b/sw/source/core/undo/unbkmk.cxx
@@ -19,6 +19,7 @@
 
 #include <UndoBookmark.hxx>
 
+#include <comcore.hrc>
 #include "doc.hxx"
 #include "docary.hxx"
 #include "swundo.hxx"
@@ -85,4 +86,60 @@ void SwUndoInsBookmark::RedoImpl(::sw::UndoRedoContext & rContext)
     SetInDoc( &rContext.GetDoc() );
 }
 
+SwUndoRenameBookmark::SwUndoRenameBookmark( const ::sw::mark::IMark& rBkmk, const OUString& rOldName )
+    : SwUndo( UNDO_BOOKMARK_RENAME )
+    , m_sOldName( rOldName )
+    , m_sNewName( rBkmk.GetName() )
+    , m_nNode( rBkmk.GetMarkPos().nNode.GetIndex() )
+    , m_nCntnt( rBkmk.GetMarkPos().nContent.GetIndex() )
+{
+}
+
+SwUndoRenameBookmark::~SwUndoRenameBookmark()
+{
+}
+
+static OUString lcl_QuoteName(const OUString& rName)
+{
+    static const OUString sStart = SW_RES(STR_START_QUOTE);
+    static const OUString sEnd = SW_RES(STR_END_QUOTE);
+    return sStart + rName + sEnd;
+}
+
+SwRewriter SwUndoRenameBookmark::GetRewriter() const
+{
+    SwRewriter aRewriter;
+    aRewriter.AddRule(UndoArg1, lcl_QuoteName(m_sOldName));
+    aRewriter.AddRule(UndoArg2, SW_RES(STR_YIELDS));
+    aRewriter.AddRule(UndoArg3, lcl_QuoteName(m_sNewName));
+    return aRewriter;
+}
+
+void SwUndoRenameBookmark::Rename(::sw::UndoRedoContext & rContext, const OUString& sFrom, const OUString& sTo)
+{
+    IDocumentMarkAccess* const pMarkAccess = rContext.GetDoc().getIDocumentMarkAccess();
+    for ( IDocumentMarkAccess::const_iterator_t ppBkmk = pMarkAccess->getAllMarksBegin();
+          ppBkmk != pMarkAccess->getAllMarksEnd();
+          ++ppBkmk )
+    {
+        if ( m_nNode == ppBkmk->get()->GetMarkPos().nNode.GetIndex()
+             && m_nCntnt == ppBkmk->get()->GetMarkPos().nContent.GetIndex()
+             && sFrom == ppBkmk->get()->GetName() )
+        {
+            pMarkAccess->renameMark( ppBkmk->get(), sTo );
+            break;
+        }
+    }
+}
+
+void SwUndoRenameBookmark::UndoImpl(::sw::UndoRedoContext & rContext)
+{
+    Rename(rContext, m_sNewName, m_sOldName);
+}
+
+void SwUndoRenameBookmark::RedoImpl(::sw::UndoRedoContext & rContext)
+{
+    Rename(rContext, m_sOldName, m_sNewName);
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/unocore/unobkm.cxx b/sw/source/core/unocore/unobkm.cxx
index 569fcd2..3697649 100644
--- a/sw/source/core/unocore/unobkm.cxx
+++ b/sw/source/core/unocore/unobkm.cxx
@@ -24,17 +24,17 @@
 #include <vcl/svapp.hxx>
 
 #include <TextCursorHelper.hxx>
+#include <UndoBookmark.hxx>
 #include <unotextrange.hxx>
 #include <unomap.hxx>
 #include <unoprnms.hxx>
 #include <IMark.hxx>
 #include <crossrefbookmark.hxx>
 #include <doc.hxx>
+#include <IDocumentState.hxx>
 #include <IDocumentUndoRedo.hxx>
 #include <docary.hxx>
 #include <swundo.hxx>
-#include <comcore.hrc>
-#include <SwRewriter.hxx>
 #include <docsh.hxx>
 #include <xmloff/odffields.hxx>
 #include <comphelper/servicehelper.hxx>
@@ -42,16 +42,6 @@
 using namespace ::sw::mark;
 using namespace ::com::sun::star;
 
-namespace
-{
-    static OUString lcl_QuoteName(const OUString& rName)
-    {
-        static const OUString sStart = SW_RES(STR_START_QUOTE);
-        static const OUString sEnd = SW_RES(STR_END_QUOTE);
-        return sStart + rName + sEnd;
-    }
-}
-
 class SwXBookmark::Impl
     : public SwClient
 {
@@ -359,16 +349,16 @@ throw (uno::RuntimeException, std::exception)
         *aPam.GetMark() = m_pImpl->m_pRegisteredBookmark->GetOtherMarkPos();
     }
 
-    SwRewriter aRewriter;
-    aRewriter.AddRule(UndoArg1, lcl_QuoteName(getName()));
-    aRewriter.AddRule(UndoArg2, SW_RES(STR_YIELDS));
-    aRewriter.AddRule(UndoArg3, lcl_QuoteName(rName));
-
-    m_pImpl->m_pDoc->GetIDocumentUndoRedo().StartUndo(
-            UNDO_BOOKMARK_RENAME, &aRewriter);
-    pMarkAccess->renameMark(m_pImpl->m_pRegisteredBookmark, rName);
-    m_pImpl->m_pDoc->GetIDocumentUndoRedo().EndUndo(
-            UNDO_BOOKMARK_RENAME, &aRewriter);
+    const OUString sOldName(m_pImpl->m_pRegisteredBookmark->GetName());
+    if (pMarkAccess->renameMark(m_pImpl->m_pRegisteredBookmark, rName))
+    {
+        if (m_pImpl->m_pDoc->GetIDocumentUndoRedo().DoesUndo())
+        {
+            m_pImpl->m_pDoc->GetIDocumentUndoRedo().AppendUndo(
+                    new SwUndoRenameBookmark(*m_pImpl->m_pRegisteredBookmark, sOldName));
+        }
+        m_pImpl->m_pDoc->getIDocumentState().SetModified();
+    }
 }
 
 OUString SAL_CALL


More information about the Libreoffice-commits mailing list