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.
122 lines
3.5 KiB
C++
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 );
|
|
}
|
|
|
|
}
|