1*b0724fc6SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*b0724fc6SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*b0724fc6SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*b0724fc6SAndrew Rist * distributed with this work for additional information 6*b0724fc6SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*b0724fc6SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*b0724fc6SAndrew Rist * "License"); you may not use this file except in compliance 9*b0724fc6SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*b0724fc6SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*b0724fc6SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*b0724fc6SAndrew Rist * software distributed under the License is distributed on an 15*b0724fc6SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b0724fc6SAndrew Rist * KIND, either express or implied. See the License for the 17*b0724fc6SAndrew Rist * specific language governing permissions and limitations 18*b0724fc6SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*b0724fc6SAndrew Rist *************************************************************/ 21*b0724fc6SAndrew Rist 22*b0724fc6SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_toolkit.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir 28cdf0e10cSrcweir #include <com/sun/star/awt/XVclContainerPeer.hpp> 29cdf0e10cSrcweir #include <com/sun/star/beans/XPropertyChangeListener.hpp> 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx> 32cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx> 33cdf0e10cSrcweir #include <rtl/memory.h> 34cdf0e10cSrcweir #include <rtl/uuid.h> 35cdf0e10cSrcweir 36cdf0e10cSrcweir #include <toolkit/controls/unocontrolcontainer.hxx> 37cdf0e10cSrcweir #include <toolkit/helper/property.hxx> 38cdf0e10cSrcweir #include <toolkit/helper/servicenames.hxx> 39cdf0e10cSrcweir #include <comphelper/sequence.hxx> 40cdf0e10cSrcweir 41cdf0e10cSrcweir #include <tools/debug.hxx> 42cdf0e10cSrcweir #include <tools/list.hxx> 43cdf0e10cSrcweir #include <vcl/svapp.hxx> 44cdf0e10cSrcweir #include <vcl/window.hxx> 45cdf0e10cSrcweir 46cdf0e10cSrcweir #include <limits> 47cdf0e10cSrcweir #include <map> 48cdf0e10cSrcweir #include <boost/shared_ptr.hpp> 49cdf0e10cSrcweir 50cdf0e10cSrcweir using namespace ::com::sun::star; 51cdf0e10cSrcweir 52cdf0e10cSrcweir extern WorkWindow* lcl_GetDefaultWindow(); 53cdf0e10cSrcweir 54cdf0e10cSrcweir // ---------------------------------------------------- 55cdf0e10cSrcweir // class UnoControlHolder 56cdf0e10cSrcweir // ---------------------------------------------------- 57cdf0e10cSrcweir struct UnoControlHolder 58cdf0e10cSrcweir { 59cdf0e10cSrcweir uno::Reference< awt::XControl > mxControl; 60cdf0e10cSrcweir ::rtl::OUString msName; 61cdf0e10cSrcweir 62cdf0e10cSrcweir public: 63cdf0e10cSrcweir UnoControlHolder( const ::rtl::OUString& rName, const uno::Reference< awt::XControl > & rControl ) 64cdf0e10cSrcweir : mxControl( rControl ), 65cdf0e10cSrcweir msName( rName ) 66cdf0e10cSrcweir { 67cdf0e10cSrcweir } 68cdf0e10cSrcweir 69cdf0e10cSrcweir inline const ::rtl::OUString& getName() const { return msName; } 70cdf0e10cSrcweir inline const uno::Reference< awt::XControl >& getControl() const { return mxControl; } 71cdf0e10cSrcweir }; 72cdf0e10cSrcweir 73cdf0e10cSrcweir //DECLARE_LIST( UnoControlHolderList, UnoControlHolder* ); 74cdf0e10cSrcweir 75cdf0e10cSrcweir class UnoControlHolderList 76cdf0e10cSrcweir { 77cdf0e10cSrcweir public: 78cdf0e10cSrcweir typedef sal_Int32 ControlIdentifier; 79cdf0e10cSrcweir private: 80cdf0e10cSrcweir typedef ::boost::shared_ptr< UnoControlHolder > ControlInfo; 81cdf0e10cSrcweir typedef ::std::map< ControlIdentifier, ControlInfo > ControlMap; 82cdf0e10cSrcweir 83cdf0e10cSrcweir private: 84cdf0e10cSrcweir ControlMap maControls; 85cdf0e10cSrcweir 86cdf0e10cSrcweir public: 87cdf0e10cSrcweir UnoControlHolderList(); 88cdf0e10cSrcweir ~UnoControlHolderList(); 89cdf0e10cSrcweir 90cdf0e10cSrcweir /** adds a control with the given name to the list 91cdf0e10cSrcweir @param _rxControl 92cdf0e10cSrcweir the control to add. Must not be <NULL/> 93cdf0e10cSrcweir @param _pBName 94cdf0e10cSrcweir the name of the control, or <NULL/> if an automatic name should be generated 95cdf0e10cSrcweir @return 96cdf0e10cSrcweir the identifier of the newly added control 97cdf0e10cSrcweir */ 98cdf0e10cSrcweir ControlIdentifier addControl( const uno::Reference< awt::XControl >& _rxControl, const ::rtl::OUString* _pName ); 99cdf0e10cSrcweir 100cdf0e10cSrcweir /** returns the number of controls in the list 101cdf0e10cSrcweir */ 102cdf0e10cSrcweir inline size_t size() const { return maControls.size(); } 103cdf0e10cSrcweir 104cdf0e10cSrcweir /** determines whether or not the list is empty 105cdf0e10cSrcweir */ 106cdf0e10cSrcweir inline bool empty() const { return maControls.empty(); } 107cdf0e10cSrcweir 108cdf0e10cSrcweir /** retrieves all controls currently in the list 109cdf0e10cSrcweir @return 110cdf0e10cSrcweir the number of controls in the list 111cdf0e10cSrcweir */ 112cdf0e10cSrcweir size_t getControls( uno::Sequence< uno::Reference< awt::XControl > >& _out_rControls ) const; 113cdf0e10cSrcweir 114cdf0e10cSrcweir /** retrieves all identifiers of all controls currently in the list 115cdf0e10cSrcweir @return 116cdf0e10cSrcweir the number of controls in the list 117cdf0e10cSrcweir */ 118cdf0e10cSrcweir size_t getIdentifiers( uno::Sequence< sal_Int32 >& _out_rIdentifiers ) const; 119cdf0e10cSrcweir 120cdf0e10cSrcweir /** returns the first control which is registered under the given name 121cdf0e10cSrcweir */ 122cdf0e10cSrcweir uno::Reference< awt::XControl > 123cdf0e10cSrcweir getControlForName( const ::rtl::OUString& _rName ) const; 124cdf0e10cSrcweir 125cdf0e10cSrcweir /** returns the identifier which a control is registered for, or -1 if the control 126cdf0e10cSrcweir isn't registered 127cdf0e10cSrcweir */ 128cdf0e10cSrcweir ControlIdentifier 129cdf0e10cSrcweir getControlIdentifier( const uno::Reference< awt::XControl >& _rxControl ); 130cdf0e10cSrcweir 131cdf0e10cSrcweir /** retrieves the control for a given id 132cdf0e10cSrcweir @param _nIdentifier 133cdf0e10cSrcweir the identifier for the control 134cdf0e10cSrcweir @param _out_rxControl 135cdf0e10cSrcweir takes the XControl upon successful return 136cdf0e10cSrcweir @return 137cdf0e10cSrcweir <TRUE/> if and only if a control with the given id is part of the list 138cdf0e10cSrcweir */ 139cdf0e10cSrcweir bool getControlForIdentifier( ControlIdentifier _nIdentifier, uno::Reference< awt::XControl >& _out_rxControl ) const; 140cdf0e10cSrcweir 141cdf0e10cSrcweir /** removes a control from the list, given by id 142cdf0e10cSrcweir @param _nId 143cdf0e10cSrcweir The identifier of the control to remove. 144cdf0e10cSrcweir */ 145cdf0e10cSrcweir void removeControlById( ControlIdentifier _nId ); 146cdf0e10cSrcweir 147cdf0e10cSrcweir /** replaces a control from the list with another one 148cdf0e10cSrcweir @param _nId 149cdf0e10cSrcweir The identifier of the control to replace 150cdf0e10cSrcweir @param _rxNewControl 151cdf0e10cSrcweir the new control to put into the list 152cdf0e10cSrcweir */ 153cdf0e10cSrcweir void replaceControlById( ControlIdentifier _nId, const uno::Reference< awt::XControl >& _rxNewControl ); 154cdf0e10cSrcweir 155cdf0e10cSrcweir private: 156cdf0e10cSrcweir /** adds a control 157cdf0e10cSrcweir @param _rxControl 158cdf0e10cSrcweir the control to add to the container 159cdf0e10cSrcweir @param _pName 160cdf0e10cSrcweir pointer to the name of the control. Might be <NULL/>, in this case, a name is generated. 161cdf0e10cSrcweir @return 162cdf0e10cSrcweir the identifier of the newly inserted control 163cdf0e10cSrcweir */ 164cdf0e10cSrcweir ControlIdentifier impl_addControl( 165cdf0e10cSrcweir const uno::Reference< awt::XControl >& _rxControl, 166cdf0e10cSrcweir const ::rtl::OUString* _pName 167cdf0e10cSrcweir ); 168cdf0e10cSrcweir 169cdf0e10cSrcweir /** finds a free identifier 170cdf0e10cSrcweir @throw uno::RuntimeException 171cdf0e10cSrcweir if no free identifier can be found 172cdf0e10cSrcweir */ 173cdf0e10cSrcweir ControlIdentifier impl_getFreeIdentifier_throw(); 174cdf0e10cSrcweir 175cdf0e10cSrcweir /** finds a free name 176cdf0e10cSrcweir @throw uno::RuntimeException 177cdf0e10cSrcweir if no free name can be found 178cdf0e10cSrcweir */ 179cdf0e10cSrcweir ::rtl::OUString impl_getFreeName_throw(); 180cdf0e10cSrcweir }; 181cdf0e10cSrcweir 182cdf0e10cSrcweir //------------------------------------------------------------------------ 183cdf0e10cSrcweir UnoControlHolderList::UnoControlHolderList() 184cdf0e10cSrcweir { 185cdf0e10cSrcweir } 186cdf0e10cSrcweir 187cdf0e10cSrcweir //------------------------------------------------------------------------ 188cdf0e10cSrcweir UnoControlHolderList::~UnoControlHolderList() 189cdf0e10cSrcweir { 190cdf0e10cSrcweir } 191cdf0e10cSrcweir 192cdf0e10cSrcweir //------------------------------------------------------------------------ 193cdf0e10cSrcweir UnoControlHolderList::ControlIdentifier UnoControlHolderList::addControl( const uno::Reference< awt::XControl >& _rxControl, const ::rtl::OUString* _pName ) 194cdf0e10cSrcweir { 195cdf0e10cSrcweir return impl_addControl( _rxControl, _pName ); 196cdf0e10cSrcweir } 197cdf0e10cSrcweir 198cdf0e10cSrcweir //------------------------------------------------------------------------ 199cdf0e10cSrcweir size_t UnoControlHolderList::getControls( uno::Sequence< uno::Reference< awt::XControl > >& _out_rControls ) const 200cdf0e10cSrcweir { 201cdf0e10cSrcweir _out_rControls.realloc( maControls.size() ); 202cdf0e10cSrcweir uno::Reference< awt::XControl >* pControls = _out_rControls.getArray(); 203cdf0e10cSrcweir for ( ControlMap::const_iterator loop = maControls.begin(); 204cdf0e10cSrcweir loop != maControls.end(); 205cdf0e10cSrcweir ++loop, ++pControls 206cdf0e10cSrcweir ) 207cdf0e10cSrcweir *pControls = loop->second->getControl(); 208cdf0e10cSrcweir return maControls.size(); 209cdf0e10cSrcweir } 210cdf0e10cSrcweir 211cdf0e10cSrcweir //------------------------------------------------------------------------ 212cdf0e10cSrcweir size_t UnoControlHolderList::getIdentifiers( uno::Sequence< sal_Int32 >& _out_rIdentifiers ) const 213cdf0e10cSrcweir { 214cdf0e10cSrcweir _out_rIdentifiers.realloc( maControls.size() ); 215cdf0e10cSrcweir sal_Int32* pIndentifiers = _out_rIdentifiers.getArray(); 216cdf0e10cSrcweir for ( ControlMap::const_iterator loop = maControls.begin(); 217cdf0e10cSrcweir loop != maControls.end(); 218cdf0e10cSrcweir ++loop, ++pIndentifiers 219cdf0e10cSrcweir ) 220cdf0e10cSrcweir *pIndentifiers = loop->first; 221cdf0e10cSrcweir return maControls.size(); 222cdf0e10cSrcweir } 223cdf0e10cSrcweir 224cdf0e10cSrcweir //------------------------------------------------------------------------ 225cdf0e10cSrcweir uno::Reference< awt::XControl > UnoControlHolderList::getControlForName( const ::rtl::OUString& _rName ) const 226cdf0e10cSrcweir { 227cdf0e10cSrcweir for ( ControlMap::const_iterator loop = maControls.begin(); 228cdf0e10cSrcweir loop != maControls.end(); 229cdf0e10cSrcweir ++loop 230cdf0e10cSrcweir ) 231cdf0e10cSrcweir if ( loop->second->getName() == _rName ) 232cdf0e10cSrcweir return loop->second->getControl(); 233cdf0e10cSrcweir return uno::Reference< awt::XControl >(); 234cdf0e10cSrcweir } 235cdf0e10cSrcweir 236cdf0e10cSrcweir //------------------------------------------------------------------------ 237cdf0e10cSrcweir UnoControlHolderList::ControlIdentifier UnoControlHolderList::getControlIdentifier( const uno::Reference< awt::XControl >& _rxControl ) 238cdf0e10cSrcweir { 239cdf0e10cSrcweir for ( ControlMap::iterator loop = maControls.begin(); 240cdf0e10cSrcweir loop != maControls.end(); 241cdf0e10cSrcweir ++loop 242cdf0e10cSrcweir ) 243cdf0e10cSrcweir { 244cdf0e10cSrcweir if ( loop->second->getControl().get() == _rxControl.get() ) 245cdf0e10cSrcweir return loop->first; 246cdf0e10cSrcweir } 247cdf0e10cSrcweir return -1; 248cdf0e10cSrcweir } 249cdf0e10cSrcweir 250cdf0e10cSrcweir //------------------------------------------------------------------------ 251cdf0e10cSrcweir bool UnoControlHolderList::getControlForIdentifier( UnoControlHolderList::ControlIdentifier _nIdentifier, uno::Reference< awt::XControl >& _out_rxControl ) const 252cdf0e10cSrcweir { 253cdf0e10cSrcweir ControlMap::const_iterator pos = maControls.find( _nIdentifier ); 254cdf0e10cSrcweir if ( pos == maControls.end() ) 255cdf0e10cSrcweir return false; 256cdf0e10cSrcweir _out_rxControl = pos->second->getControl(); 257cdf0e10cSrcweir return true; 258cdf0e10cSrcweir } 259cdf0e10cSrcweir 260cdf0e10cSrcweir //------------------------------------------------------------------------ 261cdf0e10cSrcweir void UnoControlHolderList::removeControlById( UnoControlHolderList::ControlIdentifier _nId ) 262cdf0e10cSrcweir { 263cdf0e10cSrcweir ControlMap::iterator pos = maControls.find( _nId ); 264cdf0e10cSrcweir DBG_ASSERT( pos != maControls.end(), "UnoControlHolderList::removeControlById: invalid id!" ); 265cdf0e10cSrcweir if ( pos == maControls.end() ) 266cdf0e10cSrcweir return; 267cdf0e10cSrcweir 268cdf0e10cSrcweir maControls.erase( pos ); 269cdf0e10cSrcweir } 270cdf0e10cSrcweir 271cdf0e10cSrcweir //------------------------------------------------------------------------ 272cdf0e10cSrcweir void UnoControlHolderList::replaceControlById( ControlIdentifier _nId, const uno::Reference< awt::XControl >& _rxNewControl ) 273cdf0e10cSrcweir { 274cdf0e10cSrcweir DBG_ASSERT( _rxNewControl.is(), "UnoControlHolderList::replaceControlById: invalid new control!" ); 275cdf0e10cSrcweir 276cdf0e10cSrcweir ControlMap::iterator pos = maControls.find( _nId ); 277cdf0e10cSrcweir DBG_ASSERT( pos != maControls.end(), "UnoControlHolderList::replaceControlById: invalid id!" ); 278cdf0e10cSrcweir if ( pos == maControls.end() ) 279cdf0e10cSrcweir return; 280cdf0e10cSrcweir 281cdf0e10cSrcweir pos->second.reset( new UnoControlHolder( pos->second->getName(), _rxNewControl ) ); 282cdf0e10cSrcweir } 283cdf0e10cSrcweir 284cdf0e10cSrcweir //------------------------------------------------------------------------ 285cdf0e10cSrcweir UnoControlHolderList::ControlIdentifier UnoControlHolderList::impl_addControl( const uno::Reference< awt::XControl >& _rxControl, const ::rtl::OUString* _pName ) 286cdf0e10cSrcweir { 287cdf0e10cSrcweir DBG_ASSERT( _rxControl.is(), "UnoControlHolderList::impl_addControl: invalid control!" ); 288cdf0e10cSrcweir 289cdf0e10cSrcweir ::rtl::OUString sName = _pName ? *_pName : impl_getFreeName_throw(); 290cdf0e10cSrcweir sal_Int32 nId = impl_getFreeIdentifier_throw(); 291cdf0e10cSrcweir 292cdf0e10cSrcweir maControls[ nId ] = ControlInfo( new UnoControlHolder( sName, _rxControl ) ); 293cdf0e10cSrcweir return nId; 294cdf0e10cSrcweir } 295cdf0e10cSrcweir 296cdf0e10cSrcweir //------------------------------------------------------------------------ 297cdf0e10cSrcweir UnoControlHolderList::ControlIdentifier UnoControlHolderList::impl_getFreeIdentifier_throw() 298cdf0e10cSrcweir { 299cdf0e10cSrcweir for ( ControlIdentifier candidateId = 0; candidateId < ::std::numeric_limits< ControlIdentifier >::max(); ++candidateId ) 300cdf0e10cSrcweir { 301cdf0e10cSrcweir ControlMap::const_iterator existent = maControls.find( candidateId ); 302cdf0e10cSrcweir if ( existent == maControls.end() ) 303cdf0e10cSrcweir return candidateId; 304cdf0e10cSrcweir } 305cdf0e10cSrcweir throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "out of identifiers" ) ), NULL ); 306cdf0e10cSrcweir } 307cdf0e10cSrcweir 308cdf0e10cSrcweir //------------------------------------------------------------------------ 309cdf0e10cSrcweir ::rtl::OUString UnoControlHolderList::impl_getFreeName_throw() 310cdf0e10cSrcweir { 311cdf0e10cSrcweir ::rtl::OUString name( RTL_CONSTASCII_USTRINGPARAM( "control_" ) ); 312cdf0e10cSrcweir for ( ControlIdentifier candidateId = 0; candidateId < ::std::numeric_limits< ControlIdentifier >::max(); ++candidateId ) 313cdf0e10cSrcweir { 314cdf0e10cSrcweir ::rtl::OUString candidateName( name + ::rtl::OUString::valueOf( candidateId ) ); 315cdf0e10cSrcweir ControlMap::const_iterator loop = maControls.begin(); 316cdf0e10cSrcweir for ( ; loop != maControls.end(); ++loop ) 317cdf0e10cSrcweir { 318cdf0e10cSrcweir if ( loop->second->getName() == candidateName ) 319cdf0e10cSrcweir break; 320cdf0e10cSrcweir } 321cdf0e10cSrcweir if ( loop == maControls.end() ) 322cdf0e10cSrcweir return candidateName; 323cdf0e10cSrcweir } 324cdf0e10cSrcweir throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "out of identifiers" ) ), NULL ); 325cdf0e10cSrcweir } 326cdf0e10cSrcweir // ---------------------------------------------------- 327cdf0e10cSrcweir // Function to set the controls' visibility according 328cdf0e10cSrcweir // to the dialog's "Step" property 329cdf0e10cSrcweir // ---------------------------------------------------- 330cdf0e10cSrcweir void implUpdateVisibility 331cdf0e10cSrcweir ( 332cdf0e10cSrcweir sal_Int32 nDialogStep, 333cdf0e10cSrcweir uno::Reference< awt::XControlContainer > xControlContainer 334cdf0e10cSrcweir ) 335cdf0e10cSrcweir { 336cdf0e10cSrcweir uno::Sequence< uno::Reference< awt::XControl > > 337cdf0e10cSrcweir aCtrls = xControlContainer->getControls(); 338cdf0e10cSrcweir const uno::Reference< awt::XControl >* pCtrls = aCtrls.getConstArray(); 339cdf0e10cSrcweir sal_uInt32 nCtrls = aCtrls.getLength(); 340cdf0e10cSrcweir sal_Bool bCompleteVisible = (nDialogStep == 0); 341cdf0e10cSrcweir for( sal_uInt32 n = 0; n < nCtrls; n++ ) 342cdf0e10cSrcweir { 343cdf0e10cSrcweir uno::Reference< awt::XControl > xControl = pCtrls[ n ]; 344cdf0e10cSrcweir 345cdf0e10cSrcweir sal_Bool bVisible = bCompleteVisible; 346cdf0e10cSrcweir if( !bVisible ) 347cdf0e10cSrcweir { 348cdf0e10cSrcweir uno::Reference< awt::XControlModel > xModel( xControl->getModel() ); 349cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPSet 350cdf0e10cSrcweir ( xModel, uno::UNO_QUERY ); 351cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > 352cdf0e10cSrcweir xInfo = xPSet->getPropertySetInfo(); 353cdf0e10cSrcweir ::rtl::OUString aPropName(RTL_CONSTASCII_USTRINGPARAM( "Step" ) ); 354cdf0e10cSrcweir sal_Int32 nControlStep = 0; 355cdf0e10cSrcweir if ( xInfo->hasPropertyByName( aPropName ) ) 356cdf0e10cSrcweir { 357cdf0e10cSrcweir uno::Any aVal = xPSet->getPropertyValue( aPropName ); 358cdf0e10cSrcweir aVal >>= nControlStep; 359cdf0e10cSrcweir } 360cdf0e10cSrcweir bVisible = (nControlStep == 0) || (nControlStep == nDialogStep); 361cdf0e10cSrcweir } 362cdf0e10cSrcweir 363cdf0e10cSrcweir uno::Reference< awt::XWindow> xWindow 364cdf0e10cSrcweir ( xControl, uno::UNO_QUERY ); 365cdf0e10cSrcweir if( xWindow.is() ) 366cdf0e10cSrcweir xWindow->setVisible( bVisible ); 367cdf0e10cSrcweir } 368cdf0e10cSrcweir } 369cdf0e10cSrcweir 370cdf0e10cSrcweir 371cdf0e10cSrcweir // ---------------------------------------------------- 372cdf0e10cSrcweir // class DialogStepChangedListener 373cdf0e10cSrcweir // ---------------------------------------------------- 374cdf0e10cSrcweir typedef ::cppu::WeakImplHelper1< beans::XPropertyChangeListener > PropertyChangeListenerHelper; 375cdf0e10cSrcweir 376cdf0e10cSrcweir class DialogStepChangedListener: public PropertyChangeListenerHelper 377cdf0e10cSrcweir { 378cdf0e10cSrcweir private: 379cdf0e10cSrcweir uno::Reference< awt::XControlContainer > mxControlContainer; 380cdf0e10cSrcweir 381cdf0e10cSrcweir public: 382cdf0e10cSrcweir DialogStepChangedListener( uno::Reference< awt::XControlContainer > xControlContainer ) 383cdf0e10cSrcweir : mxControlContainer( xControlContainer ) {} 384cdf0e10cSrcweir 385cdf0e10cSrcweir // XEventListener 386cdf0e10cSrcweir virtual void SAL_CALL disposing( const lang::EventObject& Source ) throw( uno::RuntimeException); 387cdf0e10cSrcweir 388cdf0e10cSrcweir // XPropertyChangeListener 389cdf0e10cSrcweir virtual void SAL_CALL propertyChange( const beans::PropertyChangeEvent& evt ) throw( uno::RuntimeException); 390cdf0e10cSrcweir 391cdf0e10cSrcweir }; 392cdf0e10cSrcweir 393cdf0e10cSrcweir void SAL_CALL DialogStepChangedListener::disposing( const lang::EventObject& /*_rSource*/) 394cdf0e10cSrcweir throw( uno::RuntimeException) 395cdf0e10cSrcweir { 396cdf0e10cSrcweir mxControlContainer.clear(); 397cdf0e10cSrcweir } 398cdf0e10cSrcweir 399cdf0e10cSrcweir void SAL_CALL DialogStepChangedListener::propertyChange( const beans::PropertyChangeEvent& evt ) 400cdf0e10cSrcweir throw( uno::RuntimeException) 401cdf0e10cSrcweir { 402cdf0e10cSrcweir // evt.PropertyName HAS to be "Step" because we only use the listener for that 403cdf0e10cSrcweir sal_Int32 nDialogStep = 0; 404cdf0e10cSrcweir evt.NewValue >>= nDialogStep; 405cdf0e10cSrcweir implUpdateVisibility( nDialogStep, mxControlContainer ); 406cdf0e10cSrcweir } 407cdf0e10cSrcweir 408cdf0e10cSrcweir // ---------------------------------------------------- 409cdf0e10cSrcweir // class UnoControlContainer 410cdf0e10cSrcweir // ---------------------------------------------------- 411cdf0e10cSrcweir UnoControlContainer::UnoControlContainer( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& i_factory ) 412cdf0e10cSrcweir :UnoControlContainer_Base( i_factory ) 413cdf0e10cSrcweir ,maCListeners( *this ) 414cdf0e10cSrcweir { 415cdf0e10cSrcweir mpControls = new UnoControlHolderList; 416cdf0e10cSrcweir } 417cdf0e10cSrcweir 418cdf0e10cSrcweir UnoControlContainer::UnoControlContainer( const uno::Reference< lang::XMultiServiceFactory >& i_factory, const uno::Reference< awt::XWindowPeer >& xP ) 419cdf0e10cSrcweir :UnoControlContainer_Base( i_factory ) 420cdf0e10cSrcweir ,maCListeners( *this ) 421cdf0e10cSrcweir { 422cdf0e10cSrcweir setPeer( xP ); 423cdf0e10cSrcweir mbDisposePeer = sal_False; 424cdf0e10cSrcweir mpControls = new UnoControlHolderList; 425cdf0e10cSrcweir } 426cdf0e10cSrcweir 427cdf0e10cSrcweir UnoControlContainer::~UnoControlContainer() 428cdf0e10cSrcweir { 429cdf0e10cSrcweir DELETEZ( mpControls ); 430cdf0e10cSrcweir } 431cdf0e10cSrcweir 432cdf0e10cSrcweir void UnoControlContainer::ImplActivateTabControllers() 433cdf0e10cSrcweir { 434cdf0e10cSrcweir sal_uInt32 nCount = maTabControllers.getLength(); 435cdf0e10cSrcweir for ( sal_uInt32 n = 0; n < nCount; n++ ) 436cdf0e10cSrcweir { 437cdf0e10cSrcweir maTabControllers.getArray()[n]->setContainer( this ); 438cdf0e10cSrcweir maTabControllers.getArray()[n]->activateTabOrder(); 439cdf0e10cSrcweir } 440cdf0e10cSrcweir } 441cdf0e10cSrcweir 442cdf0e10cSrcweir // lang::XComponent 443cdf0e10cSrcweir void UnoControlContainer::dispose( ) throw(uno::RuntimeException) 444cdf0e10cSrcweir { 445cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 446cdf0e10cSrcweir 447cdf0e10cSrcweir lang::EventObject aDisposeEvent; 448cdf0e10cSrcweir aDisposeEvent.Source = static_cast< uno::XAggregation* >( this ); 449cdf0e10cSrcweir 450cdf0e10cSrcweir // DG: zuerst der Welt mitteilen, dass der Container wegfliegt. Dieses ist um einiges 451cdf0e10cSrcweir // schneller wenn die Welt sowohl an den Controls als auch am Container horcht 452cdf0e10cSrcweir maDisposeListeners.disposeAndClear( aDisposeEvent ); 453cdf0e10cSrcweir maCListeners.disposeAndClear( aDisposeEvent ); 454cdf0e10cSrcweir 455cdf0e10cSrcweir 456cdf0e10cSrcweir uno::Sequence< uno::Reference< awt::XControl > > aCtrls = getControls(); 457cdf0e10cSrcweir uno::Reference< awt::XControl >* pCtrls = aCtrls.getArray(); 458cdf0e10cSrcweir uno::Reference< awt::XControl >* pCtrlsEnd = pCtrls + aCtrls.getLength(); 459cdf0e10cSrcweir 460cdf0e10cSrcweir for( ; pCtrls < pCtrlsEnd; ++pCtrls ) 461cdf0e10cSrcweir { 462cdf0e10cSrcweir removingControl( *pCtrls ); 463cdf0e10cSrcweir // Control wegwerfen 464cdf0e10cSrcweir (*pCtrls)->dispose(); 465cdf0e10cSrcweir } 466cdf0e10cSrcweir 467cdf0e10cSrcweir 468cdf0e10cSrcweir // alle Strukturen entfernen 469cdf0e10cSrcweir DELETEZ( mpControls ); 470cdf0e10cSrcweir mpControls = new UnoControlHolderList; 471cdf0e10cSrcweir 472cdf0e10cSrcweir UnoControlBase::dispose(); 473cdf0e10cSrcweir } 474cdf0e10cSrcweir 475cdf0e10cSrcweir // lang::XEventListener 476cdf0e10cSrcweir void UnoControlContainer::disposing( const lang::EventObject& _rEvt ) throw(uno::RuntimeException) 477cdf0e10cSrcweir { 478cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 479cdf0e10cSrcweir 480cdf0e10cSrcweir uno::Reference< awt::XControl > xControl( _rEvt.Source, uno::UNO_QUERY ); 481cdf0e10cSrcweir if ( xControl.is() ) 482cdf0e10cSrcweir removeControl( xControl ); 483cdf0e10cSrcweir 484cdf0e10cSrcweir UnoControlBase::disposing( _rEvt ); 485cdf0e10cSrcweir } 486cdf0e10cSrcweir 487cdf0e10cSrcweir // container::XContainer 488cdf0e10cSrcweir void UnoControlContainer::addContainerListener( const uno::Reference< container::XContainerListener >& rxListener ) throw(uno::RuntimeException) 489cdf0e10cSrcweir { 490cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 491cdf0e10cSrcweir 492cdf0e10cSrcweir maCListeners.addInterface( rxListener ); 493cdf0e10cSrcweir } 494cdf0e10cSrcweir 495cdf0e10cSrcweir void UnoControlContainer::removeContainerListener( const uno::Reference< container::XContainerListener >& rxListener ) throw(uno::RuntimeException) 496cdf0e10cSrcweir { 497cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 498cdf0e10cSrcweir 499cdf0e10cSrcweir maCListeners.removeInterface( rxListener ); 500cdf0e10cSrcweir } 501cdf0e10cSrcweir 502cdf0e10cSrcweir 503cdf0e10cSrcweir ::sal_Int32 SAL_CALL UnoControlContainer::insert( const uno::Any& _rElement ) throw (lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) 504cdf0e10cSrcweir { 505cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 506cdf0e10cSrcweir 507cdf0e10cSrcweir uno::Reference< awt::XControl > xControl; 508cdf0e10cSrcweir if ( !( _rElement >>= xControl ) || !xControl.is() ) 509cdf0e10cSrcweir throw lang::IllegalArgumentException( 510cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Elements must support the XControl interface." ) ), 511cdf0e10cSrcweir *this, 512cdf0e10cSrcweir 1 513cdf0e10cSrcweir ); 514cdf0e10cSrcweir 515cdf0e10cSrcweir return impl_addControl( xControl, NULL ); 516cdf0e10cSrcweir } 517cdf0e10cSrcweir 518cdf0e10cSrcweir void SAL_CALL UnoControlContainer::removeByIdentifier( ::sal_Int32 _nIdentifier ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) 519cdf0e10cSrcweir { 520cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 521cdf0e10cSrcweir 522cdf0e10cSrcweir uno::Reference< awt::XControl > xControl; 523cdf0e10cSrcweir if ( !mpControls->getControlForIdentifier( _nIdentifier, xControl ) ) 524cdf0e10cSrcweir throw container::NoSuchElementException( 525cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "There is no element with the given identifier." ) ), 526cdf0e10cSrcweir *this 527cdf0e10cSrcweir ); 528cdf0e10cSrcweir 529cdf0e10cSrcweir impl_removeControl( _nIdentifier, xControl, NULL ); 530cdf0e10cSrcweir } 531cdf0e10cSrcweir 532cdf0e10cSrcweir void SAL_CALL UnoControlContainer::replaceByIdentifer( ::sal_Int32 _nIdentifier, const uno::Any& _rElement ) throw (lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) 533cdf0e10cSrcweir { 534cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 535cdf0e10cSrcweir 536cdf0e10cSrcweir uno::Reference< awt::XControl > xExistentControl; 537cdf0e10cSrcweir if ( !mpControls->getControlForIdentifier( _nIdentifier, xExistentControl ) ) 538cdf0e10cSrcweir throw container::NoSuchElementException( 539cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "There is no element with the given identifier." ) ), 540cdf0e10cSrcweir *this 541cdf0e10cSrcweir ); 542cdf0e10cSrcweir 543cdf0e10cSrcweir uno::Reference< awt::XControl > xNewControl; 544cdf0e10cSrcweir if ( !( _rElement >>= xNewControl ) ) 545cdf0e10cSrcweir throw lang::IllegalArgumentException( 546cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Elements must support the XControl interface." ) ), 547cdf0e10cSrcweir *this, 548cdf0e10cSrcweir 1 549cdf0e10cSrcweir ); 550cdf0e10cSrcweir 551cdf0e10cSrcweir removingControl( xExistentControl ); 552cdf0e10cSrcweir 553cdf0e10cSrcweir mpControls->replaceControlById( _nIdentifier, xNewControl ); 554cdf0e10cSrcweir 555cdf0e10cSrcweir addingControl( xNewControl ); 556cdf0e10cSrcweir 557cdf0e10cSrcweir impl_createControlPeerIfNecessary( xNewControl ); 558cdf0e10cSrcweir 559cdf0e10cSrcweir if ( maCListeners.getLength() ) 560cdf0e10cSrcweir { 561cdf0e10cSrcweir container::ContainerEvent aEvent; 562cdf0e10cSrcweir aEvent.Source = *this; 563cdf0e10cSrcweir aEvent.Accessor <<= _nIdentifier; 564cdf0e10cSrcweir aEvent.Element <<= xNewControl; 565cdf0e10cSrcweir aEvent.ReplacedElement <<= xExistentControl; 566cdf0e10cSrcweir maCListeners.elementReplaced( aEvent ); 567cdf0e10cSrcweir } 568cdf0e10cSrcweir } 569cdf0e10cSrcweir 570cdf0e10cSrcweir uno::Any SAL_CALL UnoControlContainer::getByIdentifier( ::sal_Int32 _nIdentifier ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) 571cdf0e10cSrcweir { 572cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 573cdf0e10cSrcweir 574cdf0e10cSrcweir uno::Reference< awt::XControl > xControl; 575cdf0e10cSrcweir if ( !mpControls->getControlForIdentifier( _nIdentifier, xControl ) ) 576cdf0e10cSrcweir throw container::NoSuchElementException(); 577cdf0e10cSrcweir return uno::makeAny( xControl ); 578cdf0e10cSrcweir } 579cdf0e10cSrcweir 580cdf0e10cSrcweir uno::Sequence< ::sal_Int32 > SAL_CALL UnoControlContainer::getIdentifiers( ) throw (uno::RuntimeException) 581cdf0e10cSrcweir { 582cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 583cdf0e10cSrcweir 584cdf0e10cSrcweir uno::Sequence< ::sal_Int32 > aIdentifiers; 585cdf0e10cSrcweir mpControls->getIdentifiers( aIdentifiers ); 586cdf0e10cSrcweir return aIdentifiers; 587cdf0e10cSrcweir } 588cdf0e10cSrcweir 589cdf0e10cSrcweir // container::XElementAccess 590cdf0e10cSrcweir uno::Type SAL_CALL UnoControlContainer::getElementType( ) throw (uno::RuntimeException) 591cdf0e10cSrcweir { 592cdf0e10cSrcweir return awt::XControlModel::static_type(); 593cdf0e10cSrcweir } 594cdf0e10cSrcweir 595cdf0e10cSrcweir ::sal_Bool SAL_CALL UnoControlContainer::hasElements( ) throw (uno::RuntimeException) 596cdf0e10cSrcweir { 597cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 598cdf0e10cSrcweir return !mpControls->empty(); 599cdf0e10cSrcweir } 600cdf0e10cSrcweir 601cdf0e10cSrcweir // awt::XControlContainer 602cdf0e10cSrcweir void UnoControlContainer::setStatusText( const ::rtl::OUString& rStatusText ) throw(uno::RuntimeException) 603cdf0e10cSrcweir { 604cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 605cdf0e10cSrcweir 606cdf0e10cSrcweir // In der Parenthierarchie nach unten gehen 607cdf0e10cSrcweir uno::Reference< awt::XControlContainer > xContainer( mxContext, uno::UNO_QUERY ); 608cdf0e10cSrcweir if( xContainer.is() ) 609cdf0e10cSrcweir xContainer->setStatusText( rStatusText ); 610cdf0e10cSrcweir } 611cdf0e10cSrcweir 612cdf0e10cSrcweir uno::Sequence< uno::Reference< awt::XControl > > UnoControlContainer::getControls( ) throw(uno::RuntimeException) 613cdf0e10cSrcweir { 614cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 615cdf0e10cSrcweir uno::Sequence< uno::Reference< awt::XControl > > aControls; 616cdf0e10cSrcweir mpControls->getControls( aControls ); 617cdf0e10cSrcweir return aControls; 618cdf0e10cSrcweir } 619cdf0e10cSrcweir 620cdf0e10cSrcweir uno::Reference< awt::XControl > UnoControlContainer::getControl( const ::rtl::OUString& rName ) throw(uno::RuntimeException) 621cdf0e10cSrcweir { 622cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 623cdf0e10cSrcweir return mpControls->getControlForName( rName ); 624cdf0e10cSrcweir } 625cdf0e10cSrcweir 626cdf0e10cSrcweir void UnoControlContainer::addingControl( const uno::Reference< awt::XControl >& _rxControl ) 627cdf0e10cSrcweir { 628cdf0e10cSrcweir if ( _rxControl.is() ) 629cdf0e10cSrcweir { 630cdf0e10cSrcweir uno::Reference< uno::XInterface > xThis; 631cdf0e10cSrcweir OWeakAggObject::queryInterface( ::getCppuType( static_cast< uno::Reference< uno::XInterface >* >( NULL ) ) ) >>= xThis; 632cdf0e10cSrcweir 633cdf0e10cSrcweir _rxControl->setContext( xThis ); 634cdf0e10cSrcweir _rxControl->addEventListener( this ); 635cdf0e10cSrcweir } 636cdf0e10cSrcweir } 637cdf0e10cSrcweir 638cdf0e10cSrcweir void UnoControlContainer::impl_createControlPeerIfNecessary( const uno::Reference< awt::XControl >& _rxControl ) 639cdf0e10cSrcweir { 640cdf0e10cSrcweir OSL_PRECOND( _rxControl.is(), "UnoControlContainer::impl_createControlPeerIfNecessary: invalid control, this will crash!" ); 641cdf0e10cSrcweir 642cdf0e10cSrcweir // if the container already has a peer, then also create a peer for the control 643cdf0e10cSrcweir uno::Reference< awt::XWindowPeer > xMyPeer( getPeer() ); 644cdf0e10cSrcweir 645cdf0e10cSrcweir if( xMyPeer.is() ) 646cdf0e10cSrcweir { 647cdf0e10cSrcweir _rxControl->createPeer( NULL, xMyPeer ); 648cdf0e10cSrcweir ImplActivateTabControllers(); 649cdf0e10cSrcweir } 650cdf0e10cSrcweir 651cdf0e10cSrcweir } 652cdf0e10cSrcweir 653cdf0e10cSrcweir sal_Int32 UnoControlContainer::impl_addControl( const uno::Reference< awt::XControl >& _rxControl, const ::rtl::OUString* _pName ) 654cdf0e10cSrcweir { 655cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 656cdf0e10cSrcweir UnoControlHolderList::ControlIdentifier id = mpControls->addControl( _rxControl, _pName ); 657cdf0e10cSrcweir 658cdf0e10cSrcweir addingControl( _rxControl ); 659cdf0e10cSrcweir 660cdf0e10cSrcweir impl_createControlPeerIfNecessary( _rxControl ); 661cdf0e10cSrcweir 662cdf0e10cSrcweir if ( maCListeners.getLength() ) 663cdf0e10cSrcweir { 664cdf0e10cSrcweir container::ContainerEvent aEvent; 665cdf0e10cSrcweir aEvent.Source = *this; 666cdf0e10cSrcweir _pName ? ( aEvent.Accessor <<= *_pName ) : ( aEvent.Accessor <<= (sal_Int32)id ); 667cdf0e10cSrcweir aEvent.Element <<= _rxControl; 668cdf0e10cSrcweir maCListeners.elementInserted( aEvent ); 669cdf0e10cSrcweir } 670cdf0e10cSrcweir 671cdf0e10cSrcweir return id; 672cdf0e10cSrcweir } 673cdf0e10cSrcweir 674cdf0e10cSrcweir void UnoControlContainer::addControl( const ::rtl::OUString& rName, const uno::Reference< awt::XControl >& rControl ) throw(uno::RuntimeException) 675cdf0e10cSrcweir { 676cdf0e10cSrcweir if ( rControl.is() ) 677cdf0e10cSrcweir impl_addControl( rControl, &rName ); 678cdf0e10cSrcweir } 679cdf0e10cSrcweir 680cdf0e10cSrcweir void UnoControlContainer::removingControl( const uno::Reference< awt::XControl >& _rxControl ) 681cdf0e10cSrcweir { 682cdf0e10cSrcweir if ( _rxControl.is() ) 683cdf0e10cSrcweir { 684cdf0e10cSrcweir _rxControl->removeEventListener( this ); 685cdf0e10cSrcweir _rxControl->setContext( NULL ); 686cdf0e10cSrcweir } 687cdf0e10cSrcweir } 688cdf0e10cSrcweir 689cdf0e10cSrcweir void UnoControlContainer::impl_removeControl( sal_Int32 _nId, const uno::Reference< awt::XControl >& _rxControl, const ::rtl::OUString* _pNameAccessor ) 690cdf0e10cSrcweir { 691cdf0e10cSrcweir #ifdef DBG_UTIL 692cdf0e10cSrcweir { 693cdf0e10cSrcweir uno::Reference< awt::XControl > xControl; 694cdf0e10cSrcweir bool bHas = mpControls->getControlForIdentifier( _nId, xControl ); 695cdf0e10cSrcweir DBG_ASSERT( bHas && xControl == _rxControl, "UnoControlContainer::impl_removeControl: inconsistency in the parameters!" ); 696cdf0e10cSrcweir } 697cdf0e10cSrcweir #endif 698cdf0e10cSrcweir removingControl( _rxControl ); 699cdf0e10cSrcweir 700cdf0e10cSrcweir mpControls->removeControlById( _nId ); 701cdf0e10cSrcweir 702cdf0e10cSrcweir if ( maCListeners.getLength() ) 703cdf0e10cSrcweir { 704cdf0e10cSrcweir container::ContainerEvent aEvent; 705cdf0e10cSrcweir aEvent.Source = *this; 706cdf0e10cSrcweir _pNameAccessor ? ( aEvent.Accessor <<= *_pNameAccessor ) : ( aEvent.Accessor <<= _nId ); 707cdf0e10cSrcweir aEvent.Element <<= _rxControl; 708cdf0e10cSrcweir maCListeners.elementRemoved( aEvent ); 709cdf0e10cSrcweir } 710cdf0e10cSrcweir } 711cdf0e10cSrcweir 712cdf0e10cSrcweir void UnoControlContainer::removeControl( const uno::Reference< awt::XControl >& _rxControl ) throw(uno::RuntimeException) 713cdf0e10cSrcweir { 714cdf0e10cSrcweir if ( _rxControl.is() ) 715cdf0e10cSrcweir { 716cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 717cdf0e10cSrcweir 718cdf0e10cSrcweir UnoControlHolderList::ControlIdentifier id = mpControls->getControlIdentifier( _rxControl ); 719cdf0e10cSrcweir if ( id != -1 ) 720cdf0e10cSrcweir impl_removeControl( id, _rxControl, NULL ); 721cdf0e10cSrcweir } 722cdf0e10cSrcweir } 723cdf0e10cSrcweir 724cdf0e10cSrcweir 725cdf0e10cSrcweir 726cdf0e10cSrcweir // awt::XUnoControlContainer 727cdf0e10cSrcweir void UnoControlContainer::setTabControllers( const uno::Sequence< uno::Reference< awt::XTabController > >& TabControllers ) throw(uno::RuntimeException) 728cdf0e10cSrcweir { 729cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 730cdf0e10cSrcweir 731cdf0e10cSrcweir maTabControllers = TabControllers; 732cdf0e10cSrcweir } 733cdf0e10cSrcweir 734cdf0e10cSrcweir uno::Sequence< uno::Reference< awt::XTabController > > UnoControlContainer::getTabControllers( ) throw(uno::RuntimeException) 735cdf0e10cSrcweir { 736cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 737cdf0e10cSrcweir 738cdf0e10cSrcweir return maTabControllers; 739cdf0e10cSrcweir } 740cdf0e10cSrcweir 741cdf0e10cSrcweir void UnoControlContainer::addTabController( const uno::Reference< awt::XTabController >& TabController ) throw(uno::RuntimeException) 742cdf0e10cSrcweir { 743cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 744cdf0e10cSrcweir 745cdf0e10cSrcweir sal_uInt32 nCount = maTabControllers.getLength(); 746cdf0e10cSrcweir maTabControllers.realloc( nCount + 1 ); 747cdf0e10cSrcweir maTabControllers[ nCount ] = TabController; 748cdf0e10cSrcweir } 749cdf0e10cSrcweir 750cdf0e10cSrcweir void UnoControlContainer::removeTabController( const uno::Reference< awt::XTabController >& TabController ) throw(uno::RuntimeException) 751cdf0e10cSrcweir { 752cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 753cdf0e10cSrcweir 754cdf0e10cSrcweir sal_uInt32 nCount = maTabControllers.getLength(); 755cdf0e10cSrcweir const uno::Reference< awt::XTabController >* pLoop = maTabControllers.getConstArray(); 756cdf0e10cSrcweir for ( sal_uInt32 n = 0; n < nCount; ++n, ++pLoop ) 757cdf0e10cSrcweir { 758cdf0e10cSrcweir if( pLoop->get() == TabController.get() ) 759cdf0e10cSrcweir { 760cdf0e10cSrcweir ::comphelper::removeElementAt( maTabControllers, n ); 761cdf0e10cSrcweir break; 762cdf0e10cSrcweir } 763cdf0e10cSrcweir } 764cdf0e10cSrcweir } 765cdf0e10cSrcweir 766cdf0e10cSrcweir // awt::XControl 767cdf0e10cSrcweir void UnoControlContainer::createPeer( const uno::Reference< awt::XToolkit >& rxToolkit, const uno::Reference< awt::XWindowPeer >& rParent ) throw(uno::RuntimeException) 768cdf0e10cSrcweir { 769cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 770cdf0e10cSrcweir 771cdf0e10cSrcweir if( !getPeer().is() ) 772cdf0e10cSrcweir { 773cdf0e10cSrcweir sal_Bool bVis = maComponentInfos.bVisible; 774cdf0e10cSrcweir if( bVis ) 775cdf0e10cSrcweir UnoControl::setVisible( sal_False ); 776cdf0e10cSrcweir // eigenes Peer erzeugen 777cdf0e10cSrcweir UnoControl::createPeer( rxToolkit, rParent ); 778cdf0e10cSrcweir 779cdf0e10cSrcweir // alle Peers der Childs erzeugen 780cdf0e10cSrcweir if ( !mbCreatingCompatiblePeer ) 781cdf0e10cSrcweir { 782cdf0e10cSrcweir // Evaluate "Step" property 783cdf0e10cSrcweir uno::Reference< awt::XControlModel > xModel( getModel() ); 784cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPSet 785cdf0e10cSrcweir ( xModel, uno::UNO_QUERY ); 786cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > 787cdf0e10cSrcweir xInfo = xPSet->getPropertySetInfo(); 788cdf0e10cSrcweir ::rtl::OUString aPropName(RTL_CONSTASCII_USTRINGPARAM( "Step" ) ); 789cdf0e10cSrcweir if ( xInfo->hasPropertyByName( aPropName ) ) 790cdf0e10cSrcweir { 791cdf0e10cSrcweir ::com::sun::star::uno::Any aVal = xPSet->getPropertyValue( aPropName ); 792cdf0e10cSrcweir sal_Int32 nDialogStep = 0; 793cdf0e10cSrcweir aVal >>= nDialogStep; 794cdf0e10cSrcweir uno::Reference< awt::XControlContainer > xContainer = 795cdf0e10cSrcweir SAL_STATIC_CAST( awt::XControlContainer*, this ); 796cdf0e10cSrcweir implUpdateVisibility( nDialogStep, xContainer ); 797cdf0e10cSrcweir 798cdf0e10cSrcweir uno::Reference< beans::XPropertyChangeListener > xListener = 799cdf0e10cSrcweir SAL_STATIC_CAST( beans::XPropertyChangeListener*, 800cdf0e10cSrcweir new DialogStepChangedListener( xContainer ) ); 801cdf0e10cSrcweir xPSet->addPropertyChangeListener( aPropName, xListener ); 802cdf0e10cSrcweir } 803cdf0e10cSrcweir 804cdf0e10cSrcweir uno::Sequence< uno::Reference< awt::XControl > > aCtrls = getControls(); 805cdf0e10cSrcweir sal_uInt32 nCtrls = aCtrls.getLength(); 806cdf0e10cSrcweir for( sal_uInt32 n = 0; n < nCtrls; n++ ) 807cdf0e10cSrcweir aCtrls.getArray()[n]->createPeer( rxToolkit, getPeer() ); 808cdf0e10cSrcweir 809cdf0e10cSrcweir uno::Reference< awt::XVclContainerPeer > xC( getPeer(), uno::UNO_QUERY ); 810cdf0e10cSrcweir OSL_ENSURE(xC.is(),"Peer isn't valid. Please check!"); 811cdf0e10cSrcweir 812cdf0e10cSrcweir xC->enableDialogControl( sal_True ); 813cdf0e10cSrcweir ImplActivateTabControllers(); 814cdf0e10cSrcweir } 815cdf0e10cSrcweir 816cdf0e10cSrcweir if( bVis && !isDesignMode() ) 817cdf0e10cSrcweir UnoControl::setVisible( sal_True ); 818cdf0e10cSrcweir } 819cdf0e10cSrcweir } 820cdf0e10cSrcweir 821cdf0e10cSrcweir 822cdf0e10cSrcweir // awt::XWindow 823cdf0e10cSrcweir void UnoControlContainer::setVisible( sal_Bool bVisible ) throw(uno::RuntimeException) 824cdf0e10cSrcweir { 825cdf0e10cSrcweir ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 826cdf0e10cSrcweir 827cdf0e10cSrcweir UnoControl::setVisible( bVisible ); 828cdf0e10cSrcweir if( !mxContext.is() && bVisible ) 829cdf0e10cSrcweir // Es ist ein TopWindow, also automatisch anzeigen 830cdf0e10cSrcweir createPeer( uno::Reference< awt::XToolkit > (), uno::Reference< awt::XWindowPeer > () ); 831cdf0e10cSrcweir } 832cdf0e10cSrcweir 833cdf0e10cSrcweir 834cdf0e10cSrcweir 835