From e8fc0d70d59e0fc3f1aaf3627fa5d38f4ee7d048 Mon Sep 17 00:00:00 2001 From: Michael Meeks Date: Mon, 2 Dec 2019 21:03:05 +0000 Subject: lok: calc - store zoom in the view itself. Don't duplicate this on the ITiledRenderable interface, which is not a per-view construct, this just confuses everything. Store & restore the zoom level before/after rendering a tile - unfortunately this is not done by the most optimal view yet. Change-Id: I1f7dfaa353333f45c5601d49a9bca784d34fb81a Reviewed-on: https://gerrit.libreoffice.org/84280 Reviewed-by: Michael Meeks Tested-by: Michael Meeks --- include/vcl/ITiledRenderable.hxx | 4 --- sc/qa/unit/tiledrendering/tiledrendering.cxx | 50 ++++++++++++++++++++++++++++ sc/source/ui/unoobj/docuno.cxx | 33 ++++-------------- sc/source/ui/view/gridwin4.cxx | 7 ++++ sw/source/uibase/uno/unotxdoc.cxx | 3 -- 5 files changed, 64 insertions(+), 33 deletions(-) diff --git a/include/vcl/ITiledRenderable.hxx b/include/vcl/ITiledRenderable.hxx index 0cb93fd6f7d4..c1c5c1c0d924 100644 --- a/include/vcl/ITiledRenderable.hxx +++ b/include/vcl/ITiledRenderable.hxx @@ -96,11 +96,7 @@ namespace vcl class VCL_DLLPUBLIC ITiledRenderable { -protected: - int mnTilePixelWidth, mnTilePixelHeight; - int mnTileTwipWidth, mnTileTwipHeight; public: - virtual ~ITiledRenderable(); /** diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx b/sc/qa/unit/tiledrendering/tiledrendering.cxx index 1ae084e5eb49..b3b73fc03b0a 100644 --- a/sc/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx @@ -71,6 +71,7 @@ public: virtual void setUp() override; virtual void tearDown() override; + void testRowColumnHeaders(); void testRowColumnSelections(); void testSortAscendingDescending(); void testPartHash(); @@ -110,6 +111,7 @@ public: void testJumpToLastRowInvalidation(); CPPUNIT_TEST_SUITE(ScTiledRenderingTest); + CPPUNIT_TEST(testRowColumnHeaders); CPPUNIT_TEST(testRowColumnSelections); CPPUNIT_TEST(testSortAscendingDescending); CPPUNIT_TEST(testPartHash); @@ -1894,6 +1896,54 @@ void ScTiledRenderingTest::testJumpToLastRowInvalidation() CPPUNIT_ASSERT_EQUAL(tools::Rectangle(0, 13005, 26775, 127500255), aView1.m_aInvalidations[0]); } +// We need to ensure that views are not perterbed by rendering (!?) hmm ... +void ScTiledRenderingTest::testRowColumnHeaders() +{ + comphelper::LibreOfficeKit::setActive(); + + ScModelObj* pModelObj = createDoc("empty.ods"); + ScViewData* pViewData = ScDocShell::GetViewData(); + CPPUNIT_ASSERT(pViewData); + + // view #1 + ViewCallback aView1; + int nView1 = SfxLokHelper::getView(); + SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView1); + CPPUNIT_ASSERT(!lcl_hasEditView(*pViewData)); + + // view #2 + SfxLokHelper::createView(); + int nView2 = SfxLokHelper::getView(); + ViewCallback aView2; + pModelObj->initializeForTiledRendering(uno::Sequence()); + SfxViewShell::Current()->registerLibreOfficeKitViewCallback(&ViewCallback::callback, &aView2); + + // ViewRowColumnHeaders test + SfxLokHelper::setView(nView1); + OUString aHeaders1 = pModelObj->getRowColumnHeaders(tools::Rectangle(65,723,10410,4695)); + + SfxLokHelper::setView(nView2); + // 50% zoom + pModelObj->setClientVisibleArea(tools::Rectangle(0, 0, 22474, 47333)); + pModelObj->setClientZoom(256, 256, 6636, 6636); + OUString aHeaders2 = pModelObj->getRowColumnHeaders(tools::Rectangle(65,723,10410,4695)); + + // Check vs. view #1 + SfxLokHelper::setView(nView1); + OUString aHeaders1_2 = pModelObj->getRowColumnHeaders(tools::Rectangle(65,723,10410,4695)); + CPPUNIT_ASSERT_EQUAL(aHeaders1, aHeaders1_2); + + // Check vs. view #2 + SfxLokHelper::setView(nView2); + OUString aHeaders2_2 = pModelObj->getRowColumnHeaders(tools::Rectangle(65,723,10410,4695)); + CPPUNIT_ASSERT_EQUAL(aHeaders2, aHeaders2_2); + + SfxLokHelper::setView(nView1); + SfxViewShell::Current()->registerLibreOfficeKitViewCallback(nullptr, nullptr); + SfxLokHelper::setView(nView2); + SfxViewShell::Current()->registerLibreOfficeKitViewCallback(nullptr, nullptr); +} + } CPPUNIT_TEST_SUITE_REGISTRATION(ScTiledRenderingTest); diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index 8c99b02afd0d..44d66e768404 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -659,10 +659,6 @@ void ScModelObj::postMouseEvent(int nType, int nX, int nY, int nCount, int nButt if (!pGridWindow) return; - // update the aLogicMode in ScViewData to something predictable - pViewData->SetZoom(Fraction(mnTilePixelWidth * TWIPS_PER_PIXEL, mnTileTwipWidth), - Fraction(mnTilePixelHeight * TWIPS_PER_PIXEL, mnTileTwipHeight), true); - // check if user hit a chart which is being edited by him ScTabViewShell * pTabViewShell = pViewData->GetViewShell(); LokChartHelper aChartHelper(pTabViewShell); @@ -699,10 +695,6 @@ void ScModelObj::setTextSelection(int nType, int nX, int nY) ScInputHandler* pInputHandler = SC_MOD()->GetInputHdl(pViewShell); ScDrawView* pDrawView = pViewData->GetScDrawView(); - // update the aLogicMode in ScViewData to something predictable - pViewData->SetZoom(Fraction(mnTilePixelWidth * TWIPS_PER_PIXEL, mnTileTwipWidth), - Fraction(mnTilePixelHeight * TWIPS_PER_PIXEL, mnTileTwipHeight), true); - bool bHandled = false; if (pInputHandler && pInputHandler->IsInputMode()) @@ -810,9 +802,6 @@ void ScModelObj::setGraphicSelection(int nType, int nX, int nY) ScViewData* pViewData = ScDocShell::GetViewData(); ScGridWindow* pGridWindow = pViewData->GetActiveWin(); - // update the aLogicMode in ScViewData to something predictable - pViewData->SetZoom(Fraction(mnTilePixelWidth * TWIPS_PER_PIXEL, mnTileTwipWidth), - Fraction(mnTilePixelHeight * TWIPS_PER_PIXEL, mnTileTwipHeight), true); double fPPTX = pViewData->GetPPTX(); double fPPTY = pViewData->GetPPTY(); @@ -896,10 +885,13 @@ bool ScModelObj::isMimeTypeSupported() void ScModelObj::setClientZoom(int nTilePixelWidth_, int nTilePixelHeight_, int nTileTwipWidth_, int nTileTwipHeight_) { - mnTilePixelWidth = nTilePixelWidth_; - mnTilePixelHeight = nTilePixelHeight_; - mnTileTwipWidth = nTileTwipWidth_; - mnTileTwipHeight = nTileTwipHeight_; + ScViewData* pViewData = ScDocShell::GetViewData(); + + if (!pViewData) + return; + + pViewData->SetZoom(Fraction(nTilePixelWidth_ * TWIPS_PER_PIXEL, nTileTwipWidth_), + Fraction(nTilePixelHeight_ * TWIPS_PER_PIXEL, nTileTwipHeight_), true); } OUString ScModelObj::getRowColumnHeaders(const tools::Rectangle& rRectangle) @@ -909,10 +901,6 @@ OUString ScModelObj::getRowColumnHeaders(const tools::Rectangle& rRectangle) if (!pViewData) return OUString(); - // update the aLogicMode in ScViewData to something predictable - pViewData->SetZoom(Fraction(mnTilePixelWidth * TWIPS_PER_PIXEL, mnTileTwipWidth), - Fraction(mnTilePixelHeight * TWIPS_PER_PIXEL, mnTileTwipHeight), true); - ScTabView* pTabView = pViewData->GetView(); if (!pTabView) return OUString(); @@ -1118,13 +1106,6 @@ void ScModelObj::initializeForTiledRendering(const css::uno::SequenceGetZoomX(); + Fraction origZoomY = pViewData->GetZoomY(); + // Output size is in pixels while tile position and size are in logical units (twips). // Assumption: always paint the whole sheet i.e. "visible" range is always @@ -1116,6 +1119,8 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice, Fraction aFracX(long(nOutputWidth * TWIPS_PER_PIXEL), nTileWidth); Fraction aFracY(long(nOutputHeight * TWIPS_PER_PIXEL), nTileHeight); + // FIXME: compare vs. origZoomX/Y and avoid re-setting the zoom ? + // page break zoom, and aLogicMode in ScViewData pViewData->SetZoom(aFracX, aFracY, true); @@ -1224,6 +1229,8 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice, // Flag drawn formula cells "unchanged". pDoc->ResetChanged(ScRange(nTopLeftTileCol, nTopLeftTileRow, nTab, nBottomRightTileCol, nBottomRightTileRow, nTab)); pDoc->PrepareFormulaCalc(); + + pViewData->SetZoom(origZoomX, origZoomY, true); } void ScGridWindow::LogicInvalidate(const tools::Rectangle* pRectangle) diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx index 9a6b70eb063c..aa1db2bf3c4e 100644 --- a/sw/source/uibase/uno/unotxdoc.cxx +++ b/sw/source/uibase/uno/unotxdoc.cxx @@ -3259,9 +3259,6 @@ void SwXTextDocument::setClientZoom(int nTilePixelWidth_, int /*nTilePixelHeight // This value is used in postMouseEvent and setGraphicSelection methods // for in place chart editing. We assume that x and y scale is roughly // the same. - // Indeed we could set mnTilePixelWidth, mnTilePixelHeight, mnTileTwipWidth, - // mnTileTwipHeight data members of this class but they are not very useful - // since we need to be able to retrieve the zoom value for each view shell. SfxInPlaceClient* pIPClient = pDocShell->GetView()->GetIPClient(); if (pIPClient) { -- cgit