Branch data 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 : :
21 : : #include <osl/diagnose.hxx>
22 : : #include <canvas/debug.hxx>
23 : : #include <tools/diagnose_ex.h>
24 : : #include <canvas/canvastools.hxx>
25 : : #include <cppcanvas/basegfxfactory.hxx>
26 : :
27 : : #include <basegfx/matrix/b2dhommatrix.hxx>
28 : : #include <basegfx/point/b2dpoint.hxx>
29 : : #include <basegfx/polygon/b2dpolygon.hxx>
30 : : #include <basegfx/polygon/b2dpolygontools.hxx>
31 : : #include <basegfx/numeric/ftools.hxx>
32 : :
33 : : #include <com/sun/star/awt/SystemPointer.hpp>
34 : : #include <com/sun/star/container/XIndexAccess.hpp>
35 : : #include <com/sun/star/drawing/XMasterPageTarget.hpp>
36 : : #include <com/sun/star/beans/XPropertySet.hpp>
37 : : #include <com/sun/star/container/XEnumerationAccess.hpp>
38 : : #include <com/sun/star/awt/Rectangle.hpp>
39 : : #include <com/sun/star/presentation/ParagraphTarget.hpp>
40 : : #include <com/sun/star/presentation/EffectNodeType.hpp>
41 : : #include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
42 : : #include <com/sun/star/animations/XTargetPropertiesCreator.hpp>
43 : : #include <com/sun/star/drawing/TextAnimationKind.hpp>
44 : :
45 : : #include <animations/animationnodehelper.hxx>
46 : :
47 : : #include <cppuhelper/exc_hlp.hxx>
48 : : #include <comphelper/anytostring.hxx>
49 : :
50 : : #include "slide.hxx"
51 : : #include "slideshowcontext.hxx"
52 : : #include "slideanimations.hxx"
53 : : #include "doctreenode.hxx"
54 : : #include "screenupdater.hxx"
55 : : #include "cursormanager.hxx"
56 : : #include "shapeimporter.hxx"
57 : : #include "slideshowexceptions.hxx"
58 : : #include "eventqueue.hxx"
59 : : #include "activitiesqueue.hxx"
60 : : #include "layermanager.hxx"
61 : : #include "shapemanagerimpl.hxx"
62 : : #include "usereventqueue.hxx"
63 : : #include "userpaintoverlay.hxx"
64 : : #include "event.hxx"
65 : : #include "tools.hxx"
66 : :
67 : : #include <o3tl/compat_functional.hxx>
68 : :
69 : : #include <boost/bind.hpp>
70 : : #include <iterator>
71 : : #include <algorithm>
72 : : #include <functional>
73 : : #include <iostream>
74 : :
75 : : using namespace ::com::sun::star;
76 : :
77 : : // -----------------------------------------------------------------------------
78 : :
79 : : namespace slideshow
80 : : {
81 : : namespace internal
82 : : {
83 : : namespace
84 : : {
85 : :
86 : : class SlideImpl : public Slide,
87 : : public CursorManager,
88 : : public ViewEventHandler,
89 : : public ::osl::DebugBase<SlideImpl>
90 : : {
91 : : public:
92 : : SlideImpl( const uno::Reference<drawing::XDrawPage>& xDrawPage,
93 : : const uno::Reference<drawing::XDrawPagesSupplier>& xDrawPages,
94 : : const uno::Reference<animations::XAnimationNode>& xRootNode,
95 : : EventQueue& rEventQueue,
96 : : EventMultiplexer& rEventMultiplexer,
97 : : ScreenUpdater& rScreenUpdater,
98 : : ActivitiesQueue& rActivitiesQueue,
99 : : UserEventQueue& rUserEventQueue,
100 : : CursorManager& rCursorManager,
101 : : const UnoViewContainer& rViewContainer,
102 : : const uno::Reference<uno::XComponentContext>& xContext,
103 : : const ShapeEventListenerMap& rShapeListenerMap,
104 : : const ShapeCursorMap& rShapeCursorMap,
105 : : const PolyPolygonVector& rPolyPolygonVector,
106 : : RGBColor const& rUserPaintColor,
107 : : double dUserPaintStrokeWidth,
108 : : bool bUserPaintEnabled,
109 : : bool bIntrinsicAnimationsAllowed,
110 : : bool bDisableAnimationZOrder );
111 : :
112 : : ~SlideImpl();
113 : :
114 : :
115 : : // Disposable interface
116 : : // -------------------------------------------------------------------
117 : :
118 : : virtual void dispose();
119 : :
120 : :
121 : : // Slide interface
122 : : // -------------------------------------------------------------------
123 : :
124 : : virtual bool prefetch();
125 : : virtual bool show( bool );
126 : : virtual void hide();
127 : :
128 : : virtual basegfx::B2ISize getSlideSize() const;
129 : : virtual uno::Reference<drawing::XDrawPage > getXDrawPage() const;
130 : : virtual uno::Reference<animations::XAnimationNode> getXAnimationNode() const;
131 : : virtual PolyPolygonVector getPolygons();
132 : : virtual void drawPolygons() const;
133 : : virtual bool isPaintOverlayActive() const;
134 : : virtual void enablePaintOverlay();
135 : : virtual void disablePaintOverlay();
136 : : virtual void update_settings( bool bUserPaintEnabled, RGBColor const& aUserPaintColor, double dUserPaintStrokeWidth );
137 : :
138 : :
139 : : // TODO(F2): Rework SlideBitmap to no longer be based on XBitmap,
140 : : // but on canvas-independent basegfx bitmaps
141 : : virtual SlideBitmapSharedPtr getCurrentSlideBitmap( const UnoViewSharedPtr& rView ) const;
142 : :
143 : :
144 : : private:
145 : : // ViewEventHandler
146 : : virtual void viewAdded( const UnoViewSharedPtr& rView );
147 : : virtual void viewRemoved( const UnoViewSharedPtr& rView );
148 : : virtual void viewChanged( const UnoViewSharedPtr& rView );
149 : : virtual void viewsChanged();
150 : :
151 : : // CursorManager
152 : : virtual bool requestCursor( sal_Int16 nCursorShape );
153 : : virtual void resetCursor();
154 : :
155 : : void activatePaintOverlay();
156 : : void deactivatePaintOverlay();
157 : :
158 : : /** Query whether the slide has animations at all
159 : :
160 : : If the slide doesn't have animations, show() displays
161 : : only static content. If an event is registered with
162 : : registerSlideEndEvent(), this event will be
163 : : immediately activated at the end of the show() method.
164 : :
165 : : @return true, if this slide has animations, false
166 : : otherwise
167 : : */
168 : : bool isAnimated();
169 : :
170 : : /// Set all Shapes to their initial attributes for slideshow
171 : : bool applyInitialShapeAttributes( const ::com::sun::star::uno::Reference<
172 : : ::com::sun::star::animations::XAnimationNode >& xRootAnimationNode );
173 : :
174 : : /// Renders current slide content to bitmap
175 : : SlideBitmapSharedPtr createCurrentSlideBitmap(
176 : : const UnoViewSharedPtr& rView,
177 : : ::basegfx::B2ISize const & rSlideSize ) const;
178 : :
179 : : /// Prefetch all shapes (not the animations)
180 : : bool loadShapes();
181 : :
182 : : /// Retrieve slide size from XDrawPage
183 : : basegfx::B2ISize getSlideSizeImpl() const;
184 : :
185 : : /// Prefetch show, but don't call applyInitialShapeAttributes()
186 : : bool implPrefetchShow();
187 : :
188 : : /// Query the rectangle covered by the slide
189 : : ::basegfx::B2DRectangle getSlideRect() const;
190 : :
191 : : /// Start GIF and other intrinsic shape animations
192 : : void endIntrinsicAnimations();
193 : :
194 : : /// End GIF and other intrinsic shape animations
195 : : void startIntrinsicAnimations();
196 : :
197 : : /// Add Polygons to the member maPolygons
198 : : void addPolygons(PolyPolygonVector aPolygons);
199 : :
200 : : // Types
201 : : // =====
202 : :
203 : : enum SlideAnimationState
204 : : {
205 : : CONSTRUCTING_STATE=0,
206 : : INITIAL_STATE=1,
207 : : SHOWING_STATE=2,
208 : : FINAL_STATE=3,
209 : : SlideAnimationState_NUM_ENTRIES=4
210 : : };
211 : :
212 : : typedef std::vector< SlideBitmapSharedPtr > VectorOfSlideBitmaps;
213 : : /** Vector of slide bitmaps.
214 : :
215 : : Since the bitmap content is sensitive to animation
216 : : effects, we have an inner vector containing a distinct
217 : : bitmap for each of the SlideAnimationStates.
218 : : */
219 : : typedef ::std::vector< std::pair< UnoViewSharedPtr,
220 : : VectorOfSlideBitmaps > > VectorOfVectorOfSlideBitmaps;
221 : :
222 : :
223 : : // Member variables
224 : : // ================
225 : :
226 : : /// The page model object
227 : : uno::Reference< drawing::XDrawPage > mxDrawPage;
228 : : uno::Reference< drawing::XDrawPagesSupplier > mxDrawPagesSupplier;
229 : : uno::Reference< animations::XAnimationNode > mxRootNode;
230 : :
231 : : LayerManagerSharedPtr mpLayerManager;
232 : : boost::shared_ptr<ShapeManagerImpl> mpShapeManager;
233 : : boost::shared_ptr<SubsettableShapeManager> mpSubsettableShapeManager;
234 : :
235 : : /// Contains common objects needed throughout the slideshow
236 : : SlideShowContext maContext;
237 : :
238 : : /// parent cursor manager
239 : : CursorManager& mrCursorManager;
240 : :
241 : : /// Handles the animation and event generation for us
242 : : SlideAnimations maAnimations;
243 : : PolyPolygonVector maPolygons;
244 : :
245 : : RGBColor maUserPaintColor;
246 : : double mdUserPaintStrokeWidth;
247 : : UserPaintOverlaySharedPtr mpPaintOverlay;
248 : :
249 : : /// Bitmaps with slide content at various states
250 : : mutable VectorOfVectorOfSlideBitmaps maSlideBitmaps;
251 : :
252 : : SlideAnimationState meAnimationState;
253 : :
254 : : const basegfx::B2ISize maSlideSize;
255 : :
256 : : sal_Int16 mnCurrentCursor;
257 : :
258 : : /// True, when intrinsic shape animations are allowed
259 : : bool mbIntrinsicAnimationsAllowed;
260 : :
261 : : /// True, when user paint overlay is enabled
262 : : bool mbUserPaintOverlayEnabled;
263 : :
264 : : /// True, if initial load of all page shapes succeeded
265 : : bool mbShapesLoaded;
266 : :
267 : : /// True, if initial load of all animation info succeeded
268 : : bool mbShowLoaded;
269 : :
270 : : /** True, if this slide is not static.
271 : :
272 : : If this slide has animated content, this variable will
273 : : be true, and false otherwise.
274 : : */
275 : : bool mbHaveAnimations;
276 : :
277 : : /** True, if this slide has a main animation sequence.
278 : :
279 : : If this slide has animation content, which in turn has
280 : : a main animation sequence (which must be fully run
281 : : before EventMultiplexer::notifySlideAnimationsEnd() is
282 : : called), this member is true.
283 : : */
284 : : bool mbMainSequenceFound;
285 : :
286 : : /// When true, show() was called. Slide hidden oherwise.
287 : : bool mbActive;
288 : :
289 : : ///When true, enablePaintOverlay was called and mbUserPaintOverlay = true
290 : : bool mbPaintOverlayActive;
291 : : };
292 : :
293 : :
294 : : //////////////////////////////////////////////////////////////////////////////////
295 : :
296 : :
297 : : class SlideRenderer
298 : : {
299 : : public:
300 : 0 : explicit SlideRenderer( SlideImpl& rSlide ) :
301 : 0 : mrSlide( rSlide )
302 : : {
303 : 0 : }
304 : :
305 : 0 : void operator()( const UnoViewSharedPtr& rView )
306 : : {
307 : : // fully clear view content to background color
308 : 0 : rView->clearAll();
309 : :
310 : 0 : SlideBitmapSharedPtr pBitmap( mrSlide.getCurrentSlideBitmap( rView ) );
311 : 0 : ::cppcanvas::CanvasSharedPtr pCanvas( rView->getCanvas() );
312 : :
313 : 0 : const ::basegfx::B2DHomMatrix aViewTransform( rView->getTransformation() );
314 : 0 : const ::basegfx::B2DPoint aOutPosPixel( aViewTransform * ::basegfx::B2DPoint() );
315 : :
316 : : // setup a canvas with device coordinate space, the slide
317 : : // bitmap already has the correct dimension.
318 : 0 : ::cppcanvas::CanvasSharedPtr pDevicePixelCanvas( pCanvas->clone() );
319 : 0 : pDevicePixelCanvas->setTransformation( ::basegfx::B2DHomMatrix() );
320 : :
321 : : // render at given output position
322 : 0 : pBitmap->move( aOutPosPixel );
323 : :
324 : : // clear clip (might have been changed, e.g. from comb
325 : : // transition)
326 : 0 : pBitmap->clip( ::basegfx::B2DPolyPolygon() );
327 : 0 : pBitmap->draw( pDevicePixelCanvas );
328 : 0 : }
329 : :
330 : : private:
331 : : SlideImpl& mrSlide;
332 : : };
333 : :
334 : :
335 : : //////////////////////////////////////////////////////////////////////////////////
336 : :
337 : :
338 : 0 : SlideImpl::SlideImpl( const uno::Reference< drawing::XDrawPage >& xDrawPage,
339 : : const uno::Reference<drawing::XDrawPagesSupplier>& xDrawPages,
340 : : const uno::Reference< animations::XAnimationNode >& xRootNode,
341 : : EventQueue& rEventQueue,
342 : : EventMultiplexer& rEventMultiplexer,
343 : : ScreenUpdater& rScreenUpdater,
344 : : ActivitiesQueue& rActivitiesQueue,
345 : : UserEventQueue& rUserEventQueue,
346 : : CursorManager& rCursorManager,
347 : : const UnoViewContainer& rViewContainer,
348 : : const uno::Reference< uno::XComponentContext >& xComponentContext,
349 : : const ShapeEventListenerMap& rShapeListenerMap,
350 : : const ShapeCursorMap& rShapeCursorMap,
351 : : const PolyPolygonVector& rPolyPolygonVector,
352 : : RGBColor const& aUserPaintColor,
353 : : double dUserPaintStrokeWidth,
354 : : bool bUserPaintEnabled,
355 : : bool bIntrinsicAnimationsAllowed,
356 : : bool bDisableAnimationZOrder ) :
357 : : mxDrawPage( xDrawPage ),
358 : : mxDrawPagesSupplier( xDrawPages ),
359 : : mxRootNode( xRootNode ),
360 : : mpLayerManager( new LayerManager(
361 : : rViewContainer,
362 : : getSlideRect(),
363 : 0 : bDisableAnimationZOrder) ),
364 : : mpShapeManager( new ShapeManagerImpl(
365 : : rEventMultiplexer,
366 : : mpLayerManager,
367 : : rCursorManager,
368 : : rShapeListenerMap,
369 : 0 : rShapeCursorMap)),
370 : : mpSubsettableShapeManager( mpShapeManager ),
371 : : maContext( mpSubsettableShapeManager,
372 : : rEventQueue,
373 : : rEventMultiplexer,
374 : : rScreenUpdater,
375 : : rActivitiesQueue,
376 : : rUserEventQueue,
377 : : *this,
378 : : rViewContainer,
379 : : xComponentContext ),
380 : : mrCursorManager( rCursorManager ),
381 : : maAnimations( maContext,
382 : : basegfx::B2DSize( getSlideSizeImpl() ) ),
383 : : maPolygons(rPolyPolygonVector),
384 : : maUserPaintColor(aUserPaintColor),
385 : : mdUserPaintStrokeWidth(dUserPaintStrokeWidth),
386 : : mpPaintOverlay(),
387 : : maSlideBitmaps(),
388 : : meAnimationState( CONSTRUCTING_STATE ),
389 : : maSlideSize(getSlideSizeImpl()),
390 : : mnCurrentCursor( awt::SystemPointer::ARROW ),
391 : : mbIntrinsicAnimationsAllowed( bIntrinsicAnimationsAllowed ),
392 : : mbUserPaintOverlayEnabled(bUserPaintEnabled),
393 : : mbShapesLoaded( false ),
394 : : mbShowLoaded( false ),
395 : : mbHaveAnimations( false ),
396 : : mbMainSequenceFound( false ),
397 : : mbActive( false ),
398 : 0 : mbPaintOverlayActive( false )
399 : : {
400 : : // clone already existing views for slide bitmaps
401 : : std::for_each( rViewContainer.begin(),
402 : : rViewContainer.end(),
403 : : boost::bind( &SlideImpl::viewAdded,
404 : : this,
405 : 0 : _1 ));
406 : :
407 : : // register screen update (LayerManager needs to signal pending
408 : : // updates)
409 : 0 : maContext.mrScreenUpdater.addViewUpdate(mpShapeManager);
410 : 0 : }
411 : :
412 : 0 : void SlideImpl::update_settings( bool bUserPaintEnabled, RGBColor const& aUserPaintColor, double dUserPaintStrokeWidth )
413 : : {
414 : 0 : maUserPaintColor = aUserPaintColor;
415 : 0 : mdUserPaintStrokeWidth = dUserPaintStrokeWidth;
416 : 0 : mbUserPaintOverlayEnabled = bUserPaintEnabled;
417 : 0 : }
418 : :
419 : 0 : SlideImpl::~SlideImpl()
420 : : {
421 : 0 : if( mpShapeManager )
422 : : {
423 : 0 : maContext.mrScreenUpdater.removeViewUpdate(mpShapeManager);
424 : 0 : mpShapeManager->dispose();
425 : :
426 : : // TODO(Q3): Make sure LayerManager (and thus Shapes) dies
427 : : // first, because SlideShowContext has SubsettableShapeManager
428 : : // as reference member.
429 : 0 : mpLayerManager.reset();
430 : : }
431 : 0 : }
432 : :
433 : 0 : void SlideImpl::dispose()
434 : : {
435 : 0 : maSlideBitmaps.clear();
436 : 0 : mpPaintOverlay.reset();
437 : 0 : maAnimations.dispose();
438 : 0 : maContext.dispose();
439 : :
440 : 0 : if( mpShapeManager )
441 : : {
442 : 0 : maContext.mrScreenUpdater.removeViewUpdate(mpShapeManager);
443 : 0 : mpShapeManager->dispose();
444 : : }
445 : :
446 : : // TODO(Q3): Make sure LayerManager (and thus Shapes) dies first,
447 : : // because SlideShowContext has SubsettableShapeManager as
448 : : // reference member.
449 : 0 : mpLayerManager.reset();
450 : 0 : mpSubsettableShapeManager.reset();
451 : 0 : mpShapeManager.reset();
452 : 0 : mxRootNode.clear();
453 : 0 : mxDrawPage.clear();
454 : 0 : mxDrawPagesSupplier.clear();
455 : 0 : }
456 : :
457 : 0 : bool SlideImpl::prefetch()
458 : : {
459 : 0 : if( !mxRootNode.is() )
460 : 0 : return false;
461 : :
462 : 0 : return applyInitialShapeAttributes(mxRootNode);
463 : : }
464 : :
465 : 0 : bool SlideImpl::show( bool bSlideBackgoundPainted )
466 : : {
467 : : // ---------------------------------------------------------------
468 : :
469 : 0 : if( mbActive )
470 : 0 : return true; // already active
471 : :
472 : 0 : if( !mpShapeManager || !mpLayerManager )
473 : 0 : return false; // disposed
474 : :
475 : : // ---------------------------------------------------------------
476 : :
477 : : // set initial shape attributes (e.g. hide shapes that have
478 : : // 'appear' effect set)
479 : 0 : if( !applyInitialShapeAttributes(mxRootNode) )
480 : 0 : return false;
481 : :
482 : : // ---------------------------------------------------------------
483 : :
484 : : // activate and take over view - clears view, if necessary
485 : 0 : mbActive = true;
486 : 0 : requestCursor( mnCurrentCursor );
487 : :
488 : : // enable shape management & event broadcasting for shapes of this
489 : : // slide. Also enables LayerManager to record updates. Currently,
490 : : // never let LayerManager render initial slide content, use
491 : : // buffered slide bitmaps instead.
492 : 0 : mpShapeManager->activate( true );
493 : :
494 : : // ---------------------------------------------------------------
495 : :
496 : : // render slide to screen, if requested
497 : 0 : if( !bSlideBackgoundPainted )
498 : : {
499 : : std::for_each(maContext.mrViewContainer.begin(),
500 : : maContext.mrViewContainer.end(),
501 : 0 : boost::mem_fn(&View::clearAll));
502 : :
503 : : std::for_each( maContext.mrViewContainer.begin(),
504 : : maContext.mrViewContainer.end(),
505 : 0 : SlideRenderer(*this) );
506 : 0 : maContext.mrScreenUpdater.notifyUpdate();
507 : : }
508 : :
509 : : // ---------------------------------------------------------------
510 : :
511 : : // fire up animations
512 : 0 : const bool bIsAnimated( isAnimated() );
513 : 0 : if( bIsAnimated )
514 : 0 : maAnimations.start(); // feeds initial events into queue
515 : :
516 : : // NOTE: this looks slightly weird, but is indeed correct:
517 : : // as isAnimated() might return false, _although_ there is
518 : : // a main sequence (because the animation nodes don't
519 : : // contain any executable effects), we gotta check both
520 : : // conditions here.
521 : 0 : if( !bIsAnimated || !mbMainSequenceFound )
522 : : {
523 : : // manually trigger a slide animation end event (we don't have
524 : : // animations at all, or we don't have a main animation
525 : : // sequence, but if we had, it'd end now). Note that having
526 : : // animations alone does not matter here, as only main
527 : : // sequence animations prevents showing the next slide on
528 : : // nextEvent().
529 : 0 : maContext.mrEventMultiplexer.notifySlideAnimationsEnd();
530 : : }
531 : :
532 : : // enable shape-intrinsic animations (drawing layer animations or
533 : : // GIF animations)
534 : 0 : if( mbIntrinsicAnimationsAllowed )
535 : 0 : startIntrinsicAnimations();
536 : :
537 : : // ---------------------------------------------------------------
538 : :
539 : : // enable paint overlay, if maUserPaintColor is valid
540 : 0 : activatePaintOverlay();
541 : :
542 : : // ---------------------------------------------------------------
543 : :
544 : : // from now on, animations might be showing
545 : 0 : meAnimationState = SHOWING_STATE;
546 : :
547 : 0 : return true;
548 : : }
549 : :
550 : 0 : void SlideImpl::hide()
551 : : {
552 : 0 : if( !mbActive || !mpShapeManager )
553 : 0 : return; // already hidden/disposed
554 : :
555 : : // ---------------------------------------------------------------
556 : :
557 : : // from now on, all animations are stopped
558 : 0 : meAnimationState = FINAL_STATE;
559 : :
560 : : // ---------------------------------------------------------------
561 : :
562 : : // disable user paint overlay under all circumstances,
563 : : // this slide now ceases to be active.
564 : 0 : deactivatePaintOverlay();
565 : :
566 : : // ---------------------------------------------------------------
567 : :
568 : : // switch off all shape-intrinsic animations.
569 : 0 : endIntrinsicAnimations();
570 : :
571 : : // force-end all SMIL animations, too
572 : 0 : maAnimations.end();
573 : :
574 : : // ---------------------------------------------------------------
575 : :
576 : : // disable shape management & event broadcasting for shapes of this
577 : : // slide. Also disables LayerManager.
578 : 0 : mpShapeManager->deactivate();
579 : :
580 : : // vanish from view
581 : 0 : resetCursor();
582 : 0 : mbActive = false;
583 : :
584 : : // ---------------------------------------------------------------
585 : : }
586 : :
587 : 0 : basegfx::B2ISize SlideImpl::getSlideSize() const
588 : : {
589 : 0 : return maSlideSize;
590 : : }
591 : :
592 : 0 : uno::Reference<drawing::XDrawPage > SlideImpl::getXDrawPage() const
593 : : {
594 : 0 : return mxDrawPage;
595 : : }
596 : :
597 : 0 : uno::Reference<animations::XAnimationNode> SlideImpl::getXAnimationNode() const
598 : : {
599 : 0 : return mxRootNode;
600 : : }
601 : :
602 : 0 : PolyPolygonVector SlideImpl::getPolygons()
603 : : {
604 : 0 : if(mbPaintOverlayActive)
605 : 0 : maPolygons = mpPaintOverlay->getPolygons();
606 : 0 : return maPolygons;
607 : : }
608 : :
609 : 0 : SlideBitmapSharedPtr SlideImpl::getCurrentSlideBitmap( const UnoViewSharedPtr& rView ) const
610 : : {
611 : : // search corresponding entry in maSlideBitmaps (which
612 : : // contains the views as the key)
613 : 0 : VectorOfVectorOfSlideBitmaps::iterator aIter;
614 : 0 : const VectorOfVectorOfSlideBitmaps::iterator aEnd( maSlideBitmaps.end() );
615 : 0 : if( (aIter=std::find_if( maSlideBitmaps.begin(),
616 : : aEnd,
617 : : boost::bind(
618 : : std::equal_to<UnoViewSharedPtr>(),
619 : : rView,
620 : : // select view:
621 : : boost::bind(
622 : : o3tl::select1st<VectorOfVectorOfSlideBitmaps::value_type>(),
623 : 0 : _1 )))) == aEnd )
624 : : {
625 : : // corresponding view not found - maybe view was not
626 : : // added to Slide?
627 : 0 : ENSURE_OR_THROW( false,
628 : : "SlideImpl::getInitialSlideBitmap(): view does not "
629 : : "match any of the added ones" );
630 : : }
631 : :
632 : : // ensure that the show is loaded
633 : 0 : if( !mbShowLoaded )
634 : : {
635 : : // only prefetch and init shapes when not done already
636 : : // (otherwise, at least applyInitialShapeAttributes() will be
637 : : // called twice for initial slide rendering). Furthermore,
638 : : // applyInitialShapeAttributes() _always_ performs
639 : : // initializations, which would be highly unwanted during a
640 : : // running show. OTOH, a slide whose mbShowLoaded is false is
641 : : // guaranteed not be running a show.
642 : :
643 : : // set initial shape attributes (e.g. hide 'appear' effect
644 : : // shapes)
645 : 0 : if( !const_cast<SlideImpl*>(this)->applyInitialShapeAttributes( mxRootNode ) )
646 : 0 : ENSURE_OR_THROW(false,
647 : : "SlideImpl::getCurrentSlideBitmap(): Cannot "
648 : : "apply initial attributes");
649 : : }
650 : :
651 : 0 : SlideBitmapSharedPtr& rBitmap( aIter->second.at( meAnimationState ));
652 : : const ::basegfx::B2ISize& rSlideSize(
653 : 0 : getSlideSizePixel( ::basegfx::B2DSize( getSlideSize() ),
654 : 0 : rView ));
655 : :
656 : : // is the bitmap valid (actually existent, and of correct
657 : : // size)?
658 : 0 : if( !rBitmap || rBitmap->getSize() != rSlideSize )
659 : : {
660 : : // no bitmap there yet, or wrong size - create one
661 : 0 : rBitmap = createCurrentSlideBitmap(rView, rSlideSize);
662 : : }
663 : :
664 : 0 : return rBitmap;
665 : : }
666 : :
667 : :
668 : : // private methods
669 : : //--------------------------------------------------------------------------------------------------------------
670 : :
671 : :
672 : 0 : void SlideImpl::viewAdded( const UnoViewSharedPtr& rView )
673 : : {
674 : : maSlideBitmaps.push_back(
675 : : std::make_pair( rView,
676 : 0 : VectorOfSlideBitmaps(SlideAnimationState_NUM_ENTRIES) ));
677 : :
678 : 0 : if( mpLayerManager )
679 : 0 : mpLayerManager->viewAdded( rView );
680 : 0 : }
681 : :
682 : 0 : void SlideImpl::viewRemoved( const UnoViewSharedPtr& rView )
683 : : {
684 : 0 : if( mpLayerManager )
685 : 0 : mpLayerManager->viewRemoved( rView );
686 : :
687 : 0 : const VectorOfVectorOfSlideBitmaps::iterator aEnd( maSlideBitmaps.end() );
688 : : maSlideBitmaps.erase(
689 : : std::remove_if( maSlideBitmaps.begin(),
690 : : aEnd,
691 : : boost::bind(
692 : : std::equal_to<UnoViewSharedPtr>(),
693 : : rView,
694 : : // select view:
695 : : boost::bind(
696 : : o3tl::select1st<VectorOfVectorOfSlideBitmaps::value_type>(),
697 : : _1 ))),
698 : 0 : aEnd );
699 : 0 : }
700 : :
701 : 0 : void SlideImpl::viewChanged( const UnoViewSharedPtr& rView )
702 : : {
703 : : // nothing to do for the Slide - getCurrentSlideBitmap() lazily
704 : : // handles bitmap resizes
705 : 0 : if( mbActive && mpLayerManager )
706 : 0 : mpLayerManager->viewChanged(rView);
707 : 0 : }
708 : :
709 : 0 : void SlideImpl::viewsChanged()
710 : : {
711 : : // nothing to do for the Slide - getCurrentSlideBitmap() lazily
712 : : // handles bitmap resizes
713 : 0 : if( mbActive && mpLayerManager )
714 : 0 : mpLayerManager->viewsChanged();
715 : 0 : }
716 : :
717 : 0 : bool SlideImpl::requestCursor( sal_Int16 nCursorShape )
718 : : {
719 : 0 : mnCurrentCursor = nCursorShape;
720 : 0 : return mrCursorManager.requestCursor(mnCurrentCursor);
721 : : }
722 : :
723 : 0 : void SlideImpl::resetCursor()
724 : : {
725 : 0 : mnCurrentCursor = awt::SystemPointer::ARROW;
726 : 0 : mrCursorManager.resetCursor();
727 : 0 : }
728 : :
729 : 0 : bool SlideImpl::isAnimated()
730 : : {
731 : : // prefetch, but don't apply initial shape attributes
732 : 0 : if( !implPrefetchShow() )
733 : 0 : return false;
734 : :
735 : 0 : return mbHaveAnimations && maAnimations.isAnimated();
736 : : }
737 : :
738 : 0 : SlideBitmapSharedPtr SlideImpl::createCurrentSlideBitmap( const UnoViewSharedPtr& rView,
739 : : const ::basegfx::B2ISize& rBmpSize ) const
740 : : {
741 : 0 : ENSURE_OR_THROW( rView && rView->getCanvas(),
742 : : "SlideImpl::createCurrentSlideBitmap(): Invalid view" );
743 : 0 : ENSURE_OR_THROW( mpLayerManager,
744 : : "SlideImpl::createCurrentSlideBitmap(): Invalid layer manager" );
745 : 0 : ENSURE_OR_THROW( mbShowLoaded,
746 : : "SlideImpl::createCurrentSlideBitmap(): No show loaded" );
747 : :
748 : 0 : ::cppcanvas::CanvasSharedPtr pCanvas( rView->getCanvas() );
749 : :
750 : : // create a bitmap of appropriate size
751 : : ::cppcanvas::BitmapSharedPtr pBitmap(
752 : 0 : ::cppcanvas::BaseGfxFactory::getInstance().createBitmap(
753 : : pCanvas,
754 : 0 : rBmpSize ) );
755 : :
756 : 0 : ENSURE_OR_THROW( pBitmap,
757 : : "SlideImpl::createCurrentSlideBitmap(): Cannot create page bitmap" );
758 : :
759 : 0 : ::cppcanvas::BitmapCanvasSharedPtr pBitmapCanvas( pBitmap->getBitmapCanvas() );
760 : :
761 : 0 : ENSURE_OR_THROW( pBitmapCanvas,
762 : : "SlideImpl::createCurrentSlideBitmap(): Cannot create page bitmap canvas" );
763 : :
764 : : // apply linear part of destination canvas transformation (linear means in this context:
765 : : // transformation without any translational components)
766 : 0 : ::basegfx::B2DHomMatrix aLinearTransform( rView->getTransformation() );
767 : 0 : aLinearTransform.set( 0, 2, 0.0 );
768 : 0 : aLinearTransform.set( 1, 2, 0.0 );
769 : 0 : pBitmapCanvas->setTransformation( aLinearTransform );
770 : :
771 : : // output all shapes to bitmap
772 : 0 : initSlideBackground( pBitmapCanvas, rBmpSize );
773 : 0 : mpLayerManager->renderTo( pBitmapCanvas );
774 : :
775 : 0 : return SlideBitmapSharedPtr( new SlideBitmap( pBitmap ) );
776 : : }
777 : :
778 : : namespace
779 : : {
780 : 0 : class MainSequenceSearcher
781 : : {
782 : : public:
783 : 0 : MainSequenceSearcher()
784 : 0 : {
785 : 0 : maSearchKey.Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "node-type" ) );
786 : 0 : maSearchKey.Value <<= presentation::EffectNodeType::MAIN_SEQUENCE;
787 : 0 : }
788 : :
789 : 0 : void operator()( const uno::Reference< animations::XAnimationNode >& xChildNode )
790 : : {
791 : 0 : uno::Sequence< beans::NamedValue > aUserData( xChildNode->getUserData() );
792 : :
793 : 0 : if( findNamedValue( aUserData, maSearchKey ) )
794 : : {
795 : 0 : maMainSequence = xChildNode;
796 : 0 : }
797 : 0 : }
798 : :
799 : 0 : uno::Reference< animations::XAnimationNode > getMainSequence() const
800 : : {
801 : 0 : return maMainSequence;
802 : : }
803 : :
804 : : private:
805 : : beans::NamedValue maSearchKey;
806 : : uno::Reference< animations::XAnimationNode > maMainSequence;
807 : : };
808 : : }
809 : :
810 : 0 : bool SlideImpl::implPrefetchShow()
811 : : {
812 : 0 : if( mbShowLoaded )
813 : 0 : return true;
814 : :
815 : 0 : ENSURE_OR_RETURN_FALSE( mxDrawPage.is(),
816 : : "SlideImpl::implPrefetchShow(): Invalid draw page" );
817 : 0 : ENSURE_OR_RETURN_FALSE( mpLayerManager,
818 : : "SlideImpl::implPrefetchShow(): Invalid layer manager" );
819 : :
820 : : // fetch desired page content
821 : : // ==========================
822 : :
823 : 0 : if( !loadShapes() )
824 : 0 : return false;
825 : :
826 : : // New animations framework: import the shape effect info
827 : : // ======================================================
828 : :
829 : : try
830 : : {
831 : 0 : if( mxRootNode.is() )
832 : : {
833 : 0 : if( !maAnimations.importAnimations( mxRootNode ) )
834 : : {
835 : : OSL_FAIL( "SlideImpl::implPrefetchShow(): have animation nodes, "
836 : : "but import animations failed." );
837 : :
838 : : // could not import animation framework,
839 : : // _although_ some animation nodes are there -
840 : : // this is an error (not finding animations at
841 : : // all is okay - might be a static slide)
842 : 0 : return false;
843 : : }
844 : :
845 : : // now check whether we've got a main sequence (if
846 : : // not, we must manually call
847 : : // EventMultiplexer::notifySlideAnimationsEnd()
848 : : // above, as e.g. interactive sequences alone
849 : : // don't block nextEvent() from issuing the next
850 : : // slide)
851 : 0 : MainSequenceSearcher aSearcher;
852 : 0 : if( ::anim::for_each_childNode( mxRootNode, aSearcher ) )
853 : 0 : mbMainSequenceFound = aSearcher.getMainSequence().is();
854 : :
855 : : // import successfully done
856 : 0 : mbHaveAnimations = true;
857 : : }
858 : : }
859 : 0 : catch( uno::RuntimeException& )
860 : : {
861 : 0 : throw;
862 : : }
863 : 0 : catch( uno::Exception& )
864 : : {
865 : : OSL_FAIL(
866 : : rtl::OUStringToOString(
867 : : comphelper::anyToString(cppu::getCaughtException()),
868 : : RTL_TEXTENCODING_UTF8).getStr() );
869 : : // TODO(E2): Error handling. For now, bail out
870 : : }
871 : :
872 : 0 : mbShowLoaded = true;
873 : :
874 : 0 : return true;
875 : : }
876 : :
877 : 0 : void SlideImpl::enablePaintOverlay()
878 : : {
879 : 0 : if( !mbUserPaintOverlayEnabled || !mbPaintOverlayActive )
880 : : {
881 : 0 : mbUserPaintOverlayEnabled = true;
882 : 0 : activatePaintOverlay();
883 : : }
884 : 0 : }
885 : :
886 : 0 : void SlideImpl::disablePaintOverlay()
887 : : {
888 : 0 : }
889 : :
890 : 0 : void SlideImpl::activatePaintOverlay()
891 : : {
892 : 0 : if( mbUserPaintOverlayEnabled || !maPolygons.empty() )
893 : : {
894 : : mpPaintOverlay = UserPaintOverlay::create( maUserPaintColor,
895 : : mdUserPaintStrokeWidth,
896 : : maContext,
897 : : maPolygons,
898 : 0 : mbUserPaintOverlayEnabled );
899 : 0 : mbPaintOverlayActive = true;
900 : : }
901 : 0 : }
902 : :
903 : 0 : void SlideImpl::drawPolygons() const
904 : : {
905 : 0 : if( mpPaintOverlay )
906 : 0 : mpPaintOverlay->drawPolygons();
907 : 0 : }
908 : :
909 : 0 : void SlideImpl::addPolygons(PolyPolygonVector aPolygons)
910 : : {
911 : 0 : if(!aPolygons.empty())
912 : : {
913 : 0 : for( PolyPolygonVector::iterator aIter=aPolygons.begin(),
914 : 0 : aEnd=aPolygons.end();
915 : : aIter!=aEnd;
916 : : ++aIter )
917 : : {
918 : 0 : maPolygons.push_back(*aIter);
919 : : }
920 : : }
921 : 0 : }
922 : :
923 : 0 : bool SlideImpl::isPaintOverlayActive() const
924 : : {
925 : 0 : return mbPaintOverlayActive;
926 : : }
927 : :
928 : 0 : void SlideImpl::deactivatePaintOverlay()
929 : : {
930 : 0 : if(mbPaintOverlayActive)
931 : 0 : maPolygons = mpPaintOverlay->getPolygons();
932 : :
933 : 0 : mpPaintOverlay.reset();
934 : 0 : mbPaintOverlayActive = false;
935 : 0 : }
936 : :
937 : 0 : ::basegfx::B2DRectangle SlideImpl::getSlideRect() const
938 : : {
939 : 0 : const basegfx::B2ISize slideSize( getSlideSizeImpl() );
940 : : return ::basegfx::B2DRectangle(0.0,0.0,
941 : 0 : slideSize.getX(),
942 : 0 : slideSize.getY());
943 : : }
944 : :
945 : 0 : void SlideImpl::endIntrinsicAnimations()
946 : : {
947 : 0 : mpSubsettableShapeManager->notifyIntrinsicAnimationsDisabled();
948 : 0 : }
949 : :
950 : 0 : void SlideImpl::startIntrinsicAnimations()
951 : : {
952 : 0 : mpSubsettableShapeManager->notifyIntrinsicAnimationsEnabled();
953 : 0 : }
954 : :
955 : 0 : bool SlideImpl::applyInitialShapeAttributes(
956 : : const uno::Reference< animations::XAnimationNode >& xRootAnimationNode )
957 : : {
958 : 0 : if( !implPrefetchShow() )
959 : 0 : return false;
960 : :
961 : 0 : if( !xRootAnimationNode.is() )
962 : : {
963 : 0 : meAnimationState = INITIAL_STATE;
964 : :
965 : 0 : return true; // no animations - no attributes to apply -
966 : : // succeeded
967 : : }
968 : :
969 : 0 : uno::Reference< animations::XTargetPropertiesCreator > xPropsCreator;
970 : :
971 : : try
972 : : {
973 : 0 : ENSURE_OR_RETURN_FALSE( maContext.mxComponentContext.is(),
974 : : "SlideImpl::applyInitialShapeAttributes(): Invalid component context" );
975 : :
976 : : uno::Reference<lang::XMultiComponentFactory> xFac(
977 : 0 : maContext.mxComponentContext->getServiceManager() );
978 : :
979 : : xPropsCreator.set(
980 : 0 : xFac->createInstanceWithContext(
981 : : ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
982 : : "com.sun.star.animations.TargetPropertiesCreator") ),
983 : 0 : maContext.mxComponentContext ),
984 : 0 : uno::UNO_QUERY_THROW );
985 : : }
986 : 0 : catch( uno::RuntimeException& )
987 : : {
988 : 0 : throw;
989 : : }
990 : 0 : catch( uno::Exception& )
991 : : {
992 : : OSL_FAIL(
993 : : rtl::OUStringToOString(
994 : : comphelper::anyToString(cppu::getCaughtException()),
995 : : RTL_TEXTENCODING_UTF8).getStr() );
996 : :
997 : : // could not determine initial shape attributes - this
998 : : // is an error, as some effects might then be plainly
999 : : // invisible
1000 : 0 : ENSURE_OR_RETURN_FALSE( false,
1001 : : "SlideImpl::applyInitialShapeAttributes(): "
1002 : : "couldn't create TargetPropertiesCreator." );
1003 : : }
1004 : :
1005 : : uno::Sequence< animations::TargetProperties > aProps(
1006 : 0 : xPropsCreator->createInitialTargetProperties( xRootAnimationNode ) );
1007 : :
1008 : : // apply extracted values to our shapes
1009 : 0 : const ::std::size_t nSize( aProps.getLength() );
1010 : 0 : for( ::std::size_t i=0; i<nSize; ++i )
1011 : : {
1012 : 0 : sal_Int16 nParaIndex( -1 );
1013 : 0 : uno::Reference< drawing::XShape > xShape( aProps[i].Target,
1014 : 0 : uno::UNO_QUERY );
1015 : :
1016 : 0 : if( !xShape.is() )
1017 : : {
1018 : : // not a shape target. Maybe a ParagraphTarget?
1019 : 0 : presentation::ParagraphTarget aParaTarget;
1020 : :
1021 : 0 : if( (aProps[i].Target >>= aParaTarget) )
1022 : : {
1023 : : // yep, ParagraphTarget found - extract shape
1024 : : // and index
1025 : 0 : xShape = aParaTarget.Shape;
1026 : 0 : nParaIndex = aParaTarget.Paragraph;
1027 : 0 : }
1028 : : }
1029 : :
1030 : 0 : if( xShape.is() )
1031 : : {
1032 : 0 : ShapeSharedPtr pShape( mpLayerManager->lookupShape( xShape ) );
1033 : :
1034 : 0 : if( !pShape )
1035 : : {
1036 : : OSL_FAIL( "SlideImpl::applyInitialShapeAttributes(): no shape found for given target" );
1037 : 0 : continue;
1038 : : }
1039 : :
1040 : : AttributableShapeSharedPtr pAttrShape(
1041 : 0 : ::boost::dynamic_pointer_cast< AttributableShape >( pShape ) );
1042 : :
1043 : 0 : if( !pAttrShape )
1044 : : {
1045 : : OSL_FAIL( "SlideImpl::applyInitialShapeAttributes(): shape found does not "
1046 : : "implement AttributableShape interface" );
1047 : 0 : continue;
1048 : : }
1049 : :
1050 : 0 : if( nParaIndex != -1 )
1051 : : {
1052 : : // our target is a paragraph subset, thus look
1053 : : // this up first.
1054 : 0 : const DocTreeNodeSupplier& rNodeSupplier( pAttrShape->getTreeNodeSupplier() );
1055 : :
1056 : 0 : if( rNodeSupplier.getNumberOfTreeNodes(
1057 : 0 : DocTreeNode::NODETYPE_LOGICAL_PARAGRAPH ) <= nParaIndex )
1058 : : {
1059 : : OSL_FAIL( "SlideImpl::applyInitialShapeAttributes(): shape found does not "
1060 : : "provide a subset for requested paragraph index" );
1061 : 0 : continue;
1062 : : }
1063 : :
1064 : 0 : pAttrShape = pAttrShape->getSubset(
1065 : : rNodeSupplier.getTreeNode(
1066 : : nParaIndex,
1067 : 0 : DocTreeNode::NODETYPE_LOGICAL_PARAGRAPH ) );
1068 : :
1069 : 0 : if( !pAttrShape )
1070 : : {
1071 : : OSL_FAIL( "SlideImpl::applyInitialShapeAttributes(): shape found does not "
1072 : : "provide a subset for requested paragraph index" );
1073 : 0 : continue;
1074 : : }
1075 : : }
1076 : :
1077 : 0 : const uno::Sequence< beans::NamedValue >& rShapeProps( aProps[i].Properties );
1078 : 0 : const ::std::size_t nShapePropSize( rShapeProps.getLength() );
1079 : 0 : for( ::std::size_t j=0; j<nShapePropSize; ++j )
1080 : : {
1081 : 0 : bool bVisible=false;
1082 : 0 : if( rShapeProps[j].Name.equalsIgnoreAsciiCaseAsciiL(RTL_CONSTASCII_STRINGPARAM("visibility")) &&
1083 : : extractValue( bVisible,
1084 : 0 : rShapeProps[j].Value,
1085 : : pShape,
1086 : 0 : ::basegfx::B2DSize( getSlideSize() ) ))
1087 : : {
1088 : 0 : pAttrShape->setVisibility( bVisible );
1089 : : }
1090 : : else
1091 : : {
1092 : : OSL_FAIL( "SlideImpl::applyInitialShapeAttributes(): Unexpected "
1093 : : "(and unimplemented) property encountered" );
1094 : : }
1095 : 0 : }
1096 : : }
1097 : 0 : }
1098 : :
1099 : 0 : meAnimationState = INITIAL_STATE;
1100 : :
1101 : 0 : return true;
1102 : : }
1103 : :
1104 : 0 : bool SlideImpl::loadShapes()
1105 : : {
1106 : 0 : if( mbShapesLoaded )
1107 : 0 : return true;
1108 : :
1109 : 0 : ENSURE_OR_RETURN_FALSE( mxDrawPage.is(),
1110 : : "SlideImpl::loadShapes(): Invalid draw page" );
1111 : 0 : ENSURE_OR_RETURN_FALSE( mpLayerManager,
1112 : : "SlideImpl::loadShapes(): Invalid layer manager" );
1113 : :
1114 : : // fetch desired page content
1115 : : // ==========================
1116 : :
1117 : : // also take master page content
1118 : 0 : uno::Reference< drawing::XDrawPage > xMasterPage;
1119 : 0 : uno::Reference< drawing::XShapes > xMasterPageShapes;
1120 : 0 : sal_Int32 nCurrCount(0);
1121 : :
1122 : : uno::Reference< drawing::XMasterPageTarget > xMasterPageTarget( mxDrawPage,
1123 : 0 : uno::UNO_QUERY );
1124 : 0 : if( xMasterPageTarget.is() )
1125 : : {
1126 : 0 : xMasterPage = xMasterPageTarget->getMasterPage();
1127 : : xMasterPageShapes.set( xMasterPage,
1128 : 0 : uno::UNO_QUERY );
1129 : :
1130 : 0 : if( xMasterPage.is() && xMasterPageShapes.is() )
1131 : : {
1132 : : // TODO(P2): maybe cache master pages here (or treat the
1133 : : // masterpage as a single metafile. At least currently,
1134 : : // masterpages do not contain animation effects)
1135 : : try
1136 : : {
1137 : : // load the masterpage shapes
1138 : : // -------------------------------------------------------------------------
1139 : : ShapeImporter aMPShapesFunctor( xMasterPage,
1140 : : mxDrawPage,
1141 : : mxDrawPagesSupplier,
1142 : : maContext,
1143 : : 0, /* shape num starts at 0 */
1144 : 0 : true );
1145 : :
1146 : : mpLayerManager->addShape(
1147 : 0 : aMPShapesFunctor.importBackgroundShape() );
1148 : :
1149 : 0 : while( !aMPShapesFunctor.isImportDone() )
1150 : : {
1151 : : ShapeSharedPtr const& rShape(
1152 : 0 : aMPShapesFunctor.importShape() );
1153 : 0 : if( rShape )
1154 : 0 : mpLayerManager->addShape( rShape );
1155 : 0 : }
1156 : 0 : addPolygons(aMPShapesFunctor.getPolygons());
1157 : :
1158 : 0 : nCurrCount = static_cast<sal_Int32>(aMPShapesFunctor.getImportedShapesCount());
1159 : : }
1160 : 0 : catch( uno::RuntimeException& )
1161 : : {
1162 : 0 : throw;
1163 : : }
1164 : 0 : catch( ShapeLoadFailedException& )
1165 : : {
1166 : : // TODO(E2): Error handling. For now, bail out
1167 : : OSL_FAIL( "SlideImpl::loadShapes(): caught ShapeLoadFailedException" );
1168 : 0 : return false;
1169 : :
1170 : : }
1171 : 0 : catch( uno::Exception& )
1172 : : {
1173 : : OSL_FAIL( rtl::OUStringToOString(
1174 : : comphelper::anyToString( cppu::getCaughtException() ),
1175 : : RTL_TEXTENCODING_UTF8 ).getStr() );
1176 : :
1177 : 0 : return false;
1178 : : }
1179 : : }
1180 : : }
1181 : :
1182 : : try
1183 : : {
1184 : : // load the normal page shapes
1185 : : // -------------------------------------------------------------------------
1186 : :
1187 : : ShapeImporter aShapesFunctor( mxDrawPage,
1188 : : mxDrawPage,
1189 : : mxDrawPagesSupplier,
1190 : : maContext,
1191 : : nCurrCount,
1192 : 0 : false );
1193 : :
1194 : 0 : while( !aShapesFunctor.isImportDone() )
1195 : : {
1196 : : ShapeSharedPtr const& rShape(
1197 : 0 : aShapesFunctor.importShape() );
1198 : 0 : if( rShape )
1199 : 0 : mpLayerManager->addShape( rShape );
1200 : 0 : }
1201 : 0 : addPolygons(aShapesFunctor.getPolygons());
1202 : : }
1203 : 0 : catch( uno::RuntimeException& )
1204 : : {
1205 : 0 : throw;
1206 : : }
1207 : 0 : catch( ShapeLoadFailedException& )
1208 : : {
1209 : : // TODO(E2): Error handling. For now, bail out
1210 : : OSL_FAIL( "SlideImpl::loadShapes(): caught ShapeLoadFailedException" );
1211 : 0 : return false;
1212 : : }
1213 : 0 : catch( uno::Exception& )
1214 : : {
1215 : : OSL_FAIL( rtl::OUStringToOString(
1216 : : comphelper::anyToString( cppu::getCaughtException() ),
1217 : : RTL_TEXTENCODING_UTF8 ).getStr() );
1218 : :
1219 : 0 : return false;
1220 : : }
1221 : :
1222 : 0 : mbShapesLoaded = true;
1223 : :
1224 : 0 : return true;
1225 : : }
1226 : :
1227 : 0 : basegfx::B2ISize SlideImpl::getSlideSizeImpl() const
1228 : : {
1229 : : uno::Reference< beans::XPropertySet > xPropSet(
1230 : 0 : mxDrawPage, uno::UNO_QUERY_THROW );
1231 : :
1232 : 0 : sal_Int32 nDocWidth = 0;
1233 : 0 : sal_Int32 nDocHeight = 0;
1234 : 0 : xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Width") ) ) >>= nDocWidth;
1235 : 0 : xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Height") ) ) >>= nDocHeight;
1236 : :
1237 : 0 : return basegfx::B2ISize( nDocWidth, nDocHeight );
1238 : : }
1239 : :
1240 : : } // namespace
1241 : :
1242 : :
1243 : 0 : SlideSharedPtr createSlide( const uno::Reference< drawing::XDrawPage >& xDrawPage,
1244 : : const uno::Reference<drawing::XDrawPagesSupplier>& xDrawPages,
1245 : : const uno::Reference< animations::XAnimationNode >& xRootNode,
1246 : : EventQueue& rEventQueue,
1247 : : EventMultiplexer& rEventMultiplexer,
1248 : : ScreenUpdater& rScreenUpdater,
1249 : : ActivitiesQueue& rActivitiesQueue,
1250 : : UserEventQueue& rUserEventQueue,
1251 : : CursorManager& rCursorManager,
1252 : : const UnoViewContainer& rViewContainer,
1253 : : const uno::Reference< uno::XComponentContext >& xComponentContext,
1254 : : const ShapeEventListenerMap& rShapeListenerMap,
1255 : : const ShapeCursorMap& rShapeCursorMap,
1256 : : const PolyPolygonVector& rPolyPolygonVector,
1257 : : RGBColor const& rUserPaintColor,
1258 : : double dUserPaintStrokeWidth,
1259 : : bool bUserPaintEnabled,
1260 : : bool bIntrinsicAnimationsAllowed,
1261 : : bool bDisableAnimationZOrder )
1262 : : {
1263 : : boost::shared_ptr<SlideImpl> pRet( new SlideImpl( xDrawPage, xDrawPages, xRootNode, rEventQueue,
1264 : : rEventMultiplexer, rScreenUpdater,
1265 : : rActivitiesQueue, rUserEventQueue,
1266 : : rCursorManager, rViewContainer,
1267 : : xComponentContext, rShapeListenerMap,
1268 : : rShapeCursorMap, rPolyPolygonVector, rUserPaintColor,
1269 : : dUserPaintStrokeWidth, bUserPaintEnabled,
1270 : : bIntrinsicAnimationsAllowed,
1271 : 0 : bDisableAnimationZOrder ));
1272 : :
1273 : 0 : rEventMultiplexer.addViewHandler( pRet );
1274 : :
1275 : 0 : return pRet;
1276 : : }
1277 : :
1278 : : } // namespace internal
1279 : 0 : } // namespace slideshow
1280 : :
1281 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|