Kaydet (Commit) c34fc452 authored tarafından Mike Kaganski's avatar Mike Kaganski

tdf#105625 related: also check selection across field boundaries

The problem in callnk.cxx was that when selecting 1 char to the right
using keyboard, and exiting field boundary, nCmp pointed to previous
position (inside field), and then compared to position to the left
(which also may be inside field), thus missing call change link (and
read-only state change). Seems that this was a mistake in commit
740efbb1.

In pam.cxx, if cursor was to the left of field, and then selected
1 char to the right to cross field's boundary, then both PaM's point
and mark had same fieldmark, but point was outside, and mark inside,
and as code didn't check this condition, so read-only state wasn't
properly set.

Unit test is augmented to check the second problem.

Change-Id: I7323e53eeb261b4ccdc0f9e36cc0956b373f104d
Reviewed-on: https://gerrit.libreoffice.org/33790Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMike Kaganski <mike.kaganski@collabora.com>
üst f2278a10
......@@ -3,6 +3,7 @@
<office:body>
<office:text>
<text:p><field:fieldmark field:type="vnd.oasis.opendocument.field.FORMCHECKBOX"/></text:p>
<text:p><field:fieldmark-start field:type="vnd.oasis.opendocument.field.FORMTEXT"/>Field<field:fieldmark-end/></text:p>
</office:text>
</office:body>
</office:document>
\ No newline at end of file
......@@ -4273,18 +4273,24 @@ void SwUiWriterTest::testTdf105417()
void SwUiWriterTest::testTdf105625()
{
// We should be able to edit at positions adjacent to fields.
// Check if the start and the end of the only paragraph are not protected
// (they are adjacent to FORMCHECKBOX)
SwDoc* pDoc = createDoc("tdf105625.fodt");
SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
uno::Reference<uno::XComponentContext> xComponentContext(comphelper::getProcessComponentContext());
// Ensure correct initial setting
comphelper::ConfigurationHelper::writeDirectKey(xComponentContext, "org.openoffice.Office.Writer/", "Cursor/Option", "IgnoreProtectedArea", css::uno::Any(false), comphelper::EConfigurationModes::Standard);
// We should be able to edit at positions adjacent to fields.
// Check if the start and the end of the 1st paragraph are not protected
// (they are adjacent to FORMCHECKBOX)
pWrtShell->SttPara();
CPPUNIT_ASSERT_EQUAL(false, pWrtShell->HasReadonlySel());
pWrtShell->EndPara();
CPPUNIT_ASSERT_EQUAL(false, pWrtShell->HasReadonlySel());
// 2nd paragraph - FORMTEXT
pWrtShell->Down(/*bSelect=*/false);
// Check selection across FORMTEXT field boundary - must be read-only
pWrtShell->SttPara();
pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/true, 1, /*bBasicCall=*/false);
CPPUNIT_ASSERT_EQUAL(true, pWrtShell->HasReadonlySel());
}
CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest);
......
......@@ -195,8 +195,8 @@ SwCallLink::~SwCallLink()
{
const OUString rText = pCNd->GetTextNode()->GetText();
if( !nCmp ||
g_pBreakIt->GetBreakIter()->getScriptType( rText, nCmp )
!= g_pBreakIt->GetBreakIter()->getScriptType( rText, nCmp - 1 ))
g_pBreakIt->GetBreakIter()->getScriptType( rText, nContent )
!= g_pBreakIt->GetBreakIter()->getScriptType(rText, nAktContent))
{
rShell.CallChgLnk();
return;
......
......@@ -691,7 +691,9 @@ bool SwPaM::HasReadonlySel( bool bFormView, bool /*bAnnotationMode*/ ) const
bool bAtStartA = (pA != nullptr) && (pA->GetMarkStart() == *GetPoint());
bool bAtStartB = (pB != nullptr) && (pB->GetMarkStart() == *GetMark());
if (pA != pB)
if ((pA == pB) && (bAtStartA != bAtStartB))
bRet = true;
else if (pA != pB)
{
// If both points are either outside or at marks edges (i.e. selection either
// touches fields, or fully encloses it), then don't disable editing
......
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