Kaydet (Commit) 9dd8a0dc authored tarafından Miklos Vajna's avatar Miklos Vajna

desktop: add undo/redo support to lok::Document::getCommandValues()

Expose the undo/redo stack and the metadata of each item.

Change-Id: I66b81e855a945c97be3d491ed709959f310d4b73
Reviewed-on: https://gerrit.libreoffice.org/27905Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
Tested-by: 's avatarJenkins <ci@libreoffice.org>
üst e50a95b8
......@@ -79,6 +79,7 @@ public:
void testSaveAsCalc();
void testPasteWriter();
void testPasteWriterJPEG();
void testUndoWriter();
void testRowColumnHeaders();
void testHiddenRowHeaders();
void testCellCursor();
......@@ -105,6 +106,7 @@ public:
CPPUNIT_TEST(testSaveAsCalc);
CPPUNIT_TEST(testPasteWriter);
CPPUNIT_TEST(testPasteWriterJPEG);
CPPUNIT_TEST(testUndoWriter);
CPPUNIT_TEST(testRowColumnHeaders);
CPPUNIT_TEST(testHiddenRowHeaders);
CPPUNIT_TEST(testCellCursor);
......@@ -502,6 +504,27 @@ void DesktopLOKTest::testPasteWriterJPEG()
comphelper::LibreOfficeKit::setActive(false);
}
void DesktopLOKTest::testUndoWriter()
{
// Load a Writer document and press a key.
comphelper::LibreOfficeKit::setActive();
LibLODocument_Impl* pDocument = loadDoc("blank_text.odt");
pDocument->pClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYINPUT, 't', 0);
pDocument->pClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYUP, 't', 0);
// Get undo info.
boost::property_tree::ptree aTree;
char* pJSON = pDocument->m_pDocumentClass->getCommandValues(pDocument, ".uno:Undo");
std::stringstream aStream(pJSON);
free(pJSON);
CPPUNIT_ASSERT(!aStream.str().empty());
boost::property_tree::read_json(aStream, aTree);
// Make sure that pressing a key creates exactly one undo action.
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aTree.get_child("actions").size());
comphelper::LibreOfficeKit::setActive(false);
}
void DesktopLOKTest::testRowColumnHeaders()
{
/*
......
......@@ -78,6 +78,8 @@
#include <unotools/mediadescriptor.hxx>
#include <osl/module.hxx>
#include <comphelper/sequence.hxx>
#include <sfx2/sfxbasemodel.hxx>
#include <svl/undo.hxx>
#include <app.hxx>
......@@ -85,7 +87,7 @@
// We also need to hackily be able to start the main libreoffice thread:
#include "../app/sofficemain.h"
#include "../app/officeipcthread.hxx"
#include "../../inc/lib/init.hxx"
#include <lib/init.hxx>
#include "lokinteractionhandler.hxx"
#include <lokclipboard.hxx>
......@@ -1776,6 +1778,38 @@ static char* getStyles(LibreOfficeKitDocument* pThis, const char* pCommand)
return pJson;
}
enum class UndoOrRedo
{
UNDO,
REDO
};
/// Returns the JSON representation of either an undo or a redo stack.
static char* getUndoOrRedo(LibreOfficeKitDocument* pThis, UndoOrRedo eCommand)
{
LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
auto pBaseModel = dynamic_cast<SfxBaseModel*>(pDocument->mxComponent.get());
if (!pBaseModel)
return nullptr;
SfxObjectShell* pObjectShell = pBaseModel->GetObjectShell();
if (!pObjectShell)
return nullptr;
svl::IUndoManager* pUndoManager = pObjectShell->GetUndoManager();
if (!pUndoManager)
return nullptr;
OUString aString;
if (eCommand == UndoOrRedo::UNDO)
aString = pUndoManager->GetUndoActionsInfo();
else
aString = pUndoManager->GetRedoActionsInfo();
char* pJson = strdup(aString.toUtf8().getStr());
return pJson;
}
static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCommand)
{
OString aCommand(pCommand);
......@@ -1790,6 +1824,14 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo
{
return getStyles(pThis, pCommand);
}
else if (aCommand == ".uno:Undo")
{
return getUndoOrRedo(pThis, UndoOrRedo::UNDO);
}
else if (aCommand == ".uno:Redo")
{
return getUndoOrRedo(pThis, UndoOrRedo::REDO);
}
else if (aCommand.startsWith(aViewRowColumnHeaders))
{
ITiledRenderable* pDoc = getTiledRenderable(pThis);
......
......@@ -197,10 +197,14 @@ namespace svl
virtual sal_uInt16 GetUndoActionId() const = 0;
virtual OUString GetUndoActionComment( size_t nNo=0, bool const i_currentLevel = CurrentLevel ) const = 0;
virtual SfxUndoAction* GetUndoAction( size_t nNo=0 ) const = 0;
/// Get info about all undo actions (comment, view shell id, etc.)
virtual OUString GetUndoActionsInfo() const = 0;
virtual size_t GetRedoActionCount( bool const i_currentLevel = CurrentLevel ) const = 0;
virtual OUString GetRedoActionComment( size_t nNo=0, bool const i_currentLevel = CurrentLevel ) const = 0;
virtual SfxUndoAction* GetRedoAction() const = 0;
/// Get info about all redo actions (comment, view shell id, etc.)
virtual OUString GetRedoActionsInfo() const = 0;
virtual bool Undo() = 0;
virtual bool Redo() = 0;
......@@ -313,9 +317,11 @@ public:
virtual sal_uInt16 GetUndoActionId() const override;
virtual OUString GetUndoActionComment( size_t nNo=0, bool const i_currentLevel = CurrentLevel ) const override;
virtual SfxUndoAction* GetUndoAction( size_t nNo=0 ) const override;
OUString GetUndoActionsInfo() const override;
virtual size_t GetRedoActionCount( bool const i_currentLevel = CurrentLevel ) const override;
virtual OUString GetRedoActionComment( size_t nNo=0, bool const i_currentLevel = CurrentLevel ) const override;
virtual SfxUndoAction* GetRedoAction() const override;
OUString GetRedoActionsInfo() const override;
virtual bool Undo() override;
virtual bool Redo() override;
virtual void Clear() override;
......
......@@ -26,6 +26,7 @@
#include <comphelper/flagguard.hxx>
#include <tools/diagnose_ex.h>
#include <libxml/xmlwriter.h>
#include <boost/property_tree/json_parser.hpp>
#include <unotools/datetime.hxx>
#include <vector>
......@@ -1300,6 +1301,51 @@ void SfxUndoManager::dumpAsXml(xmlTextWriterPtr pWriter) const
}
}
/// Returns a JSON representation of pAction.
boost::property_tree::ptree lcl_ActionToJson(size_t nIndex, SfxUndoAction* pAction)
{
boost::property_tree::ptree aRet;
aRet.put("index", nIndex);
aRet.put("comment", pAction->GetComment().toUtf8().getStr());
aRet.put("viewId", pAction->GetViewShellId());
aRet.put("dateTime", utl::toISO8601(pAction->GetDateTime().GetUNODateTime()).toUtf8().getStr());
return aRet;
}
OUString SfxUndoManager::GetUndoActionsInfo() const
{
boost::property_tree::ptree aActions;
const SfxUndoArray* pUndoArray = m_xData->pActUndoArray;
for (size_t i = 0; i < GetUndoActionCount(); ++i)
{
boost::property_tree::ptree aAction = lcl_ActionToJson(i, pUndoArray->aUndoActions[pUndoArray->nCurUndoAction - 1 - i].pAction);
aActions.push_back(std::make_pair("", aAction));
}
boost::property_tree::ptree aTree;
aTree.add_child("actions", aActions);
std::stringstream aStream;
boost::property_tree::write_json(aStream, aTree);
return OUString::fromUtf8(aStream.str().c_str());
}
OUString SfxUndoManager::GetRedoActionsInfo() const
{
boost::property_tree::ptree aActions;
const SfxUndoArray* pUndoArray = m_xData->pActUndoArray;
for (size_t i = 0; i < GetRedoActionCount(); ++i)
{
boost::property_tree::ptree aAction = lcl_ActionToJson(i, pUndoArray->aUndoActions[pUndoArray->nCurUndoAction + i].pAction);
aActions.push_back(std::make_pair("", aAction));
}
boost::property_tree::ptree aTree;
aTree.add_child("actions", aActions);
std::stringstream aStream;
boost::property_tree::write_json(aStream, aTree);
return OUString::fromUtf8(aStream.str().c_str());
}
struct SfxListUndoAction::Impl
{
sal_uInt16 mnId;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment