171 lines
4.8 KiB
C++
171 lines
4.8 KiB
C++
![]() |
/*************************************************************************
|
||
|
*
|
||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||
|
*
|
||
|
* Copyright 2008 by Sun Microsystems, Inc.
|
||
|
*
|
||
|
* OpenOffice.org - a multi-platform office productivity suite
|
||
|
*
|
||
|
* $RCSfile: box-base.cxx,v $
|
||
|
*
|
||
|
* $Revision: 1.2 $
|
||
|
*
|
||
|
* This file is part of OpenOffice.org.
|
||
|
*
|
||
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU Lesser General Public License version 3
|
||
|
* only, as published by the Free Software Foundation.
|
||
|
*
|
||
|
* OpenOffice.org 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 version 3 for more details
|
||
|
* (a copy is included in the LICENSE file that accompanied this code).
|
||
|
*
|
||
|
* You should have received a copy of the GNU Lesser General Public License
|
||
|
* version 3 along with OpenOffice.org. If not, see
|
||
|
* <http://www.openoffice.org/license.html>
|
||
|
* for a copy of the LGPLv3 License.
|
||
|
*
|
||
|
************************************************************************/
|
||
|
|
||
|
#include "box.hxx"
|
||
|
|
||
|
#include <tools/debug.hxx>
|
||
|
#include <sal/macros.h>
|
||
|
|
||
|
#include <com/sun/star/awt/XWindow2.hpp>
|
||
|
|
||
|
// fixed point precision for distributing error
|
||
|
#define FIXED_PT 16
|
||
|
|
||
|
namespace layoutimpl
|
||
|
{
|
||
|
|
||
|
using namespace css;
|
||
|
|
||
|
Box_Base::ChildData::ChildData( uno::Reference< awt::XLayoutConstrains > const& xChild )
|
||
|
: mxChild( xChild )
|
||
|
, mxProps()
|
||
|
, maRequisition()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
static bool isVisible( uno::Reference< awt::XLayoutConstrains > xWidget )
|
||
|
{
|
||
|
if ( !xWidget.is() )
|
||
|
{
|
||
|
DBG_ERROR( "FIXME: invalid child !" );
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
uno::Reference< awt::XWindow2 > xWindow( xWidget, uno::UNO_QUERY );
|
||
|
if ( xWindow.is() && !xWindow->isVisible() )
|
||
|
return false;
|
||
|
|
||
|
uno::Reference< awt::XLayoutContainer > xContainer( xWidget, uno::UNO_QUERY );
|
||
|
if ( xContainer.is() )
|
||
|
{
|
||
|
uno::Sequence< uno::Reference< awt::XLayoutConstrains > > aChildren
|
||
|
= xContainer->getChildren();
|
||
|
|
||
|
// FIXME: <flow> workaround: empty visible containers always visible:
|
||
|
if ( !aChildren.getLength() )
|
||
|
return true;
|
||
|
|
||
|
for ( int i = 0; i < aChildren.getLength(); i++ )
|
||
|
if ( isVisible( aChildren[i] ) )
|
||
|
return true;
|
||
|
return false; // this would kill flow without workaround above
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool Box_Base::ChildData::isVisible()
|
||
|
{
|
||
|
// FIXME: call the 'isVisible' method on it ?
|
||
|
return layoutimpl::isVisible( mxChild );
|
||
|
}
|
||
|
|
||
|
void SAL_CALL
|
||
|
Box_Base::addChild( const uno::Reference< awt::XLayoutConstrains >& xChild )
|
||
|
throw (uno::RuntimeException, awt::MaxChildrenException)
|
||
|
{
|
||
|
if ( xChild.is() )
|
||
|
{
|
||
|
ChildData *pData = createChild( xChild );
|
||
|
maChildren.push_back( pData );
|
||
|
setChildParent( xChild );
|
||
|
queueResize();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Box_Base::ChildData*
|
||
|
Box_Base::removeChildData( std::list< ChildData* > lst, css::uno::Reference< css::awt::XLayoutConstrains > const& xChild )
|
||
|
{
|
||
|
for ( std::list< ChildData* >::iterator it = lst.begin();
|
||
|
it != lst.end(); it++ )
|
||
|
{
|
||
|
if ( (*it)->mxChild == xChild )
|
||
|
{
|
||
|
lst.erase( it );
|
||
|
return *it;
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void SAL_CALL
|
||
|
Box_Base::removeChild( const uno::Reference< awt::XLayoutConstrains >& xChild )
|
||
|
throw (uno::RuntimeException)
|
||
|
{
|
||
|
if ( ChildData* p = removeChildData( maChildren, xChild ) )
|
||
|
{
|
||
|
delete p;
|
||
|
unsetChildParent( xChild );
|
||
|
queueResize();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DBG_ERROR( "Box_Base: removeChild: no such child" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
uno::Sequence< uno::Reference < awt::XLayoutConstrains > > SAL_CALL
|
||
|
Box_Base::getChildren()
|
||
|
throw (uno::RuntimeException)
|
||
|
{
|
||
|
uno::Sequence< uno::Reference< awt::XLayoutConstrains > > children( maChildren.size() );
|
||
|
unsigned int index = 0;
|
||
|
for ( std::list< ChildData* >::iterator it = maChildren.begin();
|
||
|
it != maChildren.end(); it++, index++ )
|
||
|
children[index] = ( *it )->mxChild;
|
||
|
|
||
|
return children;
|
||
|
}
|
||
|
|
||
|
uno::Reference< beans::XPropertySet > SAL_CALL
|
||
|
Box_Base::getChildProperties( const uno::Reference< awt::XLayoutConstrains >& xChild )
|
||
|
throw (uno::RuntimeException)
|
||
|
{
|
||
|
|
||
|
for ( std::list< ChildData * >::iterator it = maChildren.begin();
|
||
|
it != maChildren.end(); it++)
|
||
|
{
|
||
|
if ( ( *it )->mxChild == xChild )
|
||
|
{
|
||
|
if ( !( *it )->mxProps.is() )
|
||
|
{
|
||
|
PropHelper *pProps = createChildProps( *it );
|
||
|
pProps->setChangeListener( this );
|
||
|
( *it )->mxProps = pProps;
|
||
|
}
|
||
|
return (*it)->mxProps;
|
||
|
}
|
||
|
}
|
||
|
return uno::Reference< beans::XPropertySet >();
|
||
|
}
|
||
|
|
||
|
} // namespace layoutimpl
|