[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