From 0892238c635009a7b078a0778dbd6138e06e0ac0 Mon Sep 17 00:00:00 2001 From: Henry Castro Date: Tue, 27 Jun 2017 20:42:11 -0400 Subject: sd lok: disable undo state if conflict with other views Change-Id: I046d118fca32c95f7734d6e29598da56578c9ec0 Reviewed-on: https://gerrit.libreoffice.org/39333 Tested-by: Jenkins Reviewed-by: Henry Castro Reviewed-on: https://gerrit.libreoffice.org/39400 Reviewed-by: Jan Holesovsky Tested-by: Jan Holesovsky --- sd/qa/unit/tiledrendering/tiledrendering.cxx | 55 ++++++++++++++++++++++ sd/source/ui/view/viewshe3.cxx | 68 +++++++++++++++------------- 2 files changed, 91 insertions(+), 32 deletions(-) (limited to 'sd') diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx index 6a75280b7f4f..46dc5acf7c7c 100644 --- a/sd/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx @@ -95,6 +95,7 @@ public: void testTdf105502(); void testCommentCallbacks(); void testMultiViewInsertDeletePage(); + void testDisableUndoRepair(); CPPUNIT_TEST_SUITE(SdTiledRenderingTest); CPPUNIT_TEST(testRegisterCallback); @@ -131,6 +132,7 @@ public: CPPUNIT_TEST(testTdf105502); CPPUNIT_TEST(testCommentCallbacks); CPPUNIT_TEST(testMultiViewInsertDeletePage); + CPPUNIT_TEST(testDisableUndoRepair); CPPUNIT_TEST_SUITE_END(); @@ -1762,6 +1764,59 @@ void SdTiledRenderingTest::testMultiViewInsertDeletePage() comphelper::LibreOfficeKit::setActive(false); } +void SdTiledRenderingTest::testDisableUndoRepair() +{ + // Load the document. + comphelper::LibreOfficeKit::setActive(); + SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + SfxViewShell* pView1 = SfxViewShell::Current(); + int nView1 = SfxLokHelper::getView(); + SfxLokHelper::createView(); + SfxViewShell* pView2 = SfxViewShell::Current(); + int nView2 = SfxLokHelper::getView(); + { + std::unique_ptr pItem1; + std::unique_ptr pItem2; + CPPUNIT_ASSERT(SfxItemState::DISABLED == pView1->GetViewFrame()->GetBindings().QueryState(SID_UNDO, pItem1)); + CPPUNIT_ASSERT(SfxItemState::DISABLED == pView2->GetViewFrame()->GetBindings().QueryState(SID_UNDO, pItem2)); + } + + // Insert a character in the first view. + SfxLokHelper::setView(nView1); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'h', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'h', 0); + Scheduler::ProcessEventsToIdle(); + { + std::unique_ptr pItem1; + std::unique_ptr pItem2; + pView1->GetViewFrame()->GetBindings().QueryState(SID_UNDO, pItem1); + pView2->GetViewFrame()->GetBindings().QueryState(SID_UNDO, pItem2); + CPPUNIT_ASSERT(!dynamic_cast< const SfxUInt32Item* >(pItem1.get())); + CPPUNIT_ASSERT(dynamic_cast< const SfxUInt32Item* >(pItem2.get())); + CPPUNIT_ASSERT_EQUAL(static_cast(SID_REPAIRPACKAGE), dynamic_cast< const SfxUInt32Item * >(pItem2.get())->GetValue()); + } + + // Insert a character in the second view. + SfxLokHelper::setView(nView2); + pXImpressDocument->setPart(1); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'c', 0); + pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'c', 0); + Scheduler::ProcessEventsToIdle(); + { + std::unique_ptr pItem1; + std::unique_ptr pItem2; + pView1->GetViewFrame()->GetBindings().QueryState(SID_UNDO, pItem1); + pView2->GetViewFrame()->GetBindings().QueryState(SID_UNDO, pItem2); + CPPUNIT_ASSERT(!dynamic_cast< const SfxUInt32Item* >(pItem2.get())); + CPPUNIT_ASSERT(dynamic_cast< const SfxUInt32Item* >(pItem1.get())); + CPPUNIT_ASSERT_EQUAL(static_cast(SID_REPAIRPACKAGE), dynamic_cast< const SfxUInt32Item * >(pItem1.get())->GetValue()); + } +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdTiledRenderingTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sd/source/ui/view/viewshe3.cxx b/sd/source/ui/view/viewshe3.cxx index 6600248086f3..49d36b755214 100644 --- a/sd/source/ui/view/viewshe3.cxx +++ b/sd/source/ui/view/viewshe3.cxx @@ -125,54 +125,58 @@ void ViewShell::GetMenuState( SfxItemSet &rSet ) if(SfxItemState::DEFAULT == rSet.GetItemState(SID_UNDO)) { ::svl::IUndoManager* pUndoManager = ImpGetUndoManager(); - bool bActivate(false); - if(pUndoManager) { if(pUndoManager->GetUndoActionCount() != 0) { - bActivate = true; + // If an other view created the first undo action, prevent redoing it from this view. + const SfxUndoAction* pAction = pUndoManager->GetUndoAction(); + if (pAction->GetViewShellId() != static_cast(GetViewShellBase().GetViewShellId())) + { + rSet.Put(SfxUInt32Item(SID_UNDO, static_cast(SID_REPAIRPACKAGE))); + } + else + { + // Set the necessary string like in + // sfx2/source/view/viewfrm.cxx ver 1.23 ln 1072 ff. + OUString aTmp(SVT_RESSTR(STR_UNDO)); + aTmp += pUndoManager->GetUndoActionComment(); + rSet.Put(SfxStringItem(SID_UNDO, aTmp)); + } + } + else + { + rSet.DisableItem(SID_UNDO); } - } - - if(bActivate) - { - // Set the necessary string like in - // sfx2/source/view/viewfrm.cxx ver 1.23 ln 1072 ff. - OUString aTmp(SVT_RESSTR(STR_UNDO)); - aTmp += pUndoManager->GetUndoActionComment(); - rSet.Put(SfxStringItem(SID_UNDO, aTmp)); - } - else - { - rSet.DisableItem(SID_UNDO); } } if(SfxItemState::DEFAULT == rSet.GetItemState(SID_REDO)) { ::svl::IUndoManager* pUndoManager = ImpGetUndoManager(); - bool bActivate(false); - if(pUndoManager) { if(pUndoManager->GetRedoActionCount() != 0) { - bActivate = true; + // If an other view created the first undo action, prevent redoing it from this view. + const SfxUndoAction* pAction = pUndoManager->GetRedoAction(); + if (pAction->GetViewShellId() != static_cast(GetViewShellBase().GetViewShellId())) + { + rSet.Put(SfxUInt32Item(SID_REDO, static_cast(SID_REPAIRPACKAGE))); + } + else + { + // Set the necessary string like in + // sfx2/source/view/viewfrm.cxx ver 1.23 ln 1081 ff. + OUString aTmp(SVT_RESSTR(STR_REDO)); + aTmp += pUndoManager->GetRedoActionComment(); + rSet.Put(SfxStringItem(SID_REDO, aTmp)); + } + } + else + { + rSet.DisableItem(SID_REDO); } - } - - if(bActivate) - { - // Set the necessary string like in - // sfx2/source/view/viewfrm.cxx ver 1.23 ln 1081 ff. - OUString aTmp(SVT_RESSTR(STR_REDO)); - aTmp += pUndoManager->GetRedoActionComment(); - rSet.Put(SfxStringItem(SID_REDO, aTmp)); - } - else - { - rSet.DisableItem(SID_REDO); } } } -- cgit