fix setting cell borders for unallocated cells
First of all, it should not be clamped to allocated columns. Second,
06d3294502413a231e5c5265609862c7f67a2f2b incorrectly handled
unallocated columns by setting the attribute for all rows, instead
of handling the inner ones differently.
Change-Id: I3115b314971f8c152cbdeda674863a8a78ee12eb
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135131
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index 9f8fad7..a83b548 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -157,6 +157,7 @@ public:
void testFormulaPosition();
void testFormulaWizardSubformula();
void testDiagonalBorders();
void testWholeDocBorders();
/**
* Make sure the sheet streams are invalidated properly.
@@ -290,6 +291,7 @@ public:
CPPUNIT_TEST(testFormulaPosition);
CPPUNIT_TEST(testFormulaWizardSubformula);
CPPUNIT_TEST(testDiagonalBorders);
CPPUNIT_TEST(testWholeDocBorders);
CPPUNIT_TEST(testJumpToPrecedentsDependents);
CPPUNIT_TEST(testSetBackgroundColor);
CPPUNIT_TEST(testRenameTable);
@@ -6310,6 +6312,78 @@ void Test::testDiagonalBorders()
m_pDoc->DeleteTab(0);
}
void Test::testWholeDocBorders()
{
m_pDoc->InsertTab(0, "Borders");
// Set outside border to be on all sides, and inside borders to be only vertical.
// This should result in edge borders of the spreadsheets being set, but internal
// borders between cells should be only vertical, not horizontal.
::editeng::SvxBorderLine line(nullptr, 50, SvxBorderLineStyle::SOLID);
SvxBoxItem borderItem(ATTR_BORDER);
borderItem.SetLine(&line, SvxBoxItemLine::LEFT);
borderItem.SetLine(&line, SvxBoxItemLine::RIGHT);
borderItem.SetLine(&line, SvxBoxItemLine::TOP);
borderItem.SetLine(&line, SvxBoxItemLine::BOTTOM);
SvxBoxInfoItem boxInfoItem(ATTR_BORDER);
boxInfoItem.SetLine(&line, SvxBoxInfoItemLine::VERT);
ScMarkData mark( m_pDoc->GetSheetLimits(), ScRange( 0, 0, 0, m_pDoc->MaxCol(), m_pDoc->MaxRow(), 0 ));
m_pDoc->ApplySelectionFrame( mark, borderItem, &boxInfoItem );
const ScPatternAttr* attr;
attr = m_pDoc->GetPattern( 0, 0, 0 );
CPPUNIT_ASSERT(attr);
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetTop());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetLeft());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetRight());
CPPUNIT_ASSERT(!attr->GetItem(ATTR_BORDER).GetBottom());
attr = m_pDoc->GetPattern( 1, 0, 0 );
CPPUNIT_ASSERT(attr);
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetTop());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetLeft());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetRight());
CPPUNIT_ASSERT(!attr->GetItem(ATTR_BORDER).GetBottom());
attr = m_pDoc->GetPattern( 0, 1, 0 );
CPPUNIT_ASSERT(attr);
CPPUNIT_ASSERT(!attr->GetItem(ATTR_BORDER).GetTop());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetLeft());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetRight());
CPPUNIT_ASSERT(!attr->GetItem(ATTR_BORDER).GetBottom());
attr = m_pDoc->GetPattern( 1, 1, 0 );
CPPUNIT_ASSERT(attr);
CPPUNIT_ASSERT(!attr->GetItem(ATTR_BORDER).GetTop());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetLeft());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetRight());
CPPUNIT_ASSERT(!attr->GetItem(ATTR_BORDER).GetBottom());
attr = m_pDoc->GetPattern( m_pDoc->MaxCol(), 0, 0 );
CPPUNIT_ASSERT(attr);
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetTop());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetLeft());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetRight());
CPPUNIT_ASSERT(!attr->GetItem(ATTR_BORDER).GetBottom());
attr = m_pDoc->GetPattern( 0, m_pDoc->MaxRow(), 0 );
CPPUNIT_ASSERT(attr);
CPPUNIT_ASSERT(!attr->GetItem(ATTR_BORDER).GetTop());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetLeft());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetRight());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetBottom());
attr = m_pDoc->GetPattern( m_pDoc->MaxCol(), m_pDoc->MaxRow(), 0 );
CPPUNIT_ASSERT(attr);
CPPUNIT_ASSERT(!attr->GetItem(ATTR_BORDER).GetTop());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetLeft());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetRight());
CPPUNIT_ASSERT(attr->GetItem(ATTR_BORDER).GetBottom());
m_pDoc->DeleteTab(0);
}
void Test::testSetStringAndNote()
{
m_pDoc->InsertTab(0, "Test");
diff --git a/sc/source/core/data/attarray.cxx b/sc/source/core/data/attarray.cxx
index 935a46a..3567866 100644
--- a/sc/source/core/data/attarray.cxx
+++ b/sc/source/core/data/attarray.cxx
@@ -1234,9 +1234,10 @@ bool ScAttrArray::ApplyFrame( const SvxBoxItem& rBoxItem,
void ScAttrArray::ApplyBlockFrame(const SvxBoxItem& rLineOuter, const SvxBoxInfoItem* pLineInner,
SCROW nStartRow, SCROW nEndRow, bool bLeft, SCCOL nDistRight)
{
SetDefaultIfNotInit();
if (nStartRow == nEndRow)
ApplyFrame(rLineOuter, pLineInner, nStartRow, nEndRow, bLeft, nDistRight, true, 0);
else if ( !mvData.empty() )
else
{
ApplyFrame(rLineOuter, pLineInner, nStartRow, nStartRow, bLeft, nDistRight,
true, nEndRow-nStartRow);
@@ -1267,10 +1268,6 @@ void ScAttrArray::ApplyBlockFrame(const SvxBoxItem& rLineOuter, const SvxBoxInfo
ApplyFrame(rLineOuter, pLineInner, nEndRow, nEndRow, bLeft, nDistRight, false, 0);
}
else
{
ApplyFrame(rLineOuter, pLineInner, nStartRow, nEndRow, bLeft, nDistRight, true, 0);
}
}
bool ScAttrArray::HasAttrib_Impl(const ScPatternAttr* pPattern, HasAttrFlags nMask, SCROW nRow1, SCROW nRow2, SCSIZE i) const
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 4e1d1f4..8193d4e 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -2855,7 +2855,7 @@ void ScTable::ApplyBlockFrame(const SvxBoxItem& rLineOuter, const SvxBoxInfoItem
{
PutInOrder(nStartCol, nEndCol);
PutInOrder(nStartRow, nEndRow);
nEndCol = ClampToAllocatedColumns(nEndCol);
CreateColumnIfNotExists(nEndCol);
for (SCCOL i=nStartCol; i<=nEndCol; i++)
aCol[i].ApplyBlockFrame(rLineOuter, pLineInner,
nStartRow, nEndRow, (i==nStartCol), nEndCol-i);