[Libreoffice-commits] core.git: sc/inc sc/qa sc/source

Marco Cecchetti marco.cecchetti at collabora.com
Mon Oct 3 12:08:49 UTC 2016


 sc/inc/scmod.hxx                             |    2 -
 sc/qa/unit/tiledrendering/tiledrendering.cxx |   53 +++++++++++++++++++++++++++
 sc/source/ui/app/scmod.cxx                   |    5 +-
 sc/source/ui/inc/tabvwsh.hxx                 |    3 +
 sc/source/ui/view/tabvwsh4.cxx               |   22 +++++++++--
 sc/source/ui/view/tabvwsh5.cxx               |   11 ++++-
 6 files changed, 88 insertions(+), 8 deletions(-)

New commits:
commit f5ed92549b9f113cbe252820a01a098b2b9d65ab
Author: Marco Cecchetti <marco.cecchetti at collabora.com>
Date:   Fri Sep 16 12:36:06 2016 +0200

    LOK - when a view is enabled, the existing edit views are killed
    
    A view is notified about killing its own edit view, if any, in 4
    cases:
    
    - before being deactivated
    - soon after being activated
    - when a 'cursor position changed' event occurs in any view
    - when a 'selection changed' event occurs in any view
    
    Now these notifications are skipped when LOK is active.
    
    Change-Id: I94020987a35b1450ec41e2fa5fcce8cfa7e92130
    Reviewed-on: https://gerrit.libreoffice.org/28948
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Marco Cecchetti <mrcekets at gmail.com>

diff --git a/sc/inc/scmod.hxx b/sc/inc/scmod.hxx
index 851ffbe..07b38c8 100644
--- a/sc/inc/scmod.hxx
+++ b/sc/inc/scmod.hxx
@@ -208,7 +208,7 @@ public:
     ScInputHandler*     GetRefInputHdl() { return pRefInputHandler;}
 
     void                ViewShellGone(ScTabViewShell* pViewSh);
-    void                ViewShellChanged();
+    void                ViewShellChanged(bool bStopEditing = true);
     // communication with function-autopilot
     void                InputGetSelection( sal_Int32& rStart, sal_Int32& rEnd );
     void                InputSetSelection( sal_Int32 nStart, sal_Int32 nEnd );
diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx b/sc/qa/unit/tiledrendering/tiledrendering.cxx
index 63175fe..a39db6e 100644
--- a/sc/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx
@@ -63,6 +63,7 @@ public:
     void testColRowResize();
     void testUndoShells();
     void testCreateViewGraphicSelection();
+    void testTextEditViews();
     void testGraphicInvalidate();
 
     CPPUNIT_TEST_SUITE(ScTiledRenderingTest);
@@ -78,6 +79,7 @@ public:
     CPPUNIT_TEST(testColRowResize);
     CPPUNIT_TEST(testUndoShells);
     CPPUNIT_TEST(testCreateViewGraphicSelection);
+    CPPUNIT_TEST(testTextEditViews);
     CPPUNIT_TEST(testGraphicInvalidate);
     CPPUNIT_TEST_SUITE_END();
 
@@ -639,6 +641,57 @@ void ScTiledRenderingTest::testUndoShells()
     comphelper::LibreOfficeKit::setActive(false);
 }
 
+bool lcl_hasEditView(ScViewData& rViewData)
+{
+    bool bResult = false;
+    for (unsigned int i=0; i<4; i++)
+    {
+        bResult = rViewData.HasEditView( (ScSplitPos) i );
+        if (bResult) break;
+    }
+    return bResult;
+}
+
+void ScTiledRenderingTest::testTextEditViews()
+{
+    comphelper::LibreOfficeKit::setActive();
+
+    ScModelObj* pModelObj = createDoc("small.ods");
+    CPPUNIT_ASSERT(pModelObj);
+    ScViewData* pViewData = ScDocShell::GetViewData();
+    CPPUNIT_ASSERT(pViewData);
+
+    // view #1
+    ViewCallback aView1;
+    SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView1);
+    CPPUNIT_ASSERT(!lcl_hasEditView(*pViewData));
+
+    // text edit a cell in view #1
+    pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0);
+    pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0);
+    Scheduler::ProcessEventsToIdle();
+    CPPUNIT_ASSERT(lcl_hasEditView(*pViewData));
+
+    // view #2
+    SfxLokHelper::createView();
+    ViewCallback aView2;
+    pModelObj->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+    SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView2);
+
+    // move cell cursor i view #2
+    pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::DOWN);
+    pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::DOWN);
+    Scheduler::ProcessEventsToIdle();
+
+    // check that text edit view in view #1 has not be killed
+    CPPUNIT_ASSERT(lcl_hasEditView(*pViewData));
+
+    mxComponent->dispose();
+    mxComponent.clear();
+
+    comphelper::LibreOfficeKit::setActive(false);
+}
+
 void ScTiledRenderingTest::testCreateViewGraphicSelection()
 {
     // Load a document
diff --git a/sc/source/ui/app/scmod.cxx b/sc/source/ui/app/scmod.cxx
index 8b0e101..561ff2b 100644
--- a/sc/source/ui/app/scmod.cxx
+++ b/sc/source/ui/app/scmod.cxx
@@ -20,6 +20,7 @@
 #include <config_features.h>
 
 #include <com/sun/star/ui/dialogs/XSLTFilterDialog.hpp>
+#include <comphelper/lok.hxx>
 #include <comphelper/processfactory.hxx>
 
 #include "scitems.hxx"
@@ -1369,12 +1370,12 @@ ScInputHandler* ScModule::GetInputHdl( ScTabViewShell* pViewSh, bool bUseRef )
     return pHdl;
 }
 
-void ScModule::ViewShellChanged()
+void ScModule::ViewShellChanged(bool bStopEditing /*=true*/)
 {
     ScInputHandler* pHdl   = GetInputHdl();
     ScTabViewShell* pShell = ScTabViewShell::GetActiveViewShell();
     if ( pShell && pHdl )
-        pShell->UpdateInputHandler();
+        pShell->UpdateInputHandler(false, bStopEditing);
 }
 
 void ScModule::SetInputMode( ScInputMode eMode, const OUString* pInitText )
diff --git a/sc/source/ui/inc/tabvwsh.hxx b/sc/source/ui/inc/tabvwsh.hxx
index dd05b4c..5fec291 100644
--- a/sc/source/ui/inc/tabvwsh.hxx
+++ b/sc/source/ui/inc/tabvwsh.hxx
@@ -155,6 +155,9 @@ private:
 
     bool                    bForceFocusOnCurCell; // #i123629#
 
+    bool                    bInPrepareClose;
+    bool                    bInDispose;
+
     ScRangeListRef          aChartSource;
     Rectangle               aChartPos;
     SCTAB                   nChartDestTab;
diff --git a/sc/source/ui/view/tabvwsh4.cxx b/sc/source/ui/view/tabvwsh4.cxx
index c4ff1fa..c822106 100644
--- a/sc/source/ui/view/tabvwsh4.cxx
+++ b/sc/source/ui/view/tabvwsh4.cxx
@@ -99,11 +99,20 @@
 #include <com/sun/star/chart2/XChartType.hpp>
 #include <sfx2/lokhelper.hxx>
 #include <LibreOfficeKit/LibreOfficeKitEnums.h>
+#include <comphelper/lok.hxx>
 
 extern SfxViewShell* pScActiveViewShell;            // global.cxx
 
 using namespace com::sun::star;
 
+struct BoolLock
+{
+    bool& mflag;
+    explicit BoolLock( bool& flag ) : mflag(flag)
+    { mflag = true; }
+    ~BoolLock() { mflag = false; }
+};
+
 void ScTabViewShell::Activate(bool bMDI)
 {
     SfxViewShell::Activate(bMDI);
@@ -114,7 +123,7 @@ void ScTabViewShell::Activate(bool bMDI)
     {
         // for input row (ClearCache)
         ScModule* pScMod = SC_MOD();
-        pScMod->ViewShellChanged();
+        pScMod->ViewShellChanged(/*bStopEditing=*/ !comphelper::LibreOfficeKit::isActive());
 
         ActivateView( true, bFirstActivate );
 
@@ -154,7 +163,7 @@ void ScTabViewShell::Activate(bool bMDI)
             }
         }
 
-        UpdateInputHandler( true );
+        UpdateInputHandler( /*bForce=*/ true, /*bStopEditing=*/ !comphelper::LibreOfficeKit::isActive() );
 
         if ( bFirstActivate )
         {
@@ -237,7 +246,7 @@ void ScTabViewShell::Deactivate(bool bMDI)
     bIsActive = false;
     ScInputHandler* pHdl = SC_MOD()->GetInputHdl(this);
 
-    if( bMDI )
+    if( bMDI && !comphelper::LibreOfficeKit::isActive())
     {
         //  during shell deactivation, shells must not be switched, or the loop
         //  through the shell stack (in SfxDispatcher::DoDeactivate_Impl) will not work
@@ -275,12 +284,15 @@ void ScTabViewShell::SetActive()
 
 bool ScTabViewShell::PrepareClose(bool bUI)
 {
+    BoolLock aBoolLock(bInPrepareClose);
     // Call EnterHandler even in formula mode here,
     // so a formula change in an embedded object isn't lost
     // (ScDocShell::PrepareClose isn't called then).
     ScInputHandler* pHdl = SC_MOD()->GetInputHdl( this );
     if ( pHdl && pHdl->IsInputMode() )
+    {
         pHdl->EnterHandler();
+    }
 
     // draw text edit mode must be closed
     FuPoor* pPoor = GetDrawFuncPtr();
@@ -1669,6 +1681,8 @@ ScTabViewShell::ScTabViewShell( SfxViewFrame* pViewFrame,
     bInFormatDialog(false),
     bReadOnly(false),
     bForceFocusOnCurCell(false),
+    bInPrepareClose(false),
+    bInDispose(false),
     nCurRefDlgId(0),
     pAccessibilityBroadcaster(nullptr),
     mbInSwitch(false)
@@ -1737,6 +1751,8 @@ ScTabViewShell::ScTabViewShell( SfxViewFrame* pViewFrame,
 
 ScTabViewShell::~ScTabViewShell()
 {
+    bInDispose = true;
+
     // Notify other LOK views that we are going away.
     SfxLokHelper::notifyOtherViews(this, LOK_CALLBACK_VIEW_CURSOR_VISIBLE, "visible", "false");
     SfxLokHelper::notifyOtherViews(this, LOK_CALLBACK_TEXT_VIEW_SELECTION, "selection", "");
diff --git a/sc/source/ui/view/tabvwsh5.cxx b/sc/source/ui/view/tabvwsh5.cxx
index 855c6605..f46bbbf 100644
--- a/sc/source/ui/view/tabvwsh5.cxx
+++ b/sc/source/ui/view/tabvwsh5.cxx
@@ -19,6 +19,7 @@
 
 #include "scitems.hxx"
 #include <svl/hint.hxx>
+#include <comphelper/lok.hxx>
 #include <svl/zforlist.hxx>
 #include <svx/numfmtsh.hxx>
 #include <svx/numinf.hxx>
@@ -235,8 +236,14 @@ void ScTabViewShell::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
 
             case FID_KILLEDITVIEW:
             case FID_KILLEDITVIEW_NOPAINT:
-                StopEditShell();
-                KillEditView( nSlot == FID_KILLEDITVIEW_NOPAINT );
+                if (!comphelper::LibreOfficeKit::isActive()
+                    || this == SfxViewShell::Current()
+                    || bInPrepareClose
+                    || bInDispose)
+                {
+                    StopEditShell();
+                    KillEditView( nSlot == FID_KILLEDITVIEW_NOPAINT );
+                }
                 break;
 
             case SFX_HINT_DOCCHANGED:


More information about the Libreoffice-commits mailing list