summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2016-07-20 11:33:10 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2016-07-21 10:43:44 +0200
commit6399df1eebb3eee96640d91002ab84a85fe558e1 (patch)
tree893318074b4c2fccdc15817c95cc4c5b81fe54cf
parent044b9fdd6890b4fd34324d44fabb675daa8ff356 (diff)
sd lok: decouple vcl window focus from cursor visibility
The problem was the the blinking cursor was hidden when another vcl window got its focus, so it wasn't possible to edit two shape text in parallel in two windows. The code path is like this: - show cursor, cursor is created: SdrObjEditView::SdrBeginTextEdit() -> OutlinerView::ShowCursor() - show cursor, focus case: sd::FuText::Activate() -> OutlinerView::ShowCursor() - hide cursor, cursor is deleted: SdrObjEditView::SdrEndTextEdit() -> OutlinerView::HideCursor() - hide cursor, focus case: sd::FuText::Deactivate() -> OutlinerView::HideCursor() So add a new optional bool parameter that allows not emitting the LOK_CALLBACK_CURSOR_VISIBLE callback in the focus change case. Also, if we're at it, make sure that painting emits no show/cursor LOK callbacks. Change-Id: I1068a1b1f5cd76fd09b5a79066834bfb0daebc77 Reviewed-on: https://gerrit.libreoffice.org/27335 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org> (cherry picked from commit 6ea8084487411feea049f57712979fba4ad2fbce)
-rw-r--r--editeng/source/editeng/editeng.cxx2
-rw-r--r--editeng/source/editeng/editview.cxx8
-rw-r--r--editeng/source/outliner/outlvw.cxx8
-rw-r--r--include/editeng/editview.hxx4
-rw-r--r--include/editeng/outliner.hxx4
-rw-r--r--sd/qa/unit/tiledrendering/tiledrendering.cxx40
-rw-r--r--sd/source/ui/func/futext.cxx4
-rw-r--r--svx/source/svdraw/svdedxv.cxx2
8 files changed, 55 insertions, 17 deletions
diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx
index f984d0699634..bf2746cb283b 100644
--- a/editeng/source/editeng/editeng.cxx
+++ b/editeng/source/editeng/editeng.cxx
@@ -1435,7 +1435,7 @@ void EditEngine::SetUpdateMode( bool bUpdate )
{
pImpEditEngine->SetUpdateMode( bUpdate );
if ( pImpEditEngine->pActiveView )
- pImpEditEngine->pActiveView->ShowCursor( false, false );
+ pImpEditEngine->pActiveView->ShowCursor( false, false, /*bActivate=*/true );
}
bool EditEngine::GetUpdateMode() const
diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx
index 66b0425d8900..7ace1b879fbc 100644
--- a/editeng/source/editeng/editview.cxx
+++ b/editeng/source/editeng/editview.cxx
@@ -392,7 +392,7 @@ void EditView::Command( const CommandEvent& rCEvt )
pImpEditView->Command( rCEvt );
}
-void EditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
+void EditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor, bool bActivate )
{
if ( pImpEditView->pEditEngine->HasView( this ) )
{
@@ -401,18 +401,18 @@ void EditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
bGotoCursor = false;
pImpEditView->ShowCursor( bGotoCursor, bForceVisCursor );
- if (comphelper::LibreOfficeKit::isActive())
+ if (comphelper::LibreOfficeKit::isActive() && !bActivate)
{
pImpEditView->libreOfficeKitViewCallback(LOK_CALLBACK_CURSOR_VISIBLE, OString::boolean(true).getStr());
}
}
}
-void EditView::HideCursor()
+void EditView::HideCursor(bool bDeactivate)
{
pImpEditView->GetCursor()->Hide();
- if (comphelper::LibreOfficeKit::isActive())
+ if (comphelper::LibreOfficeKit::isActive() && !bDeactivate)
{
pImpEditView->libreOfficeKitViewCallback(LOK_CALLBACK_CURSOR_VISIBLE, OString::boolean(false).getStr());
}
diff --git a/editeng/source/outliner/outlvw.cxx b/editeng/source/outliner/outlvw.cxx
index 12e6f9130d7e..a6fed496f83e 100644
--- a/editeng/source/outliner/outlvw.cxx
+++ b/editeng/source/outliner/outlvw.cxx
@@ -1234,14 +1234,14 @@ bool OutlinerView::HasSelection() const
return pEditView->HasSelection();
}
-void OutlinerView::ShowCursor( bool bGotoCursor )
+void OutlinerView::ShowCursor( bool bGotoCursor, bool bActivate )
{
- pEditView->ShowCursor( bGotoCursor );
+ pEditView->ShowCursor( bGotoCursor, /*bForceVisCursor=*/true, bActivate );
}
-void OutlinerView::HideCursor()
+void OutlinerView::HideCursor(bool bDeactivate)
{
- pEditView->HideCursor();
+ pEditView->HideCursor(bDeactivate);
}
void OutlinerView::SetWindow( vcl::Window* pWin )
diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx
index d4e88b288d13..818f503d129f 100644
--- a/include/editeng/editview.hxx
+++ b/include/editeng/editview.hxx
@@ -111,8 +111,8 @@ public:
void Invalidate();
Pair Scroll( long nHorzScroll, long nVertScroll, ScrollRangeCheck nRangeCheck = ScrollRangeCheck::NoNegative );
- void ShowCursor( bool bGotoCursor = true, bool bForceVisCursor = true );
- void HideCursor();
+ void ShowCursor( bool bGotoCursor = true, bool bForceVisCursor = true, bool bActivate = false );
+ void HideCursor( bool bDeactivate = false );
void SetSelectionMode( EESelectionMode eMode );
diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx
index d467ef56419a..99b79fe9c9c8 100644
--- a/include/editeng/outliner.hxx
+++ b/include/editeng/outliner.hxx
@@ -231,8 +231,8 @@ public:
void ReleaseMouse();
bool MouseMove( const MouseEvent& );
- void ShowCursor( bool bGotoCursor = true );
- void HideCursor();
+ void ShowCursor( bool bGotoCursor = true, bool bActivate = false );
+ void HideCursor( bool bDeactivate = false );
Outliner* GetOutliner() const { return pOwner; }
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index acff325c6498..e26c0334209e 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -65,6 +65,7 @@ public:
void testResizeTableColumn();
void testViewCursors();
void testViewCursorParts();
+ void testCursorViews();
CPPUNIT_TEST_SUITE(SdTiledRenderingTest);
CPPUNIT_TEST(testRegisterCallback);
@@ -86,6 +87,7 @@ public:
CPPUNIT_TEST(testResizeTableColumn);
CPPUNIT_TEST(testViewCursors);
CPPUNIT_TEST(testViewCursorParts);
+ CPPUNIT_TEST(testCursorViews);
CPPUNIT_TEST_SUITE_END();
private:
@@ -818,11 +820,13 @@ public:
bool m_bGraphicViewSelectionInvalidated;
/// Our current part, to be able to decide if a view cursor/selection is relevant for us.
int m_nPart;
+ bool m_bCursorVisibleChanged;
ViewCallback()
: m_bGraphicSelectionInvalidated(false),
m_bGraphicViewSelectionInvalidated(false),
- m_nPart(0)
+ m_nPart(0),
+ m_bCursorVisibleChanged(false)
{
}
@@ -850,6 +854,11 @@ public:
m_bGraphicViewSelectionInvalidated = true;
}
break;
+ case LOK_CALLBACK_CURSOR_VISIBLE:
+ {
+ m_bCursorVisibleChanged = true;
+ }
+ break;
}
}
};
@@ -925,6 +934,35 @@ void SdTiledRenderingTest::testViewCursorParts()
comphelper::LibreOfficeKit::setActive(false);
}
+void SdTiledRenderingTest::testCursorViews()
+{
+ comphelper::LibreOfficeKit::setActive();
+
+ // Create the first view.
+ SdXImpressDocument* pXImpressDocument = createDoc("shape.odp");
+ ViewCallback aView1;
+ SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView1);
+
+ // Begin text edit on the only object on the slide.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pObject, pView->GetSdrPageView());
+ pView->SdrBeginTextEdit(pObject);
+
+ // Make sure that cursor state is not changed just because we create a second view.
+ aView1.m_bCursorVisibleChanged = false;
+ SfxLokHelper::createView();
+ pXImpressDocument->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(!aView1.m_bCursorVisibleChanged);
+
+ mxComponent->dispose();
+ mxComponent.clear();
+ comphelper::LibreOfficeKit::setActive(false);
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SdTiledRenderingTest);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sd/source/ui/func/futext.cxx b/sd/source/ui/func/futext.cxx
index cb0e848bdab7..f1bea725f2cd 100644
--- a/sd/source/ui/func/futext.cxx
+++ b/sd/source/ui/func/futext.cxx
@@ -977,7 +977,7 @@ void FuText::Activate()
OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
if (pOLV)
- pOLV->ShowCursor();
+ pOLV->ShowCursor(/*bGotoCursor=*/true, /*bActivate=*/true);
FuConstruct::Activate();
@@ -990,7 +990,7 @@ void FuText::Deactivate()
OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
if (pOLV)
- pOLV->HideCursor();
+ pOLV->HideCursor(/*bDeactivate=*/true);
mpView->SetHitTolerancePixel( HITPIX );
diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx
index 7fe6dd3840c8..ac38317c1d81 100644
--- a/svx/source/svdraw/svdedxv.cxx
+++ b/svx/source/svdraw/svdedxv.cxx
@@ -385,7 +385,7 @@ void SdrObjEditView::ImpPaintOutlinerView(OutlinerView& rOutlView, const Rectang
}
}
- rOutlView.ShowCursor();
+ rOutlView.ShowCursor(/*bGotoCursor=*/true, /*bActivate=*/true);
}
void SdrObjEditView::ImpInvalidateOutlinerView(OutlinerView& rOutlView) const