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 20 #ifndef INCLUDED_OOX_EXPORT_SHAPES_HXX 21 #define INCLUDED_OOX_EXPORT_SHAPES_HXX 22 23 #include <cstddef> 24 #include <memory> 25 #include <unordered_map> 26 27 #include <com/sun/star/awt/Size.hpp> 28 #include <com/sun/star/table/BorderLine2.hpp> 29 #include <com/sun/star/uno/Reference.hxx> 30 #include <oox/dllapi.h> 31 #include <oox/export/drawingml.hxx> 32 #include <oox/export/utils.hxx> 33 #include <rtl/ustring.hxx> 34 #include <sal/types.h> 35 #include <sax/fshelper.hxx> 36 #include <tools/fract.hxx> 37 #include <vcl/mapmod.hxx> 38 39 namespace com { namespace sun { namespace star { 40 namespace beans { 41 class XPropertySet; 42 } 43 namespace drawing { 44 class XShape; 45 } 46 47 namespace embed { 48 class XEmbeddedObject; 49 } 50 namespace io { 51 class XInputStream; 52 } 53 namespace uno { 54 class XComponentContext; 55 class XInterface; 56 } 57 }}} 58 59 namespace oox { 60 namespace core { 61 class XmlFilterBase; 62 }} 63 64 class Graphic; 65 66 namespace oox { 67 68 OOX_DLLPUBLIC css::uno::Reference<css::io::XInputStream> GetOLEObjectStream( 69 css::uno::Reference<css::uno::XComponentContext> const& xContext, 70 css::uno::Reference<css::embed::XEmbeddedObject> const& xObj, 71 OUString const& i_rProgID, 72 OUString & o_rMediaType, 73 OUString & o_rRelationType, 74 OUString & o_rSuffix, 75 const char *& o_rpProgID); 76 77 } 78 79 namespace oox { namespace drawingml { 80 81 class OOX_DLLPUBLIC ShapeExport : public DrawingML { 82 83 private: 84 int m_nEmbeddedObjects; 85 86 public: 87 typedef std::unordered_map< css::uno::Reference< css::drawing::XShape>, sal_Int32> ShapeHashMap; 88 89 protected: 90 sal_Int32 mnShapeIdMax, mnPictureIdMax; 91 92 void WriteGraphicObjectShapePart( const css::uno::Reference< css::drawing::XShape >& xShape, const Graphic *pGraphic=nullptr ); 93 94 private: 95 sal_Int32 mnXmlNamespace; 96 MapMode maMapModeSrc, maMapModeDest; 97 std::shared_ptr<URLTransformer> mpURLTransformer; 98 99 css::awt::Size MapSize( const css::awt::Size& ) const; 100 101 ShapeHashMap maShapeMap; 102 ShapeHashMap* mpShapeMap; 103 OUString m_presetWarp; 104 105 public: 106 107 ShapeExport( sal_Int32 nXmlNamespace, ::sax_fastparser::FSHelperPtr pFS, 108 ShapeHashMap* pShapeMap, ::oox::core::XmlFilterBase* pFB, 109 DocumentType eDocumentType = DOCUMENT_PPTX, 110 DMLTextExport* pTextExport = nullptr ); ~ShapeExport()111 virtual ~ShapeExport() {} 112 113 void SetURLTranslator(const std::shared_ptr<URLTransformer>& pTransformer); 114 115 static bool NonEmptyText( const css::uno::Reference< css::uno::XInterface >& xIface ); 116 117 ShapeExport& 118 WritePolyPolygonShape( const css::uno::Reference< css::drawing::XShape >& xShape, bool bClosed ); 119 ShapeExport& 120 WriteClosedPolyPolygonShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 121 ShapeExport& 122 WriteConnectorShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 123 ShapeExport& 124 WriteCustomShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 125 ShapeExport& 126 WriteEllipseShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 127 ShapeExport& 128 WriteGraphicObjectShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 129 ShapeExport& 130 WriteGroupShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 131 ShapeExport& 132 WriteLineShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 133 ShapeExport& 134 WriteNonVisualDrawingProperties( const css::uno::Reference< css::drawing::XShape >& xShape, const char* sName ); 135 virtual ShapeExport& 136 WriteNonVisualProperties( const css::uno::Reference< css::drawing::XShape >& xShape ); 137 ShapeExport& 138 WriteOpenPolyPolygonShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 139 ShapeExport& 140 WriteRectangleShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 141 142 /** 143 * Write the DrawingML for a particular shape. 144 * 145 * <p>This is the member function you want. It performs the type lookup and 146 * invokes the appropriate corresponding Write*() method for the specific 147 * type.</p> 148 * 149 * <p>To write an XShape, XShape::getShapeType() is called to determine 150 * the shape type, and the corresponding method in this table is 151 * invoked:</p> 152 * 153 * <table> 154 * <tr><th>Shape Type</th><th>Method</th></tr> 155 * <tr><td><tt>com.sun.star.drawing.ClosedBezierShape</tt></td> <td>ShapeExport::WriteClosedPolyPolygonShape</td></tr> 156 * <tr><td><tt>com.sun.star.drawing.CustomShape</tt></td> <td>ShapeExport::WriteCustomShape</td></tr> 157 * <tr><td><tt>com.sun.star.drawing.EllipseShape</tt></td> <td>ShapeExport::WriteEllipseShape</td></tr> 158 * <tr><td><tt>com.sun.star.drawing.GraphicObjectShape</tt></td> <td>ShapeExport::WriteGraphicObjectShape</td></tr> 159 * <tr><td><tt>com.sun.star.drawing.LineShape</tt></td> <td>ShapeExport::WriteLineShape</td></tr> 160 * <tr><td><tt>com.sun.star.drawing.OpenBezierShape</tt></td> <td>ShapeExport::WriteOpenPolyPolygonShape</td></tr> 161 * <tr><td><tt>com.sun.star.drawing.PolyPolygonShape</tt></td> <td>ShapeExport::WriteClosedPolyPolygonShape</td></tr> 162 * <tr><td><tt>com.sun.star.drawing.PolyLineShape</tt></td> <td>ShapeExport::WriteOpenPolyPolygonShape</td></tr> 163 * <tr><td><tt>com.sun.star.drawing.RectangleShape</tt></td> <td>ShapeExport::WriteRectangleShape</td></tr> 164 * <tr><td><tt>com.sun.star.drawing.TableShape</tt></td> <td>ShapeExport::WriteTableShape</td></tr> 165 * <tr><td><tt>com.sun.star.drawing.TextShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> 166 * <tr><td><tt>com.sun.star.presentation.DateTimeShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> 167 * <tr><td><tt>com.sun.star.presentation.FooterShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> 168 * <tr><td><tt>com.sun.star.presentation.HeaderShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> 169 * <tr><td><tt>com.sun.star.presentation.NotesShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> 170 * <tr><td><tt>com.sun.star.presentation.OutlinerShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> 171 * <tr><td><tt>com.sun.star.presentation.SlideNumberShape</tt></td><td>ShapeExport::WriteTextShape</td></tr> 172 * <tr><td><tt>com.sun.star.presentation.TitleTextShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr> 173 * </table> 174 * 175 * <p>If the shape type is not recognized, then 176 * <tt>ShapeExport::WriteUnknownShape</tt> is called.</p> 177 * 178 * @param xShape The shape to export as DrawingML. 179 * @return <tt>*this</tt> 180 */ 181 ShapeExport& WriteShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 182 ShapeExport& WriteTextBox( const css::uno::Reference< css::uno::XInterface >& xIface, sal_Int32 nXmlNamespace ); 183 virtual ShapeExport& 184 WriteTextShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 185 ShapeExport& 186 WriteTableShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 187 void WriteMathShape(css::uno::Reference<css::drawing::XShape> const& xShape); 188 ShapeExport& 189 WriteOLE2Shape( const css::uno::Reference< css::drawing::XShape >& xShape ); 190 virtual ShapeExport& 191 WriteUnknownShape( const css::uno::Reference< css::drawing::XShape >& xShape ); 192 193 void WriteTable( const css::uno::Reference< css::drawing::XShape >& rXShape ); 194 195 void WriteTableCellProperties(const css::uno::Reference< css::beans::XPropertySet >& rXPropSet); 196 197 void WriteBorderLine(const sal_Int32 XML_line, const css::table::BorderLine2& rBorderLine); 198 void WriteTableCellBorders(const css::uno::Reference< css::beans::XPropertySet >& rXPropSet); 199 200 sal_Int32 GetNewShapeID( const css::uno::Reference< css::drawing::XShape >& rShape ); 201 sal_Int32 GetNewShapeID( const css::uno::Reference< css::drawing::XShape >& rShape, ::oox::core::XmlFilterBase* pFB ); 202 sal_Int32 GetShapeID( const css::uno::Reference< css::drawing::XShape >& rShape ); 203 static sal_Int32 GetShapeID( const css::uno::Reference< css::drawing::XShape >& rShape, ShapeHashMap* pShapeMap ); 204 }; 205 206 }} 207 208 #endif // INCLUDED_OOX_EXPORT_SHAPES_HXX 209 210 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 211