/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the 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(); if (!aChildren.getLength ()) if (Container *c = dynamic_cast (xWidget.get ())) return c->emptyVisible (); 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 Box_Base::AddChild (uno::Reference const& xChild) { ChildData *pData = createChild (xChild); maChildren.push_back (pData); queueResize (); } void SAL_CALL Box_Base::addChild (uno::Reference const& xChild) throw (uno::RuntimeException, awt::MaxChildrenException) { if (xChild.is ()) { AddChild (xChild); setChildParent (xChild); } } 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 ) { ChildData* pRet = *it; lst.erase( it ); return pRet; } } 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