Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*************************************************************************
3 : *
4 : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : *
6 : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : *
8 : * OpenOffice.org - a multi-platform office productivity suite
9 : *
10 : * This file is part of OpenOffice.org.
11 : *
12 : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : * it under the terms of the GNU Lesser General Public License version 3
14 : * only, as published by the Free Software Foundation.
15 : *
16 : * OpenOffice.org is distributed in the hope that it will be useful,
17 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : * GNU Lesser General Public License version 3 for more details
20 : * (a copy is included in the LICENSE file that accompanied this code).
21 : *
22 : * You should have received a copy of the GNU Lesser General Public License
23 : * version 3 along with OpenOffice.org. If not, see
24 : * <http://www.openoffice.org/license.html>
25 : * for a copy of the LGPLv3 License.
26 : *
27 : ************************************************************************/
28 :
29 :
30 : // must be first
31 : #include <canvas/debug.hxx>
32 : #include <vcl/cvtgrf.hxx>
33 : #include <tools/urlobj.hxx>
34 : #include <tools/stream.hxx>
35 : #include <svtools/grfmgr.hxx>
36 : #include <unotools/ucbstreamhelper.hxx>
37 : #include <unotools/streamwrap.hxx>
38 : #include <basegfx/point/b2dpoint.hxx>
39 : #include <basegfx/polygon/b2dpolygon.hxx>
40 : #include <cppcanvas/basegfxfactory.hxx>
41 : #include <cppcanvas/polypolygon.hxx>
42 : #include <com/sun/star/awt/Rectangle.hpp>
43 : #include <com/sun/star/drawing/ColorMode.hpp>
44 : #include <com/sun/star/text/GraphicCrop.hpp>
45 : #include <com/sun/star/container/XNameContainer.hpp>
46 : #include <com/sun/star/drawing/PointSequenceSequence.hpp>
47 : #include <com/sun/star/drawing/PointSequence.hpp>
48 : #include <com/sun/star/lang/XMultiComponentFactory.hpp>
49 : #include <com/sun/star/drawing/XLayerSupplier.hpp>
50 : #include <com/sun/star/drawing/XLayerManager.hpp>
51 : #include <com/sun/star/container/XNameAccess.hpp>
52 : #include <com/sun/star/lang/XComponent.hpp>
53 : #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
54 :
55 : #include "drawshapesubsetting.hxx"
56 : #include "drawshape.hxx"
57 : #include "backgroundshape.hxx"
58 : #include "mediashape.hxx"
59 : #include "appletshape.hxx"
60 : #include "shapeimporter.hxx"
61 : #include "slideshowexceptions.hxx"
62 : #include "gdimtftools.hxx"
63 : #include "tools.hxx"
64 : #include "slideshowcontext.hxx"
65 :
66 : #include <boost/shared_ptr.hpp>
67 : #include <boost/scoped_ptr.hpp>
68 :
69 : using namespace com::sun::star;
70 :
71 : namespace slideshow {
72 : namespace internal {
73 :
74 : namespace {
75 :
76 0 : bool importShapeGraphic(
77 : GraphicObject & o_rGraphic,
78 : uno::Reference<beans::XPropertySet> const& xPropSet )
79 : {
80 0 : rtl::OUString aURL;
81 0 : if( !getPropertyValue( aURL, xPropSet, OUSTR("GraphicURL")) ||
82 0 : aURL.isEmpty() )
83 : {
84 : // no or empty property - cannot import shape graphic
85 0 : return false;
86 : }
87 :
88 : rtl::OUString const aVndUrl(
89 0 : "vnd.sun.star.GraphicObject:" );
90 0 : sal_Int32 nIndex( aURL.indexOf( aVndUrl ) );
91 :
92 0 : if(nIndex != -1)
93 : {
94 : // skip past the end of the "vnd..." prefix
95 0 : nIndex += aVndUrl.getLength();
96 :
97 0 : if(nIndex >= aURL.getLength())
98 : {
99 : OSL_FAIL( "ShapeImporter::importShape(): "
100 : "embedded graphic has no graphic ID" );
101 0 : return false;
102 : }
103 :
104 : // unique ID string found in URL, extract
105 : // to separate string
106 : rtl::OUString const aUniqueId(
107 0 : aURL.copy( nIndex, aURL.getLength() - nIndex ) );
108 :
109 : // TODO(T2): Creating a GraphicObject is not
110 : // thread safe (internally calls VCL, and has
111 : // unguarded internal singleton mpGlobalMgr)
112 :
113 : // fetch already loaded graphic from graphic manager.
114 : rtl::OString const aOldString(rtl::OUStringToOString(aUniqueId,
115 0 : RTL_TEXTENCODING_UTF8));
116 0 : o_rGraphic = GraphicObject( aOldString );
117 :
118 :
119 0 : if( GRAPHIC_DEFAULT == o_rGraphic.GetType()
120 0 : || GRAPHIC_NONE == o_rGraphic.GetType() )
121 : {
122 : // even the GrfMgr does not seem to know this graphic
123 0 : return false;
124 0 : }
125 : }
126 : else
127 : {
128 : // no special string found, graphic must be
129 : // external. Load via GraphicIm porter
130 0 : INetURLObject aTmp( aURL );
131 : boost::scoped_ptr<SvStream> pGraphicStream(
132 : utl::UcbStreamHelper::CreateStream(
133 : aTmp.GetMainURL( INetURLObject::NO_DECODE ),
134 0 : STREAM_READ ) );
135 0 : if( !pGraphicStream )
136 : {
137 : OSL_FAIL( "ShapeImporter::importShape(): "
138 : "cannot create input stream for graphic" );
139 0 : return false;
140 : }
141 :
142 0 : Graphic aTmpGraphic;
143 0 : if( GraphicConverter::Import(
144 0 : *pGraphicStream, aTmpGraphic ) != ERRCODE_NONE )
145 : {
146 : OSL_FAIL( "ShapeImporter::importShape(): "
147 : "Failed to import shape graphic from given URL" );
148 0 : return false;
149 : }
150 :
151 0 : o_rGraphic = GraphicObject( aTmpGraphic );
152 : }
153 0 : return true;
154 : }
155 :
156 : /** This shape implementation just acts as a dummy for the layermanager.
157 : Its sole role is for hit test detection of group shapes.
158 : */
159 0 : class ShapeOfGroup : public Shape
160 : {
161 : public:
162 : ShapeOfGroup( ShapeSharedPtr const& pGroupShape,
163 : uno::Reference<drawing::XShape> const& xShape,
164 : uno::Reference<beans::XPropertySet> const& xPropSet,
165 : double nPrio );
166 :
167 : // Shape:
168 : virtual uno::Reference<drawing::XShape> getXShape() const;
169 : virtual void addViewLayer( ViewLayerSharedPtr const& pNewLayer,
170 : bool bRedrawLayer );
171 : virtual bool removeViewLayer( ViewLayerSharedPtr const& pNewLayer );
172 : virtual bool clearAllViewLayers();
173 : virtual bool update() const;
174 : virtual bool render() const;
175 : virtual bool isContentChanged() const;
176 : virtual basegfx::B2DRectangle getBounds() const;
177 : virtual basegfx::B2DRectangle getDomBounds() const;
178 : virtual basegfx::B2DRectangle getUpdateArea() const;
179 : virtual bool isVisible() const;
180 : virtual double getPriority() const;
181 : virtual bool isBackgroundDetached() const;
182 :
183 : private:
184 : ShapeSharedPtr const mpGroupShape;
185 : uno::Reference<drawing::XShape> const mxShape;
186 : double const mnPrio;
187 : basegfx::B2DPoint maPosOffset;
188 : double mnWidth;
189 : double mnHeight;
190 : };
191 :
192 0 : ShapeOfGroup::ShapeOfGroup( ShapeSharedPtr const& pGroupShape,
193 : uno::Reference<drawing::XShape> const& xShape,
194 : uno::Reference<beans::XPropertySet> const& xPropSet,
195 : double nPrio ) :
196 : mpGroupShape(pGroupShape),
197 : mxShape(xShape),
198 0 : mnPrio(nPrio)
199 : {
200 : // read bound rect
201 0 : uno::Any const aTmpRect_( xPropSet->getPropertyValue( OUSTR("BoundRect") ));
202 0 : awt::Rectangle const aTmpRect( aTmpRect_.get<awt::Rectangle>() );
203 0 : basegfx::B2DRectangle const groupPosSize( pGroupShape->getBounds() );
204 0 : maPosOffset = basegfx::B2DPoint( aTmpRect.X - groupPosSize.getMinX(),
205 0 : aTmpRect.Y - groupPosSize.getMinY() );
206 0 : mnWidth = aTmpRect.Width;
207 0 : mnHeight = aTmpRect.Height;
208 0 : }
209 :
210 0 : uno::Reference<drawing::XShape> ShapeOfGroup::getXShape() const
211 : {
212 0 : return mxShape;
213 : }
214 :
215 0 : void ShapeOfGroup::addViewLayer( ViewLayerSharedPtr const& /*pNewLayer*/,
216 : bool /*bRedrawLayer*/ )
217 : {
218 0 : }
219 :
220 0 : bool ShapeOfGroup::removeViewLayer( ViewLayerSharedPtr const& /*pNewLayer*/ )
221 : {
222 0 : return true;
223 : }
224 :
225 0 : bool ShapeOfGroup::clearAllViewLayers()
226 : {
227 0 : return true;
228 : }
229 :
230 0 : bool ShapeOfGroup::update() const
231 : {
232 0 : return true;
233 : }
234 :
235 0 : bool ShapeOfGroup::render() const
236 : {
237 0 : return true;
238 : }
239 :
240 0 : bool ShapeOfGroup::isContentChanged() const
241 : {
242 0 : return false;
243 : }
244 :
245 0 : basegfx::B2DRectangle ShapeOfGroup::getBounds() const
246 : {
247 0 : basegfx::B2DRectangle const groupPosSize( mpGroupShape->getBounds() );
248 0 : double const posX = (groupPosSize.getMinX() + maPosOffset.getX());
249 0 : double const posY = (groupPosSize.getMinY() + maPosOffset.getY());
250 0 : return basegfx::B2DRectangle( posX, posY, posX + mnWidth, posY + mnHeight );
251 : }
252 :
253 0 : basegfx::B2DRectangle ShapeOfGroup::getDomBounds() const
254 : {
255 0 : return getBounds();
256 : }
257 :
258 0 : basegfx::B2DRectangle ShapeOfGroup::getUpdateArea() const
259 : {
260 0 : return getBounds();
261 : }
262 :
263 0 : bool ShapeOfGroup::isVisible() const
264 : {
265 0 : return mpGroupShape->isVisible();
266 : }
267 :
268 0 : double ShapeOfGroup::getPriority() const
269 : {
270 0 : return mnPrio;
271 : }
272 :
273 0 : bool ShapeOfGroup::isBackgroundDetached() const
274 : {
275 0 : return false;
276 : }
277 :
278 : } // anon namespace
279 :
280 0 : ShapeSharedPtr ShapeImporter::createShape(
281 : uno::Reference<drawing::XShape> const& xCurrShape,
282 : uno::Reference<beans::XPropertySet> const& xPropSet,
283 : rtl::OUString const& shapeType ) const
284 : {
285 0 : if( shapeType == "com.sun.star.drawing.MediaShape" || shapeType == "com.sun.star.presentation.MediaShape" )
286 : {
287 : // Media shape (video etc.). This is a special object
288 : return createMediaShape(xCurrShape,
289 : mnAscendingPrio,
290 0 : mrContext);
291 : }
292 0 : else if( shapeType == "com.sun.star.drawing.PluginShape" )
293 : {
294 : // PropertyValues to copy from XShape to plugin
295 : static const char* aPropertyValues[] =
296 : {
297 : "PluginURL",
298 : "PluginMimeType",
299 : "PluginCommands"
300 : };
301 :
302 : // (Netscape)Plugin shape. This is a special object
303 : return createAppletShape( xCurrShape,
304 : mnAscendingPrio,
305 : ::rtl::OUString( "com.sun.star.comp.sfx2.PluginObject" ),
306 : aPropertyValues,
307 : SAL_N_ELEMENTS(aPropertyValues),
308 0 : mrContext );
309 : }
310 0 : else if( shapeType == "com.sun.star.drawing.AppletShape" )
311 : {
312 : // PropertyValues to copy from XShape to applet
313 : static const char* aPropertyValues[] =
314 : {
315 : "AppletCodeBase",
316 : "AppletName",
317 : "AppletCode",
318 : "AppletCommands",
319 : "AppletIsScript"
320 : };
321 :
322 : // (Java)Applet shape. This is a special object
323 : return createAppletShape( xCurrShape,
324 : mnAscendingPrio,
325 : ::rtl::OUString( "com.sun.star.comp.sfx2.AppletObject" ),
326 : aPropertyValues,
327 : SAL_N_ELEMENTS(aPropertyValues),
328 0 : mrContext );
329 : }
330 0 : else if( shapeType == "com.sun.star.drawing.OLE2Shape" || shapeType == "com.sun.star.presentation.OLE2Shape" )
331 : {
332 : // #i46224# Mark OLE shapes as foreign content - scan them for
333 : // unsupported actions, and fallback to bitmap, if necessary
334 : return DrawShape::create( xCurrShape,
335 : mxPage,
336 : mnAscendingPrio,
337 : true,
338 0 : mrContext );
339 : }
340 0 : else if( shapeType == "com.sun.star.drawing.GraphicObjectShape" || shapeType == "com.sun.star.presentation.GraphicObjectShape" )
341 : {
342 0 : GraphicObject aGraphicObject;
343 :
344 : // to get hold of GIF animations, inspect Graphic
345 : // objects more thoroughly (the plain-jane shape
346 : // metafile of course would only contain the first
347 : // animation frame)
348 0 : if( !importShapeGraphic( aGraphicObject, xPropSet ) )
349 0 : return ShapeSharedPtr(); // error loading graphic -
350 : // no placeholders in
351 : // slideshow
352 :
353 0 : if( !aGraphicObject.IsAnimated() )
354 : {
355 : // no animation - simply utilize plain draw shape import
356 :
357 : // import shape as bitmap - either its a bitmap
358 : // anyway, or its a metafile, which currently the
359 : // metafile renderer might not display correctly.
360 : return DrawShape::create( xCurrShape,
361 : mxPage,
362 : mnAscendingPrio,
363 : true,
364 0 : mrContext );
365 : }
366 :
367 :
368 : // now extract relevant shape attributes via API
369 : // ---------------------------------------------
370 :
371 0 : drawing::ColorMode eColorMode( drawing::ColorMode_STANDARD );
372 0 : sal_Int16 nLuminance(0);
373 0 : sal_Int16 nContrast(0);
374 0 : sal_Int16 nRed(0);
375 0 : sal_Int16 nGreen(0);
376 0 : sal_Int16 nBlue(0);
377 0 : double nGamma(1.0);
378 0 : sal_Int16 nTransparency(0);
379 0 : sal_Int32 nRotation(0);
380 :
381 0 : getPropertyValue( eColorMode, xPropSet, OUSTR("GraphicColorMode") );
382 0 : getPropertyValue( nLuminance, xPropSet, OUSTR("AdjustLuminance") );
383 0 : getPropertyValue( nContrast, xPropSet, OUSTR("AdjustContrast") );
384 0 : getPropertyValue( nRed, xPropSet, OUSTR("AdjustRed") );
385 0 : getPropertyValue( nGreen, xPropSet, OUSTR("AdjustGreen") );
386 0 : getPropertyValue( nBlue, xPropSet, OUSTR("AdjustBlue") );
387 0 : getPropertyValue( nGamma, xPropSet, OUSTR("Gamma") );
388 0 : getPropertyValue( nTransparency, xPropSet, OUSTR("Transparency") );
389 0 : getPropertyValue( nRotation, xPropSet, OUSTR("RotateAngle") );
390 :
391 0 : GraphicAttr aGraphAttrs;
392 0 : aGraphAttrs.SetDrawMode( (GraphicDrawMode)eColorMode );
393 0 : aGraphAttrs.SetLuminance( nLuminance );
394 0 : aGraphAttrs.SetContrast( nContrast );
395 0 : aGraphAttrs.SetChannelR( nRed );
396 0 : aGraphAttrs.SetChannelG( nGreen );
397 0 : aGraphAttrs.SetChannelB( nBlue );
398 0 : aGraphAttrs.SetGamma( nGamma );
399 0 : aGraphAttrs.SetTransparency( static_cast<sal_uInt8>(nTransparency) );
400 0 : aGraphAttrs.SetRotation( static_cast<sal_uInt16>(nRotation*10) );
401 :
402 0 : text::GraphicCrop aGraphCrop;
403 0 : if( getPropertyValue( aGraphCrop, xPropSet, OUSTR("GraphicCrop") ))
404 : {
405 : aGraphAttrs.SetCrop( aGraphCrop.Left,
406 : aGraphCrop.Top,
407 : aGraphCrop.Right,
408 0 : aGraphCrop.Bottom );
409 : }
410 :
411 : // fetch readily transformed and color-modified
412 : // graphic
413 : // ---------------------------------------------
414 :
415 : Graphic aGraphic(
416 : aGraphicObject.GetTransformedGraphic(
417 0 : aGraphicObject.GetPrefSize(),
418 0 : aGraphicObject.GetPrefMapMode(),
419 0 : aGraphAttrs ) );
420 :
421 : return DrawShape::create( xCurrShape,
422 : mxPage,
423 : mnAscendingPrio,
424 : aGraphic,
425 0 : mrContext );
426 : }
427 : else
428 : {
429 : return DrawShape::create( xCurrShape,
430 : mxPage,
431 : mnAscendingPrio,
432 : false,
433 0 : mrContext );
434 : }
435 : }
436 :
437 0 : bool ShapeImporter::isSkip(
438 : uno::Reference<beans::XPropertySet> const& xPropSet,
439 : rtl::OUString const& shapeType,
440 : uno::Reference< drawing::XLayer> const& xLayer )
441 : {
442 : // skip empty presentation objects:
443 0 : bool bEmpty = false;
444 0 : if( getPropertyValue( bEmpty,
445 : xPropSet,
446 0 : OUSTR("IsEmptyPresentationObject")) &&
447 : bEmpty )
448 : {
449 0 : return true;
450 : }
451 :
452 : //skip shapes which corresponds to annotations
453 0 : if(xLayer.is())
454 : {
455 0 : rtl::OUString layerName;
456 : uno::Reference<beans::XPropertySet> xPropLayerSet(
457 0 : xLayer, uno::UNO_QUERY );
458 0 : const uno::Any& a(xPropLayerSet->getPropertyValue(rtl::OUString("Name")) );
459 0 : bool const bRet = (a >>= layerName);
460 0 : if(bRet)
461 : {
462 0 : if( layerName == "DrawnInSlideshow" )
463 : {
464 : //Transform shapes into PolyPolygons
465 0 : importPolygons(xPropSet);
466 :
467 0 : return true;
468 : }
469 0 : }
470 : }
471 :
472 : // don't export presentation placeholders on masterpage
473 : // they can be non empty when user edits the default texts
474 0 : if(mbConvertingMasterPage)
475 : {
476 0 : if( shapeType == "com.sun.star.presentation.TitleTextShape" || shapeType == "com.sun.star.presentation.OutlinerShape" )
477 : {
478 0 : return true;
479 : }
480 : }
481 0 : return false;
482 : }
483 :
484 :
485 0 : void ShapeImporter::importPolygons(uno::Reference<beans::XPropertySet> const& xPropSet) {
486 :
487 0 : drawing::PointSequenceSequence aRetval;
488 0 : sal_Int32 nLineColor=0;
489 : double fLineWidth;
490 0 : getPropertyValue( aRetval, xPropSet, OUSTR("PolyPolygon") );
491 0 : getPropertyValue( nLineColor, xPropSet, OUSTR("LineColor") );
492 0 : getPropertyValue( fLineWidth, xPropSet, OUSTR("LineWidth") );
493 :
494 0 : drawing::PointSequence* pOuterSequence = aRetval.getArray();
495 0 : awt::Point* pInnerSequence = pOuterSequence->getArray();
496 :
497 0 : ::basegfx::B2DPolygon aPoly;
498 0 : basegfx::B2DPoint aPoint;
499 0 : for( sal_Int32 nCurrPoly=0; nCurrPoly<pOuterSequence->getLength(); ++nCurrPoly, ++pInnerSequence )
500 : {
501 0 : aPoint.setX((*pInnerSequence).X);
502 0 : aPoint.setY((*pInnerSequence).Y);
503 0 : aPoly.append( aPoint );
504 : }
505 0 : UnoViewVector::const_iterator aIter=(mrContext.mrViewContainer).begin();
506 0 : UnoViewVector::const_iterator aEnd=(mrContext.mrViewContainer).end();
507 0 : while(aIter != aEnd)
508 : {
509 : ::cppcanvas::PolyPolygonSharedPtr pPolyPoly(
510 0 : ::cppcanvas::BaseGfxFactory::getInstance().createPolyPolygon( (*aIter)->getCanvas(),
511 0 : aPoly ) );
512 0 : if( pPolyPoly )
513 : {
514 0 : pPolyPoly->setRGBALineColor( unoColor2RGBColor( nLineColor ).getIntegerColor() );
515 0 : pPolyPoly->setStrokeWidth(fLineWidth);
516 0 : pPolyPoly->draw();
517 0 : maPolygons.push_back(pPolyPoly);
518 : }
519 0 : ++aIter;
520 0 : }
521 0 : }
522 :
523 0 : ShapeSharedPtr ShapeImporter::importBackgroundShape() // throw (ShapeLoadFailedException)
524 : {
525 0 : if( maShapesStack.empty() )
526 0 : throw ShapeLoadFailedException();
527 :
528 0 : XShapesEntry& rTop = maShapesStack.top();
529 : ShapeSharedPtr pBgShape(
530 : createBackgroundShape(mxPage,
531 : uno::Reference<drawing::XDrawPage>(
532 : rTop.mxShapes,
533 : uno::UNO_QUERY_THROW),
534 0 : mrContext) );
535 0 : mnAscendingPrio += 1.0;
536 :
537 0 : return pBgShape;
538 : }
539 :
540 0 : ShapeSharedPtr ShapeImporter::importShape() // throw (ShapeLoadFailedException)
541 : {
542 0 : ShapeSharedPtr pRet;
543 0 : bool bIsGroupShape = false;
544 :
545 0 : while( !maShapesStack.empty() && !pRet )
546 : {
547 0 : XShapesEntry& rTop = maShapesStack.top();
548 0 : if( rTop.mnPos < rTop.mnCount )
549 : {
550 : uno::Reference<drawing::XShape> const xCurrShape(
551 0 : rTop.mxShapes->getByIndex( rTop.mnPos ), uno::UNO_QUERY );
552 0 : ++rTop.mnPos;
553 : uno::Reference<beans::XPropertySet> xPropSet(
554 0 : xCurrShape, uno::UNO_QUERY );
555 0 : if( !xPropSet.is() )
556 : {
557 : // we definitely need the properties of
558 : // the shape here. This will also fail,
559 : // if getByIndex did not return a valid
560 : // shape
561 0 : throw ShapeLoadFailedException();
562 : }
563 :
564 : //Retrieve the layer for the current shape
565 0 : uno::Reference< drawing::XLayer > xDrawnInSlideshow;
566 :
567 0 : uno::Reference< drawing::XLayerSupplier > xLayerSupplier(mxPagesSupplier, uno::UNO_QUERY);
568 0 : if(xLayerSupplier.is())
569 : {
570 0 : uno::Reference< container::XNameAccess > xNameAccess = xLayerSupplier->getLayerManager();
571 :
572 0 : uno::Reference< drawing::XLayerManager > xLayerManager(xNameAccess, uno::UNO_QUERY);
573 :
574 0 : xDrawnInSlideshow = xLayerManager->getLayerForShape(xCurrShape);
575 : }
576 :
577 0 : rtl::OUString const shapeType( xCurrShape->getShapeType());
578 :
579 : // is this shape presentation-invisible?
580 0 : if( !isSkip(xPropSet, shapeType, xDrawnInSlideshow) )
581 : {
582 0 : bIsGroupShape = shapeType == "com.sun.star.drawing.GroupShape";
583 :
584 0 : if( rTop.mpGroupShape ) // in group particle mode?
585 : {
586 : pRet.reset( new ShapeOfGroup(
587 : rTop.mpGroupShape /* container shape */,
588 : xCurrShape, xPropSet,
589 0 : mnAscendingPrio ) );
590 : }
591 : else
592 : {
593 0 : pRet = createShape( xCurrShape, xPropSet, shapeType );
594 : }
595 0 : mnAscendingPrio += 1.0;
596 0 : }
597 : }
598 0 : if( rTop.mnPos >= rTop.mnCount )
599 : {
600 : // group or top-level shapes finished:
601 0 : maShapesStack.pop();
602 : }
603 0 : if( bIsGroupShape && pRet )
604 : {
605 : // push new group on the stack: group traversal
606 0 : maShapesStack.push( XShapesEntry( pRet ) );
607 : }
608 : }
609 :
610 0 : return pRet;
611 : }
612 :
613 0 : bool ShapeImporter::isImportDone() const
614 : {
615 0 : return maShapesStack.empty();
616 : }
617 :
618 0 : PolyPolygonVector ShapeImporter::getPolygons()
619 : {
620 0 : return maPolygons;
621 : }
622 :
623 0 : ShapeImporter::ShapeImporter( uno::Reference<drawing::XDrawPage> const& xPage,
624 : uno::Reference<drawing::XDrawPage> const& xActualPage,
625 : uno::Reference<drawing::XDrawPagesSupplier> const& xPagesSupplier,
626 : const SlideShowContext& rContext,
627 : sal_Int32 nOrdNumStart,
628 : bool bConvertingMasterPage ) :
629 : mxPage( xActualPage ),
630 : mxPagesSupplier( xPagesSupplier ),
631 : mrContext( rContext ),
632 : maPolygons(),
633 : maShapesStack(),
634 : mnAscendingPrio( nOrdNumStart ),
635 0 : mbConvertingMasterPage( bConvertingMasterPage )
636 : {
637 : uno::Reference<drawing::XShapes> const xShapes(
638 0 : xPage, uno::UNO_QUERY_THROW );
639 0 : maShapesStack.push( XShapesEntry(xShapes) );
640 0 : }
641 :
642 : } // namespace internal
643 : } // namespace presentation
644 :
645 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|