From 45fa73f87258f51bf37c92052723c4b99c49dc2d Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Tue, 27 Sep 2016 13:24:38 +0200 Subject: 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 --- sw/qa/extras/tiledrendering/tiledrendering.cxx | 47 ++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) (limited to 'sw/qa/extras') diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx index 1e1a6bbc0a40..47beefc70e54 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(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(); -- cgit