/************************************************************************* * * 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ #include "box.hxx" #include #include #include // 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: 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