LCOV - code coverage report
Current view: top level - toolkit/source/controls - dialogcontrol.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 275 672 40.9 %
Date: 2014-11-03 Functions: 45 124 36.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include <vcl/svapp.hxx>
      22             : #include <vcl/window.hxx>
      23             : #include <vcl/wall.hxx>
      24             : #include <osl/mutex.hxx>
      25             : #include <toolkit/controls/dialogcontrol.hxx>
      26             : #include <toolkit/controls/geometrycontrolmodel.hxx>
      27             : #include <toolkit/helper/property.hxx>
      28             : #include <toolkit/controls/stdtabcontroller.hxx>
      29             : #include <com/sun/star/awt/PosSize.hpp>
      30             : #include <com/sun/star/awt/WindowAttribute.hpp>
      31             : #include <com/sun/star/resource/XStringResourceResolver.hpp>
      32             : #include <com/sun/star/uno/XComponentContext.hpp>
      33             : #include <com/sun/star/graphic/XGraphicProvider.hpp>
      34             : #include <cppuhelper/typeprovider.hxx>
      35             : #include <tools/debug.hxx>
      36             : #include <tools/diagnose_ex.h>
      37             : #include <comphelper/sequence.hxx>
      38             : #include <vcl/outdev.hxx>
      39             : 
      40             : #include <toolkit/helper/vclunohelper.hxx>
      41             : #include <unotools/ucbstreamhelper.hxx>
      42             : #include <vcl/graph.hxx>
      43             : #include <vcl/image.hxx>
      44             : #include <map>
      45             : #include <boost/unordered_map.hpp>
      46             : #include <cppuhelper/implbase1.hxx>
      47             : #include <algorithm>
      48             : #include <functional>
      49             : #include "osl/file.hxx"
      50             : 
      51             : #include <vcl/tabctrl.hxx>
      52             : #include <toolkit/awt/vclxwindows.hxx>
      53             : #include "toolkit/controls/unocontrols.hxx"
      54             : 
      55             : #include "helper/unopropertyarrayhelper.hxx"
      56             : #include "controlmodelcontainerbase_internal.hxx"
      57             : 
      58             : using namespace ::com::sun::star;
      59             : using namespace ::com::sun::star::uno;
      60             : using namespace ::com::sun::star::awt;
      61             : using namespace ::com::sun::star::lang;
      62             : using namespace ::com::sun::star::container;
      63             : using namespace ::com::sun::star::beans;
      64             : using namespace ::com::sun::star::util;
      65             : 
      66             : #define PROPERTY_DIALOGSOURCEURL OUString( "DialogSourceURL" )
      67             : #define PROPERTY_IMAGEURL OUString( "ImageURL" )
      68             : #define PROPERTY_GRAPHIC OUString( "Graphic" )
      69             : 
      70             : 
      71             : // we probably will need both a hash of control models and hash of controls
      72             : // => use some template magic
      73             : 
      74             : typedef ::cppu::WeakImplHelper1< container::XNameContainer > SimpleNameContainer_BASE;
      75             : 
      76             : template< typename T >
      77          54 : class SimpleNamedThingContainer : public SimpleNameContainer_BASE
      78             : {
      79             :     typedef boost::unordered_map< OUString, Reference< T >, OUStringHash,
      80             :        ::std::equal_to< OUString > > NamedThingsHash;
      81             :     NamedThingsHash things;
      82             :     ::osl::Mutex m_aMutex;
      83             : public:
      84             :     // ::com::sun::star::container::XNameContainer, XNameReplace, XNameAccess
      85           0 :     virtual void SAL_CALL replaceByName( const OUString& aName, const Any& aElement ) throw(IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException, std::exception) SAL_OVERRIDE
      86             :     {
      87           0 :         ::osl::MutexGuard aGuard( m_aMutex );
      88           0 :         if ( !hasByName( aName ) )
      89           0 :             throw NoSuchElementException();
      90           0 :         Reference< T > xElement;
      91           0 :         if ( ! ( aElement >>= xElement ) )
      92           0 :             throw IllegalArgumentException();
      93           0 :         things[ aName ] = xElement;
      94           0 :     }
      95          18 :     virtual Any SAL_CALL getByName( const OUString& aName ) throw(NoSuchElementException, WrappedTargetException, RuntimeException, std::exception) SAL_OVERRIDE
      96             :     {
      97          18 :         ::osl::MutexGuard aGuard( m_aMutex );
      98          18 :         if ( !hasByName( aName ) )
      99           0 :             throw NoSuchElementException();
     100          18 :         return uno::makeAny( things[ aName ] );
     101             :     }
     102           2 :     virtual Sequence< OUString > SAL_CALL getElementNames(  ) throw(RuntimeException, std::exception) SAL_OVERRIDE
     103             :     {
     104           2 :         ::osl::MutexGuard aGuard( m_aMutex );
     105           2 :         Sequence< OUString > aResult( things.size() );
     106           2 :         typename NamedThingsHash::iterator it = things.begin();
     107           2 :         typename NamedThingsHash::iterator it_end = things.end();
     108           2 :         OUString* pName = aResult.getArray();
     109           6 :         for (; it != it_end; ++it, ++pName )
     110           4 :             *pName = it->first;
     111           2 :         return aResult;
     112             :     }
     113         124 :     virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) throw(RuntimeException, std::exception) SAL_OVERRIDE
     114             :     {
     115         124 :         ::osl::MutexGuard aGuard( m_aMutex );
     116         124 :         return ( things.find( aName ) != things.end() );
     117             :     }
     118          64 :     virtual void SAL_CALL insertByName( const OUString& aName, const Any& aElement ) throw(IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException, std::exception) SAL_OVERRIDE
     119             :     {
     120          64 :         ::osl::MutexGuard aGuard( m_aMutex );
     121          64 :         if ( hasByName( aName ) )
     122           0 :             throw ElementExistException();
     123         128 :         Reference< T > xElement;
     124          64 :         if ( ! ( aElement >>= xElement ) )
     125           0 :             throw IllegalArgumentException();
     126         128 :         things[ aName ] = xElement;
     127          64 :     }
     128          14 :     virtual void SAL_CALL removeByName( const OUString& aName ) throw(NoSuchElementException, WrappedTargetException, RuntimeException, std::exception) SAL_OVERRIDE
     129             :     {
     130          14 :         ::osl::MutexGuard aGuard( m_aMutex );
     131          14 :         if ( !hasByName( aName ) )
     132           0 :             throw NoSuchElementException();
     133          14 :         things.erase( things.find( aName ) );
     134          14 :     }
     135           0 :     virtual Type SAL_CALL getElementType(  ) throw (RuntimeException, std::exception) SAL_OVERRIDE
     136             :     {
     137           0 :         return cppu::UnoType<T>::get();
     138             :     }
     139           0 :     virtual sal_Bool SAL_CALL hasElements(  ) throw (RuntimeException, std::exception) SAL_OVERRIDE
     140             :     {
     141           0 :         ::osl::MutexGuard aGuard( m_aMutex );
     142           0 :         return ( things.size() > 0 );
     143             :     }
     144             : };
     145             : 
     146             : namespace {
     147             : 
     148             : class UnoControlDialogModel :   public ControlModelContainerBase
     149             : {
     150             : protected:
     151             :     css::uno::Reference< css::graphic::XGraphicObject > mxGrfObj;
     152             :     css::uno::Any          ImplGetDefaultValue( sal_uInt16 nPropId ) const SAL_OVERRIDE;
     153             :     ::cppu::IPropertyArrayHelper&       SAL_CALL getInfoHelper() SAL_OVERRIDE;
     154             :     // ::cppu::OPropertySetHelper
     155             :     void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const css::uno::Any& rValue ) throw (css::uno::Exception, std::exception) SAL_OVERRIDE;
     156             : public:
     157             :     UnoControlDialogModel( const css::uno::Reference< css::uno::XComponentContext >& rxContext );
     158             :     UnoControlDialogModel( const UnoControlDialogModel& rModel );
     159             :     virtual ~UnoControlDialogModel();
     160             : 
     161             :     UnoControlModel*    Clone() const SAL_OVERRIDE;
     162             :     // css::beans::XMultiPropertySet
     163             :     css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     164             : 
     165             :     // css::io::XPersistObject
     166             :     OUString SAL_CALL getServiceName() throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     167             : 
     168             :     // XServiceInfo
     169          26 :     DECLIMPL_SERVICEINFO_DERIVED( UnoControlDialogModel, ControlModelContainerBase, "com.sun.star.awt.UnoControlDialogModel" )
     170             : };
     171             : 
     172          26 : UnoControlDialogModel::UnoControlDialogModel( const Reference< XComponentContext >& rxContext )
     173          26 :     :ControlModelContainerBase( rxContext )
     174             : {
     175          26 :     ImplRegisterProperty( BASEPROPERTY_BACKGROUNDCOLOR );
     176             : //  ImplRegisterProperty( BASEPROPERTY_BORDER );
     177          26 :     ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL );
     178          26 :     ImplRegisterProperty( BASEPROPERTY_ENABLED );
     179          26 :     ImplRegisterProperty( BASEPROPERTY_FONTDESCRIPTOR );
     180             : //  ImplRegisterProperty( BASEPROPERTY_PRINTABLE );
     181          26 :     ImplRegisterProperty( BASEPROPERTY_HELPTEXT );
     182          26 :     ImplRegisterProperty( BASEPROPERTY_HELPURL );
     183          26 :     ImplRegisterProperty( BASEPROPERTY_TITLE );
     184          26 :     ImplRegisterProperty( BASEPROPERTY_SIZEABLE );
     185          26 :     ImplRegisterProperty( BASEPROPERTY_DESKTOP_AS_PARENT );
     186          26 :     ImplRegisterProperty( BASEPROPERTY_DECORATION );
     187          26 :     ImplRegisterProperty( BASEPROPERTY_DIALOGSOURCEURL );
     188          26 :     ImplRegisterProperty( BASEPROPERTY_GRAPHIC );
     189          26 :     ImplRegisterProperty( BASEPROPERTY_IMAGEURL );
     190          26 :     ImplRegisterProperty( BASEPROPERTY_HSCROLL );
     191          26 :     ImplRegisterProperty( BASEPROPERTY_VSCROLL );
     192          26 :     ImplRegisterProperty( BASEPROPERTY_SCROLLWIDTH );
     193          26 :     ImplRegisterProperty( BASEPROPERTY_SCROLLHEIGHT );
     194          26 :     ImplRegisterProperty( BASEPROPERTY_SCROLLTOP );
     195          26 :     ImplRegisterProperty( BASEPROPERTY_SCROLLLEFT );
     196             : 
     197          26 :     Any aBool;
     198          26 :     aBool <<= true;
     199          26 :     ImplRegisterProperty( BASEPROPERTY_MOVEABLE, aBool );
     200          26 :     ImplRegisterProperty( BASEPROPERTY_CLOSEABLE, aBool );
     201             :     // #TODO separate class for 'UserForm' ( instead of re-using Dialog ? )
     202          52 :     uno::Reference< XNameContainer > xNameCont = new SimpleNamedThingContainer< XControlModel >();
     203          52 :     ImplRegisterProperty( BASEPROPERTY_USERFORMCONTAINEES, uno::makeAny( xNameCont ) );
     204          26 : }
     205             : 
     206           2 : UnoControlDialogModel::UnoControlDialogModel( const UnoControlDialogModel& rModel )
     207           2 :     : ControlModelContainerBase( rModel )
     208             : {
     209             :     // need to clone BASEPROPERTY_USERFORMCONTAINEES too
     210           2 :     Reference< XNameContainer > xSrcNameCont( const_cast< UnoControlDialogModel& >(rModel).getPropertyValue( GetPropertyName( BASEPROPERTY_USERFORMCONTAINEES ) ), UNO_QUERY );
     211           4 :     Reference<XNameContainer > xNameCont( new SimpleNamedThingContainer< XControlModel >() );
     212             : 
     213           4 :     uno::Sequence< OUString > sNames = xSrcNameCont->getElementNames();
     214           2 :     OUString* pName = sNames.getArray();
     215           2 :     OUString* pNamesEnd = pName + sNames.getLength();
     216           6 :     for ( ; pName != pNamesEnd; ++pName )
     217             :     {
     218           4 :         if ( xSrcNameCont->hasByName( *pName ) )
     219           4 :             xNameCont->insertByName( *pName, xSrcNameCont->getByName( *pName ) );
     220             :     }
     221           4 :     setFastPropertyValue_NoBroadcast( BASEPROPERTY_USERFORMCONTAINEES, makeAny( xNameCont ) );
     222           2 : }
     223             : 
     224           8 : UnoControlDialogModel::~UnoControlDialogModel()
     225             : {
     226           8 : }
     227             : 
     228           2 : UnoControlModel* UnoControlDialogModel::Clone() const
     229             : {
     230             :     // clone the container itself
     231           2 :     UnoControlDialogModel* pClone = new UnoControlDialogModel( *this );
     232             : 
     233           2 :     Clone_Impl(*pClone);
     234             : 
     235           2 :     return pClone;
     236             : }
     237             : 
     238             : 
     239           0 : OUString UnoControlDialogModel::getServiceName( ) throw(RuntimeException, std::exception)
     240             : {
     241           0 :     return OUString("stardiv.vcl.controlmodel.Dialog");
     242             : }
     243             : 
     244         788 : Any UnoControlDialogModel::ImplGetDefaultValue( sal_uInt16 nPropId ) const
     245             : {
     246         788 :     Any aAny;
     247             : 
     248         788 :     switch ( nPropId )
     249             :     {
     250             :         case BASEPROPERTY_DEFAULTCONTROL:
     251          26 :             aAny <<= OUString::createFromAscii( szServiceName_UnoControlDialog );
     252          26 :             break;
     253             :         case BASEPROPERTY_SCROLLWIDTH:
     254             :         case BASEPROPERTY_SCROLLHEIGHT:
     255             :         case BASEPROPERTY_SCROLLTOP:
     256             :         case BASEPROPERTY_SCROLLLEFT:
     257         144 :             aAny <<= sal_Int32(0);
     258         144 :             break;
     259             :         default:
     260         618 :             aAny = UnoControlModel::ImplGetDefaultValue( nPropId );
     261             :     }
     262             : 
     263         788 :     return aAny;
     264             : }
     265             : 
     266        6736 : ::cppu::IPropertyArrayHelper& UnoControlDialogModel::getInfoHelper()
     267             : {
     268             :     static UnoPropertyArrayHelper* pHelper = NULL;
     269        6736 :     if ( !pHelper )
     270             :     {
     271          12 :         Sequence<sal_Int32> aIDs = ImplGetPropertyIds();
     272          12 :         pHelper = new UnoPropertyArrayHelper( aIDs );
     273             :     }
     274        6736 :     return *pHelper;
     275             : }
     276             : 
     277             : // XMultiPropertySet
     278          12 : Reference< XPropertySetInfo > UnoControlDialogModel::getPropertySetInfo(  ) throw(RuntimeException, std::exception)
     279             : {
     280          12 :     static Reference< XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
     281          12 :     return xInfo;
     282             : }
     283             : 
     284         444 : void SAL_CALL UnoControlDialogModel::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) throw (::com::sun::star::uno::Exception, std::exception)
     285             : {
     286         444 :     ControlModelContainerBase::setFastPropertyValue_NoBroadcast( nHandle, rValue );
     287             :     try
     288             :     {
     289         444 :         if ( nHandle == BASEPROPERTY_IMAGEURL && ImplHasProperty( BASEPROPERTY_GRAPHIC ) )
     290             :         {
     291           4 :             OUString sImageURL;
     292           4 :             OSL_VERIFY( rValue >>= sImageURL );
     293           4 :             setPropertyValue( GetPropertyName( BASEPROPERTY_GRAPHIC ), uno::makeAny( ImageHelper::getGraphicAndGraphicObjectFromURL_nothrow( mxGrfObj, sImageURL ) ) );
     294             :         }
     295             :     }
     296           0 :     catch( const ::com::sun::star::uno::Exception& )
     297             :     {
     298             :         OSL_ENSURE( false, "UnoControlDialogModel::setFastPropertyValue_NoBroadcast: caught an exception while setting ImageURL properties!" );
     299             :     }
     300         444 : }
     301             : 
     302             : }
     303             : 
     304             : 
     305             : // = class UnoDialogControl
     306             : 
     307             : 
     308          16 : UnoDialogControl::UnoDialogControl( const uno::Reference< uno::XComponentContext >& rxContext )
     309             :     :UnoDialogControl_Base( rxContext )
     310             :     ,maTopWindowListeners( *this )
     311          16 :     ,mbWindowListener(false)
     312             : {
     313          16 :     maComponentInfos.nWidth = 300;
     314          16 :     maComponentInfos.nHeight = 450;
     315          16 :  }
     316             : 
     317           8 : UnoDialogControl::~UnoDialogControl()
     318             : {
     319           8 : }
     320             : 
     321           8 : OUString UnoDialogControl::GetComponentServiceName()
     322             : {
     323             : 
     324           8 :     bool bDecoration( true );
     325           8 :     ImplGetPropertyValue( GetPropertyName( BASEPROPERTY_DECORATION )) >>= bDecoration;
     326           8 :     if ( bDecoration )
     327           8 :         return OUString("Dialog");
     328             :     else
     329           0 :         return OUString("TabPage");
     330             : }
     331             : 
     332          12 : void UnoDialogControl::dispose() throw(RuntimeException, std::exception)
     333             : {
     334          12 :     SolarMutexGuard aGuard;
     335             : 
     336          24 :     EventObject aEvt;
     337          12 :     aEvt.Source = static_cast< ::cppu::OWeakObject* >( this );
     338          12 :     maTopWindowListeners.disposeAndClear( aEvt );
     339          24 :     ControlContainerBase::dispose();
     340          12 : }
     341             : 
     342          12 : void SAL_CALL UnoDialogControl::disposing(
     343             :     const EventObject& Source )
     344             : throw(RuntimeException, std::exception)
     345             : {
     346          12 :     ControlContainerBase::disposing( Source );
     347          12 : }
     348             : 
     349          26 : sal_Bool UnoDialogControl::setModel( const Reference< XControlModel >& rxModel ) throw(RuntimeException, std::exception)
     350             : {
     351             :         // #Can we move all the Resource stuff to the ControlContainerBase ?
     352          26 :     SolarMutexGuard aGuard;
     353          26 :         bool bRet = ControlContainerBase::setModel( rxModel );
     354          26 :     ImplStartListingForResourceEvents();
     355          26 :     return bRet;
     356             : }
     357             : 
     358           8 : void UnoDialogControl::createPeer( const Reference< XToolkit > & rxToolkit, const Reference< XWindowPeer >  & rParentPeer ) throw(RuntimeException, std::exception)
     359             : {
     360           8 :     SolarMutexGuard aGuard;
     361             : 
     362           8 :     UnoControlContainer::createPeer( rxToolkit, rParentPeer );
     363             : 
     364          16 :     Reference < XTopWindow > xTW( getPeer(), UNO_QUERY );
     365           8 :     if ( xTW.is() )
     366             :     {
     367           8 :         xTW->setMenuBar( mxMenuBar );
     368             : 
     369           8 :         if ( !mbWindowListener )
     370             :         {
     371           8 :             Reference< XWindowListener > xWL( static_cast< cppu::OWeakObject*>( this ), UNO_QUERY );
     372           8 :             addWindowListener( xWL );
     373           8 :             mbWindowListener = true;
     374             :         }
     375             : 
     376           8 :         if ( maTopWindowListeners.getLength() )
     377           0 :             xTW->addTopWindowListener( &maTopWindowListeners );
     378             :         // there must be a better way than doing this, we can't
     379             :         // process the scrolltop & scrollleft in XDialog because
     380             :         // the children haven't been added when those props are applied
     381           8 :         ImplSetPeerProperty( GetPropertyName( BASEPROPERTY_SCROLLTOP ), ImplGetPropertyValue( GetPropertyName( BASEPROPERTY_SCROLLTOP ) ) );
     382           8 :         ImplSetPeerProperty( GetPropertyName( BASEPROPERTY_SCROLLLEFT ), ImplGetPropertyValue( GetPropertyName( BASEPROPERTY_SCROLLLEFT ) ) );
     383             : 
     384           8 :     }
     385           8 : }
     386             : 
     387           8 : void UnoDialogControl::PrepareWindowDescriptor( ::com::sun::star::awt::WindowDescriptor& rDesc )
     388             : {
     389           8 :     UnoControlContainer::PrepareWindowDescriptor( rDesc );
     390           8 :     bool bDecoration( true );
     391           8 :     ImplGetPropertyValue( GetPropertyName( BASEPROPERTY_DECORATION )) >>= bDecoration;
     392           8 :     if ( !bDecoration )
     393             :     {
     394             :         // Now we have to manipulate the WindowDescriptor
     395           0 :         rDesc.WindowAttributes = rDesc.WindowAttributes | ::com::sun::star::awt::WindowAttribute::NODECORATION;
     396             :     }
     397             : 
     398             :     // We have to set the graphic property before the peer
     399             :     // will be created. Otherwise the properties will be copied
     400             :     // into the peer via propertiesChangeEvents. As the order of
     401             :     // can lead to overwrites we have to set the graphic property
     402             :     // before the propertiesChangeEvents are sent!
     403           8 :     OUString aImageURL;
     404          16 :     Reference< graphic::XGraphic > xGraphic;
     405          16 :     if (( ImplGetPropertyValue( PROPERTY_IMAGEURL ) >>= aImageURL ) &&
     406           8 :         ( !aImageURL.isEmpty() ))
     407             :     {
     408           0 :         OUString absoluteUrl = aImageURL;
     409           0 :         if ( !aImageURL.startsWith( UNO_NAME_GRAPHOBJ_URLPREFIX ) )
     410           0 :             absoluteUrl = getPhysicalLocation( ImplGetPropertyValue( PROPERTY_DIALOGSOURCEURL ),
     411           0 :                                  uno::makeAny( aImageURL ) );
     412             : 
     413           0 :         xGraphic = ImageHelper::getGraphicFromURL_nothrow( absoluteUrl );
     414           0 :         ImplSetPropertyValue( PROPERTY_GRAPHIC, uno::makeAny( xGraphic ), true );
     415           8 :     }
     416           8 : }
     417             : 
     418           4 : void UnoDialogControl::addTopWindowListener( const Reference< XTopWindowListener >& rxListener ) throw (RuntimeException, std::exception)
     419             : {
     420           4 :     maTopWindowListeners.addInterface( rxListener );
     421           4 :     if( getPeer().is() && maTopWindowListeners.getLength() == 1 )
     422             :     {
     423           4 :         Reference < XTopWindow >  xTW( getPeer(), UNO_QUERY );
     424           4 :         xTW->addTopWindowListener( &maTopWindowListeners );
     425             :     }
     426           4 : }
     427             : 
     428           4 : void UnoDialogControl::removeTopWindowListener( const Reference< XTopWindowListener >& rxListener ) throw (RuntimeException, std::exception)
     429             : {
     430           4 :     if( getPeer().is() && maTopWindowListeners.getLength() == 1 )
     431             :     {
     432           4 :         Reference < XTopWindow >  xTW( getPeer(), UNO_QUERY );
     433           4 :         xTW->removeTopWindowListener( &maTopWindowListeners );
     434             :     }
     435           4 :     maTopWindowListeners.removeInterface( rxListener );
     436           4 : }
     437             : 
     438           0 : void UnoDialogControl::toFront(  ) throw (RuntimeException, std::exception)
     439             : {
     440           0 :     SolarMutexGuard aGuard;
     441           0 :     if ( getPeer().is() )
     442             :     {
     443           0 :         Reference< XTopWindow > xTW( getPeer(), UNO_QUERY );
     444           0 :         if( xTW.is() )
     445           0 :             xTW->toFront();
     446           0 :     }
     447           0 : }
     448             : 
     449           0 : void UnoDialogControl::toBack(  ) throw (RuntimeException, std::exception)
     450             : {
     451           0 :     SolarMutexGuard aGuard;
     452           0 :     if ( getPeer().is() )
     453             :     {
     454           0 :         Reference< XTopWindow > xTW( getPeer(), UNO_QUERY );
     455           0 :         if( xTW.is() )
     456           0 :             xTW->toBack();
     457           0 :     }
     458           0 : }
     459             : 
     460           0 : void UnoDialogControl::setMenuBar( const Reference< XMenuBar >& rxMenuBar ) throw (RuntimeException, std::exception)
     461             : {
     462           0 :     SolarMutexGuard aGuard;
     463           0 :     mxMenuBar = rxMenuBar;
     464           0 :     if ( getPeer().is() )
     465             :     {
     466           0 :         Reference< XTopWindow > xTW( getPeer(), UNO_QUERY );
     467           0 :         if( xTW.is() )
     468           0 :             xTW->setMenuBar( mxMenuBar );
     469           0 :     }
     470           0 : }
     471           4 : static ::Size ImplMapPixelToAppFont( OutputDevice* pOutDev, const ::Size& aSize )
     472             : {
     473           4 :     ::Size aTmp = pOutDev->PixelToLogic( aSize, MAP_APPFONT );
     474           4 :     return aTmp;
     475             : }
     476             : // ::com::sun::star::awt::XWindowListener
     477           4 : void SAL_CALL UnoDialogControl::windowResized( const ::com::sun::star::awt::WindowEvent& e )
     478             : throw (::com::sun::star::uno::RuntimeException, std::exception)
     479             : {
     480           4 :     OutputDevice*pOutDev = Application::GetDefaultDevice();
     481             :     DBG_ASSERT( pOutDev, "Missing Default Device!" );
     482           4 :     if ( pOutDev && !mbSizeModified )
     483             :     {
     484             :         // Currentley we are simply using MAP_APPFONT
     485           4 :         ::Size aAppFontSize( e.Width, e.Height );
     486             : 
     487           4 :         Reference< XControl > xDialogControl( *this, UNO_QUERY_THROW );
     488           8 :         Reference< XDevice > xDialogDevice( xDialogControl->getPeer(), UNO_QUERY );
     489             :         OSL_ENSURE( xDialogDevice.is(), "UnoDialogControl::windowResized: no peer, but a windowResized event?" );
     490             : 
     491             :         // #i87592 In design mode the drawing layer works with sizes with decoration.
     492             :         // Therefore we have to subtract them before writing back to the properties (model).
     493           4 :         if ( xDialogDevice.is() && mbDesignMode )
     494             :         {
     495           0 :             DeviceInfo aDeviceInfo( xDialogDevice->getInfo() );
     496           0 :             aAppFontSize.Width() -= aDeviceInfo.LeftInset + aDeviceInfo.RightInset;
     497           0 :             aAppFontSize.Height() -= aDeviceInfo.TopInset + aDeviceInfo.BottomInset;
     498             :         }
     499             : 
     500           4 :         aAppFontSize = ImplMapPixelToAppFont( pOutDev, aAppFontSize );
     501             : 
     502             :         // Remember that changes have been done by listener. No need to
     503             :         // update the position because of property change event.
     504           4 :         mbSizeModified = true;
     505           8 :         Sequence< OUString > aProps( 2 );
     506           8 :         Sequence< Any > aValues( 2 );
     507             :         // Properties in a sequence must be sorted!
     508           4 :         aProps[0] = "Height";
     509           4 :         aProps[1] = "Width";
     510           4 :         aValues[0] <<= aAppFontSize.Height();
     511           4 :         aValues[1] <<= aAppFontSize.Width();
     512             : 
     513           4 :         ImplSetPropertyValues( aProps, aValues, true );
     514           8 :         mbSizeModified = false;
     515             :     }
     516           4 : }
     517             : 
     518           0 : void SAL_CALL UnoDialogControl::windowMoved( const ::com::sun::star::awt::WindowEvent& e )
     519             : throw (::com::sun::star::uno::RuntimeException, std::exception)
     520             : {
     521           0 :     OutputDevice*pOutDev = Application::GetDefaultDevice();
     522             :     DBG_ASSERT( pOutDev, "Missing Default Device!" );
     523           0 :     if ( pOutDev && !mbPosModified )
     524             :     {
     525             :         // Currentley we are simply using MAP_APPFONT
     526           0 :         ::Size aTmp( e.X, e.Y );
     527           0 :         aTmp = ImplMapPixelToAppFont( pOutDev, aTmp );
     528             : 
     529             :         // Remember that changes have been done by listener. No need to
     530             :         // update the position because of property change event.
     531           0 :         mbPosModified = true;
     532           0 :         Sequence< OUString > aProps( 2 );
     533           0 :         Sequence< Any > aValues( 2 );
     534           0 :         aProps[0] = "PositionX";
     535           0 :         aProps[1] = "PositionY";
     536           0 :         aValues[0] <<= aTmp.Width();
     537           0 :         aValues[1] <<= aTmp.Height();
     538             : 
     539           0 :         ImplSetPropertyValues( aProps, aValues, true );
     540           0 :         mbPosModified = false;
     541             :     }
     542           0 : }
     543             : 
     544           0 : void SAL_CALL UnoDialogControl::windowShown( const EventObject& e ) throw (RuntimeException, std::exception)
     545             : {
     546             :     (void)e;
     547           0 : }
     548             : 
     549           0 : void SAL_CALL UnoDialogControl::windowHidden( const EventObject& e ) throw (RuntimeException, std::exception)
     550             : {
     551             :     (void)e;
     552           0 : }
     553             : 
     554           0 : void SAL_CALL UnoDialogControl::endDialog( ::sal_Int32 i_result ) throw (RuntimeException, std::exception)
     555             : {
     556           0 :     Reference< XDialog2 > xPeerDialog( getPeer(), UNO_QUERY );
     557           0 :     if ( xPeerDialog.is() )
     558           0 :         xPeerDialog->endDialog( i_result );
     559           0 : }
     560             : 
     561           0 : void SAL_CALL UnoDialogControl::setHelpId( const OUString& i_id ) throw (RuntimeException, std::exception)
     562             : {
     563           0 :     Reference< XDialog2 > xPeerDialog( getPeer(), UNO_QUERY );
     564           0 :     if ( xPeerDialog.is() )
     565           0 :         xPeerDialog->setHelpId( i_id );
     566           0 : }
     567             : 
     568           0 : void UnoDialogControl::setTitle( const OUString& Title ) throw(RuntimeException, std::exception)
     569             : {
     570           0 :     SolarMutexGuard aGuard;
     571           0 :     Any aAny;
     572           0 :     aAny <<= Title;
     573           0 :     ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_TITLE ), aAny, true );
     574           0 : }
     575             : 
     576           0 : OUString UnoDialogControl::getTitle() throw(RuntimeException, std::exception)
     577             : {
     578           0 :     SolarMutexGuard aGuard;
     579           0 :     return ImplGetPropertyValue_UString( BASEPROPERTY_TITLE );
     580             : }
     581             : 
     582           0 : sal_Int16 UnoDialogControl::execute() throw(RuntimeException, std::exception)
     583             : {
     584           0 :     SolarMutexGuard aGuard;
     585           0 :     sal_Int16 nDone = -1;
     586           0 :     if ( getPeer().is() )
     587             :     {
     588           0 :         Reference< XDialog > xDlg( getPeer(), UNO_QUERY );
     589           0 :         if( xDlg.is() )
     590             :         {
     591           0 :             GetComponentInfos().bVisible = true;
     592           0 :             nDone = xDlg->execute();
     593           0 :             GetComponentInfos().bVisible = false;
     594           0 :         }
     595             :     }
     596           0 :     return nDone;
     597             : }
     598             : 
     599           0 : void UnoDialogControl::endExecute() throw(RuntimeException, std::exception)
     600             : {
     601           0 :     SolarMutexGuard aGuard;
     602           0 :     if ( getPeer().is() )
     603             :     {
     604           0 :         Reference< XDialog > xDlg( getPeer(), UNO_QUERY );
     605           0 :         if( xDlg.is() )
     606             :         {
     607           0 :             xDlg->endExecute();
     608           0 :             GetComponentInfos().bVisible = false;
     609           0 :         }
     610           0 :     }
     611           0 : }
     612             : 
     613             : // XModifyListener
     614           0 : void SAL_CALL UnoDialogControl::modified(
     615             :     const lang::EventObject& /*rEvent*/ )
     616             : throw (RuntimeException, std::exception)
     617             : {
     618           0 :     ImplUpdateResourceResolver();
     619           0 : }
     620             : 
     621         492 : void UnoDialogControl::ImplModelPropertiesChanged( const Sequence< PropertyChangeEvent >& rEvents ) throw(RuntimeException)
     622             : {
     623         492 :     sal_Int32 nLen = rEvents.getLength();
     624        1308 :     for( sal_Int32 i = 0; i < nLen; i++ )
     625             :     {
     626         828 :         const PropertyChangeEvent& rEvt = rEvents.getConstArray()[i];
     627         828 :         Reference< XControlModel > xModel( rEvt.Source, UNO_QUERY );
     628         828 :         bool bOwnModel = (XControlModel*)xModel.get() == (XControlModel*)getModel().get();
     629         828 :         if ( bOwnModel && rEvt.PropertyName == "ImageURL" )
     630             :         {
     631          12 :             OUString aImageURL;
     632          24 :             Reference< graphic::XGraphic > xGraphic;
     633          24 :             if (( ImplGetPropertyValue( GetPropertyName( BASEPROPERTY_IMAGEURL ) ) >>= aImageURL ) &&
     634          12 :                 ( !aImageURL.isEmpty() ))
     635             :             {
     636           4 :                 OUString absoluteUrl = aImageURL;
     637           4 :                 if ( !aImageURL.startsWith( UNO_NAME_GRAPHOBJ_URLPREFIX ) )
     638             : 
     639           8 :                     absoluteUrl = getPhysicalLocation( ImplGetPropertyValue( GetPropertyName( BASEPROPERTY_DIALOGSOURCEURL )),
     640           4 :                                          uno::makeAny(aImageURL));
     641             : 
     642           4 :                 xGraphic = ImageHelper::getGraphicFromURL_nothrow( absoluteUrl );
     643             :             }
     644          12 :             ImplSetPropertyValue(  GetPropertyName( BASEPROPERTY_GRAPHIC), uno::makeAny( xGraphic ), true );
     645          24 :             break;
     646             :         }
     647         816 :     }
     648         492 :     ControlContainerBase::ImplModelPropertiesChanged(rEvents);
     649         492 : }
     650             : 
     651             : 
     652             : //  class MultiPageControl
     653             : 
     654           0 : UnoMultiPageControl::UnoMultiPageControl( const uno::Reference< uno::XComponentContext >& rxContext ) : ControlContainerBase(rxContext), maTabListeners( *this )
     655             : {
     656           0 :     maComponentInfos.nWidth = 280;
     657           0 :     maComponentInfos.nHeight = 400;
     658           0 : }
     659             : 
     660           0 : UnoMultiPageControl::~UnoMultiPageControl()
     661             : {
     662           0 : }
     663             : // XTabListener
     664             : 
     665           0 : void SAL_CALL UnoMultiPageControl::inserted( SAL_UNUSED_PARAMETER ::sal_Int32 ) throw (RuntimeException, std::exception)
     666             : {
     667           0 : }
     668           0 : void SAL_CALL UnoMultiPageControl::removed( SAL_UNUSED_PARAMETER ::sal_Int32 ) throw (RuntimeException, std::exception)
     669             : {
     670           0 : }
     671           0 : void SAL_CALL UnoMultiPageControl::changed( SAL_UNUSED_PARAMETER ::sal_Int32,
     672             :                                             SAL_UNUSED_PARAMETER const Sequence< NamedValue >& ) throw (RuntimeException, std::exception)
     673             : {
     674           0 : }
     675           0 : void SAL_CALL UnoMultiPageControl::activated( ::sal_Int32 ID ) throw (RuntimeException, std::exception)
     676             : {
     677           0 :     ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_MULTIPAGEVALUE ), uno::makeAny( ID ), false );
     678             : 
     679           0 : }
     680           0 : void SAL_CALL UnoMultiPageControl::deactivated( SAL_UNUSED_PARAMETER ::sal_Int32 ) throw (RuntimeException, std::exception)
     681             : {
     682           0 : }
     683           0 : void SAL_CALL UnoMultiPageControl::disposing(const EventObject&) throw (RuntimeException, std::exception)
     684             : {
     685           0 : }
     686             : 
     687           0 : void SAL_CALL UnoMultiPageControl::dispose() throw (RuntimeException, std::exception)
     688             : {
     689           0 :     lang::EventObject aEvt;
     690           0 :     aEvt.Source = (::cppu::OWeakObject*)this;
     691           0 :     maTabListeners.disposeAndClear( aEvt );
     692           0 :     ControlContainerBase::dispose();
     693           0 : }
     694             : 
     695             : // com::sun::star::awt::XSimpleTabController
     696           0 : ::sal_Int32 SAL_CALL UnoMultiPageControl::insertTab() throw (RuntimeException, std::exception)
     697             : {
     698           0 :     Reference< XSimpleTabController > xMultiPage( getPeer(), UNO_QUERY );
     699           0 :     if ( !xMultiPage.is() )
     700           0 :         throw RuntimeException();
     701           0 :     return xMultiPage->insertTab();
     702             : }
     703             : 
     704           0 : void SAL_CALL UnoMultiPageControl::removeTab( ::sal_Int32 ID ) throw (IndexOutOfBoundsException, RuntimeException, std::exception)
     705             : {
     706           0 :     Reference< XSimpleTabController > xMultiPage( getPeer(), UNO_QUERY );
     707           0 :     if ( !xMultiPage.is() )
     708           0 :         throw RuntimeException();
     709           0 :     xMultiPage->removeTab( ID );
     710           0 : }
     711             : 
     712           0 : void SAL_CALL UnoMultiPageControl::setTabProps( ::sal_Int32 ID, const Sequence< NamedValue >& Properties ) throw (IndexOutOfBoundsException, RuntimeException, std::exception)
     713             : {
     714           0 :     Reference< XSimpleTabController > xMultiPage( getPeer(), UNO_QUERY );
     715           0 :     if ( !xMultiPage.is() )
     716           0 :         throw RuntimeException();
     717           0 :     xMultiPage->setTabProps( ID, Properties );
     718           0 : }
     719             : 
     720           0 : Sequence< NamedValue > SAL_CALL UnoMultiPageControl::getTabProps( ::sal_Int32 ID ) throw (IndexOutOfBoundsException, RuntimeException, std::exception)
     721             : {
     722           0 :     Reference< XSimpleTabController > xMultiPage( getPeer(), UNO_QUERY );
     723           0 :     if ( !xMultiPage.is() )
     724           0 :         throw RuntimeException();
     725           0 :     return xMultiPage->getTabProps( ID );
     726             : }
     727             : 
     728           0 : void SAL_CALL UnoMultiPageControl::activateTab( ::sal_Int32 ID ) throw (IndexOutOfBoundsException, RuntimeException, std::exception)
     729             : {
     730           0 :     Reference< XSimpleTabController > xMultiPage( getPeer(), UNO_QUERY );
     731           0 :     if ( !xMultiPage.is() )
     732           0 :         throw RuntimeException();
     733           0 :     xMultiPage->activateTab( ID );
     734           0 :     ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_MULTIPAGEVALUE ), uno::makeAny( ID ), true );
     735             : 
     736           0 : }
     737             : 
     738           0 : ::sal_Int32 SAL_CALL UnoMultiPageControl::getActiveTabID() throw (RuntimeException, std::exception)
     739             : {
     740           0 :     Reference< XSimpleTabController > xMultiPage( getPeer(), UNO_QUERY );
     741           0 :     if ( !xMultiPage.is() )
     742           0 :         throw RuntimeException();
     743           0 :     return xMultiPage->getActiveTabID();
     744             : }
     745             : 
     746           0 : void SAL_CALL UnoMultiPageControl::addTabListener( const Reference< XTabListener >& Listener ) throw (RuntimeException, std::exception)
     747             : {
     748           0 :     maTabListeners.addInterface( Listener );
     749           0 :     Reference< XSimpleTabController > xMultiPage( getPeer(), UNO_QUERY );
     750           0 :     if ( xMultiPage.is()  && maTabListeners.getLength() == 1 )
     751           0 :         xMultiPage->addTabListener( &maTabListeners );
     752           0 : }
     753             : 
     754           0 : void SAL_CALL UnoMultiPageControl::removeTabListener( const Reference< XTabListener >& Listener ) throw (RuntimeException, std::exception)
     755             : {
     756           0 :     Reference< XSimpleTabController > xMultiPage( getPeer(), UNO_QUERY );
     757           0 :     if ( xMultiPage.is()  && maTabListeners.getLength() == 1 )
     758           0 :         xMultiPage->removeTabListener( &maTabListeners );
     759           0 :     maTabListeners.removeInterface( Listener );
     760           0 : }
     761             : 
     762             : 
     763             : // lang::XTypeProvider
     764           0 : IMPL_XTYPEPROVIDER_START( UnoMultiPageControl )
     765           0 :     cppu::UnoType<awt::XSimpleTabController>::get(),
     766           0 :     cppu::UnoType<awt::XTabListener>::get(),
     767             :     ControlContainerBase::getTypes()
     768           0 : IMPL_XTYPEPROVIDER_END
     769             : 
     770             : // uno::XInterface
     771           0 : uno::Any UnoMultiPageControl::queryAggregation( const uno::Type & rType ) throw(uno::RuntimeException)
     772             : {
     773             :     uno::Any aRet = ::cppu::queryInterface( rType,
     774           0 :                                         (static_cast< awt::XTabListener* >(this)), (static_cast< awt::XSimpleTabController* >(this)) );
     775           0 :     return (aRet.hasValue() ? aRet : ControlContainerBase::queryAggregation( rType ));
     776             : }
     777             : 
     778           0 : OUString UnoMultiPageControl::GetComponentServiceName()
     779             : {
     780           0 :     bool bDecoration( true );
     781           0 :     ImplGetPropertyValue( GetPropertyName( BASEPROPERTY_DECORATION )) >>= bDecoration;
     782           0 :     if ( bDecoration )
     783           0 :         return OUString("tabcontrol");
     784             :     // Hopefully we can tweak the tabcontrol to display without tabs
     785           0 :     return OUString("tabcontrolnotabs");
     786             : }
     787             : 
     788           0 : void UnoMultiPageControl::bindPage( const uno::Reference< awt::XControl >& _rxControl )
     789             : {
     790           0 :     uno::Reference< awt::XWindowPeer > xPage( _rxControl->getPeer() );
     791           0 :     uno::Reference< awt::XSimpleTabController > xTabCntrl( getPeer(), uno::UNO_QUERY );
     792           0 :     uno::Reference< beans::XPropertySet > xProps( _rxControl->getModel(), uno::UNO_QUERY );
     793             : 
     794           0 :    VCLXTabPage* pXPage = dynamic_cast< VCLXTabPage* >( xPage.get() );
     795           0 :    TabPage* pPage = pXPage ? pXPage->getTabPage() : NULL;
     796           0 :     if ( xTabCntrl.is() && pPage )
     797             :     {
     798           0 :         VCLXMultiPage* pXTab = dynamic_cast< VCLXMultiPage* >( xTabCntrl.get() );
     799           0 :         if ( pXTab )
     800             :         {
     801           0 :             OUString sTitle;
     802           0 :             xProps->getPropertyValue( GetPropertyName( BASEPROPERTY_TITLE ) ) >>= sTitle;
     803           0 :             pXTab->insertTab( pPage, sTitle);
     804             :         }
     805           0 :     }
     806             : 
     807           0 : }
     808             : 
     809           0 : void UnoMultiPageControl::createPeer( const Reference< XToolkit > & rxToolkit, const Reference< XWindowPeer >  & rParentPeer ) throw(RuntimeException, std::exception)
     810             : {
     811           0 :     SolarMutexGuard aSolarGuard;
     812             : 
     813           0 :     UnoControlContainer::createPeer( rxToolkit, rParentPeer );
     814             : 
     815           0 :     uno::Sequence< uno::Reference< awt::XControl > > aCtrls = getControls();
     816           0 :     sal_uInt32 nCtrls = aCtrls.getLength();
     817           0 :     for( sal_uInt32 n = 0; n < nCtrls; n++ )
     818           0 :        bindPage( aCtrls[ n ] );
     819           0 :     sal_Int32 nActiveTab(0);
     820           0 :     Reference< XPropertySet > xMultiProps( getModel(), UNO_QUERY );
     821           0 :     xMultiProps->getPropertyValue( GetPropertyName( BASEPROPERTY_MULTIPAGEVALUE ) ) >>= nActiveTab;
     822             : 
     823           0 :     uno::Reference< awt::XSimpleTabController > xTabCntrl( getPeer(), uno::UNO_QUERY );
     824           0 :     if ( xTabCntrl.is() )
     825             :     {
     826           0 :         xTabCntrl->addTabListener( this );
     827           0 :         if ( nActiveTab && nCtrls ) // Ensure peer is initialise with correct activated tab
     828             :         {
     829           0 :             xTabCntrl->activateTab( nActiveTab );
     830           0 :             ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_MULTIPAGEVALUE ), uno::makeAny( nActiveTab ), true );
     831             :         }
     832           0 :     }
     833           0 : }
     834             : 
     835           0 : void    UnoMultiPageControl::impl_createControlPeerIfNecessary( const uno::Reference< awt::XControl >& _rxControl)
     836             : {
     837             :     OSL_PRECOND( _rxControl.is(), "UnoMultiPageControl::impl_createControlPeerIfNecessary: invalid control, this will crash!" );
     838             : 
     839             :     // if the container already has a peer, then also create a peer for the control
     840           0 :     uno::Reference< awt::XWindowPeer > xMyPeer( getPeer() );
     841             : 
     842           0 :     if( xMyPeer.is() )
     843             :     {
     844           0 :         _rxControl->createPeer( NULL, xMyPeer );
     845           0 :         bindPage( _rxControl );
     846           0 :         ImplActivateTabControllers();
     847           0 :     }
     848             : 
     849           0 : }
     850             : 
     851             : // ------------- UnoMultiPageModel -----------------
     852             : 
     853           2 : UnoMultiPageModel::UnoMultiPageModel( const Reference< XComponentContext >& rxContext ) : ControlModelContainerBase( rxContext )
     854             : {
     855           2 :     ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL );
     856           2 :     ImplRegisterProperty( BASEPROPERTY_BACKGROUNDCOLOR );
     857           2 :     ImplRegisterProperty( BASEPROPERTY_ENABLEVISIBLE );
     858           2 :     ImplRegisterProperty( BASEPROPERTY_ENABLED );
     859             : 
     860           2 :     ImplRegisterProperty( BASEPROPERTY_FONTDESCRIPTOR );
     861           2 :     ImplRegisterProperty( BASEPROPERTY_HELPTEXT );
     862           2 :     ImplRegisterProperty( BASEPROPERTY_HELPURL );
     863           2 :     ImplRegisterProperty( BASEPROPERTY_SIZEABLE );
     864             :     //ImplRegisterProperty( BASEPROPERTY_DIALOGSOURCEURL );
     865           2 :     ImplRegisterProperty( BASEPROPERTY_MULTIPAGEVALUE );
     866           2 :     ImplRegisterProperty( BASEPROPERTY_PRINTABLE );
     867           2 :     ImplRegisterProperty( BASEPROPERTY_USERFORMCONTAINEES );
     868             : 
     869           2 :     Any aBool;
     870           2 :     aBool <<= true;
     871           2 :     ImplRegisterProperty( BASEPROPERTY_MOVEABLE, aBool );
     872           2 :     ImplRegisterProperty( BASEPROPERTY_CLOSEABLE, aBool );
     873           2 :     ImplRegisterProperty( BASEPROPERTY_DECORATION, aBool );
     874             :     // MultiPage Control has the tab stop property. And the default value is True.
     875           2 :     ImplRegisterProperty( BASEPROPERTY_TABSTOP, aBool );
     876             : 
     877           4 :     uno::Reference< XNameContainer > xNameCont = new SimpleNamedThingContainer< XControlModel >();
     878           4 :     ImplRegisterProperty( BASEPROPERTY_USERFORMCONTAINEES, uno::makeAny( xNameCont ) );
     879           2 : }
     880             : 
     881           0 : UnoMultiPageModel::UnoMultiPageModel( const UnoMultiPageModel& rModel )
     882           0 :     : ControlModelContainerBase( rModel )
     883             : {
     884           0 : }
     885             : 
     886           4 : UnoMultiPageModel::~UnoMultiPageModel()
     887             : {
     888           4 : }
     889             : 
     890             : UnoControlModel*
     891           0 : UnoMultiPageModel::Clone() const
     892             : {
     893             :     // clone the container itself
     894           0 :     UnoMultiPageModel* pClone = new UnoMultiPageModel( *this );
     895           0 :     Clone_Impl( *pClone );
     896           0 :     return pClone;
     897             : }
     898             : 
     899           0 : OUString UnoMultiPageModel::getServiceName() throw(::com::sun::star::uno::RuntimeException, std::exception)
     900             : {
     901           0 :     return OUString::createFromAscii( szServiceName_UnoMultiPageModel );
     902             : }
     903             : 
     904          30 : uno::Any UnoMultiPageModel::ImplGetDefaultValue( sal_uInt16 nPropId ) const
     905             : {
     906          30 :     if ( nPropId == BASEPROPERTY_DEFAULTCONTROL )
     907             :     {
     908           2 :         uno::Any aAny;
     909           2 :         aAny <<= OUString::createFromAscii( szServiceName_UnoMultiPageControl );
     910           2 :         return aAny;
     911             :     }
     912          28 :     return ControlModelContainerBase::ImplGetDefaultValue( nPropId );
     913             : }
     914             : 
     915           0 : ::cppu::IPropertyArrayHelper& UnoMultiPageModel::getInfoHelper()
     916             : {
     917             :     static UnoPropertyArrayHelper* pHelper = NULL;
     918           0 :     if ( !pHelper )
     919             :     {
     920           0 :         uno::Sequence<sal_Int32>    aIDs = ImplGetPropertyIds();
     921           0 :         pHelper = new UnoPropertyArrayHelper( aIDs );
     922             :     }
     923           0 :     return *pHelper;
     924             : }
     925             : 
     926             : // beans::XMultiPropertySet
     927           0 : uno::Reference< beans::XPropertySetInfo > UnoMultiPageModel::getPropertySetInfo(  ) throw(uno::RuntimeException, std::exception)
     928             : {
     929           0 :     static uno::Reference< beans::XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
     930           0 :     return xInfo;
     931             : }
     932             : 
     933           0 : void UnoMultiPageModel::insertByName( const OUString& aName, const Any& aElement ) throw(IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException, std::exception)
     934             : {
     935           0 :     Reference< XServiceInfo > xInfo;
     936           0 :     aElement >>= xInfo;
     937             : 
     938           0 :     if ( !xInfo.is() )
     939           0 :         throw IllegalArgumentException();
     940             : 
     941             :     // Only a Page model can be inserted into the multipage
     942           0 :     if ( !xInfo->supportsService( OUString::createFromAscii( szServiceName_UnoPageModel ) ) )
     943           0 :         throw IllegalArgumentException();
     944             : 
     945           0 :     return ControlModelContainerBase::insertByName( aName, aElement );
     946             : }
     947             : 
     948             : 
     949           0 : sal_Bool SAL_CALL UnoMultiPageModel::getGroupControl(  ) throw (RuntimeException, std::exception)
     950             : {
     951           0 :     return sal_True;
     952             : }
     953             : 
     954             : 
     955             : //  class UnoPageControl
     956             : 
     957           0 : UnoPageControl::UnoPageControl( const uno::Reference< uno::XComponentContext >& rxContext ) : ControlContainerBase(rxContext)
     958             : {
     959           0 :     maComponentInfos.nWidth = 280;
     960           0 :     maComponentInfos.nHeight = 400;
     961           0 : }
     962             : 
     963           0 : UnoPageControl::~UnoPageControl()
     964             : {
     965           0 : }
     966             : 
     967           0 : OUString UnoPageControl::GetComponentServiceName()
     968             : {
     969           0 :     return OUString("tabpage");
     970             : }
     971             : 
     972             : 
     973             : // ------------- UnoPageModel -----------------
     974             : 
     975           0 : UnoPageModel::UnoPageModel( const Reference< XComponentContext >& rxContext ) : ControlModelContainerBase( rxContext )
     976             : {
     977           0 :     ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL );
     978           0 :     ImplRegisterProperty( BASEPROPERTY_BACKGROUNDCOLOR );
     979           0 :     ImplRegisterProperty( BASEPROPERTY_ENABLED );
     980           0 :     ImplRegisterProperty( BASEPROPERTY_ENABLEVISIBLE );
     981             : 
     982           0 :     ImplRegisterProperty( BASEPROPERTY_FONTDESCRIPTOR );
     983           0 :     ImplRegisterProperty( BASEPROPERTY_HELPTEXT );
     984           0 :     ImplRegisterProperty( BASEPROPERTY_HELPURL );
     985           0 :     ImplRegisterProperty( BASEPROPERTY_TITLE );
     986           0 :     ImplRegisterProperty( BASEPROPERTY_SIZEABLE );
     987           0 :     ImplRegisterProperty( BASEPROPERTY_PRINTABLE );
     988           0 :     ImplRegisterProperty( BASEPROPERTY_USERFORMCONTAINEES );
     989             : //    ImplRegisterProperty( BASEPROPERTY_DIALOGSOURCEURL );
     990             : 
     991           0 :     Any aBool;
     992           0 :     aBool <<= true;
     993           0 :     ImplRegisterProperty( BASEPROPERTY_MOVEABLE, aBool );
     994           0 :     ImplRegisterProperty( BASEPROPERTY_CLOSEABLE, aBool );
     995             :     //ImplRegisterProperty( BASEPROPERTY_TABSTOP, aBool );
     996             : 
     997           0 :     uno::Reference< XNameContainer > xNameCont = new SimpleNamedThingContainer< XControlModel >();
     998           0 :     ImplRegisterProperty( BASEPROPERTY_USERFORMCONTAINEES, uno::makeAny( xNameCont ) );
     999           0 : }
    1000             : 
    1001           0 : UnoPageModel::UnoPageModel( const UnoPageModel& rModel )
    1002           0 :     : ControlModelContainerBase( rModel )
    1003             : {
    1004           0 : }
    1005             : 
    1006           0 : UnoPageModel::~UnoPageModel()
    1007             : {
    1008           0 : }
    1009             : 
    1010             : UnoControlModel*
    1011           0 : UnoPageModel::Clone() const
    1012             : {
    1013             :     // clone the container itself
    1014           0 :     UnoPageModel* pClone = new UnoPageModel( *this );
    1015           0 :     Clone_Impl( *pClone );
    1016           0 :     return pClone;
    1017             : }
    1018             : 
    1019           0 : OUString UnoPageModel::getServiceName() throw(::com::sun::star::uno::RuntimeException, std::exception)
    1020             : {
    1021           0 :     return OUString::createFromAscii( szServiceName_UnoPageModel );
    1022             : }
    1023             : 
    1024           0 : uno::Any UnoPageModel::ImplGetDefaultValue( sal_uInt16 nPropId ) const
    1025             : {
    1026           0 :     if ( nPropId == BASEPROPERTY_DEFAULTCONTROL )
    1027             :     {
    1028           0 :         uno::Any aAny;
    1029           0 :         aAny <<= OUString::createFromAscii( szServiceName_UnoPageControl );
    1030           0 :         return aAny;
    1031             :     }
    1032           0 :     return ControlModelContainerBase::ImplGetDefaultValue( nPropId );
    1033             : }
    1034             : 
    1035           0 : ::cppu::IPropertyArrayHelper& UnoPageModel::getInfoHelper()
    1036             : {
    1037             :     static UnoPropertyArrayHelper* pHelper = NULL;
    1038           0 :     if ( !pHelper )
    1039             :     {
    1040           0 :         uno::Sequence<sal_Int32>  aIDs = ImplGetPropertyIds();
    1041           0 :         pHelper = new UnoPropertyArrayHelper( aIDs );
    1042             :     }
    1043           0 :     return *pHelper;
    1044             : }
    1045             : 
    1046             : // beans::XMultiPropertySet
    1047           0 : uno::Reference< beans::XPropertySetInfo > UnoPageModel::getPropertySetInfo(  ) throw(uno::RuntimeException, std::exception)
    1048             : {
    1049           0 :     static uno::Reference< beans::XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
    1050           0 :     return xInfo;
    1051             : }
    1052             : 
    1053             : 
    1054           0 : sal_Bool SAL_CALL UnoPageModel::getGroupControl(  ) throw (RuntimeException, std::exception)
    1055             : {
    1056           0 :     return sal_False;
    1057             : }
    1058             : 
    1059             : // Frame control
    1060             : 
    1061             : 
    1062             : //  class UnoFrameControl
    1063             : 
    1064           0 : UnoFrameControl::UnoFrameControl( const uno::Reference< uno::XComponentContext >& rxContext ) : ControlContainerBase(rxContext)
    1065             : {
    1066           0 :     maComponentInfos.nWidth = 280;
    1067           0 :     maComponentInfos.nHeight = 400;
    1068           0 : }
    1069             : 
    1070           0 : UnoFrameControl::~UnoFrameControl()
    1071             : {
    1072           0 : }
    1073             : 
    1074           0 : OUString UnoFrameControl::GetComponentServiceName()
    1075             : {
    1076           0 :     return OUString("frame");
    1077             : }
    1078             : 
    1079           0 : void UnoFrameControl::ImplSetPosSize( Reference< XControl >& rxCtrl )
    1080             : {
    1081           0 :     bool bOwnCtrl = false;
    1082           0 :     OUString sTitle;
    1083           0 :     if ( rxCtrl.get() == Reference<XControl>( this ).get() )
    1084           0 :         bOwnCtrl = true;
    1085           0 :     Reference< XPropertySet > xProps( getModel(), UNO_QUERY );
    1086             :     //xProps->getPropertyValue( GetPropertyName( BASEPROPERTY_TITLE ) ) >>= sTitle;
    1087           0 :     xProps->getPropertyValue( GetPropertyName( BASEPROPERTY_LABEL ) ) >>= sTitle;
    1088             : 
    1089           0 :     ControlContainerBase::ImplSetPosSize( rxCtrl );
    1090           0 :     Reference < XWindow > xW( rxCtrl, UNO_QUERY );
    1091           0 :     if ( !bOwnCtrl && xW.is() && !sTitle.isEmpty() )
    1092             :     {
    1093           0 :         awt::Rectangle aSizePos = xW->getPosSize();
    1094             : 
    1095           0 :         sal_Int32 nX = aSizePos.X, nY = aSizePos.Y, nWidth = aSizePos.Width, nHeight = aSizePos.Height;
    1096             :         // Retrieve the values set by the base class
    1097           0 :         OutputDevice*pOutDev = Application::GetDefaultDevice();
    1098           0 :         if ( pOutDev )
    1099             :         {
    1100           0 :             if ( !bOwnCtrl && !sTitle.isEmpty() )
    1101             :             {
    1102             :                 // Adjust Y based on height of Title
    1103           0 :                 ::Rectangle aRect;
    1104           0 :                 aRect = pOutDev->GetTextRect( aRect, sTitle );
    1105           0 :                 nY = nY + ( aRect.GetHeight() / 2 );
    1106             :             }
    1107             :         }
    1108             :         else
    1109             :         {
    1110           0 :             Reference< XWindowPeer > xPeer = ImplGetCompatiblePeer( true );
    1111           0 :             Reference< XDevice > xD( xPeer, UNO_QUERY );
    1112             : 
    1113           0 :             SimpleFontMetric aFM;
    1114           0 :             FontDescriptor aFD;
    1115           0 :             Any aVal = ImplGetPropertyValue( GetPropertyName( BASEPROPERTY_FONTDESCRIPTOR ) );
    1116             : 
    1117           0 :             aVal >>= aFD;
    1118           0 :             if ( !aFD.StyleName.isEmpty() )
    1119             :             {
    1120           0 :                 Reference< XFont > xFont = xD->getFont( aFD );
    1121           0 :                 aFM = xFont->getFontMetric();
    1122             :             }
    1123             :             else
    1124             :             {
    1125           0 :                 Reference< XGraphics > xG = xD->createGraphics();
    1126           0 :                 aFM = xG->getFontMetric();
    1127             :             }
    1128             : 
    1129           0 :             sal_Int16 nH = aFM.Ascent + aFM.Descent;
    1130           0 :             if ( !bOwnCtrl && !sTitle.isEmpty() )
    1131             :                 // offset y based on height of font ( not sure if my guess at the correct calculation is correct here )
    1132           0 :                 nY = nY + ( nH / 8); // how do I test this
    1133             :         }
    1134           0 :         xW->setPosSize( nX, nY, nWidth, nHeight, PosSize::POSSIZE );
    1135           0 :     }
    1136           0 : }
    1137             : 
    1138             : // ------------- UnoFrameModel -----------------
    1139             : 
    1140           2 : UnoFrameModel::UnoFrameModel(  const Reference< XComponentContext >& rxContext ) : ControlModelContainerBase( rxContext )
    1141             : {
    1142           2 :     ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL );
    1143           2 :     ImplRegisterProperty( BASEPROPERTY_BACKGROUNDCOLOR );
    1144           2 :     ImplRegisterProperty( BASEPROPERTY_ENABLED );
    1145           2 :     ImplRegisterProperty( BASEPROPERTY_ENABLEVISIBLE );
    1146           2 :     ImplRegisterProperty( BASEPROPERTY_FONTDESCRIPTOR );
    1147           2 :     ImplRegisterProperty( BASEPROPERTY_HELPTEXT );
    1148           2 :     ImplRegisterProperty( BASEPROPERTY_HELPURL );
    1149           2 :     ImplRegisterProperty( BASEPROPERTY_PRINTABLE );
    1150           2 :     ImplRegisterProperty( BASEPROPERTY_LABEL );
    1151           2 :     ImplRegisterProperty( BASEPROPERTY_WRITING_MODE );
    1152           2 :     ImplRegisterProperty( BASEPROPERTY_CONTEXT_WRITING_MODE );
    1153           2 :     ImplRegisterProperty( BASEPROPERTY_USERFORMCONTAINEES );
    1154           2 :     ImplRegisterProperty( BASEPROPERTY_HSCROLL );
    1155           2 :     ImplRegisterProperty( BASEPROPERTY_VSCROLL );
    1156           2 :     ImplRegisterProperty( BASEPROPERTY_SCROLLWIDTH );
    1157           2 :     ImplRegisterProperty( BASEPROPERTY_SCROLLHEIGHT );
    1158           2 :     ImplRegisterProperty( BASEPROPERTY_SCROLLTOP );
    1159           2 :     ImplRegisterProperty( BASEPROPERTY_SCROLLLEFT );
    1160             : 
    1161             : 
    1162           2 :     uno::Reference< XNameContainer > xNameCont = new SimpleNamedThingContainer< XControlModel >();
    1163           2 :     ImplRegisterProperty( BASEPROPERTY_USERFORMCONTAINEES, uno::makeAny( xNameCont ) );
    1164           2 : }
    1165             : 
    1166           0 : UnoFrameModel::UnoFrameModel( const UnoFrameModel& rModel )
    1167           0 :     : ControlModelContainerBase( rModel )
    1168             : {
    1169           0 : }
    1170             : 
    1171           4 : UnoFrameModel::~UnoFrameModel()
    1172             : {
    1173           4 : }
    1174             : 
    1175             : UnoControlModel*
    1176           0 : UnoFrameModel::Clone() const
    1177             : {
    1178             :     // clone the container itself
    1179           0 :     UnoFrameModel* pClone = new UnoFrameModel( *this );
    1180           0 :     Clone_Impl( *pClone );
    1181           0 :     return pClone;
    1182             : }
    1183             : 
    1184           0 : OUString UnoFrameModel::getServiceName() throw(::com::sun::star::uno::RuntimeException, std::exception)
    1185             : {
    1186           0 :     return OUString::createFromAscii( szServiceName_UnoFrameModel );
    1187             : }
    1188             : 
    1189          44 : uno::Any UnoFrameModel::ImplGetDefaultValue( sal_uInt16 nPropId ) const
    1190             : {
    1191          44 :     uno::Any aAny;
    1192          44 :     switch ( nPropId )
    1193             :     {
    1194             :         case BASEPROPERTY_DEFAULTCONTROL:
    1195             :         {
    1196           2 :             aAny <<= OUString::createFromAscii( szServiceName_UnoFrameControl );
    1197           2 :             return aAny;
    1198             :         }
    1199             :         case BASEPROPERTY_SCROLLWIDTH:
    1200             :         case BASEPROPERTY_SCROLLHEIGHT:
    1201             :         case BASEPROPERTY_SCROLLTOP:
    1202             :         case BASEPROPERTY_SCROLLLEFT:
    1203           8 :             aAny <<= sal_Int32(0);
    1204           8 :             return aAny;
    1205             :         case BASEPROPERTY_USERFORMCONTAINEES:
    1206             :         {
    1207           2 :             uno::Reference< XNameContainer > xNameCont = new SimpleNamedThingContainer< XControlModel >();
    1208           2 :             return makeAny( xNameCont );
    1209             :         }
    1210             :     }
    1211          32 :     return ControlModelContainerBase::ImplGetDefaultValue( nPropId );
    1212             : }
    1213             : 
    1214           0 : ::cppu::IPropertyArrayHelper& UnoFrameModel::getInfoHelper()
    1215             : {
    1216             :     static UnoPropertyArrayHelper* pHelper = NULL;
    1217           0 :     if ( !pHelper )
    1218             :     {
    1219           0 :         uno::Sequence<sal_Int32>    aIDs = ImplGetPropertyIds();
    1220           0 :         pHelper = new UnoPropertyArrayHelper( aIDs );
    1221             :     }
    1222           0 :     return *pHelper;
    1223             : }
    1224             : 
    1225             : // beans::XMultiPropertySet
    1226           0 : uno::Reference< beans::XPropertySetInfo > UnoFrameModel::getPropertySetInfo(  ) throw(uno::RuntimeException, std::exception)
    1227             : {
    1228           0 :     static uno::Reference< beans::XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
    1229           0 :     return xInfo;
    1230             : }
    1231             : 
    1232             : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
    1233          26 : stardiv_Toolkit_UnoControlDialogModel_get_implementation(
    1234             :     css::uno::XComponentContext *context,
    1235             :     css::uno::Sequence<css::uno::Any> const &)
    1236             : {
    1237          26 :     return cppu::acquire(new OGeometryControlModel<UnoControlDialogModel>(context));
    1238             : }
    1239             : 
    1240             : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
    1241          16 : stardiv_Toolkit_UnoDialogControl_get_implementation(
    1242             :     css::uno::XComponentContext *context,
    1243             :     css::uno::Sequence<css::uno::Any> const &)
    1244             : {
    1245          16 :     return cppu::acquire(new UnoDialogControl(context));
    1246             : }
    1247             : 
    1248             : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
    1249           0 : stardiv_Toolkit_UnoMultiPageControl_get_implementation(
    1250             :     css::uno::XComponentContext *context,
    1251             :     css::uno::Sequence<css::uno::Any> const &)
    1252             : {
    1253           0 :     return cppu::acquire(new UnoMultiPageControl(context));
    1254             : }
    1255             : 
    1256             : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
    1257           0 : stardiv_Toolkit_UnoMultiPageModel_get_implementation(
    1258             :     css::uno::XComponentContext *context,
    1259             :     css::uno::Sequence<css::uno::Any> const &)
    1260             : {
    1261           0 :     return cppu::acquire(new UnoMultiPageModel(context));
    1262             : }
    1263             : 
    1264             : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
    1265           0 : stardiv_Toolkit_UnoPageControl_get_implementation(
    1266             :     css::uno::XComponentContext *context,
    1267             :     css::uno::Sequence<css::uno::Any> const &)
    1268             : {
    1269           0 :     return cppu::acquire(new UnoPageControl(context));
    1270             : }
    1271             : 
    1272             : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
    1273           0 : stardiv_Toolkit_UnoPageModel_get_implementation(
    1274             :     css::uno::XComponentContext *context,
    1275             :     css::uno::Sequence<css::uno::Any> const &)
    1276             : {
    1277           0 :     return cppu::acquire(new UnoPageModel(context));
    1278             : }
    1279             : 
    1280             : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
    1281           0 : stardiv_Toolkit_UnoFrameControl_get_implementation(
    1282             :     css::uno::XComponentContext *context,
    1283             :     css::uno::Sequence<css::uno::Any> const &)
    1284             : {
    1285           0 :     return cppu::acquire(new UnoFrameControl(context));
    1286             : }
    1287             : 
    1288             : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
    1289           0 : stardiv_Toolkit_UnoFrameModel_get_implementation(
    1290             :     css::uno::XComponentContext *context,
    1291             :     css::uno::Sequence<css::uno::Any> const &)
    1292             : {
    1293           0 :     return cppu::acquire(new UnoFrameModel(context));
    1294        1227 : }
    1295             : 
    1296             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10