sc/inc/editutil.hxx | 4 ++ sc/source/core/tool/editutil.cxx | 75 ++++++++++++++++++++++++++++++--------- sc/source/ui/view/gridwin4.cxx | 34 +++++++++++++++-- 3 files changed, 93 insertions(+), 20 deletions(-)
New commits: commit bc025dac6ce3301f5798e8ada4fee07b415de76a Author: Dennis Francis <dennis.fran...@collabora.com> AuthorDate: Tue Jan 19 14:46:48 2021 +0530 Commit: Tor Lillqvist <t...@collabora.com> CommitDate: Wed Feb 3 13:32:01 2021 +0100 lok: Take indent and margins into account ... when painting tiles with edit-text content. Change-Id: I31199c18ed5aab005d56241046a9f7109691db99 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109755 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Tor Lillqvist <t...@collabora.com> diff --git a/sc/inc/editutil.hxx b/sc/inc/editutil.hxx index 6cfb2f3cae8a..72532fae5d1a 100644 --- a/sc/inc/editutil.hxx +++ b/sc/inc/editutil.hxx @@ -84,6 +84,10 @@ public: const Fraction& rX, const Fraction& rY, bool bPrintTwips = false ); tools::Rectangle GetEditArea( const ScPatternAttr* pPattern, bool bForceToTop ); + long GetIndent(const ScPatternAttr* pPattern) const; + void GetMargins(const ScPatternAttr* pPattern, long& nLeftMargin, long& nTopMargin, + long& nRightMargin, long& BottomMargin) const; + }; class ScEditAttrTester diff --git a/sc/source/core/tool/editutil.cxx b/sc/source/core/tool/editutil.cxx index 6cf6a1d4dcfa..aa642fcb56eb 100644 --- a/sc/source/core/tool/editutil.cxx +++ b/sc/source/core/tool/editutil.cxx @@ -282,6 +282,39 @@ OUString ScEditUtil::GetCellFieldValue( return aRet; } +long ScEditUtil::GetIndent(const ScPatternAttr* pPattern) const +{ + if (!pPattern) + pPattern = pDoc->GetPattern( nCol, nRow, nTab ); + + if ( pPattern->GetItem(ATTR_HOR_JUSTIFY).GetValue() == + SvxCellHorJustify::Left ) + { + long nIndent = pPattern->GetItem(ATTR_INDENT).GetValue(); + if (!bInPrintTwips) + nIndent = static_cast<long>(nIndent * nPPTX); + return nIndent; + } + + return 0; +} + +void ScEditUtil::GetMargins(const ScPatternAttr* pPattern, long& nLeftMargin, long& nTopMargin, + long& nRightMargin, long& nBottomMargin) const +{ + if (!pPattern) + pPattern = pDoc->GetPattern( nCol, nRow, nTab ); + + const SvxMarginItem* pMargin = &pPattern->GetItem(ATTR_MARGIN); + if (!pMargin) + return; + + nLeftMargin = bInPrintTwips ? pMargin->GetLeftMargin() : static_cast<long>(pMargin->GetLeftMargin() * nPPTX); + nRightMargin = bInPrintTwips ? pMargin->GetRightMargin() : static_cast<long>(pMargin->GetRightMargin() * nPPTX); + nTopMargin = bInPrintTwips ? pMargin->GetTopMargin() : static_cast<long>(pMargin->GetTopMargin() * nPPTY); + nBottomMargin = bInPrintTwips ? pMargin->GetBottomMargin() : static_cast<long>(pMargin->GetBottomMargin() * nPPTY); +} + tools::Rectangle ScEditUtil::GetEditArea( const ScPatternAttr* pPattern, bool bForceToTop ) { // bForceToTop = always align to top, for editing @@ -320,24 +353,36 @@ tools::Rectangle ScEditUtil::GetEditArea( const ScPatternAttr* pPattern, bool bF nCellY += static_cast<long>(pDoc->GetScaledRowHeight( nRow+1, nRow+nCountY-1, nTab, nPPTY)); } - const SvxMarginItem* pMargin = &pPattern->GetItem(ATTR_MARGIN); - sal_uInt16 nIndent = 0; - if ( pPattern->GetItem(ATTR_HOR_JUSTIFY).GetValue() == - SvxCellHorJustify::Left ) - nIndent = pPattern->GetItem(ATTR_INDENT).GetValue(); - long nDifX = pMargin->GetLeftMargin() + nIndent; - if (!bInPrintTwips) - nDifX = static_cast<long>( nDifX * nPPTX ); + long nRightMargin = 0; + long nTopMargin = 0; + long nBottomMargin = 0; + long nDifX = 0; + { + long nLeftMargin = 0; + bool bInPrintTwipsOrig = bInPrintTwips; + bInPrintTwips = true; + long nIndent = GetIndent(pPattern); + GetMargins(pPattern, nLeftMargin, nTopMargin, nRightMargin, nBottomMargin); + bInPrintTwips = bInPrintTwipsOrig; + // Here rounding may be done only on the sum, ie nDifX, + // so need to get margin and indent in twips. + nDifX = nLeftMargin + nIndent; + if (!bInPrintTwips) + { + nDifX = static_cast<long>(nDifX * nPPTX); + nRightMargin = static_cast<long>(nRightMargin * nPPTX); + nTopMargin = static_cast<long>(nTopMargin * nPPTY); + nBottomMargin = static_cast<long>(nBottomMargin * nPPTY); + } + } + + aStartPos.AdjustX(nDifX * nLayoutSign ); - nCellX -= nDifX + (bInPrintTwips ? pMargin->GetRightMargin() : - static_cast<long>( pMargin->GetRightMargin() * nPPTX )); // due to line feed, etc. + nCellX -= nDifX + nRightMargin; // due to line feed, etc. // align vertical position to the one in the table long nDifY; - long nTopMargin = pMargin->GetTopMargin(); - if (!bInPrintTwips) - nTopMargin = static_cast<long>( nTopMargin * nPPTY ); SvxCellVerJustify eJust = pPattern->GetItem(ATTR_VER_JUSTIFY).GetValue(); // asian vertical is always edited top-aligned @@ -361,9 +406,7 @@ tools::Rectangle ScEditUtil::GetEditArea( const ScPatternAttr* pPattern, bool bF // font color doesn't matter here pPattern->GetFont( aFont, SC_AUTOCOL_BLACK, pDev, &aZoomY ); pDev->SetFont(aFont); - nTextHeight = pDev->GetTextHeight() + nTopMargin + - (bInPrintTwips ? pMargin->GetBottomMargin() : - static_cast<long>( pMargin->GetBottomMargin() * nPPTY )); + nTextHeight = pDev->GetTextHeight() + nTopMargin + nBottomMargin; } pDev->SetMapMode(aMode); diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index 1d5d0f5d9936..7fa1b6c0001c 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -276,6 +276,25 @@ static void lcl_DrawHighlight( ScOutputData& rOutputData, const ScViewData* pVie } } +// Calculates top-left offset to be applied based on margins and indent. +static void lcl_GetEditAreaTLOffset(long& nOffsetX, long& nOffsetY, const ScAddress& rAddr, + const ScViewData* pViewData, ScDocument& rDoc) +{ + long nLeftMargin = 0; + long nTopMargin = 0; + long nIndent = 0; + long nDummy = 0; + ScEditUtil aEUtil(&rDoc, rAddr.Col(), rAddr.Row(), rAddr.Tab(), + Point(0, 0), nullptr, pViewData->GetPPTX(), + pViewData->GetPPTY(), Fraction(1.0), Fraction(1.0), + false /* bPrintTwips */); + const ScPatternAttr* pPattern = rDoc.GetPattern(rAddr); + nIndent = aEUtil.GetIndent(pPattern); + aEUtil.GetMargins(pPattern, nLeftMargin, nTopMargin, nDummy, nDummy); + nOffsetX = nIndent + nLeftMargin; + nOffsetY = nTopMargin; +} + void ScGridWindow::DoInvertRect( const tools::Rectangle& rPixel ) { if ( rPixel == aInvertRect ) @@ -1039,8 +1058,11 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI rDevice.DrawRect(rDevice.PixelToLogic(aBackground)); tools::Rectangle aEditRect(aBackground); - aEditRect.AdjustLeft(1); - aEditRect.AdjustTop(1); + long nOffsetX = 0, nOffsetY = 0; + // Get top-left offset because of margin and indent. + lcl_GetEditAreaTLOffset(nOffsetX, nOffsetY, ScAddress(nCol1, nRow1, pViewData->GetTabNo()), pViewData, rDoc); + aEditRect.AdjustLeft(nOffsetX + 1); + aEditRect.AdjustTop(nOffsetY + 1); // EditView has an 'output area' which is used to clip the 'paint area' we provide below. // So they need to be in the same coordinates/units. This is tied to the mapmode of the gridwin @@ -1144,8 +1166,12 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI if (bIsTiledRendering) { tools::Rectangle aEditRect(aBackground); - aEditRect.AdjustLeft(1); - aEditRect.AdjustTop(1); + long nOffsetX = 0, nOffsetY = 0; + // Get top-left offset because of margin and indent. + lcl_GetEditAreaTLOffset(nOffsetX, nOffsetY, ScAddress(nCol1, nRow1, pViewData->GetTabNo()), pViewData, rDoc); + aEditRect.AdjustLeft(nOffsetX + 1); + aEditRect.AdjustTop(nOffsetY + 1); + // EditView has an 'output area' which is used to clip the paint area we provide below. // So they need to be in the same coordinates/units. This is tied to the mapmode of the gridwin // attached to the EditView, so we have to change its mapmode too (temporarily). We save the _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits