sfx2/source/control/unoctitm.cxx               |   21 +++++-
 sw/qa/extras/tiledrendering/tiledrendering.cxx |   78 +++++++++++++++++++++++++
 2 files changed, 94 insertions(+), 5 deletions(-)

New commits:
commit 3ad60c39a266b54a0dd94ac8bd15a88d64c9dd5f
Author: Henry Castro <hcas...@collabora.com>
Date:   Thu May 25 21:07:25 2017 -0400

    sw lok: disable undo state if conflict with other views
    
    Change-Id: I5497c9b1f236bc803529825ba8b423d55fffa93e
    Reviewed-on: https://gerrit.libreoffice.org/38049
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Henry Castro <hcas...@collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/38108
    Reviewed-by: Jan Holesovsky <ke...@collabora.com>
    Tested-by: Jan Holesovsky <ke...@collabora.com>

diff --git a/sfx2/source/control/unoctitm.cxx b/sfx2/source/control/unoctitm.cxx
index af13d3d33698..68a1cff0dd83 100644
--- a/sfx2/source/control/unoctitm.cxx
+++ b/sfx2/source/control/unoctitm.cxx
@@ -111,7 +111,7 @@ const char* URLTypeNames[URLType_COUNT] =
     "double"
 };
 
-static void InterceptLOKStateChangeEvent(const SfxViewFrame* pViewFrame, const 
css::frame::FeatureStateEvent& aEvent);
+static void InterceptLOKStateChangeEvent( const SfxViewFrame* pViewFrame, 
const css::frame::FeatureStateEvent& aEvent, const SfxPoolItem* pState );
 
 void SfxStatusDispatcher::ReleaseAll()
 {
@@ -954,7 +954,7 @@ void SfxDispatchController_Impl::StateChanged( sal_uInt16 
nSID, SfxItemState eSt
 
         if (pDispatcher && pDispatcher->GetFrame())
         {
-            InterceptLOKStateChangeEvent(pDispatcher->GetFrame(), aEvent);
+            InterceptLOKStateChangeEvent(pDispatcher->GetFrame(), aEvent, 
pState);
         }
 
         Sequence< OUString > seqNames = 
pDispatch->GetListeners().getContainedTypes();
@@ -972,7 +972,7 @@ void SfxDispatchController_Impl::StateChanged( sal_uInt16 
nSID, SfxItemState eSt
     StateChanged( nSID, eState, pState, nullptr );
 }
 
-static void InterceptLOKStateChangeEvent(const SfxViewFrame* pViewFrame, const 
css::frame::FeatureStateEvent& aEvent)
+static void InterceptLOKStateChangeEvent(const SfxViewFrame* pViewFrame, const 
css::frame::FeatureStateEvent& aEvent, const SfxPoolItem* pState)
 {
     if (!comphelper::LibreOfficeKit::isActive())
         return;
@@ -1039,8 +1039,19 @@ static void InterceptLOKStateChangeEvent(const 
SfxViewFrame* pViewFrame, const c
         aBuffer.append(nColor);
     }
     else if (aEvent.FeatureURL.Path == "Undo" ||
-             aEvent.FeatureURL.Path == "Redo" ||
-             aEvent.FeatureURL.Path == "Cut" ||
+             aEvent.FeatureURL.Path == "Redo")
+    {
+        const SfxUInt32Item* pUndoConflict = dynamic_cast< const SfxUInt32Item 
* >( pState );
+        if ( pUndoConflict && pUndoConflict->GetValue() > 0 )
+        {
+            aBuffer.append(OUString("disabled"));
+        }
+        else
+        {
+            aBuffer.append(aEvent.IsEnabled ? OUString("enabled") : 
OUString("disabled"));
+        }
+    }
+    else if (aEvent.FeatureURL.Path == "Cut" ||
              aEvent.FeatureURL.Path == "Copy" ||
              aEvent.FeatureURL.Path == "Paste" ||
              aEvent.FeatureURL.Path == "SelectAll" ||
diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx 
b/sw/qa/extras/tiledrendering/tiledrendering.cxx
index f12d53f26fee..f915955df2b8 100644
--- a/sw/qa/extras/tiledrendering/tiledrendering.cxx
+++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx
@@ -83,6 +83,7 @@ public:
     void testPaintCallbacks();
     void testUndoRepairResult();
     void testRedoRepairResult();
+    void testDisableUndoRepair();
 
 
     CPPUNIT_TEST_SUITE(SwTiledRenderingTest);
@@ -128,6 +129,7 @@ public:
     CPPUNIT_TEST(testPaintCallbacks);
     CPPUNIT_TEST(testUndoRepairResult);
     CPPUNIT_TEST(testRedoRepairResult);
+    CPPUNIT_TEST(testDisableUndoRepair);
 
     CPPUNIT_TEST_SUITE_END();
 
@@ -1720,6 +1722,82 @@ void SwTiledRenderingTest::testRedoRepairResult()
     comphelper::LibreOfficeKit::setActive(false);
 }
 
+void SwTiledRenderingTest::testDisableUndoRepair()
+{
+    comphelper::LibreOfficeKit::setActive();
+
+    // Create two views.
+    SwXTextDocument* pXTextDocument = createDoc("dummy.fodt");
+    ViewCallback aView1;
+    SwView* pView1 = dynamic_cast<SwView*>(SfxViewShell::Current());
+    int nView1 = SfxLokHelper::getView();
+    SfxLokHelper::createView();
+    ViewCallback aView2;
+    SwView* pView2 = dynamic_cast<SwView*>(SfxViewShell::Current());
+    int nView2 = SfxLokHelper::getView();
+
+    {
+        SfxItemSet 
aItemSet1(pXTextDocument->GetDocShell()->GetDoc()->GetAttrPool(), SID_UNDO, 
SID_UNDO);
+        SfxItemSet 
aItemSet2(pXTextDocument->GetDocShell()->GetDoc()->GetAttrPool(), SID_UNDO, 
SID_UNDO);
+        pView1->GetState(aItemSet1);
+        CPPUNIT_ASSERT(SfxItemState::DISABLED == 
aItemSet1.GetItemState(SID_UNDO));
+        pView2->GetState(aItemSet2);
+        CPPUNIT_ASSERT(SfxItemState::DISABLED == 
aItemSet2.GetItemState(SID_UNDO));
+    }
+
+    auto fnCheckStates = [pXTextDocument, pView1, pView2]()
+    {
+        SfxItemSet 
aItemSet1(pXTextDocument->GetDocShell()->GetDoc()->GetAttrPool(), SID_UNDO, 
SID_UNDO);
+        SfxItemSet 
aItemSet2(pXTextDocument->GetDocShell()->GetDoc()->GetAttrPool(), SID_UNDO, 
SID_UNDO);
+        // first view, undo enabled
+        pView1->GetState(aItemSet1);
+        CPPUNIT_ASSERT(SfxItemState::SET == aItemSet1.GetItemState(SID_UNDO));
+        CPPUNIT_ASSERT(!dynamic_cast< const SfxUInt32Item * 
>(aItemSet1.GetItem(SID_UNDO)));
+        // second view, undo conflict
+        pView2->GetState(aItemSet2);
+        CPPUNIT_ASSERT(SfxItemState::SET == aItemSet2.GetItemState(SID_UNDO));
+        CPPUNIT_ASSERT(dynamic_cast< const SfxUInt32Item * 
>(aItemSet2.GetItem(SID_UNDO)));
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(UNDO_CONFLICT), 
dynamic_cast< const SfxUInt32Item * >(aItemSet2.GetItem(SID_UNDO))->GetValue());
+    };
+
+    // Insert a character in the first view.
+    SfxLokHelper::setView(nView1);
+    pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'k', 0);
+    pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'k', 0);
+    Scheduler::ProcessEventsToIdle();
+    fnCheckStates();
+
+    // Insert a character in the second view.
+    SfxLokHelper::setView(nView2);
+    pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'u', 0);
+    pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'u', 0);
+    Scheduler::ProcessEventsToIdle();
+    {
+        SfxItemSet 
aItemSet1(pXTextDocument->GetDocShell()->GetDoc()->GetAttrPool(), SID_UNDO, 
SID_UNDO);
+        SfxItemSet 
aItemSet2(pXTextDocument->GetDocShell()->GetDoc()->GetAttrPool(), SID_UNDO, 
SID_UNDO);
+        // second view, undo enabled
+        pView2->GetState(aItemSet2);
+        CPPUNIT_ASSERT(SfxItemState::SET == aItemSet2.GetItemState(SID_UNDO));
+        CPPUNIT_ASSERT(!dynamic_cast< const SfxUInt32Item * 
>(aItemSet2.GetItem(SID_UNDO)));
+        // first view, undo conflict
+        pView1->GetState(aItemSet1);
+        CPPUNIT_ASSERT(SfxItemState::SET == aItemSet1.GetItemState(SID_UNDO));
+        CPPUNIT_ASSERT(dynamic_cast< const SfxUInt32Item * 
>(aItemSet1.GetItem(SID_UNDO)));
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(UNDO_CONFLICT), 
dynamic_cast< const SfxUInt32Item * >(aItemSet1.GetItem(SID_UNDO))->GetValue());
+    }
+
+    // Insert a character in the first view.
+    SfxLokHelper::setView(nView1);
+    pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'l', 0);
+    pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'l', 0);
+    Scheduler::ProcessEventsToIdle();
+    fnCheckStates();
+
+    mxComponent->dispose();
+    mxComponent.clear();
+    comphelper::LibreOfficeKit::setActive(false);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SwTiledRenderingTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to