From a81327ff2faaf21c22f1a902bea170942d5207e6 Mon Sep 17 00:00:00 2001 From: Thorsten Behrens Date: Fri, 12 Aug 2011 15:53:12 +0200 Subject: Import SmartArt graphics to Impress Extending the existing functionality to * properly parse and model the declarative shapes * provide means for round-tripping, and re-rendering the shapes from xml snippets * implements the layouts composite, cycle, linear, and the special 'text' node This is based on the initial smartart work from hfiguiere@novell.com --- oox/Library_oox.mk | 4 + oox/inc/oox/core/fastparser.hxx | 5 + oox/inc/oox/core/filterbase.hxx | 5 + oox/inc/oox/core/xmlfilterbase.hxx | 29 +- oox/inc/oox/drawingml/chart/converterbase.hxx | 2 +- oox/inc/oox/drawingml/customshapeproperties.hxx | 1 + oox/inc/oox/drawingml/diagram/datamodelcontext.hxx | 57 -- oox/inc/oox/drawingml/diagram/diagram.hxx | 242 +------- .../drawingml/diagram/diagramfragmenthandler.hxx | 103 --- .../oox/drawingml/diagram/diagramlayoutatoms.hxx | 212 ------- oox/inc/oox/drawingml/drawingmltypes.hxx | 3 + oox/inc/oox/drawingml/graphicshapecontext.hxx | 5 +- oox/inc/oox/drawingml/scene3dcontext.hxx | 56 ++ oox/inc/oox/drawingml/shape.hxx | 28 +- oox/inc/oox/drawingml/shape3dproperties.hxx | 135 ++++ oox/inc/oox/drawingml/theme.hxx | 8 + oox/inc/oox/ppt/dgmimport.hxx | 71 +++ oox/inc/oox/ppt/dgmlayout.hxx | 72 +++ oox/inc/oox/ppt/pptimport.hxx | 2 +- oox/inc/oox/xls/excelfilter.hxx | 2 +- oox/inc/oox/xls/workbookhelper.hxx | 2 +- oox/source/core/fastparser.cxx | 5 +- oox/source/core/filterbase.cxx | 9 + oox/source/core/services.cxx | 4 + oox/source/core/xmlfilterbase.cxx | 174 +++++- oox/source/drawingml/chart/chartspaceconverter.cxx | 5 +- oox/source/drawingml/chart/converterbase.cxx | 4 +- oox/source/drawingml/chart/datasourceconverter.cxx | 13 +- oox/source/drawingml/clrscheme.cxx | 2 + oox/source/drawingml/color.cxx | 1 + oox/source/drawingml/customshapegeometry.cxx | 6 +- .../drawingml/diagram/constraintlistcontext.cxx | 101 +++ .../drawingml/diagram/constraintlistcontext.hxx | 54 ++ oox/source/drawingml/diagram/datamodelcontext.cxx | 237 +++++-- oox/source/drawingml/diagram/datamodelcontext.hxx | 56 ++ oox/source/drawingml/diagram/diagram.cxx | 518 +++++++++++----- oox/source/drawingml/diagram/diagram.hxx | 319 ++++++++++ .../drawingml/diagram/diagramdefinitioncontext.cxx | 13 +- .../drawingml/diagram/diagramdefinitioncontext.hxx | 2 +- .../drawingml/diagram/diagramfragmenthandler.cxx | 177 ++++-- .../drawingml/diagram/diagramfragmenthandler.hxx | 115 ++++ .../drawingml/diagram/diagramlayoutatoms.cxx | 689 ++++++++++++++++++++- .../drawingml/diagram/diagramlayoutatoms.hxx | 318 ++++++++++ oox/source/drawingml/diagram/layoutnodecontext.cxx | 128 ++-- oox/source/drawingml/diagram/layoutnodecontext.hxx | 3 +- oox/source/drawingml/drawingmltypes.cxx | 4 + oox/source/drawingml/fillproperties.cxx | 3 + oox/source/drawingml/graphicshapecontext.cxx | 63 +- oox/source/drawingml/lineproperties.cxx | 5 + oox/source/drawingml/scene3dcontext.cxx | 189 ++++++ oox/source/drawingml/shape.cxx | 48 +- oox/source/drawingml/shape3dproperties.cxx | 66 ++ oox/source/drawingml/shapepropertiescontext.cxx | 5 + oox/source/drawingml/textparagraph.cxx | 9 + oox/source/drawingml/textparagraphproperties.cxx | 1 + oox/source/helper/storagebase.cxx | 20 +- oox/source/ppt/dgmimport.cxx | 140 +++++ oox/source/ppt/dgmlayout.cxx | 198 ++++++ oox/source/ppt/pptimport.cxx | 4 +- oox/source/ppt/presentationfragmenthandler.cxx | 13 +- oox/source/shape/ShapeFilterBase.cxx | 4 +- oox/source/shape/ShapeFilterBase.hxx | 2 +- oox/source/xls/excelfilter.cxx | 2 +- oox/source/xls/workbookhelper.cxx | 4 +- 64 files changed, 3706 insertions(+), 1071 deletions(-) delete mode 100644 oox/inc/oox/drawingml/diagram/datamodelcontext.hxx delete mode 100644 oox/inc/oox/drawingml/diagram/diagramfragmenthandler.hxx delete mode 100644 oox/inc/oox/drawingml/diagram/diagramlayoutatoms.hxx create mode 100644 oox/inc/oox/drawingml/scene3dcontext.hxx create mode 100644 oox/inc/oox/drawingml/shape3dproperties.hxx create mode 100644 oox/inc/oox/ppt/dgmimport.hxx create mode 100644 oox/inc/oox/ppt/dgmlayout.hxx create mode 100644 oox/source/drawingml/diagram/constraintlistcontext.cxx create mode 100644 oox/source/drawingml/diagram/constraintlistcontext.hxx create mode 100644 oox/source/drawingml/diagram/datamodelcontext.hxx create mode 100644 oox/source/drawingml/diagram/diagram.hxx create mode 100644 oox/source/drawingml/diagram/diagramfragmenthandler.hxx create mode 100644 oox/source/drawingml/diagram/diagramlayoutatoms.hxx create mode 100644 oox/source/drawingml/scene3dcontext.cxx create mode 100644 oox/source/drawingml/shape3dproperties.cxx create mode 100644 oox/source/ppt/dgmimport.cxx create mode 100644 oox/source/ppt/dgmlayout.cxx (limited to 'oox') diff --git a/oox/Library_oox.mk b/oox/Library_oox.mk index 42f16c91253f..63d9c63d0226 100644 --- a/oox/Library_oox.mk +++ b/oox/Library_oox.mk @@ -125,6 +125,7 @@ $(eval $(call gb_Library_add_exception_objects,oox,\ oox/source/drawingml/connectorshapecontext \ oox/source/drawingml/customshapegeometry \ oox/source/drawingml/customshapeproperties \ + oox/source/drawingml/diagram/constraintlistcontext \ oox/source/drawingml/diagram/datamodelcontext \ oox/source/drawingml/diagram/diagram \ oox/source/drawingml/diagram/diagramdefinitioncontext \ @@ -143,6 +144,7 @@ $(eval $(call gb_Library_add_exception_objects,oox,\ oox/source/drawingml/objectdefaultcontext \ oox/source/drawingml/shapecontext \ oox/source/drawingml/shape \ + oox/source/drawingml/shape3dproperties \ oox/source/drawingml/shapegroupcontext \ oox/source/drawingml/shapepropertiescontext \ oox/source/drawingml/shapepropertymap \ @@ -230,6 +232,8 @@ $(eval $(call gb_Library_add_exception_objects,oox,\ oox/source/ppt/commontimenodecontext \ oox/source/ppt/conditioncontext \ oox/source/ppt/customshowlistcontext \ + oox/source/ppt/dgmimport \ + oox/source/ppt/dgmlayout \ oox/source/ppt/headerfootercontext \ oox/source/ppt/layoutfragmenthandler \ oox/source/ppt/pptfilterhelpers \ diff --git a/oox/inc/oox/core/fastparser.hxx b/oox/inc/oox/core/fastparser.hxx index 01dc2f0a12e8..3d13a4949db6 100644 --- a/oox/inc/oox/core/fastparser.hxx +++ b/oox/inc/oox/core/fastparser.hxx @@ -84,9 +84,14 @@ public: sal_Int32 getNamespaceId( const ::rtl::OUString& aUrl ); + ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastTokenHandler > + getTokenHandler() const { return mxTokenHandler; } + private: ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastParser > mxParser; + ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastTokenHandler > + mxTokenHandler; const NamespaceMap& mrNamespaceMap; }; diff --git a/oox/inc/oox/core/filterbase.hxx b/oox/inc/oox/core/filterbase.hxx index 4a58cc5ec9d9..cbc93791b089 100644 --- a/oox/inc/oox/core/filterbase.hxx +++ b/oox/inc/oox/core/filterbase.hxx @@ -49,6 +49,7 @@ namespace com { namespace sun { namespace star { namespace awt { struct DeviceInfo; } namespace frame { class XFrame; } namespace frame { class XModel; } + namespace drawing { class XShape; } namespace graphic { class XGraphic; } namespace io { class XInputStream; } namespace io { class XOutputStream; } @@ -147,6 +148,10 @@ public: const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& getTargetFrame() const; + /// Returns the parent shape to load into (if any) + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& + getParentShape() const; + /** Returns the status indicator (may be null). */ const ::com::sun::star::uno::Reference< ::com::sun::star::task::XStatusIndicator >& getStatusIndicator() const; diff --git a/oox/inc/oox/core/xmlfilterbase.hxx b/oox/inc/oox/core/xmlfilterbase.hxx index 17f8367becc1..0e015da7fa0b 100644 --- a/oox/inc/oox/core/xmlfilterbase.hxx +++ b/oox/inc/oox/core/xmlfilterbase.hxx @@ -43,8 +43,10 @@ namespace com { namespace sun { namespace star { namespace container { class XNameContainer; } namespace document { class XDocumentProperties; } + namespace xml { namespace dom { class XDocument; } } namespace xml { namespace sax { class XLocator; } } namespace xml { namespace sax { class XFastDocumentHandler; } } + namespace xml { namespace sax { class XFastSAXSerializable; } } } } } namespace oox { @@ -95,7 +97,7 @@ public: /** Has to be implemented by each filter, returns a filter-specific chart converter object, that should be global per imported document. */ - virtual ::oox::drawingml::chart::ChartConverter& getChartConverter() = 0; + virtual ::oox::drawingml::chart::ChartConverter* getChartConverter() = 0; /** Has to be implemented by each filter to return the table style list. */ virtual const ::oox::drawingml::table::TableStyleListPtr getTableStyles() = 0; @@ -113,6 +115,31 @@ public: */ bool importFragment( const ::rtl::Reference< FragmentHandler >& rxHandler ); + /** Imports a fragment into an xml::dom::XDocument. + + @param rFragmentPath path to fragment + + @return a non-empty reference to the XDocument, if the + fragment could be imported. + */ + ::com::sun::star::uno::Reference< + ::com::sun::star::xml::dom::XDocument> importFragment( const ::rtl::OUString& rFragmentPath ); + + /** Imports a fragment from an xml::dom::XDocument using the + passed fragment handler + + @param rxHandler fragment handler; path to fragment is + ignored, input source is the rxSerializer + + @param rxSerializer usually retrieved from a + xml::dom::XDocument, will get serialized into rxHandler + + @return true, if the fragment could be imported. + */ + bool importFragment( const ::rtl::Reference< FragmentHandler >& rxHandler, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XFastSAXSerializable >& rxSerializer ); + /** Imports the relations fragment associated with the specified fragment. @return The relations collection of the specified fragment. diff --git a/oox/inc/oox/drawingml/chart/converterbase.hxx b/oox/inc/oox/drawingml/chart/converterbase.hxx index 3c50680edbd9..ba7566e1cd77 100644 --- a/oox/inc/oox/drawingml/chart/converterbase.hxx +++ b/oox/inc/oox/drawingml/chart/converterbase.hxx @@ -82,7 +82,7 @@ protected: /** Returns the filter object of the imported/exported document. */ ::oox::core::XmlFilterBase& getFilter() const; /** Returns the chart converter. */ - ChartConverter& getChartConverter() const; + ChartConverter* getChartConverter() const; /** Returns the API chart document model. */ ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument > getChartDocument() const; diff --git a/oox/inc/oox/drawingml/customshapeproperties.hxx b/oox/inc/oox/drawingml/customshapeproperties.hxx index 112a337a8ceb..413b2a76357f 100644 --- a/oox/inc/oox/drawingml/customshapeproperties.hxx +++ b/oox/inc/oox/drawingml/customshapeproperties.hxx @@ -123,6 +123,7 @@ public: const ::com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertySet > & xPropSet, const ::com::sun::star::uno::Reference < ::com::sun::star::drawing::XShape > & xShape) const; + const rtl::OUString& getShapePresetType() const { return maShapePresetType; } void setShapePresetType( const rtl::OUString& rShapePresetType ){ maShapePresetType = rShapePresetType; }; std::vector< CustomShapeGuide >& getAdjustmentGuideList(){ return maAdjustmentGuideList; }; diff --git a/oox/inc/oox/drawingml/diagram/datamodelcontext.hxx b/oox/inc/oox/drawingml/diagram/datamodelcontext.hxx deleted file mode 100644 index 9e78a88f3696..000000000000 --- a/oox/inc/oox/drawingml/diagram/datamodelcontext.hxx +++ /dev/null @@ -1,57 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#ifndef OOX_DRAWINGML_SHAPECONTEXT_HXX -#define OOX_DRAWINGML_SHAPECONTEXT_HXX - -#include - -#include "oox/core/contexthandler.hxx" -#include "oox/drawingml/diagram/diagram.hxx" - -namespace oox { namespace drawingml { - -// CT_DataModel -class DataModelContext : public ::oox::core::ContextHandler -{ -public: - DataModelContext( ::oox::core::ContextHandler& rParent, const DiagramDataPtr & pDataModelPtr ); - virtual ~DataModelContext(); - - virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); - -protected: - DiagramDataPtr mpDataModel; -}; - -} } - -#endif // OOX_DRAWINGML_SHAPEGROUPCONTEXT_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/inc/oox/drawingml/diagram/diagram.hxx b/oox/inc/oox/drawingml/diagram/diagram.hxx index f0b77c48b8f6..9b75667f631a 100644 --- a/oox/inc/oox/drawingml/diagram/diagram.hxx +++ b/oox/inc/oox/drawingml/diagram/diagram.hxx @@ -26,232 +26,40 @@ * ************************************************************************/ - - #ifndef OOX_DRAWINGML_DIAGRAM_HXX #define OOX_DRAWINGML_DIAGRAM_HXX -#include -#include -#include +#include #include "oox/drawingml/shape.hxx" -#include "oox/drawingml/diagram/diagramlayoutatoms.hxx" - -namespace oox { namespace drawingml { - -namespace dgm { +#include "oox/core/xmlfilterbase.hxx" -/** A Connection - */ -class Connection -{ -public: - Connection() - : mnType( 0 ) - , mnSourceOrder( 0 ) - , mnDestOrder( 0 ) - { - } +#include - void dump(); - - sal_Int32 mnType; - ::rtl::OUString msModelId; - ::rtl::OUString msSourceId; - ::rtl::OUString msDestId; - ::rtl::OUString msParTransId; - ::rtl::OUString msPresId; - ::rtl::OUString msSibTransId; - sal_Int32 mnSourceOrder; - sal_Int32 mnDestOrder; - -}; - -typedef boost::shared_ptr< Connection > ConnectionPtr; -typedef std::vector< ConnectionPtr > Connections; +namespace oox { namespace drawingml { -class Point; +/** load diagram data, and put resulting graphic into shape -typedef boost::shared_ptr< Point > PointPtr; -typedef std::vector< PointPtr > Points; -/** A point + This method loads the diagram data fragments from the given paths, + generate and layout the shapes, and push it as children into the + referenced shape. */ -class Point -{ -public: - Point(); - ShapePtr & getShape( ) - { return mpShape; } - - void setCnxId( const ::rtl::OUString & sCnxId ) - { msCnxId = sCnxId; } - void setModelId( const ::rtl::OUString & sModelId ); - const ::rtl::OUString & getModelId() const - { return msModelId; } - void setType( const sal_Int32 nType ) - { mnType = nType; } - sal_Int32 getType() const - { return mnType; } - - void dump(); -private: - ShapePtr mpShape; - ::rtl::OUString msCnxId; - ::rtl::OUString msModelId; - sal_Int32 mnType; -}; - - -class PointsTree; -typedef boost::shared_ptr< PointsTree > PointsTreePtr; - -/** a points tree node */ -class PointsTree - : public boost::enable_shared_from_this< PointsTree > -{ -public: - typedef std::vector< PointsTreePtr > Childrens; - PointsTree() - {}; - PointsTree( const PointPtr & pPoint ) - : mpNode( pPoint ) - { } - bool addChild( const PointsTreePtr & pChild ); - const PointPtr & getPoint() const - { return mpNode; } - PointsTreePtr getParent() const; - Childrens::const_iterator beginChild() const - { return maChildrens.begin(); } - Childrens::const_iterator endChild() const - { return maChildrens.end(); } -private: - PointPtr mpNode; - boost::weak_ptr< PointsTree > mpParent; - Childrens maChildrens; -}; - -} - -//////////////////// - -class DiagramData -{ -public: - - DiagramData(); - FillPropertiesPtr & getFillProperties() - { return mpFillProperties; } - dgm::Connections & getConnections() - { return maConnections; } - dgm::Points & getPoints() - { return maPoints; } - void dump(); -private: - FillPropertiesPtr mpFillProperties; - dgm::Connections maConnections; - dgm::Points maPoints; -}; - -typedef boost::shared_ptr< DiagramData > DiagramDataPtr; - - - -//////////////////// - -class DiagramLayout -{ -public: - void setDefStyle( const ::rtl::OUString & sDefStyle ) - { msDefStyle = sDefStyle; } - void setMinVer( const ::rtl::OUString & sMinVer ) - { msMinVer = sMinVer; } - void setUniqueId( const ::rtl::OUString & sUniqueId ) - { msUniqueId = sUniqueId; } - const ::rtl::OUString & getUniqueId() - { return msUniqueId; } - void setTitle( const ::rtl::OUString & sTitle ) - { msTitle = sTitle; } - void setDesc( const ::rtl::OUString & sDesc ) - { msDesc = sDesc; } - - LayoutNodePtr & getNode() - { return mpNode; } - const LayoutNodePtr & getNode() const - { return mpNode; } - DiagramDataPtr & getSampData() - { return mpSampData; } - const DiagramDataPtr & getSampData() const - { return mpSampData; } - DiagramDataPtr & getStyleData() - { return mpStyleData; } - const DiagramDataPtr & getStyleData() const - { return mpStyleData; } - - void layout( const dgm::PointsTreePtr & pTree, const com::sun::star::awt::Point & pt ); -private: - ::rtl::OUString msDefStyle; - ::rtl::OUString msMinVer; - ::rtl::OUString msUniqueId; - - ::rtl::OUString msTitle; - ::rtl::OUString msDesc; - LayoutNodePtr mpNode; - DiagramDataPtr mpSampData; - DiagramDataPtr mpStyleData; - // TODO - // catLst - // clrData -}; - -typedef boost::shared_ptr< DiagramLayout > DiagramLayoutPtr; - -/////////////////////// - -class DiagramQStyles -{ - -}; - -typedef boost::shared_ptr< DiagramQStyles > DiagramQStylesPtr; - -/////////////////////// - -class DiagramColors -{ - -}; - -typedef boost::shared_ptr< DiagramColors > DiagramColorsPtr; - -/////////////////////// - -class Diagram -{ -public: - void setData( const DiagramDataPtr & ); - void setLayout( const DiagramLayoutPtr & ); - DiagramLayoutPtr getLayout() const - { - return mpLayout; - } - void setQStyles( const DiagramQStylesPtr & ); - void setColors( const DiagramColorsPtr & ); - - void addTo( const ShapePtr & pShape ); - ::rtl::OUString getLayoutId() const; -private: - void build( ); - DiagramDataPtr mpData; - DiagramLayoutPtr mpLayout; - DiagramQStylesPtr mpQStyles; - DiagramColorsPtr mpColors; - std::map< ::rtl::OUString, ShapePtr > maShapeMap; - dgm::PointsTreePtr mpRoot; -}; - - -typedef boost::shared_ptr< Diagram > DiagramPtr; - +void loadDiagram( const ShapePtr& pShape, + core::XmlFilterBase& rFilter, + const ::rtl::OUString& rDataModelPath, + const ::rtl::OUString& rLayoutPath, + const ::rtl::OUString& rQStylePath, + const ::rtl::OUString& rColorStylePath ); + +void loadDiagram( const ShapePtr& pShape, + core::XmlFilterBase& rFilter, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::dom::XDocument>& rXDataModelDom, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::dom::XDocument>& rXLayoutDom, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::dom::XDocument>& rXQStyleDom, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::dom::XDocument>& rXColorStyleDom ); } } #endif diff --git a/oox/inc/oox/drawingml/diagram/diagramfragmenthandler.hxx b/oox/inc/oox/drawingml/diagram/diagramfragmenthandler.hxx deleted file mode 100644 index 6186efbe4056..000000000000 --- a/oox/inc/oox/drawingml/diagram/diagramfragmenthandler.hxx +++ /dev/null @@ -1,103 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#ifndef OOX_DRAWINGML_DIAGRAMFRAGMENTHANDLER -#define OOX_DRAWINGML_DIAGRAMFRAGMENTHANDLER - -#include "oox/core/fragmenthandler.hxx" -#include "oox/drawingml/diagram/diagram.hxx" - -namespace oox { namespace drawingml { - - -class DiagramDataFragmentHandler : public ::oox::core::FragmentHandler -{ -public: - DiagramDataFragmentHandler( oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, const DiagramDataPtr pDataPtr ) throw(); - virtual ~DiagramDataFragmentHandler() throw(); - - virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); - -private: - - DiagramDataPtr mpDataPtr; -}; - - - -class DiagramLayoutFragmentHandler : public ::oox::core::FragmentHandler -{ -public: - DiagramLayoutFragmentHandler( oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, const DiagramLayoutPtr pDataPtr ) throw(); - virtual ~DiagramLayoutFragmentHandler() throw(); - - virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); - -private: - - DiagramLayoutPtr mpDataPtr; -}; - -class DiagramQStylesFragmentHandler : public ::oox::core::FragmentHandler -{ -public: - DiagramQStylesFragmentHandler( oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, const DiagramQStylesPtr pDataPtr ) throw(); - virtual ~DiagramQStylesFragmentHandler() throw(); - - virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); - -private: - - DiagramQStylesPtr mpDataPtr; -}; - - -class DiagramColorsFragmentHandler : public ::oox::core::FragmentHandler -{ -public: - DiagramColorsFragmentHandler( ::oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, const DiagramColorsPtr pDataPtr ) throw(); - virtual ~DiagramColorsFragmentHandler() throw(); - - virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); - -private: - - DiagramColorsPtr mpDataPtr; -}; - -} } - - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/inc/oox/drawingml/diagram/diagramlayoutatoms.hxx b/oox/inc/oox/drawingml/diagram/diagramlayoutatoms.hxx deleted file mode 100644 index 44a46a8de395..000000000000 --- a/oox/inc/oox/drawingml/diagram/diagramlayoutatoms.hxx +++ /dev/null @@ -1,212 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - - - - -#ifndef OOX_DRAWINGML_DIAGRAMLAYOUTATOMS_HXX -#define OOX_DRAWINGML_DIAGRAMLAYOUTATOMS_HXX - -#include -#include - -#include -#include - -#include -#include - -#include "oox/drawingml/shape.hxx" - - -namespace oox { namespace drawingml { - - -// AG_IteratorAttributes -class IteratorAttr -{ -public: - IteratorAttr(); - - // not sure this belong here, but wth - void loadFromXAttr( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes ); - -private: - sal_Int32 mnAxis; - sal_Int32 mnCnt; - sal_Bool mbHideLastTrans; - sal_Int32 mnPtType; - sal_Int32 mnSt; - sal_Int32 mnStep; -}; - -class ConditionAttr -{ -public: - ConditionAttr(); - - // not sure this belong here, but wth - void loadFromXAttr( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes ); - -private: - sal_Int32 mnFunc; - sal_Int32 mnArg; - sal_Int32 mnOp; - ::rtl::OUString msVal; -}; - -class LayoutAtom; - -typedef boost::shared_ptr< LayoutAtom > LayoutAtomPtr; - -/** abstract Atom for the layout */ -class LayoutAtom -{ -public: - virtual ~LayoutAtom() - {} - // TODO change signature to the proper one - virtual void processAtom() = 0; - void setName( const ::rtl::OUString & sName ) - { msName = sName; } - void addChild( const LayoutAtomPtr & pNode ) - { mpChildNodes.push_back( pNode ); } - - // dump for debug - virtual void dump(int level = 0); -protected: - std::vector< LayoutAtomPtr > mpChildNodes; - ::rtl::OUString msName; -}; - -class AlgAtom - : public LayoutAtom -{ -public: - virtual ~AlgAtom() - {} - typedef std::map< std::string, ::com::sun::star::uno::Any > ParamMap; - - virtual void processAtom() - {} -private: - ParamMap mParams; -}; - - -class ForEachAtom - : public LayoutAtom -{ -public: - virtual ~ForEachAtom() - {} - - IteratorAttr & iterator() - { return maIter; } - virtual void processAtom(); -private: - IteratorAttr maIter; -}; - -typedef boost::shared_ptr< ForEachAtom > ForEachAtomPtr; - - -class ConditionAtom - : public LayoutAtom -{ -public: - ConditionAtom( bool bElse = false ) - : LayoutAtom( ) - , mbElse( bElse ) - {} - virtual ~ConditionAtom() - {} - bool test(); - virtual void processAtom() - {} - IteratorAttr & iterator() - { return maIter; } - ConditionAttr & cond() - { return maCond; } -private: - bool mbElse; - IteratorAttr maIter; - ConditionAttr maCond; -}; - -typedef boost::shared_ptr< ConditionAtom > ConditionAtomPtr; - - -/** "choose" statements. Atoms will be tested in order. */ -class ChooseAtom - : public LayoutAtom -{ -public: - virtual ~ChooseAtom() - {} - virtual void processAtom(); -}; - -class LayoutNode - : public LayoutAtom -{ -public: - enum { - VAR_animLvl = 0, - VAR_animOne, - VAR_bulletEnabled, - VAR_chMax, - VAR_chPref, - VAR_dir, - VAR_hierBranch, - VAR_orgChart, - VAR_resizeHandles - }; - // we know that the array is of fixed size - // the use of Any allow having empty values - typedef boost::array< ::com::sun::star::uno::Any, 9 > VarMap; - - virtual ~LayoutNode() - {} - virtual void processAtom() - {} - VarMap & variables() - { return mVariables; } -private: - VarMap mVariables; - std::vector< ShapePtr > mpShapes; -}; - -typedef boost::shared_ptr< LayoutNode > LayoutNodePtr; - -} } - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/inc/oox/drawingml/drawingmltypes.hxx b/oox/inc/oox/drawingml/drawingmltypes.hxx index 86a1ddb7bd23..c66d729c8aa3 100644 --- a/oox/inc/oox/drawingml/drawingmltypes.hxx +++ b/oox/inc/oox/drawingml/drawingmltypes.hxx @@ -60,6 +60,9 @@ typedef ::boost::shared_ptr< FillProperties > FillPropertiesPtr; struct GraphicProperties; typedef ::boost::shared_ptr< GraphicProperties > GraphicPropertiesPtr; +struct Shape3DProperties; +typedef ::boost::shared_ptr< Shape3DProperties > Shape3DPropertiesPtr; + struct TextCharacterProperties; typedef ::boost::shared_ptr< TextCharacterProperties > TextCharacterPropertiesPtr; diff --git a/oox/inc/oox/drawingml/graphicshapecontext.hxx b/oox/inc/oox/drawingml/graphicshapecontext.hxx index 45ac831aa1c8..0abfbaa12af6 100644 --- a/oox/inc/oox/drawingml/graphicshapecontext.hxx +++ b/oox/inc/oox/drawingml/graphicshapecontext.hxx @@ -31,7 +31,6 @@ #include "oox/drawingml/shape.hxx" #include "oox/drawingml/shapecontext.hxx" -#include "oox/drawingml/diagram/diagram.hxx" namespace oox { namespace vml { struct OleObjectInfo; } } @@ -74,6 +73,8 @@ private: // ==================================================================== +class Diagram; + class DiagramGraphicDataContext : public ShapeContext { @@ -83,8 +84,6 @@ public: virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); private: - DiagramPtr loadDiagram(); - ::rtl::OUString msDm; ::rtl::OUString msLo; ::rtl::OUString msQs; diff --git a/oox/inc/oox/drawingml/scene3dcontext.hxx b/oox/inc/oox/drawingml/scene3dcontext.hxx new file mode 100644 index 000000000000..c64bbf3358b2 --- /dev/null +++ b/oox/inc/oox/drawingml/scene3dcontext.hxx @@ -0,0 +1,56 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: fillpropertiesgroupcontext.hxx,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_SCENE3DPROPERTIESCONTEXT_HPP +#define OOX_DRAWINGML_SCENE3DPROPERTIESCONTEXT_HPP + +#include "oox/core/contexthandler.hxx" + +namespace oox { namespace drawingml { + +struct Shape3DProperties; + +// --------------------------------------------------------------------- + +class Scene3DPropertiesContext : public ::oox::core::ContextHandler +{ +public: + Scene3DPropertiesContext( ::oox::core::ContextHandler& rParent, Shape3DProperties& r3DProperties ) throw(); + + ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) + throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException ); + +private: + Shape3DProperties& mr3DProperties; +}; + +} } + +#endif // OOX_DRAWINGML_SCENE3DPROPERTIESCONTEXT_HPP diff --git a/oox/inc/oox/drawingml/shape.hxx b/oox/inc/oox/drawingml/shape.hxx index 486b8ef719fe..325af38c3ab8 100644 --- a/oox/inc/oox/drawingml/shape.hxx +++ b/oox/inc/oox/drawingml/shape.hxx @@ -33,6 +33,7 @@ #include "oox/drawingml/drawingmltypes.hxx" #include "oox/drawingml/customshapeproperties.hxx" #include "oox/drawingml/textliststyle.hxx" +#include "oox/drawingml/shape3dproperties.hxx" #include #include @@ -80,6 +81,7 @@ class Shape public: explicit Shape( const sal_Char* pServiceType = 0 ); + explicit Shape( const ShapePtr& pSourceShape ); virtual ~Shape(); rtl::OUString& getServiceName(){ return msServiceName; } @@ -98,13 +100,20 @@ public: CustomShapePropertiesPtr getCustomShapeProperties(){ return mpCustomShapePropertiesPtr; } + Shape3DProperties& get3DProperties() { return *mp3DPropertiesPtr; } + const Shape3DProperties& get3DProperties() const { return *mp3DPropertiesPtr; } + table::TablePropertiesPtr getTableProperties(); void setChildPosition( com::sun::star::awt::Point nPosition ){ maChPosition = nPosition; } void setChildSize( com::sun::star::awt::Size aSize ){ maChSize = aSize; } - void setPosition( com::sun::star::awt::Point nPosition ){ maPosition = nPosition; } - void setSize( com::sun::star::awt::Size aSize ){ maSize = aSize; } + void setPosition( com::sun::star::awt::Point nPosition ){ maPosition = nPosition; } + const com::sun::star::awt::Point& getPosition() const { return maPosition; } + + void setSize( com::sun::star::awt::Size aSize ){ maSize = aSize; } + const com::sun::star::awt::Size& getSize() const { return maSize; } + void setRotation( sal_Int32 nRotation ) { mnRotation = nRotation; } void setFlip( sal_Bool bFlipH, sal_Bool bFlipV ) { mbFlipH = bFlipH; mbFlipV = bFlipV; } void addChild( const ShapePtr pChildPtr ) { maChildren.push_back( pChildPtr ); } @@ -149,6 +158,14 @@ public: void dropChildren() { maChildren.clear(); } + void addChildren( + ::oox::core::XmlFilterBase& rFilterBase, + const Theme* pTheme, + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + basegfx::B2DHomMatrix& aTransformation, + const ::com::sun::star::awt::Rectangle* pShapeRect = 0, + ShapeIdMap* pShapeMap = 0 ); + void setXShape( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rXShape ) { mxShape = rXShape; }; const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & @@ -199,6 +216,7 @@ protected: GraphicPropertiesPtr mpGraphicPropertiesPtr; CustomShapePropertiesPtr mpCustomShapePropertiesPtr; table::TablePropertiesPtr mpTablePropertiesPtr; + Shape3DPropertiesPtr mp3DPropertiesPtr; PropertyMap maShapeProperties; PropertyMap maDefaultShapeProperties; TextListStylePtr mpMasterTextListStyle; @@ -238,7 +256,11 @@ private: sal_Bool mbHidden; }; -::rtl::OUString GetShapeType( sal_Int32 nType ); +// --------------------------------------------------------------------- + +/** Get custom shape preset string from xml token id + */ +::rtl::OUString GetShapePresetType( sal_Int32 nType ); // ============================================================================ diff --git a/oox/inc/oox/drawingml/shape3dproperties.hxx b/oox/inc/oox/drawingml/shape3dproperties.hxx new file mode 100644 index 000000000000..2fe82aad3f68 --- /dev/null +++ b/oox/inc/oox/drawingml/shape3dproperties.hxx @@ -0,0 +1,135 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: fillproperties.hxx,v $ + * $Revision: 1.7 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_SHAPE3DPROPERTIES_HXX +#define OOX_DRAWINGML_SHAPE3DPROPERTIES_HXX + +#include +#include +#include +#include "oox/core/xmlfilterbase.hxx" +#include "oox/drawingml/color.hxx" +#include "oox/helper/helper.hxx" + +namespace oox { class PropertyMap; } +namespace oox { class PropertySet; } +namespace oox { namespace core { class ModelObjectContainer; } } + +namespace oox { +namespace drawingml { + +// ============================================================================ + +struct Shape3DPropertyNames +{ + ::rtl::OUString maFillStyle; + ::rtl::OUString maFillColor; + ::rtl::OUString maFillTransparence; + ::rtl::OUString maFillGradient; + ::rtl::OUString maFillBitmap; + ::rtl::OUString maFillBitmapMode; + ::rtl::OUString maFillBitmapTile; + ::rtl::OUString maFillBitmapStretch; + ::rtl::OUString maFillBitmapLogicalSize; + ::rtl::OUString maFillBitmapSizeX; + ::rtl::OUString maFillBitmapSizeY; + ::rtl::OUString maFillBitmapOffsetX; + ::rtl::OUString maFillBitmapOffsetY; + ::rtl::OUString maFillBitmapRectanglePoint; + bool mbNamedFillGradient; + bool mbNamedFillBitmap; + bool mbTransformGraphic; + + Shape3DPropertyNames(); +}; + +// ============================================================================ + +struct Shape3DProperties +{ + typedef ::std::map< double, Color > GradientStopMap; + + OptValue< sal_Int32 > moFillType; /// Fill type (OOXML token). + OptValue< bool > moRotateWithShape; /// True = rotate gradient/bitmap with shape. + Color maFillColor; /// Solid fill color and transparence. + GradientStopMap maGradientStops; /// Gradient stops (colors/transparence). + OptValue< sal_Int32 > moGradientPath; /// If set, gradient follows rectangle, circle, or shape. + OptValue< sal_Int32 > moShadeAngle; /// Rotation angle of linear gradients. + OptValue< bool > moShadeScaled; + OptValue< sal_Int32 > moFlipModeToken; + OptValue< com::sun::star::geometry::IntegerRectangle2D > moFillToRect; + OptValue< com::sun::star::geometry::IntegerRectangle2D > moTileRect; + OptValue< sal_Int32 > moPattPreset; /// Preset pattern type. + Color maPattFgColor; /// Pattern foreground color. + Color maPattBgColor; /// Pattern background color. + ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > mxGraphic; + Color maColorChangeFrom; /// Start color of color transformation. + Color maColorChangeTo; /// Destination color of color transformation. + OptValue< sal_Int32 > moBitmapMode; /// Bitmap tile or stretch. + OptValue< sal_Int32 > moTileX; /// Width of bitmap tiles. + OptValue< sal_Int32 > moTileY; /// Height of bitmap tiles. + OptValue< sal_Int32 > moTileSX; + OptValue< sal_Int32 > moTileSY; + OptValue< sal_Int32 > moTileAlign; /// Anchor point inside bitmap. + + static Shape3DPropertyNames DEFAULTNAMES; /// Default fill property names for shape fill. + static Shape3DPropertyNames DEFAULTPICNAMES; /// Default fill property names for pictures. + + /** Overwrites all members that are explicitly set in rSourceProps. */ + void assignUsed( const Shape3DProperties& rSourceProps ); + + /** Tries to resolve current settings to a solid color, e.g. returns the + start color of a gradient. */ + Color getBestSolidColor() const; + + /** Writes the properties to the passed property map. */ + void pushToPropMap( + PropertyMap& rPropMap, + const Shape3DPropertyNames& rPropNames, + const ::oox::core::XmlFilterBase& rFilter, + ::oox::core::ModelObjectContainer& rObjContainer, + sal_Int32 nShapeRotation, sal_Int32 nPhClr ) const; + + /** Writes the properties to the passed property set. */ + void pushToPropSet( + PropertySet& rPropSet, + const Shape3DPropertyNames& rPropNames, + const ::oox::core::XmlFilterBase& rFilter, + ::oox::core::ModelObjectContainer& rObjContainer, + sal_Int32 nShapeRotation, sal_Int32 nPhClr ) const; +}; + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + +#endif + diff --git a/oox/inc/oox/drawingml/theme.hxx b/oox/inc/oox/drawingml/theme.hxx index 81041be136d3..d6dbb2c57312 100644 --- a/oox/inc/oox/drawingml/theme.hxx +++ b/oox/inc/oox/drawingml/theme.hxx @@ -32,6 +32,7 @@ #include "oox/drawingml/clrscheme.hxx" #include "oox/drawingml/shape.hxx" #include "oox/drawingml/textfont.hxx" +#include namespace oox { namespace drawingml { @@ -94,6 +95,11 @@ public: inline Shape& getTxDef() { return maTxDef; } inline const Shape& getTxDef() const { return maTxDef; } + void setFragment( const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::dom::XDocument>& xRef ) { mxFragment=xRef; } + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::dom::XDocument>& getFragment() const { return mxFragment; } + private: ::rtl::OUString maStyleName; ClrScheme maClrScheme; @@ -105,6 +111,8 @@ private: Shape maSpDef; Shape maLnDef; Shape maTxDef; + ::com::sun::star::uno::Reference< + ::com::sun::star::xml::dom::XDocument> mxFragment; }; // ============================================================================ diff --git a/oox/inc/oox/ppt/dgmimport.hxx b/oox/inc/oox/ppt/dgmimport.hxx new file mode 100644 index 000000000000..8541eb789586 --- /dev/null +++ b/oox/inc/oox/ppt/dgmimport.hxx @@ -0,0 +1,71 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: pptimport.hxx,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef OOX_POWERPOINT_QUICKDIAGRAMMINGIMPORT_HXX +#define OOX_POWERPOINT_QUICKDIAGRAMMINGIMPORT_HXX + +#include "oox/core/xmlfilterbase.hxx" + +#include +#include +#include "oox/ppt/presentationfragmenthandler.hxx" +#include "oox/ppt/slidepersist.hxx" +#include +#include + +namespace oox { namespace ppt { + +// --------------------------------------------------------------------- + +class QuickDiagrammingImport : public oox::core::XmlFilterBase +{ +public: + + QuickDiagrammingImport( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext ); + + // from FilterBase + virtual bool importDocument() throw(); + virtual bool exportDocument() throw(); + + virtual const ::oox::drawingml::Theme* getCurrentTheme() const; + virtual sal_Int32 getSchemeClr( sal_Int32 nColorSchemeToken ) const; + virtual const oox::drawingml::table::TableStyleListPtr getTableStyles(); + + virtual oox::vml::Drawing* getVmlDrawing(); + virtual oox::drawingml::chart::ChartConverter* getChartConverter(); + +private: + virtual ::rtl::OUString implGetImplementationName() const; + virtual ::oox::ole::VbaProject* implCreateVbaProject() const; +}; + +} } + +#endif // OOX_POWERPOINT_QUICKDIAGRAMMINGIMPORT_HXX diff --git a/oox/inc/oox/ppt/dgmlayout.hxx b/oox/inc/oox/ppt/dgmlayout.hxx new file mode 100644 index 000000000000..6f8161eb3329 --- /dev/null +++ b/oox/inc/oox/ppt/dgmlayout.hxx @@ -0,0 +1,72 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: pptimport.hxx,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef OOX_POWERPOINT_QUICKDIAGRAMMINGLAYOUT_HXX +#define OOX_POWERPOINT_QUICKDIAGRAMMINGLAYOUT_HXX + +#include "oox/core/xmlfilterbase.hxx" + +#include +#include +#include "oox/ppt/presentationfragmenthandler.hxx" +#include "oox/ppt/slidepersist.hxx" +#include +#include + +namespace oox { namespace ppt { + +// --------------------------------------------------------------------- + +class QuickDiagrammingLayout : public oox::core::XmlFilterBase +{ +public: + + QuickDiagrammingLayout( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext ); + + // from FilterBase + virtual bool importDocument() throw(); + virtual bool exportDocument() throw(); + + virtual const ::oox::drawingml::Theme* getCurrentTheme() const; + virtual sal_Int32 getSchemeClr( sal_Int32 nColorSchemeToken ) const; + virtual const oox::drawingml::table::TableStyleListPtr getTableStyles(); + + virtual ::oox::vml::Drawing* getVmlDrawing(); + virtual ::oox::drawingml::chart::ChartConverter* getChartConverter(); + +private: + virtual ::rtl::OUString implGetImplementationName() const; + virtual ::oox::ole::VbaProject* implCreateVbaProject() const; + drawingml::ThemePtr mpThemePtr; +}; + +} } + +#endif // OOX_POWERPOINT_QUICKDIAGRAMMINGLAYOUT_HXX diff --git a/oox/inc/oox/ppt/pptimport.hxx b/oox/inc/oox/ppt/pptimport.hxx index 06f345ba0f8c..79df4219505b 100644 --- a/oox/inc/oox/ppt/pptimport.hxx +++ b/oox/inc/oox/ppt/pptimport.hxx @@ -57,7 +57,7 @@ public: virtual const ::oox::drawingml::Theme* getCurrentTheme() const; virtual ::oox::vml::Drawing* getVmlDrawing(); virtual const oox::drawingml::table::TableStyleListPtr getTableStyles(); - virtual ::oox::drawingml::chart::ChartConverter& getChartConverter(); + virtual ::oox::drawingml::chart::ChartConverter* getChartConverter(); void setActualSlidePersist( SlidePersistPtr pActualSlidePersist ){ mpActualSlidePersist = pActualSlidePersist; }; std::map< rtl::OUString, oox::drawingml::ThemePtr >& getThemes(){ return maThemes; }; diff --git a/oox/inc/oox/xls/excelfilter.hxx b/oox/inc/oox/xls/excelfilter.hxx index e4cc7679ca01..c15b6cc542cf 100644 --- a/oox/inc/oox/xls/excelfilter.hxx +++ b/oox/inc/oox/xls/excelfilter.hxx @@ -71,7 +71,7 @@ public: virtual const ::oox::drawingml::Theme* getCurrentTheme() const; virtual ::oox::vml::Drawing* getVmlDrawing(); virtual const ::oox::drawingml::table::TableStyleListPtr getTableStyles(); - virtual ::oox::drawingml::chart::ChartConverter& getChartConverter(); + virtual ::oox::drawingml::chart::ChartConverter* getChartConverter(); virtual sal_Bool SAL_CALL filter( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rDescriptor ) throw( ::com::sun::star::uno::RuntimeException ); diff --git a/oox/inc/oox/xls/workbookhelper.hxx b/oox/inc/oox/xls/workbookhelper.hxx index 8509e1372ee6..bb9a3d29e398 100644 --- a/oox/inc/oox/xls/workbookhelper.hxx +++ b/oox/inc/oox/xls/workbookhelper.hxx @@ -250,7 +250,7 @@ public: /** Returns the converter for string to cell address/range conversion. */ AddressConverter& getAddressConverter() const; /** Returns the chart object converter. */ - ExcelChartConverter& getChartConverter() const; + ExcelChartConverter* getChartConverter() const; /** Returns the page and print settings converter. */ PageSettingsConverter& getPageSettingsConverter() const; diff --git a/oox/source/core/fastparser.cxx b/oox/source/core/fastparser.cxx index 947397a33228..d6b37bcfe450 100644 --- a/oox/source/core/fastparser.cxx +++ b/oox/source/core/fastparser.cxx @@ -81,8 +81,11 @@ FastParser::FastParser( const Reference< XComponentContext >& rxContext ) throw( Reference< XMultiComponentFactory > xFactory( rxContext->getServiceManager(), UNO_SET_THROW ); mxParser.set( xFactory->createInstanceWithContext( CREATE_OUSTRING( "com.sun.star.xml.sax.FastParser" ), rxContext ), UNO_QUERY_THROW ); + // create the fast tokenhandler + mxTokenHandler.set( new FastTokenHandler ); + // create the fast token handler based on the OOXML token list - mxParser->setTokenHandler( new FastTokenHandler ); + mxParser->setTokenHandler( mxTokenHandler ); } FastParser::~FastParser() diff --git a/oox/source/core/filterbase.cxx b/oox/source/core/filterbase.cxx index 5c8ca79307ec..5e37d06ebc9a 100644 --- a/oox/source/core/filterbase.cxx +++ b/oox/source/core/filterbase.cxx @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -53,6 +54,7 @@ namespace core { using namespace ::com::sun::star::beans; using namespace ::com::sun::star::frame; using namespace ::com::sun::star::graphic; +using namespace ::com::sun::star::drawing; using namespace ::com::sun::star::io; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::task; @@ -159,6 +161,7 @@ struct FilterBaseImpl Reference< XStream > mxOutStream; Reference< XStatusIndicator > mxStatusIndicator; Reference< XInteractionHandler > mxInteractionHandler; + Reference< XShape > mxParentShape; explicit FilterBaseImpl( const Reference< XComponentContext >& rxContext ) throw( RuntimeException ); @@ -281,6 +284,11 @@ const Reference< XFrame >& FilterBase::getTargetFrame() const return mxImpl->mxTargetFrame; } +const Reference< XShape >& FilterBase::getParentShape() const +{ + return mxImpl->mxParentShape; +} + const Reference< XStatusIndicator >& FilterBase::getStatusIndicator() const { return mxImpl->mxStatusIndicator; @@ -578,6 +586,7 @@ void FilterBase::setMediaDescriptor( const Sequence< PropertyValue >& rMediaDesc mxImpl->mxTargetFrame = mxImpl->maMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_FRAME(), Reference< XFrame >() ); mxImpl->mxStatusIndicator = mxImpl->maMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_STATUSINDICATOR(), Reference< XStatusIndicator >() ); mxImpl->mxInteractionHandler = mxImpl->maMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_INTERACTIONHANDLER(), Reference< XInteractionHandler >() ); + mxImpl->mxParentShape = mxImpl->maMediaDesc.getUnpackedValueOrDefault( CREATE_OUSTRING( "ParentShape" ), mxImpl->mxParentShape ); // Check for ISO OOXML OUString sFilterName = mxImpl->maMediaDesc.getUnpackedValueOrDefault( CREATE_OUSTRING( "FilterName" ), OUString() ); diff --git a/oox/source/core/services.cxx b/oox/source/core/services.cxx index 199d8a695048..a0d2a46b24a9 100644 --- a/oox/source/core/services.cxx +++ b/oox/source/core/services.cxx @@ -44,6 +44,8 @@ namespace oox { namespace docprop { DECLARE_FUNCTIONS( DocumentPropertiesImport ); } namespace ole { DECLARE_FUNCTIONS( WordVbaProjectFilter ); } namespace ppt { DECLARE_FUNCTIONS( PowerPointImport ); } + namespace ppt { DECLARE_FUNCTIONS( QuickDiagrammingImport ); } + namespace ppt { DECLARE_FUNCTIONS( QuickDiagrammingLayout ); } namespace shape { DECLARE_FUNCTIONS( ShapeContextHandler ); } namespace xls { DECLARE_FUNCTIONS( BiffDetector ); } namespace xls { DECLARE_FUNCTIONS( ExcelFilter ); } @@ -68,6 +70,8 @@ static ::cppu::ImplementationEntry const spServices[] = IMPLEMENTATION_ENTRY( ::oox::docprop::DocumentPropertiesImport ), IMPLEMENTATION_ENTRY( ::oox::ole::WordVbaProjectFilter ), IMPLEMENTATION_ENTRY( ::oox::ppt::PowerPointImport ), + IMPLEMENTATION_ENTRY( ::oox::ppt::QuickDiagrammingImport ), + IMPLEMENTATION_ENTRY( ::oox::ppt::QuickDiagrammingLayout ), IMPLEMENTATION_ENTRY( ::oox::shape::ShapeContextHandler ), IMPLEMENTATION_ENTRY( ::oox::xls::BiffDetector ), IMPLEMENTATION_ENTRY( ::oox::xls::ExcelFilter ), diff --git a/oox/source/core/xmlfilterbase.cxx b/oox/source/core/xmlfilterbase.cxx index 1daea946eb33..7d17921afd4a 100644 --- a/oox/source/core/xmlfilterbase.cxx +++ b/oox/source/core/xmlfilterbase.cxx @@ -33,11 +33,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include "oox/core/fastparser.hxx" #include "oox/core/filterdetect.hxx" #include "oox/core/fragmenthandler.hxx" @@ -48,6 +50,8 @@ #include "oox/helper/zipstorage.hxx" #include #include +#include +#include #include #include #include @@ -56,6 +60,9 @@ using ::com::sun::star::uno::XComponentContext; using ::com::sun::star::document::XOOXMLDocumentPropertiesImporter; using ::com::sun::star::document::XDocumentPropertiesSupplier; +using ::com::sun::star::xml::dom::XDocument; +using ::com::sun::star::xml::dom::XDocumentBuilder; +using ::com::sun::star::xml::sax::XFastSAXSerializable; using ::com::sun::star::beans::XPropertySet; using ::com::sun::star::lang::XComponent; @@ -103,46 +110,89 @@ struct XmlFilterBaseImpl { typedef RefMap< OUString, Relations > RelationsMap; - FastParser maFastParser; - const OUString maBinSuffix; - const OUString maVmlSuffix; - RelationsMap maRelationsMap; - TextFieldStack maTextFieldStack; + FastParser maFastParser; + const OUString maBinSuffix; + const OUString maVmlSuffix; + RelationsMap maRelationsMap; + TextFieldStack maTextFieldStack; explicit XmlFilterBaseImpl( const Reference< XComponentContext >& rxContext ) throw( RuntimeException ); }; // ---------------------------------------------------------------------------- +namespace +{ + struct NamespaceIds: public rtl::StaticWithInit< + Sequence< Pair< OUString, sal_Int32 > >, + NamespaceIds> + { + Sequence< Pair< OUString, sal_Int32 > > operator()() + { + static const char* const namespaceURIs[] = { + "http://www.w3.org/XML/1998/namespace", + "http://schemas.openxmlformats.org/package/2006/relationships", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships", + "http://schemas.openxmlformats.org/drawingml/2006/main", + "http://schemas.openxmlformats.org/drawingml/2006/diagram", + "http://schemas.openxmlformats.org/drawingml/2006/chart", + "http://schemas.openxmlformats.org/drawingml/2006/chartDrawing", + "urn:schemas-microsoft-com:vml", + "urn:schemas-microsoft-com:office:office", + "urn:schemas-microsoft-com:office:word", + "urn:schemas-microsoft-com:office:excel", + "urn:schemas-microsoft-com:office:powerpoint", + "http://schemas.microsoft.com/office/2006/activeX", + "http://schemas.openxmlformats.org/spreadsheetml/2006/main", + "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing", + "http://schemas.microsoft.com/office/excel/2006/main", + "http://schemas.openxmlformats.org/presentationml/2006/main" + }; + + static const sal_Int32 namespaceIds[] = { + NMSP_xml, + NMSP_packageRel, + NMSP_officeRel, + NMSP_dml, + NMSP_dmlDiagram, + NMSP_dmlChart, + NMSP_dmlChartDr, + NMSP_dmlSpreadDr, + NMSP_vml, + NMSP_vmlOffice, + NMSP_vmlWord, + NMSP_vmlExcel, + NMSP_vmlPowerpoint, + NMSP_xls, + NMSP_ppt, + NMSP_ax, + NMSP_xm, + NMSP_mce, + NMSP_mceTest, + }; + + Sequence< Pair< OUString, sal_Int32 > > aRet(STATIC_ARRAY_SIZE(namespaceIds)); + for( sal_Int32 i=0; i& rxContext ) throw( RuntimeException ) : maFastParser( rxContext ), maBinSuffix( CREATE_OUSTRING( ".bin" ) ), maVmlSuffix( CREATE_OUSTRING( ".vml" ) ) { // register XML namespaces - maFastParser.registerNamespace( NMSP_xml ); - maFastParser.registerNamespace( NMSP_packageRel ); - maFastParser.registerNamespace( NMSP_officeRel ); - - maFastParser.registerNamespace( NMSP_dml ); - maFastParser.registerNamespace( NMSP_dmlDiagram ); - maFastParser.registerNamespace( NMSP_dmlChart ); - maFastParser.registerNamespace( NMSP_dmlChartDr ); - maFastParser.registerNamespace( NMSP_dmlSpreadDr ); - - maFastParser.registerNamespace( NMSP_vml ); - maFastParser.registerNamespace( NMSP_vmlOffice ); - maFastParser.registerNamespace( NMSP_vmlWord ); - maFastParser.registerNamespace( NMSP_vmlExcel ); - maFastParser.registerNamespace( NMSP_vmlPowerpoint ); - - maFastParser.registerNamespace( NMSP_xls ); - maFastParser.registerNamespace( NMSP_ppt ); - - maFastParser.registerNamespace( NMSP_ax ); - maFastParser.registerNamespace( NMSP_xm ); - maFastParser.registerNamespace( NMSP_mce ); - maFastParser.registerNamespace( NMSP_mceTest ); + const Sequence< Pair< OUString, sal_Int32 > > ids= + NamespaceIds::get(); + for( sal_Int32 i=0; imaFastParser.getNamespaceId( rUrl ); } +Reference XmlFilterBase::importFragment( const ::rtl::OUString& aFragmentPath ) +{ + Reference xRet; + + // path to fragment stream valid? + OSL_ENSURE( aFragmentPath.getLength() > 0, "XmlFilterBase::importFragment - empty fragment path" ); + if( aFragmentPath.getLength() == 0 ) + return xRet; + + // try to open the fragment stream (this may fail - do not assert) + Reference< XInputStream > xInStrm = openInputStream( aFragmentPath ); + if( !xInStrm.is() ) + return xRet; + + // binary streams (fragment extension is '.bin') currently not supported + sal_Int32 nBinSuffixPos = aFragmentPath.getLength() - mxImpl->maBinSuffix.getLength(); + if( (nBinSuffixPos >= 0) && aFragmentPath.match( mxImpl->maBinSuffix, nBinSuffixPos ) ) + return xRet; + + // try to import XML stream + try + { + // create the dom parser + Reference< XComponentContext > xContext = + lcl_getComponentContext(getServiceFactory()); + Reference xDomBuilder( + xContext->getServiceManager()->createInstanceWithContext( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.dom.DocumentBuilder" )), + xContext), + UNO_QUERY_THROW ); + + // create DOM from fragment + xRet = xDomBuilder->parse(xInStrm); + } + catch( Exception& ) + { + } + + return xRet; +} + +bool XmlFilterBase::importFragment( const ::rtl::Reference< FragmentHandler >& rxHandler, + const Reference< XFastSAXSerializable >& rxSerializer ) +{ + Reference< XFastDocumentHandler > xDocHandler( rxHandler.get() ); + if( !xDocHandler.is() ) + return false; + + // try to import XML stream + try + { + rxSerializer->fastSerialize( xDocHandler, + mxImpl->maFastParser.getTokenHandler(), + Sequence< StringPair >(), + NamespaceIds::get() ); + return true; + } + catch( Exception& ) + {} + + return false; +} + RelationsRef XmlFilterBase::importRelations( const OUString& rFragmentPath ) { // try to find cached relations @@ -555,6 +668,11 @@ XmlFilterBase& XmlFilterBase::exportDocumentProperties( Reference< XDocumentProp return *this; } +::oox::drawingml::chart::ChartConverter* XmlFilterBase::getChartConverter() +{ + return 0; +} + // protected ------------------------------------------------------------------ Reference< XInputStream > XmlFilterBase::implGetInputStream( MediaDescriptor& rMediaDesc ) const diff --git a/oox/source/drawingml/chart/chartspaceconverter.cxx b/oox/source/drawingml/chart/chartspaceconverter.cxx index 44ae5c0e95b2..822ac520d66b 100644 --- a/oox/source/drawingml/chart/chartspaceconverter.cxx +++ b/oox/source/drawingml/chart/chartspaceconverter.cxx @@ -84,9 +84,12 @@ ChartSpaceConverter::~ChartSpaceConverter() void ChartSpaceConverter::convertFromModel( const Reference< XShapes >& rxExternalPage, const Point& rChartPos ) { + if( !getChartConverter() ) + return; + /* create data provider (virtual function in the ChartConverter class, derived converters may create an external data provider) */ - getChartConverter().createDataProvider( getChartDocument() ); + getChartConverter()->createDataProvider( getChartDocument() ); // attach number formatter of container document to data receiver try diff --git a/oox/source/drawingml/chart/converterbase.cxx b/oox/source/drawingml/chart/converterbase.cxx index 7e563ae15b03..d4735b51a694 100644 --- a/oox/source/drawingml/chart/converterbase.cxx +++ b/oox/source/drawingml/chart/converterbase.cxx @@ -255,9 +255,9 @@ XmlFilterBase& ConverterRoot::getFilter() const return mxData->mrFilter; } -ChartConverter& ConverterRoot::getChartConverter() const +ChartConverter* ConverterRoot::getChartConverter() const { - return mxData->mrConverter; + return &mxData->mrConverter; } Reference< XChartDocument > ConverterRoot::getChartDocument() const diff --git a/oox/source/drawingml/chart/datasourceconverter.cxx b/oox/source/drawingml/chart/datasourceconverter.cxx index 805595f12467..4f5da6e72a8c 100644 --- a/oox/source/drawingml/chart/datasourceconverter.cxx +++ b/oox/source/drawingml/chart/datasourceconverter.cxx @@ -57,12 +57,15 @@ DataSequenceConverter::~DataSequenceConverter() Reference< XDataSequence > DataSequenceConverter::createDataSequence( const OUString& rRole ) { // create data sequence from data source model (virtual call at chart converter) - Reference< XDataSequence > xDataSeq = getChartConverter().createDataSequence( getChartDocument()->getDataProvider(), mrModel ); - - // set sequence role - PropertySet aSeqProp( xDataSeq ); - aSeqProp.setProperty( PROP_Role, rRole ); + Reference< XDataSequence > xDataSeq; + if( getChartConverter() ) + { + xDataSeq = getChartConverter()->createDataSequence( getChartDocument()->getDataProvider(), mrModel ); + // set sequen ce role + PropertySet aSeqProp( xDataSeq ); + aSeqProp.setProperty( PROP_Role, rRole ); + } return xDataSeq; } diff --git a/oox/source/drawingml/clrscheme.cxx b/oox/source/drawingml/clrscheme.cxx index 776cbb1f7045..7aa58a910d35 100644 --- a/oox/source/drawingml/clrscheme.cxx +++ b/oox/source/drawingml/clrscheme.cxx @@ -26,6 +26,7 @@ * ************************************************************************/ +#include #include "oox/drawingml/clrscheme.hxx" #include "oox/token/tokens.hxx" @@ -62,6 +63,7 @@ ClrScheme::~ClrScheme() sal_Bool ClrScheme::getColor( sal_Int32 nSchemeClrToken, sal_Int32& rColor ) const { + OSL_ASSERT((nSchemeClrToken & sal_Int32(0xFFFF0000))==0); switch( nSchemeClrToken ) { case XML_bg1 : nSchemeClrToken = XML_lt1; break; diff --git a/oox/source/drawingml/color.cxx b/oox/source/drawingml/color.cxx index 9b2ce7ec324e..74b49fb0a0e5 100644 --- a/oox/source/drawingml/color.cxx +++ b/oox/source/drawingml/color.cxx @@ -382,6 +382,7 @@ sal_Int32 Color::getColor( const GraphicHelper& rGraphicHelper, sal_Int32 nPhClr { for( TransformVec::const_iterator aIt = maTransforms.begin(), aEnd = maTransforms.end(); aIt != aEnd; ++aIt ) { + OSL_ASSERT((aIt->mnToken & sal_Int32(0xFFFF0000))==0); switch( aIt->mnToken ) { case XML_red: toCrgb(); lclSetValue( mnC1, aIt->mnValue ); break; diff --git a/oox/source/drawingml/customshapegeometry.cxx b/oox/source/drawingml/customshapegeometry.cxx index 1627530d1acc..9d58367f2d47 100644 --- a/oox/source/drawingml/customshapegeometry.cxx +++ b/oox/source/drawingml/customshapegeometry.cxx @@ -1169,8 +1169,9 @@ Path2DListContext::Path2DListContext( ContextHandler& rParent, CustomShapeProper // --------------------------------------------------------------------- -OUString GetShapeType( sal_Int32 nType ) +OUString GetShapePresetType( sal_Int32 nType ) { + OSL_ASSERT((nType & sal_Int32(0xFFFF0000))==0); OUString sType; switch( nType ) { @@ -1799,6 +1800,7 @@ OUString GetShapeType( sal_Int32 nType ) static OUString GetTextShapeType( sal_Int32 nType ) { + OSL_ASSERT((nType & sal_Int32(0xFFFF0000))==0); OUString sType; switch( nType ) { @@ -2029,7 +2031,7 @@ PresetShapeGeometryContext::PresetShapeGeometryContext( ContextHandler& rParent, OUString sShapeType; sal_Int32 nShapeType = xAttribs->getOptionalValueToken( XML_prst, FastToken::DONTKNOW ); if ( nShapeType != FastToken::DONTKNOW ) - sShapeType = GetShapeType( nShapeType ); + sShapeType = GetShapePresetType( nShapeType ); OSL_ENSURE( sShapeType.getLength(), "oox::drawingml::CustomShapeCustomGeometryContext::CustomShapeCustomGeometryContext(), unknown shape type" ); mrCustomShapeProperties.setShapePresetType( sShapeType ); } diff --git a/oox/source/drawingml/diagram/constraintlistcontext.cxx b/oox/source/drawingml/diagram/constraintlistcontext.cxx new file mode 100644 index 000000000000..42cbe452681b --- /dev/null +++ b/oox/source/drawingml/diagram/constraintlistcontext.cxx @@ -0,0 +1,101 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "constraintlistcontext.hxx" +#include "oox/helper/attributelist.hxx" + +using namespace ::oox::core; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::xml::sax; +using ::rtl::OUString; + +namespace oox { namespace drawingml { + +// CT_ConstraintLists +ConstraintListContext::ConstraintListContext( ContextHandler& rParent, + const Reference< XFastAttributeList >&, + const LayoutAtomPtr &pNode ) + : ContextHandler( rParent ) + , mpNode( pNode ) +{ + OSL_ENSURE( pNode, "Node must NOT be NULL" ); +} + + +ConstraintListContext::~ConstraintListContext() +{ +} + +void SAL_CALL ConstraintListContext::endFastElement( ::sal_Int32 ) + throw (SAXException, RuntimeException) +{ +} + +Reference< XFastContextHandler > SAL_CALL +ConstraintListContext::createFastChildContext( ::sal_Int32 aElement, + const Reference< XFastAttributeList >& xAttribs ) + throw (SAXException, RuntimeException) +{ + Reference< XFastContextHandler > xRet; + + OUString aEmptyStr; + + switch( aElement ) + { + case DGM_TOKEN( constr ): + { + ConstraintAtomPtr pNode( new ConstraintAtom() ); + mpNode->addChild( pNode ); + + AttributeList aAttribs( xAttribs ); + pNode->setFor( aAttribs.getToken( XML_for, XML_none ) ); + pNode->setForName( aAttribs.getString( XML_forName, aEmptyStr ) ); + pNode->setPointType( aAttribs.getToken( XML_ptType, XML_none ) ); + pNode->setType( aAttribs.getToken( XML_type, XML_none ) ); + pNode->setRefFor( aAttribs.getToken( XML_refFor, XML_none ) ); + pNode->setRefForName( aAttribs.getString( XML_refForName, aEmptyStr ) ); + pNode->setRefType( aAttribs.getToken( XML_refType, XML_none ) ); + pNode->setRefPointType( aAttribs.getToken( XML_refPtType, XML_none ) ); + pNode->setFactor( aAttribs.getDouble( XML_fact, 1.0 ) ); + pNode->setValue( aAttribs.getDouble( XML_val, 0.0 ) ); + pNode->setOperator( aAttribs.getToken( XML_op, XML_none ) ); + break; + } + default: + break; + } + if( !xRet.is() ) + xRet.set(this); + + return xRet; +} + + +} } + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/drawingml/diagram/constraintlistcontext.hxx b/oox/source/drawingml/diagram/constraintlistcontext.hxx new file mode 100644 index 000000000000..46a02558b97a --- /dev/null +++ b/oox/source/drawingml/diagram/constraintlistcontext.hxx @@ -0,0 +1,54 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_CONSTRAINTLISTCONTEXT_HXX +#define OOX_DRAWINGML_CONSTRAINTLISTCONTEXT_HXX + +#include "oox/core/contexthandler.hxx" +#include "diagramlayoutatoms.hxx" +#include "diagram.hxx" + +namespace oox { namespace drawingml { + +class ConstraintListContext : public ::oox::core::ContextHandler +{ +public: + ConstraintListContext( ContextHandler& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes, const LayoutAtomPtr &pNode ); + virtual ~ConstraintListContext(); + + virtual void SAL_CALL endFastElement( ::sal_Int32 Element ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); +private: + LayoutAtomPtr mpNode; +}; + +} } + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/drawingml/diagram/datamodelcontext.cxx b/oox/source/drawingml/diagram/datamodelcontext.cxx index 230edf59ea67..63065a85b701 100644 --- a/oox/source/drawingml/diagram/datamodelcontext.cxx +++ b/oox/source/drawingml/diagram/datamodelcontext.cxx @@ -26,7 +26,7 @@ * ************************************************************************/ -#include "oox/drawingml/diagram/datamodelcontext.hxx" +#include "datamodelcontext.hxx" #include "oox/helper/attributelist.hxx" #include "oox/drawingml/fillpropertiesgroupcontext.hxx" #include "oox/drawingml/shapepropertiescontext.hxx" @@ -39,78 +39,184 @@ using ::rtl::OUString; namespace oox { namespace drawingml { -// CL_Cxn -class CxnContext +// CT_CxnList +class CxnListContext : public ContextHandler { public: - CxnContext( ContextHandler& rParent, - const Reference< XFastAttributeList >& xAttribs, - const dgm::ConnectionPtr & pConnection ) + CxnListContext( ContextHandler& rParent, + dgm::Connections & aConnections ) : ContextHandler( rParent ) - , mpConnection( pConnection ) + , mrConnection( aConnections ) { - sal_Int32 nType = xAttribs->getOptionalValueToken( XML_type, XML_parOf ); - pConnection->mnType = nType; - pConnection->msModelId = xAttribs->getOptionalValue( XML_modelId ); - pConnection->msSourceId = xAttribs->getOptionalValue( XML_srcId ); - pConnection->msDestId = xAttribs->getOptionalValue( XML_destId ); - pConnection->msPresId = xAttribs->getOptionalValue( XML_presId ); - pConnection->msSibTransId = xAttribs->getOptionalValue( XML_sibTransId ); - AttributeList attribs( xAttribs ); - pConnection->mnSourceOrder = attribs.getInteger( XML_srcOrd, 0 ); - pConnection->mnDestOrder = attribs.getInteger( XML_destOrd, 0 ); } virtual Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 aElementToken, - const Reference< XFastAttributeList >& /*xAttribs*/ ) + const Reference< XFastAttributeList >& xAttribs ) throw (SAXException, RuntimeException) { Reference< XFastContextHandler > xRet; switch( aElementToken ) { - case DGM_TOKEN( extLst ): - return xRet; - default: - break; + case DGM_TOKEN( cxn ): + { + mrConnection.push_back( dgm::Connection() ); + dgm::Connection& rConnection=mrConnection.back(); + + const sal_Int32 nType = xAttribs->getOptionalValueToken( XML_type, XML_parOf ); + rConnection.mnType = nType; + rConnection.msModelId = xAttribs->getOptionalValue( XML_modelId ); + rConnection.msSourceId = xAttribs->getOptionalValue( XML_srcId ); + rConnection.msDestId = xAttribs->getOptionalValue( XML_destId ); + rConnection.msPresId = xAttribs->getOptionalValue( XML_presId ); + rConnection.msSibTransId = xAttribs->getOptionalValue( XML_sibTransId ); + rConnection.msParTransId = xAttribs->getOptionalValue( XML_parTransId ); + const AttributeList attribs( xAttribs ); + rConnection.mnSourceOrder = attribs.getInteger( XML_srcOrd, 0 ); + rConnection.mnDestOrder = attribs.getInteger( XML_destOrd, 0 ); + + // skip CT_extLst + return xRet; + } + default: + break; } if( !xRet.is() ) xRet.set( this ); return xRet; } private: - dgm::ConnectionPtr mpConnection; + dgm::Connections& mrConnection; }; -// CT_CxnList -class CxnListContext +// CT_presLayoutVars +class PresLayoutVarsContext : public ContextHandler { public: - CxnListContext( ContextHandler& rParent, dgm::Connections & aConnections ) - : ContextHandler( rParent ) - , maConnections( aConnections ) + PresLayoutVarsContext( ContextHandler& rParent, + dgm::Point & rPoint ) : + ContextHandler( rParent ), + mrPoint( rPoint ) + { + } + virtual Reference< XFastContextHandler > SAL_CALL + createFastChildContext( sal_Int32 aElementToken, + const Reference< XFastAttributeList >& xAttribs ) + throw (SAXException, RuntimeException) + { + Reference< XFastContextHandler > xRet; + AttributeList aAttribs( xAttribs ); + + switch( aElementToken ) { + // TODO + case DGM_TOKEN( animLvl ): + case DGM_TOKEN( animOne ): + break; + case DGM_TOKEN( bulletEnabled ): + mrPoint.mbBulletEnabled = aAttribs.getBool( XML_val, false ); + break; + case DGM_TOKEN( chMax ): + mrPoint.mnMaxChildren = aAttribs.getInteger( XML_val, -1 ); + break; + case DGM_TOKEN( chPref ): + mrPoint.mnPreferredChildren = aAttribs.getInteger( XML_val, -1 ); + break; + case DGM_TOKEN( dir ): + mrPoint.mnDirection = aAttribs.getToken( XML_val, XML_norm ); + break; + case DGM_TOKEN( hierBranch ): + mrPoint.mnHierarchyBranch = aAttribs.getToken( XML_val, XML_std ); + break; + case DGM_TOKEN( orgChart ): + mrPoint.mbOrgChartEnabled = aAttribs.getBool( XML_val, false ); + break; + case DGM_TOKEN( resizeHandles ): + mrPoint.mnResizeHandles = aAttribs.getToken( XML_val, XML_rel ); + break; + default: + break; } + if( !xRet.is() ) + xRet.set( this ); + return xRet; + } + +private: + dgm::Point& mrPoint; +}; + + +// CT_prSet +class PropertiesContext + : public ContextHandler +{ +public: + PropertiesContext( ContextHandler& rParent, + dgm::Point & rPoint, + const Reference< XFastAttributeList >& xAttribs ) : + ContextHandler( rParent ), + mrPoint( rPoint ) + { + OUString aEmptyStr; + AttributeList aAttribs( xAttribs ); + + mrPoint.msColorTransformCategoryId = aAttribs.getString( XML_csCatId, aEmptyStr ); + mrPoint.msColorTransformTypeId = aAttribs.getString( XML_csTypeId, aEmptyStr ); + mrPoint.msLayoutCategoryId = aAttribs.getString( XML_loCatId, aEmptyStr ); + mrPoint.msLayoutTypeId = aAttribs.getString( XML_loTypeId, aEmptyStr ); + mrPoint.msPlaceholderText = aAttribs.getString( XML_phldrT, aEmptyStr ); + mrPoint.msPresentationAssociationId = aAttribs.getString( XML_presAssocID, aEmptyStr ); + mrPoint.msPresentationLayoutName = aAttribs.getString( XML_presName, aEmptyStr ); + mrPoint.msPresentationLayoutStyleLabel = aAttribs.getString( XML_presStyleLbl, aEmptyStr ); + mrPoint.msQuickStyleCategoryId = aAttribs.getString( XML_qsCatId, aEmptyStr ); + mrPoint.msQuickStyleTypeId = aAttribs.getString( XML_qsTypeId, aEmptyStr ); + + mrPoint.mnCustomAngle = aAttribs.getInteger( XML_custAng, -1 ); + mrPoint.mnPercentageNeighbourWidth = aAttribs.getInteger( XML_custLinFactNeighborX, -1 ); + mrPoint.mnPercentageNeighbourHeight = aAttribs.getInteger( XML_custLinFactNeighborY, -1 ); + mrPoint.mnPercentageOwnWidth = aAttribs.getInteger( XML_custLinFactX, -1 ); + mrPoint.mnPercentageOwnHeight = aAttribs.getInteger( XML_custLinFactY, -1 ); + mrPoint.mnIncludeAngleScale = aAttribs.getInteger( XML_custRadScaleInc, -1 ); + mrPoint.mnRadiusScale = aAttribs.getInteger( XML_custRadScaleRad, -1 ); + mrPoint.mnWidthScale = aAttribs.getInteger( XML_custScaleX, -1 ); + mrPoint.mnHeightScale = aAttribs.getInteger( XML_custScaleY, -1 ); + mrPoint.mnWidthOverride = aAttribs.getInteger( XML_custSzX, -1 ); + mrPoint.mnHeightOverride = aAttribs.getInteger( XML_custSzY, -1 ); + mrPoint.mnLayoutStyleCount = aAttribs.getInteger( XML_presStyleCnt, -1 ); + mrPoint.mnLayoutStyleIndex = aAttribs.getInteger( XML_presStyleIdx, -1 ); + + mrPoint.mbCoherent3DOffset = aAttribs.getBool( XML_coherent3DOff, false ); + mrPoint.mbCustomHorizontalFlip = aAttribs.getBool( XML_custFlipHor, false ); + mrPoint.mbCustomVerticalFlip = aAttribs.getBool( XML_custFlipVert, false ); + mrPoint.mbCustomText = aAttribs.getBool( XML_custT, false ); + mrPoint.mbIsPlaceholder = aAttribs.getBool( XML_phldr, false ); + } + virtual Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 aElementToken, - const Reference< XFastAttributeList >& xAttribs ) + const Reference< XFastAttributeList >& ) throw (SAXException, RuntimeException) { Reference< XFastContextHandler > xRet; switch( aElementToken ) { - case DGM_TOKEN( cxn ): + case DGM_TOKEN( presLayoutVars ): { - dgm::ConnectionPtr pConnection( new dgm::Connection() ); - maConnections.push_back( pConnection ); - xRet.set( new CxnContext( *this, xAttribs, pConnection ) ); + xRet.set( new PresLayoutVarsContext( *this, mrPoint ) ); break; } + case DGM_TOKEN( style ): + { + // TODO + // skip CT_shapeStyle + return xRet; + } default: break; } @@ -120,11 +226,10 @@ public: } private: - dgm::Connections & maConnections; + dgm::Point& mrPoint; }; - // CL_Pt class PtContext : public ContextHandler @@ -132,27 +237,25 @@ class PtContext public: PtContext( ContextHandler& rParent, const Reference< XFastAttributeList >& xAttribs, - const dgm::PointPtr & pPoint) - : ContextHandler( rParent ) - , mpPoint( pPoint ) - { - mpPoint->setModelId( xAttribs->getOptionalValue( XML_modelId ) ); - // - // the default type is XML_node - sal_Int32 nType = xAttribs->getOptionalValueToken( XML_type, XML_node ); - mpPoint->setType( nType ); - - // ignore the cxnId unless it is this type. See 5.15.3.1.3 in Primer - if( ( nType == XML_parTrans ) || ( nType == XML_sibTrans ) ) - { - mpPoint->setCnxId( xAttribs->getOptionalValue( XML_cxnId ) ); - } - } + dgm::Point & rPoint): + ContextHandler( rParent ), + mrPoint( rPoint ) + { + mrPoint.msModelId = xAttribs->getOptionalValue( XML_modelId ); + + // the default type is XML_node + const sal_Int32 nType = xAttribs->getOptionalValueToken( XML_type, XML_node ); + mrPoint.mnType = nType; + + // ignore the cxnId unless it is this type. See 5.15.3.1.3 in Primer + if( ( nType == XML_parTrans ) || ( nType == XML_sibTrans ) ) + mrPoint.msCnxId = xAttribs->getOptionalValue( XML_cxnId ); + } virtual Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 aElementToken, - const Reference< XFastAttributeList >& /*xAttribs*/ ) + const Reference< XFastAttributeList >& xAttribs ) throw (SAXException, RuntimeException) { Reference< XFastContextHandler > xRet; @@ -162,18 +265,22 @@ public: case DGM_TOKEN( extLst ): return xRet; case DGM_TOKEN( prSet ): - // TODO - // CT_ElemPropSet + OSL_TRACE( "diagram property set for point"); + xRet = new PropertiesContext( *this, mrPoint, xAttribs ); break; case DGM_TOKEN( spPr ): OSL_TRACE( "shape props for point"); - xRet = new ShapePropertiesContext( *this, *mpPoint->getShape() ); + if( !mrPoint.mpShape ) + mrPoint.mpShape.reset( new Shape() ); + xRet = new ShapePropertiesContext( *this, *(mrPoint.mpShape) ); break; case DGM_TOKEN( t ): { OSL_TRACE( "shape text body for point"); TextBodyPtr xTextBody( new TextBody ); - mpPoint->getShape()->setTextBody( xTextBody ); + if( !mrPoint.mpShape ) + mrPoint.mpShape.reset( new Shape() ); + mrPoint.mpShape->setTextBody( xTextBody ); xRet = new TextBodyContext( *this, *xTextBody ); break; } @@ -186,7 +293,7 @@ public: } private: - dgm::PointPtr mpPoint; + dgm::Point& mrPoint; }; @@ -196,11 +303,10 @@ class PtListContext : public ContextHandler { public: - PtListContext( ContextHandler& rParent, dgm::Points & aPoints) - : ContextHandler( rParent ) - , maPoints( aPoints ) - { - } + PtListContext( ContextHandler& rParent, dgm::Points& rPoints) : + ContextHandler( rParent ), + mrPoints( rPoints ) + {} virtual Reference< XFastContextHandler > SAL_CALL createFastChildContext( sal_Int32 aElementToken, const Reference< XFastAttributeList >& xAttribs ) @@ -213,9 +319,8 @@ public: case DGM_TOKEN( pt ): { // CT_Pt - dgm::PointPtr pPoint( new dgm::Point() ); - maPoints.push_back( pPoint ); - xRet.set( new PtContext( *this, xAttribs, pPoint ) ); + mrPoints.push_back( dgm::Point() ); + xRet.set( new PtContext( *this, xAttribs, mrPoints.back() ) ); break; } default: @@ -227,7 +332,7 @@ public: } private: - dgm::Points & maPoints; + dgm::Points& mrPoints; }; // CT_BackgroundFormatting diff --git a/oox/source/drawingml/diagram/datamodelcontext.hxx b/oox/source/drawingml/diagram/datamodelcontext.hxx new file mode 100644 index 000000000000..96a654ac8b2a --- /dev/null +++ b/oox/source/drawingml/diagram/datamodelcontext.hxx @@ -0,0 +1,56 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_SHAPECONTEXT_HXX +#define OOX_DRAWINGML_SHAPECONTEXT_HXX + +#include + +#include "oox/core/contexthandler.hxx" +#include "diagram.hxx" + +namespace oox { namespace drawingml { + +// CT_DataModel +class DataModelContext : public ::oox::core::ContextHandler +{ +public: + DataModelContext( ::oox::core::ContextHandler& rParent, const DiagramDataPtr & pDataModelPtr ); + virtual ~DataModelContext(); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +protected: + DiagramDataPtr mpDataModel; +}; + +} } + +#endif // OOX_DRAWINGML_SHAPEGROUPCONTEXT_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/drawingml/diagram/diagram.cxx b/oox/source/drawingml/diagram/diagram.cxx index 30c6e5b78134..5c0e079ba456 100644 --- a/oox/source/drawingml/diagram/diagram.cxx +++ b/oox/source/drawingml/diagram/diagram.cxx @@ -32,9 +32,21 @@ #include #include +#include +#include +#include +#include "oox/drawingml/textbody.hxx" +#include "oox/drawingml/textparagraph.hxx" +#include "oox/drawingml/textrun.hxx" #include "oox/drawingml/diagram/diagram.hxx" #include "oox/drawingml/fillproperties.hxx" +#include "diagramlayoutatoms.hxx" +#include "diagramfragmenthandler.hxx" + +#include +#include + using rtl::OUString; using namespace ::com::sun::star; @@ -45,58 +57,26 @@ namespace dgm { void Connection::dump() { - OSL_TRACE("dgm: cnx modelId %s, srcId %s, dstId %s", + OSL_TRACE("dgm: cnx modelId %s, srcId %s, dstId %s, parTransId %s, presId %s, sibTransId %s, srcOrd %d, dstOrd %d", OUSTRING_TO_CSTR( msModelId ), OUSTRING_TO_CSTR( msSourceId ), - OUSTRING_TO_CSTR( msDestId ) ); -} - -Point::Point() - : mpShape( new Shape( "com.sun.star.drawing.GraphicObjectShape" ) ) - , mnType( 0 ) -{ + OUSTRING_TO_CSTR( msDestId ), + OUSTRING_TO_CSTR( msParTransId ), + OUSTRING_TO_CSTR( msPresId ), + OUSTRING_TO_CSTR( msSibTransId ), + mnSourceOrder, + mnDestOrder ); } void Point::dump() { - OSL_TRACE( "dgm: pt cnxId %s, modelId %s", + OSL_TRACE( "dgm: pt text %x, cnxId %s, modelId %s, type %d", + mpShape.get(), OUSTRING_TO_CSTR( msCnxId ), - OUSTRING_TO_CSTR( msModelId ) ); -} - -void Point::setModelId( const ::rtl::OUString & sModelId ) -{ - msModelId = sModelId; - mpShape->setName( msModelId ); -} - - -bool PointsTree::addChild( const PointsTreePtr & pChild ) -{ - bool added = false; - - OSL_ENSURE( pChild->mpParent.expired(), "can't add, has already a parent" ); - OSL_ENSURE( mpNode, "has no node" ); - if( mpNode && pChild->mpParent.expired() ) - { - pChild->mpParent = shared_from_this(); - maChildrens.push_back( pChild ); - added = true; - } - - return added; -} - -PointsTreePtr PointsTree::getParent() const -{ - if( !mpParent.expired() ) - { - return mpParent.lock() ; - } - return PointsTreePtr(); + OUSTRING_TO_CSTR( msModelId ), + mnType ); } - } // dgm namespace DiagramData::DiagramData() @@ -114,27 +94,8 @@ void DiagramData::dump() boost::bind( &dgm::Point::dump, _1 ) ); } -static void setPosition( const dgm::PointPtr & pPoint, const awt::Point & pt ) -{ - ShapePtr pShape = pPoint->getShape(); - awt::Size sz; - sz.Width = 50; - sz.Height = 50; - pShape->setPosition( pt ); - pShape->setSize( sz ); -} - -void DiagramLayout::layout( const dgm::PointsTreePtr & pTree, const awt::Point & pt ) +void DiagramLayout::layout( const dgm::Points & /*pTree*/, const awt::Point & /*pt*/ ) { - setPosition( pTree->getPoint(), pt ); - awt::Point nextPt = pt; - nextPt.Y += 50; - dgm::PointsTree::Childrens::const_iterator iter; - for( iter = pTree->beginChild(); iter != pTree->endChild(); ++iter ) - { - layout( *iter, nextPt ); - nextPt.X += 50; - } } void Diagram::setData( const DiagramDataPtr & pData) @@ -148,140 +109,237 @@ void Diagram::setLayout( const DiagramLayoutPtr & pLayout) mpLayout = pLayout; } -void Diagram::setQStyles( const DiagramQStylesPtr & pStyles) +#if OSL_DEBUG_LEVEL > 1 +rtl::OString normalizeDotName( const rtl::OUString& rStr ) { - mpQStyles = pStyles; -} + rtl::OUStringBuffer aBuf; + aBuf.append((sal_Unicode)'N'); + const sal_Int32 nLen(rStr.getLength()); + sal_Int32 nCurrIndex(0); + while( nCurrIndex < nLen ) + { + const sal_Int32 aChar=rStr.iterateCodePoints(&nCurrIndex); + if( aChar != '-' && aChar != '{' && aChar != '}' ) + aBuf.append((sal_Unicode)aChar); + } -void Diagram::setColors( const DiagramColorsPtr & pColors) -{ - mpColors = pColors; + return rtl::OUStringToOString(aBuf.makeStringAndClear(), + RTL_TEXTENCODING_UTF8); } +#endif -void Diagram::build( ) +static sal_Int32 calcDepth( const rtl::OUString& rNodeName, + const dgm::Connections& rCnx ) { - OSL_TRACE( "building diagram" ); - typedef std::map< OUString, dgm::PointPtr > PointsMap; - PointsMap aPointsMap; - dgm::Points::iterator aPointsIter( mpData->getPoints( ).begin() ); - for( ; aPointsIter != mpData->getPoints( ).end() ; aPointsIter++ ) + // find length of longest path in 'isChild' graph, ending with rNodeName + dgm::Connections::const_iterator aCurrCxn( rCnx.begin() ); + const dgm::Connections::const_iterator aEndCxn( rCnx.end() ); + while( aCurrCxn != aEndCxn ) { - const OUString & sName((*aPointsIter)->getModelId()); - if( sName.getLength() > 0 ) + if( aCurrCxn->msParTransId.getLength() && + aCurrCxn->msSibTransId.getLength() && + aCurrCxn->msSourceId.getLength() && + aCurrCxn->msDestId.getLength() && + aCurrCxn->mnType != XML_presOf && + aCurrCxn->mnType != XML_presParOf && + rNodeName == aCurrCxn->msDestId ) { - aPointsMap[ sName ] = *aPointsIter; + return calcDepth(aCurrCxn->msSourceId, + rCnx) + 1; } + ++aCurrCxn; } - typedef std::map< OUString, dgm::PointsTreePtr > PointsTreeMap; - PointsTreeMap aTreeMap; - PointsTreeMap aRoots; + return 0; +} + + +void Diagram::build( ) +{ + // build name-object maps + // ====================== + +#if OSL_DEBUG_LEVEL > 1 + std::ofstream output("/tmp/tree.dot"); + + output << "digraph datatree {" << std::endl; +#endif - dgm::Connections & aConnections(mpData->getConnections( ) ); - dgm::Connections::iterator aCnxIter; - for( aCnxIter = aConnections.begin(); aCnxIter != aConnections.end(); ++aCnxIter ) + dgm::Points::iterator aCurrPoint( getData()->getPoints( ).begin() ); + const dgm::Points::iterator aEndPoint( getData()->getPoints( ).end() ); + while( aCurrPoint != aEndPoint ) { - OSL_ENSURE( *aCnxIter, "NULL connection found" ); - if( (*aCnxIter)->mnType != XML_parOf ) +#if OSL_DEBUG_LEVEL > 1 + output << "\t" + << normalizeDotName(aCurrPoint->msModelId).getStr() + << "["; + + if( aCurrPoint->msPresentationLayoutName.getLength() ) + output << "label=\"" + << rtl::OUStringToOString( + aCurrPoint->msPresentationLayoutName, + RTL_TEXTENCODING_UTF8).getStr() << "\", "; + else + output << "label=\"" + << rtl::OUStringToOString( + aCurrPoint->msModelId, + RTL_TEXTENCODING_UTF8).getStr() << "\", "; + + switch( aCurrPoint->mnType ) { -// OSL_TRACE( "ignoring relation %s", OUSTRING_TO_CSTR( (*aCnxIter)->msModelId ) ); - continue; + case XML_doc: output << "style=filled, color=red"; break; + case XML_asst: output << "style=filled, color=green"; break; + default: + case XML_node: output << "style=filled, color=blue"; break; + case XML_pres: output << "style=filled, color=yellow"; break; + case XML_parTrans: output << "color=grey"; break; + case XML_sibTrans: output << " "; break; } - dgm::PointPtr pDest; - dgm::PointsTreePtr pSource; - PointsMap::iterator iterP; - OUString & srcId( (*aCnxIter)->msSourceId ); - OUString & dstId( (*aCnxIter)->msDestId ); - OSL_TRACE( "connexion %s -> %s", OUSTRING_TO_CSTR( srcId ), - OUSTRING_TO_CSTR( dstId ) ); - - PointsTreeMap::iterator iterT = aTreeMap.find( srcId ); - if( iterT != aTreeMap.end() ) + + output << "];" << std::endl; + + // does currpoint have any text set? + if( aCurrPoint->mpShape && + aCurrPoint->mpShape->getTextBody() && + !aCurrPoint->mpShape->getTextBody()->getParagraphs().empty() && + !aCurrPoint->mpShape->getTextBody()->getParagraphs().front()->getRuns().empty() ) { - pSource = iterT->second; + static sal_Int32 nCount=0; + + output << "\t" + << "textNode" << nCount + << " [" + << "label=\"" + << rtl::OUStringToOString( + aCurrPoint->mpShape->getTextBody()->getParagraphs().front()->getRuns().front()->getText(), + RTL_TEXTENCODING_UTF8).getStr() + << "\"" << "];" << std::endl; + output << "\t" + << normalizeDotName(aCurrPoint->msModelId).getStr() + << " -> " + << "textNode" << nCount++ + << ";" << std::endl; } - else +#endif + + const bool bInserted1=getData()->getPointNameMap().insert( + std::make_pair(aCurrPoint->msModelId,&(*aCurrPoint))).second; + (void)bInserted1; + + OSL_ENSURE(bInserted1,"Diagram::build(): non-unique point model id"); + + if( aCurrPoint->msPresentationLayoutName.getLength() ) + { + DiagramData::PointsNameMap::value_type::second_type& rVec= + getData()->getPointsPresNameMap()[aCurrPoint->msPresentationLayoutName]; + rVec.push_back(&(*aCurrPoint)); + } + ++aCurrPoint; + } + + dgm::Connections::const_iterator aCurrCxn( getData()->getConnections( ).begin() ); + const dgm::Connections::const_iterator aEndCxn( getData()->getConnections( ).end() ); + while( aCurrCxn != aEndCxn ) + { +#if OSL_DEBUG_LEVEL > 1 + if( aCurrCxn->msParTransId.getLength() || + aCurrCxn->msSibTransId.getLength() ) { - // this tree node is not found. create it with the source - // and make it the root node. - iterP = aPointsMap.find( srcId ); - if( iterP != aPointsMap.end() ) + if( aCurrCxn->msSourceId.getLength() || + aCurrCxn->msDestId.getLength() ) { - pSource.reset( new dgm::PointsTree( iterP->second ) ); - aRoots[ srcId ] = pSource; - aTreeMap[ srcId ] = pSource; + output << "\t" + << normalizeDotName(aCurrCxn->msSourceId).getStr() + << " -> " + << normalizeDotName(aCurrCxn->msParTransId).getStr() + << " -> " + << normalizeDotName(aCurrCxn->msSibTransId).getStr() + << " -> " + << normalizeDotName(aCurrCxn->msDestId).getStr() + << " [style=dotted," + << ((aCurrCxn->mnType == XML_presOf) ? " color=red, " : ((aCurrCxn->mnType == XML_presParOf) ? " color=green, " : " ")) + << "label=\"" + << rtl::OUStringToOString(aCurrCxn->msModelId, + RTL_TEXTENCODING_UTF8 ).getStr() + << "\"];" << std::endl; } else { - OSL_TRACE("parent node not found !"); + output << "\t" + << normalizeDotName(aCurrCxn->msParTransId).getStr() + << " -> " + << normalizeDotName(aCurrCxn->msSibTransId).getStr() + << " [" + << ((aCurrCxn->mnType == XML_presOf) ? " color=red, " : ((aCurrCxn->mnType == XML_presParOf) ? " color=green, " : " ")) + << "label=\"" + << rtl::OUStringToOString(aCurrCxn->msModelId, + RTL_TEXTENCODING_UTF8 ).getStr() + << "\"];" << std::endl; } } - iterP = aPointsMap.find( dstId ); - if( iterP != aPointsMap.end() ) - { - pDest = iterP->second; - } - OSL_ENSURE( pDest, "destination not found" ); - OSL_ENSURE( pSource, "source not found" ); - if(pDest && pSource) + else if( aCurrCxn->msSourceId.getLength() || + aCurrCxn->msDestId.getLength() ) + output << "\t" + << normalizeDotName(aCurrCxn->msSourceId).getStr() + << " -> " + << normalizeDotName(aCurrCxn->msDestId).getStr() + << " [label=\"" + << rtl::OUStringToOString(aCurrCxn->msModelId, + RTL_TEXTENCODING_UTF8 ).getStr() + << ((aCurrCxn->mnType == XML_presOf) ? "\", color=red]" : ((aCurrCxn->mnType == XML_presParOf) ? "\", color=green]" : "\"]")) + << ";" << std::endl; +#endif + + const bool bInserted1=getData()->getConnectionNameMap().insert( + std::make_pair(aCurrCxn->msModelId,&(*aCurrCxn))).second; + (void)bInserted1; + + OSL_ENSURE(bInserted1,"Diagram::build(): non-unique connection model id"); + + if( aCurrCxn->mnType == XML_presOf ) { - dgm::PointsTreePtr pNode( new dgm::PointsTree( pDest ) ); - bool added = pSource->addChild( pNode ); - (void)added; - aRoots.erase( dstId ); - OSL_ENSURE( added, "add child failed" ); - aTreeMap[ dstId ] = pNode; + DiagramData::StringMap::value_type::second_type& rVec=getData()->getPresOfNameMap()[aCurrCxn->msDestId]; + rVec.push_back( + std::make_pair( + aCurrCxn->msSourceId,sal_Int32(0))); } + + ++aCurrCxn; } - // check bounds - OSL_ENSURE( aRoots.size() == 1, "more than one root" ); - // #i92239# roots may be empty - if( !aRoots.empty() ) + + // assign outline levels + DiagramData::StringMap::iterator aPresOfIter=getData()->getPresOfNameMap().begin(); + const DiagramData::StringMap::iterator aPresOfEnd=getData()->getPresOfNameMap().end(); + while( aPresOfIter != aPresOfEnd ) { - mpRoot = aRoots.begin()->second; - OSL_TRACE( "root is %s", OUSTRING_TO_CSTR( mpRoot->getPoint()->getModelId() ) ); - for( PointsTreeMap::iterator iter = aTreeMap.begin(); - iter != aTreeMap.end(); ++iter ) + DiagramData::StringMap::value_type::second_type::iterator aPresOfNodeIterCalcLevel=aPresOfIter->second.begin(); + const DiagramData::StringMap::value_type::second_type::iterator aPresOfNodeEnd=aPresOfIter->second.end(); + while(aPresOfNodeIterCalcLevel != aPresOfNodeEnd) { - if(! iter->second->getParent() ) - { - OSL_TRACE("node without parent %s", OUSTRING_TO_CSTR( iter->first ) ); - } + const sal_Int32 nDepth=calcDepth(aPresOfNodeIterCalcLevel->first, + getData()->getConnections()); + aPresOfNodeIterCalcLevel->second = nDepth != 0 ? nDepth : -1; + ++aPresOfNodeIterCalcLevel; } + + ++aPresOfIter; } + +#if OSL_DEBUG_LEVEL > 1 + output << "}" << std::endl; +#endif } void Diagram::addTo( const ShapePtr & pParentShape ) { - dgm::Points & aPoints( mpData->getPoints( ) ); - dgm::Points::iterator aPointsIter; + // collect data, init maps build( ); - if( mpRoot.get() ) - mpLayout->layout( mpRoot, awt::Point( 0, 0 ) ); - for( aPointsIter = aPoints.begin(); aPointsIter != aPoints.end(); ++aPointsIter ) - { - if( ( *aPointsIter )->getType() != XML_node ) - { - continue; - } - ShapePtr pShape = ( *aPointsIter )->getShape( ); - if( pShape->getName( ).getLength() > 0 ) - { - maShapeMap[ pShape->getName( ) ] = pShape; - OSL_TRACE( "Dgm: added shape %s to map", OUSTRING_TO_CSTR( pShape->getName() ) ); - } - pParentShape->addChild( pShape ); - } - - OSL_TRACE( "Dgm: addTo() # of childs %d", pParentShape->getChildren().size() ); - for( std::vector< ShapePtr >::iterator iter = pParentShape->getChildren().begin(); - iter != pParentShape->getChildren().end(); ++iter) - { - OSL_TRACE( "Dgm: shape name %s", OUSTRING_TO_CSTR( (*iter)->getName() ) ); - } + // create Shape hierarchy + ShapeCreationVisitor aCreationVisitor(pParentShape, *this); + mpLayout->getNode()->accept(aCreationVisitor); } OUString Diagram::getLayoutId() const @@ -294,6 +352,148 @@ OUString Diagram::getLayoutId() const return sLayoutId; } +uno::Reference loadFragment( + core::XmlFilterBase& rFilter, + const rtl::Reference< core::FragmentHandler >& rxHandler ) +{ + // load diagramming fragments into DOM representation, that later + // gets serialized back to SAX events and parsed + return rFilter.importFragment( rxHandler->getFragmentPath() ); +} + +void importFragment( core::XmlFilterBase& rFilter, + const uno::Reference& rXDom, + const char* /*pPropName*/, + const ShapePtr& /*pShape*/, + const rtl::Reference< core::FragmentHandler >& rxHandler ) +{ + uno::Reference xSerializer( + rXDom, uno::UNO_QUERY_THROW); + + // now serialize DOM tree into internal data structures + rFilter.importFragment( rxHandler, xSerializer ); +} + +void loadDiagram( const ShapePtr& pShape, + core::XmlFilterBase& rFilter, + const ::rtl::OUString& rDataModelPath, + const ::rtl::OUString& rLayoutPath, + const ::rtl::OUString& rQStylePath, + const ::rtl::OUString& rColorStylePath ) +{ + DiagramPtr pDiagram( new Diagram() ); + + DiagramDataPtr pData( new DiagramData() ); + pDiagram->setData( pData ); + + DiagramLayoutPtr pLayout( new DiagramLayout() ); + pDiagram->setLayout( pLayout ); + + // data + if( rDataModelPath.getLength() > 0 ) + { + rtl::Reference< core::FragmentHandler > xRef( + new DiagramDataFragmentHandler( rFilter, rDataModelPath, pData )); + + importFragment(rFilter, + loadFragment(rFilter,xRef), + "DiagramData", + pShape, + xRef); + } + + // layout + if( rLayoutPath.getLength() > 0 ) + { + rtl::Reference< core::FragmentHandler > xRef( + new DiagramLayoutFragmentHandler( rFilter, rLayoutPath, pLayout )); + importFragment(rFilter, + loadFragment(rFilter,xRef), + "DiagramLayout", + pShape, + xRef); + } + + // style + if( rQStylePath.getLength() > 0 ) + { + rtl::Reference< core::FragmentHandler > xRef( + new DiagramQStylesFragmentHandler( rFilter, rQStylePath, pDiagram->getStyles() )); + importFragment(rFilter, + loadFragment(rFilter,xRef), + "DiagramQStyle", + pShape, + xRef); + } + + // colors + if( rColorStylePath.getLength() > 0 ) + { + rtl::Reference< core::FragmentHandler > xRef( + new ColorFragmentHandler( rFilter, rColorStylePath, pDiagram->getColors() )); + importFragment(rFilter, + loadFragment(rFilter,xRef), + "DiagramColorStyle", + pShape, + xRef); + } + + // diagram loaded. now lump together & attach to shape + pDiagram->addTo(pShape); +} + +void loadDiagram( const ShapePtr& pShape, + core::XmlFilterBase& rFilter, + const uno::Reference& rXDataModelDom, + const uno::Reference& rXLayoutDom, + const uno::Reference& rXQStyleDom, + const uno::Reference& rXColorStyleDom ) +{ + DiagramPtr pDiagram( new Diagram() ); + + DiagramDataPtr pData( new DiagramData() ); + pDiagram->setData( pData ); + + DiagramLayoutPtr pLayout( new DiagramLayout() ); + pDiagram->setLayout( pLayout ); + + OUString aEmpty; + + // data + if( rXDataModelDom.is() ) + importFragment(rFilter, + rXDataModelDom, + "DiagramData", + pShape, + new DiagramDataFragmentHandler( rFilter, aEmpty, pData )); + + // layout + if( rXLayoutDom.is() ) + importFragment(rFilter, + rXLayoutDom, + "DiagramLayout", + pShape, + new DiagramLayoutFragmentHandler( rFilter, aEmpty, pLayout )); + + // style + if( rXQStyleDom.is() ) + importFragment(rFilter, + rXQStyleDom, + "DiagramQStyle", + pShape, + new DiagramQStylesFragmentHandler( rFilter, aEmpty, pDiagram->getStyles() )); + + // colors + if( rXColorStyleDom.is() ) + importFragment(rFilter, + rXColorStyleDom, + "DiagramColorStyle", + pShape, + new ColorFragmentHandler( rFilter, aEmpty, pDiagram->getColors() )); + + // diagram loaded. now lump together & attach to shape + pDiagram->addTo(pShape); +} } } diff --git a/oox/source/drawingml/diagram/diagram.hxx b/oox/source/drawingml/diagram/diagram.hxx new file mode 100644 index 000000000000..217b80381594 --- /dev/null +++ b/oox/source/drawingml/diagram/diagram.hxx @@ -0,0 +1,319 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_DIAGRAM_DIAGRAM_HXX +#define OOX_DRAWINGML_DIAGRAM_DIAGRAM_HXX + +#include +#include + +#include +#include + +#include + +#include "oox/drawingml/shape.hxx" +#include "oox/drawingml/fillproperties.hxx" + +namespace com { namespace sun { namespace star { + namespace xml { namespace dom { class XDocument; } } +} } } + +namespace oox { namespace drawingml { + +namespace dgm { + +/** A Connection + */ +struct Connection +{ + Connection() : + mnType( 0 ), + mnSourceOrder( 0 ), + mnDestOrder( 0 ) + {} + + void dump(); + + sal_Int32 mnType; + ::rtl::OUString msModelId; + ::rtl::OUString msSourceId; + ::rtl::OUString msDestId; + ::rtl::OUString msParTransId; + ::rtl::OUString msPresId; + ::rtl::OUString msSibTransId; + sal_Int32 mnSourceOrder; + sal_Int32 mnDestOrder; + +}; + +typedef std::vector< Connection > Connections; + + +/** A point + */ +struct Point +{ + Point() : + mnType(0), + mnMaxChildren(-1), + mnPreferredChildren(-1), + mnDirection(XML_norm), + mnHierarchyBranch(XML_std), + mnResizeHandles(XML_rel), + mnCustomAngle(-1), + mnPercentageNeighbourWidth(-1), + mnPercentageNeighbourHeight(-1), + mnPercentageOwnWidth(-1), + mnPercentageOwnHeight(-1), + mnIncludeAngleScale(-1), + mnRadiusScale(-1), + mnWidthScale(-1), + mnHeightScale(-1), + mnWidthOverride(-1), + mnHeightOverride(-1), + mnLayoutStyleCount(-1), + mnLayoutStyleIndex(-1), + + mbOrgChartEnabled(false), + mbBulletEnabled(false), + mbCoherent3DOffset(false), + mbCustomHorizontalFlip(false), + mbCustomVerticalFlip(false), + mbCustomText(false), + mbIsPlaceholder(false) + {} + void dump(); + + ShapePtr mpShape; + + rtl::OUString msCnxId; + rtl::OUString msModelId; + rtl::OUString msColorTransformCategoryId; + rtl::OUString msColorTransformTypeId; + rtl::OUString msLayoutCategoryId; + rtl::OUString msLayoutTypeId; + rtl::OUString msPlaceholderText; + rtl::OUString msPresentationAssociationId; + rtl::OUString msPresentationLayoutName; + rtl::OUString msPresentationLayoutStyleLabel; + rtl::OUString msQuickStyleCategoryId; + rtl::OUString msQuickStyleTypeId; + + sal_Int32 mnType; + sal_Int32 mnMaxChildren; + sal_Int32 mnPreferredChildren; + sal_Int32 mnDirection; + sal_Int32 mnHierarchyBranch; + sal_Int32 mnResizeHandles; + sal_Int32 mnCustomAngle; + sal_Int32 mnPercentageNeighbourWidth; + sal_Int32 mnPercentageNeighbourHeight; + sal_Int32 mnPercentageOwnWidth; + sal_Int32 mnPercentageOwnHeight; + sal_Int32 mnIncludeAngleScale; + sal_Int32 mnRadiusScale; + sal_Int32 mnWidthScale; + sal_Int32 mnHeightScale; + sal_Int32 mnWidthOverride; + sal_Int32 mnHeightOverride; + sal_Int32 mnLayoutStyleCount; + sal_Int32 mnLayoutStyleIndex; + + bool mbOrgChartEnabled; + bool mbBulletEnabled; + bool mbCoherent3DOffset; + bool mbCustomHorizontalFlip; + bool mbCustomVerticalFlip; + bool mbCustomText; + bool mbIsPlaceholder; +}; + +typedef std::vector< Point > Points; + +} + +class LayoutNode; +typedef boost::shared_ptr< LayoutNode > LayoutNodePtr; + +//////////////////// + +class DiagramData +{ +public: + typedef std::map< rtl::OUString, dgm::Point* > PointNameMap; + typedef std::map< rtl::OUString, + std::vector > PointsNameMap; + typedef std::map< rtl::OUString, const dgm::Connection* > ConnectionNameMap; + typedef std::map< rtl::OUString, + std::vector > > StringMap; + + DiagramData(); + FillPropertiesPtr & getFillProperties() + { return mpFillProperties; } + dgm::Connections & getConnections() + { return maConnections; } + dgm::Points & getPoints() + { return maPoints; } + ConnectionNameMap & getConnectionNameMap() + { return maConnectionNameMap; } + StringMap & getPresOfNameMap() + { return maPresOfNameMap; } + PointNameMap & getPointNameMap() + { return maPointNameMap; } + PointsNameMap & getPointsPresNameMap() + { return maPointsPresNameMap; } + void dump(); +private: + FillPropertiesPtr mpFillProperties; + dgm::Connections maConnections; + dgm::Points maPoints; + PointNameMap maPointNameMap; + PointsNameMap maPointsPresNameMap; + ConnectionNameMap maConnectionNameMap; + StringMap maPresOfNameMap; +}; + +typedef boost::shared_ptr< DiagramData > DiagramDataPtr; + + + +//////////////////// + +class DiagramLayout +{ +public: + void setDefStyle( const ::rtl::OUString & sDefStyle ) + { msDefStyle = sDefStyle; } + void setMinVer( const ::rtl::OUString & sMinVer ) + { msMinVer = sMinVer; } + void setUniqueId( const ::rtl::OUString & sUniqueId ) + { msUniqueId = sUniqueId; } + const ::rtl::OUString & getUniqueId() + { return msUniqueId; } + void setTitle( const ::rtl::OUString & sTitle ) + { msTitle = sTitle; } + void setDesc( const ::rtl::OUString & sDesc ) + { msDesc = sDesc; } + + LayoutNodePtr & getNode() + { return mpNode; } + const LayoutNodePtr & getNode() const + { return mpNode; } + DiagramDataPtr & getSampData() + { return mpSampData; } + const DiagramDataPtr & getSampData() const + { return mpSampData; } + DiagramDataPtr & getStyleData() + { return mpStyleData; } + const DiagramDataPtr & getStyleData() const + { return mpStyleData; } + + void layout( const dgm::Points & pTree, const com::sun::star::awt::Point & pt ); + +private: + ::rtl::OUString msDefStyle; + ::rtl::OUString msMinVer; + ::rtl::OUString msUniqueId; + + ::rtl::OUString msTitle; + ::rtl::OUString msDesc; + LayoutNodePtr mpNode; + DiagramDataPtr mpSampData; + DiagramDataPtr mpStyleData; + // TODO + // catLst + // clrData +}; + +typedef boost::shared_ptr< DiagramLayout > DiagramLayoutPtr; + +/////////////////////// + +struct DiagramStyle +{ + ShapeStyleRef maFillStyle; + ShapeStyleRef maLineStyle; + ShapeStyleRef maEffectStyle; + ShapeStyleRef maTextStyle; +}; + +typedef std::map DiagramQStyleMap; + +struct DiagramColor +{ + oox::drawingml::Color maFillColor; + oox::drawingml::Color maLineColor; + oox::drawingml::Color maEffectColor; + oox::drawingml::Color maTextFillColor; + oox::drawingml::Color maTextLineColor; + oox::drawingml::Color maTextEffectColor; +}; + +typedef std::map DiagramColorMap; + +/////////////////////// + +class Diagram +{ +public: + void setData( const DiagramDataPtr & ); + DiagramDataPtr getData() const + { + return mpData; + } + void setLayout( const DiagramLayoutPtr & ); + DiagramLayoutPtr getLayout() const + { + return mpLayout; + } + + DiagramQStyleMap& getStyles() { return maStyles; } + const DiagramQStyleMap& getStyles() const { return maStyles; } + DiagramColorMap& getColors() { return maColors; } + const DiagramColorMap& getColors() const { return maColors; } + + void addTo( const ShapePtr & pShape ); + ::rtl::OUString getLayoutId() const; +private: + void build( ); + DiagramDataPtr mpData; + DiagramLayoutPtr mpLayout; + DiagramQStyleMap maStyles; + DiagramColorMap maColors; + std::map< ::rtl::OUString, ShapePtr > maShapeMap; +}; + + +typedef boost::shared_ptr< Diagram > DiagramPtr; + +} } + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/drawingml/diagram/diagramdefinitioncontext.cxx b/oox/source/drawingml/diagram/diagramdefinitioncontext.cxx index a405926761c1..22aa2992b1f2 100644 --- a/oox/source/drawingml/diagram/diagramdefinitioncontext.cxx +++ b/oox/source/drawingml/diagram/diagramdefinitioncontext.cxx @@ -27,9 +27,8 @@ ************************************************************************/ #include "diagramdefinitioncontext.hxx" -#include "oox/helper/helper.hxx" #include "layoutnodecontext.hxx" -#include "oox/drawingml/diagram/datamodelcontext.hxx" +#include "datamodelcontext.hxx" using namespace ::oox::core; using namespace ::com::sun::star::uno; @@ -86,9 +85,15 @@ DiagramDefinitionContext::createFastChildContext( ::sal_Int32 aElement, mpLayout->setDesc( xAttribs->getOptionalValue( XML_val ) ); break; case DGM_TOKEN( layoutNode ): - mpLayout->getNode().reset( new LayoutNode() ); - xRet.set( new LayoutNodeContext( *this, xAttribs, mpLayout->getNode() ) ); + { + LayoutNodePtr pNode( new LayoutNode() ); + mpLayout->getNode() = pNode; + pNode->setChildOrder( xAttribs->getOptionalValueToken( XML_chOrder, XML_b ) ); + pNode->setMoveWith( xAttribs->getOptionalValue( XML_moveWith ) ); + pNode->setStyleLabel( xAttribs->getOptionalValue( XML_styleLbl ) ); + xRet.set( new LayoutNodeContext( *this, xAttribs, pNode ) ); break; + } case DGM_TOKEN( clrData ): // TODO, does not matter for the UI. skip. return xRet; diff --git a/oox/source/drawingml/diagram/diagramdefinitioncontext.hxx b/oox/source/drawingml/diagram/diagramdefinitioncontext.hxx index 43af67efd4b0..cf1f733185a2 100644 --- a/oox/source/drawingml/diagram/diagramdefinitioncontext.hxx +++ b/oox/source/drawingml/diagram/diagramdefinitioncontext.hxx @@ -30,7 +30,7 @@ #define OOX_DRAWINGML_DIAGRAMDEFINITIONCONTEXT_HXX #include "oox/core/contexthandler.hxx" -#include "oox/drawingml/diagram/diagram.hxx" +#include "diagram.hxx" namespace oox { namespace drawingml { diff --git a/oox/source/drawingml/diagram/diagramfragmenthandler.cxx b/oox/source/drawingml/diagram/diagramfragmenthandler.cxx index 5d905bcbf384..6361f07f23d9 100644 --- a/oox/source/drawingml/diagram/diagramfragmenthandler.cxx +++ b/oox/source/drawingml/diagram/diagramfragmenthandler.cxx @@ -28,9 +28,10 @@ #include -#include "oox/drawingml/diagram/diagramfragmenthandler.hxx" -#include "oox/drawingml/diagram/datamodelcontext.hxx" #include "diagramdefinitioncontext.hxx" +#include "diagramfragmenthandler.hxx" +#include "datamodelcontext.hxx" +#include "oox/drawingml/colorchoicecontext.hxx" using namespace ::oox::core; using namespace ::com::sun::star::xml::sax; @@ -130,94 +131,146 @@ DiagramLayoutFragmentHandler::createFastChildContext( ::sal_Int32 aElement, /////////////////////// DiagramQStylesFragmentHandler::DiagramQStylesFragmentHandler( XmlFilterBase& rFilter, - const OUString& rFragmentPath, - const DiagramQStylesPtr pDataPtr ) - throw( ) - : FragmentHandler( rFilter, rFragmentPath ) - , mpDataPtr( pDataPtr ) -{ -} - -DiagramQStylesFragmentHandler::~DiagramQStylesFragmentHandler( ) throw () + const OUString& rFragmentPath, + DiagramQStyleMap& rStylesMap ) : + FragmentHandler2( rFilter, rFragmentPath ), + maStyleName(), + maStyleEntry(), + mrStylesMap( rStylesMap ) +{} + +::oox::core::ContextHandlerRef DiagramQStylesFragmentHandler::createStyleMatrixContext( + sal_Int32 nElement, + const AttributeList& rAttribs, + ShapeStyleRef& o_rStyle ) { - + o_rStyle.mnThemedIdx = (nElement == DGM_TOKEN(fontRef)) ? + rAttribs.getToken( XML_idx, XML_none ) : rAttribs.getInteger( XML_idx, 0 ); + return new ColorContext( *this, o_rStyle.maPhClr ); } -void SAL_CALL DiagramQStylesFragmentHandler::endDocument() - throw (SAXException, RuntimeException) +::oox::core::ContextHandlerRef DiagramQStylesFragmentHandler::onCreateContext( sal_Int32 nElement, + const AttributeList& rAttribs ) { + // state-table like way of navigating the color fragment. we + // currently ignore everything except styleLbl in the colorsDef + // element + switch( getCurrentElement() ) + { + case XML_ROOT_CONTEXT: + return nElement == DGM_TOKEN(styleDef) ? this : NULL; + case DGM_TOKEN(styleDef): + return nElement == DGM_TOKEN(styleLbl) ? this : NULL; + case DGM_TOKEN(styleLbl): + return nElement == DGM_TOKEN(style) ? this : NULL; + case DGM_TOKEN(style): + { + switch( nElement ) + { + case DGM_TOKEN(lnRef) : // CT_StyleMatrixReference + return createStyleMatrixContext(nElement,rAttribs, + maStyleEntry.maLineStyle); + case DGM_TOKEN(fillRef) : // CT_StyleMatrixReference + return createStyleMatrixContext(nElement,rAttribs, + maStyleEntry.maFillStyle); + case DGM_TOKEN(effectRef) : // CT_StyleMatrixReference + return createStyleMatrixContext(nElement,rAttribs, + maStyleEntry.maEffectStyle); + case DGM_TOKEN(fontRef) : // CT_FontRe ference + return createStyleMatrixContext(nElement,rAttribs, + maStyleEntry.maTextStyle); + } + return 0; + } + } + return 0; } -Reference< XFastContextHandler > SAL_CALL -DiagramQStylesFragmentHandler::createFastChildContext( ::sal_Int32 aElement, - const Reference< XFastAttributeList >& ) - throw ( SAXException, RuntimeException) +void DiagramQStylesFragmentHandler::onStartElement( const AttributeList& rAttribs ) { - Reference< XFastContextHandler > xRet; - - switch( aElement ) + if( getCurrentElement() == DGM_TOKEN( styleDef ) ) { - case DGM_TOKEN( styleDef ): - // TODO - break; - default: - break; + maStyleName = rAttribs.getString( XML_name, OUString() ); + maStyleEntry = mrStylesMap[maStyleName]; } - - if( !xRet.is() ) - xRet = getFastContextHandler(); - - return xRet; } ///////////////////// -DiagramColorsFragmentHandler::DiagramColorsFragmentHandler( XmlFilterBase& rFilter, - const OUString& rFragmentPath, - const DiagramColorsPtr pDataPtr ) - throw( ) - : FragmentHandler( rFilter, rFragmentPath ) - , mpDataPtr( pDataPtr ) +void DiagramQStylesFragmentHandler::onEndElement( ) { + if( getCurrentElement() == DGM_TOKEN(styleLbl) ) + mrStylesMap[maStyleName] = maStyleEntry; } -DiagramColorsFragmentHandler::~DiagramColorsFragmentHandler( ) throw () -{ - -} - -void SAL_CALL DiagramColorsFragmentHandler::endDocument() - throw (SAXException, RuntimeException) +ColorFragmentHandler::ColorFragmentHandler( ::oox::core::XmlFilterBase& rFilter, + const ::rtl::OUString& rFragmentPath, + DiagramColorMap& rColorsMap ) : + FragmentHandler2(rFilter,rFragmentPath), + maColorName(), + maColorEntry(), + mrColorsMap(rColorsMap) +{} + +::oox::core::ContextHandlerRef ColorFragmentHandler::onCreateContext( sal_Int32 nElement, + const AttributeList& /*rAttribs*/ ) { + // state-table like way of navigating the color fragment. we + // currently ignore everything except styleLbl in the colorsDef + // element + switch( getCurrentElement() ) + { + case XML_ROOT_CONTEXT: + return nElement == DGM_TOKEN(colorsDef) ? this : NULL;; + case DGM_TOKEN(colorsDef): + return nElement == DGM_TOKEN(styleLbl) ? this : NULL;; + case DGM_TOKEN(styleLbl): + return ((nElement == DGM_TOKEN(fillClrLst)) || + (nElement == DGM_TOKEN(linClrLst)) || + (nElement == DGM_TOKEN(effectClrLst)) || + (nElement == DGM_TOKEN(txLinClrLst)) || + (nElement == DGM_TOKEN(txFillClrLst)) || + (nElement == DGM_TOKEN(txEffectClrLst))) ? this : NULL;; + + // the actual colors - defer to color fragment handlers. + + // TODO(F1): well, actually, there might be *several* color + // definitions in it, after all it's called list. but + // apparently colorChoiceContext doesn't handle that anyway... + case DGM_TOKEN(fillClrLst): + return new ColorContext( *this, maColorEntry.maFillColor ); + case DGM_TOKEN(linClrLst): + return new ColorContext( *this, maColorEntry.maLineColor ); + case DGM_TOKEN(effectClrLst): + return new ColorContext( *this, maColorEntry.maEffectColor ); + case DGM_TOKEN(txFillClrLst): + return new ColorContext( *this, maColorEntry.maTextFillColor ); + case DGM_TOKEN(txLinClrLst): + return new ColorContext( *this, maColorEntry.maTextLineColor ); + case DGM_TOKEN(txEffectClrLst): + return new ColorContext( *this, maColorEntry.maTextEffectColor ); + } + return 0; } -Reference< XFastContextHandler > SAL_CALL -DiagramColorsFragmentHandler::createFastChildContext( ::sal_Int32 aElement, - const Reference< XFastAttributeList >& ) - throw ( SAXException, RuntimeException) +void ColorFragmentHandler::onStartElement( const AttributeList& rAttribs ) { - Reference< XFastContextHandler > xRet; - - switch( aElement ) + if( getCurrentElement() == DGM_TOKEN(styleLbl) ) { - case DGM_TOKEN( colorsDef ): - // TODO - break; - default: - break; + maColorName = rAttribs.getString( XML_name, OUString() ); + maColorEntry = mrColorsMap[maColorName]; } - - if( !xRet.is() ) - xRet = getFastContextHandler(); - - return xRet; } - +void ColorFragmentHandler::onEndElement( ) +{ + if( getCurrentElement() == DGM_TOKEN(styleLbl) ) + mrColorsMap[maColorName] = maColorEntry; +} } } diff --git a/oox/source/drawingml/diagram/diagramfragmenthandler.hxx b/oox/source/drawingml/diagram/diagramfragmenthandler.hxx new file mode 100644 index 000000000000..3cf42323850f --- /dev/null +++ b/oox/source/drawingml/diagram/diagramfragmenthandler.hxx @@ -0,0 +1,115 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_DIAGRAMFRAGMENTHANDLER +#define OOX_DRAWINGML_DIAGRAMFRAGMENTHANDLER + +#include "oox/core/fragmenthandler.hxx" +#include "oox/core/fragmenthandler2.hxx" +#include "oox/drawingml/diagram/diagram.hxx" + +namespace oox { namespace drawingml { + + +class DiagramDataFragmentHandler : public ::oox::core::FragmentHandler +{ +public: + DiagramDataFragmentHandler( oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, const DiagramDataPtr pDataPtr ) throw(); + virtual ~DiagramDataFragmentHandler() throw(); + + virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + DiagramDataPtr mpDataPtr; +}; + + + +class DiagramLayoutFragmentHandler : public ::oox::core::FragmentHandler +{ +public: + DiagramLayoutFragmentHandler( oox::core::XmlFilterBase& rFilter, const ::rtl::OUString& rFragmentPath, const DiagramLayoutPtr pDataPtr ) throw(); + virtual ~DiagramLayoutFragmentHandler() throw(); + + virtual void SAL_CALL endDocument() throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 Element, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ) throw (::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException); + +private: + + DiagramLayoutPtr mpDataPtr; +}; + +class DiagramQStylesFragmentHandler : public ::oox::core::FragmentHandler2 +{ +public: + DiagramQStylesFragmentHandler( + oox::core::XmlFilterBase& rFilter, + const ::rtl::OUString& rFragmentPath, + DiagramQStyleMap& rStylesMap ); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + + virtual void onStartElement( const AttributeList& rAttribs ); + virtual void onEndElement(); + +private: + ::oox::core::ContextHandlerRef createStyleMatrixContext(sal_Int32 nElement, + const AttributeList& rAttribs, + ShapeStyleRef& o_rStyle); + + ::rtl::OUString maStyleName; + DiagramStyle maStyleEntry; + DiagramQStyleMap& mrStylesMap; +}; + +class ColorFragmentHandler : public ::oox::core::FragmentHandler2 +{ +public: + ColorFragmentHandler( + ::oox::core::XmlFilterBase& rFilter, + const ::rtl::OUString& rFragmentPath, + DiagramColorMap& rColorMap ); + + virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ); + + virtual void onStartElement( const AttributeList& rAttribs ); + virtual void onEndElement(); + +private: + ::rtl::OUString maColorName; + DiagramColor maColorEntry; + DiagramColorMap& mrColorsMap; +}; + +} } + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx index dd213fda6c36..137453763d5b 100644 --- a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx +++ b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx @@ -26,14 +26,24 @@ * ************************************************************************/ -#include "oox/drawingml/diagram/diagramlayoutatoms.hxx" +#include "diagramlayoutatoms.hxx" #include #include +#include + #include "oox/helper/attributelist.hxx" +#include "oox/drawingml/fillproperties.hxx" +#include "oox/drawingml/lineproperties.hxx" +#include "oox/drawingml/textbody.hxx" +#include "oox/drawingml/textparagraph.hxx" +#include "oox/drawingml/textrun.hxx" +#include "oox/drawingml/customshapeproperties.hxx" +#include "diagramlayoutatoms.hxx" #include "layoutnodecontext.hxx" +using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::xml::sax; using namespace ::oox::core; @@ -43,7 +53,7 @@ namespace oox { namespace drawingml { IteratorAttr::IteratorAttr( ) : mnAxis( 0 ) - , mnCnt( 0 ) + , mnCnt( -1 ) , mbHideLastTrans( false ) , mnPtType( 0 ) , mnSt( 0 ) @@ -55,7 +65,7 @@ void IteratorAttr::loadFromXAttr( const Reference< XFastAttributeList >& xAttr ) { AttributeList attr( xAttr ); mnAxis = xAttr->getOptionalValueToken( XML_axis, 0 ); - mnCnt = attr.getInteger( XML_cnt, 0 ); + mnCnt = attr.getInteger( XML_cnt, -1 ); mbHideLastTrans = attr.getBool( XML_hideLastTrans, false ); mnPtType = xAttr->getOptionalValueToken( XML_ptType, 0 ); mnSt = attr.getInteger( XML_st, 0 ); @@ -88,56 +98,675 @@ void LayoutAtom::dump(int level) OSL_TRACE( "level = %d - %s of type %s", level, OUSTRING_TO_CSTR( msName ), typeid(*this).name() ); - std::for_each( mpChildNodes.begin(), mpChildNodes.end(), - boost::bind( &LayoutAtom::dump, _1, level + 1 ) ); + const std::vector& pChildren=getChildren(); + std::for_each( pChildren.begin(), pChildren.end(), + boost::bind( &LayoutAtom::dump, _1, level + 1 ) ); +} + + +ForEachAtom::ForEachAtom(const Reference< XFastAttributeList >& xAttributes) +{ + maIter.loadFromXAttr(xAttributes); +} + +void ForEachAtom::accept( LayoutAtomVisitor& rVisitor ) +{ + rVisitor.visit(*this); +} + +void ChooseAtom::accept( LayoutAtomVisitor& rVisitor ) +{ + rVisitor.visit(*this); +} + +ConditionAtom::ConditionAtom(const Reference< XFastAttributeList >& xAttributes) : + mbElse( false ) +{ + maIter.loadFromXAttr( xAttributes ); + maCond.loadFromXAttr( xAttributes ); +} + +const std::vector& ConditionAtom::getChildren() const +{ + bool bDecisionVar=true; + // HACK + if( maCond.mnFunc==XML_var && maCond.mnArg==XML_dir && + maCond.mnOp==XML_equ && !maCond.msVal.equalsAscii("norm") ) + bDecisionVar=false; + + if( bDecisionVar ) + return mpChildNodes; + else + return mpElseChildNodes; +} + +void ConditionAtom::accept( LayoutAtomVisitor& rVisitor ) +{ + rVisitor.visit(*this); +} + +void ConditionAtom::addChild( const LayoutAtomPtr & pNode ) +{ + if( mbElse ) + mpElseChildNodes.push_back( pNode ); + else + mpChildNodes.push_back( pNode ); +} + +void ConstraintAtom::accept( LayoutAtomVisitor& rVisitor ) +{ + rVisitor.visit(*this); +} + +void AlgAtom::accept( LayoutAtomVisitor& rVisitor ) +{ + rVisitor.visit(*this); } +void AlgAtom::layoutShape( const ShapePtr& rShape, + const Diagram& /*rDgm*/, + const rtl::OUString& rName ) const +{ + switch(mnType) + { + case XML_composite: + { + if( rShape->getChildren().empty() ) + { + rShape->setSize(awt::Size(50,50)); + break; + } + + // just put stuff below each other + const sal_Int32 nIncX=0; + const sal_Int32 nIncY=1; + + std::vector::const_iterator aCurrShape=rShape->getChildren().begin(); + const std::vector::const_iterator aLastShape=rShape->getChildren().end(); + + // find biggest shape + awt::Size aMaxSize; + while( aCurrShape != aLastShape ) + { + const awt::Size& sz=(*aCurrShape)->getSize(); + + aMaxSize.Width = std::max( + aMaxSize.Width, + sz.Width); + aMaxSize.Height = std::max( + aMaxSize.Height, + sz.Height); + + ++aCurrShape; + } + + aCurrShape=rShape->getChildren().begin(); + const awt::Point aStartPos=(*aCurrShape)->getPosition(); + awt::Point aCurrPos=aStartPos; + awt::Size aTotalSize; + aTotalSize.Width = aMaxSize.Width; + while( aCurrShape != aLastShape ) + { + const awt::Size& sz=(*aCurrShape)->getSize(); + (*aCurrShape)->setPosition(aCurrPos); + (*aCurrShape)->setSize( + awt::Size(aMaxSize.Width, + sz.Height)); + + aTotalSize.Height = std::max( + aTotalSize.Height, + aCurrPos.Y + sz.Height); + + aCurrPos.X += nIncX*sz.Width; + aCurrPos.Y += nIncY*sz.Height; + + ++aCurrShape; + } + + rShape->setSize(aTotalSize); + break; + } + + case XML_conn: + break; + + case XML_cycle: + { + if( rShape->getChildren().empty() ) + { + rShape->setSize(awt::Size(50,50)); + break; + } + + const sal_Int32 nStartAngle=maMap.count(XML_stAng) ? maMap.find(XML_stAng)->second : 0; + const sal_Int32 nSpanAngle=maMap.count(XML_spanAng) ? maMap.find(XML_spanAng)->second : 360; + + std::vector::const_iterator aCurrShape=rShape->getChildren().begin(); + const std::vector::const_iterator aLastShape=rShape->getChildren().end(); + const sal_Int32 nShapes=aLastShape-aCurrShape; + + // find biggest shape + awt::Size aMaxSize; + while( aCurrShape != aLastShape ) + { + const awt::Size& sz=(*aCurrShape)->getSize(); + + aMaxSize.Width = std::max( + aMaxSize.Width, + sz.Width); + aMaxSize.Height = std::max( + aMaxSize.Height, + sz.Height); + + ++aCurrShape; + } + + // layout shapes + const sal_Int32 nMaxDim=std::max(aMaxSize.Width,aMaxSize.Height); + awt::Size aTotalSize; + aCurrShape=rShape->getChildren().begin(); + for( sal_Int32 i=0; igetSize(); + + const double r=nShapes*nMaxDim/F_2PI * 360.0/nSpanAngle; + const awt::Point aCurrPos( + r + r*sin( (double(i)*nSpanAngle/nShapes + nStartAngle)*F_PI180 ), + r - r*cos( (double(i)*nSpanAngle/nShapes + nStartAngle)*F_PI180 ) ); + (*aCurrShape)->setPosition(aCurrPos); + + aTotalSize.Width = std::max( + aTotalSize.Width, + aCurrPos.X + sz.Width); + aTotalSize.Height = std::max( + aTotalSize.Height, + aCurrPos.Y + sz.Height); + } + + rShape->setSize(aTotalSize); + break; + } + + case XML_hierChild: + case XML_hierRoot: + break; + + case XML_lin: + { + if( rShape->getChildren().empty() ) + { + rShape->setSize(awt::Size(50,50)); + break; + } + + const sal_Int32 nDir=maMap.count(XML_linDir) ? maMap.find(XML_linDir)->second : XML_fromL; + const sal_Int32 nIncX=nDir==XML_fromL ? 1 : (nDir==XML_fromR ? -1 : 0); + const sal_Int32 nIncY=nDir==XML_fromT ? 1 : (nDir==XML_fromB ? -1 : 0); + + std::vector::const_iterator aCurrShape=rShape->getChildren().begin(); + const std::vector::const_iterator aLastShape=rShape->getChildren().end(); + const awt::Point aStartPos=(*aCurrShape)->getPosition(); + awt::Point aCurrPos=aStartPos; + awt::Size aTotalSize; + while( aCurrShape != aLastShape ) + { + const awt::Size& sz=(*aCurrShape)->getSize(); + (*aCurrShape)->setPosition(aCurrPos); + + aTotalSize.Width = std::max( + aTotalSize.Width, + aCurrPos.X + sz.Width); + aTotalSize.Height = std::max( + aTotalSize.Height, + aCurrPos.Y + sz.Height); + + // HACK: the spacing is arbitrary + aCurrPos.X += nIncX*(sz.Width+5); + aCurrPos.Y += nIncY*(sz.Height+5); + + ++aCurrShape; + } + + rShape->setSize(aTotalSize); + break; + } + + case XML_pyra: + case XML_snake: + break; + + case XML_sp: + // HACK. Handled one level higher. Or rather, planned to + break; -void ForEachAtom::processAtom() + case XML_tx: + { + TextBodyPtr pTextBody=rShape->getTextBody(); + if( !pTextBody || + pTextBody->getParagraphs().empty() || + pTextBody->getParagraphs().front()->getRuns().empty() ) + { + rShape->setSize(awt::Size(5,5)); + break; + } + + // HACK - count chars & paragraphs to come up with *some* + // notion of necessary size + const sal_Int32 nHackyFontHeight=50; + const sal_Int32 nHackyFontWidth=20; + awt::Size aTotalSize; + for( sal_uInt32 nPara=0; nParagetParagraphs().size(); ++nPara ) + { + aTotalSize.Height += nHackyFontHeight; + + sal_Int32 nLocalWidth=0; + for( sal_uInt32 nRun=0; nRungetParagraphs().at(nPara)->getRuns().size(); ++nRun ) + nLocalWidth += + pTextBody->getParagraphs().at(nPara)->getRuns().at(nRun)->getText().getLength() + * nHackyFontWidth; + + aTotalSize.Width = std::max( + aTotalSize.Width, + nLocalWidth); + } + + rShape->setSize(aTotalSize); + } + + default: + break; + } + + OSL_TRACE("Layouting shape %s: (%d,%d,%d,%d)", + OUSTRING_TO_CSTR( rName ), + rShape->getPosition().X, + rShape->getPosition().Y, + rShape->getSize().Width, + rShape->getSize().Height); +} + +void LayoutNode::accept( LayoutAtomVisitor& rVisitor ) { - // TODO there is likely some conditions - std::for_each( mpChildNodes.begin(), mpChildNodes.end(), - boost::bind( &LayoutAtom::processAtom, _1 ) ); + rVisitor.visit(*this); } -/** call ConditionAtom::test() if pAtom is one - * if it is not a ConditionAtom, then return false. - */ -static bool _test_atom( const LayoutAtomPtr & pAtom) +bool LayoutNode::setupShape( const ShapePtr& rShape, const Diagram& rDgm, sal_uInt32 nIdx ) const { - try { - bool bResult = false; - const ConditionAtomPtr pCond = boost::dynamic_pointer_cast< ConditionAtom >(pAtom); - if( pCond ) + // find the data node to grab text from + DiagramData::PointsNameMap::const_iterator aDataNode=rDgm.getData()->getPointsPresNameMap().find(msName); + if( aDataNode->second.size() > nIdx && + aDataNode != rDgm.getData()->getPointsPresNameMap().end() ) + { + OSL_TRACE( "Filling content from %d th layout node named \"%s\", modelId \"%s\"", + nIdx, + OUSTRING_TO_CSTR( msName ), + OUSTRING_TO_CSTR( aDataNode->second.at(nIdx)->msModelId ) ); + + // got the presentation node - now, need the actual data node: + const DiagramData::StringMap::const_iterator aNodeName=rDgm.getData()->getPresOfNameMap().find( + aDataNode->second.at(nIdx)->msModelId); + if( aNodeName != rDgm.getData()->getPresOfNameMap().end() ) + { + DiagramData::StringMap::value_type::second_type::const_iterator aVecIter=aNodeName->second.begin(); + const DiagramData::StringMap::value_type::second_type::const_iterator aVecEnd=aNodeName->second.end(); + while( aVecIter != aVecEnd ) + { + DiagramData::PointNameMap::const_iterator aDataNode2=rDgm.getData()->getPointNameMap().find(aVecIter->first); + if( aVecIter->second == 0 ) + { + // grab shape attr from topmost element(s) + rShape->getShapeProperties() = aDataNode2->second->mpShape->getShapeProperties(); + rShape->getLineProperties() = aDataNode2->second->mpShape->getLineProperties(); + rShape->getFillProperties() = aDataNode2->second->mpShape->getFillProperties(); + rShape->getCustomShapeProperties() = aDataNode2->second->mpShape->getCustomShapeProperties(); + rShape->setMasterTextListStyle( aDataNode2->second->mpShape->getMasterTextListStyle() ); + + OSL_TRACE( "Custom shape with preset type %s added for layout node named \"%s\"", + OUSTRING_TO_CSTR( + rShape->getCustomShapeProperties()->getShapePresetType()), + OUSTRING_TO_CSTR( msName ) ); + } + + // append text with right outline level + if( aDataNode2->second->mpShape->getTextBody() && + !aDataNode2->second->mpShape->getTextBody()->getParagraphs().empty() && + !aDataNode2->second->mpShape->getTextBody()->getParagraphs().front()->getRuns().empty() ) + { + TextBodyPtr pTextBody=rShape->getTextBody(); + if( !pTextBody ) + { + pTextBody.reset( new TextBody() ); + + // also copy text attrs + pTextBody->getTextListStyle() = + aDataNode2->second->mpShape->getTextBody()->getTextListStyle(); + pTextBody->getTextProperties() = + aDataNode2->second->mpShape->getTextBody()->getTextProperties(); + + rShape->setTextBody(pTextBody); + } + + TextParagraph& rPara=pTextBody->addParagraph(); + if( aVecIter->second != -1 ) + rPara.getProperties().setLevel(aVecIter->second); + + rPara.addRun( + aDataNode2->second->mpShape->getTextBody()->getParagraphs().front()->getRuns().front()); + rPara.getProperties().apply( + aDataNode2->second->mpShape->getTextBody()->getParagraphs().front()->getProperties()); + } + + ++aVecIter; + } + } + else + { + OSL_TRACE("ShapeCreationVisitor::visit: no data node name found while processing shape type %s for layout node named \"%s\"", + OUSTRING_TO_CSTR( + rShape->getCustomShapeProperties()->getShapePresetType()), + OUSTRING_TO_CSTR( msName ) ); + } + + // TODO(Q1): apply styling & coloring - taking + // layout node's styleLbl for both style & color + // now, but docs are a bit unclear on this + if( msStyleLabel.getLength() ) { - bResult = pCond->test(); + OSL_TRACE("setting style with label %s", + OUSTRING_TO_CSTR( msStyleLabel ) ); + + const DiagramQStyleMap::const_iterator aStyle=rDgm.getStyles().find(msStyleLabel); + if( aStyle != rDgm.getStyles().end() ) + { + rShape->getShapeStyleRefs()[XML_fillRef] = aStyle->second.maFillStyle; + OSL_TRACE("added fill style with id %d", aStyle->second.maFillStyle.mnThemedIdx); + rShape->getShapeStyleRefs()[XML_lnRef] = aStyle->second.maLineStyle; + OSL_TRACE("added line style with id %d", aStyle->second.maLineStyle.mnThemedIdx); + rShape->getShapeStyleRefs()[XML_effectRef] = aStyle->second.maEffectStyle; + OSL_TRACE("added effect style with id %d", aStyle->second.maEffectStyle.mnThemedIdx); + rShape->getShapeStyleRefs()[XML_fontRef] = aStyle->second.maTextStyle; + OSL_TRACE("added fontref style with id %d", aStyle->second.maTextStyle.mnThemedIdx); + Color aColor=aStyle->second.maTextStyle.maPhClr; + OSL_TRACE("added fontref color with alpha %d", aColor.getTransparency() ); + } + + const DiagramColorMap::const_iterator aColor=rDgm.getColors().find(msStyleLabel); + if( aColor != rDgm.getColors().end() ) + { + const DiagramColor& rColor=aColor->second; + if( rColor.maFillColor.isUsed() ) + rShape->getShapeStyleRefs()[XML_fillRef].maPhClr = rColor.maFillColor; + if( rColor.maLineColor.isUsed() ) + rShape->getShapeStyleRefs()[XML_lnRef].maPhClr = rColor.maLineColor; + if( rColor.maEffectColor.isUsed() ) + rShape->getShapeStyleRefs()[XML_effectRef].maPhClr = rColor.maEffectColor; + if( rColor.maTextFillColor.isUsed() ) + rShape->getShapeStyleRefs()[XML_fontRef].maPhClr = rColor.maTextFillColor; + } } - return bResult; + + // even if no data node found, successful anyway. it's + // contained at the layoutnode + return true; } - catch(...) + else { + OSL_TRACE("ShapeCreationVisitor::visit: no text found while processing shape type %s for layout node named \"%s\"", + OUSTRING_TO_CSTR( + rShape->getCustomShapeProperties()->getShapePresetType()), + OUSTRING_TO_CSTR( msName ) ); } + return false; } -void ChooseAtom::processAtom() +/////////////////////////////////////////////////////////////////////// +// +// Visitation +// + +class ShapeLayoutingVisitor : public LayoutAtomVisitor +{ + ShapePtr mpParentShape; + const Diagram& mrDgm; + rtl::OUString maName; + + virtual void visit(ConstraintAtom& rAtom); + virtual void visit(AlgAtom& rAtom); + virtual void visit(ForEachAtom& rAtom); + virtual void visit(ConditionAtom& rAtom); + virtual void visit(ChooseAtom& rAtom); + virtual void visit(LayoutNode& rAtom); + +public: + ShapeLayoutingVisitor(const ShapePtr& rParentShape, + const Diagram& rDgm, + const rtl::OUString& rName) : + mpParentShape(rParentShape), + mrDgm(rDgm), + maName(rName) + {} + + void defaultVisit(LayoutAtom& rAtom); +}; + +class ShallowPresNameVisitor : public LayoutAtomVisitor +{ + const Diagram& mrDgm; + size_t mnCnt; + + void defaultVisit(LayoutAtom& rAtom); + virtual void visit(ConstraintAtom& rAtom); + virtual void visit(AlgAtom& rAtom); + virtual void visit(ForEachAtom& rAtom); + virtual void visit(ConditionAtom& rAtom); + virtual void visit(ChooseAtom& rAtom); + virtual void visit(LayoutNode& rAtom); + +public: + ShallowPresNameVisitor(const Diagram& rDgm) : + mrDgm(rDgm), + mnCnt(0) + {} + + size_t getCount() const + { return mnCnt; } +}; + +void ShapeCreationVisitor::defaultVisit(LayoutAtom& rAtom) +{ + const std::vector& pChildren=rAtom.getChildren(); + std::for_each( pChildren.begin(), pChildren.end(), + boost::bind( &LayoutAtom::accept, + _1, + boost::ref(*this)) ); +} + +void ShapeCreationVisitor::visit(ConstraintAtom& /*rAtom*/) +{ + // TODO: eval the constraints +} + +void ShapeCreationVisitor::visit(AlgAtom& rAtom) { - std::vector< LayoutAtomPtr >::iterator - iter = std::find_if( mpChildNodes.begin(), mpChildNodes.end(), - boost::bind( &_test_atom, _1 ) ); - if( iter != mpChildNodes.end() ) + defaultVisit(rAtom); +} + +void ShapeCreationVisitor::visit(ForEachAtom& rAtom) +{ + const std::vector& pChildren=rAtom.getChildren(); + + sal_Int32 nChildren=1; + if( rAtom.iterator().mnPtType == XML_node ) + { + // cound child data nodes - check all child Atoms for "name" + // attribute that is contained in diagram's + // getPointsPresNameMap() + ShallowPresNameVisitor aVisitor(mrDgm); + std::for_each( pChildren.begin(), pChildren.end(), + boost::bind( &LayoutAtom::accept, + _1, + boost::ref(aVisitor)) ); + nChildren = aVisitor.getCount(); + } + + const sal_Int32 nCnt = std::min( + nChildren, + rAtom.iterator().mnCnt==-1 ? nChildren : rAtom.iterator().mnCnt); + + const sal_Int32 nOldIdx=mnCurrIdx; + const sal_Int32 nStep=rAtom.iterator().mnStep; + for( mnCurrIdx=0; mnCurrIdx0; mnCurrIdx+=nStep ) { - // TODO do something - (*iter)->processAtom(); + // TODO there is likely some conditions + std::for_each( pChildren.begin(), pChildren.end(), + boost::bind( &LayoutAtom::accept, + _1, + boost::ref(*this)) ); } + + // and restore idx + mnCurrIdx = nOldIdx; } -bool ConditionAtom::test() +void ShapeCreationVisitor::visit(ConditionAtom& rAtom) { - // TODO - return false; + defaultVisit(rAtom); +} + +void ShapeCreationVisitor::visit(ChooseAtom& rAtom) +{ + defaultVisit(rAtom); +} + +void ShapeCreationVisitor::visit(LayoutNode& rAtom) +{ + ShapePtr pCurrParent(mpParentShape); + ShapePtr pCurrShape(rAtom.getShape()); + if( pCurrShape ) + { + OSL_TRACE("ShapeCreationVisitor::visit: processing shape type %s", + OUSTRING_TO_CSTR( + pCurrShape->getCustomShapeProperties()->getShapePresetType()) ); + + // TODO(F3): cloned shape shares all properties by reference, + // don't change them! + ShapePtr pClonedShape( + new Shape( pCurrShape )); + + if( rAtom.setupShape(pClonedShape, mrDgm, mnCurrIdx) ) + { + pCurrParent->addChild(pClonedShape); + pCurrParent = pClonedShape; + } + } + else + { + OSL_TRACE("ShapeCreationVisitor::visit: no shape set while processing layoutnode named %s", + OUSTRING_TO_CSTR( rAtom.getName() ) ); + } + + // set new parent for children + ShapePtr pPreviousParent(mpParentShape); + mpParentShape=pCurrParent; + + // process children + defaultVisit(rAtom); + + // restore parent + mpParentShape=pPreviousParent; + + // layout shapes - now all child shapes are created + ShapeLayoutingVisitor aLayoutingVisitor(pCurrParent, + mrDgm, + rAtom.getName()); + aLayoutingVisitor.defaultVisit(rAtom); +} + +void ShapeLayoutingVisitor::defaultVisit(LayoutAtom& rAtom) +{ + // visit all children, one of them need to be the layout algoritm + const std::vector& pChildren=rAtom.getChildren(); + std::for_each( pChildren.begin(), pChildren.end(), + boost::bind( &LayoutAtom::accept, + _1, + boost::ref(*this)) ); +} + +void ShapeLayoutingVisitor::visit(ConstraintAtom& /*rAtom*/) +{ + // stop processing +} + +void ShapeLayoutingVisitor::visit(AlgAtom& rAtom) +{ + rAtom.layoutShape(mpParentShape,mrDgm,maName); +} + +void ShapeLayoutingVisitor::visit(ForEachAtom& /*rAtom*/) +{ + // stop processing +} + +void ShapeLayoutingVisitor::visit(ConditionAtom& rAtom) +{ + defaultVisit(rAtom); +} + +void ShapeLayoutingVisitor::visit(ChooseAtom& rAtom) +{ + defaultVisit(rAtom); } +void ShapeLayoutingVisitor::visit(LayoutNode& /*rAtom*/) +{ + // stop processing - only traverse Condition/Choose atoms +} + +void ShallowPresNameVisitor::defaultVisit(LayoutAtom& rAtom) +{ + // visit all children, at least one of them needs to have proper + // name set + const std::vector& pChildren=rAtom.getChildren(); + std::for_each( pChildren.begin(), pChildren.end(), + boost::bind( &LayoutAtom::accept, + _1, + boost::ref(*this)) ); +} + +void ShallowPresNameVisitor::visit(ConstraintAtom& /*rAtom*/) +{ + // stop processing +} + +void ShallowPresNameVisitor::visit(AlgAtom& /*rAtom*/) +{ + // stop processing +} + +void ShallowPresNameVisitor::visit(ForEachAtom& rAtom) +{ + defaultVisit(rAtom); +} + +void ShallowPresNameVisitor::visit(ConditionAtom& rAtom) +{ + defaultVisit(rAtom); +} + +void ShallowPresNameVisitor::visit(ChooseAtom& rAtom) +{ + defaultVisit(rAtom); +} + +void ShallowPresNameVisitor::visit(LayoutNode& rAtom) +{ + DiagramData::PointsNameMap::const_iterator aDataNode= + mrDgm.getData()->getPointsPresNameMap().find(rAtom.getName()); + if( aDataNode != mrDgm.getData()->getPointsPresNameMap().end() ) + mnCnt = std::max(mnCnt, + aDataNode->second.size()); +} } } diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.hxx b/oox/source/drawingml/diagram/diagramlayoutatoms.hxx new file mode 100644 index 000000000000..f06592056cf6 --- /dev/null +++ b/oox/source/drawingml/diagram/diagramlayoutatoms.hxx @@ -0,0 +1,318 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef OOX_DRAWINGML_DIAGRAMLAYOUTATOMS_HXX +#define OOX_DRAWINGML_DIAGRAMLAYOUTATOMS_HXX + +#include +#include + +#include +#include + +#include +#include + +#include "oox/drawingml/shape.hxx" +#include "diagram.hxx" + + +namespace oox { namespace drawingml { + +class DiagramLayout; +typedef boost::shared_ptr< DiagramLayout > DiagramLayoutPtr; + +// AG_IteratorAttributes +struct IteratorAttr +{ + IteratorAttr(); + + // not sure this belong here, but wth + void loadFromXAttr( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes ); + + sal_Int32 mnAxis; + sal_Int32 mnCnt; + sal_Bool mbHideLastTrans; + sal_Int32 mnPtType; + sal_Int32 mnSt; + sal_Int32 mnStep; +}; + +struct ConditionAttr +{ + ConditionAttr(); + + // not sure this belong here, but wth + void loadFromXAttr( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes ); + + sal_Int32 mnFunc; + sal_Int32 mnArg; + sal_Int32 mnOp; + ::rtl::OUString msVal; +}; + +struct LayoutAtomVisitor; +class LayoutAtom; + +typedef boost::shared_ptr< LayoutAtom > LayoutAtomPtr; + +/** abstract Atom for the layout */ +class LayoutAtom +{ +public: + /** visitor acceptance + */ + virtual void accept( LayoutAtomVisitor& ) = 0; + + void setName( const ::rtl::OUString& sName ) + { msName = sName; } + const ::rtl::OUString& getName() const + { return msName; } + + virtual void addChild( const LayoutAtomPtr & pNode ) + { mpChildNodes.push_back( pNode ); } + virtual const std::vector& getChildren() const + { return mpChildNodes; } + + // dump for debug + void dump(int level = 0); +protected: + std::vector< LayoutAtomPtr > mpChildNodes; + ::rtl::OUString msName; +}; + +class ConstraintAtom + : public LayoutAtom +{ +public: + ConstraintAtom() : + mnFor(-1), msForName(), mnPointType(-1), mnType(-1), mnRefFor(-1), msRefForName(), + mnRefType(-1), mnRefPointType(-1), mfFactor(1.0), mfValue(0.0), mnOperator(0) + {} + + virtual void accept( LayoutAtomVisitor& ); + + void setFor( sal_Int32 nToken ) + { mnFor = nToken; } + void setForName( const ::rtl::OUString & sName ) + { msForName = sName; } + void setPointType( sal_Int32 nToken ) + { mnPointType = nToken; } + void setType( sal_Int32 nToken ) + { mnType = nToken; } + void setRefFor( sal_Int32 nToken ) + { mnRefFor = nToken; } + void setRefForName( const ::rtl::OUString & sName ) + { msRefForName = sName; } + void setRefType( sal_Int32 nToken ) + { mnRefType = nToken; } + void setRefPointType( sal_Int32 nToken ) + { mnRefPointType = nToken; } + void setFactor( const double& fVal ) + { mfFactor = fVal; } + void setValue( const double& fVal ) + { mfValue = fVal; } + void setOperator( sal_Int32 nToken ) + { mnOperator = nToken; } +private: + sal_Int32 mnFor; + ::rtl::OUString msForName; + sal_Int32 mnPointType; + sal_Int32 mnType; + sal_Int32 mnRefFor; + ::rtl::OUString msRefForName; + sal_Int32 mnRefType; + sal_Int32 mnRefPointType; + double mfFactor; + double mfValue; + sal_Int32 mnOperator; +}; + +typedef boost::shared_ptr< ConstraintAtom > ConstraintAtomPtr; + +class AlgAtom + : public LayoutAtom +{ +public: + AlgAtom() : mnType(0), maMap() {} + + typedef std::map ParamMap; + + virtual void accept( LayoutAtomVisitor& ); + + void setType( sal_Int32 nToken ) + { mnType = nToken; } + void addParam( sal_Int32 nType, sal_Int32 nVal ) + { maMap[nType]=nVal; } + void layoutShape( const ShapePtr& rShape, + const Diagram& rDgm, + const rtl::OUString& rName ) const; +private: + sal_Int32 mnType; + ParamMap maMap; +}; + +typedef boost::shared_ptr< AlgAtom > AlgAtomPtr; + +class ForEachAtom + : public LayoutAtom +{ +public: + explicit ForEachAtom(const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes); + + IteratorAttr & iterator() + { return maIter; } + virtual void accept( LayoutAtomVisitor& ); + +private: + IteratorAttr maIter; +}; + +typedef boost::shared_ptr< ForEachAtom > ForEachAtomPtr; + + +class ConditionAtom + : public LayoutAtom +{ +public: + explicit ConditionAtom(const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& xAttributes); + bool test(); + virtual void accept( LayoutAtomVisitor& ); + IteratorAttr & iterator() + { return maIter; } + ConditionAttr & cond() + { return maCond; } + void readElseBranch() + { mbElse=true; } + virtual void addChild( const LayoutAtomPtr & pNode ); + virtual const std::vector& getChildren() const; +private: + bool mbElse; + IteratorAttr maIter; + ConditionAttr maCond; + std::vector< LayoutAtomPtr > mpElseChildNodes; +}; + +typedef boost::shared_ptr< ConditionAtom > ConditionAtomPtr; + + +/** "choose" statements. Atoms will be tested in order. */ +class ChooseAtom + : public LayoutAtom +{ +public: + virtual void accept( LayoutAtomVisitor& ); +}; + +class LayoutNode + : public LayoutAtom +{ +public: + enum { + VAR_animLvl = 0, + VAR_animOne, + VAR_bulletEnabled, + VAR_chMax, + VAR_chPref, + VAR_dir, + VAR_hierBranch, + VAR_orgChart, + VAR_resizeHandles + }; + // we know that the array is of fixed size + // the use of Any allow having empty values + typedef boost::array< ::com::sun::star::uno::Any, 9 > VarMap; + + LayoutNode() : mnChildOrder(0) {} + virtual void accept( LayoutAtomVisitor& ); + VarMap & variables() + { return mVariables; } + void setMoveWith( const ::rtl::OUString & sName ) + { msMoveWith = sName; } + void setStyleLabel( const ::rtl::OUString & sLabel ) + { msStyleLabel = sLabel; } + void setChildOrder( sal_Int32 nOrder ) + { mnChildOrder = nOrder; } + void setShape( const ShapePtr& pShape ) + { mpShape = pShape; } + const ShapePtr& getShape() const + { return mpShape; } + + bool setupShape( const ShapePtr& rShape, + const Diagram& rDgm, + sal_uInt32 nIdx ) const; + +private: + VarMap mVariables; + ::rtl::OUString msMoveWith; + ::rtl::OUString msStyleLabel; + ShapePtr mpShape; + sal_Int32 mnChildOrder; +}; + +typedef boost::shared_ptr< LayoutNode > LayoutNodePtr; + +struct LayoutAtomVisitor +{ + virtual ~LayoutAtomVisitor() {} + virtual void visit(ConstraintAtom& rAtom) = 0; + virtual void visit(AlgAtom& rAtom) = 0; + virtual void visit(ForEachAtom& rAtom) = 0; + virtual void visit(ConditionAtom& rAtom) = 0; + virtual void visit(ChooseAtom& rAtom) = 0; + virtual void visit(LayoutNode& rAtom) = 0; +}; + +class ShapeCreationVisitor : public LayoutAtomVisitor +{ + ShapePtr mpParentShape; + const Diagram& mrDgm; + sal_Int32 mnCurrIdx; + + void defaultVisit(LayoutAtom& rAtom); + virtual void visit(ConstraintAtom& rAtom); + virtual void visit(AlgAtom& rAtom); + virtual void visit(ForEachAtom& rAtom); + virtual void visit(ConditionAtom& rAtom); + virtual void visit(ChooseAtom& rAtom); + virtual void visit(LayoutNode& rAtom); + +public: + ShapeCreationVisitor(const ShapePtr& rParentShape, + const Diagram& rDgm) : + mpParentShape(rParentShape), + mrDgm(rDgm), + mnCurrIdx(0) + {} +}; + +} } + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/drawingml/diagram/layoutnodecontext.cxx b/oox/source/drawingml/diagram/layoutnodecontext.cxx index 3edf483555da..b01b4a414313 100644 --- a/oox/source/drawingml/diagram/layoutnodecontext.cxx +++ b/oox/source/drawingml/diagram/layoutnodecontext.cxx @@ -31,7 +31,9 @@ #include "oox/helper/attributelist.hxx" #include "oox/drawingml/diagram/diagram.hxx" #include "oox/drawingml/shapecontext.hxx" +#include "oox/drawingml/customshapeproperties.hxx" #include "diagramdefinitioncontext.hxx" +#include "constraintlistcontext.hxx" using namespace ::oox::core; using namespace ::com::sun::star::uno; @@ -46,15 +48,9 @@ class IfContext public: IfContext( ContextHandler& rParent, const Reference< XFastAttributeList >& xAttribs, - const LayoutAtomPtr & pNode ) - : LayoutNodeContext( rParent, xAttribs, pNode ) - { - ConditionAtomPtr pAtom( boost::dynamic_pointer_cast< ConditionAtom >(pNode) ); - OSL_ENSURE( pAtom, "Must pass a ConditionAtom" ); - - pAtom->iterator().loadFromXAttr( xAttribs ); - pAtom->cond().loadFromXAttr( xAttribs ); - } + const ConditionAtomPtr& pAtom ) + : LayoutNodeContext( rParent, xAttribs, pAtom ) + {} }; @@ -63,21 +59,47 @@ class AlgorithmContext : public ContextHandler { public: - AlgorithmContext( ContextHandler& rParent, const Reference< XFastAttributeList >& xAttribs, const LayoutAtomPtr & pNode ) + AlgorithmContext( ContextHandler& rParent, const Reference< XFastAttributeList >& xAttribs, const AlgAtomPtr & pNode ) : ContextHandler( rParent ) , mnRevision( 0 ) - , mnType( 0 ) , mpNode( pNode ) { AttributeList aAttribs( xAttribs ); mnRevision = aAttribs.getInteger( XML_rev, 0 ); - mnType = xAttribs->getOptionalValueToken( XML_type, 0 ); + pNode->setType(xAttribs->getOptionalValueToken(XML_type, 0)); + } + + virtual Reference< XFastContextHandler > SAL_CALL + createFastChildContext( ::sal_Int32 aElement, + const Reference< XFastAttributeList >& xAttribs ) + throw (SAXException, RuntimeException) + { + Reference< XFastContextHandler > xRet; + + switch( aElement ) + { + case DGM_TOKEN( param ): + { + AttributeList aAttribs( xAttribs ); + const sal_Int32 nValTok=aAttribs.getToken( XML_val, 0 ); + mpNode->addParam( + aAttribs.getToken( XML_type, 0 ), + nValTok>0 ? nValTok : aAttribs.getInteger( XML_val, 0 ) ); + break; + } + default: + break; + } + + if( !xRet.is() ) + xRet.set(this); + + return xRet; } private: - sal_Int32 mnRevision; - sal_Int32 mnType; - LayoutAtomPtr mpNode; + sal_Int32 mnRevision; + AlgAtomPtr mpNode; }; @@ -87,7 +109,6 @@ class ChooseContext public: ChooseContext( ContextHandler& rParent, const Reference< XFastAttributeList >& xAttribs, const LayoutAtomPtr & pNode ) : ContextHandler( rParent ) - , mbHasElse( false ) , mpNode( pNode ) { msName = xAttribs->getOptionalValue( XML_name ); @@ -102,22 +123,21 @@ public: switch( aElement ) { - case XML_if: + case DGM_TOKEN( if ): { // CT_When - LayoutAtomPtr pAtom( new ConditionAtom( false ) ); - mpNode->addChild( pAtom ); - xRet.set( new IfContext( *this, xAttribs, pAtom ) ); + mpConditionNode.reset( new ConditionAtom(xAttribs) ); + mpNode->addChild( mpConditionNode ); + xRet.set( new IfContext( *this, xAttribs, mpConditionNode ) ); break; } - case XML_else: + case DGM_TOKEN( else ): // CT_Otherwise - if( !mbHasElse ) + if( mpConditionNode ) { - LayoutAtomPtr pAtom( new ConditionAtom( true ) ); - mpNode->addChild( pAtom ); - xRet.set( new IfContext( *this, xAttribs, pAtom ) ); - mbHasElse = true; + mpConditionNode->readElseBranch(); + xRet.set( new IfContext( *this, xAttribs, mpConditionNode ) ); + mpConditionNode.reset(); } else { @@ -134,9 +154,9 @@ public: return xRet; } private: - bool mbHasElse; OUString msName; LayoutAtomPtr mpNode; + ConditionAtomPtr mpConditionNode; }; @@ -146,13 +166,10 @@ class ForEachContext : public LayoutNodeContext { public: - ForEachContext( ContextHandler& rParent, const Reference< XFastAttributeList >& xAttribs, const LayoutAtomPtr & pNode ) - : LayoutNodeContext( rParent, xAttribs, pNode ) + ForEachContext( ContextHandler& rParent, const Reference< XFastAttributeList >& xAttribs, const ForEachAtomPtr& pAtom ) + : LayoutNodeContext( rParent, xAttribs, pAtom ) { - ForEachAtomPtr pAtom( boost::dynamic_pointer_cast< ForEachAtom >(pNode) ); - OSL_ENSURE( pAtom, "Must pass a ForEachAtom" ); xAttribs->getOptionalValue( XML_ref ); - pAtom->iterator().loadFromXAttr( xAttribs ); } }; @@ -196,17 +213,12 @@ private: // CT_LayoutNode LayoutNodeContext::LayoutNodeContext( ContextHandler& rParent, const Reference< XFastAttributeList >& xAttribs, - const LayoutAtomPtr &pNode ) + const LayoutAtomPtr& pAtom ) : ContextHandler( rParent ) - , mpNode( pNode ) + , mpNode( pAtom ) { - OSL_ENSURE( pNode, "Node must NOT be NULL" ); + OSL_ENSURE( pAtom, "Node must NOT be NULL" ); mpNode->setName( xAttribs->getOptionalValue( XML_name ) ); - // TODO shall we even bother? - // b or t -// sal_Int32 nChOrder = xAttributes->getOptionalValueToken( XML_chOrder, XML_b ); -// OUString sMoveWith = xAttributes->getOptionalValue( XML_moveWith ); -// OUString sStyleLbl = xAttributes->getOptionalValue( XML_styleLbl ); } @@ -276,13 +288,39 @@ LayoutNodeContext::createFastChildContext( ::sal_Int32 aElement, { LayoutNodePtr pNode( new LayoutNode() ); mpNode->addChild( pNode ); + pNode->setChildOrder( xAttribs->getOptionalValueToken( XML_chOrder, XML_b ) ); + pNode->setMoveWith( xAttribs->getOptionalValue( XML_moveWith ) ); + pNode->setStyleLabel( xAttribs->getOptionalValue( XML_styleLbl ) ); xRet.set( new LayoutNodeContext( *this, xAttribs, pNode ) ); break; } case DGM_TOKEN( shape ): { - ShapePtr pShape( new Shape() ); - xRet.set( new ShapeContext( *this, ShapePtr(), pShape ) ); + LayoutNodePtr pNode( boost::dynamic_pointer_cast< LayoutNode >( mpNode ) ); + if( pNode ) + { + ShapePtr pShape; + + if( xAttribs->hasAttribute( XML_type ) ) + { + pShape.reset( new Shape("com.sun.star.drawing.CustomShape") ); + const sal_Int32 nType(xAttribs->getOptionalValueToken( XML_type, XML_obj )); + pShape->setSubType( nType ); + pShape->getCustomShapeProperties()->setShapePresetType( + GetShapePresetType( nType ) ); + } + else + { + pShape.reset( new Shape("com.sun.star.drawing.GroupShape") ); + } + + pNode->setShape( pShape ); + xRet.set( new ShapeContext( *this, ShapePtr(), pShape ) ); + } + else + { + OSL_TRACE( "OOX: encountered a shape in a non layoutNode context" ); + } break; } case DGM_TOKEN( extLst ): @@ -290,7 +328,7 @@ LayoutNodeContext::createFastChildContext( ::sal_Int32 aElement, case DGM_TOKEN( alg ): { // CT_Algorithm - LayoutAtomPtr pAtom( new AlgAtom ); + AlgAtomPtr pAtom( new AlgAtom ); mpNode->addChild( pAtom ); xRet.set( new AlgorithmContext( *this, xAttribs, pAtom ) ); break; @@ -306,14 +344,14 @@ LayoutNodeContext::createFastChildContext( ::sal_Int32 aElement, case DGM_TOKEN( forEach ): { // CT_ForEach - LayoutAtomPtr pAtom( new ForEachAtom ); + ForEachAtomPtr pAtom( new ForEachAtom(xAttribs) ); mpNode->addChild( pAtom ); xRet.set( new ForEachContext( *this, xAttribs, pAtom ) ); break; } case DGM_TOKEN( constrLst ): // CT_Constraints - // TODO + xRet.set( new ConstraintListContext( *this, xAttribs, mpNode ) ); break; case DGM_TOKEN( presOf ): { diff --git a/oox/source/drawingml/diagram/layoutnodecontext.hxx b/oox/source/drawingml/diagram/layoutnodecontext.hxx index 0b2270bb0a86..ced1ef14c717 100644 --- a/oox/source/drawingml/diagram/layoutnodecontext.hxx +++ b/oox/source/drawingml/diagram/layoutnodecontext.hxx @@ -30,7 +30,8 @@ #define OOX_DRAWINGML_LAYOUTNODECONTEXT_HXX #include "oox/core/contexthandler.hxx" -#include "oox/drawingml/diagram/diagram.hxx" +#include "diagramlayoutatoms.hxx" +#include "diagram.hxx" namespace oox { namespace drawingml { diff --git a/oox/source/drawingml/drawingmltypes.cxx b/oox/source/drawingml/drawingmltypes.cxx index 915a3146dd3d..b0135bb331b9 100644 --- a/oox/source/drawingml/drawingmltypes.cxx +++ b/oox/source/drawingml/drawingmltypes.cxx @@ -160,6 +160,7 @@ float GetFontHeight( sal_Int32 nHeight ) sal_Int16 GetFontUnderline( sal_Int32 nToken ) { + OSL_ASSERT((nToken & sal_Int32(0xFFFF0000))==0); switch( nToken ) { case XML_none: return FontUnderline::NONE; @@ -186,6 +187,7 @@ sal_Int16 GetFontUnderline( sal_Int32 nToken ) sal_Int16 GetFontStrikeout( sal_Int32 nToken ) { + OSL_ASSERT((nToken & sal_Int32(0xFFFF0000))==0); switch( nToken ) { case XML_dblStrike: return FontStrikeout::DOUBLE; @@ -208,6 +210,7 @@ sal_Int16 GetCaseMap( sal_Int32 nToken ) /** converts a paragraph align to a ParaAdjust */ sal_Int16 GetParaAdjust( sal_Int32 nAlign ) { + OSL_ASSERT((nAlign & sal_Int32(0xFFFF0000))==0); sal_Int16 nEnum; switch( nAlign ) { @@ -236,6 +239,7 @@ sal_Int16 GetParaAdjust( sal_Int32 nAlign ) TabAlign GetTabAlign( sal_Int32 aToken ) { + OSL_ASSERT((aToken & sal_Int32(0xFFFF0000))==0); TabAlign nEnum; switch( aToken ) { diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx index 699f8a92ab65..04480d45ee87 100644 --- a/oox/source/drawingml/fillproperties.cxx +++ b/oox/source/drawingml/fillproperties.cxx @@ -63,6 +63,7 @@ namespace { BitmapMode lclGetBitmapMode( sal_Int32 nToken ) { + OSL_ASSERT((nToken & sal_Int32(0xFFFF0000))==0); switch( nToken ) { case XML_tile: return BitmapMode_REPEAT; @@ -73,6 +74,7 @@ BitmapMode lclGetBitmapMode( sal_Int32 nToken ) RectanglePoint lclGetRectanglePoint( sal_Int32 nToken ) { + OSL_ASSERT((nToken & sal_Int32(0xFFFF0000))==0); switch( nToken ) { case XML_tl: return RectanglePoint_LEFT_TOP; @@ -194,6 +196,7 @@ void FillProperties::pushToPropMap( ShapePropertyMap& rPropMap, if( moFillType.has() ) { FillStyle eFillStyle = FillStyle_NONE; + OSL_ASSERT((moFillType.get() & sal_Int32(0xFFFF0000))==0); switch( moFillType.get() ) { case XML_noFill: diff --git a/oox/source/drawingml/graphicshapecontext.cxx b/oox/source/drawingml/graphicshapecontext.cxx index 5df5c45de1c3..e181fb7f01ca 100644 --- a/oox/source/drawingml/graphicshapecontext.cxx +++ b/oox/source/drawingml/graphicshapecontext.cxx @@ -31,7 +31,7 @@ #include "oox/drawingml/fillpropertiesgroupcontext.hxx" #include "oox/drawingml/customshapeproperties.hxx" -#include "oox/drawingml/diagram/diagramfragmenthandler.hxx" +#include "oox/drawingml/diagram/diagram.hxx" #include "oox/drawingml/table/tablecontext.hxx" #include "oox/core/xmlfilterbase.hxx" #include "oox/helper/attributelist.hxx" @@ -85,7 +85,7 @@ Reference< XFastContextHandler > GraphicShapeContext::createFastChildContext( sa (mpShapePtr->getCustomShapeProperties()); sal_uInt32 nType = getBaseToken( aElementToken ); - OUString sType(GetShapeType(nType)); + OUString sType(GetShapePresetType(nType)); if (sType.getLength() > 0) pCstmShpProps->setShapePresetType(sType); @@ -221,48 +221,6 @@ DiagramGraphicDataContext::~DiagramGraphicDataContext() { } -DiagramPtr DiagramGraphicDataContext::loadDiagram() -{ - DiagramPtr pDiagram( new Diagram() ); - XmlFilterBase& rFilter = getFilter(); - - // data - OUString sDmPath = getFragmentPathFromRelId( msDm ); - if( sDmPath.getLength() > 0 ) - { - DiagramDataPtr pData( new DiagramData() ); - pDiagram->setData( pData ); - rFilter.importFragment( new DiagramDataFragmentHandler( rFilter, sDmPath, pData ) ); - } - // layout - OUString sLoPath = getFragmentPathFromRelId( msLo ); - if( sLoPath.getLength() > 0 ) - { - DiagramLayoutPtr pLayout( new DiagramLayout() ); - pDiagram->setLayout( pLayout ); - rFilter.importFragment( new DiagramLayoutFragmentHandler( rFilter, sLoPath, pLayout ) ); - } - // style - OUString sQsPath = getFragmentPathFromRelId( msQs ); - if( sQsPath.getLength() > 0 ) - { - DiagramQStylesPtr pStyles( new DiagramQStyles() ); - pDiagram->setQStyles( pStyles ); - rFilter.importFragment( new DiagramQStylesFragmentHandler( rFilter, sQsPath, pStyles ) ); - } - // colors - OUString sCsPath = getFragmentPathFromRelId( msCs ); - if( sCsPath.getLength() > 0 ) - { - DiagramColorsPtr pColors( new DiagramColors() ); - pDiagram->setColors( pColors ); - rFilter.importFragment( new DiagramColorsFragmentHandler( rFilter, sCsPath, pColors ) ) ; - } - - return pDiagram; -} - - Reference< XFastContextHandler > DiagramGraphicDataContext::createFastChildContext( ::sal_Int32 aElementToken, const Reference< XFastAttributeList >& xAttribs ) throw (SAXException, RuntimeException) { @@ -276,10 +234,19 @@ Reference< XFastContextHandler > DiagramGraphicDataContext::createFastChildConte msLo = xAttribs->getOptionalValue( R_TOKEN( lo ) ); msQs = xAttribs->getOptionalValue( R_TOKEN( qs ) ); msCs = xAttribs->getOptionalValue( R_TOKEN( cs ) ); - DiagramPtr pDiagram = loadDiagram(); - pDiagram->addTo( mpShapePtr ); - OSL_TRACE("diagram added shape %s of type %s", OUSTRING_TO_CSTR( mpShapePtr->getName() ), - OUSTRING_TO_CSTR( mpShapePtr->getServiceName() ) ); + loadDiagram(mpShapePtr, + getFilter(), + getFragmentPathFromRelId( msDm ), + getFragmentPathFromRelId( msLo ), + getFragmentPathFromRelId( msQs ), + getFragmentPathFromRelId( msCs )); + OSL_TRACE("diagram added shape %s of type %s, size (%d,%d,%d,%d)", + OUSTRING_TO_CSTR( mpShapePtr->getName() ), + OUSTRING_TO_CSTR( mpShapePtr->getServiceName() ), + mpShapePtr->getPosition().X, + mpShapePtr->getPosition().Y, + mpShapePtr->getSize().Width, + mpShapePtr->getSize().Height); break; } default: diff --git a/oox/source/drawingml/lineproperties.cxx b/oox/source/drawingml/lineproperties.cxx index 2fd4a37d292f..4bfdcad76433 100644 --- a/oox/source/drawingml/lineproperties.cxx +++ b/oox/source/drawingml/lineproperties.cxx @@ -141,6 +141,7 @@ void lclConvertCustomDash( LineDash& orLineDash, const LineProperties::DashStopV DashStyle lclGetDashStyle( sal_Int32 nToken ) { + OSL_ASSERT((nToken & sal_Int32(0xFFFF0000))==0); switch( nToken ) { case XML_rnd: return DashStyle_ROUNDRELATIVE; @@ -152,6 +153,7 @@ DashStyle lclGetDashStyle( sal_Int32 nToken ) LineJoint lclGetLineJoint( sal_Int32 nToken ) { + OSL_ASSERT((nToken & sal_Int32(0xFFFF0000))==0); switch( nToken ) { case XML_round: return LineJoint_ROUND; @@ -167,6 +169,7 @@ const sal_Int32 OOX_ARROWSIZE_LARGE = 2; sal_Int32 lclGetArrowSize( sal_Int32 nToken ) { + OSL_ASSERT((nToken & sal_Int32(0xFFFF0000))==0); switch( nToken ) { case XML_sm: return OOX_ARROWSIZE_SMALL; @@ -189,6 +192,7 @@ void lclPushMarkerProperties( ShapePropertyMap& rPropMap, sal_Int32 nMarkerWidth = 0; bool bMarkerCenter = false; sal_Int32 nArrowType = rArrowProps.moArrowType.get( XML_none ); + OSL_ASSERT((nArrowType & sal_Int32(0xFFFF0000))==0); switch( nArrowType ) { case XML_triangle: @@ -248,6 +252,7 @@ void lclPushMarkerProperties( ShapePropertyMap& rPropMap, #define OOX_ARROW_POINT( x, y ) Point( static_cast< sal_Int32 >( fArrowWidth * x ), static_cast< sal_Int32 >( fArrowLength * y ) ) ::std::vector< Point > aPoints; + OSL_ASSERT((rArrowProps.moArrowType.get() & sal_Int32(0xFFFF0000))==0); switch( rArrowProps.moArrowType.get() ) { case XML_triangle: diff --git a/oox/source/drawingml/scene3dcontext.cxx b/oox/source/drawingml/scene3dcontext.cxx new file mode 100644 index 000000000000..4f629d8466a1 --- /dev/null +++ b/oox/source/drawingml/scene3dcontext.cxx @@ -0,0 +1,189 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: fillpropertiesgroupcontext.cxx,v $ + * $Revision: 1.8.6.1 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "oox/drawingml/scene3dcontext.hxx" +#include +#include +#include +#include +#include "oox/drawingml/colorchoicecontext.hxx" +#include "oox/drawingml/drawingmltypes.hxx" +#include "oox/drawingml/fillproperties.hxx" +#include "oox/core/namespaces.hxx" +#include "oox/core/xmlfilterbase.hxx" +#include "oox/helper/attributelist.hxx" + +using ::rtl::OUString; +using ::oox::core::ContextHandler; +using ::oox::core::XmlFilterBase; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::xml::sax; + +namespace oox { namespace drawingml { + +Scene3DContext::Scene3DContext( ContextHandler& rParent, Shape3DProperties& r3DProperties ) throw() +: ContextHandler( rParent ) +, mr3DProperties( r3DProperties ) +{ +} + +Reference< XFastContextHandler > Scene3DContext::createFastChildContext( sal_Int32 aElementToken, const Reference< XFastAttributeList >& xAttribs ) + throw ( SAXException, RuntimeException ) +{ + AttributeList aAttribs( xAttribs ); + Reference< XFastContextHandler > xRet; + + switch( aElementToken ) + { + case NMSP_DRAWINGML|XML_camera: + mr3DProperties.mfFieldOfVision = aAttribs.getInteger( XML_fov, 0 ) / 36000000.0; + mr3DProperties.mfZoom = aAttribs.getInteger( XML_zoom, 100000 ) / 100000.0; + mr3DProperties.mnPreset = aAttribs.getToken( XML_prst, XML_none ); + +legacyObliqueTopLeft +legacyObliqueTop +legacyObliqueTopRight +legacyObliqueLeft +legacyObliqueFront +legacyObliqueRight +legacyObliqueBottomLeft +legacyObliqueBottom +legacyObliqueBottomRight +legacyPerspectiveTopLeft +legacyPerspectiveTop +legacyPerspectiveTopRight +legacyPerspectiveLeft +legacyPerspectiveFront +legacyPerspectiveRight +legacyPerspectiveBottomLeft +legacyPerspectiveBottom +legacyPerspectiveBottomRight +orthographicFront +isometricTopUp +isometricTopDown +isometricBottomUp +isometricBottomDown +isometricLeftUp +isometricLeftDown +isometricRightUp +isometricRightDown +isometricOffAxis1Left +isometricOffAxis1Right +isometricOffAxis1Top +isometricOffAxis2Left +isometricOffAxis2Right +isometricOffAxis2Top +isometricOffAxis3Left +isometricOffAxis3Right +isometricOffAxis3Bottom +isometricOffAxis4Left +isometricOffAxis4Right +isometricOffAxis4Bottom +obliqueTopLeft +obliqueTop +obliqueTopRight +obliqueLeft +obliqueRight +obliqueBottomLeft +obliqueBottom +obliqueBottomRight +perspectiveFront +perspectiveLeft +perspectiveRight +perspectiveAbove +perspectiveBelow +perspectiveAboveLeftFacing +perspectiveAboveRightFacing +perspectiveContrastingLeftFacing +perspectiveContrastingRightFacing +perspectiveHeroicLeftFacing +perspectiveHeroicRightFacing +perspectiveHeroicExtremeLeftFacing +perspectiveHeroicExtremeRightFacing +perspectiveRelaxed +perspectiveRelaxedModerately + + + // TODO: nested element XML_rot + break; + case NMSP_DRAWINGML|XML_lightRig: + mr3DProperties.mnLightRigDirection = aAttribs.getToken( XML_dir, XML_none ); + +XML_tl +XML_t +XML_tr +XML_l +XML_r +XML_bl +XML_b +XML_br + + + mr3DProperties.mnLightRigType = aAttribs.getToken( XML_rig, XML_none ); + +XML_legacyFlat1 +XML_legacyFlat2 +XML_legacyFlat3 +XML_legacyFlat4 +XML_legacyNormal1 +XML_legacyNormal2 +XML_legacyNormal3 +XML_legacyNormal4 +XML_legacyHarsh1 +XML_legacyHarsh2 +XML_legacyHarsh3 +XML_legacyHarsh4 +XML_threePt +XML_balanced +XML_soft +XML_harsh +XML_flood +XML_contrasting +XML_morning +XML_sunrise +XML_sunset +XML_chilly +XML_freezing +XML_flat +XML_twoPt +XML_glow +XML_brightRoom + + // TODO: nested element XML_rot + break; + case NMSP_DRAWINGML|XML_backdrop: + case NMSP_DRAWINGML|XML_extLst: + return xRet; // TODO: later (backdrop is not supported by core anyway) + } + return xRet; +} + +} } diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 2524e190a793..dd68c3c56109 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -47,8 +47,10 @@ #include // for the F_PI180 define #include #include +#include #include #include +#include #include #include #include @@ -94,6 +96,35 @@ Shape::Shape( const sal_Char* pServiceName ) setDefaults(); } +Shape::Shape( const ShapePtr& pSourceShape ) +: maChildren() +, mbIsChild( pSourceShape->mbIsChild ) +, mpTextBody(pSourceShape->mpTextBody) +, mpLinePropertiesPtr( pSourceShape->mpLinePropertiesPtr ) +, mpFillPropertiesPtr( pSourceShape->mpFillPropertiesPtr ) +, mpGraphicPropertiesPtr( pSourceShape->mpGraphicPropertiesPtr ) +, mpCustomShapePropertiesPtr( pSourceShape->mpCustomShapePropertiesPtr ) +, mpTablePropertiesPtr( pSourceShape->mpTablePropertiesPtr ) +, mp3DPropertiesPtr( pSourceShape->mp3DPropertiesPtr ) +, maShapeProperties( pSourceShape->maShapeProperties ) +, mpMasterTextListStyle( pSourceShape->mpMasterTextListStyle ) +, mxShape() +, msServiceName( pSourceShape->msServiceName ) +, msName( pSourceShape->msName ) +, msId( pSourceShape->msId ) +, mnSubType( pSourceShape->mnSubType ) +, mnSubTypeIndex( pSourceShape->mnSubTypeIndex ) +, maShapeStyleRefs( pSourceShape->maShapeStyleRefs ) +, maSize( pSourceShape->maSize ) +, maPosition( pSourceShape->maPosition ) +, meFrameType( pSourceShape->meFrameType ) +, mnRotation( pSourceShape->mnRotation ) +, mbFlipH( pSourceShape->mbFlipH ) +, mbFlipV( pSourceShape->mbFlipV ) +, mbHidden( pSourceShape->mbHidden ) +{} + + Shape::~Shape() { } @@ -220,6 +251,20 @@ void Shape::applyShapeReference( const Shape& rReferencedShape ) mbHidden = rReferencedShape.mbHidden; } +void Shape::addChildren( ::oox::core::XmlFilterBase& rFilterBase, + const Theme* pTheme, + const Reference< XShapes >& rxShapes, + basegfx::B2DHomMatrix& aTransformation, + const awt::Rectangle* pShapeRect, + ShapeIdMap* pShapeMap ) +{ + addChildren(rFilterBase, *this, pTheme, rxShapes, + pShapeRect ? + *pShapeRect : + awt::Rectangle( maPosition.X, maPosition.Y, maSize.Width, maSize.Height ), + pShapeMap, aTransformation); +} + // for group shapes, the following method is also adding each child void Shape::addChildren( XmlFilterBase& rFilterBase, @@ -593,7 +638,8 @@ void Shape::finalizeXShape( XmlFilterBase& rFilter, const Reference< XShapes >& Reference< drawing::XShapes > xExternalPage; if( !mxChartShapeInfo->mbEmbedShapes ) xExternalPage = rxShapes; - rFilter.getChartConverter().convertFromModel( rFilter, aModel, xChartDoc, xExternalPage, mxShape->getPosition(), mxShape->getSize() ); + if( rFilter.getChartConverter() ) + rFilter.getChartConverter()->convertFromModel( rFilter, aModel, xChartDoc, xExternalPage, mxShape->getPosition(), mxShape->getSize() ); } catch( Exception& ) { diff --git a/oox/source/drawingml/shape3dproperties.cxx b/oox/source/drawingml/shape3dproperties.cxx new file mode 100644 index 000000000000..69dfac919fc8 --- /dev/null +++ b/oox/source/drawingml/shape3dproperties.cxx @@ -0,0 +1,66 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: fillproperties.cxx,v $ + * $Revision: 1.7.6.1 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "oox/drawingml/shape3dproperties.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "oox/helper/propertymap.hxx" +#include "oox/helper/propertyset.hxx" + +using namespace ::com::sun::star; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::graphic; + +using ::rtl::OUString; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Exception; +using ::com::sun::star::uno::UNO_QUERY; +using ::com::sun::star::uno::UNO_QUERY_THROW; +using ::oox::core::XmlFilterBase; + +namespace oox { +namespace drawingml { + +// ============================================================================ + +// ============================================================================ + +} // namespace drawingml +} // namespace oox + diff --git a/oox/source/drawingml/shapepropertiescontext.cxx b/oox/source/drawingml/shapepropertiescontext.cxx index 2cc1874a29bb..a6687bc73078 100644 --- a/oox/source/drawingml/shapepropertiescontext.cxx +++ b/oox/source/drawingml/shapepropertiescontext.cxx @@ -34,6 +34,7 @@ #include #include +#include "oox/drawingml/scene3dcontext.hxx" #include "oox/drawingml/linepropertiescontext.hxx" #include "oox/drawingml/fillpropertiesgroupcontext.hxx" #include "oox/drawingml/transform2dcontext.hxx" @@ -106,6 +107,10 @@ Reference< XFastContextHandler > ShapePropertiesContext::createFastChildContext( // todo case A_TOKEN( scene3d ): // CT_Scene3D +// xRet.set( new Scene3DContext( *this, xAttribs, *(mrShape.get3DShapeProperties()) ) ); + break; + + // todo case A_TOKEN( sp3d ): // CT_Shape3D break; } diff --git a/oox/source/drawingml/textparagraph.cxx b/oox/source/drawingml/textparagraph.cxx index 54ae10ba1f80..1f198b7c711b 100644 --- a/oox/source/drawingml/textparagraph.cxx +++ b/oox/source/drawingml/textparagraph.cxx @@ -63,6 +63,9 @@ void TextParagraph::insertAt( Reference< XTextRange > xStart( xAt, UNO_QUERY ); sal_Int16 nLevel = maProperties.getLevel(); + + OSL_TRACE("TextParagraph::insertAt() - level %d", nLevel); + const TextParagraphPropertiesVector& rListStyle = rTextListStyle.getListStyle(); if ( nLevel >= static_cast< sal_Int16 >( rListStyle.size() ) ) nLevel = 0; @@ -118,6 +121,12 @@ void TextParagraph::insertAt( const OUString sNumberingLevel( CREATE_OUSTRING( "NumberingLevel" ) ); xProps->setPropertyValue( sNumberingLevel, Any( static_cast< sal_Int16 >( -1 ) ) ); } + else if ( nLevel > 1 ) + { + // Even more UGLY HACK + const OUString sNumberingLevel( CREATE_OUSTRING( "NumberingLevel" ) ); + xProps->setPropertyValue( sNumberingLevel, Any( static_cast< sal_Int16 >( nLevel-1 ) ) ); + } // FIXME this is causing a lot of dispruption (ie does not work). I wonder what to do -- Hub // Reference< XTextRange > xEnd( xAt, UNO_QUERY ); diff --git a/oox/source/drawingml/textparagraphproperties.cxx b/oox/source/drawingml/textparagraphproperties.cxx index e2130b394d60..f7168c1ce8f9 100644 --- a/oox/source/drawingml/textparagraphproperties.cxx +++ b/oox/source/drawingml/textparagraphproperties.cxx @@ -122,6 +122,7 @@ void BulletList::setSuffixMinusRight() void BulletList::setType( sal_Int32 nType ) { + OSL_ASSERT((nType & sal_Int32(0xFFFF0000))==0); // OSL_TRACE( "OOX: set list numbering type %d", nType); switch( nType ) { diff --git a/oox/source/helper/storagebase.cxx b/oox/source/helper/storagebase.cxx index 2201320fad1a..7e5b2d0f4966 100644 --- a/oox/source/helper/storagebase.cxx +++ b/oox/source/helper/storagebase.cxx @@ -49,17 +49,25 @@ using ::rtl::OUStringBuffer; namespace { -void lclSplitFirstElement( OUString& orElement, OUString& orRemainder, const OUString& rFullName ) +void lclSplitFirstElement( OUString& orElement, OUString& orRemainder, OUString aFullName ) { - sal_Int32 nSlashPos = rFullName.indexOf( '/' ); - if( (0 <= nSlashPos) && (nSlashPos < rFullName.getLength()) ) + sal_Int32 nSlashPos = aFullName.indexOf( '/' ); + + // strip leading slashes + while( nSlashPos == 0 ) + { + aFullName = aFullName.copy(1); + nSlashPos = aFullName.indexOf( '/' ); + } + + if( (0 <= nSlashPos) && (nSlashPos < aFullName.getLength()) ) { - orElement = rFullName.copy( 0, nSlashPos ); - orRemainder = rFullName.copy( nSlashPos + 1 ); + orElement = aFullName.copy( 0, nSlashPos ); + orRemainder = aFullName.copy( nSlashPos + 1 ); } else { - orElement = rFullName; + orElement = aFullName; } } diff --git a/oox/source/ppt/dgmimport.cxx b/oox/source/ppt/dgmimport.cxx new file mode 100644 index 000000000000..743dab07ed44 --- /dev/null +++ b/oox/source/ppt/dgmimport.cxx @@ -0,0 +1,140 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: pptimport.cxx,v $ + * $Revision: 1.8.6.1 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "oox/ppt/dgmimport.hxx" +#include "oox/drawingml/theme.hxx" +#include "oox/drawingml/diagram/diagram.hxx" +#include "oox/dump/pptxdumper.hxx" + +#include + +using ::rtl::OUString; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::xml::sax; +using namespace oox::core; + +namespace oox { namespace ppt { + +OUString SAL_CALL QuickDiagrammingImport_getImplementationName() throw() +{ + return CREATE_OUSTRING( "com.sun.star.comp.Impress.oox.QuickDiagrammingImport" ); +} + +uno::Sequence< OUString > SAL_CALL QuickDiagrammingImport_getSupportedServiceNames() throw() +{ + const OUString aServiceName = CREATE_OUSTRING( "com.sun.star.comp.ooxpptx.dgm.import" ); + const Sequence< OUString > aSeq( &aServiceName, 1 ); + return aSeq; +} + +uno::Reference< uno::XInterface > SAL_CALL QuickDiagrammingImport_createInstance( const Reference< XComponentContext >& rxContext ) throw( Exception ) +{ + return (cppu::OWeakObject*)new QuickDiagrammingImport( rxContext ); +} + +QuickDiagrammingImport::QuickDiagrammingImport( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext ) + : XmlFilterBase( rxContext ) +{} + +bool QuickDiagrammingImport::importDocument() throw() +{ + /* to activate the PPTX dumper, define the environment variable + OOO_PPTXDUMPER and insert the full path to the file + file:////source/dump/pptxdumper.ini. */ + OOX_DUMP_FILE( ::oox::dump::pptx::Dumper ); + + OUString aEmpty; + OUString aFragmentPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "diagramLayout" ) ); + + Reference xParentShape(getParentShape(), + UNO_QUERY_THROW); + oox::drawingml::ShapePtr pShape( + new oox::drawingml::Shape( "com.sun.star.drawing.DiagramShape" ) ); + drawingml::loadDiagram(pShape, + *this, + aEmpty, + aFragmentPath, + aEmpty, + aEmpty); + oox::drawingml::ThemePtr pTheme( + new oox::drawingml::Theme()); + basegfx::B2DHomMatrix aMatrix; + pShape->addShape( *this, + pTheme.get(), + xParentShape, + aMatrix ); + + return true; +} + +bool QuickDiagrammingImport::exportDocument() throw() +{ + return false; +} + +const ::oox::drawingml::Theme* QuickDiagrammingImport::getCurrentTheme() const +{ + // TODO + return 0; +} + +sal_Int32 QuickDiagrammingImport::getSchemeClr( sal_Int32 /*nColorSchemeToken*/ ) const +{ + // TODO + return 0; +} + +const oox::drawingml::table::TableStyleListPtr QuickDiagrammingImport::getTableStyles() +{ + return oox::drawingml::table::TableStyleListPtr(); +} + +oox::vml::Drawing* QuickDiagrammingImport::getVmlDrawing() +{ + return 0; +} + +oox::drawingml::chart::ChartConverter* QuickDiagrammingImport::getChartConverter() +{ + return 0; +} + +OUString QuickDiagrammingImport::implGetImplementationName() const +{ + return QuickDiagrammingImport_getImplementationName(); +} + +::oox::ole::VbaProject* QuickDiagrammingImport::implCreateVbaProject() const +{ + return 0; +} + +}} diff --git a/oox/source/ppt/dgmlayout.cxx b/oox/source/ppt/dgmlayout.cxx new file mode 100644 index 000000000000..34ddf636c8de --- /dev/null +++ b/oox/source/ppt/dgmlayout.cxx @@ -0,0 +1,198 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: pptimport.cxx,v $ + * $Revision: 1.8.6.1 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "oox/ppt/dgmlayout.hxx" +#include "oox/drawingml/theme.hxx" +#include "oox/drawingml/themefragmenthandler.hxx" +#include "oox/drawingml/diagram/diagram.hxx" +#include "oox/dump/pptxdumper.hxx" + +#include +#include +#include +#include +#include + +using ::rtl::OUString; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::xml::sax; +using namespace oox::core; +using namespace ::oox::drawingml; + +namespace oox { namespace ppt { + +OUString SAL_CALL QuickDiagrammingLayout_getImplementationName() throw() +{ + return CREATE_OUSTRING( "com.sun.star.comp.Impress.oox.QuickDiagrammingLayout" ); +} + +uno::Sequence< OUString > SAL_CALL QuickDiagrammingLayout_getSupportedServiceNames() throw() +{ + const OUString aServiceName = CREATE_OUSTRING( "com.sun.star.comp.ooxpptx.dgm.layout" ); + const Sequence< OUString > aSeq( &aServiceName, 1 ); + return aSeq; +} + +uno::Reference< uno::XInterface > SAL_CALL QuickDiagrammingLayout_createInstance( const Reference< XComponentContext >& rxContext ) throw( Exception ) +{ + return (cppu::OWeakObject*)new QuickDiagrammingLayout( rxContext ); +} + +QuickDiagrammingLayout::QuickDiagrammingLayout( const Reference< XComponentContext >& rxContext ) + : XmlFilterBase( rxContext ), + mpThemePtr(new drawingml::Theme()) +{} + +bool QuickDiagrammingLayout::importDocument() throw() +{ + Reference xParentShape(getParentShape(), + UNO_QUERY_THROW); + Reference xParentShapes(xParentShape, + UNO_QUERY_THROW); + Reference xPropSet(xParentShape, + UNO_QUERY_THROW); + + // can we grab the theme from the master page? + Reference xChild(xParentShape, + UNO_QUERY); + if( xChild.is() ) + { + // TODO: cater for diagram shapes inside groups + Reference xMasterPageTarget(xChild->getParent(), + UNO_QUERY); + if( xMasterPageTarget.is() ) + { + uno::Reference xMasterPage( + xMasterPageTarget->getMasterPage()); + + Reference xPropSet2(xMasterPage, + UNO_QUERY_THROW); + Reference xThemeFragment; + xPropSet2->getPropertyValue( + CREATE_OUSTRING("PPTTheme")) >>= xThemeFragment; + + importFragment( + new ThemeFragmentHandler( + *this, OUString(), *mpThemePtr ), + Reference( + xThemeFragment, + UNO_QUERY_THROW)); + } + } + + Reference xDataModelDom; + Reference xLayoutDom; + Reference xQStyleDom; + Reference xColorStyleDom; + + xPropSet->getPropertyValue( + CREATE_OUSTRING("DiagramData")) >>= xDataModelDom; + xPropSet->getPropertyValue( + CREATE_OUSTRING("DiagramLayout")) >>= xLayoutDom; + xPropSet->getPropertyValue( + CREATE_OUSTRING("DiagramQStyle")) >>= xQStyleDom; + xPropSet->getPropertyValue( + CREATE_OUSTRING("DiagramColorStyle")) >>= xColorStyleDom; + + oox::drawingml::ShapePtr pShape( + new oox::drawingml::Shape( "com.sun.star.drawing.DiagramShape" ) ); + drawingml::loadDiagram(pShape, + *this, + xDataModelDom, + xLayoutDom, + xQStyleDom, + xColorStyleDom); + + // don't add pShape itself, but only its children + pShape->setXShape(getParentShape()); + + const awt::Size& rSize=xParentShape->getSize(); + const awt::Point& rPoint=xParentShape->getPosition(); + const long nScaleFactor=360; + const awt::Rectangle aRect(nScaleFactor*rPoint.X, + nScaleFactor*rPoint.Y, + nScaleFactor*rSize.Width, + nScaleFactor*rSize.Height); + basegfx::B2DHomMatrix aMatrix; + pShape->addChildren( *this, + mpThemePtr.get(), + xParentShapes, + aMatrix, + &aRect ); + + return true; +} + +bool QuickDiagrammingLayout::exportDocument() throw() +{ + return false; +} + +const ::oox::drawingml::Theme* QuickDiagrammingLayout::getCurrentTheme() const +{ + return mpThemePtr.get(); +} + +sal_Int32 QuickDiagrammingLayout::getSchemeClr( sal_Int32 nColorSchemeToken ) const +{ + sal_Int32 nColor = 0; + if( mpThemePtr ) + mpThemePtr->getClrScheme().getColor( nColorSchemeToken, + nColor ); + return nColor; +} + +const oox::drawingml::table::TableStyleListPtr QuickDiagrammingLayout::getTableStyles() +{ + return oox::drawingml::table::TableStyleListPtr(); +} + +::oox::vml::Drawing* QuickDiagrammingLayout::getVmlDrawing() +{ + return 0; +} + +::oox::drawingml::chart::ChartConverter* QuickDiagrammingLayout::getChartConverter() +{ + return 0; +} + +OUString QuickDiagrammingLayout::implGetImplementationName() const +{ + return QuickDiagrammingLayout_getImplementationName(); +} + +::oox::ole::VbaProject* QuickDiagrammingLayout::implCreateVbaProject() const +{ + return 0; +} + +}} diff --git a/oox/source/ppt/pptimport.cxx b/oox/source/ppt/pptimport.cxx index 2672170d2131..fd2e36dc2cd3 100644 --- a/oox/source/ppt/pptimport.cxx +++ b/oox/source/ppt/pptimport.cxx @@ -183,9 +183,9 @@ const oox::drawingml::table::TableStyleListPtr PowerPointImport::getTableStyles( return mpTableStyleList;; } -::oox::drawingml::chart::ChartConverter& PowerPointImport::getChartConverter() +::oox::drawingml::chart::ChartConverter* PowerPointImport::getChartConverter() { - return *mxChartConv; + return mxChartConv.get(); } namespace { diff --git a/oox/source/ppt/presentationfragmenthandler.cxx b/oox/source/ppt/presentationfragmenthandler.cxx index e9fe6994472e..63d5f76e2219 100644 --- a/oox/source/ppt/presentationfragmenthandler.cxx +++ b/oox/source/ppt/presentationfragmenthandler.cxx @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include #include #include @@ -225,8 +227,17 @@ void PresentationFragmentHandler::finalizeImport() { oox::drawingml::ThemePtr pThemePtr( new oox::drawingml::Theme() ); pMasterPersistPtr->setTheme( pThemePtr ); - rFilter.importFragment( new ThemeFragmentHandler( rFilter, aThemeFragmentPath, *pThemePtr ) ); + Reference xDoc= + rFilter.importFragment(aThemeFragmentPath); + + rFilter.importFragment( + new ThemeFragmentHandler( + rFilter, aThemeFragmentPath, *pThemePtr ), + Reference( + xDoc, + UNO_QUERY_THROW)); rThemes[ aThemeFragmentPath ] = pThemePtr; + pThemePtr->setFragment(xDoc); } else { diff --git a/oox/source/shape/ShapeFilterBase.cxx b/oox/source/shape/ShapeFilterBase.cxx index f67be3d0de23..ac010d436188 100644 --- a/oox/source/shape/ShapeFilterBase.cxx +++ b/oox/source/shape/ShapeFilterBase.cxx @@ -60,9 +60,9 @@ const ::oox::drawingml::table::TableStyleListPtr ShapeFilterBase::getTableStyles return ::oox::drawingml::table::TableStyleListPtr(); } -::oox::drawingml::chart::ChartConverter& ShapeFilterBase::getChartConverter() +::oox::drawingml::chart::ChartConverter* ShapeFilterBase::getChartConverter() { - return *mxChartConv; + return mxChartConv.get(); } ::oox::ole::VbaProject* ShapeFilterBase::implCreateVbaProject() const diff --git a/oox/source/shape/ShapeFilterBase.hxx b/oox/source/shape/ShapeFilterBase.hxx index e49e98913ff3..360e81014ec1 100644 --- a/oox/source/shape/ShapeFilterBase.hxx +++ b/oox/source/shape/ShapeFilterBase.hxx @@ -60,7 +60,7 @@ public: /** Has to be implemented by each filter to return TableStyles. */ virtual const ::oox::drawingml::table::TableStyleListPtr getTableStyles(); - virtual ::oox::drawingml::chart::ChartConverter& getChartConverter(); + virtual ::oox::drawingml::chart::ChartConverter* getChartConverter(); virtual bool importDocument() { return true; } virtual bool exportDocument() { return true; } diff --git a/oox/source/xls/excelfilter.cxx b/oox/source/xls/excelfilter.cxx index 9dd3c9f979fc..bbf6ce64c99a 100644 --- a/oox/source/xls/excelfilter.cxx +++ b/oox/source/xls/excelfilter.cxx @@ -158,7 +158,7 @@ const TableStyleListPtr ExcelFilter::getTableStyles() return TableStyleListPtr(); } -::oox::drawingml::chart::ChartConverter& ExcelFilter::getChartConverter() +::oox::drawingml::chart::ChartConverter* ExcelFilter::getChartConverter() { return WorkbookHelper( getWorkbookGlobals() ).getChartConverter(); } diff --git a/oox/source/xls/workbookhelper.cxx b/oox/source/xls/workbookhelper.cxx index d5936d68e57f..3c45aeb50437 100644 --- a/oox/source/xls/workbookhelper.cxx +++ b/oox/source/xls/workbookhelper.cxx @@ -185,7 +185,7 @@ public: /** Returns the converter for string to cell address/range conversion. */ inline AddressConverter& getAddressConverter() const { return *mxAddrConverter; } /** Returns the chart object converter. */ - inline ExcelChartConverter& getChartConverter() const { return *mxChartConverter; } + inline ExcelChartConverter* getChartConverter() const { return mxChartConverter.get(); } /** Returns the page/print settings converter. */ inline PageSettingsConverter& getPageSettingsConverter() const { return *mxPageSettConverter; } @@ -872,7 +872,7 @@ AddressConverter& WorkbookHelper::getAddressConverter() const return mrBookGlob.getAddressConverter(); } -ExcelChartConverter& WorkbookHelper::getChartConverter() const +ExcelChartConverter* WorkbookHelper::getChartConverter() const { return mrBookGlob.getChartConverter(); } -- cgit