| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef OOX_VML_VMLDRAWING_HXX |
| #define OOX_VML_VMLDRAWING_HXX |
| |
| #include <map> |
| #include <memory> |
| #include <vector> |
| #include "oox/ole/oleobjecthelper.hxx" |
| |
| namespace com { namespace sun { namespace star { |
| namespace awt { struct Rectangle; } |
| namespace awt { class XControlModel; } |
| namespace drawing { class XDrawPage; } |
| namespace drawing { class XShape; } |
| namespace drawing { class XShapes; } |
| } } } |
| |
| namespace oox { |
| namespace core { class XmlFilterBase; } |
| namespace ole { class EmbeddedControl; } |
| namespace ole { class EmbeddedForm; } |
| } |
| |
| namespace oox { |
| namespace vml { |
| |
| class ShapeBase; |
| class ShapeContainer; |
| struct ClientData; |
| |
| // ============================================================================ |
| |
| /** Enumerates different types of VML drawings. */ |
| enum DrawingType |
| { |
| VMLDRAWING_WORD, /// Word: One shape per drawing. |
| VMLDRAWING_EXCEL, /// Excel: OLE objects are part of VML. |
| VMLDRAWING_POWERPOINT /// PowerPoint: OLE objects are part of DrawingML. |
| }; |
| |
| // ============================================================================ |
| |
| /** Contains information about an OLE object embedded in a draw page. */ |
| struct OleObjectInfo : public ::oox::ole::OleObjectInfo |
| { |
| ::rtl::OUString maShapeId; /// Shape identifier for shape lookup. |
| ::rtl::OUString maName; /// Programmatical name of the OLE object. |
| bool mbAutoLoad; |
| const bool mbDmlShape; /// True = DrawingML shape (PowerPoint), false = VML shape (Excel/Word). |
| |
| explicit OleObjectInfo( bool bDmlShape = false ); |
| |
| /** Sets the string representation of the passed numeric shape identifier. */ |
| void setShapeId( sal_Int32 nShapeId ); |
| }; |
| |
| // ============================================================================ |
| |
| /** Contains information about a form control embedded in a draw page. */ |
| struct ControlInfo |
| { |
| ::rtl::OUString maShapeId; /// Shape identifier for shape lookup. |
| ::rtl::OUString maFragmentPath; /// Path to the fragment describing the form control properties. |
| ::rtl::OUString maName; /// Programmatical name of the form control. |
| |
| explicit ControlInfo(); |
| |
| /** Sets the string representation of the passed numeric shape identifier. */ |
| void setShapeId( sal_Int32 nShapeId ); |
| }; |
| |
| // ============================================================================ |
| |
| /** Represents the collection of VML shapes for a complete draw page. */ |
| class Drawing |
| { |
| public: |
| explicit Drawing( |
| ::oox::core::XmlFilterBase& rFilter, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >& rxDrawPage, |
| DrawingType eType ); |
| |
| virtual ~Drawing(); |
| |
| /** Returns the filter object that imports/exports this VML drawing. */ |
| inline ::oox::core::XmlFilterBase& getFilter() const { return mrFilter; } |
| /** Returns the application type containing the drawing. */ |
| inline DrawingType getType() const { return meType; } |
| /** Returns read/write access to the container of shapes and templates. */ |
| inline ShapeContainer& getShapes() { return *mxShapes; } |
| /** Returns read access to the container of shapes and templates. */ |
| inline const ShapeContainer& getShapes() const { return *mxShapes; } |
| /** Returns the form object used to process ActiveX form controls. */ |
| ::oox::ole::EmbeddedForm& getControlForm() const; |
| |
| /** Registers a block of shape identifiers reserved by this drawing. Block |
| size is 1024, shape identifiers are one-based (block 1 => 1025-2048). */ |
| void registerBlockId( sal_Int32 nBlockId ); |
| /** Registers the passed embedded OLE object. The related shape will then |
| load the OLE object data from the specified fragment. */ |
| void registerOleObject( const OleObjectInfo& rOleObject ); |
| /** Registers the passed embedded form control. The related shape will then |
| load the control properties from the specified fragment. */ |
| void registerControl( const ControlInfo& rControl ); |
| |
| /** Final processing after import of the fragment. */ |
| void finalizeFragmentImport(); |
| |
| /** Creates and inserts all UNO shapes into the draw page. The virtual |
| function notifyXShapeInserted() will be called for each new shape. */ |
| void convertAndInsert() const; |
| |
| /** Returns the local shape index from the passed global shape identifier. */ |
| sal_Int32 getLocalShapeIndex( const ::rtl::OUString& rShapeId ) const; |
| /** Returns the registered info structure for an OLE object, if extant. */ |
| const OleObjectInfo* getOleObjectInfo( const ::rtl::OUString& rShapeId ) const; |
| /** Returns the registered info structure for a form control, if extant. */ |
| const ControlInfo* getControlInfo( const ::rtl::OUString& rShapeId ) const; |
| |
| /** Creates a new UNO shape object, inserts it into the passed UNO shape |
| container, and sets the shape position and size. */ |
| ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > |
| createAndInsertXShape( |
| const ::rtl::OUString& rService, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, |
| const ::com::sun::star::awt::Rectangle& rShapeRect ) const; |
| |
| /** Creates a new UNO shape object for a form control, inserts the control |
| model into the form, and the shape into the passed UNO shape container. */ |
| ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > |
| createAndInsertXControlShape( |
| const ::oox::ole::EmbeddedControl& rControl, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, |
| const ::com::sun::star::awt::Rectangle& rShapeRect, |
| sal_Int32& rnCtrlIndex ) const; |
| |
| /** Derived classes may disable conversion of specific shapes. */ |
| virtual bool isShapeSupported( const ShapeBase& rShape ) const; |
| |
| /** Derived classes may return additional base names for automatic shape |
| name creation. */ |
| virtual ::rtl::OUString getShapeBaseName( const ShapeBase& rShape ) const; |
| |
| /** Derived classes may calculate the shape rectangle from a non-standard |
| anchor information string. */ |
| virtual bool convertClientAnchor( |
| ::com::sun::star::awt::Rectangle& orShapeRect, |
| const ::rtl::OUString& rShapeAnchor ) const; |
| |
| /** Derived classes create a UNO shape according to the passed shape model. |
| Called for shape models that specify being under host control. */ |
| virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > |
| createAndInsertClientXShape( |
| const ShapeBase& rShape, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, |
| const ::com::sun::star::awt::Rectangle& rShapeRect ) const; |
| |
| /** Derived classes may want to know that a UNO shape has been inserted. |
| Will be called from the convertAndInsert() implementation. |
| @param bGroupChild True = inserted into a group shape, |
| false = inserted directly into this drawing. */ |
| virtual void notifyXShapeInserted( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rxShape, |
| const ::com::sun::star::awt::Rectangle& rShapeRect, |
| const ShapeBase& rShape, bool bGroupChild ); |
| |
| private: |
| typedef ::std::vector< sal_Int32 > BlockIdVector; |
| typedef ::std::auto_ptr< ::oox::ole::EmbeddedForm > EmbeddedFormPtr; |
| typedef ::std::auto_ptr< ShapeContainer > ShapeContainerPtr; |
| typedef ::std::map< ::rtl::OUString, OleObjectInfo > OleObjectInfoMap; |
| typedef ::std::map< ::rtl::OUString, ControlInfo > ControlInfoMap; |
| |
| ::oox::core::XmlFilterBase& mrFilter; /// Filter object that imports/exports the VML drawing. |
| ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > |
| mxDrawPage; /// UNO draw page used to insert the shapes. |
| mutable EmbeddedFormPtr mxCtrlForm; /// The control form used to process embedded controls. |
| mutable BlockIdVector maBlockIds; /// Block identifiers used by this drawing. |
| ShapeContainerPtr mxShapes; /// All shapes and shape templates. |
| OleObjectInfoMap maOleObjects; /// Info about all embedded OLE objects, mapped by shape id. |
| ControlInfoMap maControls; /// Info about all embedded form controls, mapped by control name. |
| const DrawingType meType; /// Application type containing the drawing. |
| }; |
| |
| // ============================================================================ |
| |
| } // namespace vml |
| } // namespace oox |
| |
| #endif |