diff options
51 files changed, 1881 insertions, 980 deletions
diff --git a/oox/inc/oox/core/filterbase.hxx b/oox/inc/oox/core/filterbase.hxx index 83074c2a2856..ea7627393be5 100644 --- a/oox/inc/oox/core/filterbase.hxx +++ b/oox/inc/oox/core/filterbase.hxx @@ -50,6 +50,7 @@ namespace com { namespace sun { namespace star { namespace task { class XStatusIndicator; } namespace task { class XInteractionHandler; } namespace frame { class XFrame; } + namespace drawing { class XShape; } namespace io { class XInputStream; } namespace io { class XOutputStream; } namespace io { class XStream; } @@ -133,6 +134,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 4cfccca02d70..a6e260fcddee 100644 --- a/oox/inc/oox/core/xmlfilterbase.hxx +++ b/oox/inc/oox/core/xmlfilterbase.hxx @@ -42,8 +42,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 { namespace drawingml { class Theme; } } @@ -89,7 +91,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; @@ -107,6 +109,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 c937c6e94900..99a3df20d6eb 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 282e0c6009b5..d852311dbaf0 100644 --- a/oox/inc/oox/drawingml/customshapeproperties.hxx +++ b/oox/inc/oox/drawingml/customshapeproperties.hxx @@ -124,6 +124,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 a09f7b100e2e..000000000000 --- a/oox/inc/oox/drawingml/diagram/datamodelcontext.hxx +++ /dev/null @@ -1,54 +0,0 @@ -/************************************************************************* - * - * 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 - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#ifndef OOX_DRAWINGML_SHAPECONTEXT_HXX -#define OOX_DRAWINGML_SHAPECONTEXT_HXX - -#include <com/sun/star/drawing/XShapes.hpp> - -#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 diff --git a/oox/inc/oox/drawingml/diagram/diagram.hxx b/oox/inc/oox/drawingml/diagram/diagram.hxx index f9c74246e558..540f65e86159 100644 --- a/oox/inc/oox/drawingml/diagram/diagram.hxx +++ b/oox/inc/oox/drawingml/diagram/diagram.hxx @@ -25,232 +25,40 @@ * ************************************************************************/ - - #ifndef OOX_DRAWINGML_DIAGRAM_HXX #define OOX_DRAWINGML_DIAGRAM_HXX -#include <vector> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> +#include <rtl/ustring.hxx> #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 <com/sun/star/xml/dom/XDocument.hpp> - 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 f9fd32dc71d6..000000000000 --- a/oox/inc/oox/drawingml/diagram/diagramfragmenthandler.hxx +++ /dev/null @@ -1,100 +0,0 @@ -/************************************************************************* - * - * 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 - * <http://www.openoffice.org/license.html> - * 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 diff --git a/oox/inc/oox/drawingml/diagram/diagramlayoutatoms.hxx b/oox/inc/oox/drawingml/diagram/diagramlayoutatoms.hxx deleted file mode 100644 index 7df2deddfa83..000000000000 --- a/oox/inc/oox/drawingml/diagram/diagramlayoutatoms.hxx +++ /dev/null @@ -1,209 +0,0 @@ -/************************************************************************* - * - * 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 - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - - - - -#ifndef OOX_DRAWINGML_DIAGRAMLAYOUTATOMS_HXX -#define OOX_DRAWINGML_DIAGRAMLAYOUTATOMS_HXX - -#include <map> -#include <string> - -#include <boost/shared_ptr.hpp> -#include <boost/array.hpp> - -#include <com/sun/star/uno/Any.hxx> -#include <com/sun/star/xml/sax/XFastAttributeList.hpp> - -#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 diff --git a/oox/inc/oox/drawingml/drawingmltypes.hxx b/oox/inc/oox/drawingml/drawingmltypes.hxx index f8bb4c91b5d5..4cb2d297b4fb 100644 --- a/oox/inc/oox/drawingml/drawingmltypes.hxx +++ b/oox/inc/oox/drawingml/drawingmltypes.hxx @@ -58,6 +58,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 d515a4553936..4944da39d137 100644 --- a/oox/inc/oox/drawingml/graphicshapecontext.hxx +++ b/oox/inc/oox/drawingml/graphicshapecontext.hxx @@ -30,7 +30,6 @@ #include "oox/drawingml/shape.hxx" #include "oox/drawingml/shapecontext.hxx" -#include "oox/drawingml/diagram/diagram.hxx" namespace oox { namespace vml { struct OleObjectInfo; } } @@ -73,6 +72,8 @@ private: // ==================================================================== +class Diagram; + class DiagramGraphicDataContext : public ShapeContext { @@ -82,8 +83,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/shape.hxx b/oox/inc/oox/drawingml/shape.hxx index d326d2373848..cc38eb475b81 100644 --- a/oox/inc/oox/drawingml/shape.hxx +++ b/oox/inc/oox/drawingml/shape.hxx @@ -32,6 +32,7 @@ #include "oox/drawingml/drawingmltypes.hxx" #include "oox/drawingml/customshapeproperties.hxx" #include "oox/drawingml/textliststyle.hxx" +#include "oox/drawingml/shape3dproperties.hxx" #include <com/sun/star/frame/XModel.hpp> #include <com/sun/star/drawing/XDrawPage.hpp> @@ -95,7 +96,8 @@ class Shape { public: - Shape( const sal_Char* pServiceType = NULL ); + explicit Shape( const sal_Char* pServiceType = NULL ); + explicit Shape( const ShapePtr& pSourceShape ); virtual ~Shape(); rtl::OUString& getServiceName(){ return msServiceName; } @@ -114,13 +116,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 ); } @@ -158,6 +167,13 @@ public: const ::com::sun::star::awt::Rectangle* pShapeRect = 0, ShapeIdMap* pShapeMap = 0 ); + void addChildren( + const ::oox::core::XmlFilterBase& rFilterBase, + const Theme* pTheme, + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + 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 > & @@ -197,6 +213,7 @@ protected: GraphicPropertiesPtr mpGraphicPropertiesPtr; CustomShapePropertiesPtr mpCustomShapePropertiesPtr; table::TablePropertiesPtr mpTablePropertiesPtr; + Shape3DPropertiesPtr mp3DPropertiesPtr; PropertyMap maShapeProperties; PropertyMap maDefaultShapeProperties; TextListStylePtr mpMasterTextListStyle; @@ -221,7 +238,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/theme.hxx b/oox/inc/oox/drawingml/theme.hxx index 15f5ce82ce12..64fe27738522 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 <com/sun/star/xml/dom/XDocument.hpp> 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/pptimport.hxx b/oox/inc/oox/ppt/pptimport.hxx index 8b38b9b3088e..f38978c9f4c9 100644 --- a/oox/inc/oox/ppt/pptimport.hxx +++ b/oox/inc/oox/ppt/pptimport.hxx @@ -56,7 +56,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 b73ee415641e..dfaf7a12525c 100644 --- a/oox/inc/oox/xls/excelfilter.hxx +++ b/oox/inc/oox/xls/excelfilter.hxx @@ -68,7 +68,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 0ff8c0f9d3e5..875b0034acaa 100644 --- a/oox/inc/oox/xls/workbookhelper.hxx +++ b/oox/inc/oox/xls/workbookhelper.hxx @@ -253,7 +253,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/facreg.cxx b/oox/source/core/facreg.cxx index 590cdd876e93..95c041bca5ce 100644 --- a/oox/source/core/facreg.cxx +++ b/oox/source/core/facreg.cxx @@ -58,6 +58,8 @@ extern uno::Reference< uno::XInterface > SAL_CALL className##_createInstance( namespace oox { namespace core { SERVICE( FilterDetect ); } namespace ppt { SERVICE( PowerPointImport ); } + namespace ppt { SERVICE( QuickDiagrammingImport ); } + namespace ppt { SERVICE( QuickDiagrammingLayout ); } namespace xls { SERVICE( BiffDetector ); } namespace xls { SERVICE( ExcelFilter ); } namespace xls { SERVICE( ExcelBiffFilter ); } @@ -101,6 +103,8 @@ OOX_DLLPUBLIC sal_Bool SAL_CALL component_writeInfo( void * , void * pRegistryKe WRITEINFO( ::oox::core::FilterDetect ); WRITEINFO( ::oox::ppt::PowerPointImport ); + WRITEINFO( ::oox::ppt::QuickDiagrammingImport ); + WRITEINFO( ::oox::ppt::QuickDiagrammingLayout ); WRITEINFO( ::oox::xls::BiffDetector ); WRITEINFO( ::oox::xls::ExcelFilter ); WRITEINFO( ::oox::xls::ExcelBiffFilter ); @@ -149,6 +153,8 @@ OOX_DLLPUBLIC void * SAL_CALL component_getFactory( const sal_Char * pImplName, SINGLEFACTORY( ::oox::core::FilterDetect ) else SINGLEFACTORY( oox::ppt::PowerPointImport ) + else SINGLEFACTORY( oox::ppt::QuickDiagrammingImport ) + else SINGLEFACTORY( oox::ppt::QuickDiagrammingLayout ) else SINGLEFACTORY( ::oox::xls::BiffDetector ) else SINGLEFACTORY( ::oox::xls::ExcelFilter ) else SINGLEFACTORY( ::oox::xls::ExcelBiffFilter ) diff --git a/oox/source/core/filterbase.cxx b/oox/source/core/filterbase.cxx index 502f17faa0fc..8cadd60d8ca0 100644 --- a/oox/source/core/filterbase.cxx +++ b/oox/source/core/filterbase.cxx @@ -32,6 +32,7 @@ #include <com/sun/star/frame/XModel.hpp> #include <com/sun/star/task/XStatusIndicator.hpp> #include <com/sun/star/task/XInteractionHandler.hpp> +#include <com/sun/star/drawing/XShape.hpp> #include <osl/mutex.hxx> #include <rtl/instance.hxx> #include <rtl/uri.hxx> @@ -63,6 +64,7 @@ using ::com::sun::star::io::XInputStream; using ::com::sun::star::io::XOutputStream; using ::com::sun::star::io::XStream; using ::com::sun::star::task::XStatusIndicator; +using ::com::sun::star::drawing::XShape; using ::com::sun::star::task::XInteractionHandler; using ::com::sun::star::graphic::XGraphic; using ::com::sun::star::container::XNameAccess; @@ -163,6 +165,7 @@ struct FilterBaseImpl Reference< XStream > mxOutStream; Reference< XStatusIndicator > mxStatusIndicator; Reference< XInteractionHandler > mxInteractionHandler; + Reference< XShape > mxParentShape; explicit FilterBaseImpl( const Reference< XMultiServiceFactory >& rxGlobalFactory ); @@ -274,6 +277,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; @@ -568,6 +576,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/xmlfilterbase.cxx b/oox/source/core/xmlfilterbase.cxx index 37e26f415ca4..673acfe6b543 100644 --- a/oox/source/core/xmlfilterbase.cxx +++ b/oox/source/core/xmlfilterbase.cxx @@ -32,10 +32,14 @@ #include <rtl/strbuf.hxx> #include <rtl/ustrbuf.hxx> +#include <rtl/instance.hxx> #include <com/sun/star/container/XNameContainer.hpp> #include <com/sun/star/embed/XRelationshipAccess.hpp> +#include <com/sun/star/xml/dom/XDocument.hpp> +#include <com/sun/star/xml/dom/XDocumentBuilder.hpp> #include <com/sun/star/xml/sax/InputSource.hpp> #include <com/sun/star/xml/sax/XFastParser.hpp> +#include <com/sun/star/xml/sax/XFastSAXSerializable.hpp> #include <com/sun/star/document/XDocumentProperties.hpp> #include <comphelper/mediadescriptor.hxx> #include <sax/fshelper.hxx> @@ -55,6 +59,7 @@ using ::rtl::OStringBuffer; using ::rtl::OUString; using ::rtl::OUStringBuffer; using ::com::sun::star::beans::StringPair; +using ::com::sun::star::beans::Pair; using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::Sequence; using ::com::sun::star::uno::Exception; @@ -75,11 +80,14 @@ using ::com::sun::star::xml::sax::XFastTokenHandler; using ::com::sun::star::xml::sax::XFastDocumentHandler; using ::com::sun::star::xml::sax::InputSource; using ::com::sun::star::xml::sax::SAXException; +using ::com::sun::star::xml::dom::XDocument; +using ::com::sun::star::xml::dom::XDocumentBuilder; using ::com::sun::star::document::XDocumentProperties; using ::com::sun::star::util::DateTime; using ::comphelper::MediaDescriptor; using ::sax_fastparser::FastSerializerHelper; using ::sax_fastparser::FSHelperPtr; +using namespace ::com::sun::star; #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> @@ -119,6 +127,8 @@ struct XmlFilterBaseImpl typedef RefMap< OUString, Relations > RelationsMap; Reference< XFastParser > mxFastParser; + Reference< XFastTokenHandler > + mxTokenHandler; OUString maBinSuffix; OUString maVmlSuffix; RelationsMap maRelationsMap; @@ -152,6 +162,66 @@ static Reference< XComponentContext > lcl_getComponentContext(Reference< XMultiS // ============================================================================ +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_PACKAGE_RELATIONSHIPS, + NMSP_RELATIONSHIPS, + NMSP_DRAWINGML, + NMSP_DIAGRAM, + NMSP_CHART, + NMSP_CDR, + NMSP_VML, + NMSP_OFFICE, + NMSP_VML_DOC, + NMSP_VML_XLS, + NMSP_VML_PPT, + NMSP_AX, + NMSP_XLS, + NMSP_XDR, + NMSP_XM, + NMSP_PPT + }; + + Sequence< Pair< OUString, sal_Int32 > > aRet(STATIC_ARRAY_SIZE(namespaceIds)); + for( sal_Int32 i=0; i<aRet.getLength(); ++i ) + aRet[i] = beans::make_Pair( + ::rtl::OUString::createFromAscii(namespaceURIs[i]), + namespaceIds[i]); + return aRet; + } + }; +} + +// ============================================================================ + XmlFilterBase::XmlFilterBase( const Reference< XMultiServiceFactory >& rxGlobalFactory ) : FilterBase( rxGlobalFactory ), mxImpl( new XmlFilterBaseImpl ), @@ -160,32 +230,18 @@ XmlFilterBase::XmlFilterBase( const Reference< XMultiServiceFactory >& rxGlobalF { try { + // create the fast tokenhandler + mxImpl->mxTokenHandler.set( new FastTokenHandler ); + // create the fast parser mxImpl->mxFastParser.set( rxGlobalFactory->createInstance( CREATE_OUSTRING( "com.sun.star.xml.sax.FastParser" ) ), UNO_QUERY_THROW ); - mxImpl->mxFastParser->setTokenHandler( new FastTokenHandler ); + mxImpl->mxFastParser->setTokenHandler( mxImpl->mxTokenHandler ); // register XML namespaces - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "http://www.w3.org/XML/1998/namespace" ), NMSP_XML ); - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/package/2006/relationships" ), NMSP_PACKAGE_RELATIONSHIPS ); - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/officeDocument/2006/relationships" ), NMSP_RELATIONSHIPS ); - - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/drawingml/2006/main" ), NMSP_DRAWINGML ); - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/drawingml/2006/diagram" ), NMSP_DIAGRAM ); - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/drawingml/2006/chart" ), NMSP_CHART ); - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/drawingml/2006/chartDrawing" ), NMSP_CDR ); - - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "urn:schemas-microsoft-com:vml" ), NMSP_VML ); - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "urn:schemas-microsoft-com:office:office" ), NMSP_OFFICE ); - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "urn:schemas-microsoft-com:office:word" ), NMSP_VML_DOC ); - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "urn:schemas-microsoft-com:office:excel" ), NMSP_VML_XLS ); - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "urn:schemas-microsoft-com:office:powerpoint" ), NMSP_VML_PPT ); - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "http://schemas.microsoft.com/office/2006/activeX" ), NMSP_AX ); - - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/spreadsheetml/2006/main"), NMSP_XLS ); - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" ), NMSP_XDR ); - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "http://schemas.microsoft.com/office/excel/2006/main" ), NMSP_XM ); - - mxImpl->mxFastParser->registerNamespace( CREATE_OUSTRING( "http://schemas.openxmlformats.org/presentationml/2006/main"), NMSP_PPT ); + const Sequence< Pair< OUString, sal_Int32 > > ids= + NamespaceIds::get(); + for( sal_Int32 i=0; i<ids.getLength(); ++i ) + mxImpl->mxFastParser->registerNamespace( ids[i].First, ids[i].Second ); } catch( Exception& ) { @@ -298,6 +354,66 @@ bool XmlFilterBase::importFragment( const ::rtl::Reference< FragmentHandler >& r return false; } +Reference<XDocument> XmlFilterBase::importFragment( const ::rtl::OUString& aFragmentPath ) +{ + Reference<XDocument> 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<XDocumentBuilder> xDomBuilder( + getGlobalFactory()->createInstance( + CREATE_OUSTRING( "com.sun.star.xml.dom.DocumentBuilder" ) ), + 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< xml::sax::XFastSAXSerializable >& rxSerializer ) +{ + Reference< XFastDocumentHandler > xDocHandler( rxHandler.get() ); + if( !xDocHandler.is() ) + return false; + + // try to import XML stream + try + { + rxSerializer->fastSerialize( xDocHandler, + mxImpl->mxTokenHandler, + uno::Sequence< beans::StringPair >(), + NamespaceIds::get() ); + return true; + } + catch( Exception& ) + {} + + return false; +} + RelationsRef XmlFilterBase::importRelations( const OUString& rFragmentPath ) { // try to find cached relations @@ -565,6 +681,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 33b823f676ae..94c92388b8d7 100644 --- a/oox/source/drawingml/chart/chartspaceconverter.cxx +++ b/oox/source/drawingml/chart/chartspaceconverter.cxx @@ -71,9 +71,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 52bd978cd3b8..7fce093822fe 100644 --- a/oox/source/drawingml/chart/converterbase.cxx +++ b/oox/source/drawingml/chart/converterbase.cxx @@ -262,9 +262,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 4c76b27b982e..1671c6caceb2 100644 --- a/oox/source/drawingml/chart/datasourceconverter.cxx +++ b/oox/source/drawingml/chart/datasourceconverter.cxx @@ -54,12 +54,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 b7e558266372..4aea4fe6e2ba 100644 --- a/oox/source/drawingml/clrscheme.cxx +++ b/oox/source/drawingml/clrscheme.cxx @@ -26,6 +26,7 @@ * ************************************************************************/ +#include <osl/diagnose.h> #include "oox/drawingml/clrscheme.hxx" #include "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 70f4d54e99ca..566b83daa467 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 d1e86de16e9b..dacb7f17b298 100644 --- a/oox/source/drawingml/customshapegeometry.cxx +++ b/oox/source/drawingml/customshapegeometry.cxx @@ -1172,8 +1172,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 ) { @@ -1801,6 +1802,7 @@ OUString GetShapeType( sal_Int32 nType ) static OUString GetTextShapeType( sal_Int32 nType ) { + OSL_ASSERT((nType & sal_Int32(0xFFFF0000))==0); OUString sType; switch( nType ) { @@ -2031,7 +2033,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/datamodelcontext.cxx b/oox/source/drawingml/diagram/datamodelcontext.cxx index d7c88b69af89..26da02281c8a 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/core/namespaces.hxx" #include "oox/drawingml/fillpropertiesgroupcontext.hxx" @@ -42,40 +42,46 @@ 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 ) + , mrConnections( 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 NMSP_DIAGRAM|XML_extLst: + case NMSP_DIAGRAM|XML_cxn: + { + mrConnections.push_back( dgm::Connection() ); + dgm::Connection& rConnection=mrConnections.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; } @@ -83,37 +89,136 @@ public: xRet.set( this ); return xRet; } + private: - dgm::ConnectionPtr mpConnection; + dgm::Connections& mrConnections; }; -// 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 NMSP_DIAGRAM|XML_animLvl: + case NMSP_DIAGRAM|XML_animOne: + break; + case NMSP_DIAGRAM|XML_bulletEnabled: + mrPoint.mbBulletEnabled = aAttribs.getBool( XML_val, false ); + break; + case NMSP_DIAGRAM|XML_chMax: + mrPoint.mnMaxChildren = aAttribs.getInteger( XML_val, -1 ); + break; + case NMSP_DIAGRAM|XML_chPref: + mrPoint.mnPreferredChildren = aAttribs.getInteger( XML_val, -1 ); + break; + case NMSP_DIAGRAM|XML_dir: + mrPoint.mnDirection = aAttribs.getToken( XML_val, XML_norm ); + break; + case NMSP_DIAGRAM|XML_hierBranch: + mrPoint.mnHierarchyBranch = aAttribs.getToken( XML_val, XML_std ); + break; + case NMSP_DIAGRAM|XML_orgChart: + mrPoint.mbOrgChartEnabled = aAttribs.getBool( XML_val, false ); + break; + case NMSP_DIAGRAM|XML_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 NMSP_DIAGRAM|XML_cxn: + case NMSP_DIAGRAM|XML_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 NMSP_DIAGRAM|XML_style: + { + // TODO + // skip CT_shapeStyle + return xRet; + } default: break; } @@ -123,11 +228,10 @@ public: } private: - dgm::Connections & maConnections; + dgm::Point& mrPoint; }; - // CL_Pt class PtContext : public ContextHandler @@ -135,27 +239,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; @@ -165,18 +267,22 @@ public: case NMSP_DIAGRAM|XML_extLst: return xRet; case NMSP_DIAGRAM|XML_prSet: - // TODO - // CT_ElemPropSet + OSL_TRACE( "diagram property set for point"); + xRet = new PropertiesContext( *this, mrPoint, xAttribs ); break; case NMSP_DIAGRAM|XML_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 NMSP_DIAGRAM|XML_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; } @@ -189,7 +295,7 @@ public: } private: - dgm::PointPtr mpPoint; + dgm::Point& mrPoint; }; @@ -199,11 +305,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 ) @@ -216,9 +321,8 @@ public: case NMSP_DIAGRAM|XML_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: @@ -230,7 +334,7 @@ public: } private: - dgm::Points & maPoints; + dgm::Points& mrPoints; }; // CT_BackgroundFormatting diff --git a/oox/source/drawingml/diagram/diagram.cxx b/oox/source/drawingml/diagram/diagram.cxx index 2e507d87752b..8a78ddc8d020 100644 --- a/oox/source/drawingml/diagram/diagram.cxx +++ b/oox/source/drawingml/diagram/diagram.cxx @@ -32,10 +32,22 @@ #include <com/sun/star/awt/Point.hpp> #include <com/sun/star/awt/Size.hpp> +#include <com/sun/star/xml/dom/XDocument.hpp> +#include <com/sun/star/xml/sax/XFastSAXSerializable.hpp> +#include <rtl/ustrbuf.hxx> +#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 "oox/core/namespaces.hxx" #include "tokens.hxx" +#include "diagram.hxx" +#include "diagramlayoutatoms.hxx" +#include "diagramfragmenthandler.hxx" + +#include <iostream> +#include <fstream> using rtl::OUString; using namespace ::com::sun::star; @@ -47,58 +59,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; + OUSTRING_TO_CSTR( msModelId ), + mnType ); } -PointsTreePtr PointsTree::getParent() const -{ - if( !mpParent.expired() ) - { - return mpParent.lock() ; - } - return PointsTreePtr(); -} - - } // dgm namespace DiagramData::DiagramData() @@ -116,18 +96,10 @@ 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*/ ) { + // TODO +#if 0 setPosition( pTree->getPoint(), pt ); awt::Point nextPt = pt; nextPt.Y += 50; @@ -137,6 +109,7 @@ void DiagramLayout::layout( const dgm::PointsTreePtr & pTree, const awt::Point & layout( *iter, nextPt ); nextPt.X += 50; } +#endif } void Diagram::setData( const DiagramDataPtr & pData) @@ -150,19 +123,244 @@ 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) + return rtl::OUStringToOString(aBuf.makeStringAndClear(), + RTL_TEXTENCODING_UTF8); +} +#endif + +static sal_Int32 calcDepth( const rtl::OUString& rNodeName, + const dgm::Connections& rCnx ) { - mpColors = pColors; + // 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 ) + { + if( aCurrCxn->msParTransId.getLength() && + aCurrCxn->msSibTransId.getLength() && + aCurrCxn->msSourceId.getLength() && + aCurrCxn->msDestId.getLength() && + aCurrCxn->mnType != XML_presOf && + aCurrCxn->mnType != XML_presParOf && + rNodeName == aCurrCxn->msDestId ) + { + return calcDepth(aCurrCxn->msSourceId, + rCnx) + 1; + } + ++aCurrCxn; + } + + 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::Points::iterator aCurrPoint( getData()->getPoints( ).begin() ); + const dgm::Points::iterator aEndPoint( getData()->getPoints( ).end() ); + while( aCurrPoint != aEndPoint ) + { +#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 ) + { + 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; + } + + 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() ) + { + 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; + } + + +#if 0 + // msPresentationAssociationId does not appear to be + // valid/used, the relation this imposed for several examples + // was ~broken + if( aCurrPoint->msPresentationAssociationId.getLength() ) + output << "\t" + << normalizeDotName(aCurrPoint->msModelId).getStr() + << " -> " + << normalizeDotName(aCurrPoint->msPresentationAssociationId).getStr() + << " [style=dotted, color=red, " + << "label=\"presAssocID\"];" << std::endl; +#endif + +#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() ) + { + if( aCurrCxn->msSourceId.getLength() || + aCurrCxn->msDestId.getLength() ) + { + 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 + { + 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; + } + } + 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 ) + { + DiagramData::StringMap::value_type::second_type& rVec=getData()->getPresOfNameMap()[aCurrCxn->msDestId]; + rVec.push_back( + std::make_pair( + aCurrCxn->msSourceId,sal_Int32(0))); + } + + ++aCurrCxn; + } + + // assign outline levels + DiagramData::StringMap::iterator aPresOfIter=getData()->getPresOfNameMap().begin(); + const DiagramData::StringMap::iterator aPresOfEnd=getData()->getPresOfNameMap().end(); + while( aPresOfIter != aPresOfEnd ) + { + 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) + { + 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 + + // TODO +#if 0 OSL_TRACE( "building diagram" ); typedef std::map< OUString, dgm::PointPtr > PointsMap; PointsMap aPointsMap; @@ -238,30 +436,33 @@ void Diagram::build( ) } // check bounds OSL_ENSURE( aRoots.size() == 1, "more than one root" ); - // #i92239# roots may be empty - if( !aRoots.empty() ) + 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++ ) { - 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++ ) + if(! iter->second->getParent() ) { - if(! iter->second->getParent() ) - { - OSL_TRACE("node without parent %s", OUSTRING_TO_CSTR( iter->first ) ); - } + OSL_TRACE("node without parent %s", OUSTRING_TO_CSTR( iter->first ) ); } } +#endif } void Diagram::addTo( const ShapePtr & pParentShape ) { + // collect data, init maps + build( ); + + // create Shape hierarchy + ShapeCreationVisitor aCreationVisitor(pParentShape, *this); + mpLayout->getNode()->accept(aCreationVisitor); + +#if 0 dgm::Points & aPoints( mpData->getPoints( ) ); dgm::Points::iterator aPointsIter; - build( ); - if( mpRoot.get() ) - mpLayout->layout( mpRoot, awt::Point( 0, 0 ) ); + mpLayout->layout( mpRoot, awt::Point( 0, 0 ) ); for( aPointsIter = aPoints.begin(); aPointsIter != aPoints.end(); ++aPointsIter ) { @@ -284,6 +485,7 @@ void Diagram::addTo( const ShapePtr & pParentShape ) { OSL_TRACE( "Dgm: shape name %s", OUSTRING_TO_CSTR( (*iter)->getName() ) ); } +#endif } OUString Diagram::getLayoutId() const @@ -296,6 +498,156 @@ OUString Diagram::getLayoutId() const return sLayoutId; } +uno::Reference<xml::dom::XDocument> 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<xml::dom::XDocument>& rXDom, + const char* /*pPropName*/, + const ShapePtr& /*pShape*/, + const rtl::Reference< core::FragmentHandler >& rxHandler ) +{ + uno::Reference<xml::sax::XFastSAXSerializable> xSerializer( + rXDom, uno::UNO_QUERY_THROW); + + // now serialize DOM tree into internal data structures + rFilter.importFragment( rxHandler, xSerializer ); + + // not yet +#if 0 + // tack XDocument onto shape + pShape->getShapeProperties().setProperty( + OUString::createFromAscii(pPropName), + rXDom); +#endif +} + +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<xml::dom::XDocument>& rXDataModelDom, + const uno::Reference<xml::dom::XDocument>& rXLayoutDom, + const uno::Reference<xml::dom::XDocument>& rXQStyleDom, + const uno::Reference<xml::dom::XDocument>& 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/diagramdefinitioncontext.cxx b/oox/source/drawingml/diagram/diagramdefinitioncontext.cxx index d14535df509b..65e6c7531018 100644 --- a/oox/source/drawingml/diagram/diagramdefinitioncontext.cxx +++ b/oox/source/drawingml/diagram/diagramdefinitioncontext.cxx @@ -28,9 +28,8 @@ #include "diagramdefinitioncontext.hxx" #include "oox/core/namespaces.hxx" -#include "oox/helper/helper.hxx" #include "layoutnodecontext.hxx" -#include "oox/drawingml/diagram/datamodelcontext.hxx" +#include "datamodelcontext.hxx" #include "tokens.hxx" using namespace ::oox::core; @@ -88,9 +87,15 @@ DiagramDefinitionContext::createFastChildContext( ::sal_Int32 aElement, mpLayout->setDesc( xAttribs->getOptionalValue( XML_val ) ); break; case NMSP_DIAGRAM|XML_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 NMSP_DIAGRAM|XML_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 99407aed80d3..d5f5db6f3197 100644 --- a/oox/source/drawingml/diagram/diagramdefinitioncontext.hxx +++ b/oox/source/drawingml/diagram/diagramdefinitioncontext.hxx @@ -29,7 +29,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 a739a0095a5f..17091ae2f6ed 100644 --- a/oox/source/drawingml/diagram/diagramfragmenthandler.cxx +++ b/oox/source/drawingml/diagram/diagramfragmenthandler.cxx @@ -28,11 +28,11 @@ #include <osl/diagnose.h> -#include "oox/drawingml/diagram/diagramfragmenthandler.hxx" -#include "oox/drawingml/diagram/datamodelcontext.hxx" #include "oox/core/namespaces.hxx" +#include "oox/drawingml/colorchoicecontext.hxx" #include "diagramdefinitioncontext.hxx" -#include "tokens.hxx" +#include "diagramfragmenthandler.hxx" +#include "datamodelcontext.hxx" using namespace ::oox::core; using namespace ::com::sun::star::xml::sax; @@ -132,95 +132,144 @@ DiagramLayoutFragmentHandler::createFastChildContext( ::sal_Int32 aElement, /////////////////////// DiagramQStylesFragmentHandler::DiagramQStylesFragmentHandler( XmlFilterBase& rFilter, - const OUString& rFragmentPath, - const DiagramQStylesPtr pDataPtr ) - throw( ) - : FragmentHandler( rFilter, rFragmentPath ) - , mpDataPtr( pDataPtr ) + 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 == (NMSP_DRAWINGML|XML_fontRef)) ? + rAttribs.getToken( XML_idx, XML_none ) : rAttribs.getInteger( XML_idx, 0 ); + return new ColorContext( *this, o_rStyle.maPhClr ); } -DiagramQStylesFragmentHandler::~DiagramQStylesFragmentHandler( ) throw () -{ - -} - -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 == (NMSP_DIAGRAM|XML_styleDef) ? this : NULL; + case NMSP_DIAGRAM|XML_styleDef: + return nElement == (NMSP_DIAGRAM|XML_styleLbl) ? this : NULL; + case NMSP_DIAGRAM|XML_styleLbl: + return nElement == (NMSP_DIAGRAM|XML_style) ? this : NULL; + case NMSP_DIAGRAM|XML_style: + { + switch( nElement ) + { + case NMSP_DRAWINGML|XML_lnRef : // CT_StyleMatrixReference + return createStyleMatrixContext(nElement,rAttribs, + maStyleEntry.maLineStyle); + case NMSP_DRAWINGML|XML_fillRef : // CT_StyleMatrixReference + return createStyleMatrixContext(nElement,rAttribs, + maStyleEntry.maFillStyle); + case NMSP_DRAWINGML|XML_effectRef : // CT_StyleMatrixReference + return createStyleMatrixContext(nElement,rAttribs, + maStyleEntry.maEffectStyle); + case NMSP_DRAWINGML|XML_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() == (NMSP_DIAGRAM|XML_styleLbl) ) { - case NMSP_DIAGRAM|XML_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( const ::rtl::OUString& ) { + if( getCurrentElement() == (NMSP_DIAGRAM|XML_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 == (NMSP_DIAGRAM|XML_colorsDef) ? this : NULL;; + case NMSP_DIAGRAM|XML_colorsDef: + return nElement == (NMSP_DIAGRAM|XML_styleLbl) ? this : NULL;; + case NMSP_DIAGRAM|XML_styleLbl: + return ((nElement == (NMSP_DIAGRAM|XML_fillClrLst)) || + (nElement == (NMSP_DIAGRAM|XML_linClrLst)) || + (nElement == (NMSP_DIAGRAM|XML_effectClrLst)) || + (nElement == (NMSP_DIAGRAM|XML_txLinClrLst)) || + (nElement == (NMSP_DIAGRAM|XML_txFillClrLst)) || + (nElement == (NMSP_DIAGRAM|XML_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 NMSP_DIAGRAM|XML_fillClrLst: + return new ColorContext( *this, maColorEntry.maFillColor ); + case NMSP_DIAGRAM|XML_linClrLst: + return new ColorContext( *this, maColorEntry.maLineColor ); + case NMSP_DIAGRAM|XML_effectClrLst: + return new ColorContext( *this, maColorEntry.maEffectColor ); + case NMSP_DIAGRAM|XML_txFillClrLst: + return new ColorContext( *this, maColorEntry.maTextFillColor ); + case NMSP_DIAGRAM|XML_txLinClrLst: + return new ColorContext( *this, maColorEntry.maTextLineColor ); + case NMSP_DIAGRAM|XML_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() == (NMSP_DIAGRAM|XML_styleLbl) ) { - case NMSP_DIAGRAM|XML_colorsDef: - // TODO - break; - default: - break; + maColorName = rAttribs.getString( XML_name, OUString() ); + maColorEntry = mrColorsMap[maColorName]; } - - if( !xRet.is() ) - xRet = getFastContextHandler(); - - return xRet; } - - +void ColorFragmentHandler::onEndElement( const ::rtl::OUString& ) +{ + if( getCurrentElement() == (NMSP_DIAGRAM|XML_styleLbl) ) + mrColorsMap[maColorName] = maColorEntry; +} } } diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx index dd213fda6c36..a0c2d6eb1245 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 <functional> #include <boost/bind.hpp> +#include <basegfx/numeric/ftools.hxx> + #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<LayoutAtomPtr>& 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<LayoutAtomPtr>& 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<ShapePtr>::const_iterator aCurrShape=rShape->getChildren().begin(); + const std::vector<ShapePtr>::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<ShapePtr>::const_iterator aCurrShape=rShape->getChildren().begin(); + const std::vector<ShapePtr>::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; i<nShapes; ++i, ++aCurrShape ) + { + const awt::Size& sz=(*aCurrShape)->getSize(); + + 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<ShapePtr>::const_iterator aCurrShape=rShape->getChildren().begin(); + const std::vector<ShapePtr>::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; nPara<pTextBody->getParagraphs().size(); ++nPara ) + { + aTotalSize.Height += nHackyFontHeight; + + sal_Int32 nLocalWidth=0; + for( sal_uInt32 nRun=0; nRun<pTextBody->getParagraphs().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.getTransparence() ); + } + + 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<LayoutAtomPtr>& 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<LayoutAtomPtr>& 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; mnCurrIdx<nCnt && nStep>0; 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<LayoutAtomPtr>& 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<LayoutAtomPtr>& 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/layoutnodecontext.cxx b/oox/source/drawingml/diagram/layoutnodecontext.cxx index 61213b5afa4c..ad7e4ae3a289 100644 --- a/oox/source/drawingml/diagram/layoutnodecontext.cxx +++ b/oox/source/drawingml/diagram/layoutnodecontext.cxx @@ -32,7 +32,9 @@ #include "oox/core/namespaces.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; @@ -47,15 +49,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 ) + {} }; @@ -64,21 +60,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( getToken(aElement) ) + { + case XML_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; }; @@ -88,7 +110,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 ); @@ -101,24 +122,23 @@ public: { Reference< XFastContextHandler > xRet; - switch( aElement ) + switch( getToken(aElement) ) { case XML_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: // 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 { @@ -135,9 +155,9 @@ public: return xRet; } private: - bool mbHasElse; OUString msName; LayoutAtomPtr mpNode; + ConditionAtomPtr mpConditionNode; }; @@ -147,13 +167,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 ); } }; @@ -197,17 +214,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 ); } @@ -228,33 +240,33 @@ void SAL_CALL LayoutNodeContext::endFastElement( ::sal_Int32 ) sal_Int32 LayoutNodeContext::tagToVarIdx( sal_Int32 aTag ) { sal_Int32 nIdx = -1; - switch( aTag ) + switch( aTag & ~NMSP_DIAGRAM ) { - case NMSP_DIAGRAM|XML_animLvl: + case XML_animLvl: nIdx = LayoutNode::VAR_animLvl; break; - case NMSP_DIAGRAM|XML_animOne: + case XML_animOne: nIdx = LayoutNode::VAR_animOne; break; - case NMSP_DIAGRAM|XML_bulletEnabled: + case XML_bulletEnabled: nIdx = LayoutNode::VAR_bulletEnabled; break; - case NMSP_DIAGRAM|XML_chMax: + case XML_chMax: nIdx = LayoutNode::VAR_chMax; break; - case NMSP_DIAGRAM|XML_chPref: + case XML_chPref: nIdx = LayoutNode::VAR_chPref; break; - case NMSP_DIAGRAM|XML_dir: + case XML_dir: nIdx = LayoutNode::VAR_dir; break; - case NMSP_DIAGRAM|XML_hierBranch: + case XML_hierBranch: nIdx = LayoutNode::VAR_hierBranch; break; - case NMSP_DIAGRAM|XML_orgChart: + case XML_orgChart: nIdx = LayoutNode::VAR_orgChart; break; - case NMSP_DIAGRAM|XML_resizeHandles: + case XML_resizeHandles: nIdx = LayoutNode::VAR_resizeHandles; break; default: @@ -277,13 +289,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 NMSP_DIAGRAM|XML_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 NMSP_DIAGRAM|XML_extLst: @@ -291,7 +329,7 @@ LayoutNodeContext::createFastChildContext( ::sal_Int32 aElement, case NMSP_DIAGRAM|XML_alg: { // CT_Algorithm - LayoutAtomPtr pAtom( new AlgAtom ); + AlgAtomPtr pAtom( new AlgAtom ); mpNode->addChild( pAtom ); xRet.set( new AlgorithmContext( *this, xAttribs, pAtom ) ); break; @@ -307,14 +345,14 @@ LayoutNodeContext::createFastChildContext( ::sal_Int32 aElement, case NMSP_DIAGRAM|XML_forEach: { // CT_ForEach - LayoutAtomPtr pAtom( new ForEachAtom ); + ForEachAtomPtr pAtom( new ForEachAtom(xAttribs) ); mpNode->addChild( pAtom ); xRet.set( new ForEachContext( *this, xAttribs, pAtom ) ); break; } case NMSP_DIAGRAM|XML_constrLst: // CT_Constraints - // TODO + xRet.set( new ConstraintListContext( *this, xAttribs, mpNode ) ); break; case NMSP_DIAGRAM|XML_presOf: { diff --git a/oox/source/drawingml/diagram/layoutnodecontext.hxx b/oox/source/drawingml/diagram/layoutnodecontext.hxx index 19cb19aa602d..c9c0c6e1d7e2 100644 --- a/oox/source/drawingml/diagram/layoutnodecontext.hxx +++ b/oox/source/drawingml/diagram/layoutnodecontext.hxx @@ -29,7 +29,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/diagram/makefile.mk b/oox/source/drawingml/diagram/makefile.mk index 9d526ed3d3fb..1d438c21fbae 100644 --- a/oox/source/drawingml/diagram/makefile.mk +++ b/oox/source/drawingml/diagram/makefile.mk @@ -41,6 +41,7 @@ ENABLE_EXCEPTIONS=TRUE # --- Files -------------------------------------------------------- SLOFILES = \ + $(SLO)$/constraintlistcontext.obj \ $(SLO)$/diagram.obj \ $(SLO)$/diagramfragmenthandler.obj \ $(SLO)$/diagramdefinitioncontext.obj \ diff --git a/oox/source/drawingml/drawingmltypes.cxx b/oox/source/drawingml/drawingmltypes.cxx index 2b0eeae3273f..3e2582ffcdf4 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 e7351424d924..dd1bf960166f 100644 --- a/oox/source/drawingml/fillproperties.cxx +++ b/oox/source/drawingml/fillproperties.cxx @@ -79,6 +79,7 @@ static const sal_Int32 spnDefaultFillIds[ FillId_END ] = BitmapMode lclGetBitmapMode( sal_Int32 nToken ) { + OSL_ASSERT((nToken & sal_Int32(0xFFFF0000))==0); switch( nToken ) { case XML_tile: return BitmapMode_REPEAT; @@ -89,6 +90,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; @@ -223,6 +225,7 @@ void FillProperties::pushToPropMap( PropertyMap& rPropMap, ModelObjectHelper& rM 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 1631920c6452..45ef18e57741 100644 --- a/oox/source/drawingml/graphicshapecontext.cxx +++ b/oox/source/drawingml/graphicshapecontext.cxx @@ -32,7 +32,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/namespaces.hxx" #include "oox/core/xmlfilterbase.hxx" @@ -94,7 +94,7 @@ Reference< XFastContextHandler > GraphicShapeContext::createFastChildContext( sa (mpShapePtr->getCustomShapeProperties()); sal_uInt32 nType = aElementToken & (~ NMSP_MASK); - OUString sType(GetShapeType(nType)); + OUString sType(GetShapePresetType(nType)); if (sType.getLength() > 0) pCstmShpProps->setShapePresetType(sType); @@ -119,6 +119,7 @@ Reference< XFastContextHandler > GraphicalObjectFrameContext::createFastChildCon { Reference< XFastContextHandler > xRet; + OSL_ASSERT(((aElementToken &(~NMSP_MASK)) & sal_Int32(0xFFFF0000))==0); switch( aElementToken &(~NMSP_MASK) ) { // CT_ShapeProperties @@ -277,48 +278,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) { @@ -332,8 +291,12 @@ Reference< XFastContextHandler > DiagramGraphicDataContext::createFastChildConte msLo = xAttribs->getOptionalValue( NMSP_RELATIONSHIPS|XML_lo ); msQs = xAttribs->getOptionalValue( NMSP_RELATIONSHIPS|XML_qs ); msCs = xAttribs->getOptionalValue( NMSP_RELATIONSHIPS|XML_cs ); - DiagramPtr pDiagram = loadDiagram(); - pDiagram->addTo( mpShapePtr ); + loadDiagram(mpShapePtr, + getFilter(), + getFragmentPathFromRelId( msDm ), + getFragmentPathFromRelId( msLo ), + getFragmentPathFromRelId( msQs ), + getFragmentPathFromRelId( msCs )); OSL_TRACE("diagram added shape %s of type %s", OUSTRING_TO_CSTR( mpShapePtr->getName() ), OUSTRING_TO_CSTR( mpShapePtr->getServiceName() ) ); break; @@ -392,7 +355,8 @@ void CreateChartCallback::onXShapeCreated( const Reference< drawing::XShape >& r Reference< drawing::XShapes > xExternalPage; if( !mbEmbedShapes ) xExternalPage = rxShapes; - mrFilter.getChartConverter().convertFromModel( mrFilter, aModel, xChartDoc, xExternalPage, rxShape->getPosition(), rxShape->getSize() ); + if( mrFilter.getChartConverter() ) + mrFilter.getChartConverter()->convertFromModel( mrFilter, aModel, xChartDoc, xExternalPage, rxShape->getPosition(), rxShape->getSize() ); } catch( Exception& ) { diff --git a/oox/source/drawingml/lineproperties.cxx b/oox/source/drawingml/lineproperties.cxx index 7bc60f026665..17266e4efe3f 100644 --- a/oox/source/drawingml/lineproperties.cxx +++ b/oox/source/drawingml/lineproperties.cxx @@ -160,6 +160,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; @@ -171,6 +172,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; @@ -186,6 +188,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; @@ -207,6 +210,7 @@ void lclPushMarkerProperties( PropertyMap& rPropMap, const LineArrowProperties& OUStringBuffer aBuffer; sal_Int32 nArrowType = rArrowProps.moArrowType.get( XML_none ); + OSL_ASSERT((nArrowType & sal_Int32(0xFFFF0000))==0); switch( nArrowType ) { case XML_triangle: @@ -263,6 +267,7 @@ void lclPushMarkerProperties( PropertyMap& rPropMap, const LineArrowProperties& #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/makefile.mk b/oox/source/drawingml/makefile.mk index e2d4ea6b8f3d..5079b02c1da1 100644 --- a/oox/source/drawingml/makefile.mk +++ b/oox/source/drawingml/makefile.mk @@ -59,6 +59,7 @@ SLOFILES = \ $(SLO)$/linepropertiescontext.obj\ $(SLO)$/objectdefaultcontext.obj\ $(SLO)$/shape.obj\ + $(SLO)$/shape3dproperties.obj\ $(SLO)$/shapecontext.obj\ $(SLO)$/shapegroupcontext.obj\ $(SLO)$/shapepropertiescontext.obj\ diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 8cdd2d6541e3..8483e730a2c0 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -42,8 +42,10 @@ #include <tools/solar.h> // for the F_PI180 define #include <com/sun/star/graphic/XGraphic.hpp> #include <com/sun/star/container/XNamed.hpp> +#include <com/sun/star/container/XNameContainer.hpp> #include <com/sun/star/beans/XMultiPropertySet.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/xml/AttributeData.hpp> #include <com/sun/star/drawing/HomogenMatrix3.hpp> #include <com/sun/star/drawing/TextVerticalAdjust.hpp> #include <com/sun/star/text/XText.hpp> @@ -106,6 +108,34 @@ Shape::Shape( const sal_Char* pServiceName ) msServiceName = OUString::createFromAscii( 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 ) +, mxCreateCallback( pSourceShape->mxCreateCallback ) +, mnRotation( pSourceShape->mnRotation ) +, mbFlipH( pSourceShape->mbFlipH ) +, mbFlipV( pSourceShape->mbFlipV ) +{} + Shape::~Shape() { } @@ -195,6 +225,19 @@ void Shape::applyShapeReference( const Shape& rReferencedShape ) mbHidden = rReferencedShape.mbHidden; } +void Shape::addChildren( const ::oox::core::XmlFilterBase& rFilterBase, + const Theme* pTheme, + const Reference< XShapes >& rxShapes, + const awt::Rectangle* pShapeRect, + ShapeIdMap* pShapeMap ) +{ + addChildren(rFilterBase, *this, pTheme, rxShapes, + pShapeRect ? + *pShapeRect : + awt::Rectangle( maPosition.X, maPosition.Y, maSize.Width, maSize.Height ), + pShapeMap); +} + // for group shapes, the following method is also adding each child void Shape::addChildren( const ::oox::core::XmlFilterBase& rFilterBase, diff --git a/oox/source/drawingml/shapepropertiescontext.cxx b/oox/source/drawingml/shapepropertiescontext.cxx index 470433af0556..4fa8acb8451b 100644 --- a/oox/source/drawingml/shapepropertiescontext.cxx +++ b/oox/source/drawingml/shapepropertiescontext.cxx @@ -35,6 +35,7 @@ #include <com/sun/star/container/XNamed.hpp> #include "oox/core/namespaces.hxx" +#include "oox/drawingml/scene3dcontext.hxx" #include "oox/drawingml/linepropertiescontext.hxx" #include "oox/drawingml/fillpropertiesgroupcontext.hxx" #include "oox/drawingml/transform2dcontext.hxx" @@ -106,8 +107,11 @@ Reference< XFastContextHandler > ShapePropertiesContext::createFastChildContext( case NMSP_DRAWINGML|XML_effectDag: // CT_EffectContainer break; - // todo case NMSP_DRAWINGML|XML_scene3d: // CT_Scene3D +// xRet.set( new Scene3DContext( *this, xAttribs, *(mrShape.get3DShapeProperties()) ) ); + break; + + // todo case NMSP_DRAWINGML|XML_sp3d: // CT_Shape3D break; } diff --git a/oox/source/drawingml/textparagraph.cxx b/oox/source/drawingml/textparagraph.cxx index feda8f2ac00d..d31e911e4996 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; @@ -114,6 +117,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 68aad1f3cf26..f818a5defca6 100644 --- a/oox/source/drawingml/textparagraphproperties.cxx +++ b/oox/source/drawingml/textparagraphproperties.cxx @@ -114,6 +114,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 3abd50f81628..6aeb49f79649 100644 --- a/oox/source/helper/storagebase.cxx +++ b/oox/source/helper/storagebase.cxx @@ -50,17 +50,25 @@ namespace oox { 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/makefile.mk b/oox/source/ppt/makefile.mk index 7ee7e0c46d68..46cfd4ffd917 100644 --- a/oox/source/ppt/makefile.mk +++ b/oox/source/ppt/makefile.mk @@ -50,6 +50,8 @@ SLOFILES = \ $(SLO)$/commontimenodecontext.obj \ $(SLO)$/conditioncontext.obj \ $(SLO)$/customshowlistcontext.obj \ + $(SLO)$/dgmimport.obj\ + $(SLO)$/dgmlayout.obj\ $(SLO)$/headerfootercontext.obj \ $(SLO)$/layoutfragmenthandler.obj\ $(SLO)$/pptfilterhelpers.obj\ diff --git a/oox/source/ppt/pptimport.cxx b/oox/source/ppt/pptimport.cxx index a48977ae1f31..440704ffe84a 100644 --- a/oox/source/ppt/pptimport.cxx +++ b/oox/source/ppt/pptimport.cxx @@ -173,9 +173,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 989577424125..1f3c93e7d4eb 100644 --- a/oox/source/ppt/presentationfragmenthandler.cxx +++ b/oox/source/ppt/presentationfragmenthandler.cxx @@ -33,6 +33,8 @@ #include <com/sun/star/drawing/XDrawPages.hpp> #include <com/sun/star/drawing/XDrawPagesSupplier.hpp> #include <com/sun/star/drawing/XMasterPageTarget.hpp> +#include <com/sun/star/xml/dom/XDocument.hpp> +#include <com/sun/star/xml/sax/XFastSAXSerializable.hpp> #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> #include <com/sun/star/style/XStyle.hpp> #include <com/sun/star/presentation/XPresentationPage.hpp> @@ -231,8 +233,17 @@ void PresentationFragmentHandler::endDocument() throw (SAXException, RuntimeExce { oox::drawingml::ThemePtr pThemePtr( new oox::drawingml::Theme() ); pMasterPersistPtr->setTheme( pThemePtr ); - rFilter.importFragment( new ThemeFragmentHandler( rFilter, aThemeFragmentPath, *pThemePtr ) ); + Reference<xml::dom::XDocument> xDoc= + rFilter.importFragment(aThemeFragmentPath); + + rFilter.importFragment( + new ThemeFragmentHandler( + rFilter, aThemeFragmentPath, *pThemePtr ), + Reference<xml::sax::XFastSAXSerializable>( + xDoc, + UNO_QUERY_THROW)); rThemes[ aThemeFragmentPath ] = pThemePtr; + pThemePtr->setFragment(xDoc); } else { diff --git a/oox/source/ppt/slidepersist.cxx b/oox/source/ppt/slidepersist.cxx index c4ab81e51a0b..12c899c99c0a 100644 --- a/oox/source/ppt/slidepersist.cxx +++ b/oox/source/ppt/slidepersist.cxx @@ -166,6 +166,17 @@ void SlidePersist::createXShapes( const XmlFilterBase& rFilterBase ) pNode->setNode( rFilterBase, xNode, pSlidePtr ); } } + + // not yet +#if 0 + if( getTheme() ) + { + uno::Reference< beans::XPropertySet > xPagePropSet( mxPage, uno::UNO_QUERY_THROW ); + xPagePropSet->setPropertyValue( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PPTTheme" )), + uno::makeAny(getTheme()->getFragment())); + } +#endif } void SlidePersist::createBackground( const XmlFilterBase& rFilterBase ) diff --git a/oox/source/shape/ShapeFilterBase.cxx b/oox/source/shape/ShapeFilterBase.cxx index b390669a18ba..0f46b3fb5de8 100644 --- a/oox/source/shape/ShapeFilterBase.cxx +++ b/oox/source/shape/ShapeFilterBase.cxx @@ -61,9 +61,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(); } ::rtl::OUString ShapeFilterBase::implGetImplementationName() const diff --git a/oox/source/shape/ShapeFilterBase.hxx b/oox/source/shape/ShapeFilterBase.hxx index 09cbc75e01aa..945ecf739979 100644 --- a/oox/source/shape/ShapeFilterBase.hxx +++ b/oox/source/shape/ShapeFilterBase.hxx @@ -58,7 +58,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 rtl::OUString implGetImplementationName() const; diff --git a/oox/source/xls/excelfilter.cxx b/oox/source/xls/excelfilter.cxx index 1093b5cc7bfe..276459334c01 100644 --- a/oox/source/xls/excelfilter.cxx +++ b/oox/source/xls/excelfilter.cxx @@ -152,7 +152,7 @@ const TableStyleListPtr ExcelFilter::getTableStyles() return TableStyleListPtr(); } -::oox::drawingml::chart::ChartConverter& ExcelFilter::getChartConverter() +::oox::drawingml::chart::ChartConverter* ExcelFilter::getChartConverter() { return WorkbookHelper( getWorkbookData() ).getChartConverter(); } diff --git a/oox/source/xls/workbookhelper.cxx b/oox/source/xls/workbookhelper.cxx index f8a49c435244..0a99a653977d 100644 --- a/oox/source/xls/workbookhelper.cxx +++ b/oox/source/xls/workbookhelper.cxx @@ -203,7 +203,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; } @@ -894,7 +894,7 @@ AddressConverter& WorkbookHelper::getAddressConverter() const return mrBookData.getAddressConverter(); } -ExcelChartConverter& WorkbookHelper::getChartConverter() const +ExcelChartConverter* WorkbookHelper::getChartConverter() const { return mrBookData.getChartConverter(); } |