Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <tools/debug.hxx>
21 : #include <com/sun/star/document/XEventsSupplier.hpp>
22 : #include <com/sun/star/container/XNameReplace.hpp>
23 : #include <com/sun/star/presentation/ClickAction.hpp>
24 : #include <com/sun/star/drawing/FillStyle.hpp>
25 : #include <com/sun/star/drawing/LineStyle.hpp>
26 : #include <xmloff/unointerfacetouniqueidentifiermapper.hxx>
27 : #include <com/sun/star/drawing/XGluePointsSupplier.hpp>
28 : #include <com/sun/star/container/XIdentifierAccess.hpp>
29 : #include <com/sun/star/drawing/GluePoint2.hpp>
30 : #include <com/sun/star/drawing/Alignment.hpp>
31 : #include <com/sun/star/drawing/EscapeDirection.hpp>
32 : #include <com/sun/star/media/ZoomLevel.hpp>
33 : #include <com/sun/star/awt/Rectangle.hpp>
34 :
35 : #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
36 : #include <com/sun/star/container/XNameAccess.hpp>
37 : #include <comphelper/extract.hxx>
38 : #include "ximpshap.hxx"
39 : #include <xmloff/XMLBase64ImportContext.hxx>
40 : #include <xmloff/XMLShapeStyleContext.hxx>
41 : #include <xmloff/xmluconv.hxx>
42 : #include <com/sun/star/container/XNamed.hpp>
43 : #include <com/sun/star/drawing/CircleKind.hpp>
44 : #include <com/sun/star/beans/XPropertySet.hpp>
45 : #include <com/sun/star/awt/XControlModel.hpp>
46 : #include <com/sun/star/drawing/XControlShape.hpp>
47 : #include <com/sun/star/drawing/PointSequenceSequence.hpp>
48 : #include <com/sun/star/drawing/PointSequence.hpp>
49 : #include <com/sun/star/lang/XServiceInfo.hpp>
50 : #include <com/sun/star/util/XCloneable.hpp>
51 : #include <com/sun/star/beans/XMultiPropertyStates.hpp>
52 : #include "xexptran.hxx"
53 : #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
54 : #include <com/sun/star/beans/XPropertySetInfo.hpp>
55 : #include <com/sun/star/drawing/ConnectorType.hpp>
56 : #include <com/sun/star/drawing/HomogenMatrix3.hpp>
57 :
58 : #include <sax/tools/converter.hxx>
59 :
60 : #include "PropertySetMerger.hxx"
61 : #include <xmloff/families.hxx>
62 : #include "ximpstyl.hxx"
63 : #include"xmloff/xmlnmspe.hxx"
64 : #include <xmloff/xmltoken.hxx>
65 : #include "EnhancedCustomShapeToken.hxx"
66 : #include "XMLReplacementImageContext.hxx"
67 : #include "XMLImageMapContext.hxx"
68 : #include "sdpropls.hxx"
69 : #include "eventimp.hxx"
70 :
71 : #include "descriptionimp.hxx"
72 : #include "ximpcustomshape.hxx"
73 : #include "XMLEmbeddedObjectImportContext.hxx"
74 : #include "xmloff/xmlerror.hxx"
75 : #include <basegfx/matrix/b2dhommatrix.hxx>
76 : #include <com/sun/star/drawing/XEnhancedCustomShapeDefaulter.hpp>
77 : #include <com/sun/star/container/XChild.hpp>
78 : #include <com/sun/star/text/XTextDocument.hpp>
79 :
80 : using ::rtl::OUString;
81 : using ::rtl::OUStringBuffer;
82 :
83 : using namespace ::com::sun::star;
84 : using namespace ::com::sun::star::uno;
85 : using namespace ::com::sun::star::drawing;
86 : using namespace ::com::sun::star::style;
87 : using namespace ::com::sun::star::container;
88 : using namespace ::com::sun::star::document;
89 : using namespace ::xmloff::token;
90 : using namespace ::xmloff::EnhancedCustomShapeToken;
91 :
92 : SvXMLEnumMapEntry aXML_GlueAlignment_EnumMap[] =
93 : {
94 : { XML_TOP_LEFT, drawing::Alignment_TOP_LEFT },
95 : { XML_TOP, drawing::Alignment_TOP },
96 : { XML_TOP_RIGHT, drawing::Alignment_TOP_RIGHT },
97 : { XML_LEFT, drawing::Alignment_LEFT },
98 : { XML_CENTER, drawing::Alignment_CENTER },
99 : { XML_RIGHT, drawing::Alignment_RIGHT },
100 : { XML_BOTTOM_LEFT, drawing::Alignment_BOTTOM_LEFT },
101 : { XML_BOTTOM, drawing::Alignment_BOTTOM },
102 : { XML_BOTTOM_RIGHT, drawing::Alignment_BOTTOM_RIGHT },
103 : { XML_TOKEN_INVALID, 0 }
104 : };
105 :
106 : SvXMLEnumMapEntry aXML_GlueEscapeDirection_EnumMap[] =
107 : {
108 : { XML_AUTO, drawing::EscapeDirection_SMART },
109 : { XML_LEFT, drawing::EscapeDirection_LEFT },
110 : { XML_RIGHT, drawing::EscapeDirection_RIGHT },
111 : { XML_UP, drawing::EscapeDirection_UP },
112 : { XML_DOWN, drawing::EscapeDirection_DOWN },
113 : { XML_HORIZONTAL, drawing::EscapeDirection_HORIZONTAL },
114 : { XML_VERTICAL, drawing::EscapeDirection_VERTICAL },
115 : { XML_TOKEN_INVALID, 0 }
116 : };
117 :
118 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
119 :
120 4 : static bool ImpIsEmptyURL( const ::rtl::OUString& rURL )
121 : {
122 4 : if( rURL.isEmpty() )
123 0 : return true;
124 :
125 : // #i13140# Also compare against 'toplevel' URLs. which also
126 : // result in empty filename strings.
127 4 : if( 0 == rURL.compareToAscii( "#./" ) )
128 0 : return true;
129 :
130 4 : return false;
131 : }
132 :
133 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
134 :
135 0 : TYPEINIT1( SvXMLShapeContext, SvXMLImportContext );
136 12 : TYPEINIT1( SdXMLShapeContext, SvXMLShapeContext );
137 :
138 170 : SdXMLShapeContext::SdXMLShapeContext(
139 : SvXMLImport& rImport,
140 : sal_uInt16 nPrfx,
141 : const OUString& rLocalName,
142 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
143 : uno::Reference< drawing::XShapes >& rShapes,
144 : sal_Bool bTemporaryShape)
145 : : SvXMLShapeContext( rImport, nPrfx, rLocalName, bTemporaryShape )
146 : , mxShapes( rShapes )
147 : , mxAttrList(xAttrList)
148 : , mbListContextPushed( false )
149 : , mnStyleFamily(XML_STYLE_FAMILY_SD_GRAPHICS_ID)
150 : , mbIsPlaceholder(sal_False)
151 : , mbClearDefaultAttributes( true )
152 : , mbIsUserTransformed(sal_False)
153 : , mnZOrder(-1)
154 : , maSize(1, 1)
155 : , maPosition(0, 0)
156 : , mbVisible(true)
157 170 : , mbPrintable(true)
158 : {
159 170 : }
160 :
161 : //////////////////////////////////////////////////////////////////////////////
162 :
163 170 : SdXMLShapeContext::~SdXMLShapeContext()
164 : {
165 170 : }
166 :
167 : //////////////////////////////////////////////////////////////////////////////
168 :
169 115 : SvXMLImportContext *SdXMLShapeContext::CreateChildContext( sal_uInt16 p_nPrefix,
170 : const OUString& rLocalName,
171 : const uno::Reference< xml::sax::XAttributeList>& xAttrList )
172 : {
173 115 : SvXMLImportContext * pContext = NULL;
174 :
175 : // #i68101#
176 115 : if( p_nPrefix == XML_NAMESPACE_SVG &&
177 0 : (IsXMLToken( rLocalName, XML_TITLE ) || IsXMLToken( rLocalName, XML_DESC ) ) )
178 : {
179 0 : pContext = new SdXMLDescriptionContext( GetImport(), p_nPrefix, rLocalName, xAttrList, mxShape );
180 : }
181 115 : else if( p_nPrefix == XML_NAMESPACE_OFFICE && IsXMLToken( rLocalName, XML_EVENT_LISTENERS ) )
182 : {
183 0 : pContext = new SdXMLEventsContext( GetImport(), p_nPrefix, rLocalName, xAttrList, mxShape );
184 : }
185 115 : else if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_GLUE_POINT ) )
186 : {
187 0 : addGluePoint( xAttrList );
188 : }
189 115 : else if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_THUMBNAIL ) )
190 : {
191 : // search attributes for xlink:href
192 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
193 0 : for(sal_Int16 i=0; i < nAttrCount; i++)
194 : {
195 0 : OUString sAttrName = xAttrList->getNameByIndex( i );
196 0 : OUString aLocalName;
197 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
198 :
199 0 : if( nPrefix == XML_NAMESPACE_XLINK )
200 : {
201 0 : if( IsXMLToken( aLocalName, XML_HREF ) )
202 : {
203 0 : maThumbnailURL = xAttrList->getValueByIndex( i );
204 : break;
205 : }
206 : }
207 0 : }
208 : }
209 : else
210 : {
211 : // create text cursor on demand
212 115 : if( !mxCursor.is() )
213 : {
214 97 : uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
215 97 : if( xText.is() )
216 : {
217 : UniReference < XMLTextImportHelper > xTxtImport =
218 97 : GetImport().GetTextImport();
219 97 : mxOldCursor = xTxtImport->GetCursor();
220 97 : mxCursor = xText->createTextCursor();
221 97 : if( mxCursor.is() )
222 : {
223 97 : xTxtImport->SetCursor( mxCursor );
224 : }
225 :
226 : // remember old list item and block (#91964#) and reset them
227 : // for the text frame
228 97 : xTxtImport->PushListContext();
229 97 : mbListContextPushed = true;
230 97 : }
231 : }
232 :
233 : // if we have a text cursor, lets try to import some text
234 115 : if( mxCursor.is() )
235 : {
236 115 : pContext = GetImport().GetTextImport()->CreateTextChildContext(
237 230 : GetImport(), p_nPrefix, rLocalName, xAttrList );
238 : }
239 : }
240 :
241 : // call parent for content
242 115 : if(!pContext)
243 0 : pContext = SvXMLImportContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList );
244 :
245 115 : return pContext;
246 : }
247 :
248 0 : void SdXMLShapeContext::addGluePoint( const uno::Reference< xml::sax::XAttributeList>& xAttrList )
249 : {
250 : // get the glue points container for this shape if its not already there
251 0 : if( !mxGluePoints.is() )
252 : {
253 0 : uno::Reference< drawing::XGluePointsSupplier > xSupplier( mxShape, uno::UNO_QUERY );
254 0 : if( !xSupplier.is() )
255 : return;
256 :
257 0 : mxGluePoints = uno::Reference< container::XIdentifierContainer >::query( xSupplier->getGluePoints() );
258 :
259 0 : if( !mxGluePoints.is() )
260 0 : return;
261 : }
262 :
263 0 : drawing::GluePoint2 aGluePoint;
264 0 : aGluePoint.IsUserDefined = sal_True;
265 0 : aGluePoint.Position.X = 0;
266 0 : aGluePoint.Position.Y = 0;
267 0 : aGluePoint.Escape = drawing::EscapeDirection_SMART;
268 0 : aGluePoint.PositionAlignment = drawing::Alignment_CENTER;
269 0 : aGluePoint.IsRelative = sal_True;
270 :
271 0 : sal_Int32 nId = -1;
272 :
273 : // read attributes for the 3DScene
274 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
275 0 : for(sal_Int16 i=0; i < nAttrCount; i++)
276 : {
277 0 : OUString sAttrName = xAttrList->getNameByIndex( i );
278 0 : OUString aLocalName;
279 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
280 0 : const OUString sValue( xAttrList->getValueByIndex( i ) );
281 :
282 0 : if( nPrefix == XML_NAMESPACE_SVG )
283 : {
284 0 : if( IsXMLToken( aLocalName, XML_X ) )
285 : {
286 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
287 0 : aGluePoint.Position.X, sValue);
288 : }
289 0 : else if( IsXMLToken( aLocalName, XML_Y ) )
290 : {
291 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
292 0 : aGluePoint.Position.Y, sValue);
293 : }
294 : }
295 0 : else if( nPrefix == XML_NAMESPACE_DRAW )
296 : {
297 0 : if( IsXMLToken( aLocalName, XML_ID ) )
298 : {
299 0 : nId = sValue.toInt32();
300 : }
301 0 : else if( IsXMLToken( aLocalName, XML_ALIGN ) )
302 : {
303 : sal_uInt16 eKind;
304 0 : if( SvXMLUnitConverter::convertEnum( eKind, sValue, aXML_GlueAlignment_EnumMap ) )
305 : {
306 0 : aGluePoint.PositionAlignment = (drawing::Alignment)eKind;
307 0 : aGluePoint.IsRelative = sal_False;
308 : }
309 : }
310 0 : else if( IsXMLToken( aLocalName, XML_ESCAPE_DIRECTION ) )
311 : {
312 : sal_uInt16 eKind;
313 0 : if( SvXMLUnitConverter::convertEnum( eKind, sValue, aXML_GlueEscapeDirection_EnumMap ) )
314 : {
315 0 : aGluePoint.Escape = (drawing::EscapeDirection)eKind;
316 : }
317 : }
318 : }
319 0 : }
320 :
321 0 : if( nId != -1 )
322 : {
323 : try
324 : {
325 0 : sal_Int32 nInternalId = mxGluePoints->insert( uno::makeAny( aGluePoint ) );
326 0 : GetImport().GetShapeImport()->addGluePointMapping( mxShape, nId, nInternalId );
327 : }
328 0 : catch(const uno::Exception&)
329 : {
330 : OSL_FAIL( "exception during setting of glue points!");
331 : }
332 : }
333 : }
334 : //////////////////////////////////////////////////////////////////////////////
335 :
336 123 : void SdXMLShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
337 : {
338 123 : GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
339 123 : }
340 :
341 170 : void SdXMLShapeContext::EndElement()
342 : {
343 170 : if(mxCursor.is())
344 : {
345 : // delete addition newline
346 97 : const OUString aEmpty;
347 97 : mxCursor->gotoEnd( sal_False );
348 97 : mxCursor->goLeft( 1, sal_True );
349 97 : mxCursor->setString( aEmpty );
350 :
351 : // reset cursor
352 97 : GetImport().GetTextImport()->ResetCursor();
353 : }
354 :
355 170 : if(mxOldCursor.is())
356 1 : GetImport().GetTextImport()->SetCursor( mxOldCursor );
357 :
358 : // reinstall old list item (if necessary) #91964#
359 170 : if (mbListContextPushed) {
360 97 : GetImport().GetTextImport()->PopListContext();
361 : }
362 :
363 170 : if( !msHyperlink.isEmpty() ) try
364 : {
365 0 : uno::Reference< beans::XPropertySet > xProp( mxShape, uno::UNO_QUERY );
366 :
367 0 : rtl::OUString sLink( "Hyperlink" );
368 0 : if ( xProp.is() && xProp->getPropertySetInfo()->hasPropertyByName( sLink ) )
369 0 : xProp->setPropertyValue( sLink, uno::Any( msHyperlink ) );
370 0 : Reference< XEventsSupplier > xEventsSupplier( mxShape, UNO_QUERY_THROW );
371 0 : const OUString sBookmark( "Bookmark" );
372 :
373 0 : if( xEventsSupplier.is() )
374 : {
375 0 : const OUString sEventType( "EventType" );
376 0 : const OUString sClickAction( "ClickAction" );
377 :
378 0 : Reference< XNameReplace > xEvents( xEventsSupplier->getEvents(), UNO_QUERY_THROW );
379 :
380 0 : uno::Sequence< beans::PropertyValue > aProperties( 3 );
381 0 : aProperties[0].Name = sEventType;
382 0 : aProperties[0].Handle = -1;
383 0 : aProperties[0].Value <<= OUString( "Presentation" );
384 0 : aProperties[0].State = beans::PropertyState_DIRECT_VALUE;
385 :
386 0 : aProperties[1].Name = sClickAction;
387 0 : aProperties[1].Handle = -1;
388 0 : aProperties[1].Value <<= ::com::sun::star::presentation::ClickAction_DOCUMENT;
389 0 : aProperties[1].State = beans::PropertyState_DIRECT_VALUE;
390 :
391 0 : aProperties[2].Name = sBookmark;
392 0 : aProperties[2].Handle = -1;
393 0 : aProperties[2].Value <<= msHyperlink;
394 0 : aProperties[2].State = beans::PropertyState_DIRECT_VALUE;
395 :
396 0 : const OUString sAPIEventName( "OnClick" );
397 0 : xEvents->replaceByName( sAPIEventName, Any( aProperties ) );
398 : }
399 : else
400 : {
401 : // in draw use the Bookmark property
402 0 : Reference< beans::XPropertySet > xSet( mxShape, UNO_QUERY_THROW );
403 0 : xSet->setPropertyValue( sBookmark, Any( msHyperlink ) );
404 0 : xSet->setPropertyValue( OUString( "OnClick" ), Any( ::com::sun::star::presentation::ClickAction_DOCUMENT ) );
405 0 : }
406 : }
407 0 : catch(const Exception&)
408 : {
409 : OSL_FAIL("xmloff::SdXMLShapeContext::EndElement(), exception caught while setting hyperlink!");
410 : }
411 :
412 170 : if( mxLockable.is() )
413 134 : mxLockable->removeActionLock();
414 170 : }
415 :
416 : //////////////////////////////////////////////////////////////////////////////
417 :
418 134 : void SdXMLShapeContext::AddShape(uno::Reference< drawing::XShape >& xShape)
419 : {
420 134 : if(xShape.is())
421 : {
422 : // set shape local
423 134 : mxShape = xShape;
424 :
425 134 : if(!maShapeName.isEmpty())
426 : {
427 0 : uno::Reference< container::XNamed > xNamed( mxShape, uno::UNO_QUERY );
428 0 : if( xNamed.is() )
429 0 : xNamed->setName( maShapeName );
430 : }
431 :
432 134 : UniReference< XMLShapeImportHelper > xImp( GetImport().GetShapeImport() );
433 134 : xImp->addShape( xShape, mxAttrList, mxShapes );
434 :
435 134 : if( mbClearDefaultAttributes )
436 : {
437 108 : uno::Reference<beans::XMultiPropertyStates> xMultiPropertyStates(xShape, uno::UNO_QUERY );
438 108 : if (xMultiPropertyStates.is())
439 108 : xMultiPropertyStates->setAllPropertiesToDefault();
440 : }
441 :
442 134 : if( !mbVisible || !mbPrintable ) try
443 : {
444 0 : uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY_THROW );
445 0 : if( !mbVisible )
446 0 : xSet->setPropertyValue( rtl::OUString( "Visible" ), uno::Any( sal_False ) );
447 :
448 0 : if( !mbPrintable )
449 0 : xSet->setPropertyValue( rtl::OUString( "Printable" ), uno::Any( sal_False ) );
450 : }
451 0 : catch(const Exception&)
452 : {
453 : OSL_FAIL( "SdXMLShapeContext::AddShape(), exception caught!" );
454 : }
455 :
456 : // #107848#
457 534 : if(!mbTemporaryShape && (!GetImport().HasTextImport()
458 400 : || !GetImport().GetTextImport()->IsInsideDeleteContext()))
459 : {
460 133 : xImp->shapeWithZIndexAdded( xShape, mnZOrder );
461 : }
462 :
463 134 : if( !maShapeId.isEmpty() )
464 : {
465 0 : uno::Reference< uno::XInterface > xRef( static_cast<uno::XInterface *>(xShape.get()) );
466 0 : GetImport().getInterfaceToIdentifierMapper().registerReference( maShapeId, xRef );
467 : }
468 :
469 : // #91065# count only if counting for shape import is enabled
470 134 : if(GetImport().GetShapeImport()->IsHandleProgressBarEnabled())
471 : {
472 : // #80365# increment progress bar at load once for each draw object
473 130 : GetImport().GetProgressBarHelper()->Increment();
474 134 : }
475 : }
476 :
477 134 : mxLockable = uno::Reference< document::XActionLockable >::query( xShape );
478 :
479 134 : if( mxLockable.is() )
480 134 : mxLockable->addActionLock();
481 :
482 134 : }
483 :
484 : //////////////////////////////////////////////////////////////////////////////
485 :
486 134 : void SdXMLShapeContext::AddShape(const char* pServiceName )
487 : {
488 134 : uno::Reference< lang::XMultiServiceFactory > xServiceFact(GetImport().GetModel(), uno::UNO_QUERY);
489 134 : if(xServiceFact.is())
490 : {
491 : try
492 : {
493 : /* Since fix for issue i33294 the Writer model doesn't support
494 : com.sun.star.drawing.OLE2Shape anymore.
495 : To handle Draw OLE objects it's decided to import these
496 : objects as com.sun.star.drawing.OLE2Shape and convert these
497 : objects after the import into com.sun.star.drawing.GraphicObjectShape.
498 : */
499 134 : uno::Reference< drawing::XShape > xShape;
500 276 : if ( OUString::createFromAscii(pServiceName).compareToAscii( "com.sun.star.drawing.OLE2Shape" ) == 0 &&
501 142 : uno::Reference< text::XTextDocument >(GetImport().GetModel(), uno::UNO_QUERY).is() )
502 : {
503 0 : xShape = uno::Reference< drawing::XShape >(xServiceFact->createInstance(OUString("com.sun.star.drawing.temporaryForXMLImportOLE2Shape")), uno::UNO_QUERY);
504 : }
505 : else
506 : {
507 134 : xShape = uno::Reference< drawing::XShape >(xServiceFact->createInstance(OUString::createFromAscii(pServiceName)), uno::UNO_QUERY);
508 : }
509 134 : if( xShape.is() )
510 134 : AddShape( xShape );
511 : }
512 0 : catch(const uno::Exception& e)
513 : {
514 0 : uno::Sequence<rtl::OUString> aSeq( 1 );
515 0 : aSeq[0] = OUString::createFromAscii(pServiceName);
516 0 : GetImport().SetError( XMLERROR_FLAG_ERROR | XMLERROR_API,
517 0 : aSeq, e.Message, NULL );
518 : }
519 134 : }
520 134 : }
521 :
522 : //////////////////////////////////////////////////////////////////////////////
523 :
524 129 : void SdXMLShapeContext::SetTransformation()
525 : {
526 129 : if(mxShape.is())
527 : {
528 129 : uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
529 129 : if(xPropSet.is())
530 : {
531 129 : ::basegfx::B2DHomMatrix aTransformation;
532 :
533 129 : if(maSize.Width != 1 || maSize.Height != 1)
534 : {
535 : // take care there are no zeros used by error
536 129 : if(0 == maSize.Width)
537 0 : maSize.Width = 1;
538 129 : if(0 == maSize.Height)
539 0 : maSize.Height = 1;
540 :
541 : // set global size. This should always be used.
542 129 : aTransformation.scale(maSize.Width, maSize.Height);
543 : }
544 :
545 129 : if(maPosition.X != 0 || maPosition.Y != 0)
546 : {
547 : // if global position is used, add it to transformation
548 118 : aTransformation.translate(maPosition.X, maPosition.Y);
549 : }
550 :
551 129 : if(mnTransform.NeedsAction())
552 : {
553 : // transformation is used, apply to object.
554 : // NOTICE: The transformation is applied AFTER evtl. used
555 : // global positioning and scaling is used, so any shear or
556 : // rotate used herein is applied around the (0,0) position
557 : // of the PAGE object !!!
558 9 : ::basegfx::B2DHomMatrix aMat;
559 9 : mnTransform.GetFullTransform(aMat);
560 :
561 : // now add to transformation
562 9 : aTransformation *= aMat;
563 : }
564 :
565 : // now set transformation for this object
566 129 : uno::Any aAny;
567 129 : drawing::HomogenMatrix3 aMatrix;
568 :
569 129 : aMatrix.Line1.Column1 = aTransformation.get(0, 0);
570 129 : aMatrix.Line1.Column2 = aTransformation.get(0, 1);
571 129 : aMatrix.Line1.Column3 = aTransformation.get(0, 2);
572 :
573 129 : aMatrix.Line2.Column1 = aTransformation.get(1, 0);
574 129 : aMatrix.Line2.Column2 = aTransformation.get(1, 1);
575 129 : aMatrix.Line2.Column3 = aTransformation.get(1, 2);
576 :
577 129 : aMatrix.Line3.Column1 = aTransformation.get(2, 0);
578 129 : aMatrix.Line3.Column2 = aTransformation.get(2, 1);
579 129 : aMatrix.Line3.Column3 = aTransformation.get(2, 2);
580 :
581 129 : aAny <<= aMatrix;
582 :
583 129 : xPropSet->setPropertyValue(
584 129 : OUString("Transformation"), aAny);
585 129 : }
586 : }
587 129 : }
588 :
589 : //////////////////////////////////////////////////////////////////////////////
590 :
591 134 : void SdXMLShapeContext::SetStyle( bool bSupportsStyle /* = true */)
592 : {
593 : try
594 : {
595 134 : uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
596 134 : if( !xPropSet.is() )
597 134 : return;
598 :
599 : do
600 : {
601 134 : XMLPropStyleContext* pDocStyle = NULL;
602 :
603 : // set style on shape
604 134 : if(maDrawStyleName.isEmpty())
605 : break;
606 :
607 123 : const SvXMLStyleContext* pStyle = 0L;
608 123 : sal_Bool bAutoStyle(sal_False);
609 :
610 123 : if(GetImport().GetShapeImport()->GetAutoStylesContext())
611 123 : pStyle = GetImport().GetShapeImport()->GetAutoStylesContext()->FindStyleChildContext(mnStyleFamily, maDrawStyleName);
612 :
613 123 : if(pStyle)
614 117 : bAutoStyle = sal_True;
615 :
616 123 : if(!pStyle && GetImport().GetShapeImport()->GetStylesContext())
617 4 : pStyle = GetImport().GetShapeImport()->GetStylesContext()->FindStyleChildContext(mnStyleFamily, maDrawStyleName);
618 :
619 123 : OUString aStyleName = maDrawStyleName;
620 123 : uno::Reference< style::XStyle > xStyle;
621 :
622 123 : if( pStyle && pStyle->ISA(XMLShapeStyleContext) )
623 : {
624 121 : pDocStyle = PTR_CAST( XMLShapeStyleContext, pStyle );
625 :
626 121 : if( pDocStyle->GetStyle().is() )
627 : {
628 4 : xStyle = pDocStyle->GetStyle();
629 : }
630 : else
631 : {
632 117 : aStyleName = pDocStyle->GetParentName();
633 : }
634 : }
635 :
636 123 : if( !xStyle.is() && !aStyleName.isEmpty() )
637 : {
638 : try
639 : {
640 :
641 103 : uno::Reference< style::XStyleFamiliesSupplier > xFamiliesSupplier( GetImport().GetModel(), uno::UNO_QUERY );
642 :
643 103 : if( xFamiliesSupplier.is() )
644 : {
645 103 : uno::Reference< container::XNameAccess > xFamilies( xFamiliesSupplier->getStyleFamilies() );
646 103 : if( xFamilies.is() )
647 : {
648 :
649 103 : uno::Reference< container::XNameAccess > xFamily;
650 :
651 103 : if( XML_STYLE_FAMILY_SD_PRESENTATION_ID == mnStyleFamily )
652 : {
653 15 : aStyleName = GetImport().GetStyleDisplayName(
654 : XML_STYLE_FAMILY_SD_PRESENTATION_ID,
655 15 : aStyleName );
656 15 : sal_Int32 nPos = aStyleName.lastIndexOf( sal_Unicode('-') );
657 15 : if( -1 != nPos )
658 : {
659 15 : OUString aFamily( aStyleName.copy( 0, nPos ) );
660 :
661 15 : xFamilies->getByName( aFamily ) >>= xFamily;
662 15 : aStyleName = aStyleName.copy( nPos + 1 );
663 : }
664 : }
665 : else
666 : {
667 : // get graphics familie
668 88 : xFamilies->getByName( OUString( "graphics" ) ) >>= xFamily;
669 88 : aStyleName = GetImport().GetStyleDisplayName(
670 : XML_STYLE_FAMILY_SD_GRAPHICS_ID,
671 88 : aStyleName );
672 : }
673 :
674 103 : if( xFamily.is() )
675 103 : xFamily->getByName( aStyleName ) >>= xStyle;
676 103 : }
677 103 : }
678 : }
679 0 : catch(const uno::Exception&)
680 : {
681 : OSL_FAIL( "could not find style for shape!" );
682 : }
683 : }
684 :
685 123 : if( bSupportsStyle && xStyle.is() )
686 : {
687 : try
688 : {
689 : // set style on object
690 107 : uno::Any aAny;
691 107 : aAny <<= xStyle;
692 107 : xPropSet->setPropertyValue(OUString("Style"), aAny);
693 : }
694 0 : catch(const uno::Exception&)
695 : {
696 : OSL_FAIL( "could not find style for shape!" );
697 : }
698 : }
699 :
700 : // if this is an auto style, set its properties
701 123 : if(bAutoStyle && pDocStyle)
702 : {
703 : // set PropertySet on object
704 117 : pDocStyle->FillPropertySet(xPropSet);
705 123 : }
706 :
707 : } while(0);
708 :
709 : // try to set text auto style
710 : do
711 : {
712 : // set style on shape
713 134 : if( maTextStyleName.isEmpty() )
714 39 : break;
715 :
716 95 : if( NULL == GetImport().GetShapeImport()->GetAutoStylesContext())
717 0 : break;
718 :
719 95 : const SvXMLStyleContext* pTempStyle = GetImport().GetShapeImport()->GetAutoStylesContext()->FindStyleChildContext(XML_STYLE_FAMILY_TEXT_PARAGRAPH, maTextStyleName);
720 95 : XMLPropStyleContext* pStyle = PTR_CAST( XMLPropStyleContext, pTempStyle ); // use temp var, PTR_CAST is a bad macro, FindStyleChildContext will be called twice
721 95 : if( pStyle == NULL )
722 0 : break;
723 :
724 : // set PropertySet on object
725 95 : pStyle->FillPropertySet(xPropSet);
726 :
727 134 : } while(0);
728 : }
729 0 : catch(const uno::Exception&)
730 : {
731 : }
732 : }
733 :
734 129 : void SdXMLShapeContext::SetLayer()
735 : {
736 129 : if( !maLayerName.isEmpty() )
737 : {
738 : try
739 : {
740 125 : uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
741 125 : if(xPropSet.is() )
742 : {
743 125 : uno::Any aAny;
744 125 : aAny <<= maLayerName;
745 :
746 125 : xPropSet->setPropertyValue(OUString("LayerName"), aAny);
747 254 : return;
748 125 : }
749 : }
750 0 : catch(const uno::Exception&)
751 : {
752 : }
753 : }
754 : }
755 :
756 0 : void SdXMLShapeContext::SetThumbnail()
757 : {
758 0 : if( maThumbnailURL.isEmpty() )
759 0 : return;
760 :
761 : try
762 : {
763 0 : uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
764 0 : if( !xPropSet.is() )
765 : return;
766 :
767 0 : const OUString sProperty("ThumbnailGraphicURL");
768 :
769 0 : uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
770 0 : if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName( sProperty ) )
771 : {
772 : // load the thumbnail graphic and export it to a wmf stream so we can set
773 : // it at the api
774 :
775 0 : const OUString aInternalURL( GetImport().ResolveGraphicObjectURL( maThumbnailURL, sal_False ) );
776 0 : xPropSet->setPropertyValue( sProperty, uno::makeAny( aInternalURL ) );
777 0 : }
778 : }
779 0 : catch(const uno::Exception&)
780 : {
781 : }
782 : }
783 :
784 : // this is called from the parent group for each unparsed attribute in the attribute list
785 919 : void SdXMLShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
786 : {
787 919 : bool bHaveXmlId( false );
788 919 : if( (XML_NAMESPACE_DRAW == nPrefix) || (XML_NAMESPACE_DRAW_EXT == nPrefix) )
789 : {
790 672 : if( IsXMLToken( rLocalName, XML_ZINDEX ) )
791 : {
792 3 : mnZOrder = rValue.toInt32();
793 : }
794 333 : else if( IsXMLToken( rLocalName, XML_ID ) )
795 : {
796 0 : if (!bHaveXmlId) { maShapeId = rValue; };
797 : }
798 333 : else if( IsXMLToken( rLocalName, XML_NAME ) )
799 : {
800 0 : maShapeName = rValue;
801 : }
802 333 : else if( IsXMLToken( rLocalName, XML_STYLE_NAME ) )
803 : {
804 104 : maDrawStyleName = rValue;
805 : }
806 229 : else if( IsXMLToken( rLocalName, XML_TEXT_STYLE_NAME ) )
807 : {
808 95 : maTextStyleName = rValue;
809 : }
810 134 : else if( IsXMLToken( rLocalName, XML_LAYER ) )
811 : {
812 125 : maLayerName = rValue;
813 : }
814 9 : else if( IsXMLToken( rLocalName, XML_TRANSFORM ) )
815 : {
816 9 : mnTransform.SetString(rValue, GetImport().GetMM100UnitConverter());
817 : }
818 0 : else if( IsXMLToken( rLocalName, XML_DISPLAY ) )
819 : {
820 0 : mbVisible = IsXMLToken( rValue, XML_ALWAYS ) || IsXMLToken( rValue, XML_SCREEN );
821 0 : mbPrintable = IsXMLToken( rValue, XML_ALWAYS ) || IsXMLToken( rValue, XML_PRINTER );
822 : }
823 : }
824 583 : else if( XML_NAMESPACE_PRESENTATION == nPrefix )
825 : {
826 63 : if( IsXMLToken( rLocalName, XML_USER_TRANSFORMED ) )
827 : {
828 1 : mbIsUserTransformed = IsXMLToken( rValue, XML_TRUE );
829 : }
830 62 : else if( IsXMLToken( rLocalName, XML_PLACEHOLDER ) )
831 : {
832 11 : mbIsPlaceholder = IsXMLToken( rValue, XML_TRUE );
833 11 : if( mbIsPlaceholder )
834 11 : mbClearDefaultAttributes = false;
835 : }
836 51 : else if( IsXMLToken( rLocalName, XML_CLASS ) )
837 : {
838 32 : maPresentationClass = rValue;
839 : }
840 19 : else if( IsXMLToken( rLocalName, XML_STYLE_NAME ) )
841 : {
842 19 : maDrawStyleName = rValue;
843 19 : mnStyleFamily = XML_STYLE_FAMILY_SD_PRESENTATION_ID;
844 : }
845 : }
846 520 : else if( XML_NAMESPACE_SVG == nPrefix )
847 : {
848 486 : if( IsXMLToken( rLocalName, XML_X ) )
849 : {
850 117 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
851 234 : maPosition.X, rValue);
852 : }
853 369 : else if( IsXMLToken( rLocalName, XML_Y ) )
854 : {
855 117 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
856 234 : maPosition.Y, rValue);
857 : }
858 252 : else if( IsXMLToken( rLocalName, XML_WIDTH ) )
859 : {
860 126 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
861 252 : maSize.Width, rValue);
862 126 : if( maSize.Width > 0 )
863 126 : maSize.Width += 1;
864 0 : else if( maSize.Width < 0 )
865 0 : maSize.Width -= 1;
866 : }
867 126 : else if( IsXMLToken( rLocalName, XML_HEIGHT ) )
868 : {
869 126 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
870 252 : maSize.Height, rValue);
871 126 : if( maSize.Height > 0 )
872 126 : maSize.Height += 1;
873 0 : else if( maSize.Height < 0 )
874 0 : maSize.Height -= 1;
875 : }
876 0 : else if( IsXMLToken( rLocalName, XML_TRANSFORM ) )
877 : {
878 : // because of #85127# take svg:transform into account and hanle like
879 : // draw:transform for compatibility
880 0 : mnTransform.SetString(rValue, GetImport().GetMM100UnitConverter());
881 : }
882 :
883 : // #i68101#
884 0 : else if( IsXMLToken( rLocalName, XML_TITLE ) )
885 : {
886 0 : maShapeTitle = rValue;
887 : }
888 0 : else if( IsXMLToken( rLocalName, XML_DESC ) )
889 : {
890 0 : maShapeDescription = rValue;
891 : }
892 : }
893 34 : else if( (XML_NAMESPACE_NONE == nPrefix) || (XML_NAMESPACE_XML == nPrefix) )
894 : {
895 0 : if( IsXMLToken( rLocalName, XML_ID ) )
896 : {
897 0 : maShapeId = rValue;
898 0 : bHaveXmlId = true;
899 : }
900 : }
901 919 : }
902 :
903 27 : sal_Bool SdXMLShapeContext::isPresentationShape() const
904 : {
905 27 : if( !maPresentationClass.isEmpty() && (const_cast<SdXMLShapeContext*>(this))->GetImport().GetShapeImport()->IsPresentationShapesSupported() )
906 : {
907 22 : if(XML_STYLE_FAMILY_SD_PRESENTATION_ID == mnStyleFamily)
908 : {
909 18 : return sal_True;
910 : }
911 :
912 7 : if( IsXMLToken( maPresentationClass, XML_HEADER ) || IsXMLToken( maPresentationClass, XML_FOOTER ) ||
913 3 : IsXMLToken( maPresentationClass, XML_PAGE_NUMBER ) || IsXMLToken( maPresentationClass, XML_DATE_TIME ) )
914 : {
915 4 : return sal_True;
916 : }
917 : }
918 :
919 5 : return sal_False;
920 : }
921 :
922 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
923 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
924 :
925 0 : TYPEINIT1( SdXMLRectShapeContext, SdXMLShapeContext );
926 :
927 0 : SdXMLRectShapeContext::SdXMLRectShapeContext(
928 : SvXMLImport& rImport,
929 : sal_uInt16 nPrfx,
930 : const OUString& rLocalName,
931 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
932 : uno::Reference< drawing::XShapes >& rShapes,
933 : sal_Bool bTemporaryShape)
934 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
935 0 : mnRadius( 0L )
936 : {
937 0 : }
938 :
939 : //////////////////////////////////////////////////////////////////////////////
940 :
941 0 : SdXMLRectShapeContext::~SdXMLRectShapeContext()
942 : {
943 0 : }
944 :
945 : //////////////////////////////////////////////////////////////////////////////
946 :
947 : // this is called from the parent group for each unparsed attribute in the attribute list
948 0 : void SdXMLRectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
949 : {
950 0 : if( XML_NAMESPACE_DRAW == nPrefix )
951 : {
952 0 : if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) )
953 : {
954 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
955 0 : mnRadius, rValue);
956 0 : return;
957 : }
958 : }
959 :
960 0 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
961 : }
962 :
963 : //////////////////////////////////////////////////////////////////////////////
964 :
965 0 : void SdXMLRectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
966 : {
967 : // create rectangle shape
968 0 : AddShape("com.sun.star.drawing.RectangleShape");
969 0 : if(mxShape.is())
970 : {
971 : // Add, set Style and properties from base shape
972 0 : SetStyle();
973 0 : SetLayer();
974 :
975 : // set pos, size, shear and rotate
976 0 : SetTransformation();
977 :
978 0 : if(mnRadius)
979 : {
980 0 : uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
981 0 : if(xPropSet.is())
982 : {
983 : try
984 : {
985 0 : xPropSet->setPropertyValue(OUString("CornerRadius"), uno::makeAny( mnRadius ) );
986 : }
987 0 : catch(const uno::Exception&)
988 : {
989 : OSL_FAIL( "exception during setting of corner radius!");
990 : }
991 0 : }
992 : }
993 0 : SdXMLShapeContext::StartElement(xAttrList);
994 : }
995 0 : }
996 :
997 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
998 : ////////////////////////////////////////3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
999 :
1000 0 : TYPEINIT1( SdXMLLineShapeContext, SdXMLShapeContext );
1001 :
1002 3 : SdXMLLineShapeContext::SdXMLLineShapeContext(
1003 : SvXMLImport& rImport,
1004 : sal_uInt16 nPrfx,
1005 : const OUString& rLocalName,
1006 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1007 : uno::Reference< drawing::XShapes >& rShapes,
1008 : sal_Bool bTemporaryShape)
1009 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1010 : mnX1( 0L ),
1011 : mnY1( 0L ),
1012 : mnX2( 1L ),
1013 3 : mnY2( 1L )
1014 : {
1015 3 : }
1016 :
1017 : //////////////////////////////////////////////////////////////////////////////
1018 :
1019 6 : SdXMLLineShapeContext::~SdXMLLineShapeContext()
1020 : {
1021 6 : }
1022 :
1023 : //////////////////////////////////////////////////////////////////////////////
1024 :
1025 : // this is called from the parent group for each unparsed attribute in the attribute list
1026 21 : void SdXMLLineShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1027 : {
1028 21 : if( XML_NAMESPACE_SVG == nPrefix )
1029 : {
1030 12 : if( IsXMLToken( rLocalName, XML_X1 ) )
1031 : {
1032 3 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1033 6 : mnX1, rValue);
1034 3 : return;
1035 : }
1036 9 : if( IsXMLToken( rLocalName, XML_Y1 ) )
1037 : {
1038 3 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1039 6 : mnY1, rValue);
1040 3 : return;
1041 : }
1042 6 : if( IsXMLToken( rLocalName, XML_X2 ) )
1043 : {
1044 3 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1045 6 : mnX2, rValue);
1046 3 : return;
1047 : }
1048 3 : if( IsXMLToken( rLocalName, XML_Y2 ) )
1049 : {
1050 3 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1051 6 : mnY2, rValue);
1052 3 : return;
1053 : }
1054 : }
1055 :
1056 9 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1057 : }
1058 :
1059 : //////////////////////////////////////////////////////////////////////////////
1060 :
1061 3 : void SdXMLLineShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1062 : {
1063 : // #85920# use SetTransformation() to handle import of simple lines.
1064 : // This is necessary to kake into account all anchor positions and
1065 : // other things. All shape imports use the same import schemata now.
1066 : // create necessary shape (Line Shape)
1067 3 : AddShape("com.sun.star.drawing.PolyLineShape");
1068 :
1069 3 : if(mxShape.is())
1070 : {
1071 : // Add, set Style and properties from base shape
1072 3 : SetStyle();
1073 3 : SetLayer();
1074 :
1075 : // get sizes and offsets
1076 3 : awt::Point aTopLeft(mnX1, mnY1);
1077 3 : awt::Point aBottomRight(mnX2, mnY2);
1078 :
1079 3 : if(mnX1 > mnX2)
1080 : {
1081 1 : aTopLeft.X = mnX2;
1082 1 : aBottomRight.X = mnX1;
1083 : }
1084 :
1085 3 : if(mnY1 > mnY2)
1086 : {
1087 1 : aTopLeft.Y = mnY2;
1088 1 : aBottomRight.Y = mnY1;
1089 : }
1090 :
1091 : // set local parameters on shape
1092 3 : uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1093 3 : if(xPropSet.is())
1094 : {
1095 3 : drawing::PointSequenceSequence aPolyPoly(1L);
1096 3 : drawing::PointSequence* pOuterSequence = aPolyPoly.getArray();
1097 3 : pOuterSequence->realloc(2L);
1098 3 : awt::Point* pInnerSequence = pOuterSequence->getArray();
1099 3 : uno::Any aAny;
1100 :
1101 3 : *pInnerSequence = awt::Point( mnX1 - aTopLeft.X, mnY1 - aTopLeft.Y);
1102 3 : pInnerSequence++;
1103 3 : *pInnerSequence = awt::Point( mnX2 - aTopLeft.X, mnY2 - aTopLeft.Y);
1104 :
1105 3 : aAny <<= aPolyPoly;
1106 3 : xPropSet->setPropertyValue(
1107 3 : OUString("Geometry"), aAny);
1108 : }
1109 :
1110 : // set sizes for transformation
1111 3 : maSize.Width = aBottomRight.X - aTopLeft.X;
1112 3 : maSize.Height = aBottomRight.Y - aTopLeft.Y;
1113 3 : maPosition.X = aTopLeft.X;
1114 3 : maPosition.Y = aTopLeft.Y;
1115 :
1116 : // set pos, size, shear and rotate and get copy of matrix
1117 3 : SetTransformation();
1118 :
1119 3 : SdXMLShapeContext::StartElement(xAttrList);
1120 : }
1121 3 : }
1122 :
1123 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1124 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1125 :
1126 0 : TYPEINIT1( SdXMLEllipseShapeContext, SdXMLShapeContext );
1127 :
1128 3 : SdXMLEllipseShapeContext::SdXMLEllipseShapeContext(
1129 : SvXMLImport& rImport,
1130 : sal_uInt16 nPrfx,
1131 : const OUString& rLocalName,
1132 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1133 : uno::Reference< drawing::XShapes >& rShapes,
1134 : sal_Bool bTemporaryShape)
1135 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1136 : mnCX( 0L ),
1137 : mnCY( 0L ),
1138 : mnRX( 1L ),
1139 : mnRY( 1L ),
1140 : meKind( drawing::CircleKind_FULL ),
1141 : mnStartAngle( 0 ),
1142 3 : mnEndAngle( 0 )
1143 : {
1144 3 : }
1145 :
1146 : //////////////////////////////////////////////////////////////////////////////
1147 :
1148 6 : SdXMLEllipseShapeContext::~SdXMLEllipseShapeContext()
1149 : {
1150 6 : }
1151 :
1152 : //////////////////////////////////////////////////////////////////////////////
1153 :
1154 : // this is called from the parent group for each unparsed attribute in the attribute list
1155 25 : void SdXMLEllipseShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1156 : {
1157 25 : if( XML_NAMESPACE_SVG == nPrefix )
1158 : {
1159 10 : if( IsXMLToken( rLocalName, XML_RX ) )
1160 : {
1161 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1162 0 : mnRX, rValue);
1163 0 : return;
1164 : }
1165 10 : if( IsXMLToken( rLocalName, XML_RY ) )
1166 : {
1167 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1168 0 : mnRY, rValue);
1169 0 : return;
1170 : }
1171 10 : if( IsXMLToken( rLocalName, XML_CX ) )
1172 : {
1173 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1174 0 : mnCX, rValue);
1175 0 : return;
1176 : }
1177 10 : if( IsXMLToken( rLocalName, XML_CY ) )
1178 : {
1179 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1180 0 : mnCY, rValue);
1181 0 : return;
1182 : }
1183 10 : if( IsXMLToken( rLocalName, XML_R ) )
1184 : {
1185 : // single radius, it's a circle and both radii are the same
1186 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1187 0 : mnRX, rValue);
1188 0 : mnRY = mnRX;
1189 0 : return;
1190 : }
1191 : }
1192 15 : else if( XML_NAMESPACE_DRAW == nPrefix )
1193 : {
1194 9 : if( IsXMLToken( rLocalName, XML_KIND ) )
1195 : {
1196 : sal_uInt16 eKind;
1197 0 : if( SvXMLUnitConverter::convertEnum( eKind, rValue, aXML_CircleKind_EnumMap ) )
1198 : {
1199 0 : meKind = eKind;
1200 : }
1201 : return;
1202 : }
1203 9 : if( IsXMLToken( rLocalName, XML_START_ANGLE ) )
1204 : {
1205 : double dStartAngle;
1206 0 : if (::sax::Converter::convertDouble( dStartAngle, rValue ))
1207 0 : mnStartAngle = (sal_Int32)(dStartAngle * 100.0);
1208 : return;
1209 : }
1210 9 : if( IsXMLToken( rLocalName, XML_END_ANGLE ) )
1211 : {
1212 : double dEndAngle;
1213 0 : if (::sax::Converter::convertDouble( dEndAngle, rValue ))
1214 0 : mnEndAngle = (sal_Int32)(dEndAngle * 100.0);
1215 : return;
1216 : }
1217 : }
1218 :
1219 25 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1220 : }
1221 :
1222 : //////////////////////////////////////////////////////////////////////////////
1223 :
1224 3 : void SdXMLEllipseShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1225 : {
1226 : // create rectangle shape
1227 3 : AddShape("com.sun.star.drawing.EllipseShape");
1228 3 : if(mxShape.is())
1229 : {
1230 : // Add, set Style and properties from base shape
1231 3 : SetStyle();
1232 3 : SetLayer();
1233 :
1234 : // set pos, size, shear and rotate
1235 3 : SetTransformation();
1236 :
1237 3 : if( meKind != drawing::CircleKind_FULL )
1238 : {
1239 0 : uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY );
1240 0 : if( xPropSet.is() )
1241 : {
1242 0 : uno::Any aAny;
1243 0 : aAny <<= (drawing::CircleKind)meKind;
1244 0 : xPropSet->setPropertyValue( OUString("CircleKind"), aAny );
1245 :
1246 0 : aAny <<= mnStartAngle;
1247 0 : xPropSet->setPropertyValue( OUString("CircleStartAngle"), aAny );
1248 :
1249 0 : aAny <<= mnEndAngle;
1250 0 : xPropSet->setPropertyValue( OUString("CircleEndAngle"), aAny );
1251 0 : }
1252 : }
1253 :
1254 3 : SdXMLShapeContext::StartElement(xAttrList);
1255 : }
1256 3 : }
1257 :
1258 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1259 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1260 :
1261 0 : TYPEINIT1( SdXMLPolygonShapeContext, SdXMLShapeContext );
1262 :
1263 5 : SdXMLPolygonShapeContext::SdXMLPolygonShapeContext(
1264 : SvXMLImport& rImport,
1265 : sal_uInt16 nPrfx,
1266 : const OUString& rLocalName,
1267 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1268 : uno::Reference< drawing::XShapes >& rShapes, sal_Bool bClosed, sal_Bool bTemporaryShape)
1269 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1270 5 : mbClosed( bClosed )
1271 : {
1272 5 : }
1273 :
1274 : //////////////////////////////////////////////////////////////////////////////
1275 :
1276 : // this is called from the parent group for each unparsed attribute in the attribute list
1277 42 : void SdXMLPolygonShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1278 : {
1279 42 : if( XML_NAMESPACE_SVG == nPrefix )
1280 : {
1281 21 : if( IsXMLToken( rLocalName, XML_VIEWBOX ) )
1282 : {
1283 5 : maViewBox = rValue;
1284 5 : return;
1285 : }
1286 : }
1287 21 : else if( XML_NAMESPACE_DRAW == nPrefix )
1288 : {
1289 21 : if( IsXMLToken( rLocalName, XML_POINTS ) )
1290 : {
1291 5 : maPoints = rValue;
1292 5 : return;
1293 : }
1294 : }
1295 :
1296 32 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1297 : }
1298 :
1299 : //////////////////////////////////////////////////////////////////////////////
1300 :
1301 10 : SdXMLPolygonShapeContext::~SdXMLPolygonShapeContext()
1302 : {
1303 10 : }
1304 :
1305 : //////////////////////////////////////////////////////////////////////////////
1306 :
1307 5 : void SdXMLPolygonShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1308 : {
1309 : // Add, set Style and properties from base shape
1310 5 : if(mbClosed)
1311 4 : AddShape("com.sun.star.drawing.PolyPolygonShape");
1312 : else
1313 1 : AddShape("com.sun.star.drawing.PolyLineShape");
1314 :
1315 5 : if( mxShape.is() )
1316 : {
1317 5 : SetStyle();
1318 5 : SetLayer();
1319 :
1320 : // set local parameters on shape
1321 5 : uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1322 5 : if(xPropSet.is())
1323 : {
1324 : // set polygon
1325 5 : if(!maPoints.isEmpty() && !maViewBox.isEmpty())
1326 : {
1327 5 : SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
1328 5 : awt::Size aSize(aViewBox.GetWidth(), aViewBox.GetHeight());
1329 5 : if (maSize.Width != 0 && maSize.Height !=0)
1330 : {
1331 5 : aSize = maSize;
1332 : }
1333 5 : awt::Point aPosition(aViewBox.GetX(), aViewBox.GetY());
1334 : SdXMLImExPointsElement aPoints(maPoints, aViewBox,
1335 5 : aPosition, aSize, GetImport().GetMM100UnitConverter());
1336 :
1337 5 : uno::Any aAny;
1338 5 : aAny <<= aPoints.GetPointSequenceSequence();
1339 5 : xPropSet->setPropertyValue(
1340 5 : OUString("Geometry"), aAny);
1341 : }
1342 : }
1343 :
1344 : // set pos, size, shear and rotate and get copy of matrix
1345 5 : SetTransformation();
1346 :
1347 5 : SdXMLShapeContext::StartElement(xAttrList);
1348 : }
1349 5 : }
1350 :
1351 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1352 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1353 :
1354 0 : TYPEINIT1( SdXMLPathShapeContext, SdXMLShapeContext );
1355 :
1356 4 : SdXMLPathShapeContext::SdXMLPathShapeContext(
1357 : SvXMLImport& rImport,
1358 : sal_uInt16 nPrfx,
1359 : const OUString& rLocalName,
1360 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1361 : uno::Reference< drawing::XShapes >& rShapes,
1362 : sal_Bool bTemporaryShape)
1363 4 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
1364 : {
1365 4 : }
1366 :
1367 : //////////////////////////////////////////////////////////////////////////////
1368 :
1369 8 : SdXMLPathShapeContext::~SdXMLPathShapeContext()
1370 : {
1371 8 : }
1372 :
1373 : //////////////////////////////////////////////////////////////////////////////
1374 :
1375 : // this is called from the parent group for each unparsed attribute in the attribute list
1376 34 : void SdXMLPathShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1377 : {
1378 34 : if( XML_NAMESPACE_SVG == nPrefix )
1379 : {
1380 20 : if( IsXMLToken( rLocalName, XML_VIEWBOX ) )
1381 : {
1382 4 : maViewBox = rValue;
1383 4 : return;
1384 : }
1385 16 : else if( IsXMLToken( rLocalName, XML_D ) )
1386 : {
1387 4 : maD = rValue;
1388 4 : return;
1389 : }
1390 : }
1391 :
1392 26 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1393 : }
1394 :
1395 : //////////////////////////////////////////////////////////////////////////////
1396 :
1397 4 : void SdXMLPathShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1398 : {
1399 : // create polygon shape
1400 4 : if(!maD.isEmpty())
1401 : {
1402 : // prepare some of the parameters
1403 4 : SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
1404 4 : awt::Size aSize(aViewBox.GetWidth(), aViewBox.GetHeight());
1405 4 : awt::Point aPosition(aViewBox.GetX(), aViewBox.GetY());
1406 4 : if (maSize.Width != 0 && maSize.Height !=0)
1407 : {
1408 4 : aSize = maSize;
1409 : }
1410 4 : SdXMLImExSvgDElement aPoints(maD, aViewBox, aPosition, aSize, GetImport());
1411 :
1412 : const char* pService;
1413 : // now create shape
1414 4 : if(aPoints.IsCurve())
1415 : {
1416 4 : if(aPoints.IsClosed())
1417 : {
1418 2 : pService = "com.sun.star.drawing.ClosedBezierShape";
1419 : }
1420 : else
1421 : {
1422 2 : pService = "com.sun.star.drawing.OpenBezierShape";
1423 : }
1424 : }
1425 : else
1426 : {
1427 0 : if(aPoints.IsClosed())
1428 : {
1429 0 : pService = "com.sun.star.drawing.PolyPolygonShape";
1430 : }
1431 : else
1432 : {
1433 0 : pService = "com.sun.star.drawing.PolyLineShape";
1434 : }
1435 : }
1436 :
1437 : // Add, set Style and properties from base shape
1438 4 : AddShape(pService);
1439 :
1440 : // #89344# test for mxShape.is() and not for mxShapes.is() to support
1441 : // shape import helper classes WITHOUT XShapes (member mxShapes). This
1442 : // is used by the writer.
1443 4 : if( mxShape.is() )
1444 : {
1445 4 : SetStyle();
1446 4 : SetLayer();
1447 :
1448 : // set local parameters on shape
1449 4 : uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1450 4 : if(xPropSet.is())
1451 : {
1452 4 : uno::Any aAny;
1453 :
1454 : // set svg:d
1455 4 : if(!maD.isEmpty())
1456 : {
1457 4 : if(aPoints.IsCurve())
1458 : {
1459 : drawing::PolyPolygonBezierCoords aSourcePolyPolygon(
1460 4 : aPoints.GetPointSequenceSequence(),
1461 8 : aPoints.GetFlagSequenceSequence());
1462 :
1463 4 : aAny <<= aSourcePolyPolygon;
1464 4 : xPropSet->setPropertyValue(
1465 4 : OUString("Geometry"), aAny);
1466 : }
1467 : else
1468 : {
1469 0 : aAny <<= aPoints.GetPointSequenceSequence();
1470 0 : xPropSet->setPropertyValue(
1471 0 : OUString("Geometry"), aAny);
1472 : }
1473 4 : }
1474 : }
1475 :
1476 : // set pos, size, shear and rotate
1477 4 : SetTransformation();
1478 :
1479 4 : SdXMLShapeContext::StartElement(xAttrList);
1480 4 : }
1481 : }
1482 4 : }
1483 :
1484 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1485 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1486 :
1487 0 : TYPEINIT1( SdXMLTextBoxShapeContext, SdXMLShapeContext );
1488 :
1489 27 : SdXMLTextBoxShapeContext::SdXMLTextBoxShapeContext(
1490 : SvXMLImport& rImport,
1491 : sal_uInt16 nPrfx,
1492 : const OUString& rLocalName,
1493 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1494 : uno::Reference< drawing::XShapes >& rShapes,
1495 : sal_Bool bTemporaryShape)
1496 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1497 27 : mnRadius(0)
1498 : {
1499 27 : }
1500 :
1501 : //////////////////////////////////////////////////////////////////////////////
1502 :
1503 54 : SdXMLTextBoxShapeContext::~SdXMLTextBoxShapeContext()
1504 : {
1505 54 : }
1506 :
1507 : //////////////////////////////////////////////////////////////////////////////
1508 :
1509 : // this is called from the parent group for each unparsed attribute in the attribute list
1510 211 : void SdXMLTextBoxShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1511 : {
1512 211 : if( XML_NAMESPACE_DRAW == nPrefix )
1513 : {
1514 58 : if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) )
1515 : {
1516 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1517 0 : mnRadius, rValue);
1518 211 : return;
1519 : }
1520 : }
1521 :
1522 211 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1523 : }
1524 :
1525 : //////////////////////////////////////////////////////////////////////////////
1526 :
1527 27 : void SdXMLTextBoxShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
1528 : {
1529 : // create textbox shape
1530 27 : sal_Bool bIsPresShape = sal_False;
1531 27 : bool bClearText = false;
1532 :
1533 27 : const char *pService = NULL;
1534 :
1535 27 : if( isPresentationShape() )
1536 : {
1537 : // check if the current document supports presentation shapes
1538 22 : if( GetImport().GetShapeImport()->IsPresentationShapesSupported() )
1539 : {
1540 22 : if( IsXMLToken( maPresentationClass, XML_PRESENTATION_SUBTITLE ))
1541 : {
1542 : // XmlShapeTypePresSubtitleShape
1543 0 : pService = "com.sun.star.presentation.SubtitleShape";
1544 : }
1545 22 : else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OUTLINE ) )
1546 : {
1547 : // XmlShapeTypePresOutlinerShape
1548 1 : pService = "com.sun.star.presentation.OutlinerShape";
1549 : }
1550 21 : else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_NOTES ) )
1551 : {
1552 : // XmlShapeTypePresNotesShape
1553 9 : pService = "com.sun.star.presentation.NotesShape";
1554 : }
1555 12 : else if( IsXMLToken( maPresentationClass, XML_HEADER ) )
1556 : {
1557 : // XmlShapeTypePresHeaderShape
1558 2 : pService = "com.sun.star.presentation.HeaderShape";
1559 2 : bClearText = true;
1560 : }
1561 10 : else if( IsXMLToken( maPresentationClass, XML_FOOTER ) )
1562 : {
1563 : // XmlShapeTypePresFooterShape
1564 3 : pService = "com.sun.star.presentation.FooterShape";
1565 3 : bClearText = true;
1566 : }
1567 7 : else if( IsXMLToken( maPresentationClass, XML_PAGE_NUMBER ) )
1568 : {
1569 : // XmlShapeTypePresSlideNumberShape
1570 3 : pService = "com.sun.star.presentation.SlideNumberShape";
1571 3 : bClearText = true;
1572 : }
1573 4 : else if( IsXMLToken( maPresentationClass, XML_DATE_TIME ) )
1574 : {
1575 : // XmlShapeTypePresDateTimeShape
1576 3 : pService = "com.sun.star.presentation.DateTimeShape";
1577 3 : bClearText = true;
1578 : }
1579 : else // IsXMLToken( maPresentationClass, XML_PRESENTATION_TITLE ) )
1580 : {
1581 : // XmlShapeTypePresTitleTextShape
1582 1 : pService = "com.sun.star.presentation.TitleTextShape";
1583 : }
1584 22 : bIsPresShape = sal_True;
1585 : }
1586 : }
1587 :
1588 27 : if( NULL == pService )
1589 : {
1590 : // normal text shape
1591 5 : pService = "com.sun.star.drawing.TextShape";
1592 : }
1593 :
1594 : // Add, set Style and properties from base shape
1595 27 : AddShape(pService);
1596 :
1597 27 : if( mxShape.is() )
1598 : {
1599 27 : SetStyle();
1600 27 : SetLayer();
1601 :
1602 27 : if(bIsPresShape)
1603 : {
1604 22 : uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
1605 22 : if(xProps.is())
1606 : {
1607 22 : uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
1608 22 : if( xPropsInfo.is() )
1609 : {
1610 22 : if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString("IsEmptyPresentationObject" )))
1611 11 : xProps->setPropertyValue( OUString("IsEmptyPresentationObject" ), ::cppu::bool2any( sal_False ) );
1612 :
1613 22 : if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString("IsPlaceholderDependent" )))
1614 0 : xProps->setPropertyValue( OUString("IsPlaceholderDependent" ), ::cppu::bool2any( sal_False ) );
1615 22 : }
1616 22 : }
1617 : }
1618 :
1619 27 : if( bClearText )
1620 : {
1621 11 : uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
1622 11 : OUString aEmpty;
1623 11 : xText->setString( aEmpty );
1624 : }
1625 :
1626 : // set parameters on shape
1627 : //A AW->CL: Eventually You need to strip scale and translate from the transformation
1628 : //A to reach the same goal again.
1629 : //A if(!bIsPresShape || mbIsUserTransformed)
1630 : //A {
1631 : //A // set pos and size on shape, this should remove binding
1632 : //A // to pres object on masterpage
1633 : //A SetSizeAndPosition();
1634 : //A }
1635 :
1636 : // set pos, size, shear and rotate
1637 27 : SetTransformation();
1638 :
1639 27 : if(mnRadius)
1640 : {
1641 0 : uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1642 0 : if(xPropSet.is())
1643 : {
1644 : try
1645 : {
1646 0 : xPropSet->setPropertyValue(OUString("CornerRadius"), uno::makeAny( mnRadius ) );
1647 : }
1648 0 : catch(const uno::Exception&)
1649 : {
1650 : OSL_FAIL( "exception during setting of corner radius!");
1651 : }
1652 0 : }
1653 : }
1654 :
1655 27 : SdXMLShapeContext::StartElement(mxAttrList);
1656 : }
1657 27 : }
1658 :
1659 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1660 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1661 :
1662 0 : TYPEINIT1( SdXMLControlShapeContext, SdXMLShapeContext );
1663 :
1664 0 : SdXMLControlShapeContext::SdXMLControlShapeContext(
1665 : SvXMLImport& rImport,
1666 : sal_uInt16 nPrfx,
1667 : const OUString& rLocalName,
1668 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1669 : uno::Reference< drawing::XShapes >& rShapes,
1670 : sal_Bool bTemporaryShape)
1671 0 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
1672 : {
1673 0 : }
1674 :
1675 : //////////////////////////////////////////////////////////////////////////////
1676 :
1677 0 : SdXMLControlShapeContext::~SdXMLControlShapeContext()
1678 : {
1679 0 : }
1680 :
1681 : //////////////////////////////////////////////////////////////////////////////
1682 :
1683 : // this is called from the parent group for each unparsed attribute in the attribute list
1684 0 : void SdXMLControlShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1685 : {
1686 0 : if( XML_NAMESPACE_DRAW == nPrefix )
1687 : {
1688 0 : if( IsXMLToken( rLocalName, XML_CONTROL ) )
1689 : {
1690 0 : maFormId = rValue;
1691 0 : return;
1692 : }
1693 : }
1694 :
1695 0 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1696 : }
1697 :
1698 0 : void SdXMLControlShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1699 : {
1700 : // create Control shape
1701 : // add, set style and properties from base shape
1702 0 : AddShape("com.sun.star.drawing.ControlShape");
1703 0 : if( mxShape.is() )
1704 : {
1705 : DBG_ASSERT( !maFormId.isEmpty(), "draw:control without a form:id attribute!" );
1706 0 : if( !maFormId.isEmpty() )
1707 : {
1708 0 : if( GetImport().IsFormsSupported() )
1709 : {
1710 0 : uno::Reference< awt::XControlModel > xControlModel( GetImport().GetFormImport()->lookupControl( maFormId ), uno::UNO_QUERY );
1711 0 : if( xControlModel.is() )
1712 : {
1713 0 : uno::Reference< drawing::XControlShape > xControl( mxShape, uno::UNO_QUERY );
1714 0 : if( xControl.is() )
1715 0 : xControl->setControl( xControlModel );
1716 :
1717 0 : }
1718 : }
1719 : }
1720 :
1721 0 : SetStyle();
1722 0 : SetLayer();
1723 :
1724 : // set pos, size, shear and rotate
1725 0 : SetTransformation();
1726 :
1727 0 : SdXMLShapeContext::StartElement(xAttrList);
1728 : }
1729 0 : }
1730 :
1731 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1732 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1733 :
1734 0 : TYPEINIT1( SdXMLConnectorShapeContext, SdXMLShapeContext );
1735 :
1736 0 : SdXMLConnectorShapeContext::SdXMLConnectorShapeContext(
1737 : SvXMLImport& rImport,
1738 : sal_uInt16 nPrfx,
1739 : const OUString& rLocalName,
1740 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1741 : uno::Reference< drawing::XShapes >& rShapes,
1742 : sal_Bool bTemporaryShape)
1743 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1744 : maStart(0,0),
1745 : maEnd(1,1),
1746 : mnType( (sal_uInt16)drawing::ConnectorType_STANDARD ),
1747 : mnStartGlueId(-1),
1748 : mnEndGlueId(-1),
1749 : mnDelta1(0),
1750 : mnDelta2(0),
1751 0 : mnDelta3(0)
1752 : {
1753 0 : }
1754 :
1755 : //////////////////////////////////////////////////////////////////////////////
1756 :
1757 0 : SdXMLConnectorShapeContext::~SdXMLConnectorShapeContext()
1758 : {
1759 0 : }
1760 :
1761 : //////////////////////////////////////////////////////////////////////////////
1762 :
1763 : // this is called from the parent group for each unparsed attribute in the attribute list
1764 0 : void SdXMLConnectorShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1765 : {
1766 0 : switch( nPrefix )
1767 : {
1768 : case XML_NAMESPACE_DRAW:
1769 : {
1770 0 : if( IsXMLToken( rLocalName, XML_START_SHAPE ) )
1771 : {
1772 0 : maStartShapeId = rValue;
1773 0 : return;
1774 : }
1775 0 : if( IsXMLToken( rLocalName, XML_START_GLUE_POINT ) )
1776 : {
1777 0 : mnStartGlueId = rValue.toInt32();
1778 0 : return;
1779 : }
1780 0 : if( IsXMLToken( rLocalName, XML_END_SHAPE ) )
1781 : {
1782 0 : maEndShapeId = rValue;
1783 0 : return;
1784 : }
1785 0 : if( IsXMLToken( rLocalName, XML_END_GLUE_POINT ) )
1786 : {
1787 0 : mnEndGlueId = rValue.toInt32();
1788 0 : return;
1789 : }
1790 0 : if( IsXMLToken( rLocalName, XML_LINE_SKEW ) )
1791 : {
1792 0 : SvXMLTokenEnumerator aTokenEnum( rValue );
1793 0 : OUString aToken;
1794 0 : if( aTokenEnum.getNextToken( aToken ) )
1795 : {
1796 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1797 0 : mnDelta1, aToken);
1798 0 : if( aTokenEnum.getNextToken( aToken ) )
1799 : {
1800 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1801 0 : mnDelta2, aToken);
1802 0 : if( aTokenEnum.getNextToken( aToken ) )
1803 : {
1804 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1805 0 : mnDelta3, aToken);
1806 : }
1807 : }
1808 : }
1809 0 : return;
1810 : }
1811 0 : if( IsXMLToken( rLocalName, XML_TYPE ) )
1812 : {
1813 0 : SvXMLUnitConverter::convertEnum( mnType, rValue, aXML_ConnectionKind_EnumMap );
1814 0 : return;
1815 : }
1816 : }
1817 : case XML_NAMESPACE_SVG:
1818 : {
1819 0 : if( IsXMLToken( rLocalName, XML_X1 ) )
1820 : {
1821 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1822 0 : maStart.X, rValue);
1823 0 : return;
1824 : }
1825 0 : if( IsXMLToken( rLocalName, XML_Y1 ) )
1826 : {
1827 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1828 0 : maStart.Y, rValue);
1829 0 : return;
1830 : }
1831 0 : if( IsXMLToken( rLocalName, XML_X2 ) )
1832 : {
1833 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1834 0 : maEnd.X, rValue);
1835 0 : return;
1836 : }
1837 0 : if( IsXMLToken( rLocalName, XML_Y2 ) )
1838 : {
1839 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1840 0 : maEnd.Y, rValue);
1841 0 : return;
1842 : }
1843 0 : if( IsXMLToken( rLocalName, XML_D ) )
1844 : {
1845 0 : SdXMLImExViewBox aViewBox( 0, 0, 1, 1 );
1846 0 : awt::Point aPoint( 0, 0 );
1847 0 : awt::Size aSize( 1, 1 );
1848 :
1849 0 : SdXMLImExSvgDElement aPoints( rValue, aViewBox, aPoint, aSize, GetImport() );
1850 :
1851 0 : if ( aPoints.IsCurve() )
1852 : {
1853 : drawing::PolyPolygonBezierCoords aSourcePolyPolygon(
1854 0 : aPoints.GetPointSequenceSequence(),
1855 0 : aPoints.GetFlagSequenceSequence());
1856 0 : maPath <<= aSourcePolyPolygon;
1857 : }
1858 : else
1859 : {
1860 0 : const drawing::PointSequenceSequence& rOuterSeq = aPoints.GetPointSequenceSequence();
1861 0 : drawing::FlagSequenceSequence aFlagSeqSeq( rOuterSeq.getLength() );
1862 0 : for ( int a = 0; a < rOuterSeq.getLength(); a++ )
1863 0 : aFlagSeqSeq[ a ] = drawing::FlagSequence( rOuterSeq[ a ].getLength() );
1864 :
1865 : drawing::PolyPolygonBezierCoords aSourcePolyPolygon(
1866 0 : aPoints.GetPointSequenceSequence(),
1867 0 : aFlagSeqSeq );
1868 0 : maPath <<= aSourcePolyPolygon;
1869 0 : }
1870 : }
1871 : }
1872 : }
1873 :
1874 0 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1875 : }
1876 :
1877 : //////////////////////////////////////////////////////////////////////////////
1878 :
1879 0 : void SdXMLConnectorShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1880 : {
1881 : // #107928#
1882 : // For security reasons, do not add empty connectors. There may have been an error in EA2
1883 : // that created empty, far set off connectors (e.g. 63 meters below top of document). This
1884 : // is not guaranteed, but it's definitely safe to not add empty connectors.
1885 0 : sal_Bool bDoAdd(sal_True);
1886 :
1887 0 : if( maStartShapeId.isEmpty()
1888 0 : && maEndShapeId.isEmpty()
1889 : && maStart.X == maEnd.X
1890 : && maStart.Y == maEnd.Y
1891 : && 0 == mnDelta1
1892 : && 0 == mnDelta2
1893 : && 0 == mnDelta3
1894 : )
1895 : {
1896 0 : bDoAdd = sal_False;
1897 : }
1898 :
1899 0 : if(bDoAdd)
1900 : {
1901 : // create Connector shape
1902 : // add, set style and properties from base shape
1903 0 : AddShape("com.sun.star.drawing.ConnectorShape");
1904 0 : if(mxShape.is())
1905 : {
1906 : // add connection ids
1907 0 : if( !maStartShapeId.isEmpty() )
1908 0 : GetImport().GetShapeImport()->addShapeConnection( mxShape, sal_True, maStartShapeId, mnStartGlueId );
1909 0 : if( !maEndShapeId.isEmpty() )
1910 0 : GetImport().GetShapeImport()->addShapeConnection( mxShape, sal_False, maEndShapeId, mnEndGlueId );
1911 :
1912 0 : uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
1913 0 : if( xProps.is() )
1914 : {
1915 0 : uno::Any aAny;
1916 0 : aAny <<= maStart;
1917 0 : xProps->setPropertyValue(OUString("StartPosition"), aAny);
1918 :
1919 0 : aAny <<= maEnd;
1920 0 : xProps->setPropertyValue(OUString("EndPosition"), aAny );
1921 :
1922 0 : aAny <<= (drawing::ConnectorType)mnType;
1923 0 : xProps->setPropertyValue(OUString("EdgeKind"), aAny );
1924 :
1925 0 : aAny <<= mnDelta1;
1926 0 : xProps->setPropertyValue(OUString("EdgeLine1Delta"), aAny );
1927 :
1928 0 : aAny <<= mnDelta2;
1929 0 : xProps->setPropertyValue(OUString("EdgeLine2Delta"), aAny );
1930 :
1931 0 : aAny <<= mnDelta3;
1932 0 : xProps->setPropertyValue(OUString("EdgeLine3Delta"), aAny );
1933 : }
1934 0 : SetStyle();
1935 0 : SetLayer();
1936 :
1937 0 : if ( maPath.hasValue() )
1938 : {
1939 : // #i115492#
1940 : // Ignore svg:d attribute for text documents created by OpenOffice.org
1941 : // versions before OOo 3.3, because these OOo versions are storing
1942 : // svg:d values not using the correct unit.
1943 0 : bool bApplySVGD( true );
1944 0 : if ( uno::Reference< text::XTextDocument >(GetImport().GetModel(), uno::UNO_QUERY).is() )
1945 : {
1946 0 : sal_Int32 nUPD( 0 );
1947 0 : sal_Int32 nBuild( 0 );
1948 0 : const bool bBuildIdFound = GetImport().getBuildIds( nUPD, nBuild );
1949 0 : if ( GetImport().IsTextDocInOOoFileFormat() ||
1950 : ( bBuildIdFound &&
1951 : ( ( nUPD == 641 ) || ( nUPD == 645 ) || // prior OOo 2.0
1952 : ( nUPD == 680 ) || // OOo 2.x
1953 : ( nUPD == 300 ) || // OOo 3.0 - OOo 3.0.1
1954 : ( nUPD == 310 ) || // OOo 3.1 - OOo 3.1.1
1955 : ( nUPD == 320 ) ) ) ) // OOo 3.2 - OOo 3.2.1
1956 : {
1957 0 : bApplySVGD = false;
1958 : }
1959 : }
1960 :
1961 0 : if ( bApplySVGD )
1962 : {
1963 0 : xProps->setPropertyValue( OUString("PolyPolygonBezier" ), maPath );
1964 : }
1965 : }
1966 :
1967 0 : SdXMLShapeContext::StartElement(xAttrList);
1968 : }
1969 : }
1970 0 : }
1971 :
1972 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1973 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1974 :
1975 0 : TYPEINIT1( SdXMLMeasureShapeContext, SdXMLShapeContext );
1976 :
1977 0 : SdXMLMeasureShapeContext::SdXMLMeasureShapeContext(
1978 : SvXMLImport& rImport,
1979 : sal_uInt16 nPrfx,
1980 : const OUString& rLocalName,
1981 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1982 : uno::Reference< drawing::XShapes >& rShapes,
1983 : sal_Bool bTemporaryShape)
1984 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1985 : maStart(0,0),
1986 0 : maEnd(1,1)
1987 : {
1988 0 : }
1989 :
1990 : //////////////////////////////////////////////////////////////////////////////
1991 :
1992 0 : SdXMLMeasureShapeContext::~SdXMLMeasureShapeContext()
1993 : {
1994 0 : }
1995 :
1996 : // this is called from the parent group for each unparsed attribute in the attribute list
1997 0 : void SdXMLMeasureShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1998 : {
1999 0 : switch( nPrefix )
2000 : {
2001 : case XML_NAMESPACE_SVG:
2002 : {
2003 0 : if( IsXMLToken( rLocalName, XML_X1 ) )
2004 : {
2005 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
2006 0 : maStart.X, rValue);
2007 0 : return;
2008 : }
2009 0 : if( IsXMLToken( rLocalName, XML_Y1 ) )
2010 : {
2011 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
2012 0 : maStart.Y, rValue);
2013 0 : return;
2014 : }
2015 0 : if( IsXMLToken( rLocalName, XML_X2 ) )
2016 : {
2017 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
2018 0 : maEnd.X, rValue);
2019 0 : return;
2020 : }
2021 0 : if( IsXMLToken( rLocalName, XML_Y2 ) )
2022 : {
2023 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
2024 0 : maEnd.Y, rValue);
2025 0 : return;
2026 : }
2027 : }
2028 : }
2029 :
2030 0 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2031 : }
2032 :
2033 : //////////////////////////////////////////////////////////////////////////////
2034 :
2035 0 : void SdXMLMeasureShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2036 : {
2037 : // create Measure shape
2038 : // add, set style and properties from base shape
2039 0 : AddShape("com.sun.star.drawing.MeasureShape");
2040 0 : if(mxShape.is())
2041 : {
2042 0 : SetStyle();
2043 0 : SetLayer();
2044 :
2045 0 : uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2046 0 : if( xProps.is() )
2047 : {
2048 0 : uno::Any aAny;
2049 0 : aAny <<= maStart;
2050 0 : xProps->setPropertyValue(OUString("StartPosition"), aAny);
2051 :
2052 0 : aAny <<= maEnd;
2053 0 : xProps->setPropertyValue(OUString("EndPosition"), aAny );
2054 : }
2055 :
2056 : // delete pre created fields
2057 0 : uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
2058 0 : if( xText.is() )
2059 : {
2060 0 : const OUString aEmpty( " " );
2061 0 : xText->setString( aEmpty );
2062 : }
2063 :
2064 0 : SdXMLShapeContext::StartElement(xAttrList);
2065 : }
2066 0 : }
2067 :
2068 0 : void SdXMLMeasureShapeContext::EndElement()
2069 : {
2070 : do
2071 : {
2072 : // delete pre created fields
2073 0 : uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
2074 0 : if( !xText.is() )
2075 : break;
2076 :
2077 0 : uno::Reference< text::XTextCursor > xCursor( xText->createTextCursor() );
2078 0 : if( !xCursor.is() )
2079 : break;
2080 :
2081 0 : const OUString aEmpty;
2082 0 : xCursor->collapseToStart();
2083 0 : xCursor->goRight( 1, sal_True );
2084 0 : xCursor->setString( aEmpty );
2085 : }
2086 : while(0);
2087 :
2088 0 : SdXMLShapeContext::EndElement();
2089 0 : }
2090 :
2091 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2092 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2093 :
2094 0 : TYPEINIT1( SdXMLPageShapeContext, SdXMLShapeContext );
2095 :
2096 15 : SdXMLPageShapeContext::SdXMLPageShapeContext(
2097 : SvXMLImport& rImport,
2098 : sal_uInt16 nPrfx,
2099 : const OUString& rLocalName,
2100 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2101 : uno::Reference< drawing::XShapes >& rShapes,
2102 : sal_Bool bTemporaryShape)
2103 15 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), mnPageNumber(0)
2104 : {
2105 15 : mbClearDefaultAttributes = false;
2106 15 : }
2107 :
2108 : //////////////////////////////////////////////////////////////////////////////
2109 :
2110 30 : SdXMLPageShapeContext::~SdXMLPageShapeContext()
2111 : {
2112 30 : }
2113 :
2114 : //////////////////////////////////////////////////////////////////////////////
2115 :
2116 : // this is called from the parent group for each unparsed attribute in the attribute list
2117 101 : void SdXMLPageShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2118 : {
2119 101 : if( XML_NAMESPACE_DRAW == nPrefix )
2120 : {
2121 31 : if( IsXMLToken( rLocalName, XML_PAGE_NUMBER ) )
2122 : {
2123 8 : mnPageNumber = rValue.toInt32();
2124 109 : return;
2125 : }
2126 : }
2127 :
2128 93 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2129 : }
2130 :
2131 : //////////////////////////////////////////////////////////////////////////////
2132 :
2133 15 : void SdXMLPageShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2134 : {
2135 : // create Page shape
2136 : // add, set style and properties from base shape
2137 :
2138 : // #86163# take into account which type of PageShape needs to
2139 : // be constructed. It's an pres shape if presentation:XML_CLASS == XML_PRESENTATION_PAGE.
2140 15 : sal_Bool bIsPresentation = !maPresentationClass.isEmpty() &&
2141 30 : GetImport().GetShapeImport()->IsPresentationShapesSupported();
2142 :
2143 15 : uno::Reference< lang::XServiceInfo > xInfo( mxShapes, uno::UNO_QUERY );
2144 15 : const sal_Bool bIsOnHandoutPage = xInfo.is() && xInfo->supportsService( OUString( "com.sun.star.presentation.HandoutMasterPage") );
2145 :
2146 15 : if( bIsOnHandoutPage )
2147 : {
2148 6 : AddShape("com.sun.star.presentation.HandoutShape");
2149 : }
2150 : else
2151 : {
2152 9 : if(bIsPresentation && !IsXMLToken( maPresentationClass, XML_PRESENTATION_PAGE ) )
2153 : {
2154 0 : bIsPresentation = sal_False;
2155 : }
2156 :
2157 9 : if(bIsPresentation)
2158 : {
2159 9 : AddShape("com.sun.star.presentation.PageShape");
2160 : }
2161 : else
2162 : {
2163 0 : AddShape("com.sun.star.drawing.PageShape");
2164 : }
2165 : }
2166 :
2167 15 : if(mxShape.is())
2168 : {
2169 15 : SetStyle();
2170 15 : SetLayer();
2171 :
2172 : // set pos, size, shear and rotate
2173 15 : SetTransformation();
2174 :
2175 15 : uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
2176 15 : if(xPropSet.is())
2177 : {
2178 15 : uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
2179 15 : const OUString aPageNumberStr("PageNumber");
2180 15 : if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(aPageNumberStr))
2181 15 : xPropSet->setPropertyValue(aPageNumberStr, uno::makeAny( mnPageNumber ));
2182 : }
2183 :
2184 15 : SdXMLShapeContext::StartElement(xAttrList);
2185 15 : }
2186 15 : }
2187 :
2188 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2189 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2190 :
2191 0 : TYPEINIT1( SdXMLCaptionShapeContext, SdXMLShapeContext );
2192 :
2193 1 : SdXMLCaptionShapeContext::SdXMLCaptionShapeContext(
2194 : SvXMLImport& rImport,
2195 : sal_uInt16 nPrfx,
2196 : const OUString& rLocalName,
2197 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2198 : uno::Reference< drawing::XShapes >& rShapes,
2199 : sal_Bool bTemporaryShape)
2200 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2201 : // #86616# for correct edge rounding import mnRadius needs to be initialized
2202 1 : mnRadius( 0L )
2203 : {
2204 1 : }
2205 :
2206 : //////////////////////////////////////////////////////////////////////////////
2207 :
2208 2 : SdXMLCaptionShapeContext::~SdXMLCaptionShapeContext()
2209 : {
2210 2 : }
2211 :
2212 : //////////////////////////////////////////////////////////////////////////////
2213 :
2214 1 : void SdXMLCaptionShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2215 : {
2216 : // create Caption shape
2217 : // add, set style and properties from base shape
2218 1 : AddShape("com.sun.star.drawing.CaptionShape");
2219 1 : if( mxShape.is() )
2220 : {
2221 1 : SetStyle();
2222 1 : SetLayer();
2223 :
2224 1 : uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2225 :
2226 : // SJ: If AutoGrowWidthItem is set, SetTransformation will lead to the wrong SnapRect
2227 : // because NbcAdjustTextFrameWidthAndHeight() is called (text is set later and center alignment
2228 : // is the default setting, so the top left reference point that is used by the caption point is
2229 : // no longer correct) There are two ways to solve this problem, temporarily disabling the
2230 : // autogrowwith as we are doing here or to apply the CaptionPoint after setting text
2231 1 : sal_Bool bIsAutoGrowWidth = sal_False;
2232 1 : if ( xProps.is() )
2233 : {
2234 1 : uno::Any aAny( xProps->getPropertyValue( OUString("TextAutoGrowWidth" ) ) );
2235 1 : aAny >>= bIsAutoGrowWidth;
2236 :
2237 1 : if ( bIsAutoGrowWidth )
2238 0 : xProps->setPropertyValue( OUString("TextAutoGrowWidth"), uno::makeAny( sal_False ) );
2239 : }
2240 :
2241 : // set pos, size, shear and rotate
2242 1 : SetTransformation();
2243 1 : if( xProps.is() )
2244 1 : xProps->setPropertyValue(OUString("CaptionPoint"), uno::makeAny( maCaptionPoint ) );
2245 :
2246 1 : if ( bIsAutoGrowWidth )
2247 0 : xProps->setPropertyValue( OUString("TextAutoGrowWidth"), uno::makeAny( sal_True ) );
2248 :
2249 1 : if(mnRadius)
2250 : {
2251 0 : uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
2252 0 : if(xPropSet.is())
2253 : {
2254 : try
2255 : {
2256 0 : xPropSet->setPropertyValue(OUString("CornerRadius"), uno::makeAny( mnRadius ) );
2257 : }
2258 0 : catch(const uno::Exception&)
2259 : {
2260 : OSL_FAIL( "exception during setting of corner radius!");
2261 : }
2262 0 : }
2263 : }
2264 :
2265 1 : SdXMLShapeContext::StartElement(xAttrList);
2266 : }
2267 1 : }
2268 :
2269 : // this is called from the parent group for each unparsed attribute in the attribute list
2270 8 : void SdXMLCaptionShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2271 : {
2272 8 : if( XML_NAMESPACE_DRAW == nPrefix )
2273 : {
2274 4 : if( IsXMLToken( rLocalName, XML_CAPTION_POINT_X ) )
2275 : {
2276 1 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
2277 2 : maCaptionPoint.X, rValue);
2278 1 : return;
2279 : }
2280 3 : if( IsXMLToken( rLocalName, XML_CAPTION_POINT_Y ) )
2281 : {
2282 1 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
2283 2 : maCaptionPoint.Y, rValue);
2284 1 : return;
2285 : }
2286 2 : if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) )
2287 : {
2288 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
2289 0 : mnRadius, rValue);
2290 0 : return;
2291 : }
2292 : }
2293 6 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2294 : }
2295 :
2296 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2297 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2298 :
2299 0 : TYPEINIT1( SdXMLGraphicObjectShapeContext, SdXMLShapeContext );
2300 :
2301 3 : SdXMLGraphicObjectShapeContext::SdXMLGraphicObjectShapeContext(
2302 : SvXMLImport& rImport,
2303 : sal_uInt16 nPrfx,
2304 : const OUString& rLocalName,
2305 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2306 : uno::Reference< drawing::XShapes >& rShapes,
2307 : sal_Bool bTemporaryShape)
2308 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2309 3 : maURL()
2310 : {
2311 3 : }
2312 :
2313 : //////////////////////////////////////////////////////////////////////////////
2314 :
2315 : // this is called from the parent group for each unparsed attribute in the attribute list
2316 34 : void SdXMLGraphicObjectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2317 : {
2318 34 : if( XML_NAMESPACE_XLINK == nPrefix )
2319 : {
2320 12 : if( IsXMLToken( rLocalName, XML_HREF ) )
2321 : {
2322 3 : maURL = rValue;
2323 37 : return;
2324 : }
2325 : }
2326 :
2327 31 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2328 : }
2329 :
2330 : //////////////////////////////////////////////////////////////////////////////
2331 :
2332 3 : void SdXMLGraphicObjectShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
2333 : {
2334 : // create graphic object shape
2335 : const char *pService;
2336 :
2337 3 : if( IsXMLToken( maPresentationClass, XML_GRAPHIC ) && GetImport().GetShapeImport()->IsPresentationShapesSupported() )
2338 : {
2339 1 : pService = "com.sun.star.presentation.GraphicObjectShape";
2340 : }
2341 : else
2342 : {
2343 2 : pService = "com.sun.star.drawing.GraphicObjectShape";
2344 : }
2345 :
2346 3 : AddShape( pService );
2347 :
2348 3 : if(mxShape.is())
2349 : {
2350 3 : SetStyle();
2351 3 : SetLayer();
2352 :
2353 3 : uno::Reference< beans::XPropertySet > xPropset(mxShape, uno::UNO_QUERY);
2354 3 : if(xPropset.is())
2355 : {
2356 : // since OOo 1.x had no line or fill style for graphics, but may create
2357 : // documents with them, we have to override them here
2358 : sal_Int32 nUPD, nBuildId;
2359 3 : if( GetImport().getBuildIds( nUPD, nBuildId ) && (nUPD == 645) ) try
2360 : {
2361 0 : xPropset->setPropertyValue( OUString("FillStyle"), Any( FillStyle_NONE ) );
2362 0 : xPropset->setPropertyValue( OUString("LineStyle"), Any( LineStyle_NONE ) );
2363 : }
2364 0 : catch(const Exception&)
2365 : {
2366 : }
2367 :
2368 3 : uno::Reference< beans::XPropertySetInfo > xPropsInfo( xPropset->getPropertySetInfo() );
2369 3 : if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString("IsEmptyPresentationObject" )))
2370 3 : xPropset->setPropertyValue( OUString("IsEmptyPresentationObject" ), ::cppu::bool2any( mbIsPlaceholder ) );
2371 :
2372 3 : if( !mbIsPlaceholder )
2373 : {
2374 3 : if( !maURL.isEmpty() )
2375 : {
2376 3 : uno::Any aAny;
2377 3 : aAny <<= GetImport().ResolveGraphicObjectURL( maURL, GetImport().isGraphicLoadOnDemandSupported() );
2378 : try
2379 : {
2380 3 : xPropset->setPropertyValue( OUString("GraphicURL" ), aAny );
2381 3 : xPropset->setPropertyValue( OUString("GraphicStreamURL" ), aAny );
2382 : }
2383 0 : catch (const lang::IllegalArgumentException&)
2384 : {
2385 3 : }
2386 : }
2387 3 : }
2388 : }
2389 :
2390 3 : if(mbIsUserTransformed)
2391 : {
2392 1 : uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2393 1 : if(xProps.is())
2394 : {
2395 1 : uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2396 1 : if( xPropsInfo.is() )
2397 : {
2398 1 : if( xPropsInfo->hasPropertyByName(OUString("IsPlaceholderDependent" )))
2399 1 : xProps->setPropertyValue( OUString("IsPlaceholderDependent" ), ::cppu::bool2any( sal_False ) );
2400 1 : }
2401 1 : }
2402 : }
2403 :
2404 : // set pos, size, shear and rotate
2405 3 : SetTransformation();
2406 :
2407 3 : SdXMLShapeContext::StartElement(mxAttrList);
2408 : }
2409 3 : }
2410 :
2411 3 : void SdXMLGraphicObjectShapeContext::EndElement()
2412 : {
2413 3 : if( mxBase64Stream.is() )
2414 : {
2415 0 : OUString sURL( GetImport().ResolveGraphicObjectURLFromBase64( mxBase64Stream ) );
2416 0 : if( !sURL.isEmpty() )
2417 : {
2418 : try
2419 : {
2420 0 : uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2421 0 : if(xProps.is())
2422 : {
2423 0 : const uno::Any aAny( uno::makeAny( sURL ) );
2424 0 : xProps->setPropertyValue( OUString("GraphicURL" ), aAny );
2425 0 : xProps->setPropertyValue( OUString("GraphicStreamURL" ), aAny );
2426 0 : }
2427 : }
2428 0 : catch (const lang::IllegalArgumentException&)
2429 : {
2430 : }
2431 0 : }
2432 : }
2433 :
2434 3 : SdXMLShapeContext::EndElement();
2435 3 : }
2436 :
2437 :
2438 : //////////////////////////////////////////////////////////////////////////////
2439 :
2440 3 : SvXMLImportContext* SdXMLGraphicObjectShapeContext::CreateChildContext(
2441 : sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
2442 : const uno::Reference<xml::sax::XAttributeList>& xAttrList )
2443 : {
2444 3 : SvXMLImportContext* pContext = NULL;
2445 :
2446 3 : if( (XML_NAMESPACE_OFFICE == nPrefix) &&
2447 0 : xmloff::token::IsXMLToken( rLocalName, xmloff::token::XML_BINARY_DATA ) )
2448 : {
2449 0 : if( maURL.isEmpty() && !mxBase64Stream.is() )
2450 : {
2451 0 : mxBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64();
2452 0 : if( mxBase64Stream.is() )
2453 0 : pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
2454 : rLocalName, xAttrList,
2455 0 : mxBase64Stream );
2456 : }
2457 : }
2458 :
2459 : // delegate to parent class if no context could be created
2460 3 : if ( NULL == pContext )
2461 : pContext = SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName,
2462 3 : xAttrList);
2463 :
2464 3 : return pContext;
2465 : }
2466 :
2467 : //////////////////////////////////////////////////////////////////////////////
2468 :
2469 6 : SdXMLGraphicObjectShapeContext::~SdXMLGraphicObjectShapeContext()
2470 : {
2471 :
2472 6 : }
2473 :
2474 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2475 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2476 :
2477 0 : TYPEINIT1( SdXMLChartShapeContext, SdXMLShapeContext );
2478 :
2479 0 : SdXMLChartShapeContext::SdXMLChartShapeContext(
2480 : SvXMLImport& rImport,
2481 : sal_uInt16 nPrfx,
2482 : const OUString& rLocalName,
2483 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2484 : uno::Reference< drawing::XShapes >& rShapes,
2485 : sal_Bool bTemporaryShape)
2486 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2487 0 : mpChartContext( NULL )
2488 : {
2489 0 : }
2490 :
2491 : //////////////////////////////////////////////////////////////////////////////
2492 :
2493 0 : SdXMLChartShapeContext::~SdXMLChartShapeContext()
2494 : {
2495 0 : if( mpChartContext )
2496 0 : delete mpChartContext;
2497 0 : }
2498 :
2499 : //////////////////////////////////////////////////////////////////////////////
2500 :
2501 0 : void SdXMLChartShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2502 : {
2503 0 : const sal_Bool bIsPresentation = isPresentationShape();
2504 :
2505 0 : AddShape( bIsPresentation ? "com.sun.star.presentation.ChartShape" : "com.sun.star.drawing.OLE2Shape" );
2506 :
2507 0 : if(mxShape.is())
2508 : {
2509 0 : SetStyle();
2510 0 : SetLayer();
2511 :
2512 0 : if( !mbIsPlaceholder )
2513 : {
2514 0 : uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2515 0 : if(xProps.is())
2516 : {
2517 0 : uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2518 0 : if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString("IsEmptyPresentationObject" )))
2519 0 : xProps->setPropertyValue( OUString("IsEmptyPresentationObject" ), ::cppu::bool2any( sal_False ) );
2520 :
2521 0 : uno::Any aAny;
2522 :
2523 0 : const OUString aCLSID( "12DCAE26-281F-416F-a234-c3086127382e");
2524 :
2525 0 : aAny <<= aCLSID;
2526 0 : xProps->setPropertyValue( OUString("CLSID" ), aAny );
2527 :
2528 0 : aAny = xProps->getPropertyValue( OUString("Model" ) );
2529 0 : uno::Reference< frame::XModel > xChartModel;
2530 0 : if( aAny >>= xChartModel )
2531 : {
2532 0 : mpChartContext = GetImport().GetChartImport()->CreateChartContext( GetImport(), XML_NAMESPACE_SVG, GetXMLToken(XML_CHART), xChartModel, xAttrList );
2533 0 : }
2534 0 : }
2535 : }
2536 :
2537 0 : if(mbIsUserTransformed)
2538 : {
2539 0 : uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2540 0 : if(xProps.is())
2541 : {
2542 0 : uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2543 0 : if( xPropsInfo.is() )
2544 : {
2545 0 : if( xPropsInfo->hasPropertyByName(OUString("IsPlaceholderDependent" )))
2546 0 : xProps->setPropertyValue( OUString("IsPlaceholderDependent" ), ::cppu::bool2any( sal_False ) );
2547 0 : }
2548 0 : }
2549 : }
2550 :
2551 :
2552 : // set pos, size, shear and rotate
2553 0 : SetTransformation();
2554 :
2555 0 : SdXMLShapeContext::StartElement(xAttrList);
2556 :
2557 0 : if( mpChartContext )
2558 0 : mpChartContext->StartElement( xAttrList );
2559 : }
2560 0 : }
2561 :
2562 0 : void SdXMLChartShapeContext::EndElement()
2563 : {
2564 0 : if( mpChartContext )
2565 0 : mpChartContext->EndElement();
2566 :
2567 0 : SdXMLShapeContext::EndElement();
2568 0 : }
2569 :
2570 0 : void SdXMLChartShapeContext::Characters( const ::rtl::OUString& rChars )
2571 : {
2572 0 : if( mpChartContext )
2573 0 : mpChartContext->Characters( rChars );
2574 0 : }
2575 :
2576 0 : SvXMLImportContext * SdXMLChartShapeContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
2577 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
2578 : {
2579 0 : if( mpChartContext )
2580 0 : return mpChartContext->CreateChildContext( nPrefix, rLocalName, xAttrList );
2581 :
2582 0 : return NULL;
2583 : }
2584 :
2585 : //////////////////////////////////////////////////////////////////////////////
2586 :
2587 12 : TYPEINIT1( SdXMLObjectShapeContext, SdXMLShapeContext );
2588 :
2589 4 : SdXMLObjectShapeContext::SdXMLObjectShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
2590 : const rtl::OUString& rLocalName,
2591 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2592 : com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
2593 : sal_Bool bTemporaryShape)
2594 4 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
2595 : {
2596 4 : }
2597 :
2598 8 : SdXMLObjectShapeContext::~SdXMLObjectShapeContext()
2599 : {
2600 8 : }
2601 :
2602 4 : void SdXMLObjectShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
2603 : {
2604 : // #96717# in theorie, if we don't have a url we shouldn't even
2605 : // export this ole shape. But practical its to risky right now
2606 : // to change this so we better dispose this on load
2607 : //if( !mbIsPlaceholder && ImpIsEmptyURL(maHref) )
2608 : // return;
2609 :
2610 : // #100592# this BugFix prevents that a shape is created. CL
2611 : // is thinking about an alternative.
2612 : // #i13140# Check for more than empty string in maHref, there are
2613 : // other possibilities that maHref results in empty container
2614 : // storage names
2615 4 : if( !(GetImport().getImportFlags() & IMPORT_EMBEDDED) && !mbIsPlaceholder && ImpIsEmptyURL(maHref) )
2616 4 : return;
2617 :
2618 4 : const char* pService = "com.sun.star.drawing.OLE2Shape";
2619 :
2620 4 : sal_Bool bIsPresShape = !maPresentationClass.isEmpty() && GetImport().GetShapeImport()->IsPresentationShapesSupported();
2621 :
2622 4 : if( bIsPresShape )
2623 : {
2624 0 : if( IsXMLToken( maPresentationClass, XML_PRESENTATION_CHART ) )
2625 : {
2626 0 : pService = "com.sun.star.presentation.ChartShape";
2627 : }
2628 0 : else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) )
2629 : {
2630 0 : pService = "com.sun.star.presentation.CalcShape";
2631 : }
2632 0 : else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) )
2633 : {
2634 0 : pService = "com.sun.star.presentation.OLE2Shape";
2635 : }
2636 : }
2637 :
2638 4 : AddShape( pService );
2639 :
2640 4 : if( mxShape.is() )
2641 : {
2642 4 : SetLayer();
2643 :
2644 4 : if(bIsPresShape)
2645 : {
2646 0 : uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2647 0 : if(xProps.is())
2648 : {
2649 0 : uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2650 0 : if( xPropsInfo.is() )
2651 : {
2652 0 : if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString("IsEmptyPresentationObject" )))
2653 0 : xProps->setPropertyValue( OUString("IsEmptyPresentationObject" ), ::cppu::bool2any( sal_False ) );
2654 :
2655 0 : if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString("IsPlaceholderDependent" )))
2656 0 : xProps->setPropertyValue( OUString("IsPlaceholderDependent" ), ::cppu::bool2any( sal_False ) );
2657 0 : }
2658 0 : }
2659 : }
2660 :
2661 4 : if( !mbIsPlaceholder && !maHref.isEmpty() )
2662 : {
2663 4 : uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2664 :
2665 4 : if( xProps.is() )
2666 : {
2667 4 : OUString aPersistName = GetImport().ResolveEmbeddedObjectURL( maHref, maCLSID );
2668 :
2669 4 : if ( GetImport().IsPackageURL( maHref ) )
2670 : {
2671 4 : const OUString sURL( "vnd.sun.star.EmbeddedObject:" );
2672 :
2673 4 : if ( aPersistName.compareTo( sURL, sURL.getLength() ) == 0 )
2674 4 : aPersistName = aPersistName.copy( sURL.getLength() );
2675 :
2676 4 : xProps->setPropertyValue( OUString( "PersistName" ),
2677 4 : uno::makeAny( aPersistName ) );
2678 : }
2679 : else
2680 : {
2681 : // this is OOo link object
2682 0 : xProps->setPropertyValue( OUString( "LinkURL" ),
2683 0 : uno::makeAny( aPersistName ) );
2684 4 : }
2685 4 : }
2686 : }
2687 :
2688 : // set pos, size, shear and rotate
2689 4 : SetTransformation();
2690 :
2691 4 : SetStyle();
2692 :
2693 4 : GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
2694 : }
2695 : }
2696 :
2697 4 : void SdXMLObjectShapeContext::EndElement()
2698 : {
2699 : // #i67705#
2700 4 : const sal_uInt16 nGeneratorVersion(GetImport().getGeneratorVersion());
2701 :
2702 4 : if(nGeneratorVersion < SvXMLImport::OOo_34x)
2703 : {
2704 : // #i118485#
2705 : // If it's an old file from us written before OOo3.4, we need to correct
2706 : // FillStyle and LineStyle for OLE2 objects. The error was that the old paint
2707 : // implementations just ignored added fill/linestyles completely, thus
2708 : // those objects need to be corrected to not show blue and hairline which
2709 : // always was the default, but would be shown now
2710 4 : uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2711 :
2712 4 : if( xProps.is() )
2713 : {
2714 4 : xProps->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FillStyle")), uno::makeAny(drawing::FillStyle_NONE));
2715 4 : xProps->setPropertyValue(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LineStyle")), uno::makeAny(drawing::LineStyle_NONE));
2716 4 : }
2717 : }
2718 :
2719 : // #100592#
2720 4 : if( mxBase64Stream.is() )
2721 : {
2722 0 : OUString aPersistName( GetImport().ResolveEmbeddedObjectURLFromBase64() );
2723 0 : const OUString sURL( "vnd.sun.star.EmbeddedObject:" );
2724 :
2725 0 : aPersistName = aPersistName.copy( sURL.getLength() );
2726 :
2727 0 : uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2728 0 : if( xProps.is() )
2729 0 : xProps->setPropertyValue( OUString( "PersistName" ), uno::makeAny( aPersistName ) );
2730 : }
2731 :
2732 4 : SdXMLShapeContext::EndElement();
2733 4 : }
2734 :
2735 : // this is called from the parent group for each unparsed attribute in the attribute list
2736 40 : void SdXMLObjectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2737 : {
2738 40 : switch( nPrefix )
2739 : {
2740 : case XML_NAMESPACE_DRAW:
2741 8 : if( IsXMLToken( rLocalName, XML_CLASS_ID ) )
2742 : {
2743 0 : maCLSID = rValue;
2744 0 : return;
2745 : }
2746 8 : break;
2747 : case XML_NAMESPACE_XLINK:
2748 16 : if( IsXMLToken( rLocalName, XML_HREF ) )
2749 : {
2750 4 : maHref = rValue;
2751 4 : return;
2752 : }
2753 12 : break;
2754 : }
2755 :
2756 36 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2757 : }
2758 :
2759 0 : SvXMLImportContext* SdXMLObjectShapeContext::CreateChildContext(
2760 : sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
2761 : const uno::Reference<xml::sax::XAttributeList>& xAttrList )
2762 : {
2763 : // #100592#
2764 0 : SvXMLImportContext* pContext = NULL;
2765 :
2766 0 : if((XML_NAMESPACE_OFFICE == nPrefix) && IsXMLToken(rLocalName, XML_BINARY_DATA))
2767 : {
2768 0 : mxBase64Stream = GetImport().GetStreamForEmbeddedObjectURLFromBase64();
2769 0 : if( mxBase64Stream.is() )
2770 0 : pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
2771 : rLocalName, xAttrList,
2772 0 : mxBase64Stream );
2773 : }
2774 0 : else if( ((XML_NAMESPACE_OFFICE == nPrefix) && IsXMLToken(rLocalName, XML_DOCUMENT)) ||
2775 0 : ((XML_NAMESPACE_MATH == nPrefix) && IsXMLToken(rLocalName, XML_MATH)) )
2776 : {
2777 : XMLEmbeddedObjectImportContext *pEContext =
2778 0 : new XMLEmbeddedObjectImportContext( GetImport(), nPrefix,
2779 0 : rLocalName, xAttrList );
2780 0 : maCLSID = pEContext->GetFilterCLSID();
2781 0 : if( !maCLSID.isEmpty() )
2782 : {
2783 0 : uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
2784 0 : if( xPropSet.is() )
2785 : {
2786 0 : xPropSet->setPropertyValue( OUString("CLSID" ), uno::makeAny( maCLSID ) );
2787 :
2788 0 : uno::Reference< lang::XComponent > xComp;
2789 0 : xPropSet->getPropertyValue( OUString("Model" ) ) >>= xComp;
2790 : DBG_ASSERT( xComp.is(), "no xModel for own OLE format" );
2791 0 : pEContext->SetComponent( xComp );
2792 0 : }
2793 : }
2794 0 : pContext = pEContext;
2795 : }
2796 :
2797 : // delegate to parent class if no context could be created
2798 0 : if(!pContext)
2799 0 : pContext = SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName, xAttrList);
2800 :
2801 0 : return pContext;
2802 : }
2803 :
2804 : //////////////////////////////////////////////////////////////////////////////
2805 :
2806 0 : TYPEINIT1( SdXMLAppletShapeContext, SdXMLShapeContext );
2807 :
2808 0 : SdXMLAppletShapeContext::SdXMLAppletShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
2809 : const rtl::OUString& rLocalName,
2810 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2811 : com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
2812 : sal_Bool bTemporaryShape)
2813 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2814 0 : mbIsScript( sal_False )
2815 : {
2816 0 : }
2817 :
2818 0 : SdXMLAppletShapeContext::~SdXMLAppletShapeContext()
2819 : {
2820 0 : }
2821 :
2822 0 : void SdXMLAppletShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
2823 : {
2824 0 : const char* pService = "com.sun.star.drawing.AppletShape";
2825 0 : AddShape( pService );
2826 :
2827 0 : if( mxShape.is() )
2828 : {
2829 0 : SetLayer();
2830 :
2831 : // set pos, size, shear and rotate
2832 0 : SetTransformation();
2833 0 : GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
2834 : }
2835 0 : }
2836 :
2837 : // this is called from the parent group for each unparsed attribute in the attribute list
2838 0 : void SdXMLAppletShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2839 : {
2840 0 : switch( nPrefix )
2841 : {
2842 : case XML_NAMESPACE_DRAW:
2843 0 : if( IsXMLToken( rLocalName, XML_APPLET_NAME ) )
2844 : {
2845 0 : maAppletName = rValue;
2846 0 : return;
2847 : }
2848 0 : if( IsXMLToken( rLocalName, XML_CODE ) )
2849 : {
2850 0 : maAppletCode = rValue;
2851 0 : return;
2852 : }
2853 0 : if( IsXMLToken( rLocalName, XML_MAY_SCRIPT ) )
2854 : {
2855 0 : mbIsScript = IsXMLToken( rValue, XML_TRUE );
2856 0 : return;
2857 : }
2858 0 : break;
2859 : case XML_NAMESPACE_XLINK:
2860 0 : if( IsXMLToken( rLocalName, XML_HREF ) )
2861 : {
2862 0 : maHref = GetImport().GetAbsoluteReference(rValue);
2863 0 : return;
2864 : }
2865 0 : break;
2866 : }
2867 :
2868 0 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2869 : }
2870 :
2871 0 : void SdXMLAppletShapeContext::EndElement()
2872 : {
2873 0 : uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2874 0 : if( xProps.is() )
2875 : {
2876 0 : uno::Any aAny;
2877 :
2878 0 : if ( maSize.Width && maSize.Height )
2879 : {
2880 : // the visual area for applet must be set on loading
2881 0 : awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height );
2882 0 : aAny <<= aRect;
2883 0 : xProps->setPropertyValue( OUString( "VisibleArea" ), aAny );
2884 : }
2885 :
2886 0 : if( maParams.getLength() )
2887 : {
2888 0 : aAny <<= maParams;
2889 0 : xProps->setPropertyValue( OUString( "AppletCommands" ), aAny );
2890 : }
2891 :
2892 0 : if( !maHref.isEmpty() )
2893 : {
2894 0 : aAny <<= maHref;
2895 0 : xProps->setPropertyValue( OUString( "AppletCodeBase" ), aAny );
2896 : }
2897 :
2898 0 : if( !maAppletName.isEmpty() )
2899 : {
2900 0 : aAny <<= maAppletName;
2901 0 : xProps->setPropertyValue( OUString( "AppletName" ), aAny );
2902 : }
2903 :
2904 0 : if( mbIsScript )
2905 : {
2906 0 : aAny <<= mbIsScript;
2907 0 : xProps->setPropertyValue( OUString( "AppletIsScript" ), aAny );
2908 :
2909 : }
2910 :
2911 0 : if( !maAppletCode.isEmpty() )
2912 : {
2913 0 : aAny <<= maAppletCode;
2914 0 : xProps->setPropertyValue( OUString( "AppletCode" ), aAny );
2915 : }
2916 :
2917 0 : aAny <<= ::rtl::OUString( GetImport().GetDocumentBase() );
2918 0 : xProps->setPropertyValue( OUString( "AppletDocBase" ), aAny );
2919 :
2920 0 : SetThumbnail();
2921 : }
2922 :
2923 0 : SdXMLShapeContext::EndElement();
2924 0 : }
2925 :
2926 0 : SvXMLImportContext * SdXMLAppletShapeContext::CreateChildContext( sal_uInt16 p_nPrefix, const ::rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
2927 : {
2928 0 : if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_PARAM ) )
2929 : {
2930 0 : OUString aParamName, aParamValue;
2931 0 : const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
2932 : // now parse the attribute list and look for draw:name and draw:value
2933 0 : for(sal_Int16 a(0); a < nAttrCount; a++)
2934 : {
2935 0 : const OUString& rAttrName = xAttrList->getNameByIndex(a);
2936 0 : OUString aLocalName;
2937 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName);
2938 0 : const OUString aValue( xAttrList->getValueByIndex(a) );
2939 :
2940 0 : if( nPrefix == XML_NAMESPACE_DRAW )
2941 : {
2942 0 : if( IsXMLToken( aLocalName, XML_NAME ) )
2943 : {
2944 0 : aParamName = aValue;
2945 : }
2946 0 : else if( IsXMLToken( aLocalName, XML_VALUE ) )
2947 : {
2948 0 : aParamValue = aValue;
2949 : }
2950 : }
2951 0 : }
2952 :
2953 0 : if( !aParamName.isEmpty() )
2954 : {
2955 0 : sal_Int32 nIndex = maParams.getLength();
2956 0 : maParams.realloc( nIndex + 1 );
2957 0 : maParams[nIndex].Name = aParamName;
2958 0 : maParams[nIndex].Handle = -1;
2959 0 : maParams[nIndex].Value <<= aParamValue;
2960 0 : maParams[nIndex].State = beans::PropertyState_DIRECT_VALUE;
2961 : }
2962 :
2963 0 : return new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
2964 : }
2965 :
2966 0 : return SdXMLShapeContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList );
2967 : }
2968 :
2969 : //////////////////////////////////////////////////////////////////////////////
2970 :
2971 0 : TYPEINIT1( SdXMLPluginShapeContext, SdXMLShapeContext );
2972 :
2973 0 : SdXMLPluginShapeContext::SdXMLPluginShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
2974 : const rtl::OUString& rLocalName,
2975 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2976 : com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
2977 : sal_Bool bTemporaryShape) :
2978 : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2979 0 : mbMedia( false )
2980 : {
2981 0 : }
2982 :
2983 0 : SdXMLPluginShapeContext::~SdXMLPluginShapeContext()
2984 : {
2985 0 : }
2986 :
2987 0 : void SdXMLPluginShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList)
2988 : {
2989 : // watch for MimeType attribute to see if we have a media object
2990 0 : for( sal_Int16 n = 0, nAttrCount = ( xAttrList.is() ? xAttrList->getLength() : 0 ); n < nAttrCount; ++n )
2991 : {
2992 0 : OUString aLocalName;
2993 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( n ), &aLocalName );
2994 :
2995 0 : if( nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( aLocalName, XML_MIME_TYPE ) )
2996 : {
2997 0 : if( 0 == xAttrList->getValueByIndex( n ).compareToAscii( "application/vnd.sun.star.media" ) )
2998 0 : mbMedia = true;
2999 :
3000 : // leave this loop
3001 0 : n = nAttrCount - 1;
3002 : }
3003 0 : }
3004 :
3005 : const char* pService;
3006 :
3007 0 : sal_Bool bIsPresShape = sal_False;
3008 :
3009 0 : if( mbMedia )
3010 : {
3011 0 : pService = "com.sun.star.drawing.MediaShape";
3012 :
3013 0 : bIsPresShape = !maPresentationClass.isEmpty() && GetImport().GetShapeImport()->IsPresentationShapesSupported();
3014 0 : if( bIsPresShape )
3015 : {
3016 0 : if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) )
3017 : {
3018 0 : pService = "com.sun.star.presentation.MediaShape";
3019 : }
3020 : }
3021 : }
3022 : else
3023 0 : pService = "com.sun.star.drawing.PluginShape";
3024 :
3025 0 : AddShape( pService );
3026 :
3027 0 : if( mxShape.is() )
3028 : {
3029 0 : SetLayer();
3030 :
3031 0 : if(bIsPresShape)
3032 : {
3033 0 : uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3034 0 : if(xProps.is())
3035 : {
3036 0 : uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
3037 0 : if( xPropsInfo.is() )
3038 : {
3039 0 : if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString("IsEmptyPresentationObject" )))
3040 0 : xProps->setPropertyValue( OUString("IsEmptyPresentationObject" ), ::cppu::bool2any( sal_False ) );
3041 :
3042 0 : if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString("IsPlaceholderDependent" )))
3043 0 : xProps->setPropertyValue( OUString("IsPlaceholderDependent" ), ::cppu::bool2any( sal_False ) );
3044 0 : }
3045 0 : }
3046 : }
3047 :
3048 : // set pos, size, shear and rotate
3049 0 : SetTransformation();
3050 0 : GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
3051 : }
3052 0 : }
3053 :
3054 : static ::rtl::OUString
3055 0 : lcl_GetMediaReference(SvXMLImport const& rImport, ::rtl::OUString const& rURL)
3056 : {
3057 0 : if (rImport.IsPackageURL(rURL))
3058 : {
3059 0 : return ::rtl::OUString( "vnd.sun.star.Package:") + rURL;
3060 : }
3061 : else
3062 : {
3063 0 : return rImport.GetAbsoluteReference(rURL);
3064 : }
3065 : }
3066 :
3067 : // this is called from the parent group for each unparsed attribute in the attribute list
3068 0 : void SdXMLPluginShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3069 : {
3070 0 : switch( nPrefix )
3071 : {
3072 : case XML_NAMESPACE_DRAW:
3073 0 : if( IsXMLToken( rLocalName, XML_MIME_TYPE ) )
3074 : {
3075 0 : maMimeType = rValue;
3076 0 : return;
3077 : }
3078 0 : break;
3079 : case XML_NAMESPACE_XLINK:
3080 0 : if( IsXMLToken( rLocalName, XML_HREF ) )
3081 : {
3082 0 : maHref = lcl_GetMediaReference(GetImport(), rValue);
3083 0 : return;
3084 : }
3085 0 : break;
3086 : }
3087 :
3088 0 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3089 : }
3090 :
3091 0 : void SdXMLPluginShapeContext::EndElement()
3092 : {
3093 0 : uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3094 :
3095 0 : if( xProps.is() )
3096 : {
3097 0 : uno::Any aAny;
3098 :
3099 0 : if ( maSize.Width && maSize.Height )
3100 : {
3101 0 : const rtl::OUString sVisibleArea( "VisibleArea" );
3102 0 : uno::Reference< beans::XPropertySetInfo > aXPropSetInfo( xProps->getPropertySetInfo() );
3103 0 : if ( !aXPropSetInfo.is() || aXPropSetInfo->hasPropertyByName( sVisibleArea ) )
3104 : {
3105 : // the visual area for a plugin must be set on loading
3106 0 : awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height );
3107 0 : aAny <<= aRect;
3108 0 : xProps->setPropertyValue( sVisibleArea, aAny );
3109 0 : }
3110 : }
3111 :
3112 0 : if( !mbMedia )
3113 : {
3114 : // in case we have a plugin object
3115 0 : if( maParams.getLength() )
3116 : {
3117 0 : aAny <<= maParams;
3118 0 : xProps->setPropertyValue( OUString( "PluginCommands" ), aAny );
3119 : }
3120 :
3121 0 : if( !maMimeType.isEmpty() )
3122 : {
3123 0 : aAny <<= maMimeType;
3124 0 : xProps->setPropertyValue( OUString( "PluginMimeType" ), aAny );
3125 : }
3126 :
3127 0 : if( !maHref.isEmpty() )
3128 : {
3129 0 : aAny <<= maHref;
3130 0 : xProps->setPropertyValue( OUString( "PluginURL" ), aAny );
3131 : }
3132 : }
3133 : else
3134 : {
3135 : // in case we have a media object
3136 0 : xProps->setPropertyValue(
3137 : OUString("MediaURL"),
3138 0 : uno::makeAny(maHref));
3139 :
3140 0 : for( sal_Int32 nParam = 0; nParam < maParams.getLength(); ++nParam )
3141 : {
3142 0 : const OUString& rName = maParams[ nParam ].Name;
3143 :
3144 0 : if( 0 == rName.compareToAscii( "Loop" ) )
3145 : {
3146 0 : OUString aValueStr;
3147 0 : maParams[ nParam ].Value >>= aValueStr;
3148 0 : xProps->setPropertyValue( OUString( "Loop" ),
3149 0 : uno::makeAny( static_cast< sal_Bool >( 0 == aValueStr.compareToAscii( "true" ) ) ) );
3150 : }
3151 0 : else if( 0 == rName.compareToAscii( "Mute" ) )
3152 : {
3153 0 : OUString aValueStr;
3154 0 : maParams[ nParam ].Value >>= aValueStr;
3155 0 : xProps->setPropertyValue( OUString( "Mute" ),
3156 0 : uno::makeAny( static_cast< sal_Bool >( 0 == aValueStr.compareToAscii( "true" ) ) ) );
3157 : }
3158 0 : else if( 0 == rName.compareToAscii( "VolumeDB" ) )
3159 : {
3160 0 : OUString aValueStr;
3161 0 : maParams[ nParam ].Value >>= aValueStr;
3162 0 : xProps->setPropertyValue( OUString( "VolumeDB" ),
3163 0 : uno::makeAny( static_cast< sal_Int16 >( aValueStr.toInt32() ) ) );
3164 : }
3165 0 : else if( 0 == rName.compareToAscii( "Zoom" ) )
3166 : {
3167 0 : OUString aZoomStr;
3168 : media::ZoomLevel eZoomLevel;
3169 :
3170 0 : maParams[ nParam ].Value >>= aZoomStr;
3171 :
3172 0 : if( 0 == aZoomStr.compareToAscii( "25%" ) )
3173 0 : eZoomLevel = media::ZoomLevel_ZOOM_1_TO_4;
3174 0 : else if( 0 == aZoomStr.compareToAscii( "50%" ) )
3175 0 : eZoomLevel = media::ZoomLevel_ZOOM_1_TO_2;
3176 0 : else if( 0 == aZoomStr.compareToAscii( "100%" ) )
3177 0 : eZoomLevel = media::ZoomLevel_ORIGINAL;
3178 0 : else if( 0 == aZoomStr.compareToAscii( "200%" ) )
3179 0 : eZoomLevel = media::ZoomLevel_ZOOM_2_TO_1;
3180 0 : else if( 0 == aZoomStr.compareToAscii( "400%" ) )
3181 0 : eZoomLevel = media::ZoomLevel_ZOOM_4_TO_1;
3182 0 : else if( 0 == aZoomStr.compareToAscii( "fit" ) )
3183 0 : eZoomLevel = media::ZoomLevel_FIT_TO_WINDOW;
3184 0 : else if( 0 == aZoomStr.compareToAscii( "fixedfit" ) )
3185 0 : eZoomLevel = media::ZoomLevel_FIT_TO_WINDOW_FIXED_ASPECT;
3186 0 : else if( 0 == aZoomStr.compareToAscii( "fullscreen" ) )
3187 0 : eZoomLevel = media::ZoomLevel_FULLSCREEN;
3188 : else
3189 0 : eZoomLevel = media::ZoomLevel_NOT_AVAILABLE;
3190 :
3191 0 : xProps->setPropertyValue( OUString( "Zoom" ), uno::makeAny( eZoomLevel ) );
3192 : }
3193 : }
3194 : }
3195 :
3196 0 : SetThumbnail();
3197 : }
3198 :
3199 0 : SdXMLShapeContext::EndElement();
3200 0 : }
3201 :
3202 0 : SvXMLImportContext * SdXMLPluginShapeContext::CreateChildContext( sal_uInt16 p_nPrefix, const ::rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
3203 : {
3204 0 : if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_PARAM ) )
3205 : {
3206 0 : OUString aParamName, aParamValue;
3207 0 : const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
3208 : // now parse the attribute list and look for draw:name and draw:value
3209 0 : for(sal_Int16 a(0); a < nAttrCount; a++)
3210 : {
3211 0 : const OUString& rAttrName = xAttrList->getNameByIndex(a);
3212 0 : OUString aLocalName;
3213 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName);
3214 0 : const OUString aValue( xAttrList->getValueByIndex(a) );
3215 :
3216 0 : if( nPrefix == XML_NAMESPACE_DRAW )
3217 : {
3218 0 : if( IsXMLToken( aLocalName, XML_NAME ) )
3219 : {
3220 0 : aParamName = aValue;
3221 : }
3222 0 : else if( IsXMLToken( aLocalName, XML_VALUE ) )
3223 : {
3224 0 : aParamValue = aValue;
3225 : }
3226 : }
3227 :
3228 0 : if( !aParamName.isEmpty() )
3229 : {
3230 0 : sal_Int32 nIndex = maParams.getLength();
3231 0 : maParams.realloc( nIndex + 1 );
3232 0 : maParams[nIndex].Name = aParamName;
3233 0 : maParams[nIndex].Handle = -1;
3234 0 : maParams[nIndex].Value <<= aParamValue;
3235 0 : maParams[nIndex].State = beans::PropertyState_DIRECT_VALUE;
3236 : }
3237 0 : }
3238 :
3239 0 : return new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
3240 : }
3241 :
3242 0 : return SdXMLShapeContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList );
3243 : }
3244 :
3245 : //////////////////////////////////////////////////////////////////////////////
3246 :
3247 0 : TYPEINIT1( SdXMLFloatingFrameShapeContext, SdXMLShapeContext );
3248 :
3249 0 : SdXMLFloatingFrameShapeContext::SdXMLFloatingFrameShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
3250 : const rtl::OUString& rLocalName,
3251 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3252 : com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
3253 : sal_Bool bTemporaryShape)
3254 0 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
3255 : {
3256 0 : }
3257 :
3258 0 : SdXMLFloatingFrameShapeContext::~SdXMLFloatingFrameShapeContext()
3259 : {
3260 0 : }
3261 :
3262 0 : void SdXMLFloatingFrameShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
3263 : {
3264 0 : const char* pService = "com.sun.star.drawing.FrameShape";
3265 0 : AddShape( pService );
3266 :
3267 0 : if( mxShape.is() )
3268 : {
3269 0 : SetLayer();
3270 :
3271 : // set pos, size, shear and rotate
3272 0 : SetTransformation();
3273 :
3274 0 : uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3275 0 : if( xProps.is() )
3276 : {
3277 0 : uno::Any aAny;
3278 :
3279 0 : if( !maFrameName.isEmpty() )
3280 : {
3281 0 : aAny <<= maFrameName;
3282 0 : xProps->setPropertyValue( OUString( "FrameName" ), aAny );
3283 : }
3284 :
3285 0 : if( !maHref.isEmpty() )
3286 : {
3287 0 : aAny <<= maHref;
3288 0 : xProps->setPropertyValue( OUString( "FrameURL" ), aAny );
3289 0 : }
3290 : }
3291 :
3292 0 : SetStyle();
3293 :
3294 0 : GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
3295 : }
3296 0 : }
3297 :
3298 : // this is called from the parent group for each unparsed attribute in the attribute list
3299 0 : void SdXMLFloatingFrameShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3300 : {
3301 0 : switch( nPrefix )
3302 : {
3303 : case XML_NAMESPACE_DRAW:
3304 0 : if( IsXMLToken( rLocalName, XML_FRAME_NAME ) )
3305 : {
3306 0 : maFrameName = rValue;
3307 0 : return;
3308 : }
3309 0 : break;
3310 : case XML_NAMESPACE_XLINK:
3311 0 : if( IsXMLToken( rLocalName, XML_HREF ) )
3312 : {
3313 0 : maHref = GetImport().GetAbsoluteReference(rValue);
3314 0 : return;
3315 : }
3316 0 : break;
3317 : }
3318 :
3319 0 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3320 : }
3321 :
3322 0 : void SdXMLFloatingFrameShapeContext::EndElement()
3323 : {
3324 0 : uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3325 :
3326 0 : if( xProps.is() )
3327 : {
3328 0 : if ( maSize.Width && maSize.Height )
3329 : {
3330 : // the visual area for a floating frame must be set on loading
3331 0 : awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height );
3332 0 : uno::Any aAny;
3333 0 : aAny <<= aRect;
3334 0 : xProps->setPropertyValue( OUString( "VisibleArea" ), aAny );
3335 : }
3336 : }
3337 :
3338 0 : SetThumbnail();
3339 0 : SdXMLShapeContext::EndElement();
3340 0 : }
3341 :
3342 : //////////////////////////////////////////////////////////////////////////////
3343 :
3344 0 : TYPEINIT1( SdXMLFrameShapeContext, SdXMLShapeContext );
3345 :
3346 36 : SdXMLFrameShapeContext::SdXMLFrameShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
3347 : const rtl::OUString& rLocalName,
3348 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3349 : com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
3350 : sal_Bool bTemporaryShape)
3351 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
3352 : multiImageImportHelper(),
3353 : mbSupportsReplacement( sal_False ),
3354 : mxImplContext(),
3355 36 : mxReplImplContext()
3356 : {
3357 36 : uno::Reference < util::XCloneable > xClone( xAttrList, uno::UNO_QUERY );
3358 36 : if( xClone.is() )
3359 36 : mxAttrList.set( xClone->createClone(), uno::UNO_QUERY );
3360 : else
3361 0 : mxAttrList = new SvXMLAttributeList( xAttrList );
3362 :
3363 36 : }
3364 :
3365 72 : SdXMLFrameShapeContext::~SdXMLFrameShapeContext()
3366 : {
3367 72 : }
3368 :
3369 0 : void SdXMLFrameShapeContext::removeGraphicFromImportContext(const SvXMLImportContext& rContext) const
3370 : {
3371 0 : const SdXMLGraphicObjectShapeContext* pSdXMLGraphicObjectShapeContext = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(&rContext);
3372 :
3373 0 : if(pSdXMLGraphicObjectShapeContext)
3374 : {
3375 : try
3376 : {
3377 0 : uno::Reference< container::XChild > xChild(pSdXMLGraphicObjectShapeContext->getShape(), uno::UNO_QUERY_THROW);
3378 :
3379 0 : if(xChild.is())
3380 : {
3381 0 : uno::Reference< drawing::XShapes > xParent(xChild->getParent(), uno::UNO_QUERY_THROW);
3382 :
3383 0 : if(xParent.is())
3384 : {
3385 : // remove from parent
3386 0 : xParent->remove(pSdXMLGraphicObjectShapeContext->getShape());
3387 :
3388 : // dispose
3389 0 : uno::Reference< lang::XComponent > xComp(pSdXMLGraphicObjectShapeContext->getShape(), UNO_QUERY);
3390 :
3391 0 : if(xComp.is())
3392 : {
3393 0 : xComp->dispose();
3394 0 : }
3395 0 : }
3396 0 : }
3397 : }
3398 0 : catch( uno::Exception& )
3399 : {
3400 : OSL_FAIL( "Error in cleanup of multiple graphic object import (!)" );
3401 : }
3402 : }
3403 0 : }
3404 :
3405 0 : rtl::OUString SdXMLFrameShapeContext::getGraphicURLFromImportContext(const SvXMLImportContext& rContext) const
3406 : {
3407 0 : rtl::OUString aRetval;
3408 0 : const SdXMLGraphicObjectShapeContext* pSdXMLGraphicObjectShapeContext = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(&rContext);
3409 :
3410 0 : if(pSdXMLGraphicObjectShapeContext)
3411 : {
3412 : try
3413 : {
3414 0 : const uno::Reference< beans::XPropertySet > xPropSet(pSdXMLGraphicObjectShapeContext->getShape(), uno::UNO_QUERY_THROW);
3415 :
3416 0 : if(xPropSet.is())
3417 : {
3418 0 : xPropSet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL"))) >>= aRetval;
3419 :
3420 0 : if(!aRetval.getLength())
3421 : {
3422 : // it maybe a link, try GraphicURL
3423 0 : xPropSet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL"))) >>= aRetval;
3424 : }
3425 0 : }
3426 : }
3427 0 : catch( uno::Exception& )
3428 : {
3429 : OSL_FAIL( "Error in cleanup of multiple graphic object import (!)" );
3430 : }
3431 : }
3432 :
3433 0 : return aRetval;
3434 : }
3435 :
3436 42 : SvXMLImportContext *SdXMLFrameShapeContext::CreateChildContext( sal_uInt16 nPrefix,
3437 : const OUString& rLocalName,
3438 : const uno::Reference< xml::sax::XAttributeList>& xAttrList )
3439 : {
3440 42 : SvXMLImportContext * pContext = 0;
3441 :
3442 42 : if( !mxImplContext.Is() )
3443 : {
3444 :
3445 36 : SvXMLShapeContext* pShapeContext= GetImport().GetShapeImport()->CreateFrameChildContext(
3446 72 : GetImport(), nPrefix, rLocalName, xAttrList, mxShapes, mxAttrList );
3447 :
3448 36 : pContext = pShapeContext;
3449 :
3450 : // propagate the hyperlink to child context
3451 36 : if ( !msHyperlink.isEmpty() )
3452 0 : pShapeContext->setHyperlink( msHyperlink );
3453 :
3454 36 : mxImplContext = pContext;
3455 36 : mbSupportsReplacement = IsXMLToken(rLocalName, XML_OBJECT ) || IsXMLToken(rLocalName, XML_OBJECT_OLE);
3456 36 : setSupportsMultipleContents(IsXMLToken(rLocalName, XML_IMAGE));
3457 :
3458 36 : if(getSupportsMultipleContents() && dynamic_cast< SdXMLGraphicObjectShapeContext* >(pContext))
3459 : {
3460 3 : addContent(*mxImplContext);
3461 : }
3462 : }
3463 6 : else if(getSupportsMultipleContents() && XML_NAMESPACE_DRAW == nPrefix && IsXMLToken(rLocalName, XML_IMAGE))
3464 : {
3465 : // read another image
3466 0 : pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
3467 0 : GetImport(), nPrefix, rLocalName, xAttrList, mxShapes, mxAttrList);
3468 0 : mxImplContext = pContext;
3469 :
3470 0 : if(dynamic_cast< SdXMLGraphicObjectShapeContext* >(pContext))
3471 : {
3472 0 : addContent(*mxImplContext);
3473 : }
3474 : }
3475 10 : else if( mbSupportsReplacement && !mxReplImplContext &&
3476 : XML_NAMESPACE_DRAW == nPrefix &&
3477 4 : IsXMLToken( rLocalName, XML_IMAGE ) )
3478 : {
3479 : // read replacement image
3480 4 : SvXMLImportContext *pImplContext = &mxImplContext;
3481 : SdXMLShapeContext *pSContext =
3482 4 : PTR_CAST( SdXMLShapeContext, pImplContext );
3483 4 : if( pSContext )
3484 : {
3485 : uno::Reference < beans::XPropertySet > xPropSet(
3486 4 : pSContext->getShape(), uno::UNO_QUERY );
3487 4 : if( xPropSet.is() )
3488 : {
3489 4 : pContext = new XMLReplacementImageContext( GetImport(),
3490 4 : nPrefix, rLocalName, xAttrList, xPropSet );
3491 4 : mxReplImplContext = pContext;
3492 4 : }
3493 : }
3494 : }
3495 6 : else if(
3496 : ( nPrefix == XML_NAMESPACE_SVG && // #i68101#
3497 0 : (IsXMLToken( rLocalName, XML_TITLE ) || IsXMLToken( rLocalName, XML_DESC ) ) ) ||
3498 0 : (nPrefix == XML_NAMESPACE_OFFICE && IsXMLToken( rLocalName, XML_EVENT_LISTENERS ) ) ||
3499 2 : (nPrefix == XML_NAMESPACE_DRAW && (IsXMLToken( rLocalName, XML_GLUE_POINT ) ||
3500 2 : IsXMLToken( rLocalName, XML_THUMBNAIL ) ) ) )
3501 : {
3502 0 : SvXMLImportContext *pImplContext = &mxImplContext;
3503 0 : pContext = PTR_CAST( SdXMLShapeContext, pImplContext )->CreateChildContext( nPrefix,
3504 0 : rLocalName, xAttrList );
3505 : }
3506 2 : else if ( (XML_NAMESPACE_DRAW == nPrefix) && IsXMLToken( rLocalName, XML_IMAGE_MAP ) )
3507 : {
3508 0 : SdXMLShapeContext *pSContext = dynamic_cast< SdXMLShapeContext* >( &mxImplContext );
3509 0 : if( pSContext )
3510 : {
3511 0 : uno::Reference < beans::XPropertySet > xPropSet( pSContext->getShape(), uno::UNO_QUERY );
3512 0 : if (xPropSet.is())
3513 : {
3514 0 : pContext = new XMLImageMapContext(GetImport(), nPrefix, rLocalName, xPropSet);
3515 0 : }
3516 : }
3517 : }
3518 :
3519 : // call parent for content
3520 42 : if(!pContext)
3521 2 : pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList );
3522 :
3523 42 : return pContext;
3524 : }
3525 :
3526 36 : void SdXMLFrameShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
3527 : {
3528 : // ignore
3529 36 : }
3530 :
3531 36 : void SdXMLFrameShapeContext::EndElement()
3532 : {
3533 : /// solve if multiple image child contexts were imported
3534 36 : solveMultipleImages();
3535 :
3536 36 : if( !mxImplContext.Is() )
3537 : {
3538 : // now check if this is an empty presentation object
3539 0 : sal_Int16 nAttrCount = mxAttrList.is() ? mxAttrList->getLength() : 0;
3540 0 : for(sal_Int16 a(0); a < nAttrCount; a++)
3541 : {
3542 0 : OUString aLocalName;
3543 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(mxAttrList->getNameByIndex(a), &aLocalName);
3544 :
3545 0 : if( nPrefix == XML_NAMESPACE_PRESENTATION )
3546 : {
3547 0 : if( IsXMLToken( aLocalName, XML_PLACEHOLDER ) )
3548 : {
3549 0 : mbIsPlaceholder = IsXMLToken( mxAttrList->getValueByIndex(a), XML_TRUE );
3550 : }
3551 0 : else if( IsXMLToken( aLocalName, XML_CLASS ) )
3552 : {
3553 0 : maPresentationClass = mxAttrList->getValueByIndex(a);
3554 : }
3555 : }
3556 0 : }
3557 :
3558 0 : if( (!maPresentationClass.isEmpty()) && mbIsPlaceholder )
3559 : {
3560 0 : uno::Reference< xml::sax::XAttributeList> xEmpty;
3561 :
3562 0 : enum XMLTokenEnum eToken = XML_TEXT_BOX;
3563 :
3564 0 : if( IsXMLToken( maPresentationClass, XML_GRAPHIC ) )
3565 : {
3566 0 : eToken = XML_IMAGE;
3567 :
3568 : }
3569 0 : else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_PAGE ) )
3570 : {
3571 0 : eToken = XML_PAGE_THUMBNAIL;
3572 : }
3573 0 : else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_CHART ) ||
3574 0 : IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) ||
3575 0 : IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) )
3576 : {
3577 0 : eToken = XML_OBJECT;
3578 : }
3579 :
3580 0 : mxImplContext = GetImport().GetShapeImport()->CreateFrameChildContext(
3581 0 : GetImport(), XML_NAMESPACE_DRAW, GetXMLToken( eToken ), mxAttrList, mxShapes, xEmpty );
3582 :
3583 0 : if( mxImplContext.Is() )
3584 : {
3585 0 : mxImplContext->StartElement( mxAttrList );
3586 0 : mxImplContext->EndElement();
3587 0 : }
3588 : }
3589 : }
3590 :
3591 36 : mxImplContext = 0;
3592 36 : SdXMLShapeContext::EndElement();
3593 36 : }
3594 :
3595 269 : void SdXMLFrameShapeContext::processAttribute( sal_uInt16,
3596 : const ::rtl::OUString&, const ::rtl::OUString& )
3597 : {
3598 : // ignore
3599 269 : }
3600 :
3601 0 : TYPEINIT1( SdXMLCustomShapeContext, SdXMLShapeContext );
3602 :
3603 62 : SdXMLCustomShapeContext::SdXMLCustomShapeContext(
3604 : SvXMLImport& rImport,
3605 : sal_uInt16 nPrfx,
3606 : const OUString& rLocalName,
3607 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3608 : uno::Reference< drawing::XShapes >& rShapes,
3609 : sal_Bool bTemporaryShape)
3610 62 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
3611 : {
3612 62 : }
3613 :
3614 : //////////////////////////////////////////////////////////////////////////////
3615 :
3616 124 : SdXMLCustomShapeContext::~SdXMLCustomShapeContext()
3617 : {
3618 124 : }
3619 :
3620 : //////////////////////////////////////////////////////////////////////////////
3621 :
3622 : // this is called from the parent group for each unparsed attribute in the attribute list
3623 432 : void SdXMLCustomShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3624 : {
3625 432 : if( XML_NAMESPACE_DRAW == nPrefix )
3626 : {
3627 183 : if( IsXMLToken( rLocalName, XML_ENGINE ) )
3628 : {
3629 0 : maCustomShapeEngine = rValue;
3630 0 : return;
3631 : }
3632 183 : if ( IsXMLToken( rLocalName, XML_DATA ) )
3633 : {
3634 0 : maCustomShapeData = rValue;
3635 0 : return;
3636 : }
3637 : }
3638 432 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3639 : }
3640 :
3641 : //////////////////////////////////////////////////////////////////////////////
3642 :
3643 62 : void SdXMLCustomShapeContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
3644 : {
3645 : // create rectangle shape
3646 62 : AddShape("com.sun.star.drawing.CustomShape");
3647 62 : if ( mxShape.is() )
3648 : {
3649 : // Add, set Style and properties from base shape
3650 62 : SetStyle();
3651 62 : SetLayer();
3652 :
3653 : // set pos, size, shear and rotate
3654 62 : SetTransformation();
3655 :
3656 : try
3657 : {
3658 62 : uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY );
3659 62 : if( xPropSet.is() )
3660 : {
3661 62 : if ( !maCustomShapeEngine.isEmpty() )
3662 : {
3663 0 : uno::Any aAny;
3664 0 : aAny <<= maCustomShapeEngine;
3665 0 : xPropSet->setPropertyValue( EASGet( EAS_CustomShapeEngine ), aAny );
3666 : }
3667 62 : if ( !maCustomShapeData.isEmpty() )
3668 : {
3669 0 : uno::Any aAny;
3670 0 : aAny <<= maCustomShapeData;
3671 0 : xPropSet->setPropertyValue( EASGet( EAS_CustomShapeData ), aAny );
3672 : }
3673 62 : }
3674 : }
3675 0 : catch(const uno::Exception&)
3676 : {
3677 : OSL_FAIL( "could not set enhanced customshape geometry" );
3678 : }
3679 62 : SdXMLShapeContext::StartElement(xAttrList);
3680 : }
3681 62 : }
3682 :
3683 62 : void SdXMLCustomShapeContext::EndElement()
3684 : {
3685 62 : if ( !maCustomShapeGeometry.empty() )
3686 : {
3687 62 : const rtl::OUString sCustomShapeGeometry ( "CustomShapeGeometry" );
3688 :
3689 : // converting the vector to a sequence
3690 62 : uno::Sequence< beans::PropertyValue > aSeq( maCustomShapeGeometry.size() );
3691 62 : beans::PropertyValue* pValues = aSeq.getArray();
3692 62 : std::vector< beans::PropertyValue >::const_iterator aIter( maCustomShapeGeometry.begin() );
3693 62 : std::vector< beans::PropertyValue >::const_iterator aEnd( maCustomShapeGeometry.end() );
3694 444 : while ( aIter != aEnd )
3695 320 : *pValues++ = *aIter++;
3696 :
3697 : try
3698 : {
3699 62 : uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY );
3700 62 : if( xPropSet.is() )
3701 : {
3702 62 : uno::Any aAny;
3703 62 : aAny <<= aSeq;
3704 62 : xPropSet->setPropertyValue( sCustomShapeGeometry, aAny );
3705 62 : }
3706 : }
3707 0 : catch(const uno::Exception&)
3708 : {
3709 : OSL_FAIL( "could not set enhanced customshape geometry" );
3710 : }
3711 :
3712 62 : sal_Int32 nUPD( 0 );
3713 62 : sal_Int32 nBuild( 0 );
3714 62 : GetImport().getBuildIds( nUPD, nBuild );
3715 62 : if( ((nUPD >= 640 && nUPD <= 645) || (nUPD == 680)) && (nBuild <= 9221) )
3716 : {
3717 0 : Reference< drawing::XEnhancedCustomShapeDefaulter > xDefaulter( mxShape, UNO_QUERY );
3718 0 : if( xDefaulter.is() )
3719 : {
3720 0 : rtl::OUString aEmptyType;
3721 0 : xDefaulter->createCustomShapeDefaults( aEmptyType );
3722 0 : }
3723 62 : }
3724 : }
3725 :
3726 62 : SdXMLShapeContext::EndElement();
3727 62 : }
3728 :
3729 : //////////////////////////////////////////////////////////////////////////////
3730 :
3731 124 : SvXMLImportContext* SdXMLCustomShapeContext::CreateChildContext(
3732 : sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
3733 : const uno::Reference<xml::sax::XAttributeList>& xAttrList )
3734 : {
3735 124 : SvXMLImportContext* pContext = NULL;
3736 124 : if ( XML_NAMESPACE_DRAW == nPrefix )
3737 : {
3738 62 : if ( IsXMLToken( rLocalName, XML_ENHANCED_GEOMETRY ) )
3739 : {
3740 62 : uno::Reference< beans::XPropertySet > xPropSet( mxShape,uno::UNO_QUERY );
3741 62 : if ( xPropSet.is() )
3742 62 : pContext = new XMLEnhancedCustomShapeContext( GetImport(), mxShape, nPrefix, rLocalName, maCustomShapeGeometry );
3743 : }
3744 : }
3745 : // delegate to parent class if no context could be created
3746 124 : if ( NULL == pContext )
3747 : pContext = SdXMLShapeContext::CreateChildContext( nPrefix, rLocalName,
3748 62 : xAttrList);
3749 124 : return pContext;
3750 : }
3751 :
3752 : ///////////////////////////////////////////////////////////////////////
3753 :
3754 : //////////////////////////////////////////////////////////////////////////////
3755 :
3756 0 : TYPEINIT1( SdXMLTableShapeContext, SdXMLShapeContext );
3757 :
3758 2 : SdXMLTableShapeContext::SdXMLTableShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes )
3759 2 : : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, sal_False )
3760 : {
3761 2 : memset( &maTemplateStylesUsed, 0, sizeof( maTemplateStylesUsed ) );
3762 2 : }
3763 :
3764 4 : SdXMLTableShapeContext::~SdXMLTableShapeContext()
3765 : {
3766 4 : }
3767 :
3768 2 : void SdXMLTableShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
3769 : {
3770 2 : const char* pService = "com.sun.star.drawing.TableShape";
3771 :
3772 2 : sal_Bool bIsPresShape = !maPresentationClass.isEmpty() && GetImport().GetShapeImport()->IsPresentationShapesSupported();
3773 2 : if( bIsPresShape )
3774 : {
3775 0 : if( IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) )
3776 : {
3777 0 : pService = "com.sun.star.presentation.TableShape";
3778 : }
3779 : }
3780 :
3781 2 : AddShape( pService );
3782 :
3783 2 : if( mxShape.is() )
3784 : {
3785 2 : SetLayer();
3786 :
3787 2 : uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
3788 :
3789 2 : if(bIsPresShape)
3790 : {
3791 0 : if(xProps.is())
3792 : {
3793 0 : uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
3794 0 : if( xPropsInfo.is() )
3795 : {
3796 0 : if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString("IsEmptyPresentationObject" )))
3797 0 : xProps->setPropertyValue( OUString("IsEmptyPresentationObject" ), ::cppu::bool2any( sal_False ) );
3798 :
3799 0 : if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString("IsPlaceholderDependent" )))
3800 0 : xProps->setPropertyValue( OUString("IsPlaceholderDependent" ), ::cppu::bool2any( sal_False ) );
3801 0 : }
3802 : }
3803 : }
3804 :
3805 2 : SetStyle();
3806 :
3807 2 : if( xProps.is() )
3808 : {
3809 2 : if( !msTemplateStyleName.isEmpty() ) try
3810 : {
3811 2 : Reference< XStyleFamiliesSupplier > xFamiliesSupp( GetImport().GetModel(), UNO_QUERY_THROW );
3812 2 : Reference< XNameAccess > xFamilies( xFamiliesSupp->getStyleFamilies() );
3813 2 : const OUString sFamilyName( "table" );
3814 2 : Reference< XNameAccess > xTableFamily( xFamilies->getByName( sFamilyName ), UNO_QUERY_THROW );
3815 2 : Reference< XStyle > xTableStyle( xTableFamily->getByName( msTemplateStyleName ), UNO_QUERY_THROW );
3816 2 : xProps->setPropertyValue( OUString( "TableTemplate" ), Any( xTableStyle ) );
3817 : }
3818 0 : catch(const Exception&)
3819 : {
3820 : OSL_FAIL("SdXMLTableShapeContext::StartElement(), exception caught!");
3821 : }
3822 :
3823 2 : const XMLPropertyMapEntry* pEntry = &aXMLTableShapeAttributes[0];
3824 14 : for( int i = 0; pEntry->msApiName && (i < 6); i++, pEntry++ )
3825 : {
3826 : try
3827 : {
3828 12 : const OUString sAPIPropertyName( OUString(pEntry->msApiName, pEntry->nApiNameLength, RTL_TEXTENCODING_ASCII_US ) );
3829 12 : xProps->setPropertyValue( sAPIPropertyName, Any( maTemplateStylesUsed[i] ) );
3830 : }
3831 0 : catch(const Exception&)
3832 : {
3833 : OSL_FAIL("SdXMLTableShapeContext::StartElement(), exception caught!");
3834 : }
3835 : }
3836 : }
3837 :
3838 2 : GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
3839 :
3840 2 : const rtl::Reference< XMLTableImport >& xTableImport( GetImport().GetShapeImport()->GetShapeTableImport() );
3841 2 : if( xTableImport.is() && xProps.is() )
3842 : {
3843 : uno::Reference< table::XColumnRowRange > xColumnRowRange(
3844 2 : xProps->getPropertyValue( OUString("Model" ) ), uno::UNO_QUERY );
3845 :
3846 2 : if( xColumnRowRange.is() )
3847 2 : mxTableImportContext = xTableImport->CreateTableContext( GetPrefix(), GetLocalName(), xColumnRowRange );
3848 :
3849 2 : if( mxTableImportContext.Is() )
3850 2 : mxTableImportContext->StartElement( xAttrList );
3851 2 : }
3852 : }
3853 2 : }
3854 :
3855 2 : void SdXMLTableShapeContext::EndElement()
3856 : {
3857 2 : if( mxTableImportContext.Is() )
3858 2 : mxTableImportContext->EndElement();
3859 :
3860 2 : SdXMLShapeContext::EndElement();
3861 :
3862 2 : if( mxShape.is() )
3863 : {
3864 : // set pos, size, shear and rotate
3865 2 : SetTransformation();
3866 : }
3867 2 : }
3868 :
3869 : // this is called from the parent group for each unparsed attribute in the attribute list
3870 18 : void SdXMLTableShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3871 : {
3872 18 : if( nPrefix == XML_NAMESPACE_TABLE )
3873 : {
3874 6 : if( IsXMLToken( rLocalName, XML_TEMPLATE_NAME ) )
3875 : {
3876 2 : msTemplateStyleName = rValue;
3877 : }
3878 : else
3879 : {
3880 4 : int i = 0;
3881 4 : const XMLPropertyMapEntry* pEntry = &aXMLTableShapeAttributes[0];
3882 16 : while( pEntry->msApiName && (i < 6) )
3883 : {
3884 12 : if( IsXMLToken( rLocalName, pEntry->meXMLName ) )
3885 : {
3886 4 : if( IsXMLToken( rValue, XML_TRUE ) )
3887 4 : maTemplateStylesUsed[i] = sal_True;
3888 4 : break;
3889 : }
3890 8 : pEntry++;
3891 8 : i++;
3892 : }
3893 : }
3894 : }
3895 18 : SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3896 18 : }
3897 :
3898 18 : SvXMLImportContext* SdXMLTableShapeContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const uno::Reference<xml::sax::XAttributeList>& xAttrList )
3899 : {
3900 18 : if( mxTableImportContext.Is() && (nPrefix == XML_NAMESPACE_TABLE) )
3901 18 : return mxTableImportContext->CreateChildContext(nPrefix, rLocalName, xAttrList);
3902 : else
3903 0 : return SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName, xAttrList);
3904 : }
3905 :
3906 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|