2007/03/06 18:05:48 thb 1.1.2.4: #i37778# Fixed a few minor issues found during code review - thx to fs 2007/02/25 01:10:25 thb 1.1.2.3: #i37778# Cleared up error handling a lot: no longer quenching RuntimeExceptions; reporting assertions in the debug case; ViewLayer now reports resized sprite (which needs re-render from all shapes); fixed missing subset area reduction for glyph-level animations; added return of resize state from Layer::commitLayerBounds(); adapted unit tests to corrected behaviour 2007/01/29 14:53:39 thb 1.1.2.2: #i37778# Fixed gcc3.4 build breakages; merged in a few fixes from HEAD; added PCH stuff to new files 2007/01/29 14:02:03 thb 1.1.2.1: Issue number: #i37778# Larger slideshow refactoring. Wrote design and coding style manifest, and adapted the code to actually conform to this. In detail: - cleaned up ownership/disposable/weak_ptr story. removed hacks and explicit Disposable implementations, where workaround were available - removed object mutices, where superfluous - reworked EventMultiplexer (using templatized listener class now), added more events. EventMultiplexer now serves as a true blackboard - reworked directory structure: disjunct parts are now physically separated into directories, instantiation happens via factories & abstract interfaces - added CursorManager, to make setting mouse cursor less hackish - reworked DrawShape, to implement SeparateListener pattern - reworked IntrinsicAnimationActivity, to avoid cyclic references - modified hyperlink & shape cursor handling to communicate via EventMultiplexer - renamed & cleaned up files (presentation.cxx now named slideshowimpl.cxx, etc.) - added first version of the z-order fix to layer/layermanager - cleaned up include guards and include syntax
308 lines
12 KiB
C++
308 lines
12 KiB
C++
/*************************************************************************
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* $RCSfile: appletshape.cxx,v $
|
|
*
|
|
* $Revision: 1.2 $
|
|
*
|
|
* last change: $Author: obo $ $Date: 2007-07-17 14:50:53 $
|
|
*
|
|
* The Contents of this file are made available subject to
|
|
* the terms of GNU Lesser General Public License Version 2.1.
|
|
*
|
|
*
|
|
* GNU Lesser General Public License Version 2.1
|
|
* =============================================
|
|
* Copyright 2005 by Sun Microsystems, Inc.
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
* MA 02111-1307 USA
|
|
*
|
|
************************************************************************/
|
|
|
|
// 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 <boost/shared_ptr.hpp>
|
|
|
|
#include "appletshape.hxx"
|
|
#include "externalshapebase.hxx"
|
|
#include "vieweventhandler.hxx"
|
|
#include "viewappletshape.hxx"
|
|
#include "tools.hxx"
|
|
|
|
#include <boost/bind.hpp>
|
|
#include <algorithm>
|
|
|
|
|
|
using namespace ::com::sun::star;
|
|
|
|
|
|
namespace slideshow
|
|
{
|
|
namespace internal
|
|
{
|
|
/** Represents an applet shape.
|
|
|
|
This implementation offers support for applet shapes (both
|
|
Java applets, and Netscape plugins). Such shapes need
|
|
special treatment.
|
|
*/
|
|
class AppletShape : public ExternalShapeBase
|
|
{
|
|
public:
|
|
/** Create a shape for the given XShape for a applet object
|
|
|
|
@param xShape
|
|
The XShape to represent.
|
|
|
|
@param nPrio
|
|
Externally-determined shape priority (used e.g. for
|
|
paint ordering). This number _must be_ unique!
|
|
|
|
@param rServiceName
|
|
Service name to use, when creating the actual viewer
|
|
component
|
|
|
|
@param pPropCopyTable
|
|
Table of plain ASCII property names, to copy from
|
|
xShape to applet.
|
|
|
|
@param nNumPropEntries
|
|
Number of property table entries (in pPropCopyTable)
|
|
*/
|
|
AppletShape( const ::com::sun::star::uno::Reference<
|
|
::com::sun::star::drawing::XShape >& xShape,
|
|
double nPrio,
|
|
const ::rtl::OUString& rServiceName,
|
|
const char** pPropCopyTable,
|
|
sal_Size nNumPropEntries,
|
|
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();
|
|
|
|
const ::rtl::OUString maServiceName;
|
|
const char** mpPropCopyTable;
|
|
const sal_Size mnNumPropEntries;
|
|
|
|
/// the list of active view shapes (one for each registered view layer)
|
|
typedef ::std::vector< ViewAppletShapeSharedPtr > ViewAppletShapeVector;
|
|
ViewAppletShapeVector maViewAppletShapes;
|
|
};
|
|
|
|
AppletShape::AppletShape( const uno::Reference< drawing::XShape >& xShape,
|
|
double nPrio,
|
|
const ::rtl::OUString& rServiceName,
|
|
const char** pPropCopyTable,
|
|
sal_Size nNumPropEntries,
|
|
const SlideShowContext& rContext ) :
|
|
ExternalShapeBase( xShape, nPrio, rContext ),
|
|
maServiceName( rServiceName ),
|
|
mpPropCopyTable( pPropCopyTable ),
|
|
mnNumPropEntries( nNumPropEntries ),
|
|
maViewAppletShapes()
|
|
{
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
void AppletShape::implViewChanged( const UnoViewSharedPtr& rView )
|
|
{
|
|
// determine ViewAppletShape that needs update
|
|
ViewAppletShapeVector::const_iterator aIter(maViewAppletShapes.begin());
|
|
ViewAppletShapeVector::const_iterator const aEnd (maViewAppletShapes.end());
|
|
while( aIter != aEnd )
|
|
{
|
|
if( (*aIter)->getViewLayer()->isOnView(rView) )
|
|
(*aIter)->resize(getBounds());
|
|
|
|
++aIter;
|
|
}
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
void AppletShape::implViewsChanged()
|
|
{
|
|
// resize all ViewShapes
|
|
::std::for_each( maViewAppletShapes.begin(),
|
|
maViewAppletShapes.end(),
|
|
::boost::bind(
|
|
&ViewAppletShape::resize,
|
|
_1,
|
|
::boost::cref( AppletShape::getBounds())) );
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
void AppletShape::addViewLayer( const ViewLayerSharedPtr& rNewLayer,
|
|
bool bRedrawLayer )
|
|
{
|
|
try
|
|
{
|
|
maViewAppletShapes.push_back(
|
|
ViewAppletShapeSharedPtr( new ViewAppletShape( rNewLayer,
|
|
getXShape(),
|
|
maServiceName,
|
|
mpPropCopyTable,
|
|
mnNumPropEntries,
|
|
mxComponentContext )));
|
|
|
|
// push new size to view shape
|
|
maViewAppletShapes.back()->resize( getBounds() );
|
|
|
|
// render the Shape on the newly added ViewLayer
|
|
if( bRedrawLayer )
|
|
maViewAppletShapes.back()->render( getBounds() );
|
|
}
|
|
catch(uno::Exception&)
|
|
{
|
|
// ignore failed shapes - slideshow should run with
|
|
// the remaining content
|
|
}
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
bool AppletShape::removeViewLayer( const ViewLayerSharedPtr& rLayer )
|
|
{
|
|
const ViewAppletShapeVector::iterator aEnd( maViewAppletShapes.end() );
|
|
|
|
OSL_ENSURE( ::std::count_if(maViewAppletShapes.begin(),
|
|
aEnd,
|
|
::boost::bind<bool>(
|
|
::std::equal_to< ViewLayerSharedPtr >(),
|
|
::boost::bind( &ViewAppletShape::getViewLayer, _1 ),
|
|
::boost::cref( rLayer ) ) ) < 2,
|
|
"AppletShape::removeViewLayer(): Duplicate ViewLayer entries!" );
|
|
|
|
ViewAppletShapeVector::iterator aIter;
|
|
|
|
if( (aIter=::std::remove_if( maViewAppletShapes.begin(),
|
|
aEnd,
|
|
::boost::bind<bool>(
|
|
::std::equal_to< ViewLayerSharedPtr >(),
|
|
::boost::bind( &ViewAppletShape::getViewLayer,
|
|
_1 ),
|
|
::boost::cref( rLayer ) ) )) == aEnd )
|
|
{
|
|
// view layer seemingly was not added, failed
|
|
return false;
|
|
}
|
|
|
|
// actually erase from container
|
|
maViewAppletShapes.erase( aIter, aEnd );
|
|
|
|
return true;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
bool AppletShape::clearAllViewLayers()
|
|
{
|
|
maViewAppletShapes.clear();
|
|
return true;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
bool AppletShape::implRender( const ::basegfx::B2DRange& rCurrBounds ) const
|
|
{
|
|
// redraw all view shapes, by calling their update() method
|
|
if( ::std::count_if( maViewAppletShapes.begin(),
|
|
maViewAppletShapes.end(),
|
|
::boost::bind<bool>(
|
|
::boost::mem_fn( &ViewAppletShape::render ),
|
|
_1,
|
|
::boost::cref( rCurrBounds ) ) )
|
|
!= static_cast<ViewAppletShapeVector::difference_type>(maViewAppletShapes.size()) )
|
|
{
|
|
// at least one of the ViewShape::update() calls did return
|
|
// false - update failed on at least one ViewLayer
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
bool AppletShape::implStartIntrinsicAnimation()
|
|
{
|
|
::std::for_each( maViewAppletShapes.begin(),
|
|
maViewAppletShapes.end(),
|
|
::boost::bind( &ViewAppletShape::startApplet,
|
|
_1,
|
|
::boost::cref( getBounds() )));
|
|
|
|
return true;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
bool AppletShape::implEndIntrinsicAnimation()
|
|
{
|
|
::std::for_each( maViewAppletShapes.begin(),
|
|
maViewAppletShapes.end(),
|
|
::boost::mem_fn( &ViewAppletShape::endApplet ) );
|
|
|
|
return true;
|
|
}
|
|
|
|
boost::shared_ptr<Shape> createAppletShape(
|
|
const uno::Reference< drawing::XShape >& xShape,
|
|
double nPrio,
|
|
const ::rtl::OUString& rServiceName,
|
|
const char** pPropCopyTable,
|
|
sal_Size nNumPropEntries,
|
|
const SlideShowContext& rContext )
|
|
{
|
|
boost::shared_ptr< AppletShape > pAppletShape(
|
|
new AppletShape(xShape,
|
|
nPrio,
|
|
rServiceName,
|
|
pPropCopyTable,
|
|
nNumPropEntries,
|
|
rContext) );
|
|
|
|
return pAppletShape;
|
|
}
|
|
}
|
|
}
|