sc/source/ui/inc/gridwin.hxx | 3 + sc/source/ui/view/gridwin.cxx | 74 +++++++++++++++++++++++++++++++---------- sc/source/ui/view/gridwin4.cxx | 34 ++++++++++++++---- 3 files changed, 87 insertions(+), 24 deletions(-)
New commits: commit e3601efee23c6df26867a72ab06648ceff4e3f25 Author: Dennis Francis <dennis.fran...@collabora.com> AuthorDate: Mon May 25 17:55:19 2020 +0530 Commit: Dennis Francis <dennis.fran...@collabora.com> CommitDate: Sun Jul 5 11:00:04 2020 +0200 lokit: scPrintTwipsMsgs: LOK_CALLBACK_*SELECTION* Allow print twips coordinates in the below messages: LOK_CALLBACK_CELL_SELECTION_AREA LOK_CALLBACK_TEXT_SELECTION LOK_CALLBACK_TEXT_VIEW_SELECTION Change-Id: I267a636bbeab434b305a45abe3e21cb5afc4c1e9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97966 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Dennis Francis <dennis.fran...@collabora.com> (cherry picked from commit b10cd973445afce7005000d77848a56be0295b23) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97977 Tested-by: Jenkins diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx index 9dfedd12ade8..8bdee8a55190 100644 --- a/sc/source/ui/inc/gridwin.hxx +++ b/sc/source/ui/inc/gridwin.hxx @@ -300,8 +300,11 @@ class SAL_DLLPUBLIC_RTTI ScGridWindow : public vcl::Window, public DropTargetHel void SelectForContextMenu( const Point& rPosPixel, SCCOL nCellX, SCROW nCellY ); void GetSelectionRects( ::std::vector< tools::Rectangle >& rPixelRects ) const; + void GetSelectionRectsPrintTwips(::std::vector< tools::Rectangle >& rRects) const; void GetPixelRectsFor( const ScMarkData &rMarkData, ::std::vector< tools::Rectangle >& rPixelRects ) const; + void GetRectsAnyFor(const ScMarkData &rMarkData, + ::std::vector< tools::Rectangle >& rRects, bool bInPrintTwips) const; void UpdateKitSelection(const std::vector<tools::Rectangle>& rRectangles, std::vector<tools::Rectangle>* pLogicRects = nullptr); bool NeedLOKCursorInvalidation(const tools::Rectangle& rCursorRect, diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index 2742965c1b31..1e747fa6fe46 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -5991,13 +5991,24 @@ void ScGridWindow::UpdateKitSelection(const std::vector<tools::Rectangle>& rRect if (!comphelper::LibreOfficeKit::isActive()) return; + // If this is true, rRectangles should already in print twips. + // If false, rRectangles are in pixels. + bool bInPrintTwips = comphelper::LibreOfficeKit::isCompatFlagSet( + comphelper::LibreOfficeKit::Compat::scPrintTwipsMsgs); + tools::Rectangle aBoundingBox; - std::vector<tools::Rectangle> aLogicRects; + std::vector<tools::Rectangle> aConvertedRects; - aLogicRects = convertPixelToLogical(pViewData, rRectangles, aBoundingBox); + if (bInPrintTwips) + std::for_each(rRectangles.begin(), rRectangles.end(), + [&aBoundingBox](const tools::Rectangle& rRect) { aBoundingBox.Union(rRect); }); + else + aConvertedRects = convertPixelToLogical(pViewData, rRectangles, aBoundingBox); + + const std::vector<tools::Rectangle>& rLogicRects = bInPrintTwips ? rRectangles : aConvertedRects; if (pLogicRects) { - *pLogicRects = aLogicRects; + *pLogicRects = rLogicRects; return; } @@ -6005,8 +6016,16 @@ void ScGridWindow::UpdateKitSelection(const std::vector<tools::Rectangle>& rRect OString sBoundingBoxString = "EMPTY"; if (!aBoundingBox.IsEmpty()) sBoundingBoxString = aBoundingBox.toString(); + OString aRectListString = rectanglesToString(rLogicRects); pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_CELL_SELECTION_AREA, sBoundingBoxString.getStr()); - pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_TEXT_SELECTION, rectanglesToString(aLogicRects).getStr()); + pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_TEXT_SELECTION, aRectListString.getStr()); + + if (bInPrintTwips) + { + SfxLokHelper::notifyOtherViews(pViewShell, LOK_CALLBACK_TEXT_VIEW_SELECTION, + "selection", aRectListString); + return; + } for (SfxViewShell* it = SfxViewShell::GetFirst(); it; it = SfxViewShell::GetNext(*it)) @@ -6037,6 +6056,8 @@ void ScGridWindow::UpdateKitSelection(const std::vector<tools::Rectangle>& rRect void ScGridWindow::updateOtherKitSelections() const { ScTabViewShell* pViewShell = pViewData->GetViewShell(); + bool bInPrintTwips = comphelper::LibreOfficeKit::isCompatFlagSet( + comphelper::LibreOfficeKit::Compat::scPrintTwipsMsgs); for (SfxViewShell* it = SfxViewShell::GetFirst(); it; it = SfxViewShell::GetNext(*it)) @@ -6047,10 +6068,19 @@ void ScGridWindow::updateOtherKitSelections() const // Fetch pixels & convert for each view separately. tools::Rectangle aBoundingBox; - std::vector<tools::Rectangle> aPixelRects; - GetPixelRectsFor(pOther->GetViewData().GetMarkData() /* theirs */, aPixelRects); - auto aOtherLogicRects = convertPixelToLogical(&pViewShell->GetViewData(), aPixelRects, aBoundingBox); - OString aRectsString = rectanglesToString(aOtherLogicRects); + std::vector<tools::Rectangle> aRects; + OString aRectsString; + GetRectsAnyFor(pOther->GetViewData().GetMarkData() /* theirs */, aRects, bInPrintTwips); + if (bInPrintTwips) + { + std::for_each(aRects.begin(), aRects.end(), + [&aBoundingBox](const tools::Rectangle& rRect) { aBoundingBox.Union(rRect); }); + aRectsString = rectanglesToString(aRects); + } + else + aRectsString = rectanglesToString( + convertPixelToLogical(&pViewShell->GetViewData(), aRects, aBoundingBox)); + if (it == pViewShell) { OString sBoundingBoxString = "EMPTY"; @@ -6062,7 +6092,7 @@ void ScGridWindow::updateOtherKitSelections() const } else SfxLokHelper::notifyOtherView(it, pViewShell, LOK_CALLBACK_TEXT_VIEW_SELECTION, - "selection", aRectsString.getStr()); + "selection", aRectsString); } } @@ -6260,9 +6290,14 @@ void ScGridWindow::UpdateCursorOverlay() void ScGridWindow::GetCellSelection(std::vector<tools::Rectangle>& rLogicRects) { - std::vector<tools::Rectangle> aPixelRects; - GetSelectionRects(aPixelRects); - UpdateKitSelection(aPixelRects, &rLogicRects); + std::vector<tools::Rectangle> aRects; + if (comphelper::LibreOfficeKit::isActive() && + comphelper::LibreOfficeKit::isCompatFlagSet( + comphelper::LibreOfficeKit::Compat::scPrintTwipsMsgs)) + GetSelectionRectsPrintTwips(aRects); + else + GetSelectionRects(aRects); + UpdateKitSelection(aRects, &rLogicRects); } void ScGridWindow::DeleteSelectionOverlay() @@ -6278,17 +6313,22 @@ void ScGridWindow::UpdateSelectionOverlay() SetMapMode( aDrawMode ); DeleteSelectionOverlay(); - std::vector<tools::Rectangle> aPixelRects; - GetSelectionRects( aPixelRects ); + std::vector<tools::Rectangle> aRects; + if (comphelper::LibreOfficeKit::isActive() && + comphelper::LibreOfficeKit::isCompatFlagSet( + comphelper::LibreOfficeKit::Compat::scPrintTwipsMsgs)) + GetSelectionRectsPrintTwips(aRects); + else + GetSelectionRects(aRects); - if (!aPixelRects.empty() && pViewData->IsActive()) + if (!aRects.empty() && pViewData->IsActive()) { // #i70788# get the OverlayManager safely rtl::Reference<sdr::overlay::OverlayManager> xOverlayManager = getOverlayManager(); if (comphelper::LibreOfficeKit::isActive()) { // notify the LibreOfficeKit too - UpdateKitSelection(aPixelRects); + UpdateKitSelection(aRects); } else if (xOverlayManager.is()) { @@ -6298,7 +6338,7 @@ void ScGridWindow::UpdateSelectionOverlay() SCTAB nTab = pViewData->GetTabNo(); bool bLayoutRTL = pDoc->IsLayoutRTL( nTab ); - for(const tools::Rectangle & rRA : aPixelRects) + for(const tools::Rectangle & rRA : aRects) { if (bLayoutRTL) { diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index fbb78fec0460..4c42d86f2de4 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -1903,9 +1903,21 @@ void ScGridWindow::GetSelectionRects( ::std::vector< tools::Rectangle >& rPixelR GetPixelRectsFor( pViewData->GetMarkData(), rPixelRects ); } +void ScGridWindow::GetSelectionRectsPrintTwips(::std::vector< tools::Rectangle >& rRects) const +{ + GetRectsAnyFor(pViewData->GetMarkData(), rRects, true); +} + /// convert rMarkData into pixel rectangles for this view void ScGridWindow::GetPixelRectsFor( const ScMarkData &rMarkData, ::std::vector< tools::Rectangle >& rPixelRects ) const +{ + GetRectsAnyFor(rMarkData, rPixelRects, false); +} + +void ScGridWindow::GetRectsAnyFor(const ScMarkData &rMarkData, + ::std::vector< tools::Rectangle >& rRects, + bool bInPrintTwips) const { ScMarkData aMultiMark( rMarkData ); aMultiMark.SetMarking( false ); @@ -1978,9 +1990,10 @@ void ScGridWindow::GetPixelRectsFor( const ScMarkData &rMarkData, double nPPTX = pViewData->GetPPTX(); double nPPTY = pViewData->GetPPTY(); - ScInvertMerger aInvert( &rPixelRects ); + ScInvertMerger aInvert( &rRects ); - Point aScrPos = pViewData->GetScrPos( nX1, nY1, eWhich ); + Point aScrPos = bInPrintTwips ? pViewData->GetPrintTwipsPos(nX1, nY1) : + pViewData->GetScrPos(nX1, nY1, eWhich); long nScrY = aScrPos.Y(); bool bWasHidden = false; for (SCROW nY=nY1; nY<=nY2; nY++) @@ -2018,11 +2031,16 @@ void ScGridWindow::GetPixelRectsFor( const ScMarkData &rMarkData, nLoopEndX = nX1; } - long nEndY = nScrY + ScViewData::ToPixel( nHeightTwips, nPPTY ) - 1; + const long nHeight = bInPrintTwips ? + nHeightTwips : ScViewData::ToPixel(nHeightTwips, nPPTY); + long nEndY = nScrY + nHeight - 1; long nScrX = aScrPos.X(); for (SCCOL nX=nX1; nX<=nLoopEndX; nX++) { - long nWidth = ScViewData::ToPixel( pDoc->GetColWidth( nX,nTab ), nPPTX ); + long nWidth = pDoc->GetColWidth(nX, nTab); + if (!bInPrintTwips) + nWidth = ScViewData::ToPixel(nWidth, nPPTX); + if ( nWidth > 0 ) { long nEndX = nScrX + ( nWidth - 1 ) * nLayoutSign; @@ -2060,9 +2078,11 @@ void ScGridWindow::GetPixelRectsFor( const ScMarkData &rMarkData, const ScMergeAttr* pMerge = &pPattern->GetItem(ATTR_MERGE); if (pMerge->GetColMerge() > 0 || pMerge->GetRowMerge() > 0) { - Point aEndPos = pViewData->GetScrPos( - nThisX + pMerge->GetColMerge(), - nThisY + pMerge->GetRowMerge(), eWhich ); + const SCCOL nEndColMerge = nThisX + pMerge->GetColMerge(); + const SCROW nEndRowMerge = nThisY + pMerge->GetRowMerge(); + Point aEndPos = bInPrintTwips ? + pViewData->GetPrintTwipsPos(nEndColMerge, nEndRowMerge) : + pViewData->GetScrPos(nEndColMerge, nEndRowMerge, eWhich); if ( aEndPos.X() * nLayoutSign > nScrX * nLayoutSign && aEndPos.Y() > nScrY ) { aInvert.AddRect( tools::Rectangle( nScrX,nScrY, _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits