summaryrefslogtreecommitdiff
path: root/oox
diff options
context:
space:
mode:
Diffstat (limited to 'oox')
-rw-r--r--oox/source/drawingml/diagram/diagramlayoutatoms.cxx57
1 files changed, 47 insertions, 10 deletions
diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
index 052dc19b1361..f4ca071976fa 100644
--- a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
+++ b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
@@ -1308,7 +1308,7 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector<Constraint>&
fShapeWidth = fShapeHeight * fChildAspectRatio;
}
- double fSpaceFromConstraint = 0;
+ double fSpaceFromConstraint = 1.0;
LayoutPropertyMap aPropertiesByName;
std::map<sal_Int32, LayoutProperty> aPropertiesByType;
LayoutProperty& rParent = aPropertiesByName[""];
@@ -1316,7 +1316,7 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector<Constraint>&
rParent[XML_h] = fShapeHeight;
for (const auto& rConstr : rConstraints)
{
- if (rConstr.mnRefType == XML_h)
+ if (rConstr.mnRefType == XML_w || rConstr.mnRefType == XML_h)
{
if (rConstr.mnType == XML_sp && rConstr.msForName.isEmpty())
fSpaceFromConstraint = rConstr.mfFactor;
@@ -1379,7 +1379,7 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector<Constraint>&
aShapeWidths[i] = it->second;
}
- bool bSpaceFromConstraints = fSpaceFromConstraint != 0;
+ bool bSpaceFromConstraints = fSpaceFromConstraint != 1.0;
const sal_Int32 nDir = maMap.count(XML_grDir) ? maMap.find(XML_grDir)->second : XML_tL;
sal_Int32 nIncX = 1;
@@ -1399,6 +1399,7 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector<Constraint>&
sal_Int32 nCol = 1;
sal_Int32 nRow = 1;
+ sal_Int32 nMaxRowWidth = 0;
if (nCount <= fChildAspectRatio)
// Child aspect ratio request (width/height) is N, and we have at most N shapes.
// This means we don't need multiple columns.
@@ -1408,8 +1409,22 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector<Constraint>&
for ( ; nRow<nCount; nRow++)
{
nCol = std::ceil(static_cast<double>(nCount) / nRow);
- if ((fShapeHeight * nRow) / (fShapeWidth * nCol) >= fAspectRatio)
+ sal_Int32 nRowWidth = 0;
+ for (sal_Int32 i = 0; i < nCol; ++i)
{
+ if (i >= nCount)
+ {
+ break;
+ }
+
+ nRowWidth += aShapeWidths[i];
+ }
+ if ((fShapeHeight * nRow) / nRowWidth >= fAspectRatio)
+ {
+ if (nRowWidth > nMaxRowWidth)
+ {
+ nMaxRowWidth = nRowWidth;
+ }
break;
}
}
@@ -1457,35 +1472,57 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector<Constraint>&
switch(aContDir)
{
case XML_sameDir:
+ {
+ sal_Int32 nRowHeight = 0;
for (auto & aCurrShape : rShape->getChildren())
{
aCurrShape->setPosition(aCurrPos);
- aCurrShape->setSize(aChildSize);
- aCurrShape->setChildSize(aChildSize);
+ awt::Size aCurrSize(aChildSize);
+ // aShapeWidths items are a portion of nMaxRowWidth. We want the same ratio,
+ // based on the original parent width, ignoring the aspect ratio request.
+ double fWidthFactor = static_cast<double>(aShapeWidths[index]) / nMaxRowWidth;
+ if (nCount >= 2 && rShape->getChildren()[1]->getDataNodeType() == XML_sibTrans)
+ {
+ // We can only work from constraints if spacing is represented by a real
+ // child shape.
+ aCurrSize.Width = rShape->getSize().Width * fWidthFactor;
+ }
+ if (fChildAspectRatio)
+ {
+ aCurrSize.Height = aCurrSize.Width / fChildAspectRatio;
+ }
+ if (aCurrSize.Height > nRowHeight)
+ {
+ nRowHeight = aCurrSize.Height;
+ }
+ aCurrShape->setSize(aCurrSize);
+ aCurrShape->setChildSize(aCurrSize);
index++; // counts index of child, helpful for positioning.
if(index%nCol==0 || ((index/nCol)+1)!=nRow)
- aCurrPos.X += nIncX * (aChildSize.Width + fSpace*aChildSize.Width);
+ aCurrPos.X += nIncX * (aCurrSize.Width + fSpace*aCurrSize.Width);
if(++nColIdx == nCol) // condition for next row
{
// if last row, then position children according to number of shapes.
if((index+1)%nCol!=0 && (index+1)>=3 && ((index+1)/nCol+1)==nRow && nCount!=nRow*nCol)
// position first child of last row
- aCurrPos.X = nStartX + (nIncX * (aChildSize.Width + fSpace*aChildSize.Width))/2;
+ aCurrPos.X = nStartX + (nIncX * (aCurrSize.Width + fSpace*aCurrSize.Width))/2;
else
// if not last row, positions first child of that row
aCurrPos.X = nStartX;
- aCurrPos.Y += nIncY * (aChildSize.Height + fSpace*aChildSize.Height);
+ aCurrPos.Y += nIncY * (nRowHeight + fSpace*nRowHeight);
nColIdx = 0;
+ nRowHeight = 0;
}
// positions children in the last row.
if(index%nCol!=0 && index>=3 && ((index/nCol)+1)==nRow)
- aCurrPos.X += (nIncX * (aChildSize.Width + fSpace*aChildSize.Width));
+ aCurrPos.X += (nIncX * (aCurrSize.Width + fSpace*aCurrSize.Width));
}
break;
+ }
case XML_revDir:
for (auto & aCurrShape : rShape->getChildren())
{