summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorDennis Francis <dennis.francis@collabora.com>2021-01-19 14:46:48 +0530
committerTor Lillqvist <tml@collabora.com>2021-02-03 13:32:01 +0100
commitbc025dac6ce3301f5798e8ada4fee07b415de76a (patch)
treee2f373fd887ff5bc9984b52e36d6997e3e35500c /sc
parent15f031f75ed3c4940d591bb005d6197894fd14ef (diff)
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 <jenkinscollaboraoffice@gmail.com> Reviewed-by: Tor Lillqvist <tml@collabora.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/editutil.hxx4
-rw-r--r--sc/source/core/tool/editutil.cxx75
-rw-r--r--sc/source/ui/view/gridwin4.cxx34
3 files changed, 93 insertions, 20 deletions
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