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