summaryrefslogtreecommitdiff
path: root/sc/source/ui/view/gridwin4.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/view/gridwin4.cxx')
-rw-r--r--sc/source/ui/view/gridwin4.cxx107
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) :