1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* 3 * This file is part of the LibreOffice project. 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 * 9 * This file incorporates work covered by the following license notice: 10 * 11 * Licensed to the Apache Software Foundation (ASF) under one or more 12 * contributor license agreements. See the NOTICE file distributed 13 * with this work for additional information regarding copyright 14 * ownership. The ASF licenses this file to you under the Apache 15 * License, Version 2.0 (the "License"); you may not use this file 16 * except in compliance with the License. You may obtain a copy of 17 * the License at http://www.apache.org/licenses/LICENSE-2.0 . 18 */ 19 #ifndef INCLUDED_XMLOFF_SHAPEEXPORT_HXX 20 #define INCLUDED_XMLOFF_SHAPEEXPORT_HXX 21 22 #include <sal/config.h> 23 #include <xmloff/dllapi.h> 24 #include <sal/types.h> 25 26 #include <rtl/ref.hxx> 27 #include <rtl/ustring.hxx> 28 #include <rtl/ustrbuf.hxx> 29 #include <salhelper/simplereferenceobject.hxx> 30 31 #include <functional> 32 #include <map> 33 #include <xmloff/animexp.hxx> 34 #include <xmloff/families.hxx> 35 #include <xmloff/txtparae.hxx> 36 #include <o3tl/typed_flags_set.hxx> 37 38 namespace com::sun::star::awt { struct Point; } 39 namespace com::sun::star::beans { class XPropertySet; } 40 namespace com::sun::star::drawing { class XShape; } 41 namespace com::sun::star::drawing { class XShapes; } 42 43 class XMLTableExport; 44 class SvXMLAttributeList; 45 class XMLPropertyHandlerFactory; 46 47 // shape export features are bits used for the nFeature 48 // parameter of XMLShapeExport::exportShape 49 enum class XMLShapeExportFlags { 50 NONE = 0, 51 X = 0x0001, 52 Y = 0x0002, 53 POSITION = 0x0003, 54 WIDTH = 0x0004, 55 HEIGHT = 0x0008, 56 SIZE = WIDTH | HEIGHT, 57 // When setting the flag below no ignorableWhiteSpace will be called around 58 // the drawing object elements 59 NO_WS = 0x0020, 60 // When setting the flag below a callout shape is exported as office:annotation 61 ANNOTATION = 0x0040, 62 }; 63 namespace o3tl 64 { 65 template<> struct typed_flags<XMLShapeExportFlags> : is_typed_flags<XMLShapeExportFlags, 0x6f> {}; 66 } 67 68 #define SEF_DEFAULT XMLShapeExportFlags::POSITION|XMLShapeExportFlags::SIZE 69 70 enum XmlShapeType 71 { 72 XmlShapeTypeUnknown, // not known 73 74 XmlShapeTypeDrawRectangleShape, // "com.sun.star.drawing.RectangleShape" 75 XmlShapeTypeDrawEllipseShape, // "com.sun.star.drawing.EllipseShape" 76 XmlShapeTypeDrawControlShape, // "com.sun.star.drawing.ControlShape" 77 XmlShapeTypeDrawConnectorShape, // "com.sun.star.drawing.ConnectorShape" 78 XmlShapeTypeDrawMeasureShape, // "com.sun.star.drawing.MeasureShape" 79 XmlShapeTypeDrawLineShape, // "com.sun.star.drawing.LineShape" 80 XmlShapeTypeDrawPolyPolygonShape, // "com.sun.star.drawing.PolyPolygonShape" 81 XmlShapeTypeDrawPolyLineShape, // "com.sun.star.drawing.PolyLineShape" 82 XmlShapeTypeDrawOpenBezierShape, // "com.sun.star.drawing.OpenBezierShape" 83 XmlShapeTypeDrawClosedBezierShape, // "com.sun.star.drawing.ClosedBezierShape" 84 XmlShapeTypeDrawGraphicObjectShape, // "com.sun.star.drawing.GraphicObjectShape" 85 XmlShapeTypeDrawGroupShape, // "com.sun.star.drawing.GroupShape" 86 XmlShapeTypeDrawTextShape, // "com.sun.star.drawing.TextShape" 87 XmlShapeTypeDrawOLE2Shape, // "com.sun.star.drawing.OLE2Shape" 88 XmlShapeTypeDrawChartShape, // embedded com.sun.star.chart 89 XmlShapeTypeDrawSheetShape, // embedded com.sun.star.sheet 90 XmlShapeTypeDrawPageShape, // "com.sun.star.drawing.PageShape" 91 XmlShapeTypeDrawFrameShape, // "com.sun.star.drawing.FrameShape" 92 XmlShapeTypeDrawCaptionShape, // "com.sun.star.drawing.CaptionShape" 93 XmlShapeTypeDrawAppletShape, // "com.sun.star.drawing.AppletShape" 94 XmlShapeTypeDrawPluginShape, // "com.sun.star.drawing.PlugginShape" 95 96 XmlShapeTypeDraw3DSceneObject, // "com.sun.star.drawing.Shape3DSceneObject" 97 XmlShapeTypeDraw3DCubeObject, // "com.sun.star.drawing.Shape3DCubeObject" 98 XmlShapeTypeDraw3DSphereObject, // "com.sun.star.drawing.Shape3DSphereObject" 99 XmlShapeTypeDraw3DLatheObject, // "com.sun.star.drawing.Shape3DLatheObject" 100 XmlShapeTypeDraw3DExtrudeObject, // "com.sun.star.drawing.Shape3DExtrudeObject" 101 102 XmlShapeTypePresTitleTextShape, // "com.sun.star.presentation.TitleTextShape" 103 XmlShapeTypePresOutlinerShape, // "com.sun.star.presentation.OutlinerShape" 104 XmlShapeTypePresSubtitleShape, // "com.sun.star.presentation.SubtitleShape" 105 XmlShapeTypePresGraphicObjectShape, // "com.sun.star.presentation.GraphicObjectShape" 106 XmlShapeTypePresPageShape, // "com.sun.star.presentation.PageShape" 107 XmlShapeTypePresOLE2Shape, // "com.sun.star.presentation.OLE2Shape" 108 XmlShapeTypePresChartShape, // "com.sun.star.presentation.ChartShape" 109 XmlShapeTypePresSheetShape, // "com.sun.star.presentation.CalcShape" 110 XmlShapeTypePresTableShape, // "com.sun.star.presentation.TableShape" 111 XmlShapeTypePresOrgChartShape, // "com.sun.star.presentation.OrgChartShape" 112 XmlShapeTypePresNotesShape, // "com.sun.star.presentation.NotesShape" 113 XmlShapeTypeHandoutShape, // "com.sun.star.presentation.HandoutShape" 114 115 XmlShapeTypePresHeaderShape, // "com.sun.star.presentation.HeaderShape" 116 XmlShapeTypePresFooterShape, // "com.sun.star.presentation.FooterShape" 117 XmlShapeTypePresSlideNumberShape, // "com.sun.star.presentation.SlideNumberShape" 118 XmlShapeTypePresDateTimeShape, // "com.sun.star.presentation.DateTimeShape" 119 120 XmlShapeTypeDrawCustomShape, // "com.sun.star.drawing.CustomShape" 121 XmlShapeTypeDrawMediaShape, // "com.sun.star.drawing.MediaShape" 122 XmlShapeTypePresMediaShape, // "com.sun.star.presentation.MediaShape" 123 124 XmlShapeTypeDrawTableShape, // "com.sun.star.drawing.TableShape" 125 126 XmlShapeTypeNotYetSet 127 }; 128 129 /** caches style and type info after a collectShapeAutostyle for later use in exportShape */ 130 struct ImplXMLShapeExportInfo 131 { 132 OUString msStyleName; 133 OUString msTextStyleName; 134 XmlStyleFamily mnFamily; 135 XmlShapeType meShapeType; 136 137 css::uno::Reference< css::drawing::XShape > xCustomShapeReplacement; 138 ImplXMLShapeExportInfoImplXMLShapeExportInfo139 ImplXMLShapeExportInfo() : mnFamily( XmlStyleFamily::SD_GRAPHICS_ID ), meShapeType( XmlShapeTypeNotYetSet ) {} 140 }; 141 142 /** a vector for shape style and type cache information */ 143 typedef std::vector< ImplXMLShapeExportInfo > ImplXMLShapeExportInfoVector; 144 145 /** a map to store all cache data for already collected XShapes */ 146 typedef std::map< css::uno::Reference < css::drawing::XShapes >, ImplXMLShapeExportInfoVector > ShapesInfos; 147 148 class SvXMLExport; 149 class SvXMLExportPropertyMapper; 150 151 namespace basegfx 152 { 153 class B2DTuple; 154 class B2DHomMatrix; 155 } 156 157 class XMLOFF_DLLPUBLIC XMLShapeExport : public salhelper::SimpleReferenceObject 158 { 159 private: 160 161 SvXMLExport& mrExport; 162 rtl::Reference< SvXMLExportPropertyMapper > mxPropertySetMapper; 163 rtl::Reference< XMLAnimationsExporter > mxAnimationsExporter; 164 ShapesInfos maShapesInfos; 165 ShapesInfos::iterator maCurrentShapesIter; 166 bool mbExportLayer; 167 OUString msPresentationStylePrefix; 168 169 // #88546# possibility to switch progress bar handling on/off 170 bool mbHandleProgressBar; 171 172 rtl::Reference< XMLTableExport > mxShapeTableExport; 173 174 protected: GetExport()175 SvXMLExport& GetExport() { return mrExport; } GetExport() const176 const SvXMLExport& GetExport() const { return mrExport; } 177 private: 178 GetPropertySetMapper() const179 SAL_DLLPRIVATE const rtl::Reference< SvXMLExportPropertyMapper >& GetPropertySetMapper() const { return mxPropertySetMapper; } 180 181 OUStringBuffer msBuffer; 182 183 SAL_DLLPRIVATE void ImpCalcShapeType(const css::uno::Reference< css::drawing::XShape >& xShape, XmlShapeType& eShapeType); 184 185 SAL_DLLPRIVATE void ImpExportNewTrans(const css::uno::Reference< css::beans::XPropertySet >& xPropSet, XMLShapeExportFlags nFeatures, css::awt::Point* pRefPoint); 186 SAL_DLLPRIVATE void ImpExportNewTrans_GetB2DHomMatrix(::basegfx::B2DHomMatrix& rMatrix, const css::uno::Reference< css::beans::XPropertySet >& xPropSet); 187 SAL_DLLPRIVATE static void ImpExportNewTrans_DecomposeAndRefPoint(const ::basegfx::B2DHomMatrix& rMat, ::basegfx::B2DTuple& rTRScale, double& fTRShear, double& fTRRotate, ::basegfx::B2DTuple& rTRTranslate, css::awt::Point* pRefPoint); 188 SAL_DLLPRIVATE void ImpExportNewTrans_FeaturesAndWrite(::basegfx::B2DTuple const & rTRScale, double fTRShear, double fTRRotate, ::basegfx::B2DTuple const & rTRTranslate, const XMLShapeExportFlags nFeatures); 189 SAL_DLLPRIVATE bool ImpExportPresentationAttributes( const css::uno::Reference< css::beans::XPropertySet >& xPropSet, const OUString& rClass ); 190 SAL_DLLPRIVATE void ImpExportText( const css::uno::Reference< css::drawing::XShape >& xShape, TextPNS eExtensionNS = TextPNS::ODF ); 191 SAL_DLLPRIVATE void ImpExportEvents( const css::uno::Reference< css::drawing::XShape >& xShape ); 192 SAL_DLLPRIVATE void ImpExportDescription( const css::uno::Reference< css::drawing::XShape >& xShape ); // #i68101# 193 SAL_DLLPRIVATE void ImpExportGluePoints( const css::uno::Reference< css::drawing::XShape >& xShape ); 194 SAL_DLLPRIVATE void ImpExportSignatureLine(const css::uno::Reference<css::drawing::XShape>& xShape); 195 SAL_DLLPRIVATE void ImpExportQRCode(const css::uno::Reference<css::drawing::XShape>& xShape); 196 197 // single shape exporters 198 SAL_DLLPRIVATE void ImpExportGroupShape( const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 199 SAL_DLLPRIVATE void ImpExport3DSceneShape( const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 200 SAL_DLLPRIVATE void ImpExportRectangleShape( const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 201 SAL_DLLPRIVATE void ImpExportLineShape(const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 202 SAL_DLLPRIVATE void ImpExportEllipseShape(const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 203 SAL_DLLPRIVATE void ImpExportPolygonShape(const css::uno::Reference< css::drawing::XShape >& xShape, XmlShapeType eShapeType, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 204 SAL_DLLPRIVATE void ImpExportTextBoxShape(const css::uno::Reference< css::drawing::XShape >& xShape, XmlShapeType eShapeType, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 205 SAL_DLLPRIVATE void ImpExportGraphicObjectShape(const css::uno::Reference< css::drawing::XShape >& xShape, XmlShapeType eShapeType, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 206 SAL_DLLPRIVATE void ImpExportChartShape(const css::uno::Reference< css::drawing::XShape >& xShape, XmlShapeType eShapeType, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr, SvXMLAttributeList* pAttrList = nullptr ); 207 SAL_DLLPRIVATE void ImpExportControlShape(const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 208 SAL_DLLPRIVATE void ImpExportConnectorShape(const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 209 SAL_DLLPRIVATE void ImpExportMeasureShape(const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point const * pRefPoint = nullptr ); 210 SAL_DLLPRIVATE void ImpExportOLE2Shape(const css::uno::Reference< css::drawing::XShape >& xShape, XmlShapeType eShapeType, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr, SvXMLAttributeList* pAttrList = nullptr ); 211 SAL_DLLPRIVATE void ImpExportPageShape(const css::uno::Reference< css::drawing::XShape >& xShape, XmlShapeType eShapeType, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 212 SAL_DLLPRIVATE void ImpExportCaptionShape(const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 213 SAL_DLLPRIVATE void ImpExport3DShape(const css::uno::Reference< css::drawing::XShape >& xShape, XmlShapeType eShapeType ); 214 SAL_DLLPRIVATE void ImpExportFrameShape( const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 215 SAL_DLLPRIVATE void ImpExportPluginShape( const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 216 SAL_DLLPRIVATE void ImpExportAppletShape( const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 217 SAL_DLLPRIVATE void ImpExportCustomShape( const css::uno::Reference< css::drawing::XShape >& xShape, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 218 SAL_DLLPRIVATE void ImpExportMediaShape( const css::uno::Reference< css::drawing::XShape >& xShape, XmlShapeType eShapeType, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 219 SAL_DLLPRIVATE void ImpExportTableShape(const css::uno::Reference< css::drawing::XShape >& xShape, XmlShapeType eShapeType, XMLShapeExportFlags nFeatures = SEF_DEFAULT, css::awt::Point* pRefPoint = nullptr ); 220 public: 221 XMLShapeExport(SvXMLExport& rExp, SvXMLExportPropertyMapper *pExtMapper=nullptr ); 222 virtual ~XMLShapeExport() override; 223 224 // This method collects all automatic styles for the given XShape 225 void collectShapeAutoStyles( 226 const css::uno::Reference < css::drawing::XShape >& xShape); 227 228 // This method exports the given XShape 229 void exportShape( 230 const css::uno::Reference < css::drawing::XShape >& xShape, 231 XMLShapeExportFlags nFeatures = SEF_DEFAULT, 232 css::awt::Point* pRefPoint = nullptr, 233 SvXMLAttributeList* pAttrList = nullptr 234 ); 235 236 // This method collects all automatic styles for the shapes inside the given XShapes collection 237 void collectShapesAutoStyles( 238 const css::uno::Reference < css::drawing::XShapes >& xShapes); 239 240 // This method exports all XShape inside the given XShapes collection 241 void exportShapes( 242 const css::uno::Reference < css::drawing::XShapes >& xShapes, 243 XMLShapeExportFlags nFeatures = SEF_DEFAULT, 244 css::awt::Point* pRefPoint = nullptr 245 ); 246 247 /** initializes some internal structures for fast access to the given XShapes collection 248 249 <p>This method has to be called before you use exportShape or collectShapeAutoStyles. 250 It is automatically called if you use collectShapesAutoStyles and exportShapes. 251 252 @see collectShapeAutoStyles 253 @see exportShape 254 @see collectShapesAutoStyles 255 @see exportShapes 256 */ 257 void seekShapes( 258 const css::uno::Reference< css::drawing::XShapes >& xShapes ) noexcept; 259 260 void exportAutoStyles(); 261 262 /** sets a new reference to an XMLAnimationExporter. 263 If this is a non NULL reference, the animation information from all shapes given to exportShape() 264 from now on are collected. 265 */ setAnimationsExporter(rtl::Reference<XMLAnimationsExporter> const & xAnimExport)266 void setAnimationsExporter( rtl::Reference< XMLAnimationsExporter > const & xAnimExport ) { mxAnimationsExporter = xAnimExport; } 267 268 /** returns the last set XMLAnimationExport */ getAnimationsExporter() const269 const rtl::Reference< XMLAnimationsExporter >& getAnimationsExporter() const { return mxAnimationsExporter; } 270 271 /// returns the export property mapper for external chaining 272 static SvXMLExportPropertyMapper* CreateShapePropMapper( SvXMLExport& rExport ); 273 enableLayerExport()274 void enableLayerExport() { mbExportLayer = true; } 275 276 /** defines if the export should increment the progress bar or not */ enableHandleProgressBar()277 void enableHandleProgressBar() { mbHandleProgressBar = true; } IsHandleProgressBarEnabled() const278 bool IsHandleProgressBarEnabled() const { return mbHandleProgressBar; } 279 setPresentationStylePrefix(const OUString & rPrefix)280 void setPresentationStylePrefix( const OUString& rPrefix ) { msPresentationStylePrefix = rPrefix; } 281 282 /** helper for chart that adds all attributes of a 3d scene element to the export */ 283 void export3DSceneAttributes( const css::uno::Reference< css::beans::XPropertySet >& xPropSet ); 284 285 /** helper for chart that exports all lamps from the propertyset */ 286 void export3DLamps( const css::uno::Reference< css::beans::XPropertySet >& xPropSet ); 287 288 /** sj: replacing CustomShapes with standard objects that are also supported in OpenOffice.org format */ 289 css::uno::Reference < css::drawing::XShape > checkForCustomShapeReplacement( 290 const css::uno::Reference < css::drawing::XShape >& ); 291 292 /** helper to export the style for graphic defaults */ 293 void ExportGraphicDefaults(); 294 295 /** is called before a shape element for the given XShape is exported */ 296 virtual void onExport( const css::uno::Reference < css::drawing::XShape >& xShape ); 297 298 const rtl::Reference< XMLTableExport >& GetShapeTableExport(); 299 }; 300 301 namespace xmloff { 302 303 XMLOFF_DLLPUBLIC void FixZOrder( 304 css::uno::Reference<css::drawing::XShapes> const& xShapes, 305 std::function<unsigned int (css::uno::Reference<css::beans::XPropertySet> const&)> const& rGetLayer); 306 307 } // namespace xmloff 308 309 #endif 310 311 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 312