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 <memory>
28
29 #include "unointerfacetouniqueidentifiermapper.hxx"
30 #include <com/sun/star/presentation/ClickAction.hpp>
31 #include <com/sun/star/lang/ServiceNotRegisteredException.hpp>
32 #include <com/sun/star/container/XChild.hpp>
33 #include <com/sun/star/text/XText.hpp>
34 #include <com/sun/star/chart/XChartDocument.hpp>
35 #include <com/sun/star/drawing/XControlShape.hpp>
36 #include <com/sun/star/style/XStyle.hpp>
37 #include <com/sun/star/drawing/XGluePointsSupplier.hpp>
38 #include <com/sun/star/container/XIdentifierAccess.hpp>
39 #include <com/sun/star/drawing/GluePoint2.hpp>
40 #include <com/sun/star/drawing/Alignment.hpp>
41 #include <com/sun/star/drawing/EscapeDirection.hpp>
42 #include <com/sun/star/table/XColumnRowRange.hpp>
43 #include <xmloff/xmluconv.hxx>
44 #include "PropertySetMerger.hxx"
45
46 #include <xmloff/shapeexport.hxx>
47 #include "sdpropls.hxx"
48 #include "sdxmlexp_impl.hxx"
49 #include <xmloff/families.hxx>
50 #include <tools/debug.hxx>
51 #include <xmloff/contextid.hxx>
52 #include <xmloff/xmltoken.hxx>
53 #include <tools/string.hxx>
54 #include <sot/clsids.hxx>
55 #include <tools/globname.hxx>
56 #include <com/sun/star/beans/XPropertyState.hpp>
57
58 #include <comphelper/processfactory.hxx>
59 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
60 #include <com/sun/star/drawing/XCustomShapeEngine.hpp>
61
62 #include "xmloff/xmlnmspe.hxx"
63
64 using ::rtl::OUString;
65 using ::rtl::OUStringBuffer;
66
67 using namespace ::com::sun::star;
68 using namespace ::xmloff::token;
69
70 //////////////////////////////////////////////////////////////////////////////
71
XMLShapeExport(SvXMLExport & rExp,SvXMLExportPropertyMapper * pExtMapper)72 XMLShapeExport::XMLShapeExport(SvXMLExport& rExp,
73 SvXMLExportPropertyMapper *pExtMapper )
74 : mrExport( rExp ),
75 mnNextUniqueShapeId(1),
76 maShapesInfos(),
77 maCurrentShapesIter(maShapesInfos.end()),
78 mbExportLayer( sal_False ),
79 // #88546# init to sal_False
80 mbHandleProgressBar( sal_False ),
81 msZIndex( RTL_CONSTASCII_USTRINGPARAM("ZOrder") ),
82 msPrintable( RTL_CONSTASCII_USTRINGPARAM("Printable") ),
83 msVisible( RTL_CONSTASCII_USTRINGPARAM("Visible") ),
84 msEmptyPres( RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ),
85 msModel( RTL_CONSTASCII_USTRINGPARAM("Model") ),
86 msStartShape( RTL_CONSTASCII_USTRINGPARAM("StartShape") ),
87 msEndShape( RTL_CONSTASCII_USTRINGPARAM("EndShape") ),
88 msOnClick( RTL_CONSTASCII_USTRINGPARAM("OnClick") ),
89 #ifdef ISSUE66550_HLINK_FOR_SHAPES
90 msOnAction( RTL_CONSTASCII_USTRINGPARAM("OnAction") ),
91 msAction( RTL_CONSTASCII_USTRINGPARAM("Action") ),
92 msURL( RTL_CONSTASCII_USTRINGPARAM("URL") ),
93 #endif
94 msEventType( RTL_CONSTASCII_USTRINGPARAM("EventType") ),
95 msPresentation( RTL_CONSTASCII_USTRINGPARAM("Presentation") ),
96 msMacroName( RTL_CONSTASCII_USTRINGPARAM("MacroName") ),
97 msScript( RTL_CONSTASCII_USTRINGPARAM("Script") ),
98 msLibrary( RTL_CONSTASCII_USTRINGPARAM("Library") ),
99 msClickAction( RTL_CONSTASCII_USTRINGPARAM("ClickAction") ),
100 msBookmark( RTL_CONSTASCII_USTRINGPARAM("Bookmark") ),
101 msEffect( RTL_CONSTASCII_USTRINGPARAM("Effect") ),
102 msPlayFull( RTL_CONSTASCII_USTRINGPARAM("PlayFull") ),
103 msVerb( RTL_CONSTASCII_USTRINGPARAM("Verb") ),
104 msSoundURL( RTL_CONSTASCII_USTRINGPARAM("SoundURL") ),
105 msSpeed( RTL_CONSTASCII_USTRINGPARAM("Speed") ),
106 msStarBasic( RTL_CONSTASCII_USTRINGPARAM("StarBasic") )
107 {
108 // construct PropertyHandlerFactory
109 mxSdPropHdlFactory = new XMLSdPropHdlFactory( mrExport.GetModel(), rExp );
110 // construct PropertySetMapper
111 mxPropertySetMapper = CreateShapePropMapper( mrExport );
112 if( pExtMapper )
113 {
114 UniReference < SvXMLExportPropertyMapper > xExtMapper( pExtMapper );
115 mxPropertySetMapper->ChainExportMapper( xExtMapper );
116 }
117
118 /*
119 // chain text attributes
120 xPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(rExp));
121 */
122
123 mrExport.GetAutoStylePool()->AddFamily(
124 XML_STYLE_FAMILY_SD_GRAPHICS_ID,
125 OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)),
126 GetPropertySetMapper(),
127 OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_PREFIX)));
128 mrExport.GetAutoStylePool()->AddFamily(
129 XML_STYLE_FAMILY_SD_PRESENTATION_ID,
130 OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_NAME)),
131 GetPropertySetMapper(),
132 OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_PREFIX)));
133
134 maCurrentInfo = maShapeInfos.end();
135
136 // create table export helper and let him add his families in time
137 GetShapeTableExport();
138 }
139
140 ///////////////////////////////////////////////////////////////////////
141
~XMLShapeExport()142 XMLShapeExport::~XMLShapeExport()
143 {
144 }
145
146 ///////////////////////////////////////////////////////////////////////
147
148 // sj: replacing CustomShapes with standard objects that are also supported in OpenOffice.org format
checkForCustomShapeReplacement(const uno::Reference<drawing::XShape> & xShape)149 uno::Reference< drawing::XShape > XMLShapeExport::checkForCustomShapeReplacement( const uno::Reference< drawing::XShape >& xShape )
150 {
151 uno::Reference< drawing::XShape > xCustomShapeReplacement;
152
153 if( ( GetExport().getExportFlags() & EXPORT_OASIS ) == 0 )
154 {
155 String aType( (OUString)xShape->getShapeType() );
156 if( aType.EqualsAscii( (const sal_Char*)"com.sun.star.drawing.CustomShape" ) )
157 {
158 uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY );
159 if( xSet.is() )
160 {
161 rtl::OUString aEngine;
162 xSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "CustomShapeEngine" ) ) ) >>= aEngine;
163 if ( !aEngine.getLength() )
164 aEngine = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.EnhancedCustomShapeEngine" ) );
165
166 uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
167 /*
168 uno::Reference< drawing::XShape > aXShape = GetXShapeForSdrObject( (SdrObjCustomShape*)pCustomShape );
169 if ( !aXShape.is() )
170 aXShape = new SvxCustomShape( (SdrObjCustomShape*)pCustomShape );
171 */
172 if ( aEngine.getLength() && xFactory.is() )
173 {
174 uno::Sequence< uno::Any > aArgument( 1 );
175 uno::Sequence< beans::PropertyValue > aPropValues( 2 );
176 aPropValues[ 0 ].Name = rtl::OUString::createFromAscii( "CustomShape" );
177 aPropValues[ 0 ].Value <<= xShape;
178 sal_Bool bForceGroupWithText = sal_True;
179 aPropValues[ 1 ].Name = rtl::OUString::createFromAscii( "ForceGroupWithText" );
180 aPropValues[ 1 ].Value <<= bForceGroupWithText;
181 aArgument[ 0 ] <<= aPropValues;
182 uno::Reference< uno::XInterface > xInterface( xFactory->createInstanceWithArguments( aEngine, aArgument ) );
183 if ( xInterface.is() )
184 {
185 uno::Reference< drawing::XCustomShapeEngine > xCustomShapeEngine(
186 uno::Reference< drawing::XCustomShapeEngine >( xInterface, uno::UNO_QUERY ) );
187 if ( xCustomShapeEngine.is() )
188 xCustomShapeReplacement = xCustomShapeEngine->render();
189 }
190 }
191 }
192 }
193 }
194 return xCustomShapeReplacement;
195 }
196
197 // This method collects all automatic styles for the given XShape
collectShapeAutoStyles(const uno::Reference<drawing::XShape> & xShape)198 void XMLShapeExport::collectShapeAutoStyles(const uno::Reference< drawing::XShape >& xShape )
199 {
200 if( maCurrentShapesIter == maShapesInfos.end() )
201 {
202 DBG_ERROR( "XMLShapeExport::collectShapeAutoStyles(): no call to seekShapes()!" );
203 return;
204 }
205 sal_Int32 nZIndex = 0;
206 uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY );
207 if( xSet.is() )
208 xSet->getPropertyValue(msZIndex) >>= nZIndex;
209
210 ImplXMLShapeExportInfoVector& aShapeInfoVector = (*maCurrentShapesIter).second;
211
212 if( (sal_Int32)aShapeInfoVector.size() <= nZIndex )
213 {
214 DBG_ERROR( "XMLShapeExport::collectShapeAutoStyles(): no shape info allocated for a given shape" );
215 return;
216 }
217
218 ImplXMLShapeExportInfo& aShapeInfo = aShapeInfoVector[nZIndex];
219
220 uno::Reference< drawing::XShape > xCustomShapeReplacement = checkForCustomShapeReplacement( xShape );
221 if ( xCustomShapeReplacement.is() )
222 aShapeInfo.xCustomShapeReplacement = xCustomShapeReplacement;
223
224 // -----------------------------
225 // first compute the shapes type
226 // -----------------------------
227 ImpCalcShapeType(xShape, aShapeInfo.meShapeType);
228
229 // #i118485# enabled XmlShapeTypeDrawChartShape and XmlShapeTypeDrawOLE2Shape
230 // to have text
231 const bool bObjSupportsText =
232 // aShapeInfo.meShapeType != XmlShapeTypeDrawControlShape &&
233 aShapeInfo.meShapeType != XmlShapeTypePresChartShape &&
234 aShapeInfo.meShapeType != XmlShapeTypePresOLE2Shape &&
235 aShapeInfo.meShapeType != XmlShapeTypeDrawSheetShape &&
236 aShapeInfo.meShapeType != XmlShapeTypePresSheetShape &&
237 aShapeInfo.meShapeType != XmlShapeTypeDraw3DSceneObject &&
238 aShapeInfo.meShapeType != XmlShapeTypeDraw3DCubeObject &&
239 aShapeInfo.meShapeType != XmlShapeTypeDraw3DSphereObject &&
240 aShapeInfo.meShapeType != XmlShapeTypeDraw3DLatheObject &&
241 aShapeInfo.meShapeType != XmlShapeTypeDraw3DExtrudeObject &&
242 aShapeInfo.meShapeType != XmlShapeTypeDrawPageShape &&
243 aShapeInfo.meShapeType != XmlShapeTypePresPageShape &&
244 aShapeInfo.meShapeType != XmlShapeTypeDrawGroupShape;
245
246 const bool bObjSupportsStyle =
247 aShapeInfo.meShapeType != XmlShapeTypeDrawGroupShape;
248
249 sal_Bool bIsEmptyPresObj = sal_False;
250
251 uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY);
252 if ( aShapeInfo.xCustomShapeReplacement.is() )
253 xPropSet.clear();
254
255 // ----------------
256 // prep text styles
257 // ----------------
258 if( xPropSet.is() && bObjSupportsText )
259 {
260 uno::Reference< text::XText > xText(xShape, uno::UNO_QUERY);
261 if(xText.is() && xText->getString().getLength())
262 {
263 uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
264
265 if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(msEmptyPres) )
266 {
267 uno::Any aAny = xPropSet->getPropertyValue(msEmptyPres);
268 aAny >>= bIsEmptyPresObj;
269 }
270
271 if(!bIsEmptyPresObj)
272 {
273 GetExport().GetTextParagraphExport()->collectTextAutoStyles( xText );
274 }
275 }
276 }
277
278 // ------------------------------
279 // compute the shape parent style
280 // ------------------------------
281 if( xPropSet.is() )
282 {
283 uno::Reference< beans::XPropertySetInfo > xPropertySetInfo( xPropSet->getPropertySetInfo() );
284
285 OUString aParentName;
286 uno::Reference< style::XStyle > xStyle;
287
288 if( bObjSupportsStyle )
289 {
290 if( xPropertySetInfo.is() && xPropertySetInfo->hasPropertyByName( OUString(RTL_CONSTASCII_USTRINGPARAM("Style"))) )
291 xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Style"))) >>= xStyle;
292
293 if(xStyle.is())
294 {
295 // get family ID
296 uno::Reference< beans::XPropertySet > xStylePropSet(xStyle, uno::UNO_QUERY);
297 DBG_ASSERT( xStylePropSet.is(), "style without a XPropertySet?" );
298 try
299 {
300 if(xStylePropSet.is())
301 {
302 OUString aFamilyName;
303 xStylePropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Family"))) >>= aFamilyName;
304 if(aFamilyName.getLength() && !aFamilyName.equals(OUString(RTL_CONSTASCII_USTRINGPARAM("graphics"))))
305 aShapeInfo.mnFamily = XML_STYLE_FAMILY_SD_PRESENTATION_ID;
306 }
307 }
308 catch(beans::UnknownPropertyException aException)
309 {
310 // Ignored.
311 DBG_ASSERT(false,
312 "XMLShapeExport::collectShapeAutoStyles: style has no 'Family' property");
313 }
314
315 // get parent-style name
316 if(XML_STYLE_FAMILY_SD_PRESENTATION_ID == aShapeInfo.mnFamily)
317 {
318 aParentName = msPresentationStylePrefix;
319 }
320
321 aParentName += xStyle->getName();
322 }
323 }
324
325 // filter propset
326 std::vector< XMLPropertyState > xPropStates;
327
328 sal_Int32 nCount = 0;
329 if( (!bIsEmptyPresObj || (aShapeInfo.meShapeType != XmlShapeTypePresPageShape)) )
330 {
331 xPropStates = GetPropertySetMapper()->Filter( xPropSet );
332
333 if (XmlShapeTypeDrawControlShape == aShapeInfo.meShapeType)
334 {
335 // for control shapes, we additionally need the number format style (if any)
336 uno::Reference< drawing::XControlShape > xControl(xShape, uno::UNO_QUERY);
337 DBG_ASSERT(xControl.is(), "XMLShapeExport::collectShapeAutoStyles: ShapeType control, but no XControlShape!");
338 if (xControl.is())
339 {
340 uno::Reference< beans::XPropertySet > xControlModel(xControl->getControl(), uno::UNO_QUERY);
341 DBG_ASSERT(xControlModel.is(), "XMLShapeExport::collectShapeAutoStyles: no control model on the control shape!");
342
343 ::rtl::OUString sNumberStyle = mrExport.GetFormExport()->getControlNumberStyle(xControlModel);
344 if (0 != sNumberStyle.getLength())
345 {
346 sal_Int32 nIndex = GetPropertySetMapper()->getPropertySetMapper()->FindEntryIndex(CTF_SD_CONTROL_SHAPE_DATA_STYLE);
347 // TODO : this retrieval of the index could be moved into the ctor, holding the index
348 // as member, thus saving time.
349 DBG_ASSERT(-1 != nIndex, "XMLShapeExport::collectShapeAutoStyles: could not obtain the index for our context id!");
350
351 XMLPropertyState aNewState(nIndex, uno::makeAny(sNumberStyle));
352 xPropStates.push_back(aNewState);
353 }
354 }
355 }
356
357 std::vector< XMLPropertyState >::iterator aIter = xPropStates.begin();
358 std::vector< XMLPropertyState >::iterator aEnd = xPropStates.end();
359 while( aIter != aEnd )
360 {
361 if( aIter->mnIndex != -1 )
362 nCount++;
363 aIter++;
364 }
365 }
366
367 if(nCount == 0)
368 {
369 // no hard attributes, use parent style name for export
370 aShapeInfo.msStyleName = aParentName;
371 }
372 else
373 {
374 // there are filtered properties -> hard attributes
375 // try to find this style in AutoStylePool
376 aShapeInfo.msStyleName = mrExport.GetAutoStylePool()->Find(aShapeInfo.mnFamily, aParentName, xPropStates);
377
378 if(!aShapeInfo.msStyleName.getLength())
379 {
380 // Style did not exist, add it to AutoStalePool
381 aShapeInfo.msStyleName = mrExport.GetAutoStylePool()->Add(aShapeInfo.mnFamily, aParentName, xPropStates);
382 }
383 }
384
385 // optionaly generate auto style for text attributes
386 if( (!bIsEmptyPresObj || (aShapeInfo.meShapeType != XmlShapeTypePresPageShape)) && bObjSupportsText )
387 {
388 xPropStates = GetExport().GetTextParagraphExport()->GetParagraphPropertyMapper()->Filter( xPropSet );
389
390 // ----------------------------------------------------------------------
391 // yet more additionally, we need to care for the ParaAdjust property
392 if ( XmlShapeTypeDrawControlShape == aShapeInfo.meShapeType )
393 {
394 uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
395 uno::Reference< beans::XPropertyState > xPropState( xPropSet, uno::UNO_QUERY );
396 if ( xPropSetInfo.is() && xPropState.is() )
397 {
398 // this is because:
399 // * if controls shapes have a ParaAdjust property, then this is the Align property of the control model
400 // * control models are allowed to have an Align of "void"
401 // * the Default for control model's Align is TextAlign_LEFT
402 // * defaults for style properties are not written, but we need to write the "left",
403 // because we need to distiguish this "left" from the case where not align attribute
404 // is present which means "void"
405 // 102407 - 2002-11-01 - fs@openoffice.org
406 static const ::rtl::OUString s_sParaAdjustPropertyName( RTL_CONSTASCII_USTRINGPARAM( "ParaAdjust" ) );
407 if ( xPropSetInfo->hasPropertyByName( s_sParaAdjustPropertyName )
408 && ( beans::PropertyState_DEFAULT_VALUE == xPropState->getPropertyState( s_sParaAdjustPropertyName ) )
409 )
410 {
411 sal_Int32 nIndex = GetExport().GetTextParagraphExport()->GetParagraphPropertyMapper()->getPropertySetMapper()->FindEntryIndex( CTF_SD_SHAPE_PARA_ADJUST );
412 // TODO : this retrieval of the index should be moved into the ctor, holding the index
413 // as member, thus saving time.
414 DBG_ASSERT(-1 != nIndex, "XMLShapeExport::collectShapeAutoStyles: could not obtain the index for the ParaAdjust context id!");
415
416 uno::Any aParaAdjustValue = xPropSet->getPropertyValue( s_sParaAdjustPropertyName );
417 XMLPropertyState aAlignDefaultState( nIndex, aParaAdjustValue );
418
419 xPropStates.push_back( aAlignDefaultState );
420 }
421 }
422 }
423 // ----------------------------------------------------------------------
424
425 nCount = 0;
426 std::vector< XMLPropertyState >::iterator aIter = xPropStates.begin();
427 std::vector< XMLPropertyState >::iterator aEnd = xPropStates.end();
428 while( aIter != aEnd )
429 {
430 if( aIter->mnIndex != -1 )
431 nCount++;
432 aIter++;
433 }
434
435 if( nCount )
436 {
437 const OUString aEmpty;
438 aShapeInfo.msTextStyleName = mrExport.GetAutoStylePool()->Find( XML_STYLE_FAMILY_TEXT_PARAGRAPH, aEmpty, xPropStates );
439 if(!aShapeInfo.msTextStyleName.getLength())
440 {
441 // Style did not exist, add it to AutoStalePool
442 aShapeInfo.msTextStyleName = mrExport.GetAutoStylePool()->Add(XML_STYLE_FAMILY_TEXT_PARAGRAPH, aEmpty, xPropStates);
443 }
444 }
445 }
446 }
447
448 // ----------------------------------------
449 // prepare animation informations if needed
450 // ----------------------------------------
451 if( mxAnimationsExporter.is() )
452 mxAnimationsExporter->prepare( xShape, mrExport );
453
454 // check for special shapes
455
456 switch( aShapeInfo.meShapeType )
457 {
458 case XmlShapeTypeDrawConnectorShape:
459 {
460 uno::Reference< uno::XInterface > xConnection;
461
462 // create shape ids for export later
463 xPropSet->getPropertyValue( msStartShape ) >>= xConnection;
464 if( xConnection.is() )
465 mrExport.getInterfaceToIdentifierMapper().registerReference( xConnection );
466
467 xPropSet->getPropertyValue( msEndShape ) >>= xConnection;
468 if( xConnection.is() )
469 mrExport.getInterfaceToIdentifierMapper().registerReference( xConnection );
470 break;
471 }
472 case XmlShapeTypePresTableShape:
473 case XmlShapeTypeDrawTableShape:
474 {
475 try
476 {
477 uno::Reference< table::XColumnRowRange > xRange( xSet->getPropertyValue( msModel ), uno::UNO_QUERY_THROW );
478 GetShapeTableExport()->collectTableAutoStyles( xRange );
479 }
480 catch( uno::Exception& )
481 {
482 DBG_ERROR( "XMLShapeExport::collectShapeAutoStyles(): exception caught while collection auto styles for a table!" );
483 }
484 break;
485 }
486 default:
487 break;
488 }
489
490 maShapeInfos.push_back( aShapeInfo );
491 maCurrentInfo = maShapeInfos.begin();
492
493 // -----------------------------------------------------
494 // check for shape collections (group shape or 3d scene)
495 // and collect contained shapes style infos
496 // -----------------------------------------------------
497 const uno::Reference< drawing::XShape >& xCollection = aShapeInfo.xCustomShapeReplacement.is()
498 ? aShapeInfo.xCustomShapeReplacement : xShape;
499 {
500 uno::Reference< drawing::XShapes > xShapes( xCollection, uno::UNO_QUERY );
501 if( xShapes.is() )
502 {
503 collectShapesAutoStyles( xShapes );
504 }
505 }
506 }
507
508 ///////////////////////////////////////////////////////////////////////
509
510 // --> OD 2008-05-08 #refactorlists#
511 namespace
512 {
513 class NewTextListsHelper
514 {
515 public:
NewTextListsHelper(SvXMLExport & rExp)516 NewTextListsHelper( SvXMLExport& rExp )
517 : mrExport( rExp )
518 {
519 mrExport.GetTextParagraphExport()->PushNewTextListsHelper();
520 }
521
~NewTextListsHelper()522 ~NewTextListsHelper()
523 {
524 mrExport.GetTextParagraphExport()->PopTextListsHelper();
525 }
526
527 private:
528 SvXMLExport& mrExport;
529 };
530 }
531 // This method exports the given XShape
exportShape(const uno::Reference<drawing::XShape> & xShape,sal_Int32 nFeatures,com::sun::star::awt::Point * pRefPoint,SvXMLAttributeList * pAttrList)532 void XMLShapeExport::exportShape(const uno::Reference< drawing::XShape >& xShape,
533 sal_Int32 nFeatures /* = SEF_DEFAULT */,
534 com::sun::star::awt::Point* pRefPoint /* = NULL */,
535 SvXMLAttributeList* pAttrList /* = NULL */ )
536 {
537 if( maCurrentShapesIter == maShapesInfos.end() )
538 {
539 DBG_ERROR( "XMLShapeExport::exportShape(): no auto styles where collected before export" );
540 return;
541 }
542 sal_Int32 nZIndex = 0;
543 uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY );
544
545
546 ::std::auto_ptr< SvXMLElementExport > mpHyperlinkElement;
547
548 // export hyperlinks with <a><shape/></a>. Currently only in draw since draw
549 // does not support document events
550 if( xSet.is() && (GetExport().GetModelType() == SvtModuleOptions::E_DRAW) ) try
551 {
552 presentation::ClickAction eAction = presentation::ClickAction_NONE;
553 xSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("OnClick"))) >>= eAction;
554
555 if( (eAction == presentation::ClickAction_DOCUMENT) ||
556 (eAction == presentation::ClickAction_BOOKMARK) )
557 {
558 OUString sURL;
559 xSet->getPropertyValue(msBookmark) >>= sURL;
560
561 if( sURL.getLength() )
562 {
563 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sURL );
564 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
565 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
566 mpHyperlinkElement.reset( new SvXMLElementExport(mrExport, XML_NAMESPACE_DRAW, XML_A, sal_True, sal_True) );
567 }
568 }
569 }
570 catch( uno::Exception& )
571 {
572 DBG_ERROR("XMLShapeExport::exportShape(): exception during hyperlink export");
573 }
574
575
576 if( xSet.is() )
577 xSet->getPropertyValue(msZIndex) >>= nZIndex;
578
579 ImplXMLShapeExportInfoVector& aShapeInfoVector = (*maCurrentShapesIter).second;
580
581 if( (sal_Int32)aShapeInfoVector.size() <= nZIndex )
582 {
583 DBG_ERROR( "XMLShapeExport::exportShape(): no shape info collected for a given shape" );
584 return;
585 }
586
587 // --> OD 2008-05-08 #refactorlists#
588 NewTextListsHelper aNewTextListsHelper( mrExport );
589 // <--
590
591 const ImplXMLShapeExportInfo& aShapeInfo = aShapeInfoVector[nZIndex];
592
593
594 #ifdef DBG_UTIL
595 // ---------------------------------------
596 // check if this is the correct ShapesInfo
597 // ---------------------------------------
598 uno::Reference< container::XChild > xChild( xShape, uno::UNO_QUERY );
599 if( xChild.is() )
600 {
601 uno::Reference< drawing::XShapes > xParent( xChild->getParent(), uno::UNO_QUERY );
602 DBG_ASSERT( xParent.is() && xParent.get() == (*maCurrentShapesIter).first.get(), "XMLShapeExport::exportShape(): Wrong call to XMLShapeExport::seekShapes()" );
603 }
604
605 // -----------------------------
606 // first compute the shapes type
607 // -----------------------------
608 {
609 XmlShapeType eShapeType(XmlShapeTypeNotYetSet);
610 ImpCalcShapeType(xShape, eShapeType);
611
612 DBG_ASSERT( eShapeType == aShapeInfo.meShapeType, "exportShape callings do not correspond to collectShapeAutoStyles calls!" );
613 }
614 #endif
615
616 // ----------------------------------------
617 // collect animation informations if needed
618 // ----------------------------------------
619 if( mxAnimationsExporter.is() )
620 mxAnimationsExporter->collect( xShape, mrExport );
621
622 // -------------------------------
623 // export shapes name if he has one
624 // --> OD 2006-03-13 #i51726#
625 // Export of the shape name for text documents only if the OpenDocument
626 // file format is written - exceptions are group shapes.
627 // Note: Writer documents in OpenOffice.org file format doesn't contain
628 // any names for shapes, except for group shapes.
629 // -------------------------------
630 {
631 // --> OD 2006-03-10 #i51726#
632 if ( ( GetExport().GetModelType() != SvtModuleOptions::E_WRITER &&
633 GetExport().GetModelType() != SvtModuleOptions::E_WRITERWEB &&
634 GetExport().GetModelType() != SvtModuleOptions::E_WRITERGLOBAL ) ||
635 ( GetExport().getExportFlags() & EXPORT_OASIS ) != 0 ||
636 aShapeInfo.meShapeType == XmlShapeTypeDrawGroupShape ||
637 ( aShapeInfo.meShapeType == XmlShapeTypeDrawCustomShape &&
638 aShapeInfo.xCustomShapeReplacement.is() ) )
639 {
640 uno::Reference< container::XNamed > xNamed( xShape, uno::UNO_QUERY );
641 if( xNamed.is() )
642 {
643 const OUString aName( xNamed->getName() );
644 if( aName.getLength() )
645 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_NAME, aName );
646 }
647 }
648 // <--
649 }
650
651 // ------------------
652 // export style name
653 // ------------------
654 if( aShapeInfo.msStyleName.getLength() != 0 )
655 {
656 if(XML_STYLE_FAMILY_SD_GRAPHICS_ID == aShapeInfo.mnFamily)
657 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_STYLE_NAME, mrExport.EncodeStyleName( aShapeInfo.msStyleName) );
658 else
659 mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_STYLE_NAME, mrExport.EncodeStyleName( aShapeInfo.msStyleName) );
660 }
661
662 // ------------------
663 // export text style name
664 // ------------------
665 if( aShapeInfo.msTextStyleName.getLength() != 0 )
666 {
667 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_TEXT_STYLE_NAME, aShapeInfo.msTextStyleName );
668 }
669
670 // --------------------------
671 // export shapes id if needed
672 // --------------------------
673 {
674 uno::Reference< uno::XInterface > xRef( xShape, uno::UNO_QUERY );
675 const OUString& rShapeId = mrExport.getInterfaceToIdentifierMapper().getIdentifier( xRef );
676 if( rShapeId.getLength() )
677 {
678 mrExport.AddAttributeIdLegacy(XML_NAMESPACE_DRAW, rShapeId);
679 }
680 }
681
682 // --------------------------
683 // export layer information
684 // --------------------------
685 if( IsLayerExportEnabled() )
686 {
687 // check for group or scene shape and not export layer if this is one
688 uno::Reference< drawing::XShapes > xShapes( xShape, uno::UNO_QUERY );
689 if( !xShapes.is() )
690 {
691 try
692 {
693 uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
694 OUString aLayerName;
695 xProps->getPropertyValue( OUString::createFromAscii( "LayerName" ) ) >>= aLayerName;
696 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_LAYER, aLayerName );
697
698 }
699 catch( uno::Exception e )
700 {
701 DBG_ERROR( "could not export layer name for shape!" );
702 }
703 }
704 }
705
706 // export draw:display (do not export in ODF 1.2 or older)
707 if( xSet.is() && ( mrExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012 ) )
708 {
709 if( aShapeInfo.meShapeType != XmlShapeTypeDrawPageShape && aShapeInfo.meShapeType != XmlShapeTypePresPageShape &&
710 aShapeInfo.meShapeType != XmlShapeTypeHandoutShape && aShapeInfo.meShapeType != XmlShapeTypeDrawChartShape )
711
712 try
713 {
714 sal_Bool bVisible = sal_True;
715 sal_Bool bPrintable = sal_True;
716
717 xSet->getPropertyValue(msVisible) >>= bVisible;
718 xSet->getPropertyValue(msPrintable) >>= bPrintable;
719
720 XMLTokenEnum eDisplayToken = XML_TOKEN_INVALID;
721 const unsigned short nDisplay = (bVisible ? 2 : 0) | (bPrintable ? 1 : 0);
722 switch( nDisplay )
723 {
724 case 0: eDisplayToken = XML_NONE; break;
725 case 1: eDisplayToken = XML_PRINTER; break;
726 case 2: eDisplayToken = XML_SCREEN; break;
727 // case 3: eDisplayToken = XML_ALWAYS break; this is the default
728 }
729
730 if( eDisplayToken != XML_TOKEN_INVALID )
731 mrExport.AddAttribute(XML_NAMESPACE_DRAW_EXT, XML_DISPLAY, eDisplayToken );
732 }
733 catch( uno::Exception& )
734 {
735 DBG_ERROR( "XMLShapeExport::exportShape(), exception caught!" );
736 }
737 }
738
739 // #82003# test export count
740 // #91587# ALWAYS increment since now ALL to be exported shapes are counted.
741 if(mrExport.GetShapeExport()->IsHandleProgressBarEnabled())
742 {
743 mrExport.GetProgressBarHelper()->Increment();
744 }
745
746 onExport( xShape );
747
748 // --------------------
749 // export shape element
750 // --------------------
751 switch(aShapeInfo.meShapeType)
752 {
753 case XmlShapeTypeDrawRectangleShape:
754 {
755 ImpExportRectangleShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
756 break;
757 }
758 case XmlShapeTypeDrawEllipseShape:
759 {
760 ImpExportEllipseShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
761 break;
762 }
763 case XmlShapeTypeDrawLineShape:
764 {
765 ImpExportLineShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
766 break;
767 }
768 case XmlShapeTypeDrawPolyPolygonShape: // closed PolyPolygon
769 case XmlShapeTypeDrawPolyLineShape: // open PolyPolygon
770 case XmlShapeTypeDrawClosedBezierShape: // closed PolyPolygon containing curves
771 case XmlShapeTypeDrawOpenBezierShape: // open PolyPolygon containing curves
772 {
773 ImpExportPolygonShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
774 break;
775 }
776
777 case XmlShapeTypeDrawTextShape:
778 case XmlShapeTypePresTitleTextShape:
779 case XmlShapeTypePresOutlinerShape:
780 case XmlShapeTypePresSubtitleShape:
781 case XmlShapeTypePresNotesShape:
782 case XmlShapeTypePresHeaderShape:
783 case XmlShapeTypePresFooterShape:
784 case XmlShapeTypePresSlideNumberShape:
785 case XmlShapeTypePresDateTimeShape:
786 {
787 ImpExportTextBoxShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
788 break;
789 }
790
791 case XmlShapeTypeDrawGraphicObjectShape:
792 case XmlShapeTypePresGraphicObjectShape:
793 {
794 ImpExportGraphicObjectShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
795 break;
796 }
797
798 case XmlShapeTypeDrawChartShape:
799 case XmlShapeTypePresChartShape:
800 {
801 ImpExportChartShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint, pAttrList );
802 break;
803 }
804
805 case XmlShapeTypeDrawControlShape:
806 {
807 ImpExportControlShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
808 break;
809 }
810
811 case XmlShapeTypeDrawConnectorShape:
812 {
813 ImpExportConnectorShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
814 break;
815 }
816
817 case XmlShapeTypeDrawMeasureShape:
818 {
819 ImpExportMeasureShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
820 break;
821 }
822
823 case XmlShapeTypeDrawOLE2Shape:
824 case XmlShapeTypePresOLE2Shape:
825 case XmlShapeTypeDrawSheetShape:
826 case XmlShapeTypePresSheetShape:
827 {
828 ImpExportOLE2Shape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
829 break;
830 }
831
832 case XmlShapeTypePresTableShape:
833 case XmlShapeTypeDrawTableShape:
834 {
835 ImpExportTableShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
836 break;
837 }
838
839 case XmlShapeTypeDrawPageShape:
840 case XmlShapeTypePresPageShape:
841 case XmlShapeTypeHandoutShape:
842 {
843 ImpExportPageShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
844 break;
845 }
846
847 case XmlShapeTypeDrawCaptionShape:
848 {
849 ImpExportCaptionShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
850 break;
851 }
852
853 case XmlShapeTypeDraw3DCubeObject:
854 case XmlShapeTypeDraw3DSphereObject:
855 case XmlShapeTypeDraw3DLatheObject:
856 case XmlShapeTypeDraw3DExtrudeObject:
857 {
858 ImpExport3DShape(xShape, aShapeInfo.meShapeType);
859 break;
860 }
861
862 case XmlShapeTypeDraw3DSceneObject:
863 {
864 ImpExport3DSceneShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
865 break;
866 }
867
868 case XmlShapeTypeDrawGroupShape:
869 {
870 // empty group
871 ImpExportGroupShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
872 break;
873 }
874
875 case XmlShapeTypeDrawFrameShape:
876 {
877 ImpExportFrameShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
878 break;
879 }
880
881 case XmlShapeTypeDrawAppletShape:
882 {
883 ImpExportAppletShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
884 break;
885 }
886
887 case XmlShapeTypeDrawPluginShape:
888 {
889 ImpExportPluginShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
890 break;
891 }
892
893 case XmlShapeTypeDrawCustomShape:
894 {
895 if ( aShapeInfo.xCustomShapeReplacement.is() )
896 ImpExportGroupShape( aShapeInfo.xCustomShapeReplacement, XmlShapeTypeDrawGroupShape, nFeatures, pRefPoint );
897 else
898 ImpExportCustomShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
899 break;
900 }
901
902 case XmlShapeTypePresMediaShape:
903 case XmlShapeTypeDrawMediaShape:
904 {
905 ImpExportMediaShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint );
906 break;
907 }
908
909 case XmlShapeTypePresOrgChartShape:
910 case XmlShapeTypeUnknown:
911 case XmlShapeTypeNotYetSet:
912 default:
913 {
914 // this should never happen and is an error
915 DBG_ERROR("XMLEXP: WriteShape: unknown or unexpected type of shape in export!");
916 break;
917 }
918 }
919
920 mpHyperlinkElement.reset();
921
922 // #97489# #97111#
923 // if there was an error and no element for the shape was exported
924 // we need to clear the attribute list or the attributes will be
925 // set on the next exported element, which can result in corrupt
926 // xml files due to duplicate attributes
927
928 mrExport.CheckAttrList(); // asserts in non pro if we have attributes left
929 mrExport.ClearAttrList(); // clears the attributes
930 }
931
932 ///////////////////////////////////////////////////////////////////////
933
934 // This method collects all automatic styles for the shapes inside the given XShapes collection
collectShapesAutoStyles(const uno::Reference<drawing::XShapes> & xShapes)935 void XMLShapeExport::collectShapesAutoStyles( const uno::Reference < drawing::XShapes >& xShapes )
936 {
937 ShapesInfos::iterator aOldCurrentShapesIter = maCurrentShapesIter;
938 seekShapes( xShapes );
939
940 uno::Reference< drawing::XShape > xShape;
941 const sal_Int32 nShapeCount(xShapes->getCount());
942 for(sal_Int32 nShapeId = 0; nShapeId < nShapeCount; nShapeId++)
943 {
944 xShapes->getByIndex(nShapeId) >>= xShape;
945 DBG_ASSERT( xShape.is(), "Shape without a XShape?" );
946 if(!xShape.is())
947 continue;
948
949 collectShapeAutoStyles( xShape );
950 }
951
952 maCurrentShapesIter = aOldCurrentShapesIter;
953 }
954
955 ///////////////////////////////////////////////////////////////////////
956
957 // This method exports all XShape inside the given XShapes collection
exportShapes(const uno::Reference<drawing::XShapes> & xShapes,sal_Int32 nFeatures,awt::Point * pRefPoint)958 void XMLShapeExport::exportShapes( const uno::Reference < drawing::XShapes >& xShapes, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */ )
959 {
960 ShapesInfos::iterator aOldCurrentShapesIter = maCurrentShapesIter;
961 seekShapes( xShapes );
962
963 uno::Reference< drawing::XShape > xShape;
964 const sal_Int32 nShapeCount(xShapes->getCount());
965 for(sal_Int32 nShapeId = 0; nShapeId < nShapeCount; nShapeId++)
966 {
967 xShapes->getByIndex(nShapeId) >>= xShape;
968 DBG_ASSERT( xShape.is(), "Shape without a XShape?" );
969 if(!xShape.is())
970 continue;
971
972 exportShape( xShape, nFeatures, pRefPoint );
973 }
974
975 maCurrentShapesIter = aOldCurrentShapesIter;
976 }
977
978 ///////////////////////////////////////////////////////////////////////
979
seekShapes(const uno::Reference<drawing::XShapes> & xShapes)980 void XMLShapeExport::seekShapes( const uno::Reference< drawing::XShapes >& xShapes ) throw()
981 {
982 if( xShapes.is() )
983 {
984 maCurrentShapesIter = maShapesInfos.find( xShapes );
985 if( maCurrentShapesIter == maShapesInfos.end() )
986 {
987 ImplXMLShapeExportInfoVector aNewInfoVector;
988 aNewInfoVector.resize( (ShapesInfos::size_type) xShapes->getCount() );
989 maShapesInfos[ xShapes ] = aNewInfoVector;
990
991 maCurrentShapesIter = maShapesInfos.find( xShapes );
992
993 DBG_ASSERT( maCurrentShapesIter != maShapesInfos.end(), "XMLShapeExport::seekShapes(): insert into stl::map failed" );
994 }
995
996 DBG_ASSERT( (*maCurrentShapesIter).second.size() == (ShapesInfos::size_type)xShapes->getCount(), "XMLShapeExport::seekShapes(): XShapes size varied between calls" );
997
998 }
999 else
1000 {
1001 maCurrentShapesIter = maShapesInfos.end();
1002 }
1003 }
1004
1005 ///////////////////////////////////////////////////////////////////////
1006
exportAutoStyles()1007 void XMLShapeExport::exportAutoStyles()
1008 {
1009 // export all autostyle infos
1010
1011 // ...for graphic
1012 // if(IsFamilyGraphicUsed())
1013 {
1014 GetExport().GetAutoStylePool()->exportXML(
1015 XML_STYLE_FAMILY_SD_GRAPHICS_ID
1016 , GetExport().GetDocHandler(),
1017 GetExport().GetMM100UnitConverter(),
1018 GetExport().GetNamespaceMap()
1019 );
1020 }
1021
1022 // ...for presentation
1023 // if(IsFamilyPresentationUsed())
1024 {
1025 GetExport().GetAutoStylePool()->exportXML(
1026 XML_STYLE_FAMILY_SD_PRESENTATION_ID
1027 , GetExport().GetDocHandler(),
1028 GetExport().GetMM100UnitConverter(),
1029 GetExport().GetNamespaceMap()
1030 );
1031 }
1032
1033 if( mxShapeTableExport.is() )
1034 mxShapeTableExport->exportAutoStyles();
1035 }
1036
1037 ///////////////////////////////////////////////////////////////////////
1038
1039 /// returns the export property mapper for external chaining
CreateShapePropMapper(SvXMLExport & rExport)1040 SvXMLExportPropertyMapper* XMLShapeExport::CreateShapePropMapper(
1041 SvXMLExport& rExport )
1042 {
1043 UniReference< XMLPropertyHandlerFactory > xFactory = new XMLSdPropHdlFactory( rExport.GetModel(), rExport );
1044 UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper( xFactory );
1045 SvXMLExportPropertyMapper* pResult =
1046 new XMLShapeExportPropertyMapper( xMapper,
1047 (XMLTextListAutoStylePool*)&rExport.GetTextParagraphExport()->GetListAutoStylePool(),
1048 rExport );
1049 // chain text attributes
1050 return pResult;
1051 }
1052
1053 ///////////////////////////////////////////////////////////////////////
1054
ImpCalcShapeType(const uno::Reference<drawing::XShape> & xShape,XmlShapeType & eShapeType)1055 void XMLShapeExport::ImpCalcShapeType(const uno::Reference< drawing::XShape >& xShape,
1056 XmlShapeType& eShapeType)
1057 {
1058 // set in every case, so init here
1059 eShapeType = XmlShapeTypeUnknown;
1060
1061 uno::Reference< drawing::XShapeDescriptor > xShapeDescriptor(xShape, uno::UNO_QUERY);
1062 if(xShapeDescriptor.is())
1063 {
1064 String aType((OUString)xShapeDescriptor->getShapeType());
1065
1066 if(aType.EqualsAscii((const sal_Char*)"com.sun.star.", 0, 13))
1067 {
1068 if(aType.EqualsAscii("drawing.", 13, 8))
1069 {
1070 // drawing shapes
1071 if (aType.EqualsAscii("Rectangle", 21, 9)) { eShapeType = XmlShapeTypeDrawRectangleShape; }
1072
1073 // #i72177# Note: Correcting CustomShape, CustomShape->Custom, len from 9 (was wrong anyways) to 6.
1074 // As can be seen at the other compares, the appendix "Shape" is left out of the comparison.
1075 else if(aType.EqualsAscii("Custom", 21, 6)) { eShapeType = XmlShapeTypeDrawCustomShape; }
1076
1077 else if(aType.EqualsAscii("Ellipse", 21, 7)) { eShapeType = XmlShapeTypeDrawEllipseShape; }
1078 else if(aType.EqualsAscii("Control", 21, 7)) { eShapeType = XmlShapeTypeDrawControlShape; }
1079 else if(aType.EqualsAscii("Connector", 21, 9)) { eShapeType = XmlShapeTypeDrawConnectorShape; }
1080 else if(aType.EqualsAscii("Measure", 21, 7)) { eShapeType = XmlShapeTypeDrawMeasureShape; }
1081 else if(aType.EqualsAscii("Line", 21, 4)) { eShapeType = XmlShapeTypeDrawLineShape; }
1082
1083 // #i72177# Note: This covers two types by purpose, PolyPolygonShape and PolyPolygonPathShape
1084 else if(aType.EqualsAscii("PolyPolygon", 21, 11)) { eShapeType = XmlShapeTypeDrawPolyPolygonShape; }
1085
1086 // #i72177# Note: This covers two types by purpose, PolyLineShape and PolyLinePathShape
1087 else if(aType.EqualsAscii("PolyLine", 21, 8)) { eShapeType = XmlShapeTypeDrawPolyLineShape; }
1088
1089 else if(aType.EqualsAscii("OpenBezier", 21, 10)) { eShapeType = XmlShapeTypeDrawOpenBezierShape; }
1090 else if(aType.EqualsAscii("ClosedBezier", 21, 12)) { eShapeType = XmlShapeTypeDrawClosedBezierShape; }
1091
1092 // #i72177# FreeHand (opened and closed) now supports the types OpenFreeHandShape and
1093 // ClosedFreeHandShape respectively. Represent them as bezier shapes
1094 else if(aType.EqualsAscii("OpenFreeHand", 21, 12)) { eShapeType = XmlShapeTypeDrawOpenBezierShape; }
1095 else if(aType.EqualsAscii("ClosedFreeHand", 21, 14)) { eShapeType = XmlShapeTypeDrawClosedBezierShape; }
1096
1097 else if(aType.EqualsAscii("GraphicObject", 21, 13)) { eShapeType = XmlShapeTypeDrawGraphicObjectShape; }
1098 else if(aType.EqualsAscii("Group", 21, 5)) { eShapeType = XmlShapeTypeDrawGroupShape; }
1099 else if(aType.EqualsAscii("Text", 21, 4)) { eShapeType = XmlShapeTypeDrawTextShape; }
1100 else if(aType.EqualsAscii("OLE2", 21, 4))
1101 {
1102 eShapeType = XmlShapeTypeDrawOLE2Shape;
1103
1104 // get info about presentation shape
1105 uno::Reference <beans::XPropertySet> xPropSet(xShape, uno::UNO_QUERY);
1106
1107 if(xPropSet.is())
1108 {
1109 rtl::OUString sCLSID;
1110 if(xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID"))) >>= sCLSID)
1111 {
1112 if (sCLSID.equals(mrExport.GetChartExport()->getChartCLSID()))
1113 {
1114 eShapeType = XmlShapeTypeDrawChartShape;
1115 }
1116 else if (
1117 sCLSID.equals(rtl::OUString( SvGlobalName( SO3_SC_CLASSID ).GetHexName()))
1118 // #110680#
1119 // same reaction for binfilter
1120 || sCLSID.equals(rtl::OUString( SvGlobalName( BF_SO3_SC_CLASSID ).GetHexName()))
1121 )
1122 {
1123 eShapeType = XmlShapeTypeDrawSheetShape;
1124 }
1125 else
1126 {
1127 // general OLE2 Object
1128 }
1129 }
1130 }
1131 }
1132 else if(aType.EqualsAscii("Page", 21, 4)) { eShapeType = XmlShapeTypeDrawPageShape; }
1133 else if(aType.EqualsAscii("Frame", 21, 5)) { eShapeType = XmlShapeTypeDrawFrameShape; }
1134 else if(aType.EqualsAscii("Caption", 21, 7)) { eShapeType = XmlShapeTypeDrawCaptionShape; }
1135 else if(aType.EqualsAscii("Plugin", 21, 6)) { eShapeType = XmlShapeTypeDrawPluginShape; }
1136 else if(aType.EqualsAscii("Applet", 21, 6)) { eShapeType = XmlShapeTypeDrawAppletShape; }
1137 else if(aType.EqualsAscii("MediaShape", 21, 10)) { eShapeType = XmlShapeTypeDrawMediaShape; }
1138 else if(aType.EqualsAscii("TableShape", 21, 10)) { eShapeType = XmlShapeTypeDrawTableShape; }
1139
1140 // 3D shapes
1141 else if(aType.EqualsAscii("Scene", 21 + 7, 5)) { eShapeType = XmlShapeTypeDraw3DSceneObject; }
1142 else if(aType.EqualsAscii("Cube", 21 + 7, 4)) { eShapeType = XmlShapeTypeDraw3DCubeObject; }
1143 else if(aType.EqualsAscii("Sphere", 21 + 7, 6)) { eShapeType = XmlShapeTypeDraw3DSphereObject; }
1144 else if(aType.EqualsAscii("Lathe", 21 + 7, 5)) { eShapeType = XmlShapeTypeDraw3DLatheObject; }
1145 else if(aType.EqualsAscii("Extrude", 21 + 7, 7)) { eShapeType = XmlShapeTypeDraw3DExtrudeObject; }
1146 }
1147 else if(aType.EqualsAscii("presentation.", 13, 13))
1148 {
1149 // presentation shapes
1150 if (aType.EqualsAscii("TitleText", 26, 9)) { eShapeType = XmlShapeTypePresTitleTextShape; }
1151 else if(aType.EqualsAscii("Outliner", 26, 8)) { eShapeType = XmlShapeTypePresOutlinerShape; }
1152 else if(aType.EqualsAscii("Subtitle", 26, 8)) { eShapeType = XmlShapeTypePresSubtitleShape; }
1153 else if(aType.EqualsAscii("GraphicObject", 26, 13)) { eShapeType = XmlShapeTypePresGraphicObjectShape; }
1154 else if(aType.EqualsAscii("Page", 26, 4)) { eShapeType = XmlShapeTypePresPageShape; }
1155 else if(aType.EqualsAscii("OLE2", 26, 4))
1156 {
1157 eShapeType = XmlShapeTypePresOLE2Shape;
1158
1159 // get info about presentation shape
1160 uno::Reference <beans::XPropertySet> xPropSet(xShape, uno::UNO_QUERY);
1161
1162 if(xPropSet.is()) try
1163 {
1164 rtl::OUString sCLSID;
1165 if(xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID"))) >>= sCLSID)
1166 {
1167 if( sCLSID.equals(rtl::OUString( SvGlobalName( SO3_SC_CLASSID ).GetHexName())) ||
1168 sCLSID.equals(rtl::OUString( SvGlobalName( BF_SO3_SC_CLASSID ).GetHexName())) )
1169 {
1170 eShapeType = XmlShapeTypePresSheetShape;
1171 }
1172 }
1173 }
1174 catch( uno::Exception& )
1175 {
1176 DBG_ERROR( "XMLShapeExport::ImpCalcShapeType(), expected ole shape to have the CLSID property?" );
1177 }
1178 }
1179 else if(aType.EqualsAscii("Chart", 26, 5)) { eShapeType = XmlShapeTypePresChartShape; }
1180 else if(aType.EqualsAscii("OrgChart", 26, 8)) { eShapeType = XmlShapeTypePresOrgChartShape; }
1181 else if(aType.EqualsAscii("CalcShape", 26, 9)) { eShapeType = XmlShapeTypePresSheetShape; }
1182 else if(aType.EqualsAscii("TableShape", 26, 10)) { eShapeType = XmlShapeTypePresTableShape; }
1183 else if(aType.EqualsAscii("Notes", 26, 5)) { eShapeType = XmlShapeTypePresNotesShape; }
1184 else if(aType.EqualsAscii("HandoutShape", 26, 12)) { eShapeType = XmlShapeTypeHandoutShape; }
1185 else if(aType.EqualsAscii("HeaderShape", 26, 11)) { eShapeType = XmlShapeTypePresHeaderShape; }
1186 else if(aType.EqualsAscii("FooterShape", 26, 11)) { eShapeType = XmlShapeTypePresFooterShape; }
1187 else if(aType.EqualsAscii("SlideNumberShape", 26, 16)) { eShapeType = XmlShapeTypePresSlideNumberShape; }
1188 else if(aType.EqualsAscii("DateTimeShape", 26, 13)) { eShapeType = XmlShapeTypePresDateTimeShape; }
1189 else if(aType.EqualsAscii("MediaShape", 26, 10)) { eShapeType = XmlShapeTypePresMediaShape; }
1190 }
1191 }
1192 }
1193 }
1194
1195 ///////////////////////////////////////////////////////////////////////
1196
1197 extern SvXMLEnumMapEntry aXML_GlueAlignment_EnumMap[];
1198 extern SvXMLEnumMapEntry aXML_GlueEscapeDirection_EnumMap[];
1199
1200 /** exports all user defined glue points */
ImpExportGluePoints(const uno::Reference<drawing::XShape> & xShape)1201 void XMLShapeExport::ImpExportGluePoints( const uno::Reference< drawing::XShape >& xShape )
1202 {
1203 uno::Reference< drawing::XGluePointsSupplier > xSupplier( xShape, uno::UNO_QUERY );
1204 if( !xSupplier.is() )
1205 return;
1206
1207 uno::Reference< container::XIdentifierAccess > xGluePoints( xSupplier->getGluePoints(), uno::UNO_QUERY );
1208 if( !xGluePoints.is() )
1209 return;
1210
1211 drawing::GluePoint2 aGluePoint;
1212
1213 uno::Sequence< sal_Int32 > aIdSequence( xGluePoints->getIdentifiers() );
1214
1215 const sal_Int32 nCount = aIdSequence.getLength();
1216 for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
1217 {
1218 const sal_Int32 nIdentifier = aIdSequence[nIndex];
1219 if( (xGluePoints->getByIdentifier( nIdentifier ) >>= aGluePoint) && aGluePoint.IsUserDefined )
1220 {
1221 // export only user defined glue points
1222
1223 const OUString sId( OUString::valueOf( nIdentifier ) );
1224 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_ID, sId );
1225
1226 mrExport.GetMM100UnitConverter().convertMeasure(msBuffer, aGluePoint.Position.X);
1227 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X, msBuffer.makeStringAndClear());
1228
1229 mrExport.GetMM100UnitConverter().convertMeasure(msBuffer, aGluePoint.Position.Y);
1230 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y, msBuffer.makeStringAndClear());
1231
1232 if( !aGluePoint.IsRelative )
1233 {
1234 SvXMLUnitConverter::convertEnum( msBuffer, aGluePoint.PositionAlignment, aXML_GlueAlignment_EnumMap );
1235 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_ALIGN, msBuffer.makeStringAndClear() );
1236 }
1237
1238 if( aGluePoint.Escape != drawing::EscapeDirection_SMART )
1239 {
1240 SvXMLUnitConverter::convertEnum( msBuffer, aGluePoint.Escape, aXML_GlueEscapeDirection_EnumMap );
1241 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_ESCAPE_DIRECTION, msBuffer.makeStringAndClear() );
1242 }
1243
1244 SvXMLElementExport aEventsElemt(mrExport, XML_NAMESPACE_DRAW, XML_GLUE_POINT, sal_True, sal_True);
1245 }
1246 }
1247 }
1248
ExportGraphicDefaults()1249 void XMLShapeExport::ExportGraphicDefaults()
1250 {
1251 XMLStyleExport aStEx(mrExport, OUString(), mrExport.GetAutoStylePool().get());
1252
1253 // construct PropertySetMapper
1254 UniReference< SvXMLExportPropertyMapper > xPropertySetMapper( CreateShapePropMapper( mrExport ) );
1255 ((XMLShapeExportPropertyMapper*)xPropertySetMapper.get())->SetAutoStyles( sal_False );
1256
1257 // chain text attributes
1258 xPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(mrExport));
1259
1260 // chain special Writer/text frame default attributes
1261 xPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaDefaultExtPropMapper(mrExport));
1262
1263 // write graphic family default style
1264 uno::Reference< lang::XMultiServiceFactory > xFact( mrExport.GetModel(), uno::UNO_QUERY );
1265 if( xFact.is() )
1266 {
1267 try
1268 {
1269 uno::Reference< beans::XPropertySet > xDefaults( xFact->createInstance( OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.Defaults") ) ), uno::UNO_QUERY );
1270 if( xDefaults.is() )
1271 {
1272 aStEx.exportDefaultStyle( xDefaults, OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)), xPropertySetMapper );
1273
1274 // write graphic family styles
1275 aStEx.exportStyleFamily("graphics", OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)), xPropertySetMapper, sal_False, XML_STYLE_FAMILY_SD_GRAPHICS_ID);
1276 }
1277 }
1278 catch( lang::ServiceNotRegisteredException& )
1279 {
1280 }
1281 }
1282 }
1283
onExport(const com::sun::star::uno::Reference<com::sun::star::drawing::XShape> &)1284 void XMLShapeExport::onExport( const com::sun::star::uno::Reference < com::sun::star::drawing::XShape >& )
1285 {
1286 }
1287
GetShapeTableExport()1288 const rtl::Reference< XMLTableExport >& XMLShapeExport::GetShapeTableExport()
1289 {
1290 if( !mxShapeTableExport.is() )
1291 {
1292 rtl::Reference< XMLPropertyHandlerFactory > xFactory( new XMLSdPropHdlFactory( mrExport.GetModel(), mrExport ) );
1293 UniReference < XMLPropertySetMapper > xMapper( new XMLShapePropertySetMapper( xFactory.get() ) );
1294 rtl::Reference< SvXMLExportPropertyMapper > xPropertySetMapper( new XMLShapeExportPropertyMapper( xMapper, (XMLTextListAutoStylePool*)&mrExport.GetTextParagraphExport()->GetListAutoStylePool(), mrExport ) );
1295 mxShapeTableExport = new XMLTableExport( mrExport, xPropertySetMapper, xFactory );
1296 }
1297
1298 return mxShapeTableExport;
1299 }
1300