diff options
Diffstat (limited to 'sc/source/ui/view/gridwin4.cxx')
-rw-r--r-- | sc/source/ui/view/gridwin4.cxx | 107 |
1 files changed, 82 insertions, 25 deletions
diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index dce3d4a6d5d4..6aac6be5fde9 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -1288,15 +1288,15 @@ namespace class ScLOKProxyObjectContact final : public sdr::contact::ObjectContactOfPageView { private: - sdr::contact::ObjectContact& mrRealObjectContact; + ScDrawView* pScDrawView; public: explicit ScLOKProxyObjectContact( - sdr::contact::ObjectContact& rRealOC, + ScDrawView* pDrawView, SdrPageWindow& rPageWindow, const sal_Char* pDebugName) : ObjectContactOfPageView(rPageWindow, pDebugName), - mrRealObjectContact(rRealOC) + pScDrawView(pDrawView) { } @@ -1306,9 +1306,24 @@ namespace basegfx::B2DVector& rTarget, const sdr::contact::ViewObjectContact& rClient) const override { + if (!pScDrawView) + return; + + SdrPageView* pPageView(pScDrawView->GetSdrPageView()); + if (!pPageView) + return; + + SdrPageWindow* pSdrPageWindow = nullptr; + if (pPageView->PageWindowCount() > 0) + pSdrPageWindow = pPageView->GetPageWindow(0); + if (!pSdrPageWindow) + return; + + sdr::contact::ObjectContact& rObjContact(pSdrPageWindow->GetObjectContact()); + SdrObject* pTargetSdrObject(rClient.GetViewContact().TryToGetSdrObject()); if (pTargetSdrObject) - rTarget = pTargetSdrObject->GetViewContact().GetViewObjectContact(mrRealObjectContact).getGridOffset(); + rTarget = pTargetSdrObject->GetViewContact().GetViewObjectContact(rObjContact).getGridOffset(); } }; @@ -1327,15 +1342,7 @@ namespace if (!pScDrawView) return SdrView::createViewSpecificObjectContact(rPageWindow, pDebugName); - SdrPageView* pPageView(pScDrawView->GetSdrPageView()); - if (!pPageView) - return SdrView::createViewSpecificObjectContact(rPageWindow, pDebugName); - - SdrPageWindow* pSdrPageWindow = pPageView->GetPageWindow(0); - if (!pSdrPageWindow) - return SdrView::createViewSpecificObjectContact(rPageWindow, pDebugName); - - return new ScLOKProxyObjectContact(pSdrPageWindow->GetObjectContact(), rPageWindow, pDebugName); + return new ScLOKProxyObjectContact(pScDrawView, rPageWindow, pDebugName); } private: @@ -1499,12 +1506,13 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice, void ScGridWindow::LogicInvalidate(const tools::Rectangle* pRectangle) { - OString sRectangle; + tools::Rectangle aRectangle; + tools::Rectangle* pResultRectangle; if (!pRectangle) - sRectangle = "EMPTY"; + pResultRectangle = nullptr; else { - tools::Rectangle aRectangle(*pRectangle); + aRectangle = *pRectangle; // When dragging shapes the map mode is disabled. if (IsMapModeEnabled()) { @@ -1513,11 +1521,11 @@ void ScGridWindow::LogicInvalidate(const tools::Rectangle* pRectangle) } else aRectangle = PixelToLogic(aRectangle, MapMode(MapUnit::MapTwip)); - sRectangle = aRectangle.toString(); + pResultRectangle = &aRectangle; } ScTabViewShell* pViewShell = pViewData->GetViewShell(); - SfxLokHelper::notifyInvalidation(pViewShell, sRectangle); + SfxLokHelper::notifyInvalidation(pViewShell, pResultRectangle); } void ScGridWindow::SetCellSelectionPixel(int nType, int nPixelX, int nPixelY) @@ -2072,14 +2080,66 @@ void ScGridWindow::GetRectsAnyFor(const ScMarkData &rMarkData, ::std::vector< tools::Rectangle >& rRects, bool bInPrintTwips) const { - ScMarkData aMultiMark( rMarkData ); - aMultiMark.SetMarking( false ); - aMultiMark.MarkToMulti(); ScDocument* pDoc = pViewData->GetDocument(); SCTAB nTab = pViewData->GetTabNo(); - + double nPPTX = pViewData->GetPPTX(); + double nPPTY = pViewData->GetPPTY(); bool bLayoutRTL = pDoc->IsLayoutRTL( nTab ); long nLayoutSign = bLayoutRTL ? -1 : 1; + + ScMarkData aMultiMark( rMarkData ); + aMultiMark.SetMarking( false ); + + if (!aMultiMark.IsMultiMarked()) + { + // simple range case - simplify calculation + ScRange aSimpleRange; + aMultiMark.GetMarkArea( aSimpleRange ); + + aMultiMark.MarkToMulti(); + if ( !aMultiMark.IsMultiMarked() ) + return; + + SCCOL nX1 = aSimpleRange.aStart.Col(); + SCROW nY1 = aSimpleRange.aStart.Row(); + SCCOL nX2 = aSimpleRange.aEnd.Col(); + SCROW nY2 = aSimpleRange.aEnd.Row(); + + PutInOrder( nX1, nX2 ); + PutInOrder( nY1, nY2 ); + + SCCOL nPosX = pViewData->GetPosX( eHWhich ); + SCROW nPosY = pViewData->GetPosY( eVWhich ); + // is the selection visible at all? + if (nX2 < nPosX || nY2 < nPosY) + return; + + Point aScrStartPos = bInPrintTwips ? pViewData->GetPrintTwipsPos(nX1, nY1) : + pViewData->GetScrPos(nX1, nY1, eWhich); + + long nStartX = aScrStartPos.X(); + long nStartY = aScrStartPos.Y(); + + Point aScrEndPos = bInPrintTwips ? pViewData->GetPrintTwipsPos(nX2, nY2) : + pViewData->GetScrPos(nX2, nY2, eWhich); + + long nWidthTwips = pDoc->GetColWidth(nX2, nTab); + const long nWidth = bInPrintTwips ? + nWidthTwips : ScViewData::ToPixel(nWidthTwips, nPPTX); + long nEndX = aScrEndPos.X() + (nWidth - 1) * nLayoutSign; + + sal_uInt16 nHeightTwips = pDoc->GetRowHeight( nY2, nTab ); + const long nHeight = bInPrintTwips ? + nHeightTwips : ScViewData::ToPixel(nHeightTwips, nPPTY); + long nEndY = aScrEndPos.Y() + nHeight - 1; + + ScInvertMerger aInvert( &rRects ); + aInvert.AddRect( tools::Rectangle( nStartX, nStartY, nEndX, nEndY ) ); + + return; + } + + aMultiMark.MarkToMulti(); if ( !aMultiMark.IsMultiMarked() ) return; ScRange aMultiRange; @@ -2140,9 +2200,6 @@ void ScGridWindow::GetRectsAnyFor(const ScMarkData &rMarkData, nY2 = nMaxTiledRow; } - double nPPTX = pViewData->GetPPTX(); - double nPPTY = pViewData->GetPPTY(); - ScInvertMerger aInvert( &rRects ); Point aScrPos = bInPrintTwips ? pViewData->GetPrintTwipsPos(nX1, nY1) : |