diff options
Diffstat (limited to 'toolkit/source/layout/root.cxx')
-rw-r--r-- | toolkit/source/layout/root.cxx | 329 |
1 files changed, 329 insertions, 0 deletions
diff --git a/toolkit/source/layout/root.cxx b/toolkit/source/layout/root.cxx new file mode 100644 index 000000000000..47488a0213e8 --- /dev/null +++ b/toolkit/source/layout/root.cxx @@ -0,0 +1,329 @@ +#include "root.hxx" + +#include <assert.h> +#include <com/sun/star/xml/sax/XParser.hpp> + +#include "helper.hxx" +#include "import.hxx" +#include "timer.hxx" +#include "translate.hxx" + +namespace layoutimpl +{ + +using namespace css; +using ::rtl::OUString; + +LayoutRoot::LayoutRoot( const uno::Reference< lang::XMultiServiceFactory >& xFactory ) + : mbDisposed( sal_False ) + , mxFactory( xFactory ) + , mpListeners( NULL ) + , mpToplevel( NULL ) +{ + if ( !xFactory.is() ) + throw uno::RuntimeException(); + mxLayoutUnit = uno::Reference< awt::XLayoutUnit >( new LayoutUnit() ); +} + +LayoutRoot::~LayoutRoot() +{ +// TODO: we want to delete the top level LayoutWidget... + ::osl::MutexGuard aGuard( maMutex ); + if ( !mbDisposed ) + { + try + { + m_refCount++; // inhibit multiple destruction + dispose(); + } + catch( uno::Exception& ) + { + } + } +} + +// XInitialization +void SAL_CALL LayoutRoot::initialize( const uno::Sequence< uno::Any >& aArguments ) + throw ( uno::Exception, + uno::RuntimeException ) +{ + ::osl::MutexGuard aGuard( maMutex ); + + if ( mbDisposed ) + throw lang::DisposedException(); + + if ( mxContainer.is() ) // only 1 init ... + throw uno::Exception(); + + if ( !aArguments.getLength() ) + throw lang::IllegalArgumentException(); + + OSL_ENSURE( aArguments.getLength() == 1, "Wrong arg count\n" ); + + OUString aXMLName; + if ( !( aArguments[0] >>= aXMLName ) ) + throw lang::IllegalArgumentException(); + + uno::Reference< xml::sax::XParser > xParser + ( mxFactory->createInstance( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Parser" ) ) ), + uno::UNO_QUERY ); + OSL_ASSERT( xParser.is() ); + if (! xParser.is()) + { + throw uno::RuntimeException( + OUString( RTL_CONSTASCII_USTRINGPARAM( "cannot create sax-parser component" ) ), + uno::Reference< uno::XInterface >() ); + } + + OUString aXMLFile = readRightTranslation( aXMLName ); + + uno::Reference< io::XInputStream > xStream = getFileAsStream( mxFactory, + aXMLFile ); + + // error handler, entity resolver omitted + + // FIXME: quite possibly we want to pass this in ... + uno::Reference< awt::XToolkit > xToolkit; + + mxToolkit = uno::Reference< awt::XToolkit >( + mxFactory->createInstance( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.Toolkit" ) ) ), + uno::UNO_QUERY ); + + if ( !mxToolkit.is() ) + throw uno::RuntimeException( + OUString( RTL_CONSTASCII_USTRINGPARAM( "failed to create toolkit!" ) ), + uno::Reference< uno::XInterface >() ); + + ImportContext *pCtx = new ImportContext( *this ); + + uno::Reference< xml::input::XRoot > xRoot( pCtx ); + uno::Sequence < uno::Any > aArgs( 1 ); + aArgs[0] <<= xRoot; + uno::Reference< xml::sax::XDocumentHandler > xDocHandler + (mxFactory->createInstanceWithArguments + ( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.input.SaxDocumentHandler" ) ), + aArgs ), uno::UNO_QUERY ); + + xParser->setDocumentHandler( xDocHandler ); + + xml::sax::InputSource source; + source.aInputStream = xStream; + source.sSystemId = OUString( RTL_CONSTASCII_USTRINGPARAM( "virtual file" ) ); + + xParser->parseStream( source ); +} + +// XLayoutContainer +uno::Reference< awt::XLayoutContainer > LayoutRoot::getLayoutContainer() throw (uno::RuntimeException) +{ + return uno::Reference< awt::XLayoutContainer >(); +} + +// local helper ... +void LayoutRoot::addItem( const OUString &rName, + const uno::Reference< awt::XLayoutConstrains > &xRef ) +{ + maItems[ rName ] = xRef; +} + +// XNameAccess +uno::Any SAL_CALL LayoutRoot::getByName( const OUString &rName ) + throw ( container::NoSuchElementException, + lang::WrappedTargetException, + uno::RuntimeException ) +{ + ::osl::MutexGuard aGuard( maMutex ); + if ( mbDisposed ) + throw lang::DisposedException(); + + uno::Reference< awt::XLayoutConstrains > xItem; + ItemHash::iterator i = maItems.find( rName ); + if ( i != maItems.end() ) + xItem = i->second; + return uno::makeAny( xItem ); +} + +sal_Bool SAL_CALL LayoutRoot::hasByName( const OUString &rName ) + throw (uno::RuntimeException) +{ + ::osl::MutexGuard aGuard( maMutex ); + if ( mbDisposed ) throw lang::DisposedException(); + + ItemHash::iterator i = maItems.find( rName ); + return i != maItems.end(); +} + +uno::Sequence< OUString > SAL_CALL LayoutRoot::getElementNames() + throw ( uno::RuntimeException ) +{ + ::osl::MutexGuard aGuard( maMutex ); + if ( mbDisposed ) throw lang::DisposedException(); + + uno::Sequence< OUString > aNames( maItems.size() ); + sal_Int32 nPos = 0; + + for( ItemHash::const_iterator i = maItems.begin(); + i != maItems.end(); i++ ) + aNames[ nPos++ ] = i->first; + + return aNames; +} + +uno::Type SAL_CALL LayoutRoot::getElementType() + throw ( uno::RuntimeException ) +{ + return getCppuType( ( const uno::Reference< awt::XLayoutConstrains >* )NULL ); +} + +sal_Bool SAL_CALL LayoutRoot::hasElements() + throw ( uno::RuntimeException ) +{ + ::osl::MutexGuard aGuard( maMutex ); + + if ( mbDisposed ) throw lang::DisposedException(); + + return maItems.size() > 0; +} + +// XComponent +void SAL_CALL LayoutRoot::dispose() + throw ( uno::RuntimeException ) +{ + ::osl::MutexGuard aGuard( maMutex ); + + if ( mbDisposed ) throw lang::DisposedException(); + + if ( mpListeners ) + { + + lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >(this) ); + mpListeners->disposeAndClear( aSource ); + delete mpListeners; + mpListeners = NULL; + } + + maItems.clear(); + mbDisposed = sal_True; +} + +void SAL_CALL LayoutRoot::addEventListener( const uno::Reference< lang::XEventListener >& xListener ) + throw ( uno::RuntimeException ) +{ + ::osl::MutexGuard aGuard( maMutex ); + + if ( mbDisposed ) throw lang::DisposedException(); + + if ( !mpListeners ) + mpListeners = new ::cppu::OInterfaceContainerHelper( maMutex ); + mpListeners->addInterface( xListener ); +} + +void SAL_CALL LayoutRoot::removeEventListener( const uno::Reference< lang::XEventListener >& xListener ) + throw ( uno::RuntimeException ) +{ + ::osl::MutexGuard aGuard( maMutex ); + + if ( mbDisposed ) throw lang::DisposedException(); + + if ( mpListeners ) + mpListeners->removeInterface( xListener ); +} + +// builder + +LayoutWidget *LayoutRoot::create( OUString id, const OUString unoName, long attrbs,uno::Reference< awt::XLayoutContainer > xParent ) +{ + LayoutWidget *pWidget = new LayoutWidget( mxToolkit, xParent, unoName, attrbs ); + if ( !mpToplevel ) + { + mpToplevel = pWidget; + mxWindow = uno::Reference< awt::XWindow >( pWidget->getPeer(), uno::UNO_QUERY ); + mxContainer = pWidget->mxContainer; + } + if ( pWidget->mxContainer.is() ) + pWidget->mxContainer->setLayoutUnit( mxLayoutUnit ); + if ( id.getLength() ) + maItems[ id ] = pWidget->getPeer(); + return pWidget; +} + +/* + uno::Reference< awt::XLayoutConstrains > LayoutRoot::getToplevel() + { + if ( mpToplevel ) + return mpToplevel->getPeer(); + return uno::Reference< awt::XLayoutConstrains > (); + } + + uno::Reference< awt::XLayoutConstrains > LayoutRoot::getById( OUString id ) + { + uno::Reference< awt::XLayoutConstrains > rRef = 0; + ItemHash::iterator i = maItems.find( id ); + if ( i != maItems.end() ) + rRef = i->second; + return rRef; + } +*/ + +LayoutWidget::LayoutWidget( uno::Reference< awt::XToolkit > xToolkit, + uno::Reference< awt::XLayoutContainer > xParent, + OUString unoName, long attrbs ) +{ + while ( xParent.is() && !uno::Reference< awt::XWindow >( xParent, uno::UNO_QUERY ).is() ) + { + uno::Reference< awt::XLayoutContainer > xContainer( xParent, uno::UNO_QUERY ); + assert( xContainer.is() ); + xParent = uno::Reference< awt::XLayoutContainer >( xContainer->getParent(), uno::UNO_QUERY ); + } + + mxWidget = createWidget( xToolkit, xParent, unoName, attrbs ); + assert( mxWidget.is() ); + mxContainer = uno::Reference< awt::XLayoutContainer >( mxWidget, uno::UNO_QUERY ); +} + +LayoutWidget::~LayoutWidget() +{ + /* should we dispose of the references...? */ + // at least of its children... Or should root? +} + +bool LayoutWidget::addChild( LayoutWidget *pChild ) +{ + if ( !mxContainer.is() ) + return false; + + try + { + mxContainer->addChild( pChild->mxWidget ); + } + catch( awt::MaxChildrenException ex ) + { + return false; + } + return true; +} + +void LayoutWidget::setProperties( PropList const& rProps ) +{ + ::layoutimpl::setProperties( mxWidget, rProps ); +} + +void LayoutWidget::setProperty( OUString const& attr, OUString const& value ) +{ + ::layoutimpl::setProperty( mxWidget, attr, value ); +} + +void LayoutWidget::setChildProperties( LayoutWidget *pChild, + PropList const& rProps ) +{ + uno::Reference< beans::XPropertySet > xChildPeer; + xChildPeer = mxContainer->getChildProperties( pChild->mxWidget ); + + if ( xChildPeer.is() ) + ::layoutimpl::setProperties( xChildPeer, rProps ); +} + +} // namespace layoutimpl + |