[Libreoffice-commits] core.git: include/sfx2 sfx2/source sw/qa sw/source

Miklos Vajna vmiklos at collabora.co.uk
Tue Sep 27 11:27:46 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 45fa73f87258f51bf37c92052723c4b99c49dc2d
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.
    
    Change-Id: I02c15bb9fad99db8e43fd2f37df770dd165be788

diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx
index 27744e3..6583801 100644
--- a/include/sfx2/viewsh.hxx
+++ b/include/sfx2/viewsh.hxx
@@ -331,6 +331,8 @@ public:
     void setTiledSearching(bool bTiledSearching);
     /// Set if we are doing tiled painting.
     void setTiledPainting(bool bTiledPainting);
+    /// 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 4a851bf..dacd236 100644
--- a/sfx2/source/view/viewsh.cxx
+++ b/sfx2/source/view/viewsh.cxx
@@ -1508,6 +1508,11 @@ void SfxViewShell::setTiledPainting(bool bTiledPainting)
     pImpl->m_bTiledPainting = bTiledPainting;
 }
 
+bool SfxViewShell::getTiledPainting() const
+{
+    return pImpl->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 1e1a6bb..47beefc 100644
--- a/sw/qa/extras/tiledrendering/tiledrendering.cxx
+++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx
@@ -75,6 +75,7 @@ public:
     void testCreateViewGraphicSelection();
     void testCreateViewTextSelection();
     void testRedlineColors();
+    void testCommentEndTextEdit();
 
     CPPUNIT_TEST_SUITE(SwTiledRenderingTest);
     CPPUNIT_TEST(testRegisterCallback);
@@ -114,10 +115,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;
@@ -147,7 +149,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);
@@ -621,6 +626,7 @@ class ViewCallback
 {
 public:
     bool m_bOwnCursorInvalidated;
+    bool m_bOwnCursorAtOrigin;
     Rectangle m_aOwnCursor;
     bool m_bViewCursorInvalidated;
     Rectangle m_aViewCursor;
@@ -635,6 +641,7 @@ public:
 
     ViewCallback()
         : m_bOwnCursorInvalidated(false),
+          m_bOwnCursorAtOrigin(false),
           m_bViewCursorInvalidated(false),
           m_bOwnSelectionSet(false),
           m_bViewSelectionSet(false),
@@ -673,6 +680,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:
@@ -1460,6 +1469,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 1e815ab..0b144e9 100644
--- a/sw/source/uibase/docvw/SidebarWin.cxx
+++ b/sw/source/uibase/docvw/SidebarWin.cxx
@@ -1260,8 +1260,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