Kaydet (Commit) c5a3cae8 authored tarafından Armin Le Grand's avatar Armin Le Grand

BorderlineFix: Corrected handling for 'rotated' CellBorders

CellBorders can be rotated (including their Text) and need special
visualization that is based on an own sheared/rotated coordinate
system. Currently only possible for single cells (not merged ones)
and needs to handle all borders (also bottom-right directly in the
rotated cell, not in the neighboured ones to have the geometry,
plus avoiding these in the non-rotated neighbour cells.
Also corrected adding CellRotation data to svx::frame::Array
in calc using SetCellRotations() which now gets called in the
ScOutputData constructor to ensure it gets called in all places
where it is used.

Change-Id: I47bdfc29ba5ca76bbc07d98cb64733f867b1ee20
üst b28360c6
......@@ -255,6 +255,11 @@ private:
long SetEngineTextAndGetWidth( DrawEditParam& rParam, const OUString& rSetString,
long& rNeededPixel, long nAddWidthPixels );
// Check for and set cell rotations at OutputData to have it available
// in the svx tooling to render the borders. Moved to private section
// and the single call to end of constructor to be sure this always happens
void SetCellRotations();
public:
/**
* @param nNewScrX: X-Offset in the output device for the table
......@@ -311,8 +316,6 @@ public:
// with logic MapMode set!
void DrawEdit(bool bPixelToLogic);
void SetCellRotations();
void DrawRotated(bool bPixelToLogic); // logical
void DrawClear();
......
......@@ -696,10 +696,6 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, const ScTableInfo& rTableI
pContentDev->SetMapMode(aCurrentMapMode);
}
// check for and set cell rotations at OutputData to have it available
// in the svx tooling to render the borders
aOutputData.SetCellRotations();
if ( rDoc.HasBackgroundDraw( nTab, aDrawingRectLogic ) )
{
pContentDev->SetMapMode(MapMode(MapUnit::MapPixel));
......
......@@ -214,6 +214,9 @@ ScOutputData::ScOutputData( OutputDevice* pNewDev, ScOutputType eNewType,
bTabProtected = mpDoc->IsTabProtected( nTab );
bLayoutRTL = mpDoc->IsLayoutRTL( nTab );
// always needed, so call at the end of the constructor
SetCellRotations();
}
ScOutputData::~ScOutputData()
......
......@@ -1092,9 +1092,21 @@ drawinglayer::primitive2d::Primitive2DContainer Array::CreateB2DPrimitiveRange(
const bool bFirstRow(nRow == nFirstRow);
const bool bLastRow(nRow == nLastRow);
// handle rotation: If cell is rotated, handle lower/right edge inside
// this local geometry due to the created CoordinateSystem already representing
// the needed transformations.
const bool bRotated(rCell.IsRotated());
// Additionally avoid double-handling by supressing handling when self not roated,
// but above/left is rotated and thus already handled. Two directly connected
// rotated will paint/create both edges, they might be rotated differently.
const bool bSuppressAbove(!bRotated && nRow > nFirstRow && CELL(nCol, nRow - 1).IsRotated());
const bool bSupressLeft(!bRotated && nCol > nFirstCol && CELL(nCol - 1, nRow).IsRotated());
// create upper line for this Cell
if (!bOverlapY // true for first line in merged cells or cells
|| bFirstRow) // true for non_Calc usages of this tooling
if ((!bOverlapY // true for first line in merged cells or cells
|| bFirstRow) // true for non_Calc usages of this tooling
&& !bSuppressAbove) // true when above is not rotated, so edge is already handled (see bRotated)
{
// get CellStyle - method will take care to get the correct one, e.g.
// for merged cells (it uses ORIGCELL that works with topLeft's of these)
......@@ -1107,7 +1119,8 @@ drawinglayer::primitive2d::Primitive2DContainer Array::CreateB2DPrimitiveRange(
}
// create lower line for this Cell
if (bLastRow) // true for non_Calc usages of this tooling
if (bLastRow // true for non_Calc usages of this tooling
|| bRotated) // true if cell is rotated, handle lower edge in local geometry
{
const Style& rBottom(GetCellStyleBottom(nCol, nRow));
......@@ -1118,8 +1131,9 @@ drawinglayer::primitive2d::Primitive2DContainer Array::CreateB2DPrimitiveRange(
}
// create left line for this Cell
if (!bOverlapX // true for first column in merged cells or cells
|| bFirstCol) // true for non_Calc usages of this tooling
if ((!bOverlapX // true for first column in merged cells or cells
|| bFirstCol) // true for non_Calc usages of this tooling
&& !bSupressLeft) // true when left is not rotated, so edge is already handled (see bRotated)
{
const Style& rLeft(GetCellStyleLeft(nCol, nRow));
......@@ -1130,7 +1144,8 @@ drawinglayer::primitive2d::Primitive2DContainer Array::CreateB2DPrimitiveRange(
}
// create right line for this Cell
if (bLastCol) // true for non_Calc usages of this tooling
if (bLastCol // true for non_Calc usages of this tooling
|| bRotated) // true if cell is rotated, handle right edge in local geometry
{
const Style& rRight(GetCellStyleRight(nCol, nRow));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment