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