Files
libreoffice/toolkit/source/layout/timer.cxx
Kurt Zenker 672dde158f INTEGRATION: CWS layout_DEV300 (1.1.2); FILE ADDED
2008/02/08 18:44:44 jcn 1.1.2.1: Initial toolkit import from ee9a2fcc29d7e2f01cc80ef7c13bf7bc7d55ae7e.

    layout/source/awt -> toolkit/source/awt
    layout/source/core -> toolkit/source/layout
    layout/source/wrapper -> toolkit/source/vclcompat
    layout/inc/layout -> toolkit/inc/layout
    layout/source/inc -> toolkit/inc/layout
    layout/workben -> toolkit/workben/layout

That's ooo-build trunk r11539 @ ooh680-m5/src680-m245.
2008-03-06 10:48:47 +00:00

122 lines
3.5 KiB
C++

#include "timer.hxx"
#include <vector>
#include <list>
#include <vcl/timer.hxx>
#include <com/sun/star/awt/XLayoutContainer.hpp>
namespace layoutimpl
{
using namespace ::com::sun::star;
class AllocateTimer : public Timer
{
typedef std::list< uno::Reference< awt::XLayoutContainer > > ContainerList;
ContainerList mxContainers;
uno::Reference< awt::XLayoutContainer > mxLastAdded;
public:
AllocateTimer()
{
// timer set to 0 -- just process it as soon as it gets idle
SetTimeout( 0 );
}
static inline bool isParentOf( uno::Reference< awt::XLayoutContainer > xParent,
uno::Reference< awt::XLayoutContainer > xWidget )
{
while ( xWidget.is() )
{
if ( xWidget == xParent )
return true;
xWidget = uno::Reference< awt::XLayoutContainer >( xWidget->getParent(), uno::UNO_QUERY );
}
return false;
}
static inline void eraseChildren( ContainerList::iterator &it, ContainerList &list )
{
ContainerList::iterator jt = list.begin();
while ( jt != list.end() )
{
if ( it != jt && isParentOf( *it, *jt ) )
jt = list.erase( jt );
else
jt++;
}
}
static inline bool isContainerDamaged( uno::Reference< awt::XLayoutContainer > xContainer )
{
uno::Reference< awt::XLayoutConstrains > xConstrains( xContainer, uno::UNO_QUERY );
awt::Size lastReq( xContainer->getRequestedSize() );
awt::Size curReq( xConstrains->getMinimumSize() );
return lastReq.Width != curReq.Width || lastReq.Height != curReq.Height;
}
void add( const uno::Reference< awt::XLayoutContainer > &xContainer )
{
// small optimization
if ( mxLastAdded == xContainer )
return;
mxLastAdded = xContainer;
mxContainers.push_back( xContainer );
}
virtual void Timeout()
{
mxLastAdded = uno::Reference< awt::XLayoutContainer >();
// 1. remove duplications and children
for( ContainerList::iterator it = mxContainers.begin();
it != mxContainers.end(); it++ )
eraseChildren( it, mxContainers );
// 2. check damage extent
for( ContainerList::iterator it = mxContainers.begin();
it != mxContainers.end(); it++ )
{
uno::Reference< awt::XLayoutContainer > xContainer = *it;
while ( xContainer->getParent().is() && isContainerDamaged( xContainer ) )
{
xContainer = uno::Reference< awt::XLayoutContainer >(
xContainer->getParent(), uno::UNO_QUERY );
}
if ( *it != xContainer )
{
// 2.2 replace it with parent
*it = xContainer;
// 2.3 remove children of new parent
eraseChildren( it, mxContainers );
}
}
// 3. force re-calculations
for( ContainerList::iterator it = mxContainers.begin();
it != mxContainers.end(); it++ )
(*it)->allocateArea( (*it)->getAllocatedArea() );
}
};
static void AddResizeTimeout( const uno::Reference< awt::XLayoutContainer > &xCont )
{
static AllocateTimer timer;
timer.add( xCont );
timer.Start();
}
LayoutUnit::LayoutUnit() : LayoutUnit_Base()
{
}
void SAL_CALL LayoutUnit::queueResize( const uno::Reference< awt::XLayoutContainer > &xContainer )
throw( uno::RuntimeException )
{
AddResizeTimeout( xContainer );
}
}