[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-5.1' - include/sfx2 sfx2/source sw/qa sw/source

Miklos Vajna vmiklos at collabora.co.uk
Wed Sep 28 11:01:04 UTC 2016


 include/sfx2/viewsh.hxx                        |    2 +
 sfx2/source/view/viewsh.cxx                    |    5 ++
 sw/qa/extras/tiledrendering/tiledrendering.cxx |   47 +++++++++++++++++++++++--
 sw/source/uibase/docvw/SidebarWin.cxx          |    6 +++
 4 files changed, 58 insertions(+), 2 deletions(-)

New commits:
commit d44e2743ecda9bed183673812c6a2c1574061f15
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Sep 27 13:24:38 2016 +0200

    sw: avoid emitting invalid cursor pos during end text edit of comment
    
    A comment text edit (provided by editeng) works with relative twip
    coordinates, conversion of the cursor position to absolute twips happens
    in ImpEditView::ShowCursor(), provided that the pOutWin member has a map
    mode origin that respresents the offset correctly.
    
    This is not true during SwSidebarWin::DeactivatePostIt(), the map mode
    origin is already reset back to 0, so just don't emit callbacks during
    shutdown, the sw body text cursor will be shown later anyway.
    
    (cherry picked from commit 45fa73f87258f51bf37c92052723c4b99c49dc2d)
    
    Conflicts:
    	include/sfx2/viewsh.hxx
    
    Change-Id: I02c15bb9fad99db8e43fd2f37df770dd165be788

diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx
index d662e08..fb93674 100644
--- a/include/sfx2/viewsh.hxx
+++ b/include/sfx2/viewsh.hxx
@@ -335,6 +335,8 @@ public:
     void setTiledPainting(bool bTiledPainting);
     /// Are we doing tiled painting?
     bool isTiledPainting() const;
+    /// Get if we are doing tiled painting.
+    bool getTiledPainting() const;
     /// See lok::Document::getPart().
     virtual int getPart() const;
     virtual void dumpAsXml(struct _xmlTextWriter* pWriter) const;
diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx
index 3e557e6..ad04649 100644
--- a/sfx2/source/view/viewsh.cxx
+++ b/sfx2/source/view/viewsh.cxx
@@ -1665,6 +1665,11 @@ bool SfxViewShell::isTiledPainting() const
     return pImp->m_bTiledPainting;
 }
 
+bool SfxViewShell::getTiledPainting() const
+{
+    return pImp->m_bTiledPainting;
+}
+
 int SfxViewShell::getPart() const
 {
     return 0;
diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx
index b61a110..9da36aa 100644
--- a/sw/qa/extras/tiledrendering/tiledrendering.cxx
+++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx
@@ -76,6 +76,7 @@ public:
     void testCreateViewGraphicSelection();
     void testCreateViewTextSelection();
     void testRedlineColors();
+    void testCommentEndTextEdit();
 
     CPPUNIT_TEST_SUITE(SwTiledRenderingTest);
     CPPUNIT_TEST(testRegisterCallback);
@@ -115,10 +116,11 @@ public:
     CPPUNIT_TEST(testCreateViewGraphicSelection);
     CPPUNIT_TEST(testCreateViewTextSelection);
     CPPUNIT_TEST(testRedlineColors);
+    CPPUNIT_TEST(testCommentEndTextEdit);
     CPPUNIT_TEST_SUITE_END();
 
 private:
-    SwXTextDocument* createDoc(const char* pName);
+    SwXTextDocument* createDoc(const char* pName = nullptr);
     static void callback(int nType, const char* pPayload, void* pData);
     void callbackImpl(int nType, const char* pPayload);
     Rectangle m_aInvalidation;
@@ -148,7 +150,10 @@ SwTiledRenderingTest::SwTiledRenderingTest()
 
 SwXTextDocument* SwTiledRenderingTest::createDoc(const char* pName)
 {
-    load(DATA_DIRECTORY, pName);
+    if (!pName)
+        loadURL("private:factory/swriter", nullptr);
+    else
+        load(DATA_DIRECTORY, pName);
 
     SwXTextDocument* pTextDocument = dynamic_cast<SwXTextDocument*>(mxComponent.get());
     CPPUNIT_ASSERT(pTextDocument);
@@ -622,6 +627,7 @@ class ViewCallback
 {
 public:
     bool m_bOwnCursorInvalidated;
+    bool m_bOwnCursorAtOrigin;
     Rectangle m_aOwnCursor;
     bool m_bViewCursorInvalidated;
     Rectangle m_aViewCursor;
@@ -636,6 +642,7 @@ public:
 
     ViewCallback()
         : m_bOwnCursorInvalidated(false),
+          m_bOwnCursorAtOrigin(false),
           m_bViewCursorInvalidated(false),
           m_bOwnSelectionSet(false),
           m_bViewSelectionSet(false),
@@ -674,6 +681,8 @@ public:
             m_aOwnCursor.setY(aSeq[1].toInt32());
             m_aOwnCursor.setWidth(aSeq[2].toInt32());
             m_aOwnCursor.setHeight(aSeq[3].toInt32());
+            if (m_aOwnCursor.getX() == 0 && m_aOwnCursor.getY() == 0)
+                m_bOwnCursorAtOrigin = true;
         }
         break;
         case LOK_CALLBACK_INVALIDATE_VIEW_CURSOR:
@@ -1461,6 +1470,40 @@ void SwTiledRenderingTest::testRedlineColors()
     comphelper::LibreOfficeKit::setActive(false);
 }
 
+void SwTiledRenderingTest::testCommentEndTextEdit()
+{
+    // Create a document, type a character and remember the cursor position.
+    comphelper::LibreOfficeKit::setActive();
+    SwXTextDocument* pXTextDocument = createDoc();
+    ViewCallback aView1;
+    SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView1);
+    pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0);
+    pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0);
+    Rectangle aBodyCursor = aView1.m_aOwnCursor;
+
+    // Create a comment and type a character there as well.
+    const int nCtrlAltC = KEY_MOD1 + KEY_MOD2 + 512 + 'c' - 'a';
+    pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'c', nCtrlAltC);
+    pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'c', nCtrlAltC);
+    Scheduler::ProcessEventsToIdle();
+    pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0);
+    pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0);
+
+    // End comment text edit by clicking in the body text area, and assert that
+    // no unexpected cursor callbacks are emitted at origin (top left corner of
+    // the document).
+    aView1.m_bOwnCursorAtOrigin = false;
+    pXTextDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, aBodyCursor.getX(), aBodyCursor.getY(), 1, MOUSE_LEFT, 0);
+    pXTextDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, aBodyCursor.getX(), aBodyCursor.getY(), 1, MOUSE_LEFT, 0);
+    // This failed, the cursor was at 0, 0 at some point during end text edit
+    // of the comment.
+    CPPUNIT_ASSERT(!aView1.m_bOwnCursorAtOrigin);
+
+    mxComponent->dispose();
+    mxComponent.clear();
+    comphelper::LibreOfficeKit::setActive(false);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SwTiledRenderingTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/uibase/docvw/SidebarWin.cxx b/sw/source/uibase/docvw/SidebarWin.cxx
index fb8031c..d6eafd3 100644
--- a/sw/source/uibase/docvw/SidebarWin.cxx
+++ b/sw/source/uibase/docvw/SidebarWin.cxx
@@ -1266,8 +1266,14 @@ void SwSidebarWin::DeactivatePostIt()
     mpOutliner->CompleteOnlineSpelling();
 
     SetViewState(ViewState::NORMAL);
+    // Make sure this view doesn't emit LOK callbacks during the update, as the
+    // sidebar window's SidebarTextControl doesn't have a valid twip offset
+    // (map mode origin) during that operation.
+    bool bTiledPainting = mrView.getTiledPainting();
+    mrView.setTiledPainting(true);
     // write the visible text back into the SwField
     UpdateData();
+    mrView.setTiledPainting(bTiledPainting);
 
     if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
         GetOutlinerView()->SetBackgroundColor(COL_TRANSPARENT);


More information about the Libreoffice-commits mailing list