diff options
author | Rüdiger Timm <rt@openoffice.org> | 2008-07-30 12:58:36 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2008-07-30 12:58:36 +0000 |
commit | af63c52a68ad07b19327e898a8b07a6e3788874d (patch) | |
tree | 2a9aa1dc42acbabfbe07b921d4ed4403d5a934b2 /toolkit | |
parent | 5c7418b95a6e25f2b410411e4ad478912b7892dc (diff) |
INTEGRATION: CWS layoutdialogs (1.1.2); FILE ADDED
2008/07/30 11:13:57 rt 1.1.2.2: Update license header.
2008/03/21 07:47:07 jcn 1.1.2.1: Oops, add missing box-base.
Diffstat (limited to 'toolkit')
-rw-r--r-- | toolkit/source/layout/box-base.cxx | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/toolkit/source/layout/box-base.cxx b/toolkit/source/layout/box-base.cxx new file mode 100644 index 000000000000..7addc617a511 --- /dev/null +++ b/toolkit/source/layout/box-base.cxx @@ -0,0 +1,170 @@ +/************************************************************************* + * + * 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 |