editeng: track view shells in SfxListUndoActions
This is needed for e.g. tracking deletions by backspace in Writer shape text. Change-Id: I6f873872566313096c2c57f4a13ac2f1db67e77d Reviewed-on: https://gerrit.libreoffice.org/27807 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
This commit is contained in:
@@ -685,6 +685,8 @@ private:
|
|||||||
void ImplUpdateOverflowingLineNum( sal_uInt32, sal_uInt32, sal_uInt32 );
|
void ImplUpdateOverflowingLineNum( sal_uInt32, sal_uInt32, sal_uInt32 );
|
||||||
|
|
||||||
SpellInfo * CreateSpellInfo( bool bMultipleDocs );
|
SpellInfo * CreateSpellInfo( bool bMultipleDocs );
|
||||||
|
/// Obtains a view shell ID from the active EditView.
|
||||||
|
sal_Int32 CreateViewShellId();
|
||||||
|
|
||||||
ImpEditEngine(EditEngine* pEditEngine, SfxItemPool* pPool);
|
ImpEditEngine(EditEngine* pEditEngine, SfxItemPool* pPool);
|
||||||
void InitDoc(bool bKeepParaAttribs);
|
void InitDoc(bool bKeepParaAttribs);
|
||||||
|
@@ -222,11 +222,23 @@ EditUndoSetAttribs* ImpEditEngine::CreateAttribUndo( EditSelection aSel, const S
|
|||||||
return pUndo;
|
return pUndo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sal_Int32 ImpEditEngine::CreateViewShellId()
|
||||||
|
{
|
||||||
|
sal_Int32 nRet = -1;
|
||||||
|
|
||||||
|
const EditView* pEditView = pEditEngine ? pEditEngine->GetActiveView() : nullptr;
|
||||||
|
const OutlinerViewShell* pViewShell = pEditView ? pEditView->GetImpEditView()->GetViewShell() : nullptr;
|
||||||
|
if (pViewShell)
|
||||||
|
nRet = pViewShell->GetViewShellId();
|
||||||
|
|
||||||
|
return nRet;
|
||||||
|
}
|
||||||
|
|
||||||
void ImpEditEngine::UndoActionStart( sal_uInt16 nId, const ESelection& aSel )
|
void ImpEditEngine::UndoActionStart( sal_uInt16 nId, const ESelection& aSel )
|
||||||
{
|
{
|
||||||
if ( IsUndoEnabled() && !IsInUndo() )
|
if ( IsUndoEnabled() && !IsInUndo() )
|
||||||
{
|
{
|
||||||
GetUndoManager().EnterListAction( GetEditEnginePtr()->GetUndoComment( nId ), OUString(), nId, -1 );
|
GetUndoManager().EnterListAction( GetEditEnginePtr()->GetUndoComment( nId ), OUString(), nId, CreateViewShellId() );
|
||||||
DBG_ASSERT( !pUndoMarkSelection, "UndoAction SelectionMarker?" );
|
DBG_ASSERT( !pUndoMarkSelection, "UndoAction SelectionMarker?" );
|
||||||
pUndoMarkSelection = new ESelection( aSel );
|
pUndoMarkSelection = new ESelection( aSel );
|
||||||
}
|
}
|
||||||
@@ -236,7 +248,7 @@ void ImpEditEngine::UndoActionStart( sal_uInt16 nId )
|
|||||||
{
|
{
|
||||||
if ( IsUndoEnabled() && !IsInUndo() )
|
if ( IsUndoEnabled() && !IsInUndo() )
|
||||||
{
|
{
|
||||||
GetUndoManager().EnterListAction( GetEditEnginePtr()->GetUndoComment( nId ), OUString(), nId, -1 );
|
GetUndoManager().EnterListAction( GetEditEnginePtr()->GetUndoComment( nId ), OUString(), nId, CreateViewShellId() );
|
||||||
DBG_ASSERT( !pUndoMarkSelection, "UndoAction SelectionMarker?" );
|
DBG_ASSERT( !pUndoMarkSelection, "UndoAction SelectionMarker?" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -61,6 +61,7 @@ public:
|
|||||||
void testTextEditViewInvalidations();
|
void testTextEditViewInvalidations();
|
||||||
void testUndoInvalidations();
|
void testUndoInvalidations();
|
||||||
void testShapeTextUndoShells();
|
void testShapeTextUndoShells();
|
||||||
|
void testShapeTextUndoGroupShells();
|
||||||
|
|
||||||
CPPUNIT_TEST_SUITE(SwTiledRenderingTest);
|
CPPUNIT_TEST_SUITE(SwTiledRenderingTest);
|
||||||
CPPUNIT_TEST(testRegisterCallback);
|
CPPUNIT_TEST(testRegisterCallback);
|
||||||
@@ -87,6 +88,7 @@ public:
|
|||||||
CPPUNIT_TEST(testTextEditViewInvalidations);
|
CPPUNIT_TEST(testTextEditViewInvalidations);
|
||||||
CPPUNIT_TEST(testUndoInvalidations);
|
CPPUNIT_TEST(testUndoInvalidations);
|
||||||
CPPUNIT_TEST(testShapeTextUndoShells);
|
CPPUNIT_TEST(testShapeTextUndoShells);
|
||||||
|
CPPUNIT_TEST(testShapeTextUndoGroupShells);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -921,6 +923,36 @@ void SwTiledRenderingTest::testShapeTextUndoShells()
|
|||||||
comphelper::LibreOfficeKit::setActive(false);
|
comphelper::LibreOfficeKit::setActive(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SwTiledRenderingTest::testShapeTextUndoGroupShells()
|
||||||
|
{
|
||||||
|
// Load a document and create a view.
|
||||||
|
comphelper::LibreOfficeKit::setActive();
|
||||||
|
SwXTextDocument* pXTextDocument = createDoc("shape.fodt");
|
||||||
|
sal_Int32 nView1 = SfxLokHelper::getView();
|
||||||
|
|
||||||
|
// Begin text edit.
|
||||||
|
SwWrtShell* pWrtShell = pXTextDocument->GetDocShell()->GetWrtShell();
|
||||||
|
SdrPage* pPage = pWrtShell->GetDoc()->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0);
|
||||||
|
SdrObject* pObject = pPage->GetObj(0);
|
||||||
|
SdrView* pView = pWrtShell->GetDrawView();
|
||||||
|
pWrtShell->GetView().BeginTextEdit(pObject, pView->GetSdrPageView(), pWrtShell->GetWin());
|
||||||
|
pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0);
|
||||||
|
pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0);
|
||||||
|
pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::BACKSPACE);
|
||||||
|
pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::BACKSPACE);
|
||||||
|
|
||||||
|
// Make sure that the undo item remembers who created it.
|
||||||
|
SwDoc* pDoc = pXTextDocument->GetDocShell()->GetDoc();
|
||||||
|
sw::UndoManager& rUndoManager = pDoc->GetUndoManager();
|
||||||
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rUndoManager.GetUndoActionCount());
|
||||||
|
// This was -1: the view shell id for the (top) undo list action wasn't known.
|
||||||
|
CPPUNIT_ASSERT_EQUAL(nView1, rUndoManager.GetUndoAction()->GetViewShellId());
|
||||||
|
|
||||||
|
mxComponent->dispose();
|
||||||
|
mxComponent.clear();
|
||||||
|
comphelper::LibreOfficeKit::setActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
CPPUNIT_TEST_SUITE_REGISTRATION(SwTiledRenderingTest);
|
CPPUNIT_TEST_SUITE_REGISTRATION(SwTiledRenderingTest);
|
||||||
|
|
||||||
CPPUNIT_PLUGIN_IMPLEMENT();
|
CPPUNIT_PLUGIN_IMPLEMENT();
|
||||||
|
Reference in New Issue
Block a user