summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolan.mcnamara@collabora.com>2024-02-27 19:49:41 +0000
committerCaolán McNamara <caolan.mcnamara@collabora.com>2024-02-28 10:10:44 +0100
commit9d3366f5b392418dc83bc0adbe3d215cff4b3605 (patch)
tree868d4fe87250380661cab1e1b48e15c8d06b315a
parentfa4a68dc3e62bb76bc29309e15741375f2663cb6 (diff)
don't use EEControlBits::FORMAT100 in inline editengine for kit mode
With multiple users the EditEngine for the first user is created during load of the document, before ScModelObj::initializeForTiledRendering is called, and that sets SetTextWysiwyg(true) ScInputHandler::UpdateRefDevice has... if ( bTextWysiwyg ... ) mpEditEngine->SetControlWord( ... | EEControlBits::FORMAT100 ); That FORMAT100 means that layout for such edit engines is done at a X/Y Scaling of 1 The first users editengine doesn't get any of that set, because TextWysiwyg is not true yet when it's created, and so matches the normal document rendering, but later joiners have TextWysiwyg set, so trigger this alternative path and so the mapmode doesn't match the other case and the two users have different results for the width of text in an active editengine. As it turns out, the results without FORMAT100 are the preferred ones, so make that explicit for kit. Change-Id: I76a78be1fca4af84c493d32bdd43f968ba072452 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164059 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
-rw-r--r--sc/qa/unit/tiledrendering/tiledrendering.cxx46
-rw-r--r--sc/source/ui/app/inputhdl.cxx10
2 files changed, 48 insertions, 8 deletions
diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx b/sc/qa/unit/tiledrendering/tiledrendering.cxx
index c9a005fd5136..d6eab7cafea2 100644
--- a/sc/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx
@@ -3562,18 +3562,50 @@ CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testInputHandlerSyncedZoom)
pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::F2);
Scheduler::ProcessEventsToIdle();
- const ScViewData* pViewData = ScDocShell::GetViewData();
- CPPUNIT_ASSERT(pViewData);
+ const ScViewData* pViewData1 = ScDocShell::GetViewData();
+ CPPUNIT_ASSERT(pViewData1);
// Get that active EditView
- EditView* pEditView = pViewData->GetEditView(SC_SPLIT_BOTTOMLEFT);
- CPPUNIT_ASSERT(pEditView);
- EditEngine& rEditEngine = pEditView->getEditEngine();
+ EditView* pEditView1 = pViewData1->GetEditView(SC_SPLIT_BOTTOMLEFT);
+ CPPUNIT_ASSERT(pEditView1);
+ EditEngine& rEditEngine1 = pEditView1->getEditEngine();
// These must match, if they don't then text will have a different width in edit and view modes
CPPUNIT_ASSERT_EQUAL_MESSAGE("EditEngine Ref Dev Zoom and ViewData Zoom should match",
- pViewData->GetZoomX(), rEditEngine.GetRefMapMode().GetScaleX());
+ pViewData1->GetZoomX(), rEditEngine1.GetRefMapMode().GetScaleX());
CPPUNIT_ASSERT_EQUAL_MESSAGE("EditEngine Ref Dev Zoom and ViewData Zoom should match",
- pViewData->GetZoomY(), rEditEngine.GetRefMapMode().GetScaleY());
+ pViewData1->GetZoomY(), rEditEngine1.GetRefMapMode().GetScaleY());
+
+ // Create a View #2
+ SfxLokHelper::createView();
+ pModelObj->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+
+ // Set View #2 to the same zoom as View #1
+ pModelObj->setClientVisibleArea(tools::Rectangle(0, 0, 17933, 4853));
+ pModelObj->setClientZoom(256, 256, 1333, 1333);
+
+ ScTabViewShell* pView2 = dynamic_cast<ScTabViewShell*>(SfxViewShell::Current());
+ CPPUNIT_ASSERT(pView2);
+ pView2->SetCursor(0, 5); // A6
+
+ Scheduler::ProcessEventsToIdle();
+
+ // Activate edit mode in that A6 cell
+ pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::F2);
+ pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::F2);
+ Scheduler::ProcessEventsToIdle();
+
+ const ScViewData* pViewData2 = ScDocShell::GetViewData();
+ CPPUNIT_ASSERT(pViewData2);
+
+ // Get the View #2 EditView
+ EditView* pEditView2 = pViewData2->GetEditView(SC_SPLIT_BOTTOMLEFT);
+ CPPUNIT_ASSERT(pEditView2);
+ EditEngine& rEditEngine2 = pEditView2->getEditEngine();
+ CPPUNIT_ASSERT(&rEditEngine1 != &rEditEngine2);
+ // Before the fix, these had different settings, resulting in the text
+ // dancing for the second user as they toggle in and out of edit mode, but
+ // each user should have the same settings.
+ CPPUNIT_ASSERT_EQUAL(rEditEngine1.GetControlWord(), rEditEngine2.GetControlWord());
}
CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testStatusBarLocale)
diff --git a/sc/source/ui/app/inputhdl.cxx b/sc/source/ui/app/inputhdl.cxx
index 8ea3f33157a9..1b261ac46d77 100644
--- a/sc/source/ui/app/inputhdl.cxx
+++ b/sc/source/ui/app/inputhdl.cxx
@@ -908,7 +908,15 @@ void ScInputHandler::UpdateRefDevice()
bool bTextWysiwyg = SC_MOD()->GetInputOptions().GetTextWysiwyg();
bool bInPlace = pActiveViewSh && pActiveViewSh->GetViewFrame().GetFrame().IsInPlace();
EEControlBits nCtrl = mpEditEngine->GetControlWord();
- if ( bTextWysiwyg || bInPlace )
+ bool bFormat100Percent = bTextWysiwyg || bInPlace;
+ // FORMAT100 is an odd thing only used by calc since #i51508# and possibly
+ // redundant at this stage by resolution independent text layout and
+ // rendering, at least for the kit case we want the text layout to be done
+ // accurately at the provided scaling of the reference device
+ if (comphelper::LibreOfficeKit::isActive())
+ bFormat100Percent = false;
+
+ if (bFormat100Percent)
nCtrl |= EEControlBits::FORMAT100; // EditEngine default: always format for 100%
else
nCtrl &= ~EEControlBits::FORMAT100; // when formatting for screen, use the actual MapMode