blob: 8d5d28338975d23bf721c5e3eec32c5064726dc9 [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 <tools/diagnose_ex.h>
#include <canvas/verbosetrace.hxx>
#include <comphelper/anytostring.hxx>
#include <cppuhelper/exc_hlp.hxx>
#include "externalshapebase.hxx"
#include "eventmultiplexer.hxx"
#include "vieweventhandler.hxx"
#include "intrinsicanimationeventhandler.hxx"
#include "tools.hxx"
#include <boost/noncopyable.hpp>
using namespace ::com::sun::star;
namespace slideshow
{
namespace internal
{
class ExternalShapeBase::ExternalShapeBaseListener : public ViewEventHandler,
public IntrinsicAnimationEventHandler,
private boost::noncopyable
{
public:
explicit ExternalShapeBaseListener( ExternalShapeBase& rBase ) :
mrBase( rBase )
{}
private:
// ViewEventHandler
// -------------------------------------------------
virtual void viewAdded( const UnoViewSharedPtr& ) {}
virtual void viewRemoved( const UnoViewSharedPtr& ) {}
virtual void viewChanged( const UnoViewSharedPtr& rView )
{
mrBase.implViewChanged(rView);
}
virtual void viewsChanged()
{
mrBase.implViewsChanged();
}
// IntrinsicAnimationEventHandler
// -------------------------------------------------
virtual bool enableAnimations()
{
return mrBase.implStartIntrinsicAnimation();
}
virtual bool disableAnimations()
{
return mrBase.implEndIntrinsicAnimation();
}
ExternalShapeBase& mrBase;
};
ExternalShapeBase::ExternalShapeBase( const uno::Reference< drawing::XShape >& xShape,
double nPrio,
const SlideShowContext& rContext ) :
mxComponentContext( rContext.mxComponentContext ),
mxShape( xShape ),
mpListener( new ExternalShapeBaseListener(*this) ),
mpShapeManager( rContext.mpSubsettableShapeManager ),
mrEventMultiplexer( rContext.mrEventMultiplexer ),
mnPriority( nPrio ), // TODO(F1): When ZOrder someday becomes usable: make this ( getAPIShapePrio( xShape ) ),
maBounds( getAPIShapeBounds( xShape ) )
{
ENSURE_OR_THROW( mxShape.is(), "ExternalShapeBase::ExternalShapeBase(): Invalid XShape" );
mpShapeManager->addIntrinsicAnimationHandler( mpListener );
mrEventMultiplexer.addViewHandler( mpListener );
}
// ---------------------------------------------------------------------
ExternalShapeBase::~ExternalShapeBase()
{
try
{
mrEventMultiplexer.removeViewHandler( mpListener );
mpShapeManager->removeIntrinsicAnimationHandler( mpListener );
}
catch (uno::Exception &)
{
OSL_ENSURE( false, rtl::OUStringToOString(
comphelper::anyToString(
cppu::getCaughtException() ),
RTL_TEXTENCODING_UTF8 ).getStr() );
}
}
// ---------------------------------------------------------------------
uno::Reference< drawing::XShape > ExternalShapeBase::getXShape() const
{
return mxShape;
}
// ---------------------------------------------------------------------
void ExternalShapeBase::play()
{
implStartIntrinsicAnimation();
}
// ---------------------------------------------------------------------
void ExternalShapeBase::stop()
{
implEndIntrinsicAnimation();
}
// ---------------------------------------------------------------------
void ExternalShapeBase::pause()
{
implPauseIntrinsicAnimation();
}
// ---------------------------------------------------------------------
bool ExternalShapeBase::isPlaying() const
{
return implIsIntrinsicAnimationPlaying();
}
// ---------------------------------------------------------------------
void ExternalShapeBase::setMediaTime(double fTime)
{
implSetIntrinsicAnimationTime(fTime);
}
// ---------------------------------------------------------------------
bool ExternalShapeBase::update() const
{
return render();
}
// ---------------------------------------------------------------------
bool ExternalShapeBase::render() const
{
if( maBounds.getRange().equalZero() )
{
// zero-sized shapes are effectively invisible,
// thus, we save us the rendering...
return true;
}
return implRender( maBounds );
}
// ---------------------------------------------------------------------
bool ExternalShapeBase::isContentChanged() const
{
return true;
}
// ---------------------------------------------------------------------
::basegfx::B2DRectangle ExternalShapeBase::getBounds() const
{
return maBounds;
}
// ---------------------------------------------------------------------
::basegfx::B2DRectangle ExternalShapeBase::getDomBounds() const
{
return maBounds;
}
// ---------------------------------------------------------------------
::basegfx::B2DRectangle ExternalShapeBase::getUpdateArea() const
{
return maBounds;
}
// ---------------------------------------------------------------------
bool ExternalShapeBase::isVisible() const
{
return true;
}
// ---------------------------------------------------------------------
double ExternalShapeBase::getPriority() const
{
return mnPriority;
}
// ---------------------------------------------------------------------
bool ExternalShapeBase::isBackgroundDetached() const
{
// external shapes always have their own window/surface
return true;
}
}
}