summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatúš Kukan <matus.kukan@collabora.com>2014-12-11 15:24:40 +0100
committerMatúš Kukan <matus.kukan@collabora.com>2014-12-11 15:31:26 +0100
commit9338bea6e8dfab8d360fe8ab19dd5d75071bfc2a (patch)
tree182dee01d203bc6bf86e48a9c4c53d10bd8e13f7
parent08ece8d8731c045aee98e3ba7446f7683bb5ab84 (diff)
Add undo operation for deleting a bookmark + unit test, related fdo#51741
Change-Id: I79d8d3c30b6b0b2cc253963fdd50019aec033e12
-rw-r--r--sw/qa/extras/uiwriter/uiwriter.cxx37
-rw-r--r--sw/source/core/crsr/bookmrk.cxx6
-rw-r--r--sw/source/core/doc/docbm.cxx14
-rw-r--r--sw/source/core/inc/UndoBookmark.hxx11
-rw-r--r--sw/source/core/undo/unbkmk.cxx19
-rw-r--r--sw/source/core/unocore/unobkm.cxx12
6 files changed, 81 insertions, 18 deletions
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index d3649d087fb7..313df374ba7d 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -64,6 +64,7 @@ public:
void testFdo87005();
void testMergeDoc();
void testCreatePortions();
+ void testBookmarkUndo();
CPPUNIT_TEST_SUITE(SwUiWriterTest);
CPPUNIT_TEST(testReplaceForward);
@@ -91,6 +92,7 @@ public:
CPPUNIT_TEST(testFdo87005);
CPPUNIT_TEST(testMergeDoc);
CPPUNIT_TEST(testCreatePortions);
+ CPPUNIT_TEST(testBookmarkUndo);
CPPUNIT_TEST_SUITE_END();
@@ -679,6 +681,41 @@ void SwUiWriterTest::testCreatePortions()
xParagraph->createEnumeration();
}
+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 d79fffc12b0e..666a1189fc5e 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 d6d3d27e4df4..9567c3ab7606 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 8338b01376f3..c4215e2e6a8c 100644
--- a/sw/source/core/inc/UndoBookmark.hxx
+++ b/sw/source/core/inc/UndoBookmark.hxx
@@ -67,13 +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;
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 9620b75de6ed..ef0ad13a9ebd 100644
--- a/sw/source/core/undo/unbkmk.cxx
+++ b/sw/source/core/undo/unbkmk.cxx
@@ -86,10 +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_sNewName( rNewName )
{
}
diff --git a/sw/source/core/unocore/unobkm.cxx b/sw/source/core/unocore/unobkm.cxx
index f42beb344d57..2f252f99d1a3 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