Kaydet (Commit) 3de68db1 authored tarafından Miklos Vajna's avatar Miklos Vajna

SwEditWin::SetCursorTwipPosition: support creating a selection

The Android LOK client always creates a text selection by double
clicking on a word, and then the start/end of the selection can be
adjusted using handles.  In the GTK LOK client, it makes sense to allow
the desktop-style selection, where you click somewhere, move the mouse
and finally release the mouse to create a selection. That can be mapped
to settextselect-reset on mouse-down, and settextselect-end on
mouse-move easily.

The only problem was that SetCursorTwipPosition() assumed that there is
a selection already -- fix that by  adding the missing Stt/EndSelect()
calls and limiting the lifetime of the SwMvContext instance.

Change-Id: Iaeeadd8e4d9030614ee069b9fcfa269ce74ed58a
üst f9bef754
...@@ -163,6 +163,11 @@ void SwTiledRenderingTest::testSetTextSelection() ...@@ -163,6 +163,11 @@ void SwTiledRenderingTest::testSetTextSelection()
pXTextDocument->setTextSelection(LOK_SETTEXTSELECTION_START, aStart.getX(), aStart.getY()); pXTextDocument->setTextSelection(LOK_SETTEXTSELECTION_START, aStart.getX(), aStart.getY());
// The new selection must include the first word, too -- but not the ending dot. // The new selection must include the first word, too -- but not the ending dot.
CPPUNIT_ASSERT_EQUAL(OUString("Aaa bbb"), pShellCrsr->GetTxt()); CPPUNIT_ASSERT_EQUAL(OUString("Aaa bbb"), pShellCrsr->GetTxt());
// Next: test that LOK_SETTEXTSELECTION_RESET + LOK_SETTEXTSELECTION_END can be used to create a selection.
pXTextDocument->setTextSelection(LOK_SETTEXTSELECTION_RESET, aStart.getX(), aStart.getY());
pXTextDocument->setTextSelection(LOK_SETTEXTSELECTION_END, aStart.getX() + 1000, aStart.getY());
CPPUNIT_ASSERT_EQUAL(OUString("Aaa b"), pShellCrsr->GetTxt());
} }
void SwTiledRenderingTest::testSetGraphicSelection() void SwTiledRenderingTest::testSetGraphicSelection()
......
...@@ -6247,16 +6247,29 @@ void SwEditWin::SetCursorTwipPosition(const Point& rPosition, bool bPoint, bool ...@@ -6247,16 +6247,29 @@ void SwEditWin::SetCursorTwipPosition(const Point& rPosition, bool bPoint, bool
// Not an SwWrtShell, as that would make SwCrsrShell::GetCrsr() inaccessible. // Not an SwWrtShell, as that would make SwCrsrShell::GetCrsr() inaccessible.
SwEditShell& rShell = m_rView.GetWrtShell(); SwEditShell& rShell = m_rView.GetWrtShell();
SwMvContext aMvContext(&rShell);
if (bClearMark) bool bCreateSelection = false;
rShell.ClearMark(); {
// If the mark is to be updated, then exchange the point and mark before SwMvContext aMvContext(&rShell);
// and after, as we can't easily set the mark. if (bClearMark)
if (!bPoint) rShell.ClearMark();
rShell.getShellCrsr(/*bBlock=*/false)->Exchange(); else
rShell.SetCrsr(rPosition); bCreateSelection = !rShell.HasMark();
if (!bPoint)
rShell.getShellCrsr(/*bBlock=*/false)->Exchange(); if (bCreateSelection)
m_rView.GetWrtShell().SttSelect();
// If the mark is to be updated, then exchange the point and mark before
// and after, as we can't easily set the mark.
if (!bPoint)
rShell.getShellCrsr(/*bBlock=*/false)->Exchange();
rShell.SetCrsr(rPosition);
if (!bPoint)
rShell.getShellCrsr(/*bBlock=*/false)->Exchange();
}
if (bCreateSelection)
m_rView.GetWrtShell().EndSelect();
} }
void SwEditWin::SetGraphicTwipPosition(bool bStart, const Point& rPosition) void SwEditWin::SetGraphicTwipPosition(bool bStart, const Point& rPosition)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment