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