summaryrefslogtreecommitdiff
path: root/starmath
diff options
context:
space:
mode:
authorTakeshi Abe <tabe@fixedpoint.jp>2017-02-21 12:48:33 +0900
committerAndras Timar <andras.timar@collabora.com>2017-02-24 12:24:45 +0100
commit1d05310eb005e3de976f63588dad73025a3d5274 (patch)
tree2fbe573a506ee727aca9dc17eb875ab518ca5f92 /starmath
parent43c1a470b27481be71ba3ad25d1eff3f80e644c0 (diff)
tdf#106116 "Previous Marker" changes selection only when needed
This fixes a hang caused by repeated Shift+F4. Although it seems a regression from 2af1f5691e8d64afd5246d245d7876b5a2cd5cd8, the original code of SmEditWindow::SelPrevMark() had been doomed due to conditional loop depending on obscure signed/unsigned conversion. Change-Id: I61f630eec44b285dc1f1c27097acde4b48ed2991 Reviewed-on: https://gerrit.libreoffice.org/34503 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Takeshi Abe <tabe@fixedpoint.jp> (cherry picked from commit 3efdd925e0ae1c080fbef3f1f79865eb6e172c68) Reviewed-on: https://gerrit.libreoffice.org/34504 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com> (cherry picked from commit eac1221ff124186887b23a2f7e7b57038bd08a43)
Diffstat (limited to 'starmath')
-rw-r--r--starmath/qa/cppunit/test_starmath.cxx8
-rw-r--r--starmath/source/edit.cxx36
2 files changed, 18 insertions, 26 deletions
diff --git a/starmath/qa/cppunit/test_starmath.cxx b/starmath/qa/cppunit/test_starmath.cxx
index 05cddc500d8e..f7f608c163c7 100644
--- a/starmath/qa/cppunit/test_starmath.cxx
+++ b/starmath/qa/cppunit/test_starmath.cxx
@@ -133,6 +133,14 @@ void Test::editMarker()
m_pEditWindow->Delete();
m_pEditWindow->InsertText("b");
+ // tdf#106116: should be safe i.e. do nothing
+ m_pEditWindow->SelPrevMark();
+ auto aSelection = m_pEditWindow->GetSelection();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), aSelection.nStartPara);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(9), aSelection.nStartPos);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), aSelection.nEndPara);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(9), aSelection.nEndPos);
+
m_pEditWindow->Flush();
OUString sFinalText = m_pEditWindow->GetText();
CPPUNIT_ASSERT_EQUAL_MESSAGE("Should be a under b under c", sTargetText, sFinalText);
diff --git a/starmath/source/edit.cxx b/starmath/source/edit.cxx
index 43fc7557e7e2..ff473f9ce503 100644
--- a/starmath/source/edit.cxx
+++ b/starmath/source/edit.cxx
@@ -878,36 +878,20 @@ void SmEditWindow::SelPrevMark()
if (pEditEngine && pEditView)
{
ESelection eSelection = pEditView->GetSelection();
- sal_Int32 nPos = -1;
+ sal_Int32 nPara = eSelection.nStartPara;
sal_Int32 nMax = eSelection.nStartPos;
- OUString aText(pEditEngine->GetText(eSelection.nStartPara));
- OUString aMark("<?>");
- sal_Int32 nCounts = pEditEngine->GetParagraphCount();
-
- do
- {
- sal_Int32 nMarkIndex = aText.indexOf(aMark);
- while ((nMarkIndex < nMax) && (nMarkIndex != -1))
- {
- nPos = nMarkIndex;
- nMarkIndex = aText.indexOf(aMark, nMarkIndex + 1);
- }
-
- if (nPos == -1)
- {
- eSelection.nStartPara--;
- aText = pEditEngine->GetText(eSelection.nStartPara);
- nMax = aText.getLength();
- }
- }
- while ((eSelection.nStartPara < nCounts) &&
- (nPos == -1));
+ OUString aText(pEditEngine->GetText(nPara));
+ const OUString aMark("<?>");
+ sal_Int32 nPos;
- if (nPos != -1)
+ while ( (nPos = aText.lastIndexOf(aMark, nMax)) < 0 )
{
- pEditView->SetSelection(ESelection(
- eSelection.nStartPara, nPos, eSelection.nStartPara, nPos + 3));
+ if (--nPara < 0)
+ return;
+ aText = pEditEngine->GetText(nPara);
+ nMax = aText.getLength();
}
+ pEditView->SetSelection(ESelection(nPara, nPos, nPara, nPos + 3));
}
}