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 { 65 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 { 83 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 770 void XMLShapeImportHelper::SetStylesContext(SvXMLStylesContext* pNew) 771 { 772 mpStylesContext = pNew; 773 mpStylesContext->AddRef(); 774 } 775 776 ////////////////////////////////////////////////////////////////////////////// 777 778 void XMLShapeImportHelper::SetAutoStylesContext(SvXMLStylesContext* pNew) 779 { 780 mpAutoStylesContext = pNew; 781 mpAutoStylesContext->AddRef(); 782 } 783 784 ////////////////////////////////////////////////////////////////////////////// 785 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 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 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 */ 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 */ 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 1081 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 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 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 1145 void XMLShapeImportHelper::pushGroupForSorting( uno::Reference< drawing::XShapes >& rShapes ) 1146 { 1147 mpImpl->mpSortContext = new ShapeSortContext( rShapes, mpImpl->mpSortContext ); 1148 } 1149 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 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 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 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 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. */ 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() */ 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 /** moves all current DestinationId's by n */ 1359 void XMLShapeImportHelper::moveGluePointMapping( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape, const sal_Int32 n ) 1360 { 1361 if( mpPageContext ) 1362 { 1363 ShapeGluePointsMap::iterator aShapeIter( mpPageContext->maShapeGluePointsMap.find( xShape ) ); 1364 if( aShapeIter != mpPageContext->maShapeGluePointsMap.end() ) 1365 { 1366 GluePointIdMap::iterator aShapeIdIter = (*aShapeIter).second.begin(); 1367 GluePointIdMap::iterator aShapeIdEnd = (*aShapeIter).second.end(); 1368 while ( aShapeIdIter != aShapeIdEnd ) 1369 { 1370 if ( (*aShapeIdIter).second != -1 ) 1371 (*aShapeIdIter).second += n; 1372 aShapeIdIter++; 1373 } 1374 } 1375 } 1376 } 1377 1378 /** retrieves a mapping for a glue point identifier from the current xml file to the identifier created after 1379 inserting the new glue point into the core. The mapping must be initialized first with addGluePointMapping() */ 1380 sal_Int32 XMLShapeImportHelper::getGluePointId( com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape, sal_Int32 nSourceId ) 1381 { 1382 if( mpPageContext ) 1383 { 1384 ShapeGluePointsMap::iterator aShapeIter( mpPageContext->maShapeGluePointsMap.find( xShape ) ); 1385 if( aShapeIter != mpPageContext->maShapeGluePointsMap.end() ) 1386 { 1387 GluePointIdMap::iterator aIdIter = (*aShapeIter).second.find(nSourceId); 1388 if( aIdIter != (*aShapeIter).second.end() ) 1389 return (*aIdIter).second; 1390 } 1391 } 1392 1393 return -1; 1394 } 1395 1396 /** this method must be calling before the first shape is imported for the given page */ 1397 void XMLShapeImportHelper::startPage( com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes ) 1398 { 1399 XMLShapeImportPageContextImpl* pOldContext = mpPageContext; 1400 mpPageContext = new XMLShapeImportPageContextImpl(); 1401 mpPageContext->mpNext = pOldContext; 1402 mpPageContext->mxShapes = rShapes; 1403 } 1404 1405 /** this method must be calling after the last shape is imported for the given page */ 1406 void XMLShapeImportHelper::endPage( com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& 1407 #ifdef DBG_UTIL 1408 rShapes 1409 #endif 1410 ) 1411 { 1412 DBG_ASSERT( mpPageContext && (mpPageContext->mxShapes == rShapes), "wrong call to endPage(), no startPage called or wrong page" ); 1413 if( NULL == mpPageContext ) 1414 return; 1415 1416 restoreConnections(); 1417 1418 XMLShapeImportPageContextImpl* pNextContext = mpPageContext->mpNext; 1419 delete mpPageContext; 1420 mpPageContext = pNextContext; 1421 } 1422 1423 // #88546# 1424 /** defines if the import should increment the progress bar or not */ 1425 void XMLShapeImportHelper::enableHandleProgressBar( sal_Bool bEnable ) 1426 { 1427 mpImpl->mbHandleProgressBar = bEnable; 1428 } 1429 1430 sal_Bool XMLShapeImportHelper::IsHandleProgressBarEnabled() const 1431 { 1432 return mpImpl->mbHandleProgressBar; 1433 } 1434 1435 /** queries the capability of the current model to create presentation shapes */ 1436 sal_Bool XMLShapeImportHelper::IsPresentationShapesSupported() 1437 { 1438 return mpImpl->mbIsPresentationShapesSupported; 1439 } 1440 1441 const rtl::Reference< XMLTableImport >& XMLShapeImportHelper::GetShapeTableImport() 1442 { 1443 if( !mxShapeTableImport.is() ) 1444 { 1445 rtl::Reference< XMLPropertyHandlerFactory > xFactory( new XMLSdPropHdlFactory( mrImporter.GetModel(), mrImporter ) ); 1446 rtl::Reference< XMLPropertySetMapper > xPropertySetMapper( new XMLShapePropertySetMapper( xFactory.get() ) ); 1447 mxShapeTableImport = new XMLTableImport( mrImporter, xPropertySetMapper, xFactory ); 1448 } 1449 1450 return mxShapeTableImport; 1451 } 1452 1453 void SvXMLShapeContext::setHyperlink( const OUString& rHyperlink ) 1454 { 1455 msHyperlink = rHyperlink; 1456 } 1457