Files
libreoffice/toolkit/source/controls/unocontrolcontainer.cxx
Thomas Arnhold ba0a57702c remove OUString wrap for string literals
For some functions and all kinds of Exceptions.

CannotConvertException
CloseVetoException
DisposedException
EmptyUndoStackException
ErrorCodeIOException
Exception
GridInvalidDataException
GridInvalidModelException
IOException
IllegalAccessException
IllegalArgumentException
IllegalTypeException
IndexOutOfBoundsException
NoMasterException
NoSuchElementException
NoSupportException
PropertyVetoException
RuntimeException
SAXException
ScannerException
StorageWrappedTargetException
UnsupportedFlavorException
VetoException
WrappedTargetException
ZipIOException
throwGenericSQLException
throwIllegallArgumentException

createInstance
createInstanceWithContext
forName
getByName
getPackageManager
getPropertyValue
getUnpackedValueOrDefault
getValueByName
hasPropertyByName
openKey
setName
setPropertyValue
supportsService

bash command:

for i in `cat list`; do git grep "$i\s*(\s*OUString(\s*\"" -- '*.[hc]xx'
	| cut -d ':' -f1 | sort -u
	| xargs sed -i
		-e "s/\(\<$i\s*(\)\s*OUString(\s*\(\"[^\")\\]*\"\)\s*)\s*/\1\2/g"
		-e "s/\($i.*\)\"+ /\1\" + /g";
done

Change-Id: Iaf8e641b0abf28c082906014f87a183517630535
Reviewed-on: https://gerrit.libreoffice.org/4624
Tested-by: LibreOffice gerrit bot <gerrit@libreoffice.org>
Reviewed-by: Thomas Arnhold <thomas@arnhold.org>
Tested-by: Thomas Arnhold <thomas@arnhold.org>
2013-06-29 21:52:54 +00:00

845 lines
30 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#include <com/sun/star/awt/XVclContainerPeer.hpp>
#include <com/sun/star/beans/XPropertyChangeListener.hpp>
#include <cppuhelper/typeprovider.hxx>
#include <cppuhelper/implbase1.hxx>
#include <rtl/uuid.h>
#include <toolkit/controls/unocontrolcontainer.hxx>
#include <toolkit/helper/property.hxx>
#include <toolkit/helper/servicenames.hxx>
#include <comphelper/sequence.hxx>
#include <tools/debug.hxx>
#include <vcl/svapp.hxx>
#include <vcl/window.hxx>
#include <limits>
#include <map>
#include <boost/shared_ptr.hpp>
#include <com/sun/star/awt/VclWindowPeerAttribute.hpp>
using namespace ::com::sun::star;
// ----------------------------------------------------
// class UnoControlHolder
// ----------------------------------------------------
struct UnoControlHolder
{
uno::Reference< awt::XControl > mxControl;
OUString msName;
public:
UnoControlHolder( const OUString& rName, const uno::Reference< awt::XControl > & rControl )
: mxControl( rControl ),
msName( rName )
{
}
inline const OUString& getName() const { return msName; }
inline const uno::Reference< awt::XControl >& getControl() const { return mxControl; }
};
class UnoControlHolderList
{
public:
typedef sal_Int32 ControlIdentifier;
private:
typedef ::boost::shared_ptr< UnoControlHolder > ControlInfo;
typedef ::std::map< ControlIdentifier, ControlInfo > ControlMap;
private:
ControlMap maControls;
public:
UnoControlHolderList();
~UnoControlHolderList();
/** adds a control with the given name to the list
@param _rxControl
the control to add. Must not be <NULL/>
@param _pBName
the name of the control, or <NULL/> if an automatic name should be generated
@return
the identifier of the newly added control
*/
ControlIdentifier addControl( const uno::Reference< awt::XControl >& _rxControl, const OUString* _pName );
/** returns the number of controls in the list
*/
inline size_t size() const { return maControls.size(); }
/** determines whether or not the list is empty
*/
inline bool empty() const { return maControls.empty(); }
/** retrieves all controls currently in the list
@return
the number of controls in the list
*/
size_t getControls( uno::Sequence< uno::Reference< awt::XControl > >& _out_rControls ) const;
/** retrieves all identifiers of all controls currently in the list
@return
the number of controls in the list
*/
size_t getIdentifiers( uno::Sequence< sal_Int32 >& _out_rIdentifiers ) const;
/** returns the first control which is registered under the given name
*/
uno::Reference< awt::XControl >
getControlForName( const OUString& _rName ) const;
/** returns the identifier which a control is registered for, or -1 if the control
isn't registered
*/
ControlIdentifier
getControlIdentifier( const uno::Reference< awt::XControl >& _rxControl );
/** retrieves the control for a given id
@param _nIdentifier
the identifier for the control
@param _out_rxControl
takes the XControl upon successful return
@return
<TRUE/> if and only if a control with the given id is part of the list
*/
bool getControlForIdentifier( ControlIdentifier _nIdentifier, uno::Reference< awt::XControl >& _out_rxControl ) const;
/** removes a control from the list, given by id
@param _nId
The identifier of the control to remove.
*/
void removeControlById( ControlIdentifier _nId );
/** replaces a control from the list with another one
@param _nId
The identifier of the control to replace
@param _rxNewControl
the new control to put into the list
*/
void replaceControlById( ControlIdentifier _nId, const uno::Reference< awt::XControl >& _rxNewControl );
private:
/** adds a control
@param _rxControl
the control to add to the container
@param _pName
pointer to the name of the control. Might be <NULL/>, in this case, a name is generated.
@return
the identifier of the newly inserted control
*/
ControlIdentifier impl_addControl(
const uno::Reference< awt::XControl >& _rxControl,
const OUString* _pName
);
/** finds a free identifier
@throw uno::RuntimeException
if no free identifier can be found
*/
ControlIdentifier impl_getFreeIdentifier_throw();
/** finds a free name
@throw uno::RuntimeException
if no free name can be found
*/
OUString impl_getFreeName_throw();
};
//------------------------------------------------------------------------
UnoControlHolderList::UnoControlHolderList()
{
}
//------------------------------------------------------------------------
UnoControlHolderList::~UnoControlHolderList()
{
}
//------------------------------------------------------------------------
UnoControlHolderList::ControlIdentifier UnoControlHolderList::addControl( const uno::Reference< awt::XControl >& _rxControl, const OUString* _pName )
{
return impl_addControl( _rxControl, _pName );
}
//------------------------------------------------------------------------
size_t UnoControlHolderList::getControls( uno::Sequence< uno::Reference< awt::XControl > >& _out_rControls ) const
{
_out_rControls.realloc( maControls.size() );
uno::Reference< awt::XControl >* pControls = _out_rControls.getArray();
for ( ControlMap::const_iterator loop = maControls.begin();
loop != maControls.end();
++loop, ++pControls
)
*pControls = loop->second->getControl();
return maControls.size();
}
//------------------------------------------------------------------------
size_t UnoControlHolderList::getIdentifiers( uno::Sequence< sal_Int32 >& _out_rIdentifiers ) const
{
_out_rIdentifiers.realloc( maControls.size() );
sal_Int32* pIndentifiers = _out_rIdentifiers.getArray();
for ( ControlMap::const_iterator loop = maControls.begin();
loop != maControls.end();
++loop, ++pIndentifiers
)
*pIndentifiers = loop->first;
return maControls.size();
}
//------------------------------------------------------------------------
uno::Reference< awt::XControl > UnoControlHolderList::getControlForName( const OUString& _rName ) const
{
for ( ControlMap::const_iterator loop = maControls.begin();
loop != maControls.end();
++loop
)
if ( loop->second->getName() == _rName )
return loop->second->getControl();
return uno::Reference< awt::XControl >();
}
//------------------------------------------------------------------------
UnoControlHolderList::ControlIdentifier UnoControlHolderList::getControlIdentifier( const uno::Reference< awt::XControl >& _rxControl )
{
for ( ControlMap::iterator loop = maControls.begin();
loop != maControls.end();
++loop
)
{
if ( loop->second->getControl().get() == _rxControl.get() )
return loop->first;
}
return -1;
}
//------------------------------------------------------------------------
bool UnoControlHolderList::getControlForIdentifier( UnoControlHolderList::ControlIdentifier _nIdentifier, uno::Reference< awt::XControl >& _out_rxControl ) const
{
ControlMap::const_iterator pos = maControls.find( _nIdentifier );
if ( pos == maControls.end() )
return false;
_out_rxControl = pos->second->getControl();
return true;
}
//------------------------------------------------------------------------
void UnoControlHolderList::removeControlById( UnoControlHolderList::ControlIdentifier _nId )
{
ControlMap::iterator pos = maControls.find( _nId );
DBG_ASSERT( pos != maControls.end(), "UnoControlHolderList::removeControlById: invalid id!" );
if ( pos == maControls.end() )
return;
maControls.erase( pos );
}
//------------------------------------------------------------------------
void UnoControlHolderList::replaceControlById( ControlIdentifier _nId, const uno::Reference< awt::XControl >& _rxNewControl )
{
DBG_ASSERT( _rxNewControl.is(), "UnoControlHolderList::replaceControlById: invalid new control!" );
ControlMap::iterator pos = maControls.find( _nId );
DBG_ASSERT( pos != maControls.end(), "UnoControlHolderList::replaceControlById: invalid id!" );
if ( pos == maControls.end() )
return;
pos->second.reset( new UnoControlHolder( pos->second->getName(), _rxNewControl ) );
}
//------------------------------------------------------------------------
UnoControlHolderList::ControlIdentifier UnoControlHolderList::impl_addControl( const uno::Reference< awt::XControl >& _rxControl, const OUString* _pName )
{
DBG_ASSERT( _rxControl.is(), "UnoControlHolderList::impl_addControl: invalid control!" );
OUString sName = _pName ? *_pName : impl_getFreeName_throw();
sal_Int32 nId = impl_getFreeIdentifier_throw();
maControls[ nId ] = ControlInfo( new UnoControlHolder( sName, _rxControl ) );
return nId;
}
//------------------------------------------------------------------------
UnoControlHolderList::ControlIdentifier UnoControlHolderList::impl_getFreeIdentifier_throw()
{
for ( ControlIdentifier candidateId = 0; candidateId < ::std::numeric_limits< ControlIdentifier >::max(); ++candidateId )
{
ControlMap::const_iterator existent = maControls.find( candidateId );
if ( existent == maControls.end() )
return candidateId;
}
throw uno::RuntimeException("out of identifiers", NULL );
}
//------------------------------------------------------------------------
OUString UnoControlHolderList::impl_getFreeName_throw()
{
OUString name( "control_" );
for ( ControlIdentifier candidateId = 0; candidateId < ::std::numeric_limits< ControlIdentifier >::max(); ++candidateId )
{
OUString candidateName( name + OUString::valueOf( candidateId ) );
ControlMap::const_iterator loop = maControls.begin();
for ( ; loop != maControls.end(); ++loop )
{
if ( loop->second->getName() == candidateName )
break;
}
if ( loop == maControls.end() )
return candidateName;
}
throw uno::RuntimeException("out of identifiers", NULL );
}
// ----------------------------------------------------
// Function to set the controls' visibility according
// to the dialog's "Step" property
// ----------------------------------------------------
void implUpdateVisibility
(
sal_Int32 nDialogStep,
uno::Reference< awt::XControlContainer > xControlContainer
)
{
uno::Sequence< uno::Reference< awt::XControl > >
aCtrls = xControlContainer->getControls();
const uno::Reference< awt::XControl >* pCtrls = aCtrls.getConstArray();
sal_uInt32 nCtrls = aCtrls.getLength();
sal_Bool bCompleteVisible = (nDialogStep == 0);
for( sal_uInt32 n = 0; n < nCtrls; n++ )
{
uno::Reference< awt::XControl > xControl = pCtrls[ n ];
sal_Bool bVisible = bCompleteVisible;
if( !bVisible )
{
uno::Reference< awt::XControlModel > xModel( xControl->getModel() );
uno::Reference< beans::XPropertySet > xPSet
( xModel, uno::UNO_QUERY );
uno::Reference< beans::XPropertySetInfo >
xInfo = xPSet->getPropertySetInfo();
OUString aPropName( "Step" );
sal_Int32 nControlStep = 0;
if ( xInfo->hasPropertyByName( aPropName ) )
{
uno::Any aVal = xPSet->getPropertyValue( aPropName );
aVal >>= nControlStep;
}
bVisible = (nControlStep == 0) || (nControlStep == nDialogStep);
}
uno::Reference< awt::XWindow> xWindow
( xControl, uno::UNO_QUERY );
if( xWindow.is() )
xWindow->setVisible( bVisible );
}
}
// ----------------------------------------------------
// class DialogStepChangedListener
// ----------------------------------------------------
typedef ::cppu::WeakImplHelper1< beans::XPropertyChangeListener > PropertyChangeListenerHelper;
class DialogStepChangedListener: public PropertyChangeListenerHelper
{
private:
uno::Reference< awt::XControlContainer > mxControlContainer;
public:
DialogStepChangedListener( uno::Reference< awt::XControlContainer > xControlContainer )
: mxControlContainer( xControlContainer ) {}
// XEventListener
virtual void SAL_CALL disposing( const lang::EventObject& Source ) throw( uno::RuntimeException);
// XPropertyChangeListener
virtual void SAL_CALL propertyChange( const beans::PropertyChangeEvent& evt ) throw( uno::RuntimeException);
};
void SAL_CALL DialogStepChangedListener::disposing( const lang::EventObject& /*_rSource*/)
throw( uno::RuntimeException)
{
mxControlContainer.clear();
}
void SAL_CALL DialogStepChangedListener::propertyChange( const beans::PropertyChangeEvent& evt )
throw( uno::RuntimeException)
{
// evt.PropertyName HAS to be "Step" because we only use the listener for that
sal_Int32 nDialogStep = 0;
evt.NewValue >>= nDialogStep;
implUpdateVisibility( nDialogStep, mxControlContainer );
}
// ----------------------------------------------------
// class UnoControlContainer
// ----------------------------------------------------
UnoControlContainer::UnoControlContainer()
:UnoControlContainer_Base()
,maCListeners( *this )
{
mpControls = new UnoControlHolderList;
}
UnoControlContainer::UnoControlContainer(const uno::Reference< awt::XWindowPeer >& xP )
:UnoControlContainer_Base()
,maCListeners( *this )
{
setPeer( xP );
mbDisposePeer = sal_False;
mpControls = new UnoControlHolderList;
}
UnoControlContainer::~UnoControlContainer()
{
DELETEZ( mpControls );
}
void UnoControlContainer::ImplActivateTabControllers()
{
sal_uInt32 nCount = maTabControllers.getLength();
for ( sal_uInt32 n = 0; n < nCount; n++ )
{
maTabControllers.getArray()[n]->setContainer( this );
maTabControllers.getArray()[n]->activateTabOrder();
}
}
// lang::XComponent
void UnoControlContainer::dispose( ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
lang::EventObject aDisposeEvent;
aDisposeEvent.Source = static_cast< uno::XAggregation* >( this );
// Notify listeners about disposal of this Container (This is much faster if they
// listen on the controls and the container).
maDisposeListeners.disposeAndClear( aDisposeEvent );
maCListeners.disposeAndClear( aDisposeEvent );
uno::Sequence< uno::Reference< awt::XControl > > aCtrls = getControls();
uno::Reference< awt::XControl >* pCtrls = aCtrls.getArray();
uno::Reference< awt::XControl >* pCtrlsEnd = pCtrls + aCtrls.getLength();
for( ; pCtrls < pCtrlsEnd; ++pCtrls )
{
removingControl( *pCtrls );
// Delete control
(*pCtrls)->dispose();
}
// Delete all structures
DELETEZ( mpControls );
mpControls = new UnoControlHolderList;
UnoControlBase::dispose();
}
// lang::XEventListener
void UnoControlContainer::disposing( const lang::EventObject& _rEvt ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
uno::Reference< awt::XControl > xControl( _rEvt.Source, uno::UNO_QUERY );
if ( xControl.is() )
removeControl( xControl );
UnoControlBase::disposing( _rEvt );
}
// container::XContainer
void UnoControlContainer::addContainerListener( const uno::Reference< container::XContainerListener >& rxListener ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
maCListeners.addInterface( rxListener );
}
void UnoControlContainer::removeContainerListener( const uno::Reference< container::XContainerListener >& rxListener ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
maCListeners.removeInterface( rxListener );
}
::sal_Int32 SAL_CALL UnoControlContainer::insert( const uno::Any& _rElement ) throw (lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
uno::Reference< awt::XControl > xControl;
if ( !( _rElement >>= xControl ) || !xControl.is() )
throw lang::IllegalArgumentException(
OUString( "Elements must support the XControl interface." ),
*this,
1
);
return impl_addControl( xControl, NULL );
}
void SAL_CALL UnoControlContainer::removeByIdentifier( ::sal_Int32 _nIdentifier ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
uno::Reference< awt::XControl > xControl;
if ( !mpControls->getControlForIdentifier( _nIdentifier, xControl ) )
throw container::NoSuchElementException(
OUString( "There is no element with the given identifier." ),
*this
);
impl_removeControl( _nIdentifier, xControl, NULL );
}
void SAL_CALL UnoControlContainer::replaceByIdentifer( ::sal_Int32 _nIdentifier, const uno::Any& _rElement ) throw (lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
uno::Reference< awt::XControl > xExistentControl;
if ( !mpControls->getControlForIdentifier( _nIdentifier, xExistentControl ) )
throw container::NoSuchElementException(
OUString( "There is no element with the given identifier." ),
*this
);
uno::Reference< awt::XControl > xNewControl;
if ( !( _rElement >>= xNewControl ) )
throw lang::IllegalArgumentException(
OUString( "Elements must support the XControl interface." ),
*this,
1
);
removingControl( xExistentControl );
mpControls->replaceControlById( _nIdentifier, xNewControl );
addingControl( xNewControl );
impl_createControlPeerIfNecessary( xNewControl );
if ( maCListeners.getLength() )
{
container::ContainerEvent aEvent;
aEvent.Source = *this;
aEvent.Accessor <<= _nIdentifier;
aEvent.Element <<= xNewControl;
aEvent.ReplacedElement <<= xExistentControl;
maCListeners.elementReplaced( aEvent );
}
}
uno::Any SAL_CALL UnoControlContainer::getByIdentifier( ::sal_Int32 _nIdentifier ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
uno::Reference< awt::XControl > xControl;
if ( !mpControls->getControlForIdentifier( _nIdentifier, xControl ) )
throw container::NoSuchElementException();
return uno::makeAny( xControl );
}
uno::Sequence< ::sal_Int32 > SAL_CALL UnoControlContainer::getIdentifiers( ) throw (uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
uno::Sequence< ::sal_Int32 > aIdentifiers;
mpControls->getIdentifiers( aIdentifiers );
return aIdentifiers;
}
// container::XElementAccess
uno::Type SAL_CALL UnoControlContainer::getElementType( ) throw (uno::RuntimeException)
{
return awt::XControlModel::static_type();
}
::sal_Bool SAL_CALL UnoControlContainer::hasElements( ) throw (uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
return !mpControls->empty();
}
// awt::XControlContainer
void UnoControlContainer::setStatusText( const OUString& rStatusText ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
// Descend the parent hierarchy
uno::Reference< awt::XControlContainer > xContainer( mxContext, uno::UNO_QUERY );
if( xContainer.is() )
xContainer->setStatusText( rStatusText );
}
uno::Sequence< uno::Reference< awt::XControl > > UnoControlContainer::getControls( ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
uno::Sequence< uno::Reference< awt::XControl > > aControls;
mpControls->getControls( aControls );
return aControls;
}
uno::Reference< awt::XControl > UnoControlContainer::getControl( const OUString& rName ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
return mpControls->getControlForName( rName );
}
void UnoControlContainer::addingControl( const uno::Reference< awt::XControl >& _rxControl )
{
if ( _rxControl.is() )
{
uno::Reference< uno::XInterface > xThis;
OWeakAggObject::queryInterface( ::getCppuType( static_cast< uno::Reference< uno::XInterface >* >( NULL ) ) ) >>= xThis;
_rxControl->setContext( xThis );
_rxControl->addEventListener( this );
}
}
void UnoControlContainer::impl_createControlPeerIfNecessary( const uno::Reference< awt::XControl >& _rxControl )
{
OSL_PRECOND( _rxControl.is(), "UnoControlContainer::impl_createControlPeerIfNecessary: invalid control, this will crash!" );
// if the container already has a peer, then also create a peer for the control
uno::Reference< awt::XWindowPeer > xMyPeer( getPeer() );
if( xMyPeer.is() )
{
_rxControl->createPeer( NULL, xMyPeer );
ImplActivateTabControllers();
}
}
sal_Int32 UnoControlContainer::impl_addControl( const uno::Reference< awt::XControl >& _rxControl, const OUString* _pName )
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
UnoControlHolderList::ControlIdentifier id = mpControls->addControl( _rxControl, _pName );
addingControl( _rxControl );
impl_createControlPeerIfNecessary( _rxControl );
if ( maCListeners.getLength() )
{
container::ContainerEvent aEvent;
aEvent.Source = *this;
_pName ? ( aEvent.Accessor <<= *_pName ) : ( aEvent.Accessor <<= (sal_Int32)id );
aEvent.Element <<= _rxControl;
maCListeners.elementInserted( aEvent );
}
return id;
}
void UnoControlContainer::addControl( const OUString& rName, const uno::Reference< awt::XControl >& rControl ) throw(uno::RuntimeException)
{
if ( rControl.is() )
impl_addControl( rControl, &rName );
}
void UnoControlContainer::removingControl( const uno::Reference< awt::XControl >& _rxControl )
{
if ( _rxControl.is() )
{
_rxControl->removeEventListener( this );
_rxControl->setContext( NULL );
}
}
void UnoControlContainer::impl_removeControl( sal_Int32 _nId, const uno::Reference< awt::XControl >& _rxControl, const OUString* _pNameAccessor )
{
#ifdef DBG_UTIL
{
uno::Reference< awt::XControl > xControl;
bool bHas = mpControls->getControlForIdentifier( _nId, xControl );
DBG_ASSERT( bHas && xControl == _rxControl, "UnoControlContainer::impl_removeControl: inconsistency in the parameters!" );
}
#endif
removingControl( _rxControl );
mpControls->removeControlById( _nId );
if ( maCListeners.getLength() )
{
container::ContainerEvent aEvent;
aEvent.Source = *this;
_pNameAccessor ? ( aEvent.Accessor <<= *_pNameAccessor ) : ( aEvent.Accessor <<= _nId );
aEvent.Element <<= _rxControl;
maCListeners.elementRemoved( aEvent );
}
}
void UnoControlContainer::removeControl( const uno::Reference< awt::XControl >& _rxControl ) throw(uno::RuntimeException)
{
if ( _rxControl.is() )
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
UnoControlHolderList::ControlIdentifier id = mpControls->getControlIdentifier( _rxControl );
if ( id != -1 )
impl_removeControl( id, _rxControl, NULL );
}
}
// awt::XUnoControlContainer
void UnoControlContainer::setTabControllers( const uno::Sequence< uno::Reference< awt::XTabController > >& TabControllers ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
maTabControllers = TabControllers;
}
uno::Sequence< uno::Reference< awt::XTabController > > UnoControlContainer::getTabControllers( ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
return maTabControllers;
}
void UnoControlContainer::addTabController( const uno::Reference< awt::XTabController >& TabController ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
sal_uInt32 nCount = maTabControllers.getLength();
maTabControllers.realloc( nCount + 1 );
maTabControllers[ nCount ] = TabController;
}
void UnoControlContainer::removeTabController( const uno::Reference< awt::XTabController >& TabController ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
sal_uInt32 nCount = maTabControllers.getLength();
const uno::Reference< awt::XTabController >* pLoop = maTabControllers.getConstArray();
for ( sal_uInt32 n = 0; n < nCount; ++n, ++pLoop )
{
if( pLoop->get() == TabController.get() )
{
::comphelper::removeElementAt( maTabControllers, n );
break;
}
}
}
// awt::XControl
void UnoControlContainer::createPeer( const uno::Reference< awt::XToolkit >& rxToolkit, const uno::Reference< awt::XWindowPeer >& rParent ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
if( !getPeer().is() )
{
sal_Bool bVis = maComponentInfos.bVisible;
if( bVis )
UnoControl::setVisible( sal_False );
uno::Reference< beans::XPropertySet > xTmpPropSet
( getModel(), uno::UNO_QUERY );
// Create a new peer
UnoControl::createPeer( rxToolkit, rParent );
// Create all children's peers
if ( !mbCreatingCompatiblePeer )
{
// Evaluate "Step" property
uno::Reference< awt::XControlModel > xModel( getModel() );
uno::Reference< beans::XPropertySet > xPSet
( xModel, uno::UNO_QUERY );
uno::Reference< beans::XPropertySetInfo >
xInfo = xPSet->getPropertySetInfo();
OUString aPropName( "Step" );
if ( xInfo->hasPropertyByName( aPropName ) )
{
::com::sun::star::uno::Any aVal = xPSet->getPropertyValue( aPropName );
sal_Int32 nDialogStep = 0;
aVal >>= nDialogStep;
uno::Reference< awt::XControlContainer > xContainer =
(static_cast< awt::XControlContainer* >(this));
implUpdateVisibility( nDialogStep, xContainer );
uno::Reference< beans::XPropertyChangeListener > xListener =
(static_cast< beans::XPropertyChangeListener* >(
new DialogStepChangedListener( xContainer ) ) );
xPSet->addPropertyChangeListener( aPropName, xListener );
}
uno::Sequence< uno::Reference< awt::XControl > > aCtrls = getControls();
sal_uInt32 nCtrls = aCtrls.getLength();
for( sal_uInt32 n = 0; n < nCtrls; n++ )
aCtrls.getArray()[n]->createPeer( rxToolkit, getPeer() );
uno::Reference< awt::XVclContainerPeer > xC( getPeer(), uno::UNO_QUERY );
if ( xC.is() )
xC->enableDialogControl( sal_True );
ImplActivateTabControllers();
}
if( bVis && !isDesignMode() )
UnoControl::setVisible( sal_True );
}
}
// awt::XWindow
void UnoControlContainer::setVisible( sal_Bool bVisible ) throw(uno::RuntimeException)
{
::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
UnoControl::setVisible( bVisible );
if( !mxContext.is() && bVisible )
// This is a Topwindow, thus show it automatically
createPeer( uno::Reference< awt::XToolkit > (), uno::Reference< awt::XWindowPeer > () );
}
void UnoControlContainer::PrepareWindowDescriptor( ::com::sun::star::awt::WindowDescriptor& rDesc )
{
// HACK due to the fact that we can't really use VSCROLL & HSCROLL
// for Dialog ( ::com::sun::star::awt::VclWindowPeerAttribute::VSCROLL
// has the same value as
// ::com::sun::star::awt::WindowAttribute::NODECORATION )
// For convenience in the PropBrowse using HSCROLL and VSCROLL ensures
// the Correct text. We exchange them here and the control knows
// about this hack ( it sucks badly I know )
if ( rDesc.WindowAttributes & ::com::sun::star::awt::VclWindowPeerAttribute::VSCROLL )
{
rDesc.WindowAttributes &= ~::com::sun::star::awt::VclWindowPeerAttribute::VSCROLL;
rDesc.WindowAttributes |= ::com::sun::star::awt::VclWindowPeerAttribute::AUTOVSCROLL;
}
if ( rDesc.WindowAttributes & ::com::sun::star::awt::VclWindowPeerAttribute::HSCROLL )
{
rDesc.WindowAttributes &= ~::com::sun::star::awt::VclWindowPeerAttribute::HSCROLL;
rDesc.WindowAttributes |= ::com::sun::star::awt::VclWindowPeerAttribute::AUTOHSCROLL;
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */