blob: be82407dad486422eeafa519a684aac1a59b451f [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_slideshow.hxx"
// must be first
#include <canvas/debug.hxx>
#include <canvas/verbosetrace.hxx>
#include <canvas/canvastools.hxx>
#include <com/sun/star/drawing/XShape.hpp>
#include "mediashape.hxx"
#include "viewmediashape.hxx"
#include "externalshapebase.hxx"
#include "slideshowcontext.hxx"
#include "shape.hxx"
#include "tools.hxx"
#include <boost/bind.hpp>
#include <algorithm>
using namespace ::com::sun::star;
namespace slideshow
{
namespace internal
{
/** Represents a media shape.
This implementation offers support for media shapes.
Such shapes need special treatment.
*/
class MediaShape : public ExternalShapeBase
{
public:
/** Create a shape for the given XShape for a media object
@param xShape
The XShape to represent.
@param nPrio
Externally-determined shape priority (used e.g. for
paint ordering). This number _must be_ unique!
*/
MediaShape( const ::com::sun::star::uno::Reference<
::com::sun::star::drawing::XShape >& xShape,
double nPrio,
const SlideShowContext& rContext ); // throw ShapeLoadFailedException;
private:
// View layer methods
//------------------------------------------------------------------
virtual void addViewLayer( const ViewLayerSharedPtr& rNewLayer,
bool bRedrawLayer );
virtual bool removeViewLayer( const ViewLayerSharedPtr& rNewLayer );
virtual bool clearAllViewLayers();
// ExternalShapeBase methods
//------------------------------------------------------------------
virtual bool implRender( const ::basegfx::B2DRange& rCurrBounds ) const;
virtual void implViewChanged( const UnoViewSharedPtr& rView );
virtual void implViewsChanged();
virtual bool implStartIntrinsicAnimation();
virtual bool implEndIntrinsicAnimation();
virtual bool implPauseIntrinsicAnimation();
virtual bool implIsIntrinsicAnimationPlaying() const;
virtual void implSetIntrinsicAnimationTime(double);
/// the list of active view shapes (one for each registered view layer)
typedef ::std::vector< ViewMediaShapeSharedPtr > ViewMediaShapeVector;
ViewMediaShapeVector maViewMediaShapes;
bool mbIsPlaying;
};
MediaShape::MediaShape( const uno::Reference< drawing::XShape >& xShape,
double nPrio,
const SlideShowContext& rContext ) :
ExternalShapeBase( xShape, nPrio, rContext ),
maViewMediaShapes(),
mbIsPlaying(false)
{
}
// ---------------------------------------------------------------------
void MediaShape::implViewChanged( const UnoViewSharedPtr& rView )
{
// determine ViewMediaShape that needs update
ViewMediaShapeVector::const_iterator aIter(maViewMediaShapes.begin());
ViewMediaShapeVector::const_iterator const aEnd (maViewMediaShapes.end());
while( aIter != aEnd )
{
if( (*aIter)->getViewLayer()->isOnView(rView) )
(*aIter)->resize(getBounds());
++aIter;
}
}
// ---------------------------------------------------------------------
void MediaShape::implViewsChanged()
{
// resize all ViewShapes
::std::for_each( maViewMediaShapes.begin(),
maViewMediaShapes.end(),
::boost::bind(
&ViewMediaShape::resize,
_1,
::boost::cref( getBounds())) );
}
// ---------------------------------------------------------------------
void MediaShape::addViewLayer( const ViewLayerSharedPtr& rNewLayer,
bool bRedrawLayer )
{
maViewMediaShapes.push_back(
ViewMediaShapeSharedPtr( new ViewMediaShape( rNewLayer,
getXShape(),
mxComponentContext )));
// push new size to view shape
maViewMediaShapes.back()->resize( getBounds() );
// render the Shape on the newly added ViewLayer
if( bRedrawLayer )
maViewMediaShapes.back()->render( getBounds() );
}
// ---------------------------------------------------------------------
bool MediaShape::removeViewLayer( const ViewLayerSharedPtr& rLayer )
{
const ViewMediaShapeVector::iterator aEnd( maViewMediaShapes.end() );
OSL_ENSURE( ::std::count_if(maViewMediaShapes.begin(),
aEnd,
::boost::bind<bool>(
::std::equal_to< ViewLayerSharedPtr >(),
::boost::bind( &ViewMediaShape::getViewLayer, _1 ),
::boost::cref( rLayer ) ) ) < 2,
"MediaShape::removeViewLayer(): Duplicate ViewLayer entries!" );
ViewMediaShapeVector::iterator aIter;
if( (aIter=::std::remove_if( maViewMediaShapes.begin(),
aEnd,
::boost::bind<bool>(
::std::equal_to< ViewLayerSharedPtr >(),
::boost::bind( &ViewMediaShape::getViewLayer,
_1 ),
::boost::cref( rLayer ) ) )) == aEnd )
{
// view layer seemingly was not added, failed
return false;
}
// actually erase from container
maViewMediaShapes.erase( aIter, aEnd );
return true;
}
// ---------------------------------------------------------------------
bool MediaShape::clearAllViewLayers()
{
maViewMediaShapes.clear();
return true;
}
// ---------------------------------------------------------------------
bool MediaShape::implRender( const ::basegfx::B2DRange& rCurrBounds ) const
{
// redraw all view shapes, by calling their update() method
if( ::std::count_if( maViewMediaShapes.begin(),
maViewMediaShapes.end(),
::boost::bind<bool>(
::boost::mem_fn( &ViewMediaShape::render ),
_1,
::boost::cref( rCurrBounds ) ) )
!= static_cast<ViewMediaShapeVector::difference_type>(maViewMediaShapes.size()) )
{
// at least one of the ViewShape::update() calls did return
// false - update failed on at least one ViewLayer
return false;
}
return true;
}
// ---------------------------------------------------------------------
bool MediaShape::implStartIntrinsicAnimation()
{
::std::for_each( maViewMediaShapes.begin(),
maViewMediaShapes.end(),
::boost::mem_fn( &ViewMediaShape::startMedia ) );
mbIsPlaying = true;
return true;
}
// ---------------------------------------------------------------------
bool MediaShape::implEndIntrinsicAnimation()
{
::std::for_each( maViewMediaShapes.begin(),
maViewMediaShapes.end(),
::boost::mem_fn( &ViewMediaShape::endMedia ) );
mbIsPlaying = false;
return true;
}
// ---------------------------------------------------------------------
bool MediaShape::implPauseIntrinsicAnimation()
{
::std::for_each( maViewMediaShapes.begin(),
maViewMediaShapes.end(),
::boost::mem_fn( &ViewMediaShape::pauseMedia ) );
mbIsPlaying = false;
return true;
}
// ---------------------------------------------------------------------
bool MediaShape::implIsIntrinsicAnimationPlaying() const
{
return mbIsPlaying;
}
// ---------------------------------------------------------------------
void MediaShape::implSetIntrinsicAnimationTime(double fTime)
{
::std::for_each( maViewMediaShapes.begin(),
maViewMediaShapes.end(),
::boost::bind( &ViewMediaShape::setMediaTime,
_1, boost::cref(fTime)) );
}
// ---------------------------------------------------------------------
ShapeSharedPtr createMediaShape(
const uno::Reference< drawing::XShape >& xShape,
double nPrio,
const SlideShowContext& rContext)
{
boost::shared_ptr< MediaShape > pMediaShape(
new MediaShape(xShape, nPrio, rContext));
return pMediaShape;
}
}
}