xref: /AOO41X/main/xmloff/source/draw/shapeimport.cxx (revision f3b8b5095ca27138d26caadd2c6fcd6d54dff076)
163bba73cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
363bba73cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
463bba73cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
563bba73cSAndrew Rist  * distributed with this work for additional information
663bba73cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
763bba73cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
863bba73cSAndrew Rist  * "License"); you may not use this file except in compliance
963bba73cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
1163bba73cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
1363bba73cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
1463bba73cSAndrew Rist  * software distributed under the License is distributed on an
1563bba73cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1663bba73cSAndrew Rist  * KIND, either express or implied.  See the License for the
1763bba73cSAndrew Rist  * specific language governing permissions and limitations
1863bba73cSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
2063bba73cSAndrew Rist  *************************************************************/
2163bba73cSAndrew Rist 
2263bba73cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <tools/debug.hxx>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <com/sun/star/text/PositionLayoutDir.hpp>
30cdf0e10cSrcweir #include <com/sun/star/chart/XChartDocument.hpp>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include "unointerfacetouniqueidentifiermapper.hxx"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <list>
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #ifndef _XMLOFF_SHAPEIMPORT_HXX
37cdf0e10cSrcweir #include <xmloff/shapeimport.hxx>
38cdf0e10cSrcweir #endif
39cdf0e10cSrcweir #include <xmloff/xmltkmap.hxx>
40cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx"
41cdf0e10cSrcweir #include <xmloff/xmltoken.hxx>
42cdf0e10cSrcweir #include "ximpstyl.hxx"
43cdf0e10cSrcweir #include "ximpshap.hxx"
44cdf0e10cSrcweir #include "sdpropls.hxx"
45cdf0e10cSrcweir #include <xmloff/xmlprmap.hxx>
46cdf0e10cSrcweir #include "ximp3dscene.hxx"
47cdf0e10cSrcweir #include "ximp3dobject.hxx"
48cdf0e10cSrcweir #include "ximpgrp.hxx"
49cdf0e10cSrcweir #include "ximplink.hxx"
50cdf0e10cSrcweir 
51cdf0e10cSrcweir #include <map>
52cdf0e10cSrcweir #include <vector>
53cdf0e10cSrcweir 
54cdf0e10cSrcweir using ::rtl::OUString;
55cdf0e10cSrcweir using ::rtl::OUStringBuffer;
56cdf0e10cSrcweir 
57cdf0e10cSrcweir using namespace ::std;
58cdf0e10cSrcweir using namespace ::com::sun::star;
59cdf0e10cSrcweir using namespace ::xmloff::token;
60cdf0e10cSrcweir 
61cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
62cdf0e10cSrcweir 
63cdf0e10cSrcweir struct ltint32
64cdf0e10cSrcweir {
operator ()ltint3265cdf0e10cSrcweir   bool operator()(const sal_Int32 p, sal_Int32 q) const
66cdf0e10cSrcweir   {
67cdf0e10cSrcweir     return p < q;
68cdf0e10cSrcweir   }
69cdf0e10cSrcweir };
70cdf0e10cSrcweir 
71cdf0e10cSrcweir typedef std::map<sal_Int32,com::sun::star::uno::Reference< com::sun::star::drawing::XShape >,ltint32> IdShapeMap;
72cdf0e10cSrcweir 
73cdf0e10cSrcweir struct ConnectionHint
74cdf0e10cSrcweir {
75cdf0e10cSrcweir 	com::sun::star::uno::Reference< com::sun::star::drawing::XShape > mxConnector;
76cdf0e10cSrcweir 	sal_Bool  bStart;
77cdf0e10cSrcweir 	OUString aDestShapeId;
78cdf0e10cSrcweir 	sal_Int32 nDestGlueId;
79cdf0e10cSrcweir };
80cdf0e10cSrcweir 
81cdf0e10cSrcweir struct XShapeCompareHelper
82cdf0e10cSrcweir {
operator ()XShapeCompareHelper83cdf0e10cSrcweir   bool operator()(com::sun::star::uno::Reference < com::sun::star::drawing::XShape > x1,
84cdf0e10cSrcweir 				  com::sun::star::uno::Reference < com::sun::star::drawing::XShape > x2 ) const
85cdf0e10cSrcweir   {
86cdf0e10cSrcweir     return x1.get() < x2.get();
87cdf0e10cSrcweir   }
88cdf0e10cSrcweir };
89cdf0e10cSrcweir 
90cdf0e10cSrcweir /** this map store all glue point id mappings for shapes that had user defined glue points. This
91cdf0e10cSrcweir 	is needed because on insertion the glue points will get a new and unique id */
92cdf0e10cSrcweir typedef std::map<sal_Int32,sal_Int32,ltint32> GluePointIdMap;
93cdf0e10cSrcweir typedef std::map< com::sun::star::uno::Reference < com::sun::star::drawing::XShape >, GluePointIdMap, XShapeCompareHelper > ShapeGluePointsMap;
94cdf0e10cSrcweir 
95cdf0e10cSrcweir /** this struct is created for each startPage() call and stores information that is needed during
96cdf0e10cSrcweir 	import of shapes for one page. Since pages could be nested ( notes pages inside impress ) there
97cdf0e10cSrcweir 	is a pointer so one can build up a stack of this structs */
98cdf0e10cSrcweir struct XMLShapeImportPageContextImpl
99cdf0e10cSrcweir {
100cdf0e10cSrcweir 	ShapeGluePointsMap		maShapeGluePointsMap;
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 	uno::Reference < drawing::XShapes > mxShapes;
103cdf0e10cSrcweir 
104cdf0e10cSrcweir 	struct XMLShapeImportPageContextImpl* mpNext;
105cdf0e10cSrcweir };
106cdf0e10cSrcweir 
107cdf0e10cSrcweir /** this class is to enable adding members to the XMLShapeImportHelper without getting incompatible */
108cdf0e10cSrcweir struct XMLShapeImportHelperImpl
109cdf0e10cSrcweir {
110cdf0e10cSrcweir 	// context for sorting shapes
111cdf0e10cSrcweir 	ShapeSortContext*			mpSortContext;
112cdf0e10cSrcweir 
113cdf0e10cSrcweir 	IdShapeMap					maShapeIds;
114cdf0e10cSrcweir 
115cdf0e10cSrcweir 	std::vector<ConnectionHint> maConnections;
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	// #88546# possibility to swich progress bar handling on/off
118cdf0e10cSrcweir 	sal_Bool					mbHandleProgressBar;
119cdf0e10cSrcweir 
120cdf0e10cSrcweir 	// stores the capability of the current model to create presentation shapes
121cdf0e10cSrcweir 	sal_Bool					mbIsPresentationShapesSupported;
122cdf0e10cSrcweir };
123cdf0e10cSrcweir 
124cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
125cdf0e10cSrcweir 
XMLShapeImportHelper(SvXMLImport & rImporter,const uno::Reference<frame::XModel> & rModel,SvXMLImportPropertyMapper * pExtMapper)126cdf0e10cSrcweir XMLShapeImportHelper::XMLShapeImportHelper(
127cdf0e10cSrcweir 		SvXMLImport& rImporter,
128cdf0e10cSrcweir 		const uno::Reference< frame::XModel>& rModel,
129cdf0e10cSrcweir 		SvXMLImportPropertyMapper *pExtMapper )
130cdf0e10cSrcweir :	mpPageContext(NULL),
131cdf0e10cSrcweir 	mxModel(rModel),
132cdf0e10cSrcweir 
133cdf0e10cSrcweir 	mpPropertySetMapper(0L),
134cdf0e10cSrcweir 	mpPresPagePropsMapper(0L),
135cdf0e10cSrcweir 	mpStylesContext(0L),
136cdf0e10cSrcweir 	mpAutoStylesContext(0L),
137cdf0e10cSrcweir 	mpGroupShapeElemTokenMap(0L),
138cdf0e10cSrcweir 	mpFrameShapeElemTokenMap(0L),
139cdf0e10cSrcweir 	mp3DSceneShapeElemTokenMap(0L),
140cdf0e10cSrcweir 	mp3DObjectAttrTokenMap(0L),
141cdf0e10cSrcweir 	mp3DPolygonBasedAttrTokenMap(0L),
142cdf0e10cSrcweir 	mp3DCubeObjectAttrTokenMap(0L),
143cdf0e10cSrcweir 	mp3DSphereObjectAttrTokenMap(0L),
144cdf0e10cSrcweir 	mp3DSceneShapeAttrTokenMap(0L),
145cdf0e10cSrcweir 	mp3DLightAttrTokenMap(0L),
146cdf0e10cSrcweir 	mpPathShapeAttrTokenMap(0L),
147cdf0e10cSrcweir 	mpPolygonShapeAttrTokenMap(0L),
148cdf0e10cSrcweir 	msStartShape(RTL_CONSTASCII_USTRINGPARAM("StartShape")),
149cdf0e10cSrcweir 	msEndShape(RTL_CONSTASCII_USTRINGPARAM("EndShape")),
150cdf0e10cSrcweir 	msStartGluePointIndex(RTL_CONSTASCII_USTRINGPARAM("StartGluePointIndex")),
151cdf0e10cSrcweir 	msEndGluePointIndex(RTL_CONSTASCII_USTRINGPARAM("EndGluePointIndex")),
152cdf0e10cSrcweir 
153cdf0e10cSrcweir 	mrImporter( rImporter )
154cdf0e10cSrcweir {
155cdf0e10cSrcweir 	mpImpl = new XMLShapeImportHelperImpl();
156cdf0e10cSrcweir 	mpImpl->mpSortContext = 0;
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 	// #88546# init to sal_False
159cdf0e10cSrcweir 	mpImpl->mbHandleProgressBar = sal_False;
160cdf0e10cSrcweir 
161cdf0e10cSrcweir 	mpSdPropHdlFactory = new XMLSdPropHdlFactory( rModel, rImporter );
162cdf0e10cSrcweir 
163cdf0e10cSrcweir 	// set lock to avoid deletion
164cdf0e10cSrcweir 	mpSdPropHdlFactory->acquire();
165cdf0e10cSrcweir 
166cdf0e10cSrcweir 	// construct PropertySetMapper
167cdf0e10cSrcweir 	UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper(mpSdPropHdlFactory);
168cdf0e10cSrcweir 	mpPropertySetMapper = new SvXMLImportPropertyMapper( xMapper, rImporter );
169cdf0e10cSrcweir 	// set lock to avoid deletion
170cdf0e10cSrcweir 	mpPropertySetMapper->acquire();
171cdf0e10cSrcweir 
172cdf0e10cSrcweir 	if( pExtMapper )
173cdf0e10cSrcweir 	{
174cdf0e10cSrcweir 		UniReference < SvXMLImportPropertyMapper > xExtMapper( pExtMapper );
175cdf0e10cSrcweir 		mpPropertySetMapper->ChainImportMapper( xExtMapper );
176cdf0e10cSrcweir 	}
177cdf0e10cSrcweir 
178cdf0e10cSrcweir 	// chain text attributes
179cdf0e10cSrcweir 	mpPropertySetMapper->ChainImportMapper(XMLTextImportHelper::CreateParaExtPropMapper(rImporter));
180cdf0e10cSrcweir 	mpPropertySetMapper->ChainImportMapper(XMLTextImportHelper::CreateParaDefaultExtPropMapper(rImporter));
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 	// construct PresPagePropsMapper
183cdf0e10cSrcweir 	xMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLSDPresPageProps, mpSdPropHdlFactory);
184cdf0e10cSrcweir 	mpPresPagePropsMapper = new SvXMLImportPropertyMapper( xMapper, rImporter );
185cdf0e10cSrcweir 	if(mpPresPagePropsMapper)
186cdf0e10cSrcweir 	{
187cdf0e10cSrcweir 		// set lock to avoid deletion
188cdf0e10cSrcweir 		mpPresPagePropsMapper->acquire();
189cdf0e10cSrcweir 	}
190cdf0e10cSrcweir 
191cdf0e10cSrcweir 	uno::Reference< lang::XServiceInfo > xInfo( rImporter.GetModel(), uno::UNO_QUERY );
192cdf0e10cSrcweir 	const OUString aSName( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.PresentationDocument") );
193cdf0e10cSrcweir 	mpImpl->mbIsPresentationShapesSupported = xInfo.is() && xInfo->supportsService( aSName );
194cdf0e10cSrcweir }
195cdf0e10cSrcweir 
196cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
197cdf0e10cSrcweir 
~XMLShapeImportHelper()198cdf0e10cSrcweir XMLShapeImportHelper::~XMLShapeImportHelper()
199cdf0e10cSrcweir {
200cdf0e10cSrcweir 	DBG_ASSERT( mpImpl->maConnections.empty(), "XMLShapeImportHelper::restoreConnections() was not called!" );
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 	// cleanup factory, decrease refcount. Should lead to destruction.
203cdf0e10cSrcweir 	if(mpSdPropHdlFactory)
204cdf0e10cSrcweir 	{
205cdf0e10cSrcweir 		mpSdPropHdlFactory->release();
206cdf0e10cSrcweir 		mpSdPropHdlFactory = 0L;
207cdf0e10cSrcweir 	}
208cdf0e10cSrcweir 
209cdf0e10cSrcweir 	// cleanup mapper, decrease refcount. Should lead to destruction.
210cdf0e10cSrcweir 	if(mpPropertySetMapper)
211cdf0e10cSrcweir 	{
212cdf0e10cSrcweir 		mpPropertySetMapper->release();
213cdf0e10cSrcweir 		mpPropertySetMapper = 0L;
214cdf0e10cSrcweir 	}
215cdf0e10cSrcweir 
216cdf0e10cSrcweir 	// cleanup presPage mapper, decrease refcount. Should lead to destruction.
217cdf0e10cSrcweir 	if(mpPresPagePropsMapper)
218cdf0e10cSrcweir 	{
219cdf0e10cSrcweir 		mpPresPagePropsMapper->release();
220cdf0e10cSrcweir 		mpPresPagePropsMapper = 0L;
221cdf0e10cSrcweir 	}
222cdf0e10cSrcweir 
223cdf0e10cSrcweir 	if(mpGroupShapeElemTokenMap) delete mpGroupShapeElemTokenMap;
224cdf0e10cSrcweir 	if(mpFrameShapeElemTokenMap) delete mpFrameShapeElemTokenMap;
225cdf0e10cSrcweir /*
226cdf0e10cSrcweir 	if(mpShapeAttrTokenMap) delete mpShapeAttrTokenMap;
227cdf0e10cSrcweir 	if(mpRectShapeAttrTokenMap) delete mpRectShapeAttrTokenMap;
228cdf0e10cSrcweir 	if(mpLineShapeAttrTokenMap) delete mpLineShapeAttrTokenMap;
229cdf0e10cSrcweir 	if(mpEllipseShapeAttrTokenMap) delete mpEllipseShapeAttrTokenMap;
230cdf0e10cSrcweir 	if(mpTextBoxShapeAttrTokenMap) delete mpTextBoxShapeAttrTokenMap;
231cdf0e10cSrcweir 	if(mpControlShapeAttrTokenMap) delete mpControlShapeAttrTokenMap;
232cdf0e10cSrcweir 	if(mpPageShapeAttrTokenMap) delete mpPageShapeAttrTokenMap;
233cdf0e10cSrcweir 	if(mpGraphicObjectShapeAttrTokenMap) delete mpGraphicObjectShapeAttrTokenMap;
234cdf0e10cSrcweir */
235cdf0e10cSrcweir 	if(mpPolygonShapeAttrTokenMap) delete mpPolygonShapeAttrTokenMap;
236cdf0e10cSrcweir 	if(mpPathShapeAttrTokenMap) delete mpPathShapeAttrTokenMap;
237cdf0e10cSrcweir 	if(mp3DSceneShapeElemTokenMap) delete mp3DSceneShapeElemTokenMap;
238cdf0e10cSrcweir 	if(mp3DObjectAttrTokenMap) delete mp3DObjectAttrTokenMap;
239cdf0e10cSrcweir 	if(mp3DPolygonBasedAttrTokenMap) delete mp3DPolygonBasedAttrTokenMap;
240cdf0e10cSrcweir 	if(mp3DCubeObjectAttrTokenMap) delete mp3DCubeObjectAttrTokenMap;
241cdf0e10cSrcweir 	if(mp3DSphereObjectAttrTokenMap) delete mp3DSphereObjectAttrTokenMap;
242cdf0e10cSrcweir 	if(mp3DSceneShapeAttrTokenMap) delete mp3DSceneShapeAttrTokenMap;
243cdf0e10cSrcweir 	if(mp3DLightAttrTokenMap) delete mp3DLightAttrTokenMap;
244cdf0e10cSrcweir 
245cdf0e10cSrcweir 	// Styles or AutoStyles context?
246cdf0e10cSrcweir 	if(mpStylesContext)
247cdf0e10cSrcweir 	{
248cdf0e10cSrcweir 		mpStylesContext->Clear();
249cdf0e10cSrcweir 		mpStylesContext->ReleaseRef();
250cdf0e10cSrcweir 	}
251cdf0e10cSrcweir 
252cdf0e10cSrcweir 	if(mpAutoStylesContext)
253cdf0e10cSrcweir 	{
254cdf0e10cSrcweir 		mpAutoStylesContext->Clear();
255cdf0e10cSrcweir 		mpAutoStylesContext->ReleaseRef();
256cdf0e10cSrcweir 	}
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 	delete mpImpl;
259cdf0e10cSrcweir }
260cdf0e10cSrcweir 
261cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 
264cdf0e10cSrcweir 
GetGroupShapeElemTokenMap()265cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::GetGroupShapeElemTokenMap()
266cdf0e10cSrcweir {
267cdf0e10cSrcweir 	if(!mpGroupShapeElemTokenMap)
268cdf0e10cSrcweir     {
269cdf0e10cSrcweir         static __FAR_DATA SvXMLTokenMapEntry aGroupShapeElemTokenMap[] =
270cdf0e10cSrcweir {
271cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_G,				XML_TOK_GROUP_GROUP			},
272cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_RECT,			XML_TOK_GROUP_RECT			},
273cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_LINE,			XML_TOK_GROUP_LINE			},
274cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_CIRCLE,		    XML_TOK_GROUP_CIRCLE		},
275cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_ELLIPSE,		XML_TOK_GROUP_ELLIPSE		},
276cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_POLYGON,		XML_TOK_GROUP_POLYGON		},
277cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_POLYLINE,		XML_TOK_GROUP_POLYLINE		},
278cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_PATH,			XML_TOK_GROUP_PATH			},
279cdf0e10cSrcweir 
280cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_CONTROL,		XML_TOK_GROUP_CONTROL		},
281cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_CONNECTOR,		XML_TOK_GROUP_CONNECTOR		},
282cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_MEASURE,		XML_TOK_GROUP_MEASURE		},
283cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_PAGE_THUMBNAIL, XML_TOK_GROUP_PAGE			},
284cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_CAPTION,		XML_TOK_GROUP_CAPTION		},
285cdf0e10cSrcweir 
286cdf0e10cSrcweir 	{ XML_NAMESPACE_CHART,			XML_CHART,			XML_TOK_GROUP_CHART			},
287cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,			XML_SCENE,			XML_TOK_GROUP_3DSCENE		},
288cdf0e10cSrcweir 
289cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_FRAME, 			XML_TOK_GROUP_FRAME			},
290cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_CUSTOM_SHAPE,	XML_TOK_GROUP_CUSTOM_SHAPE	},
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_CUSTOM_SHAPE,	XML_TOK_GROUP_CUSTOM_SHAPE	},
293cdf0e10cSrcweir 	{ XML_NAMESPACE_OFFICE,			XML_ANNOTATION,		XML_TOK_GROUP_ANNOTATION	},
294cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_A,				XML_TOK_GROUP_A				},
295cdf0e10cSrcweir 
296cdf0e10cSrcweir     XML_TOKEN_MAP_END
297cdf0e10cSrcweir };
298cdf0e10cSrcweir 
299cdf0e10cSrcweir 		mpGroupShapeElemTokenMap = new SvXMLTokenMap(aGroupShapeElemTokenMap);
300cdf0e10cSrcweir     } // if(!mpGroupShapeElemTokenMap)
301cdf0e10cSrcweir 
302cdf0e10cSrcweir 	return *mpGroupShapeElemTokenMap;
303cdf0e10cSrcweir }
304cdf0e10cSrcweir 
GetFrameShapeElemTokenMap()305cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::GetFrameShapeElemTokenMap()
306cdf0e10cSrcweir {
307cdf0e10cSrcweir 	if(!mpFrameShapeElemTokenMap)
308cdf0e10cSrcweir     {
309cdf0e10cSrcweir         static __FAR_DATA SvXMLTokenMapEntry aFrameShapeElemTokenMap[] =
310cdf0e10cSrcweir {
311cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_TEXT_BOX,		XML_TOK_FRAME_TEXT_BOX		},
312cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_IMAGE,			XML_TOK_FRAME_IMAGE			},
313cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_OBJECT,		    XML_TOK_FRAME_OBJECT		},
314cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_OBJECT_OLE,	    XML_TOK_FRAME_OBJECT_OLE	},
315cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_PLUGIN,		    XML_TOK_FRAME_PLUGIN		},
316cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_FLOATING_FRAME, XML_TOK_FRAME_FLOATING_FRAME},
317cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_APPLET,		    XML_TOK_FRAME_APPLET		},
318cdf0e10cSrcweir 	{ XML_NAMESPACE_TABLE,			XML_TABLE,			XML_TOK_FRAME_TABLE			},
319cdf0e10cSrcweir 	XML_TOKEN_MAP_END
320cdf0e10cSrcweir };
321cdf0e10cSrcweir 
322cdf0e10cSrcweir 		mpFrameShapeElemTokenMap = new SvXMLTokenMap(aFrameShapeElemTokenMap);
323cdf0e10cSrcweir     } // if(!mpFrameShapeElemTokenMap)
324cdf0e10cSrcweir 
325cdf0e10cSrcweir 	return *mpFrameShapeElemTokenMap;
326cdf0e10cSrcweir }
327cdf0e10cSrcweir 
328cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
329cdf0e10cSrcweir 
330cdf0e10cSrcweir 
Get3DSceneShapeElemTokenMap()331cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::Get3DSceneShapeElemTokenMap()
332cdf0e10cSrcweir {
333cdf0e10cSrcweir 	if(!mp3DSceneShapeElemTokenMap)
334cdf0e10cSrcweir     {
335cdf0e10cSrcweir         static __FAR_DATA SvXMLTokenMapEntry a3DSceneShapeElemTokenMap[] =
336cdf0e10cSrcweir {
337cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,			XML_SCENE,		XML_TOK_3DSCENE_3DSCENE		},
338cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,			XML_CUBE,		XML_TOK_3DSCENE_3DCUBE		},
339cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,			XML_SPHERE,	    XML_TOK_3DSCENE_3DSPHERE	},
340cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,			XML_ROTATE,	    XML_TOK_3DSCENE_3DLATHE		},
341cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,			XML_EXTRUDE,	XML_TOK_3DSCENE_3DEXTRUDE	},
342cdf0e10cSrcweir 	XML_TOKEN_MAP_END
343cdf0e10cSrcweir };
344cdf0e10cSrcweir 
345cdf0e10cSrcweir 		mp3DSceneShapeElemTokenMap = new SvXMLTokenMap(a3DSceneShapeElemTokenMap);
346cdf0e10cSrcweir     } // if(!mp3DSceneShapeElemTokenMap)
347cdf0e10cSrcweir 
348cdf0e10cSrcweir 	return *mp3DSceneShapeElemTokenMap;
349cdf0e10cSrcweir }
350cdf0e10cSrcweir 
351cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
352cdf0e10cSrcweir /*
353cdf0e10cSrcweir 
354cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::GetShapeAttrTokenMap()
355cdf0e10cSrcweir {
356cdf0e10cSrcweir 	if(!mpShapeAttrTokenMap)
357cdf0e10cSrcweir     {
358cdf0e10cSrcweir     static __FAR_DATA SvXMLTokenMapEntry aShapeAttrTokenMap[] =
359cdf0e10cSrcweir {
360cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_NAME,				XML_TOK_SHAPE_NAME							},
361cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_STYLE_NAME,		    XML_TOK_SHAPE_DRAWSTYLE_NAME_GRAPHICS		},
362cdf0e10cSrcweir 	{ XML_NAMESPACE_PRESENTATION,	XML_CLASS,				XML_TOK_SHAPE_PRESENTATION_CLASS			},
363cdf0e10cSrcweir 	{ XML_NAMESPACE_PRESENTATION,	XML_STYLE_NAME,		    XML_TOK_SHAPE_DRAWSTYLE_NAME_PRESENTATION	},
364cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,			XML_TRANSFORM,			XML_TOK_SHAPE_TRANSFORM						},
365cdf0e10cSrcweir 	{ XML_NAMESPACE_PRESENTATION,	XML_PLACEHOLDER,		XML_TOK_SHAPE_IS_PLACEHOLDER				},
366cdf0e10cSrcweir 	{ XML_NAMESPACE_PRESENTATION,	XML_USER_TRANSFORMED,	XML_TOK_SHAPE_IS_USER_TRANSFORMED			},
367cdf0e10cSrcweir 	XML_TOKEN_MAP_END
368cdf0e10cSrcweir };
369cdf0e10cSrcweir 
370cdf0e10cSrcweir 		mpShapeAttrTokenMap = new SvXMLTokenMap(aShapeAttrTokenMap);
371cdf0e10cSrcweir         }
372cdf0e10cSrcweir 
373cdf0e10cSrcweir 	return *mpShapeAttrTokenMap;
374cdf0e10cSrcweir }
375cdf0e10cSrcweir */
376cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 
Get3DObjectAttrTokenMap()379cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::Get3DObjectAttrTokenMap()
380cdf0e10cSrcweir {
381cdf0e10cSrcweir 	if(!mp3DObjectAttrTokenMap)
382cdf0e10cSrcweir     {
383cdf0e10cSrcweir         static __FAR_DATA SvXMLTokenMapEntry a3DObjectAttrTokenMap[] =
384cdf0e10cSrcweir {
385cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,			XML_STYLE_NAME,		    XML_TOK_3DOBJECT_DRAWSTYLE_NAME		},
386cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,			XML_TRANSFORM,			XML_TOK_3DOBJECT_TRANSFORM			},
387cdf0e10cSrcweir 	XML_TOKEN_MAP_END
388cdf0e10cSrcweir };
389cdf0e10cSrcweir 
390cdf0e10cSrcweir 		mp3DObjectAttrTokenMap = new SvXMLTokenMap(a3DObjectAttrTokenMap);
391cdf0e10cSrcweir     } // if(!mp3DObjectAttrTokenMap)
392cdf0e10cSrcweir 
393cdf0e10cSrcweir 	return *mp3DObjectAttrTokenMap;
394cdf0e10cSrcweir }
395cdf0e10cSrcweir 
396cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
397cdf0e10cSrcweir 
398cdf0e10cSrcweir 
Get3DPolygonBasedAttrTokenMap()399cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::Get3DPolygonBasedAttrTokenMap()
400cdf0e10cSrcweir {
401cdf0e10cSrcweir 	if(!mp3DPolygonBasedAttrTokenMap)
402cdf0e10cSrcweir     {
403cdf0e10cSrcweir         static __FAR_DATA SvXMLTokenMapEntry a3DPolygonBasedAttrTokenMap[] =
404cdf0e10cSrcweir {
405cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,			XML_VIEWBOX,			XML_TOK_3DPOLYGONBASED_VIEWBOX		},
406cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,			XML_D,					XML_TOK_3DPOLYGONBASED_D			},
407cdf0e10cSrcweir 	XML_TOKEN_MAP_END
408cdf0e10cSrcweir };
409cdf0e10cSrcweir 
410cdf0e10cSrcweir 		mp3DPolygonBasedAttrTokenMap = new SvXMLTokenMap(a3DPolygonBasedAttrTokenMap);
411cdf0e10cSrcweir     } // if(!mp3DPolygonBasedAttrTokenMap)
412cdf0e10cSrcweir 
413cdf0e10cSrcweir 	return *mp3DPolygonBasedAttrTokenMap;
414cdf0e10cSrcweir }
415cdf0e10cSrcweir 
416cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
417cdf0e10cSrcweir 
418cdf0e10cSrcweir 
Get3DCubeObjectAttrTokenMap()419cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::Get3DCubeObjectAttrTokenMap()
420cdf0e10cSrcweir {
421cdf0e10cSrcweir 	if(!mp3DCubeObjectAttrTokenMap)
422cdf0e10cSrcweir     {
423cdf0e10cSrcweir         static __FAR_DATA SvXMLTokenMapEntry a3DCubeObjectAttrTokenMap[] =
424cdf0e10cSrcweir {
425cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,			XML_MIN_EDGE,			XML_TOK_3DCUBEOBJ_MINEDGE	},
426cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,			XML_MAX_EDGE,			XML_TOK_3DCUBEOBJ_MAXEDGE	},
427cdf0e10cSrcweir 	XML_TOKEN_MAP_END
428cdf0e10cSrcweir };
429cdf0e10cSrcweir 
430cdf0e10cSrcweir 		mp3DCubeObjectAttrTokenMap = new SvXMLTokenMap(a3DCubeObjectAttrTokenMap);
431cdf0e10cSrcweir     } // if(!mp3DCubeObjectAttrTokenMap)
432cdf0e10cSrcweir 
433cdf0e10cSrcweir 	return *mp3DCubeObjectAttrTokenMap;
434cdf0e10cSrcweir }
435cdf0e10cSrcweir 
436cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
437cdf0e10cSrcweir 
438cdf0e10cSrcweir 
Get3DSphereObjectAttrTokenMap()439cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::Get3DSphereObjectAttrTokenMap()
440cdf0e10cSrcweir {
441cdf0e10cSrcweir 	if(!mp3DSphereObjectAttrTokenMap)
442cdf0e10cSrcweir     {
443cdf0e10cSrcweir         static __FAR_DATA SvXMLTokenMapEntry a3DSphereObjectAttrTokenMap[] =
444cdf0e10cSrcweir {
445cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,			XML_CENTER, 			XML_TOK_3DSPHEREOBJ_CENTER	},
446cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,			XML_SIZE,				XML_TOK_3DSPHEREOBJ_SIZE	},
447cdf0e10cSrcweir 	XML_TOKEN_MAP_END
448cdf0e10cSrcweir };
449cdf0e10cSrcweir 
450cdf0e10cSrcweir 		mp3DSphereObjectAttrTokenMap = new SvXMLTokenMap(a3DSphereObjectAttrTokenMap);
451cdf0e10cSrcweir     } // if(!mp3DSphereObjectAttrTokenMap)
452cdf0e10cSrcweir 
453cdf0e10cSrcweir 	return *mp3DSphereObjectAttrTokenMap;
454cdf0e10cSrcweir }
455cdf0e10cSrcweir 
456cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
457cdf0e10cSrcweir /*
458cdf0e10cSrcweir 
459cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::GetRectShapeAttrTokenMap()
460cdf0e10cSrcweir {
461cdf0e10cSrcweir 	if(!mpRectShapeAttrTokenMap)
462cdf0e10cSrcweir     {
463cdf0e10cSrcweir     static __FAR_DATA SvXMLTokenMapEntry aRectShapeAttrTokenMap[] =
464cdf0e10cSrcweir {
465cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_X,					XML_TOK_RECTSHAPE_X					},
466cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_Y,					XML_TOK_RECTSHAPE_Y					},
467cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_WIDTH,				XML_TOK_RECTSHAPE_WIDTH				},
468cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_HEIGHT,			    XML_TOK_RECTSHAPE_HEIGHT			},
469cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,	XML_CORNER_RADIUS,		XML_TOK_RECTSHAPE_CORNER_RADIUS		},
470cdf0e10cSrcweir 	XML_TOKEN_MAP_END
471cdf0e10cSrcweir };
472cdf0e10cSrcweir 
473cdf0e10cSrcweir 		mpRectShapeAttrTokenMap = new SvXMLTokenMap(aRectShapeAttrTokenMap);
474cdf0e10cSrcweir         }
475cdf0e10cSrcweir 
476cdf0e10cSrcweir 	return *mpRectShapeAttrTokenMap;
477cdf0e10cSrcweir }
478cdf0e10cSrcweir 
479cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 
482cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::GetLineShapeAttrTokenMap()
483cdf0e10cSrcweir {
484cdf0e10cSrcweir 	if(!mpLineShapeAttrTokenMap)
485cdf0e10cSrcweir     {
486cdf0e10cSrcweir     static __FAR_DATA SvXMLTokenMapEntry aLineShapeAttrTokenMap[] =
487cdf0e10cSrcweir {
488cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_X1,             XML_TOK_LINESHAPE_X1				},
489cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_Y1,				XML_TOK_LINESHAPE_Y1				},
490cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_X2,				XML_TOK_LINESHAPE_X2				},
491cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_Y2,				XML_TOK_LINESHAPE_Y2				},
492cdf0e10cSrcweir 	XML_TOKEN_MAP_END
493cdf0e10cSrcweir };
494cdf0e10cSrcweir 
495cdf0e10cSrcweir 		mpLineShapeAttrTokenMap = new SvXMLTokenMap(aLineShapeAttrTokenMap);
496cdf0e10cSrcweir         }
497cdf0e10cSrcweir 
498cdf0e10cSrcweir 	return *mpLineShapeAttrTokenMap;
499cdf0e10cSrcweir }
500cdf0e10cSrcweir 
501cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
502cdf0e10cSrcweir 
503cdf0e10cSrcweir 
504cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::GetEllipseShapeAttrTokenMap()
505cdf0e10cSrcweir {
506cdf0e10cSrcweir 	if(!mpEllipseShapeAttrTokenMap)
507cdf0e10cSrcweir     {
508cdf0e10cSrcweir     static __FAR_DATA SvXMLTokenMapEntry aEllipseShapeAttrTokenMap[] =
509cdf0e10cSrcweir {
510cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_RX,				XML_TOK_ELLIPSESHAPE_RX				},
511cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_RY,				XML_TOK_ELLIPSESHAPE_RY				},
512cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_CX,				XML_TOK_ELLIPSESHAPE_CX				},
513cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_CY,				XML_TOK_ELLIPSESHAPE_CY				},
514cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_R,				XML_TOK_ELLIPSESHAPE_R				},
515cdf0e10cSrcweir 	XML_TOKEN_MAP_END
516cdf0e10cSrcweir };
517cdf0e10cSrcweir 
518cdf0e10cSrcweir 		mpEllipseShapeAttrTokenMap = new SvXMLTokenMap(aEllipseShapeAttrTokenMap);
519cdf0e10cSrcweir         }
520cdf0e10cSrcweir 
521cdf0e10cSrcweir 	return *mpEllipseShapeAttrTokenMap;
522cdf0e10cSrcweir }
523cdf0e10cSrcweir 
524cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
525cdf0e10cSrcweir */
526cdf0e10cSrcweir 
GetPolygonShapeAttrTokenMap()527cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::GetPolygonShapeAttrTokenMap()
528cdf0e10cSrcweir {
529cdf0e10cSrcweir 	if(!mpPolygonShapeAttrTokenMap)
530cdf0e10cSrcweir     {
531cdf0e10cSrcweir         static __FAR_DATA SvXMLTokenMapEntry aPolygonShapeAttrTokenMap[] =
532cdf0e10cSrcweir {
533cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_VIEWBOX,			XML_TOK_POLYGONSHAPE_VIEWBOX		},
534cdf0e10cSrcweir 	{ XML_NAMESPACE_DRAW,	XML_POINTS, 			XML_TOK_POLYGONSHAPE_POINTS			},
535cdf0e10cSrcweir 	XML_TOKEN_MAP_END
536cdf0e10cSrcweir };
537cdf0e10cSrcweir 
538cdf0e10cSrcweir 		mpPolygonShapeAttrTokenMap = new SvXMLTokenMap(aPolygonShapeAttrTokenMap);
539cdf0e10cSrcweir     } // if(!mpPolygonShapeAttrTokenMap)
540cdf0e10cSrcweir 
541cdf0e10cSrcweir 	return *mpPolygonShapeAttrTokenMap;
542cdf0e10cSrcweir }
543cdf0e10cSrcweir 
544cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
545cdf0e10cSrcweir 
546cdf0e10cSrcweir 
GetPathShapeAttrTokenMap()547cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::GetPathShapeAttrTokenMap()
548cdf0e10cSrcweir {
549cdf0e10cSrcweir 	if(!mpPathShapeAttrTokenMap)
550cdf0e10cSrcweir     {
551cdf0e10cSrcweir         static __FAR_DATA SvXMLTokenMapEntry aPathShapeAttrTokenMap[] =
552cdf0e10cSrcweir {
553cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_VIEWBOX,			XML_TOK_PATHSHAPE_VIEWBOX			},
554cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_D,					XML_TOK_PATHSHAPE_D					},
555cdf0e10cSrcweir 	XML_TOKEN_MAP_END
556cdf0e10cSrcweir };
557cdf0e10cSrcweir 
558cdf0e10cSrcweir 		mpPathShapeAttrTokenMap = new SvXMLTokenMap(aPathShapeAttrTokenMap);
559cdf0e10cSrcweir     } // if(!mpPathShapeAttrTokenMap)
560cdf0e10cSrcweir 
561cdf0e10cSrcweir 	return *mpPathShapeAttrTokenMap;
562cdf0e10cSrcweir }
563cdf0e10cSrcweir /*
564cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
565cdf0e10cSrcweir 
566cdf0e10cSrcweir 
567cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::GetTextBoxShapeAttrTokenMap()
568cdf0e10cSrcweir {
569cdf0e10cSrcweir 	if(!mpTextBoxShapeAttrTokenMap)
570cdf0e10cSrcweir     {
571cdf0e10cSrcweir     static __FAR_DATA SvXMLTokenMapEntry aTextBoxShapeAttrTokenMap[] =
572cdf0e10cSrcweir {
573cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_X,					XML_TOK_TEXTBOXSHAPE_X				},
574cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_Y,					XML_TOK_TEXTBOXSHAPE_Y				},
575cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_WIDTH,				XML_TOK_TEXTBOXSHAPE_WIDTH			},
576cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_HEIGHT,			    XML_TOK_TEXTBOXSHAPE_HEIGHT			},
577cdf0e10cSrcweir 	XML_TOKEN_MAP_END
578cdf0e10cSrcweir };
579cdf0e10cSrcweir 
580cdf0e10cSrcweir 		mpTextBoxShapeAttrTokenMap = new SvXMLTokenMap(aTextBoxShapeAttrTokenMap);
581cdf0e10cSrcweir         }
582cdf0e10cSrcweir 
583cdf0e10cSrcweir 	return *mpTextBoxShapeAttrTokenMap;
584cdf0e10cSrcweir }
585cdf0e10cSrcweir 
586cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
587cdf0e10cSrcweir 
588cdf0e10cSrcweir 
589cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::GetControlShapeAttrTokenMap()
590cdf0e10cSrcweir {
591cdf0e10cSrcweir 	if(!mpControlShapeAttrTokenMap)
592cdf0e10cSrcweir     {
593cdf0e10cSrcweir     static __FAR_DATA SvXMLTokenMapEntry aControlShapeAttrTokenMap[] =
594cdf0e10cSrcweir {
595cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_X,					XML_TOK_CONTROLSHAPE_X				},
596cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_Y,					XML_TOK_CONTROLSHAPE_Y				},
597cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_WIDTH,				XML_TOK_CONTROLSHAPE_WIDTH			},
598cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_HEIGHT,			    XML_TOK_CONTROLSHAPE_HEIGHT			},
599cdf0e10cSrcweir 	XML_TOKEN_MAP_END
600cdf0e10cSrcweir };
601cdf0e10cSrcweir 
602cdf0e10cSrcweir 		mpControlShapeAttrTokenMap = new SvXMLTokenMap(aControlShapeAttrTokenMap);
603cdf0e10cSrcweir         }
604cdf0e10cSrcweir 
605cdf0e10cSrcweir 	return *mpControlShapeAttrTokenMap;
606cdf0e10cSrcweir }
607cdf0e10cSrcweir */
608cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
609cdf0e10cSrcweir 
610cdf0e10cSrcweir 
Get3DSceneShapeAttrTokenMap()611cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::Get3DSceneShapeAttrTokenMap()
612cdf0e10cSrcweir {
613cdf0e10cSrcweir 	if(!mp3DSceneShapeAttrTokenMap)
614cdf0e10cSrcweir     {
615cdf0e10cSrcweir         static __FAR_DATA SvXMLTokenMapEntry a3DSceneShapeAttrTokenMap[] =
616cdf0e10cSrcweir {
617cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_TRANSFORM,			XML_TOK_3DSCENESHAPE_TRANSFORM		},
618cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_VRP,				XML_TOK_3DSCENESHAPE_VRP			},
619cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_VPN,				XML_TOK_3DSCENESHAPE_VPN			},
620cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_VUP,				XML_TOK_3DSCENESHAPE_VUP			},
621cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_PROJECTION,		    XML_TOK_3DSCENESHAPE_PROJECTION		},
622cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_DISTANCE,			XML_TOK_3DSCENESHAPE_DISTANCE		},
623cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_FOCAL_LENGTH,		XML_TOK_3DSCENESHAPE_FOCAL_LENGTH	},
624cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_SHADOW_SLANT,		XML_TOK_3DSCENESHAPE_SHADOW_SLANT	},
625cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_SHADE_MODE,		    XML_TOK_3DSCENESHAPE_SHADE_MODE		},
626cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_AMBIENT_COLOR,		XML_TOK_3DSCENESHAPE_AMBIENT_COLOR	},
627cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_LIGHTING_MODE,		XML_TOK_3DSCENESHAPE_LIGHTING_MODE	},
628cdf0e10cSrcweir 	XML_TOKEN_MAP_END
629cdf0e10cSrcweir };
630cdf0e10cSrcweir 
631cdf0e10cSrcweir 		mp3DSceneShapeAttrTokenMap = new SvXMLTokenMap(a3DSceneShapeAttrTokenMap);
632cdf0e10cSrcweir     } // if(!mp3DSceneShapeAttrTokenMap)
633cdf0e10cSrcweir 
634cdf0e10cSrcweir 	return *mp3DSceneShapeAttrTokenMap;
635cdf0e10cSrcweir }
636cdf0e10cSrcweir 
637cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
638cdf0e10cSrcweir 
639cdf0e10cSrcweir 
Get3DLightAttrTokenMap()640cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::Get3DLightAttrTokenMap()
641cdf0e10cSrcweir {
642cdf0e10cSrcweir 	if(!mp3DLightAttrTokenMap)
643cdf0e10cSrcweir     {
644cdf0e10cSrcweir         static __FAR_DATA SvXMLTokenMapEntry a3DLightAttrTokenMap[] =
645cdf0e10cSrcweir {
646cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_DIFFUSE_COLOR,		XML_TOK_3DLIGHT_DIFFUSE_COLOR		},
647cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_DIRECTION,			XML_TOK_3DLIGHT_DIRECTION			},
648cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_ENABLED,			XML_TOK_3DLIGHT_ENABLED				},
649cdf0e10cSrcweir 	{ XML_NAMESPACE_DR3D,	XML_SPECULAR,			XML_TOK_3DLIGHT_SPECULAR			},
650cdf0e10cSrcweir 	XML_TOKEN_MAP_END
651cdf0e10cSrcweir };
652cdf0e10cSrcweir 
653cdf0e10cSrcweir 		mp3DLightAttrTokenMap = new SvXMLTokenMap(a3DLightAttrTokenMap);
654cdf0e10cSrcweir     } // if(!mp3DLightAttrTokenMap)
655cdf0e10cSrcweir 
656cdf0e10cSrcweir 	return *mp3DLightAttrTokenMap;
657cdf0e10cSrcweir }
658cdf0e10cSrcweir 
659cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
660cdf0e10cSrcweir /*
661cdf0e10cSrcweir 
662cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::GetPageShapeAttrTokenMap()
663cdf0e10cSrcweir {
664cdf0e10cSrcweir 	if(!mpPageShapeAttrTokenMap)
665cdf0e10cSrcweir     {
666cdf0e10cSrcweir     static __FAR_DATA SvXMLTokenMapEntry aPageShapeAttrTokenMap[] =
667cdf0e10cSrcweir {
668cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_X,					XML_TOK_PAGESHAPE_X				},
669cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_Y,					XML_TOK_PAGESHAPE_Y				},
670cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_WIDTH,				XML_TOK_PAGESHAPE_WIDTH			},
671cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_HEIGHT,			    XML_TOK_PAGESHAPE_HEIGHT		},
672cdf0e10cSrcweir 	XML_TOKEN_MAP_END
673cdf0e10cSrcweir };
674cdf0e10cSrcweir 
675cdf0e10cSrcweir 		mpPageShapeAttrTokenMap = new SvXMLTokenMap(aPageShapeAttrTokenMap);
676cdf0e10cSrcweir         }
677cdf0e10cSrcweir 
678cdf0e10cSrcweir 	return *mpPageShapeAttrTokenMap;
679cdf0e10cSrcweir }
680cdf0e10cSrcweir 
681cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
682cdf0e10cSrcweir 
683cdf0e10cSrcweir 
684cdf0e10cSrcweir const SvXMLTokenMap& XMLShapeImportHelper::GetGraphicObjectShapeAttrTokenMap()
685cdf0e10cSrcweir {
686cdf0e10cSrcweir 	if(!mpGraphicObjectShapeAttrTokenMap)
687cdf0e10cSrcweir     {
688cdf0e10cSrcweir     static __FAR_DATA SvXMLTokenMapEntry aGraphicObjectShapeAttrTokenMap[] =
689cdf0e10cSrcweir {
690cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_X,					XML_TOK_GOSHAPE_X					},
691cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_Y,					XML_TOK_GOSHAPE_Y					},
692cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_WIDTH,				XML_TOK_GOSHAPE_WIDTH				},
693cdf0e10cSrcweir 	{ XML_NAMESPACE_SVG,	XML_HEIGHT, 			XML_TOK_GOSHAPE_HEIGHT				},
694cdf0e10cSrcweir 	{ XML_NAMESPACE_XLINK,	XML_HREF,				XML_TOK_GOSHAPE_URL					},
695cdf0e10cSrcweir 	XML_TOKEN_MAP_END
696cdf0e10cSrcweir };
697cdf0e10cSrcweir 
698cdf0e10cSrcweir 		mpGraphicObjectShapeAttrTokenMap = new SvXMLTokenMap(aGraphicObjectShapeAttrTokenMap);
699cdf0e10cSrcweir         }
700cdf0e10cSrcweir 
701cdf0e10cSrcweir 	return *mpGraphicObjectShapeAttrTokenMap;
702cdf0e10cSrcweir }
703cdf0e10cSrcweir */
704cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
705cdf0e10cSrcweir 
Create3DSceneChildContext(SvXMLImport & rImport,sal_uInt16 p_nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes)706cdf0e10cSrcweir SvXMLShapeContext* XMLShapeImportHelper::Create3DSceneChildContext(
707cdf0e10cSrcweir 	SvXMLImport& rImport,
708cdf0e10cSrcweir 	sal_uInt16 p_nPrefix,
709cdf0e10cSrcweir 	const OUString& rLocalName,
710cdf0e10cSrcweir 	const uno::Reference< xml::sax::XAttributeList>& xAttrList,
711cdf0e10cSrcweir 	uno::Reference< drawing::XShapes >& rShapes)
712cdf0e10cSrcweir {
713cdf0e10cSrcweir 	SdXMLShapeContext *pContext = 0L;
714cdf0e10cSrcweir 
715cdf0e10cSrcweir 	if(rShapes.is())
716cdf0e10cSrcweir 	{
717cdf0e10cSrcweir 		const SvXMLTokenMap& rTokenMap = Get3DSceneShapeElemTokenMap();
718cdf0e10cSrcweir 		switch(rTokenMap.Get(p_nPrefix, rLocalName))
719cdf0e10cSrcweir 		{
720cdf0e10cSrcweir 			case XML_TOK_3DSCENE_3DSCENE:
721cdf0e10cSrcweir 			{
722cdf0e10cSrcweir 				// dr3d:3dscene inside dr3d:3dscene context
723cdf0e10cSrcweir 				pContext = new SdXML3DSceneShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, sal_False);
724cdf0e10cSrcweir 				break;
725cdf0e10cSrcweir 			}
726cdf0e10cSrcweir 			case XML_TOK_3DSCENE_3DCUBE:
727cdf0e10cSrcweir 			{
728cdf0e10cSrcweir 				// dr3d:3dcube inside dr3d:3dscene context
729cdf0e10cSrcweir 				pContext = new SdXML3DCubeObjectShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, sal_False);
730cdf0e10cSrcweir 				break;
731cdf0e10cSrcweir 			}
732cdf0e10cSrcweir 			case XML_TOK_3DSCENE_3DSPHERE:
733cdf0e10cSrcweir 			{
734cdf0e10cSrcweir 				// dr3d:3dsphere inside dr3d:3dscene context
735cdf0e10cSrcweir 				pContext = new SdXML3DSphereObjectShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, sal_False);
736cdf0e10cSrcweir 				break;
737cdf0e10cSrcweir 			}
738cdf0e10cSrcweir 			case XML_TOK_3DSCENE_3DLATHE:
739cdf0e10cSrcweir 			{
740cdf0e10cSrcweir 				// dr3d:3dlathe inside dr3d:3dscene context
741cdf0e10cSrcweir 				pContext = new SdXML3DLatheObjectShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, sal_False);
742cdf0e10cSrcweir 				break;
743cdf0e10cSrcweir 			}
744cdf0e10cSrcweir 			case XML_TOK_3DSCENE_3DEXTRUDE:
745cdf0e10cSrcweir 			{
746cdf0e10cSrcweir 				// dr3d:3dextrude inside dr3d:3dscene context
747cdf0e10cSrcweir 				pContext = new SdXML3DExtrudeObjectShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, sal_False);
748cdf0e10cSrcweir 				break;
749cdf0e10cSrcweir 			}
750cdf0e10cSrcweir 		}
751cdf0e10cSrcweir 	}
752cdf0e10cSrcweir 
753cdf0e10cSrcweir 	// now parse the attribute list and call the child context for each unknown attribute
754cdf0e10cSrcweir 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
755cdf0e10cSrcweir 	for(sal_Int16 a(0); a < nAttrCount; a++)
756cdf0e10cSrcweir 	{
757cdf0e10cSrcweir 		const OUString& rAttrName = xAttrList->getNameByIndex(a);
758cdf0e10cSrcweir 		OUString aLocalName;
759cdf0e10cSrcweir 		sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName);
760cdf0e10cSrcweir 		const OUString aValue( xAttrList->getValueByIndex(a) );
761cdf0e10cSrcweir 
762cdf0e10cSrcweir 		pContext->processAttribute( nPrefix, aLocalName, aValue );
763cdf0e10cSrcweir 	}
764cdf0e10cSrcweir 
765cdf0e10cSrcweir 	return pContext;
766cdf0e10cSrcweir }
767cdf0e10cSrcweir 
768cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
769cdf0e10cSrcweir 
SetStylesContext(SvXMLStylesContext * pNew)770cdf0e10cSrcweir void XMLShapeImportHelper::SetStylesContext(SvXMLStylesContext* pNew)
771cdf0e10cSrcweir {
772cdf0e10cSrcweir 	mpStylesContext = pNew;
773cdf0e10cSrcweir 	mpStylesContext->AddRef();
774cdf0e10cSrcweir }
775cdf0e10cSrcweir 
776cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
777cdf0e10cSrcweir 
SetAutoStylesContext(SvXMLStylesContext * pNew)778cdf0e10cSrcweir void XMLShapeImportHelper::SetAutoStylesContext(SvXMLStylesContext* pNew)
779cdf0e10cSrcweir {
780cdf0e10cSrcweir 	mpAutoStylesContext = pNew;
781cdf0e10cSrcweir 	mpAutoStylesContext->AddRef();
782cdf0e10cSrcweir }
783cdf0e10cSrcweir 
784cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
785cdf0e10cSrcweir 
CreateGroupChildContext(SvXMLImport & rImport,sal_uInt16 p_nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)786cdf0e10cSrcweir SvXMLShapeContext* XMLShapeImportHelper::CreateGroupChildContext(
787cdf0e10cSrcweir 	SvXMLImport& rImport,
788cdf0e10cSrcweir 	sal_uInt16 p_nPrefix,
789cdf0e10cSrcweir 	const OUString& rLocalName,
790cdf0e10cSrcweir 	const uno::Reference< xml::sax::XAttributeList>& xAttrList,
791cdf0e10cSrcweir 	uno::Reference< drawing::XShapes >& rShapes,
792cdf0e10cSrcweir     sal_Bool bTemporaryShape)
793cdf0e10cSrcweir {
794cdf0e10cSrcweir 	SdXMLShapeContext *pContext = 0L;
795cdf0e10cSrcweir 
796cdf0e10cSrcweir 	const SvXMLTokenMap& rTokenMap = GetGroupShapeElemTokenMap();
797cdf0e10cSrcweir 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
798cdf0e10cSrcweir 
799cdf0e10cSrcweir 	switch(rTokenMap.Get(p_nPrefix, rLocalName))
800cdf0e10cSrcweir 	{
801cdf0e10cSrcweir 		case XML_TOK_GROUP_GROUP:
802cdf0e10cSrcweir 		{
803cdf0e10cSrcweir 			// draw:g inside group context (RECURSIVE)
804cdf0e10cSrcweir 			pContext = new SdXMLGroupShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape);
805cdf0e10cSrcweir 			break;
806cdf0e10cSrcweir 		}
807cdf0e10cSrcweir 		case XML_TOK_GROUP_3DSCENE:
808cdf0e10cSrcweir 		{
809cdf0e10cSrcweir 			// dr3d:3dscene inside group context
810cdf0e10cSrcweir 			pContext = new SdXML3DSceneShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape);
811cdf0e10cSrcweir 			break;
812cdf0e10cSrcweir 		}
813cdf0e10cSrcweir 		case XML_TOK_GROUP_RECT:
814cdf0e10cSrcweir 		{
815cdf0e10cSrcweir 			// draw:rect inside group context
816cdf0e10cSrcweir 			pContext = new SdXMLRectShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape );
817cdf0e10cSrcweir 			break;
818cdf0e10cSrcweir 		}
819cdf0e10cSrcweir 		case XML_TOK_GROUP_LINE:
820cdf0e10cSrcweir 		{
821cdf0e10cSrcweir 			// draw:line inside group context
822cdf0e10cSrcweir 			pContext = new SdXMLLineShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape );
823cdf0e10cSrcweir 			break;
824cdf0e10cSrcweir 		}
825cdf0e10cSrcweir 		case XML_TOK_GROUP_CIRCLE:
826cdf0e10cSrcweir 		case XML_TOK_GROUP_ELLIPSE:
827cdf0e10cSrcweir 		{
828cdf0e10cSrcweir 			// draw:circle or draw:ellipse inside group context
829cdf0e10cSrcweir 			pContext = new SdXMLEllipseShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape );
830cdf0e10cSrcweir 			break;
831cdf0e10cSrcweir 		}
832cdf0e10cSrcweir 		case XML_TOK_GROUP_POLYGON:
833cdf0e10cSrcweir 		case XML_TOK_GROUP_POLYLINE:
834cdf0e10cSrcweir 		{
835cdf0e10cSrcweir 			// draw:polygon or draw:polyline inside group context
836cdf0e10cSrcweir 			pContext = new SdXMLPolygonShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes,
837cdf0e10cSrcweir 				rTokenMap.Get(p_nPrefix, rLocalName) == XML_TOK_GROUP_POLYGON ? sal_True : sal_False, bTemporaryShape );
838cdf0e10cSrcweir 			break;
839cdf0e10cSrcweir 		}
840cdf0e10cSrcweir 		case XML_TOK_GROUP_PATH:
841cdf0e10cSrcweir 		{
842cdf0e10cSrcweir 			// draw:path inside group context
843cdf0e10cSrcweir 			pContext = new SdXMLPathShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape);
844cdf0e10cSrcweir 			break;
845cdf0e10cSrcweir 		}
846cdf0e10cSrcweir 		case XML_TOK_GROUP_FRAME:
847cdf0e10cSrcweir 		{
848cdf0e10cSrcweir 			// text:text-box inside group context
849cdf0e10cSrcweir 			pContext = new SdXMLFrameShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape );
850cdf0e10cSrcweir 			break;
851cdf0e10cSrcweir 		}
852cdf0e10cSrcweir 		case XML_TOK_GROUP_CONTROL:
853cdf0e10cSrcweir 		{
854cdf0e10cSrcweir 			// draw:control inside group context
855cdf0e10cSrcweir 			pContext = new SdXMLControlShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape );
856cdf0e10cSrcweir 			break;
857cdf0e10cSrcweir 		}
858cdf0e10cSrcweir 		case XML_TOK_GROUP_CONNECTOR:
859cdf0e10cSrcweir 		{
860cdf0e10cSrcweir 			// draw:connector inside group context
861cdf0e10cSrcweir 			pContext = new SdXMLConnectorShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape );
862cdf0e10cSrcweir 			break;
863cdf0e10cSrcweir 		}
864cdf0e10cSrcweir 		case XML_TOK_GROUP_MEASURE:
865cdf0e10cSrcweir 		{
866cdf0e10cSrcweir 			// draw:measure inside group context
867cdf0e10cSrcweir 			pContext = new SdXMLMeasureShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape );
868cdf0e10cSrcweir 			break;
869cdf0e10cSrcweir 		}
870cdf0e10cSrcweir 		case XML_TOK_GROUP_PAGE:
871cdf0e10cSrcweir 		{
872cdf0e10cSrcweir 			// draw:page inside group context
873cdf0e10cSrcweir 			pContext = new SdXMLPageShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape );
874cdf0e10cSrcweir 			break;
875cdf0e10cSrcweir 		}
876cdf0e10cSrcweir 		case XML_TOK_GROUP_CAPTION:
877cdf0e10cSrcweir         case XML_TOK_GROUP_ANNOTATION:
878cdf0e10cSrcweir 		{
879cdf0e10cSrcweir 			// draw:caption inside group context
880cdf0e10cSrcweir 			pContext = new SdXMLCaptionShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape );
881cdf0e10cSrcweir 			break;
882cdf0e10cSrcweir 		}
883cdf0e10cSrcweir 		case XML_TOK_GROUP_CHART:
884cdf0e10cSrcweir 		{
885cdf0e10cSrcweir 			// chart:chart inside group context
886cdf0e10cSrcweir 			pContext = new SdXMLChartShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, bTemporaryShape );
887cdf0e10cSrcweir 			break;
888cdf0e10cSrcweir 		}
889cdf0e10cSrcweir 		case XML_TOK_GROUP_CUSTOM_SHAPE:
890cdf0e10cSrcweir 		{
891cdf0e10cSrcweir 			// draw:customshape
892cdf0e10cSrcweir 			pContext = new SdXMLCustomShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, sal_False );
893cdf0e10cSrcweir 			break;
894cdf0e10cSrcweir 		}
895cdf0e10cSrcweir  		case XML_TOK_GROUP_A:
896cdf0e10cSrcweir  		{
897cdf0e10cSrcweir  			return new SdXMLShapeLinkContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes );
898cdf0e10cSrcweir  		}
899cdf0e10cSrcweir 		// add other shapes here...
900cdf0e10cSrcweir 		default:
901cdf0e10cSrcweir 			return new SvXMLShapeContext( rImport, p_nPrefix, rLocalName, bTemporaryShape );
902cdf0e10cSrcweir 	}
903cdf0e10cSrcweir 
904cdf0e10cSrcweir 	// now parse the attribute list and call the child context for each unknown attribute
905cdf0e10cSrcweir 	for(sal_Int16 a(0); a < nAttrCount; a++)
906cdf0e10cSrcweir 	{
907cdf0e10cSrcweir 		const OUString& rAttrName = xAttrList->getNameByIndex(a);
908cdf0e10cSrcweir 		OUString aLocalName;
909cdf0e10cSrcweir 		sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName);
910cdf0e10cSrcweir 		const OUString aValue( xAttrList->getValueByIndex(a) );
911cdf0e10cSrcweir 
912cdf0e10cSrcweir 		pContext->processAttribute( nPrefix, aLocalName, aValue );
913cdf0e10cSrcweir 	}
914cdf0e10cSrcweir 
915cdf0e10cSrcweir 	return pContext;
916cdf0e10cSrcweir }
917cdf0e10cSrcweir 
918cdf0e10cSrcweir // This method is called from SdXMLFrameContext to create children of drawe:frame
CreateFrameChildContext(SvXMLImport & rImport,sal_uInt16 p_nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & rAttrList,uno::Reference<drawing::XShapes> & rShapes,const uno::Reference<xml::sax::XAttributeList> & rFrameAttrList)919cdf0e10cSrcweir SvXMLShapeContext* XMLShapeImportHelper::CreateFrameChildContext(
920cdf0e10cSrcweir 	SvXMLImport& rImport,
921cdf0e10cSrcweir 	sal_uInt16 p_nPrefix,
922cdf0e10cSrcweir 	const OUString& rLocalName,
923cdf0e10cSrcweir 	const uno::Reference< xml::sax::XAttributeList>& rAttrList,
924cdf0e10cSrcweir 	uno::Reference< drawing::XShapes >& rShapes,
925cdf0e10cSrcweir 	const uno::Reference< xml::sax::XAttributeList>& rFrameAttrList)
926cdf0e10cSrcweir {
927cdf0e10cSrcweir 	SdXMLShapeContext *pContext = 0L;
928cdf0e10cSrcweir 
929cdf0e10cSrcweir 	const SvXMLTokenMap& rTokenMap = GetFrameShapeElemTokenMap();
930cdf0e10cSrcweir 
931cdf0e10cSrcweir 	SvXMLAttributeList *pAttrList = new SvXMLAttributeList( rAttrList );
932cdf0e10cSrcweir 	if( rFrameAttrList.is() )
933cdf0e10cSrcweir 		pAttrList->AppendAttributeList( rFrameAttrList );
934cdf0e10cSrcweir 	uno::Reference < xml::sax::XAttributeList > xAttrList = pAttrList;
935cdf0e10cSrcweir 
936cdf0e10cSrcweir 
937cdf0e10cSrcweir 	switch(rTokenMap.Get(p_nPrefix, rLocalName))
938cdf0e10cSrcweir 	{
939cdf0e10cSrcweir 		case XML_TOK_FRAME_TEXT_BOX:
940cdf0e10cSrcweir 		{
941cdf0e10cSrcweir 			// text:text-box inside group context
942cdf0e10cSrcweir 			pContext = new SdXMLTextBoxShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, sal_False );
943cdf0e10cSrcweir 			break;
944cdf0e10cSrcweir 		}
945cdf0e10cSrcweir 		case XML_TOK_FRAME_IMAGE:
946cdf0e10cSrcweir 		{
947cdf0e10cSrcweir 			// office:image inside group context
948cdf0e10cSrcweir 			pContext = new SdXMLGraphicObjectShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, sal_False );
949cdf0e10cSrcweir 			break;
950cdf0e10cSrcweir 		}
951cdf0e10cSrcweir 		case XML_TOK_FRAME_OBJECT:
952cdf0e10cSrcweir 		case XML_TOK_FRAME_OBJECT_OLE:
953cdf0e10cSrcweir 		{
954cdf0e10cSrcweir 			// draw:object or draw:object_ole
955cdf0e10cSrcweir 			pContext = new SdXMLObjectShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, sal_False );
956cdf0e10cSrcweir 			break;
957cdf0e10cSrcweir 		}
958cdf0e10cSrcweir 		case XML_TOK_FRAME_TABLE:
959cdf0e10cSrcweir 		{
960cdf0e10cSrcweir 			// draw:object or draw:object_ole
961cdf0e10cSrcweir 			if( rImport.IsTableShapeSupported() )
962cdf0e10cSrcweir 				pContext = new SdXMLTableShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes );
963cdf0e10cSrcweir 			break;
964cdf0e10cSrcweir 
965cdf0e10cSrcweir 		}
966cdf0e10cSrcweir 		case XML_TOK_FRAME_PLUGIN:
967cdf0e10cSrcweir 		{
968cdf0e10cSrcweir 			// draw:plugin
969cdf0e10cSrcweir 			pContext = new SdXMLPluginShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, sal_False );
970cdf0e10cSrcweir 			break;
971cdf0e10cSrcweir 		}
972cdf0e10cSrcweir 		case XML_TOK_FRAME_FLOATING_FRAME:
973cdf0e10cSrcweir 		{
974cdf0e10cSrcweir 			// draw:floating-frame
975cdf0e10cSrcweir 			pContext = new SdXMLFloatingFrameShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, sal_False );
976cdf0e10cSrcweir 			break;
977cdf0e10cSrcweir 		}
978cdf0e10cSrcweir 		case XML_TOK_FRAME_APPLET:
979cdf0e10cSrcweir 		{
980cdf0e10cSrcweir 			// draw:applet
981cdf0e10cSrcweir 			pContext = new SdXMLAppletShapeContext( rImport, p_nPrefix, rLocalName, xAttrList, rShapes, sal_False );
982cdf0e10cSrcweir 			break;
983cdf0e10cSrcweir 		}
984cdf0e10cSrcweir 		// add other shapes here...
985cdf0e10cSrcweir 		default:
986cdf0e10cSrcweir 			break;
987cdf0e10cSrcweir 	}
988cdf0e10cSrcweir 
989cdf0e10cSrcweir 	if( pContext )
990cdf0e10cSrcweir 	{
991cdf0e10cSrcweir 		// now parse the attribute list and call the child context for each unknown attribute
992cdf0e10cSrcweir 		sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
993cdf0e10cSrcweir 		for(sal_Int16 a(0); a < nAttrCount; a++)
994cdf0e10cSrcweir 		{
995cdf0e10cSrcweir 			const OUString& rAttrName = xAttrList->getNameByIndex(a);
996cdf0e10cSrcweir 			OUString aLocalName;
997cdf0e10cSrcweir 			sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName);
998cdf0e10cSrcweir 			const OUString aValue( xAttrList->getValueByIndex(a) );
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir 			pContext->processAttribute( nPrefix, aLocalName, aValue );
1001cdf0e10cSrcweir 		}
1002cdf0e10cSrcweir 	}
1003cdf0e10cSrcweir 
1004cdf0e10cSrcweir 	return pContext;
1005cdf0e10cSrcweir }
1006cdf0e10cSrcweir 
CreateFrameChildContext(SvXMLImportContext * pThisContext,sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)1007cdf0e10cSrcweir SvXMLImportContext *XMLShapeImportHelper::CreateFrameChildContext(
1008cdf0e10cSrcweir 	SvXMLImportContext *pThisContext,
1009cdf0e10cSrcweir 	sal_uInt16 nPrefix,
1010cdf0e10cSrcweir 	const OUString& rLocalName,
1011cdf0e10cSrcweir 	const uno::Reference< xml::sax::XAttributeList>& xAttrList )
1012cdf0e10cSrcweir {
1013cdf0e10cSrcweir 	SvXMLImportContext * pContext = NULL;
1014cdf0e10cSrcweir 
1015cdf0e10cSrcweir 	SdXMLFrameShapeContext *pFrameContext = PTR_CAST( SdXMLFrameShapeContext, pThisContext );
1016cdf0e10cSrcweir 	if( pFrameContext )
1017cdf0e10cSrcweir 		pContext = pFrameContext->CreateChildContext( nPrefix, rLocalName, xAttrList );
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir 	return pContext;
1020cdf0e10cSrcweir }
1021cdf0e10cSrcweir 
1022cdf0e10cSrcweir 
1023cdf0e10cSrcweir /** this function is called whenever the implementation classes like to add this new
1024cdf0e10cSrcweir 	shape to the given XShapes.
1025cdf0e10cSrcweir */
addShape(uno::Reference<drawing::XShape> & rShape,const uno::Reference<xml::sax::XAttributeList> &,uno::Reference<drawing::XShapes> & rShapes)1026cdf0e10cSrcweir void XMLShapeImportHelper::addShape( uno::Reference< drawing::XShape >& rShape,
1027cdf0e10cSrcweir 									 const uno::Reference< xml::sax::XAttributeList >&,
1028cdf0e10cSrcweir 									 uno::Reference< drawing::XShapes >& rShapes)
1029cdf0e10cSrcweir {
1030cdf0e10cSrcweir 	if( rShape.is() && rShapes.is() )
1031cdf0e10cSrcweir 	{
1032cdf0e10cSrcweir 		// add new shape to parent
1033cdf0e10cSrcweir 		rShapes->add( rShape );
1034cdf0e10cSrcweir 	}
1035cdf0e10cSrcweir }
1036cdf0e10cSrcweir 
1037cdf0e10cSrcweir /** this function is called whenever the implementation classes have finished importing
1038cdf0e10cSrcweir 	a shape to the given XShapes. The shape is already inserted into its XShapes and
1039cdf0e10cSrcweir 	all properties and styles are set.
1040cdf0e10cSrcweir */
finishShape(com::sun::star::uno::Reference<com::sun::star::drawing::XShape> & rShape,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> &,com::sun::star::uno::Reference<com::sun::star::drawing::XShapes> &)1041cdf0e10cSrcweir void XMLShapeImportHelper::finishShape(
1042cdf0e10cSrcweir 		com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& rShape,
1043cdf0e10cSrcweir 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >&,
1044cdf0e10cSrcweir 		com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >&)
1045cdf0e10cSrcweir {
1046cdf0e10cSrcweir     // --> OD 2004-08-10 #i28749#, #i36248# - set property <PositionLayoutDir>
1047cdf0e10cSrcweir     // to <PositionInHoriL2R>, if it exists and the import states that
1048cdf0e10cSrcweir     // the shape positioning attributes are in horizontal left-to-right
1049cdf0e10cSrcweir     // layout. This is the case for the OpenOffice.org file format.
1050cdf0e10cSrcweir     // This setting is done for Writer documents, because the property
1051cdf0e10cSrcweir     // only exists at service com::sun::star::text::Shape - the Writer
1052cdf0e10cSrcweir     // UNO service for shapes.
1053cdf0e10cSrcweir     // The value indicates that the positioning attributes are given
1054cdf0e10cSrcweir     // in horizontal left-to-right layout. The property is evaluated
1055cdf0e10cSrcweir     // during the first positioning of the shape in order to convert
1056cdf0e10cSrcweir     // the shape position given in the OpenOffice.org file format to
1057cdf0e10cSrcweir     // the one for the OASIS Open Office file format.
1058cdf0e10cSrcweir     uno::Reference< beans::XPropertySet > xPropSet(rShape, uno::UNO_QUERY);
1059cdf0e10cSrcweir     if ( xPropSet.is() )
1060cdf0e10cSrcweir     {
1061cdf0e10cSrcweir         if ( mrImporter.IsShapePositionInHoriL2R() &&
1062cdf0e10cSrcweir              xPropSet->getPropertySetInfo()->hasPropertyByName(
1063cdf0e10cSrcweir                 OUString(RTL_CONSTASCII_USTRINGPARAM("PositionLayoutDir"))) )
1064cdf0e10cSrcweir         {
1065cdf0e10cSrcweir             uno::Any aPosLayoutDir;
1066cdf0e10cSrcweir             aPosLayoutDir <<= text::PositionLayoutDir::PositionInHoriL2R;
1067cdf0e10cSrcweir             xPropSet->setPropertyValue(
1068cdf0e10cSrcweir                 OUString(RTL_CONSTASCII_USTRINGPARAM("PositionLayoutDir")),
1069cdf0e10cSrcweir                 aPosLayoutDir );
1070cdf0e10cSrcweir         }
1071cdf0e10cSrcweir     }
1072cdf0e10cSrcweir     // <--
1073cdf0e10cSrcweir }
1074cdf0e10cSrcweir 
1075cdf0e10cSrcweir // helper functions for z-order sorting
1076cdf0e10cSrcweir struct ZOrderHint
1077cdf0e10cSrcweir {
1078cdf0e10cSrcweir 	sal_Int32 nIs;
1079cdf0e10cSrcweir 	sal_Int32 nShould;
1080cdf0e10cSrcweir 
operator <ZOrderHint1081cdf0e10cSrcweir 	int operator<(const ZOrderHint& rComp) const { return nShould < rComp.nShould; }
1082cdf0e10cSrcweir };
1083cdf0e10cSrcweir 
1084cdf0e10cSrcweir class ShapeSortContext
1085cdf0e10cSrcweir {
1086cdf0e10cSrcweir public:
1087cdf0e10cSrcweir 	uno::Reference< drawing::XShapes > mxShapes;
1088cdf0e10cSrcweir 	list<ZOrderHint>			  maZOrderList;
1089cdf0e10cSrcweir 	list<ZOrderHint>			  maUnsortedList;
1090cdf0e10cSrcweir 
1091cdf0e10cSrcweir 	sal_Int32					  mnCurrentZ;
1092cdf0e10cSrcweir 	ShapeSortContext*			  mpParentContext;
1093cdf0e10cSrcweir 	const OUString				  msZOrder;
1094cdf0e10cSrcweir 
1095cdf0e10cSrcweir 	ShapeSortContext( uno::Reference< drawing::XShapes >& rShapes, ShapeSortContext* pParentContext = NULL );
1096cdf0e10cSrcweir 
1097cdf0e10cSrcweir 	void moveShape( sal_Int32 nSourcePos, sal_Int32 nDestPos );
1098cdf0e10cSrcweir };
1099cdf0e10cSrcweir 
ShapeSortContext(uno::Reference<drawing::XShapes> & rShapes,ShapeSortContext * pParentContext)1100cdf0e10cSrcweir ShapeSortContext::ShapeSortContext( uno::Reference< drawing::XShapes >& rShapes, ShapeSortContext* pParentContext )
1101cdf0e10cSrcweir :	mxShapes( rShapes ), mnCurrentZ( 0 ), mpParentContext( pParentContext ),
1102cdf0e10cSrcweir 	msZOrder(RTL_CONSTASCII_USTRINGPARAM("ZOrder"))
1103cdf0e10cSrcweir {
1104cdf0e10cSrcweir }
1105cdf0e10cSrcweir 
moveShape(sal_Int32 nSourcePos,sal_Int32 nDestPos)1106cdf0e10cSrcweir void ShapeSortContext::moveShape( sal_Int32 nSourcePos, sal_Int32 nDestPos )
1107cdf0e10cSrcweir {
1108cdf0e10cSrcweir 	uno::Any aAny( mxShapes->getByIndex( nSourcePos ) );
1109cdf0e10cSrcweir 	uno::Reference< beans::XPropertySet > xPropSet;
1110cdf0e10cSrcweir 	aAny >>= xPropSet;
1111cdf0e10cSrcweir 
1112cdf0e10cSrcweir 	if( xPropSet.is() && xPropSet->getPropertySetInfo()->hasPropertyByName( msZOrder ) )
1113cdf0e10cSrcweir 	{
1114cdf0e10cSrcweir 		aAny <<= nDestPos;
1115cdf0e10cSrcweir 		xPropSet->setPropertyValue( msZOrder, aAny );
1116cdf0e10cSrcweir 
1117cdf0e10cSrcweir 		list<ZOrderHint>::iterator aIter = maZOrderList.begin();
1118cdf0e10cSrcweir 		list<ZOrderHint>::iterator aEnd = maZOrderList.end();
1119cdf0e10cSrcweir 
1120cdf0e10cSrcweir 		while( aIter != aEnd )
1121cdf0e10cSrcweir 		{
1122cdf0e10cSrcweir 			if( (*aIter).nIs < nSourcePos )
1123cdf0e10cSrcweir 			{
1124cdf0e10cSrcweir 				DBG_ASSERT( (*aIter).nIs >= nDestPos, "Shape sorting failed" );
1125cdf0e10cSrcweir 				(*aIter).nIs++;
1126cdf0e10cSrcweir 			}
1127cdf0e10cSrcweir 			aIter++;
1128cdf0e10cSrcweir 		}
1129cdf0e10cSrcweir 
1130cdf0e10cSrcweir 		aIter = maUnsortedList.begin();
1131cdf0e10cSrcweir 		aEnd = maUnsortedList.end();
1132cdf0e10cSrcweir 
1133cdf0e10cSrcweir 		while( aIter != aEnd )
1134cdf0e10cSrcweir 		{
1135cdf0e10cSrcweir 			if( (*aIter).nIs < nSourcePos )
1136cdf0e10cSrcweir 			{
1137cdf0e10cSrcweir 				DBG_ASSERT( (*aIter).nIs >= nDestPos, "shape sorting failed" );
1138cdf0e10cSrcweir 				(*aIter).nIs++;
1139cdf0e10cSrcweir 			}
1140cdf0e10cSrcweir 			aIter++;
1141cdf0e10cSrcweir 		}
1142cdf0e10cSrcweir 	}
1143cdf0e10cSrcweir }
1144cdf0e10cSrcweir 
pushGroupForSorting(uno::Reference<drawing::XShapes> & rShapes)1145cdf0e10cSrcweir void XMLShapeImportHelper::pushGroupForSorting( uno::Reference< drawing::XShapes >& rShapes )
1146cdf0e10cSrcweir {
1147cdf0e10cSrcweir 	mpImpl->mpSortContext = new ShapeSortContext( rShapes, mpImpl->mpSortContext );
1148cdf0e10cSrcweir }
1149cdf0e10cSrcweir 
popGroupAndSort()1150cdf0e10cSrcweir void XMLShapeImportHelper::popGroupAndSort()
1151cdf0e10cSrcweir {
1152cdf0e10cSrcweir 	DBG_ASSERT( mpImpl->mpSortContext, "No context to sort!" );
1153cdf0e10cSrcweir 	if( mpImpl->mpSortContext == NULL )
1154cdf0e10cSrcweir 		return;
1155cdf0e10cSrcweir 
1156cdf0e10cSrcweir 	try
1157cdf0e10cSrcweir 	{
1158cdf0e10cSrcweir 		list<ZOrderHint>& rZList = mpImpl->mpSortContext->maZOrderList;
1159cdf0e10cSrcweir 		list<ZOrderHint>& rUnsortedList = mpImpl->mpSortContext->maUnsortedList;
1160cdf0e10cSrcweir 
1161cdf0e10cSrcweir 		// sort shapes
1162cdf0e10cSrcweir 		if( !rZList.empty() )
1163cdf0e10cSrcweir 		{
1164cdf0e10cSrcweir 			// only do something if we have shapes to sort
1165cdf0e10cSrcweir 
1166cdf0e10cSrcweir 			// check if there are more shapes than inserted with ::shapeWithZIndexAdded()
1167cdf0e10cSrcweir 			// This can happen if there where already shapes on the page before import
1168cdf0e10cSrcweir 			// Since the writer may delete some of this shapes during import, we need
1169cdf0e10cSrcweir 			// to do this here and not in our c'tor anymore
1170cdf0e10cSrcweir 
1171cdf0e10cSrcweir 			// check if we have more shapes than we know of
1172cdf0e10cSrcweir 			sal_Int32 nCount = mpImpl->mpSortContext->mxShapes->getCount();
1173cdf0e10cSrcweir 
1174cdf0e10cSrcweir 			nCount -= rZList.size();
1175cdf0e10cSrcweir 			nCount -= rUnsortedList.size();
1176cdf0e10cSrcweir 
1177cdf0e10cSrcweir 
1178cdf0e10cSrcweir 			if( nCount > 0 )
1179cdf0e10cSrcweir 			{
1180cdf0e10cSrcweir 				// first update offsets of added shapes
1181cdf0e10cSrcweir 				list<ZOrderHint>::iterator aIter( rZList.begin() );
1182cdf0e10cSrcweir 				while( aIter != rZList.end() )
1183cdf0e10cSrcweir 					(*aIter++).nIs += nCount;
1184cdf0e10cSrcweir 
1185cdf0e10cSrcweir 				aIter = rUnsortedList.begin();
1186cdf0e10cSrcweir 				while( aIter != rUnsortedList.end() )
1187cdf0e10cSrcweir 					(*aIter++).nIs += nCount;
1188cdf0e10cSrcweir 
1189cdf0e10cSrcweir 				// second add the already existing shapes in the unsorted list
1190cdf0e10cSrcweir 				ZOrderHint aNewHint;
1191cdf0e10cSrcweir 
1192cdf0e10cSrcweir 				do
1193cdf0e10cSrcweir 				{
1194cdf0e10cSrcweir 					nCount--;
1195cdf0e10cSrcweir 
1196cdf0e10cSrcweir 					aNewHint.nIs = nCount;
1197cdf0e10cSrcweir 					aNewHint.nShould = -1;
1198cdf0e10cSrcweir 
1199cdf0e10cSrcweir 					rUnsortedList.insert(rUnsortedList.begin(), aNewHint);
1200cdf0e10cSrcweir 				}
1201cdf0e10cSrcweir 				while( nCount );
1202cdf0e10cSrcweir 			}
1203cdf0e10cSrcweir 
1204cdf0e10cSrcweir 			// sort z ordered shapes
1205cdf0e10cSrcweir 			rZList.sort();
1206cdf0e10cSrcweir 
1207cdf0e10cSrcweir 			// this is the current index, all shapes before that
1208cdf0e10cSrcweir 			// index are finished
1209cdf0e10cSrcweir 			sal_Int32 nIndex = 0;
1210cdf0e10cSrcweir 			while( !rZList.empty() )
1211cdf0e10cSrcweir 			{
1212cdf0e10cSrcweir 				list<ZOrderHint>::iterator aIter( rZList.begin() );
1213cdf0e10cSrcweir 
1214cdf0e10cSrcweir 				while( nIndex < (*aIter).nShould && !rUnsortedList.empty() )
1215cdf0e10cSrcweir 				{
1216cdf0e10cSrcweir 					ZOrderHint aGapHint( *rUnsortedList.begin() );
1217cdf0e10cSrcweir 					rUnsortedList.pop_front();
1218cdf0e10cSrcweir 
1219cdf0e10cSrcweir 					mpImpl->mpSortContext->moveShape( aGapHint.nIs, nIndex++ );
1220cdf0e10cSrcweir 				}
1221cdf0e10cSrcweir 
1222cdf0e10cSrcweir 				if( (*aIter).nIs != nIndex )
1223cdf0e10cSrcweir 					mpImpl->mpSortContext->moveShape( (*aIter).nIs, nIndex );
1224cdf0e10cSrcweir 
1225cdf0e10cSrcweir 				rZList.pop_front();
1226cdf0e10cSrcweir 				nIndex++;
1227cdf0e10cSrcweir 			}
1228cdf0e10cSrcweir 		}
1229cdf0e10cSrcweir 	}
1230cdf0e10cSrcweir 	catch( uno::Exception& )
1231cdf0e10cSrcweir 	{
1232cdf0e10cSrcweir 		DBG_ERROR("exception while sorting shapes, sorting failed!");
1233cdf0e10cSrcweir 	}
1234cdf0e10cSrcweir 
1235cdf0e10cSrcweir 	// put parent on top and delete current context, were done
1236cdf0e10cSrcweir 	ShapeSortContext* pContext = mpImpl->mpSortContext;
1237cdf0e10cSrcweir 	mpImpl->mpSortContext = pContext->mpParentContext;
1238cdf0e10cSrcweir 	delete pContext;
1239cdf0e10cSrcweir }
1240cdf0e10cSrcweir 
shapeWithZIndexAdded(com::sun::star::uno::Reference<com::sun::star::drawing::XShape> &,sal_Int32 nZIndex)1241cdf0e10cSrcweir void XMLShapeImportHelper::shapeWithZIndexAdded( com::sun::star::uno::Reference< com::sun::star::drawing::XShape >&, sal_Int32 nZIndex )
1242cdf0e10cSrcweir {
1243cdf0e10cSrcweir 	if( mpImpl->mpSortContext)
1244cdf0e10cSrcweir 	{
1245cdf0e10cSrcweir 		ZOrderHint aNewHint;
1246cdf0e10cSrcweir 		aNewHint.nIs = mpImpl->mpSortContext->mnCurrentZ++;
1247cdf0e10cSrcweir 		aNewHint.nShould = nZIndex;
1248cdf0e10cSrcweir 
1249cdf0e10cSrcweir 		if( nZIndex == -1 )
1250cdf0e10cSrcweir 		{
1251cdf0e10cSrcweir 			// don't care, so add to unsorted list
1252cdf0e10cSrcweir 			mpImpl->mpSortContext->maUnsortedList.push_back(aNewHint);
1253cdf0e10cSrcweir 		}
1254cdf0e10cSrcweir 		else
1255cdf0e10cSrcweir 		{
1256cdf0e10cSrcweir 			// insert into sort list
1257cdf0e10cSrcweir 			mpImpl->mpSortContext->maZOrderList.push_back(aNewHint);
1258cdf0e10cSrcweir 		}
1259cdf0e10cSrcweir 	}
1260cdf0e10cSrcweir }
1261cdf0e10cSrcweir 
addShapeConnection(com::sun::star::uno::Reference<com::sun::star::drawing::XShape> & rConnectorShape,sal_Bool bStart,const rtl::OUString & rDestShapeId,sal_Int32 nDestGlueId)1262cdf0e10cSrcweir void XMLShapeImportHelper::addShapeConnection( com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& rConnectorShape,
1263cdf0e10cSrcweir 						 sal_Bool bStart,
1264cdf0e10cSrcweir 						 const rtl::OUString& rDestShapeId,
1265cdf0e10cSrcweir 						 sal_Int32 nDestGlueId )
1266cdf0e10cSrcweir {
1267cdf0e10cSrcweir 	ConnectionHint aHint;
1268cdf0e10cSrcweir 	aHint.mxConnector = rConnectorShape;
1269cdf0e10cSrcweir 	aHint.bStart = bStart;
1270cdf0e10cSrcweir 	aHint.aDestShapeId = rDestShapeId;
1271cdf0e10cSrcweir 	aHint.nDestGlueId = nDestGlueId;
1272cdf0e10cSrcweir 
1273cdf0e10cSrcweir 	mpImpl->maConnections.push_back( aHint );
1274cdf0e10cSrcweir }
1275cdf0e10cSrcweir 
restoreConnections()1276cdf0e10cSrcweir void XMLShapeImportHelper::restoreConnections()
1277cdf0e10cSrcweir {
1278cdf0e10cSrcweir 	if( !mpImpl->maConnections.empty() )
1279cdf0e10cSrcweir 	{
1280cdf0e10cSrcweir 		uno::Any aAny;
1281cdf0e10cSrcweir 
1282cdf0e10cSrcweir 		const vector<ConnectionHint>::size_type nCount = mpImpl->maConnections.size();
1283cdf0e10cSrcweir 		for( vector<ConnectionHint>::size_type i = 0; i < nCount; i++ )
1284cdf0e10cSrcweir 		{
1285cdf0e10cSrcweir 			ConnectionHint& rHint = mpImpl->maConnections[i];
1286cdf0e10cSrcweir 			uno::Reference< beans::XPropertySet > xConnector( rHint.mxConnector, uno::UNO_QUERY );
1287cdf0e10cSrcweir 			if( xConnector.is() )
1288cdf0e10cSrcweir 			{
1289cdf0e10cSrcweir 				// #86637# remember line deltas
1290cdf0e10cSrcweir 				uno::Any aLine1Delta;
1291cdf0e10cSrcweir 				uno::Any aLine2Delta;
1292cdf0e10cSrcweir 				uno::Any aLine3Delta;
1293cdf0e10cSrcweir 				OUString aStr1(RTL_CONSTASCII_USTRINGPARAM("EdgeLine1Delta"));
1294cdf0e10cSrcweir 				OUString aStr2(RTL_CONSTASCII_USTRINGPARAM("EdgeLine2Delta"));
1295cdf0e10cSrcweir 				OUString aStr3(RTL_CONSTASCII_USTRINGPARAM("EdgeLine3Delta"));
1296cdf0e10cSrcweir 				aLine1Delta = xConnector->getPropertyValue(aStr1);
1297cdf0e10cSrcweir 				aLine2Delta = xConnector->getPropertyValue(aStr2);
1298cdf0e10cSrcweir 				aLine3Delta = xConnector->getPropertyValue(aStr3);
1299cdf0e10cSrcweir 
1300cdf0e10cSrcweir 				// #86637# simply setting these values WILL force the connector to do
1301cdf0e10cSrcweir 				// an new layout promptly. So the line delta values have to be rescued
1302cdf0e10cSrcweir 				// and restored around connector changes.
1303cdf0e10cSrcweir 				uno::Reference< drawing::XShape > xShape(
1304cdf0e10cSrcweir 					mrImporter.getInterfaceToIdentifierMapper().getReference( rHint.aDestShapeId ), uno::UNO_QUERY );
1305cdf0e10cSrcweir 				if( xShape.is() )
1306cdf0e10cSrcweir 				{
1307cdf0e10cSrcweir 					aAny <<= xShape;
1308cdf0e10cSrcweir 					xConnector->setPropertyValue( rHint.bStart ? msStartShape : msEndShape, aAny );
1309cdf0e10cSrcweir 
1310cdf0e10cSrcweir 					sal_Int32 nGlueId = rHint.nDestGlueId < 4 ? rHint.nDestGlueId : getGluePointId( xShape, rHint.nDestGlueId );
1311cdf0e10cSrcweir 					aAny <<= nGlueId;
1312cdf0e10cSrcweir 					xConnector->setPropertyValue( rHint.bStart ? msStartGluePointIndex : msEndGluePointIndex, aAny );
1313cdf0e10cSrcweir 				}
1314cdf0e10cSrcweir 
1315cdf0e10cSrcweir 				// #86637# restore line deltas
1316cdf0e10cSrcweir 				xConnector->setPropertyValue(aStr1, aLine1Delta );
1317cdf0e10cSrcweir 				xConnector->setPropertyValue(aStr2, aLine2Delta );
1318cdf0e10cSrcweir 				xConnector->setPropertyValue(aStr3, aLine3Delta );
1319cdf0e10cSrcweir 			}
1320cdf0e10cSrcweir 		}
1321cdf0e10cSrcweir 		mpImpl->maConnections.clear();
1322cdf0e10cSrcweir 	}
1323cdf0e10cSrcweir }
1324cdf0e10cSrcweir 
CreateShapePropMapper(const uno::Reference<frame::XModel> & rModel,SvXMLImport & rImport)1325cdf0e10cSrcweir SvXMLImportPropertyMapper* XMLShapeImportHelper::CreateShapePropMapper( const uno::Reference< frame::XModel>& rModel, SvXMLImport& rImport )
1326cdf0e10cSrcweir {
1327cdf0e10cSrcweir 	UniReference< XMLPropertyHandlerFactory > xFactory = new XMLSdPropHdlFactory( rModel, rImport );
1328cdf0e10cSrcweir 	UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper( xFactory );
1329cdf0e10cSrcweir 	SvXMLImportPropertyMapper* pResult = new SvXMLImportPropertyMapper( xMapper, rImport );
1330cdf0e10cSrcweir 
1331cdf0e10cSrcweir 	// chain text attributes
1332cdf0e10cSrcweir 	pResult->ChainImportMapper( XMLTextImportHelper::CreateParaExtPropMapper( rImport ) );
1333cdf0e10cSrcweir 	return pResult;
1334cdf0e10cSrcweir }
1335cdf0e10cSrcweir 
1336cdf0e10cSrcweir /** creates a shape property set mapper that can be used for non shape elements.
1337cdf0e10cSrcweir 	Only current feature is that the ShapeUserDefinedAttributes property is not included in this one. */
CreateExternalShapePropMapper(const uno::Reference<frame::XModel> & rModel,SvXMLImport & rImport)1338cdf0e10cSrcweir SvXMLImportPropertyMapper* XMLShapeImportHelper::CreateExternalShapePropMapper( const uno::Reference< frame::XModel>& rModel, SvXMLImport& rImport )
1339cdf0e10cSrcweir {
1340cdf0e10cSrcweir 	UniReference< XMLPropertyHandlerFactory > xFactory = new XMLSdPropHdlFactory( rModel, rImport );
1341cdf0e10cSrcweir 	UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper( xFactory, 1 );
1342cdf0e10cSrcweir 	SvXMLImportPropertyMapper* pResult = new SvXMLImportPropertyMapper( xMapper, rImport );
1343cdf0e10cSrcweir 
1344cdf0e10cSrcweir 	// chain text attributes
1345cdf0e10cSrcweir 	pResult->ChainImportMapper( XMLTextImportHelper::CreateParaExtPropMapper( rImport ) );
1346cdf0e10cSrcweir 	return pResult;
1347cdf0e10cSrcweir }
1348cdf0e10cSrcweir 
1349cdf0e10cSrcweir /** adds a mapping for a glue point identifier from an xml file to the identifier created after inserting
1350cdf0e10cSrcweir 	the new glue point into the core. The saved mappings can be retrieved by getGluePointId() */
addGluePointMapping(com::sun::star::uno::Reference<com::sun::star::drawing::XShape> & xShape,sal_Int32 nSourceId,sal_Int32 nDestinnationId)1351cdf0e10cSrcweir void XMLShapeImportHelper::addGluePointMapping( com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape,
1352cdf0e10cSrcweir 						  sal_Int32 nSourceId, sal_Int32 nDestinnationId )
1353cdf0e10cSrcweir {
1354cdf0e10cSrcweir 	if( mpPageContext )
1355cdf0e10cSrcweir 		mpPageContext->maShapeGluePointsMap[xShape][nSourceId] = nDestinnationId;
1356cdf0e10cSrcweir }
1357cdf0e10cSrcweir 
1358*f3b8b509SArmin Le Grand /** find mapping for given DestinationID. This allows to extract the original draw:id imported with a draw:glue-point */
findGluePointMapping(const com::sun::star::uno::Reference<com::sun::star::drawing::XShape> & xShape,sal_Int32 nDestinnationId) const1359*f3b8b509SArmin Le Grand sal_Int32 XMLShapeImportHelper::findGluePointMapping(
1360*f3b8b509SArmin Le Grand     const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape,
1361*f3b8b509SArmin Le Grand     sal_Int32 nDestinnationId ) const
1362*f3b8b509SArmin Le Grand {
1363*f3b8b509SArmin Le Grand     if( mpPageContext )
1364*f3b8b509SArmin Le Grand     {
1365*f3b8b509SArmin Le Grand         ShapeGluePointsMap::iterator aShapeIter( mpPageContext->maShapeGluePointsMap.find( xShape ) );
1366*f3b8b509SArmin Le Grand 
1367*f3b8b509SArmin Le Grand         if( aShapeIter != mpPageContext->maShapeGluePointsMap.end() )
1368*f3b8b509SArmin Le Grand         {
1369*f3b8b509SArmin Le Grand             GluePointIdMap::iterator aShapeIdIter = (*aShapeIter).second.begin();
1370*f3b8b509SArmin Le Grand             GluePointIdMap::iterator aShapeIdEnd  = (*aShapeIter).second.end();
1371*f3b8b509SArmin Le Grand 
1372*f3b8b509SArmin Le Grand             while ( aShapeIdIter != aShapeIdEnd )
1373*f3b8b509SArmin Le Grand             {
1374*f3b8b509SArmin Le Grand                 if ( (*aShapeIdIter).second == nDestinnationId )
1375*f3b8b509SArmin Le Grand                 {
1376*f3b8b509SArmin Le Grand                     return (*aShapeIdIter).first;
1377*f3b8b509SArmin Le Grand                 }
1378*f3b8b509SArmin Le Grand 
1379*f3b8b509SArmin Le Grand                 aShapeIdIter++;
1380*f3b8b509SArmin Le Grand             }
1381*f3b8b509SArmin Le Grand         }
1382*f3b8b509SArmin Le Grand     }
1383*f3b8b509SArmin Le Grand 
1384*f3b8b509SArmin Le Grand     return -1;
1385*f3b8b509SArmin Le Grand }
1386*f3b8b509SArmin Le Grand 
1387cdf0e10cSrcweir /** moves all current DestinationId's by n */
moveGluePointMapping(const com::sun::star::uno::Reference<com::sun::star::drawing::XShape> & xShape,const sal_Int32 n)1388cdf0e10cSrcweir void XMLShapeImportHelper::moveGluePointMapping( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape, const sal_Int32 n )
1389cdf0e10cSrcweir {
1390cdf0e10cSrcweir 	if( mpPageContext )
1391cdf0e10cSrcweir 	{
1392cdf0e10cSrcweir 		ShapeGluePointsMap::iterator aShapeIter( mpPageContext->maShapeGluePointsMap.find( xShape ) );
1393cdf0e10cSrcweir 		if( aShapeIter != mpPageContext->maShapeGluePointsMap.end() )
1394cdf0e10cSrcweir 		{
1395cdf0e10cSrcweir 			GluePointIdMap::iterator aShapeIdIter = (*aShapeIter).second.begin();
1396cdf0e10cSrcweir 			GluePointIdMap::iterator aShapeIdEnd  = (*aShapeIter).second.end();
1397cdf0e10cSrcweir 			while ( aShapeIdIter != aShapeIdEnd )
1398cdf0e10cSrcweir 			{
1399cdf0e10cSrcweir 				if ( (*aShapeIdIter).second != -1 )
1400cdf0e10cSrcweir 					(*aShapeIdIter).second += n;
1401cdf0e10cSrcweir 				aShapeIdIter++;
1402cdf0e10cSrcweir 			}
1403cdf0e10cSrcweir 		}
1404cdf0e10cSrcweir 	}
1405cdf0e10cSrcweir }
1406cdf0e10cSrcweir 
1407cdf0e10cSrcweir /** retrieves a mapping for a glue point identifier from the current xml file to the identifier created after
1408cdf0e10cSrcweir 	inserting the new glue point into the core. The mapping must be initialized first with addGluePointMapping() */
getGluePointId(const com::sun::star::uno::Reference<com::sun::star::drawing::XShape> & xShape,sal_Int32 nSourceId)1409*f3b8b509SArmin Le Grand sal_Int32 XMLShapeImportHelper::getGluePointId( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape, sal_Int32 nSourceId )
1410cdf0e10cSrcweir {
1411cdf0e10cSrcweir 	if( mpPageContext )
1412cdf0e10cSrcweir 	{
1413cdf0e10cSrcweir 		ShapeGluePointsMap::iterator aShapeIter( mpPageContext->maShapeGluePointsMap.find( xShape ) );
1414cdf0e10cSrcweir 		if( aShapeIter != mpPageContext->maShapeGluePointsMap.end() )
1415cdf0e10cSrcweir 		{
1416cdf0e10cSrcweir 			GluePointIdMap::iterator aIdIter = (*aShapeIter).second.find(nSourceId);
1417cdf0e10cSrcweir 			if( aIdIter != (*aShapeIter).second.end() )
1418cdf0e10cSrcweir 				return (*aIdIter).second;
1419cdf0e10cSrcweir 		}
1420cdf0e10cSrcweir 	}
1421cdf0e10cSrcweir 
1422cdf0e10cSrcweir 	return -1;
1423cdf0e10cSrcweir }
1424cdf0e10cSrcweir 
1425cdf0e10cSrcweir /** this method must be calling before the first shape is imported for the given page */
startPage(com::sun::star::uno::Reference<com::sun::star::drawing::XShapes> & rShapes)1426cdf0e10cSrcweir void XMLShapeImportHelper::startPage( com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes )
1427cdf0e10cSrcweir {
1428cdf0e10cSrcweir 	XMLShapeImportPageContextImpl* pOldContext = mpPageContext;
1429cdf0e10cSrcweir 	mpPageContext = new XMLShapeImportPageContextImpl();
1430cdf0e10cSrcweir 	mpPageContext->mpNext = pOldContext;
1431cdf0e10cSrcweir 	mpPageContext->mxShapes = rShapes;
1432cdf0e10cSrcweir }
1433cdf0e10cSrcweir 
1434cdf0e10cSrcweir /** this method must be calling after the last shape is imported for the given page */
endPage(com::sun::star::uno::Reference<com::sun::star::drawing::XShapes> & rShapes)1435cdf0e10cSrcweir void XMLShapeImportHelper::endPage( com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >&
1436cdf0e10cSrcweir #ifdef DBG_UTIL
1437cdf0e10cSrcweir rShapes
1438cdf0e10cSrcweir #endif
1439cdf0e10cSrcweir )
1440cdf0e10cSrcweir {
1441cdf0e10cSrcweir 	DBG_ASSERT( mpPageContext && (mpPageContext->mxShapes == rShapes), "wrong call to endPage(), no startPage called or wrong page" );
1442cdf0e10cSrcweir 	if( NULL == mpPageContext )
1443cdf0e10cSrcweir 		return;
1444cdf0e10cSrcweir 
1445cdf0e10cSrcweir 	restoreConnections();
1446cdf0e10cSrcweir 
1447cdf0e10cSrcweir 	XMLShapeImportPageContextImpl* pNextContext = mpPageContext->mpNext;
1448cdf0e10cSrcweir 	delete mpPageContext;
1449cdf0e10cSrcweir 	mpPageContext = pNextContext;
1450cdf0e10cSrcweir }
1451cdf0e10cSrcweir 
1452cdf0e10cSrcweir // #88546#
1453cdf0e10cSrcweir /** defines if the import should increment the progress bar or not */
enableHandleProgressBar(sal_Bool bEnable)1454cdf0e10cSrcweir void XMLShapeImportHelper::enableHandleProgressBar( sal_Bool bEnable )
1455cdf0e10cSrcweir {
1456cdf0e10cSrcweir 	mpImpl->mbHandleProgressBar = bEnable;
1457cdf0e10cSrcweir }
1458cdf0e10cSrcweir 
IsHandleProgressBarEnabled() const1459cdf0e10cSrcweir sal_Bool XMLShapeImportHelper::IsHandleProgressBarEnabled() const
1460cdf0e10cSrcweir {
1461cdf0e10cSrcweir 	return mpImpl->mbHandleProgressBar;
1462cdf0e10cSrcweir }
1463cdf0e10cSrcweir 
1464cdf0e10cSrcweir /** queries the capability of the current model to create presentation shapes */
IsPresentationShapesSupported()1465cdf0e10cSrcweir sal_Bool XMLShapeImportHelper::IsPresentationShapesSupported()
1466cdf0e10cSrcweir {
1467cdf0e10cSrcweir 	return mpImpl->mbIsPresentationShapesSupported;
1468cdf0e10cSrcweir }
1469cdf0e10cSrcweir 
GetShapeTableImport()1470cdf0e10cSrcweir const rtl::Reference< XMLTableImport >& XMLShapeImportHelper::GetShapeTableImport()
1471cdf0e10cSrcweir {
1472cdf0e10cSrcweir 	if( !mxShapeTableImport.is() )
1473cdf0e10cSrcweir 	{
1474cdf0e10cSrcweir 		rtl::Reference< XMLPropertyHandlerFactory > xFactory( new XMLSdPropHdlFactory( mrImporter.GetModel(), mrImporter ) );
1475cdf0e10cSrcweir 		rtl::Reference< XMLPropertySetMapper > xPropertySetMapper( new XMLShapePropertySetMapper( xFactory.get() ) );
1476cdf0e10cSrcweir 		mxShapeTableImport = new XMLTableImport( mrImporter, xPropertySetMapper, xFactory );
1477cdf0e10cSrcweir 	}
1478cdf0e10cSrcweir 
1479cdf0e10cSrcweir 	return mxShapeTableImport;
1480cdf0e10cSrcweir }
1481cdf0e10cSrcweir 
setHyperlink(const OUString & rHyperlink)1482cdf0e10cSrcweir void SvXMLShapeContext::setHyperlink( const OUString& rHyperlink )
1483cdf0e10cSrcweir {
1484cdf0e10cSrcweir 	msHyperlink = rHyperlink;
1485cdf0e10cSrcweir }
1486