diff options
Diffstat (limited to 'oox/source')
-rw-r--r-- | oox/source/core/xmlfilterbase.cxx | 8 | ||||
-rw-r--r-- | oox/source/drawingml/diagram/diagram.cxx | 9 | ||||
-rw-r--r-- | oox/source/drawingml/diagram/diagram.hxx | 14 | ||||
-rw-r--r-- | oox/source/drawingml/diagram/diagramlayoutatoms.cxx | 26 | ||||
-rw-r--r-- | oox/source/drawingml/diagram/diagramlayoutatoms.hxx | 12 | ||||
-rw-r--r-- | oox/source/drawingml/shape.cxx | 55 | ||||
-rw-r--r-- | oox/source/ppt/pptshape.cxx | 13 |
7 files changed, 126 insertions, 11 deletions
diff --git a/oox/source/core/xmlfilterbase.cxx b/oox/source/core/xmlfilterbase.cxx index eae0a4f615fc..adf132dded13 100644 --- a/oox/source/core/xmlfilterbase.cxx +++ b/oox/source/core/xmlfilterbase.cxx @@ -175,6 +175,7 @@ struct XmlFilterBaseImpl RelationsMap maRelationsMap; TextFieldStack maTextFieldStack; const NamespaceMap& mrNamespaceMap; + NamedShapePairs* mpDiagramFontHeights = nullptr; /// @throws RuntimeException explicit XmlFilterBaseImpl(); @@ -939,6 +940,13 @@ void XmlFilterBase::setMissingExtDrawing() mbMissingExtDrawing = true; } +void XmlFilterBase::setDiagramFontHeights(NamedShapePairs* pDiagramFontHeights) +{ + mxImpl->mpDiagramFontHeights = pDiagramFontHeights; +} + +NamedShapePairs* XmlFilterBase::getDiagramFontHeights() { return mxImpl->mpDiagramFontHeights; } + OUString XmlFilterBase::getNamespaceURL(sal_Int32 nNSID) const { auto itr = mxImpl->mrNamespaceMap.maTransitionalNamespaceMap.find(nNSID); diff --git a/oox/source/drawingml/diagram/diagram.cxx b/oox/source/drawingml/diagram/diagram.cxx index 8265ae7b3a88..d9f35df42ebf 100644 --- a/oox/source/drawingml/diagram/diagram.cxx +++ b/oox/source/drawingml/diagram/diagram.cxx @@ -135,6 +135,11 @@ void Diagram::addTo( const ShapePtr & pParentShape ) aChildren.insert(aChildren.begin(), pBackground); } +Diagram::Diagram(const ShapePtr& pShape) + : mpShape(pShape) +{ +} + uno::Sequence<beans::PropertyValue> Diagram::getDomsAsPropertyValues() const { sal_Int32 length = maMainDomMap.size(); @@ -245,7 +250,7 @@ void loadDiagram( ShapePtr const & pShape, const OUString& rColorStylePath, const oox::core::Relations& rRelations ) { - DiagramPtr pDiagram = std::make_shared<Diagram>(); + DiagramPtr pDiagram = std::make_shared<Diagram>(pShape); DiagramDataPtr pData = std::make_shared<DiagramData>(); pDiagram->setData( pData ); @@ -365,7 +370,7 @@ void loadDiagram(ShapePtr const& pShape, const uno::Reference<xml::dom::XDocument>& colorDom, core::XmlFilterBase& rFilter) { - DiagramPtr pDiagram = std::make_shared<Diagram>(); + DiagramPtr pDiagram = std::make_shared<Diagram>(pShape); pDiagram->setData(pDiagramData); diff --git a/oox/source/drawingml/diagram/diagram.hxx b/oox/source/drawingml/diagram/diagram.hxx index e7f5cc68378b..25fa10ed0635 100644 --- a/oox/source/drawingml/diagram/diagram.hxx +++ b/oox/source/drawingml/diagram/diagram.hxx @@ -49,7 +49,10 @@ typedef std::map<const dgm::Point*, ShapePtr> PresPointShapeMap; class DiagramLayout { public: - DiagramLayout(const Diagram& rDgm) : mrDgm(rDgm) {} + DiagramLayout(Diagram& rDgm) + : mrDgm(rDgm) + { + } void setDefStyle( const OUString & sDefStyle ) { msDefStyle = sDefStyle; } void setMinVer( const OUString & sMinVer ) @@ -60,8 +63,7 @@ public: { msTitle = sTitle; } void setDesc( const OUString & sDesc ) { msDesc = sDesc; } - const Diagram& getDiagram() const - { return mrDgm; } + Diagram& getDiagram() { return mrDgm; } LayoutNodePtr & getNode() { return mpNode; } const LayoutNodePtr & getNode() const @@ -80,7 +82,7 @@ public: { return maPresPointShapeMap; } private: - const Diagram& mrDgm; + Diagram& mrDgm; OUString msDefStyle; OUString msMinVer; OUString msUniqueId; @@ -128,6 +130,7 @@ typedef std::map<OUString,DiagramColor> DiagramColorMap; class Diagram { public: + explicit Diagram(const ShapePtr& pShape); void setData( const DiagramDataPtr & pData ) { mpData = pData; } const DiagramDataPtr& getData() const @@ -146,7 +149,10 @@ public: void addTo( const ShapePtr & pShape ); css::uno::Sequence<css::beans::PropertyValue> getDomsAsPropertyValues() const; + ShapePtr getShape() { return mpShape; } + private: + ShapePtr mpShape; DiagramDataPtr mpData; DiagramLayoutPtr mpLayout; DiagramQStyleMap maStyles; diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx index f81aa774402b..f1278425bd87 100644 --- a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx +++ b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx @@ -216,7 +216,7 @@ namespace * Takes the connection list from rLayoutNode, navigates from rFrom on an edge * of type nType, using a direction determined by bSourceToDestination. */ -OUString navigate(const LayoutNode& rLayoutNode, sal_Int32 nType, const OUString& rFrom, +OUString navigate(LayoutNode& rLayoutNode, sal_Int32 nType, const OUString& rFrom, bool bSourceToDestination) { for (const auto& rConnection : rLayoutNode.getDiagram().getData()->getConnections()) @@ -648,6 +648,16 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector<Constraint>& nVertMin = std::min(aPos.Y, nVertMin); nVertMax = std::max(aPos.Y + aSize.Height, nVertMax); + + NamedShapePairs& rDiagramFontHeights + = getLayoutNode().getDiagram().getShape()->getDiagramFontHeights(); + auto it = rDiagramFontHeights.find(aCurrShape->getInternalName()); + if (it != rDiagramFontHeights.end()) + { + // Internal name matches: put drawingml::Shape to the relevant group, for + // syncronized font height handling. + it->second.insert({ aCurrShape, {} }); + } } // See if all vertical space is used or we have to center the content. @@ -942,6 +952,20 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector<Constraint>& } } + if (rConstraint.mnType == XML_primFontSz && rConstraint.mnFor == XML_des + && rConstraint.mnOperator == XML_equ) + { + NamedShapePairs& rDiagramFontHeights + = getLayoutNode().getDiagram().getShape()->getDiagramFontHeights(); + auto it = rDiagramFontHeights.find(rConstraint.msForName); + if (it == rDiagramFontHeights.end()) + { + // Start tracking all shapes with this internal name: they'll have the same + // font height. + rDiagramFontHeights[rConstraint.msForName] = {}; + } + } + // TODO: get values from differently named constraints as well if (rConstraint.msForName == "sp" || rConstraint.msForName == "space" || rConstraint.msForName == "sibTrans") { diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.hxx b/oox/source/drawingml/diagram/diagramlayoutatoms.hxx index f36224f0f882..81b96c2207b8 100644 --- a/oox/source/drawingml/diagram/diagramlayoutatoms.hxx +++ b/oox/source/drawingml/diagram/diagramlayoutatoms.hxx @@ -259,9 +259,13 @@ class LayoutNode public: typedef std::map<sal_Int32, OUString> VarMap; - LayoutNode(const Diagram& rDgm) : LayoutAtom(*this), mrDgm(rDgm), mnChildOrder(0) {} - const Diagram& getDiagram() const - { return mrDgm; } + LayoutNode(Diagram& rDgm) + : LayoutAtom(*this) + , mrDgm(rDgm) + , mnChildOrder(0) + { + } + Diagram& getDiagram() { return mrDgm; } virtual void accept( LayoutAtomVisitor& ) override; VarMap & variables() { return mVariables; } @@ -288,7 +292,7 @@ public: const LayoutNode* getParentLayoutNode() const; private: - const Diagram& mrDgm; + Diagram& mrDgm; VarMap mVariables; OUString msMoveWith; OUString msStyleLabel; diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 35d44339f62a..99fa848741b3 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -185,6 +185,7 @@ Shape::Shape( const ShapePtr& pSourceShape ) , mnDataNodeType(pSourceShape->mnDataNodeType) , mfAspectRatio(pSourceShape->mfAspectRatio) , mbUseBgFill(pSourceShape->mbUseBgFill) +, maDiagramFontHeights(pSourceShape->maDiagramFontHeights) {} Shape::~Shape() @@ -295,6 +296,22 @@ void Shape::addShape( if( !SvtFilterOptions::Get().IsSmartArt2Shape() ) convertSmartArtToMetafile( rFilterBase ); } + + NamedShapePairs* pNamedShapePairs = rFilterBase.getDiagramFontHeights(); + if (xShape.is() && pNamedShapePairs) + { + auto itPairs = pNamedShapePairs->find(getInternalName()); + if (itPairs != pNamedShapePairs->end()) + { + auto it = itPairs->second.find(shared_from_this()); + if (it != itPairs->second.end()) + { + // Our drawingml::Shape is in the list of an internal name, remember the now + // inserted XShape. + it->second = xShape; + } + } + } } } catch( const Exception& ) @@ -1540,6 +1557,44 @@ void Shape::keepDiagramCompatibilityInfo() } } +void Shape::syncDiagramFontHeights() +{ + // Each name represents a group of shapes, for which the font height should have the same + // scaling. + for (const auto& rNameAndPairs : maDiagramFontHeights) + { + // Find out the minimum scale within this group. + const ShapePairs& rShapePairs = rNameAndPairs.second; + sal_Int16 nMinScale = 100; + for (const auto& rShapePair : rShapePairs) + { + uno::Reference<beans::XPropertySet> xPropertySet(rShapePair.second, uno::UNO_QUERY); + if (xPropertySet.is()) + { + sal_Int16 nTextFitToSizeScale = 0; + xPropertySet->getPropertyValue("TextFitToSizeScale") >>= nTextFitToSizeScale; + if (nTextFitToSizeScale > 0 && nTextFitToSizeScale < nMinScale) + { + nMinScale = nTextFitToSizeScale; + } + } + } + + // Set that minimum scale for all members of the group. + if (nMinScale < 100) + { + for (const auto& rShapePair : rShapePairs) + { + uno::Reference<beans::XPropertySet> xPropertySet(rShapePair.second, uno::UNO_QUERY); + if (xPropertySet.is()) + { + xPropertySet->setPropertyValue("TextFitToSizeScale", uno::makeAny(nMinScale)); + } + } + } + } +} + void Shape::convertSmartArtToMetafile(XmlFilterBase const & rFilterBase) { try diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx index d017b4348d93..96ca319f2a8e 100644 --- a/oox/source/ppt/pptshape.cxx +++ b/oox/source/ppt/pptshape.cxx @@ -409,10 +409,23 @@ void PPTShape::addShape( // if this is a group shape, we have to add also each child shape Reference<XShapes> xShapes(xShape, UNO_QUERY); if (xShapes.is()) + { + if (meFrameType == FRAMETYPE_DIAGRAM) + { + rFilterBase.setDiagramFontHeights(&getDiagramFontHeights()); + } addChildren( rFilterBase, *this, pTheme, xShapes, pShapeMap, aTransformation ); + if (meFrameType == FRAMETYPE_DIAGRAM) + { + rFilterBase.setDiagramFontHeights(nullptr); + } + } if (meFrameType == FRAMETYPE_DIAGRAM) + { keepDiagramCompatibilityInfo(); + syncDiagramFontHeights(); + } } } catch (const Exception&) |