16d739b60SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 36d739b60SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 46d739b60SAndrew Rist * or more contributor license agreements. See the NOTICE file 56d739b60SAndrew Rist * distributed with this work for additional information 66d739b60SAndrew Rist * regarding copyright ownership. The ASF licenses this file 76d739b60SAndrew Rist * to you under the Apache License, Version 2.0 (the 86d739b60SAndrew Rist * "License"); you may not use this file except in compliance 96d739b60SAndrew Rist * with the License. You may obtain a copy of the License at 106d739b60SAndrew Rist * 116d739b60SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 126d739b60SAndrew Rist * 136d739b60SAndrew Rist * Unless required by applicable law or agreed to in writing, 146d739b60SAndrew Rist * software distributed under the License is distributed on an 156d739b60SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 166d739b60SAndrew Rist * KIND, either express or implied. See the License for the 176d739b60SAndrew Rist * specific language governing permissions and limitations 186d739b60SAndrew Rist * under the License. 196d739b60SAndrew Rist * 206d739b60SAndrew Rist *************************************************************/ 216d739b60SAndrew Rist 226d739b60SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_framework.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "services/backingcomp.hxx" 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include "backingwindow.hxx" 30cdf0e10cSrcweir 31cdf0e10cSrcweir //_______________________________________________ 32cdf0e10cSrcweir // own includes 33cdf0e10cSrcweir #include <threadhelp/readguard.hxx> 34cdf0e10cSrcweir #include <threadhelp/writeguard.hxx> 35cdf0e10cSrcweir #include <classes/droptargetlistener.hxx> 36cdf0e10cSrcweir #include <framework/acceleratorinfo.hxx> 37cdf0e10cSrcweir #include <targets.h> 38cdf0e10cSrcweir #include <properties.h> 39cdf0e10cSrcweir #include <services.h> 40cdf0e10cSrcweir 41cdf0e10cSrcweir #ifndef _FRAMEWORK_HELPID_HRC 42cdf0e10cSrcweir #include <helpid.hrc> 43cdf0e10cSrcweir #endif 44cdf0e10cSrcweir 45cdf0e10cSrcweir //_______________________________________________ 46cdf0e10cSrcweir // interface includes 47cdf0e10cSrcweir #include <com/sun/star/beans/NamedValue.hpp> 48cdf0e10cSrcweir #include <com/sun/star/util/XURLTransformer.hpp> 49cdf0e10cSrcweir #include <com/sun/star/frame/XDispatchProvider.hpp> 50cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 51cdf0e10cSrcweir #include <com/sun/star/awt/XDataTransferProviderAccess.hpp> 52cdf0e10cSrcweir #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp> 53cdf0e10cSrcweir #include <com/sun/star/awt/KeyEvent.hpp> 54cdf0e10cSrcweir #include <com/sun/star/awt/KeyModifier.hpp> 55cdf0e10cSrcweir #include <com/sun/star/frame/XLayoutManager.hpp> 56cdf0e10cSrcweir 57cdf0e10cSrcweir //_______________________________________________ 58cdf0e10cSrcweir // other includes 59cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx> 60cdf0e10cSrcweir #include <cppuhelper/factory.hxx> 61cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx> 62cdf0e10cSrcweir #include <vcl/keycod.hxx> 63cdf0e10cSrcweir #include <vcl/wrkwin.hxx> 64cdf0e10cSrcweir #include <vcl/svapp.hxx> 65cdf0e10cSrcweir #include <tools/resmgr.hxx> 66cdf0e10cSrcweir #include <tools/urlobj.hxx> 67cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 68cdf0e10cSrcweir 69cdf0e10cSrcweir #ifndef _SOLAR_HRC 70cdf0e10cSrcweir #include <svl/solar.hrc> 71cdf0e10cSrcweir #endif 72cdf0e10cSrcweir #include <svl/urihelper.hxx> 73cdf0e10cSrcweir #include <osl/file.hxx> 74cdf0e10cSrcweir #include <unotools/configmgr.hxx> 75cdf0e10cSrcweir 76cdf0e10cSrcweir #ifndef _UTL_BOOTSTRAP_HXX_ 77cdf0e10cSrcweir #include <unotools/bootstrap.hxx> 78cdf0e10cSrcweir #endif 79cdf0e10cSrcweir 80cdf0e10cSrcweir namespace framework 81cdf0e10cSrcweir { 82cdf0e10cSrcweir 83cdf0e10cSrcweir //_______________________________________________ 84cdf0e10cSrcweir 85cdf0e10cSrcweir //_______________________________________________ 86cdf0e10cSrcweir 87cdf0e10cSrcweir BackingComp::BackingComp( const css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR ) 88cdf0e10cSrcweir : ThreadHelpBase (&Application::GetSolarMutex() ) 89cdf0e10cSrcweir , m_xSMGR (xSMGR ) 90cdf0e10cSrcweir { 91cdf0e10cSrcweir } 92cdf0e10cSrcweir 93cdf0e10cSrcweir //_______________________________________________ 94cdf0e10cSrcweir 95cdf0e10cSrcweir BackingComp::~BackingComp() 96cdf0e10cSrcweir { 97cdf0e10cSrcweir } 98cdf0e10cSrcweir 99cdf0e10cSrcweir //_______________________________________________ 100cdf0e10cSrcweir 101cdf0e10cSrcweir /** return information about supported interfaces. 102cdf0e10cSrcweir 103cdf0e10cSrcweir Some interfaces are supported by his class directly, but some other ones are 104cdf0e10cSrcweir used by aggregation. An instance of this class must provide some window interfaces. 105cdf0e10cSrcweir But it must represent a VCL window behind such interfaces too! So we use an internal 106cdf0e10cSrcweir saved window member to ask it for it's interfaces and return it. But we must be aware then, 107cdf0e10cSrcweir that it can be destroyed from outside too ... 108cdf0e10cSrcweir 109cdf0e10cSrcweir @param aType 110cdf0e10cSrcweir describe the required interface type 111cdf0e10cSrcweir 112cdf0e10cSrcweir @return An Any holding the instance, which provides the queried interface. 113cdf0e10cSrcweir Note: There exist two possible results ... this instance itself and her window member! 114cdf0e10cSrcweir */ 115cdf0e10cSrcweir 116cdf0e10cSrcweir css::uno::Any SAL_CALL BackingComp::queryInterface( /*IN*/ const css::uno::Type& aType ) 117cdf0e10cSrcweir throw(css::uno::RuntimeException) 118cdf0e10cSrcweir { 119cdf0e10cSrcweir css::uno::Any aResult; 120cdf0e10cSrcweir 121cdf0e10cSrcweir // first look for own supported interfaces 122cdf0e10cSrcweir aResult = ::cppu::queryInterface( 123cdf0e10cSrcweir aType, 124cdf0e10cSrcweir static_cast< css::lang::XTypeProvider* >(this), 125cdf0e10cSrcweir static_cast< css::lang::XServiceInfo* >(this), 126cdf0e10cSrcweir static_cast< css::lang::XInitialization* >(this), 127cdf0e10cSrcweir static_cast< css::frame::XController* >(this), 128cdf0e10cSrcweir static_cast< css::lang::XComponent* >(this), 129cdf0e10cSrcweir static_cast< css::lang::XEventListener* >(this), 130cdf0e10cSrcweir static_cast< css::awt::XKeyListener* >(static_cast< css::lang::XEventListener* >(this))); 131cdf0e10cSrcweir 132cdf0e10cSrcweir // then look for supported window interfaces 133cdf0e10cSrcweir // Note: They exist only, if this instance was initialized 134cdf0e10cSrcweir // with a valid window reference. It's aggregation on demand ... 135cdf0e10cSrcweir if (!aResult.hasValue()) 136cdf0e10cSrcweir { 137cdf0e10cSrcweir /* SAFE { */ 138cdf0e10cSrcweir ReadGuard aReadLock(m_aLock); 139cdf0e10cSrcweir if (m_xWindow.is()) 140cdf0e10cSrcweir aResult = m_xWindow->queryInterface(aType); 141cdf0e10cSrcweir aReadLock.unlock(); 142cdf0e10cSrcweir /* } SAFE */ 143cdf0e10cSrcweir } 144cdf0e10cSrcweir 145cdf0e10cSrcweir // look for XWeak and XInterface 146cdf0e10cSrcweir if (!aResult.hasValue()) 147cdf0e10cSrcweir aResult = OWeakObject::queryInterface(aType); 148cdf0e10cSrcweir 149cdf0e10cSrcweir return aResult; 150cdf0e10cSrcweir } 151cdf0e10cSrcweir 152cdf0e10cSrcweir //_______________________________________________ 153cdf0e10cSrcweir 154cdf0e10cSrcweir /** increase ref count of this instance. 155cdf0e10cSrcweir */ 156cdf0e10cSrcweir 157cdf0e10cSrcweir void SAL_CALL BackingComp::acquire() 158cdf0e10cSrcweir throw() 159cdf0e10cSrcweir { 160cdf0e10cSrcweir OWeakObject::acquire(); 161cdf0e10cSrcweir } 162cdf0e10cSrcweir 163cdf0e10cSrcweir //_______________________________________________ 164cdf0e10cSrcweir 165cdf0e10cSrcweir /** decrease ref count of this instance. 166cdf0e10cSrcweir */ 167cdf0e10cSrcweir 168cdf0e10cSrcweir void SAL_CALL BackingComp::release() 169cdf0e10cSrcweir throw() 170cdf0e10cSrcweir { 171cdf0e10cSrcweir OWeakObject::release(); 172cdf0e10cSrcweir } 173cdf0e10cSrcweir 174cdf0e10cSrcweir //_______________________________________________ 175cdf0e10cSrcweir 176cdf0e10cSrcweir /** return collection about all supported interfaces. 177cdf0e10cSrcweir 178cdf0e10cSrcweir Optimize this method ! 179cdf0e10cSrcweir We initialize a static variable only one time. 180cdf0e10cSrcweir And we don't must use a mutex at every call! 181cdf0e10cSrcweir For the first call; pTypeCollection is NULL - 182cdf0e10cSrcweir for the second call pTypeCollection is different from NULL! 183cdf0e10cSrcweir 184cdf0e10cSrcweir @return A list of all supported interface types. 185cdf0e10cSrcweir */ 186cdf0e10cSrcweir 187cdf0e10cSrcweir css::uno::Sequence< css::uno::Type > SAL_CALL BackingComp::getTypes() 188cdf0e10cSrcweir throw(css::uno::RuntimeException) 189cdf0e10cSrcweir { 190cdf0e10cSrcweir static ::cppu::OTypeCollection* pTypeCollection = NULL; 191cdf0e10cSrcweir if (!pTypeCollection) 192cdf0e10cSrcweir { 193cdf0e10cSrcweir /* GLOBAL SAFE { */ 194cdf0e10cSrcweir ::osl::MutexGuard aGlobalLock(::osl::Mutex::getGlobalMutex()); 195cdf0e10cSrcweir // Control these pointer again ... it can be, that another instance will be faster then this one! 196cdf0e10cSrcweir if (!pTypeCollection) 197cdf0e10cSrcweir { 198cdf0e10cSrcweir /* LOCAL SAFE { */ 199cdf0e10cSrcweir ReadGuard aReadLock(m_aLock); 200cdf0e10cSrcweir css::uno::Reference< css::lang::XTypeProvider > xProvider(m_xWindow, css::uno::UNO_QUERY); 201cdf0e10cSrcweir aReadLock.unlock(); 202cdf0e10cSrcweir /* } LOCAL SAFE */ 203cdf0e10cSrcweir 204cdf0e10cSrcweir css::uno::Sequence< css::uno::Type > lWindowTypes; 205cdf0e10cSrcweir if (xProvider.is()) 206cdf0e10cSrcweir lWindowTypes = xProvider->getTypes(); 207cdf0e10cSrcweir 208cdf0e10cSrcweir static ::cppu::OTypeCollection aTypeCollection( 209cdf0e10cSrcweir ::getCppuType((const ::com::sun::star::uno::Reference< css::lang::XInitialization >*)NULL ), 210cdf0e10cSrcweir ::getCppuType((const ::com::sun::star::uno::Reference< css::lang::XTypeProvider >*)NULL ), 211cdf0e10cSrcweir ::getCppuType((const ::com::sun::star::uno::Reference< css::lang::XServiceInfo >*)NULL ), 212cdf0e10cSrcweir ::getCppuType((const ::com::sun::star::uno::Reference< css::frame::XController >*)NULL ), 213cdf0e10cSrcweir ::getCppuType((const ::com::sun::star::uno::Reference< css::lang::XComponent >*)NULL ), 214cdf0e10cSrcweir lWindowTypes); 215cdf0e10cSrcweir 216cdf0e10cSrcweir pTypeCollection = &aTypeCollection; 217cdf0e10cSrcweir } 218cdf0e10cSrcweir /* } GLOBAL SAFE */ 219cdf0e10cSrcweir } 220cdf0e10cSrcweir return pTypeCollection->getTypes(); 221cdf0e10cSrcweir } 222cdf0e10cSrcweir 223cdf0e10cSrcweir //_______________________________________________ 224cdf0e10cSrcweir 225cdf0e10cSrcweir /** create one unique Id for all instances of this class. 226cdf0e10cSrcweir 227cdf0e10cSrcweir Optimize this method 228cdf0e10cSrcweir We initialize a static variable only one time. And we don't must use a mutex at every call! 229cdf0e10cSrcweir For the first call; pID is NULL - for the second call pID is different from NULL! 230cdf0e10cSrcweir 231cdf0e10cSrcweir @return A byte array, which represent the unique id. 232cdf0e10cSrcweir */ 233cdf0e10cSrcweir 234cdf0e10cSrcweir css::uno::Sequence< sal_Int8 > SAL_CALL BackingComp::getImplementationId() 235cdf0e10cSrcweir throw(css::uno::RuntimeException) 236cdf0e10cSrcweir { 237cdf0e10cSrcweir static ::cppu::OImplementationId* pID = NULL; 238cdf0e10cSrcweir if (!pID) 239cdf0e10cSrcweir { 240cdf0e10cSrcweir /* GLOBAL SAFE { */ 241cdf0e10cSrcweir ::osl::MutexGuard aLock(::osl::Mutex::getGlobalMutex()); 242cdf0e10cSrcweir // Control these pointer again ... it can be, that another instance will be faster then this one! 243cdf0e10cSrcweir if (!pID) 244cdf0e10cSrcweir { 245cdf0e10cSrcweir static ::cppu::OImplementationId aID(sal_False); 246cdf0e10cSrcweir pID = &aID; 247cdf0e10cSrcweir } 248cdf0e10cSrcweir /* } GLOBAL SAFE */ 249cdf0e10cSrcweir } 250cdf0e10cSrcweir return pID->getImplementationId(); 251cdf0e10cSrcweir } 252cdf0e10cSrcweir 253cdf0e10cSrcweir //_______________________________________________ 254cdf0e10cSrcweir 255cdf0e10cSrcweir /** returns a static implementation name for this UNO service. 256cdf0e10cSrcweir 257cdf0e10cSrcweir Because this value is needed at different places and our class is used 258cdf0e10cSrcweir by some generic macros too, we have to use a static impl method for that! 259cdf0e10cSrcweir 260cdf0e10cSrcweir @see impl_getStaticImplementationName() 261cdf0e10cSrcweir @see IMPLEMENTATIONNAME 262cdf0e10cSrcweir 263cdf0e10cSrcweir @return The implementation name of this class. 264cdf0e10cSrcweir */ 265cdf0e10cSrcweir 266cdf0e10cSrcweir ::rtl::OUString SAL_CALL BackingComp::getImplementationName() 267cdf0e10cSrcweir throw(css::uno::RuntimeException) 268cdf0e10cSrcweir { 269cdf0e10cSrcweir return impl_getStaticImplementationName(); 270cdf0e10cSrcweir } 271cdf0e10cSrcweir 272cdf0e10cSrcweir //_______________________________________________ 273cdf0e10cSrcweir 274cdf0e10cSrcweir /** returns information about supported services. 275cdf0e10cSrcweir 276cdf0e10cSrcweir Because this value is needed at different places and our class is used 277cdf0e10cSrcweir by some generic macros too, we have to use a static impl method for that! 278cdf0e10cSrcweir 279cdf0e10cSrcweir @see impl_getStaticSupportedServiceNames() 280cdf0e10cSrcweir @see SERVICENAME 281cdf0e10cSrcweir 282cdf0e10cSrcweir @return <TRUE/> if the queried service is supported; 283cdf0e10cSrcweir <br><FALSE/> otherwise. 284cdf0e10cSrcweir */ 285cdf0e10cSrcweir 286cdf0e10cSrcweir sal_Bool SAL_CALL BackingComp::supportsService( /*IN*/ const ::rtl::OUString& sServiceName ) 287cdf0e10cSrcweir throw(css::uno::RuntimeException) 288cdf0e10cSrcweir { 289cdf0e10cSrcweir return ( 290cdf0e10cSrcweir sServiceName.equals(SERVICENAME_STARTMODULE ) || 291cdf0e10cSrcweir sServiceName.equals(SERVICENAME_FRAMECONTROLLER) 292cdf0e10cSrcweir ); 293cdf0e10cSrcweir } 294cdf0e10cSrcweir 295cdf0e10cSrcweir //_______________________________________________ 296cdf0e10cSrcweir 297cdf0e10cSrcweir /** returns collection of supported services. 298cdf0e10cSrcweir 299cdf0e10cSrcweir Because this value is needed at different places and our class is used 300cdf0e10cSrcweir by some generic macros too, we have to use a static impl method for that! 301cdf0e10cSrcweir 302cdf0e10cSrcweir @see impl_getStaticSupportedServiceNames() 303cdf0e10cSrcweir @see SERVICENAME 304cdf0e10cSrcweir 305cdf0e10cSrcweir @return A list of all supported uno service names. 306cdf0e10cSrcweir */ 307cdf0e10cSrcweir 308cdf0e10cSrcweir css::uno::Sequence< ::rtl::OUString > SAL_CALL BackingComp::getSupportedServiceNames() 309cdf0e10cSrcweir throw(css::uno::RuntimeException) 310cdf0e10cSrcweir { 311cdf0e10cSrcweir return impl_getStaticSupportedServiceNames(); 312cdf0e10cSrcweir } 313cdf0e10cSrcweir 314cdf0e10cSrcweir //_______________________________________________ 315cdf0e10cSrcweir 316cdf0e10cSrcweir /** returns static implementation name. 317cdf0e10cSrcweir 318cdf0e10cSrcweir Because this value is needed at different places and our class is used 319cdf0e10cSrcweir by some generic macros too, we have to use a static impl method for that! 320cdf0e10cSrcweir 321cdf0e10cSrcweir @see impl_getStaticSupportedServiceNames() 322cdf0e10cSrcweir @see SERVICENAME 323cdf0e10cSrcweir 324cdf0e10cSrcweir @return The implementation name of this class. 325cdf0e10cSrcweir */ 326cdf0e10cSrcweir 327cdf0e10cSrcweir ::rtl::OUString BackingComp::impl_getStaticImplementationName() 328cdf0e10cSrcweir { 329cdf0e10cSrcweir return IMPLEMENTATIONNAME_STARTMODULE; 330cdf0e10cSrcweir } 331cdf0e10cSrcweir 332cdf0e10cSrcweir //_______________________________________________ 333cdf0e10cSrcweir 334cdf0e10cSrcweir /** returns static list of supported service names. 335cdf0e10cSrcweir 336cdf0e10cSrcweir Because this value is needed at different places and our class is used 337cdf0e10cSrcweir by some generic macros too, we have to use a static impl method for that! 338cdf0e10cSrcweir 339cdf0e10cSrcweir @see impl_getStaticSupportedServiceNames() 340cdf0e10cSrcweir @see SERVICENAME 341cdf0e10cSrcweir 342cdf0e10cSrcweir @return A list of all supported uno service names. 343cdf0e10cSrcweir */ 344cdf0e10cSrcweir 345cdf0e10cSrcweir css::uno::Sequence< ::rtl::OUString > BackingComp::impl_getStaticSupportedServiceNames() 346cdf0e10cSrcweir { 347cdf0e10cSrcweir css::uno::Sequence< ::rtl::OUString > lNames(1); 348cdf0e10cSrcweir lNames[0] = SERVICENAME_STARTMODULE; 349cdf0e10cSrcweir return lNames; 350cdf0e10cSrcweir } 351cdf0e10cSrcweir 352cdf0e10cSrcweir //_______________________________________________ 353cdf0e10cSrcweir 354cdf0e10cSrcweir /** returns a new instance of this class. 355cdf0e10cSrcweir 356cdf0e10cSrcweir This factory method is registered inside the UNO runtime 357cdf0e10cSrcweir and will be called for every createInstance() request from outside, 358cdf0e10cSrcweir which wish to use this service. 359cdf0e10cSrcweir 360cdf0e10cSrcweir @param xSMGR 361cdf0e10cSrcweir reference to the uno service manager, which call us 362cdf0e10cSrcweir We use it too, to set it at the new created instance. 363cdf0e10cSrcweir 364cdf0e10cSrcweir @return A new instance as uno reference. 365cdf0e10cSrcweir */ 366cdf0e10cSrcweir 367cdf0e10cSrcweir css::uno::Reference< css::uno::XInterface > SAL_CALL BackingComp::impl_createInstance( /*IN*/ const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR ) 368cdf0e10cSrcweir throw(css::uno::Exception) 369cdf0e10cSrcweir { 370cdf0e10cSrcweir BackingComp* pObject = new BackingComp(xSMGR); 371cdf0e10cSrcweir return css::uno::Reference< css::uno::XInterface >(static_cast< ::cppu::OWeakObject* >(pObject), css::uno::UNO_QUERY); 372cdf0e10cSrcweir } 373cdf0e10cSrcweir 374cdf0e10cSrcweir //_______________________________________________ 375cdf0e10cSrcweir 376cdf0e10cSrcweir /** returns a new factory instance for instances of this class. 377cdf0e10cSrcweir 378cdf0e10cSrcweir It uses a helper class of the cppuhelper project as factory. 37907a3d7f1SPedro Giffuni It will be initialized with all necessary informations and 380cdf0e10cSrcweir will be able afterwards to create instance of this class. 381cdf0e10cSrcweir This factory call us back inside our method impl_createInstance(). 382cdf0e10cSrcweir So we can create and initialize ourself. Only filtering of creation 383cdf0e10cSrcweir requests will be done by this factory. 384cdf0e10cSrcweir 385cdf0e10cSrcweir @param xSMGR 386cdf0e10cSrcweir reference to the uno service manager, which call us 387cdf0e10cSrcweir 388cdf0e10cSrcweir @return A new instance of our factory. 389cdf0e10cSrcweir */ 390cdf0e10cSrcweir 391cdf0e10cSrcweir css::uno::Reference< css::lang::XSingleServiceFactory > BackingComp::impl_createFactory( /*IN*/ const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR ) 392cdf0e10cSrcweir { 393cdf0e10cSrcweir css::uno::Reference< css::lang::XSingleServiceFactory > xReturn( 394cdf0e10cSrcweir cppu::createSingleFactory( 395cdf0e10cSrcweir xSMGR, 396cdf0e10cSrcweir BackingComp::impl_getStaticImplementationName(), 397cdf0e10cSrcweir BackingComp::impl_createInstance, 398cdf0e10cSrcweir BackingComp::impl_getStaticSupportedServiceNames())); 399cdf0e10cSrcweir return xReturn; 400cdf0e10cSrcweir } 401cdf0e10cSrcweir 402cdf0e10cSrcweir //_______________________________________________ 403cdf0e10cSrcweir 404cdf0e10cSrcweir /** 405cdf0e10cSrcweir attach this component to a target frame. 406cdf0e10cSrcweir 407cdf0e10cSrcweir We has to use the container window of this frame as parent window of our own component window. 40807a3d7f1SPedro Giffuni But it's not allowed to work with it really. May another component used it too. 409cdf0e10cSrcweir Currently we need it only to create our child component window and support it's 410cdf0e10cSrcweir interfaces inside our queryInterface() method. The user of us must have e.g. the 411cdf0e10cSrcweir XWindow interface of it to be able to call setComponent(xWindow,xController) at the 412cdf0e10cSrcweir frame! 413cdf0e10cSrcweir 414cdf0e10cSrcweir May he will do the following things: 415cdf0e10cSrcweir 416cdf0e10cSrcweir <listing> 417cdf0e10cSrcweir XController xBackingComp = (XController)UnoRuntime.queryInterface( 418cdf0e10cSrcweir XController.class, 419cdf0e10cSrcweir xSMGR.createInstance(SERVICENAME_STARTMODULE)); 420cdf0e10cSrcweir 421cdf0e10cSrcweir // at this time XWindow isn't present at this instance! 422cdf0e10cSrcweir XWindow xBackingComp = (XWindow)UnoRuntime.queryInterface( 423cdf0e10cSrcweir XWindow.class, 424cdf0e10cSrcweir xBackingComp); 425cdf0e10cSrcweir 426cdf0e10cSrcweir // attach controller to the frame 427cdf0e10cSrcweir // We will use it's container window, to create 428cdf0e10cSrcweir // the component window. From now we offer the window interfaces! 429cdf0e10cSrcweir xBackingComp.attachFrame(xFrame); 430cdf0e10cSrcweir 431cdf0e10cSrcweir XWindow xBackingComp = (XWindow)UnoRuntime.queryInterface( 432cdf0e10cSrcweir XWindow.class, 433cdf0e10cSrcweir xBackingComp); 434cdf0e10cSrcweir 435cdf0e10cSrcweir // Our user can set us at the frame as new component 436cdf0e10cSrcweir xFrame.setComponent(xBackingWin, xBackingComp); 437cdf0e10cSrcweir 438cdf0e10cSrcweir // But that had no effect to our view state. 439cdf0e10cSrcweir // We must be started to create our UI elements like e.g. menu, title, background ... 440cdf0e10cSrcweir XInitialization xBackingInit = (XInitialization)UnoRuntime.queryInterface( 441cdf0e10cSrcweir XInitialization.class, 442cdf0e10cSrcweir xBackingComp); 443cdf0e10cSrcweir 444cdf0e10cSrcweir xBackingInit.initialize(lArgs); 445cdf0e10cSrcweir </listing> 446cdf0e10cSrcweir 447cdf0e10cSrcweir @param xFrame 448cdf0e10cSrcweir reference to our new target frame 449cdf0e10cSrcweir 450cdf0e10cSrcweir @throw com::sun::star::uno::RuntimeException 451cdf0e10cSrcweir if the given frame reference is wrong or component window couldn't be created 452cdf0e10cSrcweir successfully. 453cdf0e10cSrcweir We throw it too, if we already attached to a frame. Because we don't support 454cdf0e10cSrcweir reparenting of our component window on demand! 455cdf0e10cSrcweir */ 456cdf0e10cSrcweir 457cdf0e10cSrcweir void SAL_CALL BackingComp::attachFrame( /*IN*/ const css::uno::Reference< css::frame::XFrame >& xFrame ) 458cdf0e10cSrcweir throw (css::uno::RuntimeException) 459cdf0e10cSrcweir { 460cdf0e10cSrcweir /* SAFE */ 461cdf0e10cSrcweir WriteGuard aWriteLock(m_aLock); 462cdf0e10cSrcweir 463cdf0e10cSrcweir // check some required states 464cdf0e10cSrcweir if (m_xFrame.is()) 465cdf0e10cSrcweir throw css::uno::RuntimeException( 466cdf0e10cSrcweir ::rtl::OUString::createFromAscii("already attached"), 467cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >(this)); 468cdf0e10cSrcweir 469cdf0e10cSrcweir if (!xFrame.is()) 470cdf0e10cSrcweir throw css::uno::RuntimeException( 471cdf0e10cSrcweir ::rtl::OUString::createFromAscii("invalid frame reference"), 472cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >(this)); 473cdf0e10cSrcweir 474cdf0e10cSrcweir if (!m_xWindow.is()) 475cdf0e10cSrcweir throw css::uno::RuntimeException( 476cdf0e10cSrcweir ::rtl::OUString::createFromAscii("instance seams to be not or wrong initialized"), 477cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >(this)); 478cdf0e10cSrcweir 479cdf0e10cSrcweir // safe the frame reference 480cdf0e10cSrcweir m_xFrame = xFrame; 481cdf0e10cSrcweir 482cdf0e10cSrcweir // establish drag&drop mode 483cdf0e10cSrcweir ::framework::DropTargetListener* pDropListener = new ::framework::DropTargetListener(m_xSMGR, m_xFrame); 484cdf0e10cSrcweir m_xDropTargetListener = css::uno::Reference< css::datatransfer::dnd::XDropTargetListener >(static_cast< ::cppu::OWeakObject* >(pDropListener), css::uno::UNO_QUERY); 485cdf0e10cSrcweir 486cdf0e10cSrcweir css::uno::Reference< css::awt::XDataTransferProviderAccess > xTransfer(m_xSMGR->createInstance(SERVICENAME_VCLTOOLKIT), css::uno::UNO_QUERY); 487cdf0e10cSrcweir if (xTransfer.is()) 488cdf0e10cSrcweir { 489cdf0e10cSrcweir css::uno::Reference< css::datatransfer::dnd::XDropTarget > xDropTarget = xTransfer->getDropTarget(m_xWindow); 490cdf0e10cSrcweir if (xDropTarget.is()) 491cdf0e10cSrcweir { 492cdf0e10cSrcweir xDropTarget->addDropTargetListener(m_xDropTargetListener); 493cdf0e10cSrcweir xDropTarget->setActive(sal_True); 494cdf0e10cSrcweir } 495cdf0e10cSrcweir } 496cdf0e10cSrcweir 497cdf0e10cSrcweir // initialize the component and it's parent window 498cdf0e10cSrcweir css::uno::Reference< css::awt::XWindow > xParentWindow = xFrame->getContainerWindow(); 499cdf0e10cSrcweir WorkWindow* pParent = (WorkWindow*)VCLUnoHelper::GetWindow(xParentWindow); 500cdf0e10cSrcweir Window* pWindow = VCLUnoHelper::GetWindow(m_xWindow); 501cdf0e10cSrcweir 502cdf0e10cSrcweir // disable full screen mode of the frame! 503cdf0e10cSrcweir if (pParent->IsFullScreenMode()) 504cdf0e10cSrcweir { 505cdf0e10cSrcweir pParent->ShowFullScreenMode(sal_False); 506cdf0e10cSrcweir pParent->SetMenuBarMode(MENUBAR_MODE_NORMAL); 507cdf0e10cSrcweir } 508cdf0e10cSrcweir 509cdf0e10cSrcweir // create the menu bar for the backing component 510cdf0e10cSrcweir css::uno::Reference< css::beans::XPropertySet > xPropSet(m_xFrame, css::uno::UNO_QUERY_THROW); 511cdf0e10cSrcweir css::uno::Reference< css::frame::XLayoutManager > xLayoutManager; 512cdf0e10cSrcweir xPropSet->getPropertyValue(FRAME_PROPNAME_LAYOUTMANAGER) >>= xLayoutManager; 513cdf0e10cSrcweir if (xLayoutManager.is()) 514cdf0e10cSrcweir { 515cdf0e10cSrcweir xLayoutManager->lock(); 516cdf0e10cSrcweir xLayoutManager->createElement( DECLARE_ASCII( "private:resource/menubar/menubar" )); 517cdf0e10cSrcweir /* #i85963# new backing window comes withoud standard bar and statusbar 518cdf0e10cSrcweir xLayoutManager->createElement( DECLARE_ASCII( "private:resource/toolbar/standardbar" )); 519cdf0e10cSrcweir xLayoutManager->createElement( DECLARE_ASCII( "private:resource/statusbar/statusbar" )); 520cdf0e10cSrcweir xLayoutManager->showElement ( DECLARE_ASCII( "private:resource/toolbar/standardbar" )); 521cdf0e10cSrcweir xLayoutManager->showElement ( DECLARE_ASCII( "private:resource/statusbar/statusbar" )); 522cdf0e10cSrcweir */ 523cdf0e10cSrcweir xLayoutManager->unlock(); 524cdf0e10cSrcweir } 525cdf0e10cSrcweir 526cdf0e10cSrcweir // set help ID for our canvas 527cdf0e10cSrcweir pWindow->SetHelpId(HID_BACKINGWINDOW); 528cdf0e10cSrcweir 529cdf0e10cSrcweir // inform BackingWindow about frame 530cdf0e10cSrcweir BackingWindow* pBack = dynamic_cast<BackingWindow*>(pWindow ); 531cdf0e10cSrcweir if( pBack ) 532cdf0e10cSrcweir pBack->setOwningFrame( m_xFrame ); 533cdf0e10cSrcweir 534cdf0e10cSrcweir aWriteLock.unlock(); 535cdf0e10cSrcweir /* } SAFE */ 536cdf0e10cSrcweir } 537cdf0e10cSrcweir 538cdf0e10cSrcweir //_______________________________________________ 539cdf0e10cSrcweir 540cdf0e10cSrcweir /** not supported. 541cdf0e10cSrcweir 542cdf0e10cSrcweir This component does not know any model. It will be represented by a window and 543cdf0e10cSrcweir it's controller only. 544cdf0e10cSrcweir 54507a3d7f1SPedro Giffuni return <FALSE/> every time. 546cdf0e10cSrcweir */ 547cdf0e10cSrcweir 548cdf0e10cSrcweir sal_Bool SAL_CALL BackingComp::attachModel( /*IN*/ const css::uno::Reference< css::frame::XModel >& ) 549cdf0e10cSrcweir throw (css::uno::RuntimeException) 550cdf0e10cSrcweir { 551cdf0e10cSrcweir return sal_False; 552cdf0e10cSrcweir } 553cdf0e10cSrcweir 554cdf0e10cSrcweir //_______________________________________________ 555cdf0e10cSrcweir 556cdf0e10cSrcweir /** not supported. 557cdf0e10cSrcweir 558cdf0e10cSrcweir This component does not know any model. It will be represented by a window and 559cdf0e10cSrcweir it's controller only. 560cdf0e10cSrcweir 561cdf0e10cSrcweir return An empty reference every time. 562cdf0e10cSrcweir */ 563cdf0e10cSrcweir 564cdf0e10cSrcweir css::uno::Reference< css::frame::XModel > SAL_CALL BackingComp::getModel() 565cdf0e10cSrcweir throw (css::uno::RuntimeException) 566cdf0e10cSrcweir { 567cdf0e10cSrcweir return css::uno::Reference< css::frame::XModel >(); 568cdf0e10cSrcweir } 569cdf0e10cSrcweir 570cdf0e10cSrcweir //_______________________________________________ 571cdf0e10cSrcweir 572cdf0e10cSrcweir /** not supported. 573cdf0e10cSrcweir 574cdf0e10cSrcweir return An empty value. 575cdf0e10cSrcweir */ 576cdf0e10cSrcweir 577cdf0e10cSrcweir css::uno::Any SAL_CALL BackingComp::getViewData() 578cdf0e10cSrcweir throw (css::uno::RuntimeException) 579cdf0e10cSrcweir { 580cdf0e10cSrcweir return css::uno::Any(); 581cdf0e10cSrcweir } 582cdf0e10cSrcweir 583cdf0e10cSrcweir //_______________________________________________ 584cdf0e10cSrcweir 585cdf0e10cSrcweir /** not supported. 586cdf0e10cSrcweir 587cdf0e10cSrcweir @param aData 588cdf0e10cSrcweir not used. 589cdf0e10cSrcweir */ 590cdf0e10cSrcweir 591cdf0e10cSrcweir void SAL_CALL BackingComp::restoreViewData( /*IN*/ const css::uno::Any& ) 592cdf0e10cSrcweir throw (css::uno::RuntimeException) 593cdf0e10cSrcweir { 594cdf0e10cSrcweir } 595cdf0e10cSrcweir 596cdf0e10cSrcweir //_______________________________________________ 597cdf0e10cSrcweir 598cdf0e10cSrcweir /** returns the attached frame for this component. 599cdf0e10cSrcweir 600cdf0e10cSrcweir @see attachFrame() 601cdf0e10cSrcweir 602*06fea5ebSmseidel @return The internally saved frame reference. 603cdf0e10cSrcweir Can be null, if attachFrame() was not called before. 604cdf0e10cSrcweir */ 605cdf0e10cSrcweir 606cdf0e10cSrcweir css::uno::Reference< css::frame::XFrame > SAL_CALL BackingComp::getFrame() 607cdf0e10cSrcweir throw (css::uno::RuntimeException) 608cdf0e10cSrcweir { 609cdf0e10cSrcweir /* SAFE { */ 610cdf0e10cSrcweir ReadGuard aReadLock(m_aLock); 611cdf0e10cSrcweir return m_xFrame; 612cdf0e10cSrcweir /* } SAFE */ 613cdf0e10cSrcweir } 614cdf0e10cSrcweir 615cdf0e10cSrcweir //_______________________________________________ 616cdf0e10cSrcweir 617cdf0e10cSrcweir /** ask controller for it's current working state. 618cdf0e10cSrcweir 619cdf0e10cSrcweir If somehwere whish to close this component, it must suspend the controller before. 620cdf0e10cSrcweir That will be a chance for it to disagree with that AND show any UI for a possible 621cdf0e10cSrcweir UI user. 622cdf0e10cSrcweir 623cdf0e10cSrcweir @param bSuspend 624cdf0e10cSrcweir If its set to sal_True this controller should be suspended. 625cdf0e10cSrcweir sal_False will resuspend it. 626cdf0e10cSrcweir 627cdf0e10cSrcweir @return sal_True if the request could be finished successfully; sal_False otherwise. 628cdf0e10cSrcweir */ 629cdf0e10cSrcweir 630cdf0e10cSrcweir sal_Bool SAL_CALL BackingComp::suspend( /*IN*/ sal_Bool ) 631cdf0e10cSrcweir throw (css::uno::RuntimeException) 632cdf0e10cSrcweir { 633cdf0e10cSrcweir /* FIXME ... implemented by using default :-( */ 634cdf0e10cSrcweir return sal_True; 635cdf0e10cSrcweir } 636cdf0e10cSrcweir 637cdf0e10cSrcweir //_______________________________________________ 638cdf0e10cSrcweir 639cdf0e10cSrcweir /** callback from our window member. 640cdf0e10cSrcweir 641cdf0e10cSrcweir Our internal saved window wish to die. It will be disposed from outside (may be the frame) 642cdf0e10cSrcweir and inform us. We must release its reference only here. Of course we check the given reference 643cdf0e10cSrcweir here and reject callback from unknown sources. 644cdf0e10cSrcweir 64507a3d7f1SPedro Giffuni Note: deregistration as listener isn't necessary here. The broadcaster do it automatically. 646cdf0e10cSrcweir 647cdf0e10cSrcweir @param aEvent 648cdf0e10cSrcweir describe the broadcaster of this callback 649cdf0e10cSrcweir 650cdf0e10cSrcweir @throw ::com::sun::star::uno::RuntimeException 651cdf0e10cSrcweir if the broadcaster doesn't represent the expected window reference. 652cdf0e10cSrcweir */ 653cdf0e10cSrcweir 654cdf0e10cSrcweir void SAL_CALL BackingComp::disposing( /*IN*/ const css::lang::EventObject& aEvent ) 655cdf0e10cSrcweir throw(css::uno::RuntimeException) 656cdf0e10cSrcweir { 657cdf0e10cSrcweir // Attention: dont free m_pAccExec here! see comments inside dtor and 658cdf0e10cSrcweir // keyPressed() for further details. 659cdf0e10cSrcweir 660cdf0e10cSrcweir /* SAFE { */ 661cdf0e10cSrcweir WriteGuard aWriteLock(m_aLock); 662cdf0e10cSrcweir 663cdf0e10cSrcweir if (!aEvent.Source.is() || aEvent.Source!=m_xWindow || !m_xWindow.is()) 664cdf0e10cSrcweir throw css::uno::RuntimeException( 665cdf0e10cSrcweir ::rtl::OUString::createFromAscii("unexpected source or called twice"), 666cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >(this)); 667cdf0e10cSrcweir 668cdf0e10cSrcweir m_xWindow = css::uno::Reference< css::awt::XWindow >(); 669cdf0e10cSrcweir 670cdf0e10cSrcweir aWriteLock.unlock(); 671cdf0e10cSrcweir /* } SAFE */ 672cdf0e10cSrcweir } 673cdf0e10cSrcweir 674cdf0e10cSrcweir //_______________________________________________ 675cdf0e10cSrcweir 676cdf0e10cSrcweir /** kill this instance. 677cdf0e10cSrcweir 678cdf0e10cSrcweir It can be called from our owner frame only. But there is no possibility to check the calli. 679cdf0e10cSrcweir We have to release all our internal used ressources and die. From this point we can throw 680cdf0e10cSrcweir DisposedExceptions for every further interface request ... but current implementation doesn`t do so ... 681cdf0e10cSrcweir 682cdf0e10cSrcweir */ 683cdf0e10cSrcweir 684cdf0e10cSrcweir void SAL_CALL BackingComp::dispose() 685cdf0e10cSrcweir throw(css::uno::RuntimeException) 686cdf0e10cSrcweir { 687cdf0e10cSrcweir /* SAFE { */ 688cdf0e10cSrcweir WriteGuard aWriteLock(m_aLock); 689cdf0e10cSrcweir 690cdf0e10cSrcweir // kill the menu 691cdf0e10cSrcweir css::util::URL aURL; 692cdf0e10cSrcweir aURL.Complete = DECLARE_ASCII(".uno:close"); 693cdf0e10cSrcweir css::uno::Reference< css::util::XURLTransformer > xParser(m_xSMGR->createInstance(SERVICENAME_URLTRANSFORMER), css::uno::UNO_QUERY); 694cdf0e10cSrcweir if (xParser.is()) 695cdf0e10cSrcweir xParser->parseStrict(aURL); 696cdf0e10cSrcweir 697cdf0e10cSrcweir css::uno::Reference< css::frame::XDispatchProvider > xProvider(m_xFrame, css::uno::UNO_QUERY); 698cdf0e10cSrcweir if (xProvider.is()) 699cdf0e10cSrcweir { 700cdf0e10cSrcweir css::uno::Reference< css::frame::XDispatch > xDispatch = xProvider->queryDispatch(aURL, SPECIALTARGET_MENUBAR, 0); 701cdf0e10cSrcweir if (xDispatch.is()) 702cdf0e10cSrcweir xDispatch->dispatch(aURL, css::uno::Sequence< css::beans::PropertyValue>()); 703cdf0e10cSrcweir } 704cdf0e10cSrcweir 705cdf0e10cSrcweir // deregister drag&drop helper 706cdf0e10cSrcweir if (m_xDropTargetListener.is()) 707cdf0e10cSrcweir { 708cdf0e10cSrcweir css::uno::Reference< css::awt::XDataTransferProviderAccess > xTransfer(m_xSMGR->createInstance(SERVICENAME_VCLTOOLKIT), css::uno::UNO_QUERY); 709cdf0e10cSrcweir if (xTransfer.is()) 710cdf0e10cSrcweir { 711cdf0e10cSrcweir css::uno::Reference< css::datatransfer::dnd::XDropTarget > xDropTarget = xTransfer->getDropTarget(m_xWindow); 712cdf0e10cSrcweir if (xDropTarget.is()) 713cdf0e10cSrcweir { 714cdf0e10cSrcweir xDropTarget->removeDropTargetListener(m_xDropTargetListener); 715cdf0e10cSrcweir xDropTarget->setActive(sal_False); 716cdf0e10cSrcweir } 717cdf0e10cSrcweir } 718cdf0e10cSrcweir m_xDropTargetListener = css::uno::Reference< css::datatransfer::dnd::XDropTargetListener >(); 719cdf0e10cSrcweir } 720cdf0e10cSrcweir 721cdf0e10cSrcweir // stop listening at the window 722cdf0e10cSrcweir if (m_xWindow.is()) 723cdf0e10cSrcweir { 724cdf0e10cSrcweir css::uno::Reference< css::lang::XComponent > xBroadcaster(m_xWindow, css::uno::UNO_QUERY); 725cdf0e10cSrcweir if (xBroadcaster.is()) 726cdf0e10cSrcweir { 727cdf0e10cSrcweir css::uno::Reference< css::lang::XEventListener > xEventThis(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY); 728cdf0e10cSrcweir xBroadcaster->removeEventListener(xEventThis); 729cdf0e10cSrcweir } 730cdf0e10cSrcweir css::uno::Reference< css::awt::XKeyListener > xKeyThis(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY); 731cdf0e10cSrcweir m_xWindow->removeKeyListener(xKeyThis); 732cdf0e10cSrcweir m_xWindow = css::uno::Reference< css::awt::XWindow >(); 733cdf0e10cSrcweir } 734cdf0e10cSrcweir 735cdf0e10cSrcweir // forget all other used references 736cdf0e10cSrcweir m_xFrame = css::uno::Reference< css::frame::XFrame >(); 737cdf0e10cSrcweir m_xSMGR = css::uno::Reference< css::lang::XMultiServiceFactory >(); 738cdf0e10cSrcweir 739cdf0e10cSrcweir aWriteLock.unlock(); 740cdf0e10cSrcweir /* } SAFE */ 741cdf0e10cSrcweir } 742cdf0e10cSrcweir 743cdf0e10cSrcweir //_______________________________________________ 744cdf0e10cSrcweir 745cdf0e10cSrcweir /** not supported. 746cdf0e10cSrcweir 747cdf0e10cSrcweir @param xListener 748cdf0e10cSrcweir not used. 749cdf0e10cSrcweir 750cdf0e10cSrcweir @throw ::com::sun::star::uno::RuntimeException 751cdf0e10cSrcweir because the listener expect to be holded alive by this container. 752cdf0e10cSrcweir We must inform it about this unsupported feature. 753cdf0e10cSrcweir */ 754cdf0e10cSrcweir 755cdf0e10cSrcweir void SAL_CALL BackingComp::addEventListener( /*IN*/ const css::uno::Reference< css::lang::XEventListener >& ) 756cdf0e10cSrcweir throw(css::uno::RuntimeException) 757cdf0e10cSrcweir { 758cdf0e10cSrcweir throw css::uno::RuntimeException( 759cdf0e10cSrcweir ::rtl::OUString::createFromAscii("not supported"), 760cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >(this)); 761cdf0e10cSrcweir } 762cdf0e10cSrcweir 763cdf0e10cSrcweir //_______________________________________________ 764cdf0e10cSrcweir 765cdf0e10cSrcweir /** not supported. 766cdf0e10cSrcweir 76707a3d7f1SPedro Giffuni Because registration is not supported too, we must do nothing here. Nobody can call this method really. 768cdf0e10cSrcweir 769cdf0e10cSrcweir @param xListener 770cdf0e10cSrcweir not used. 771cdf0e10cSrcweir */ 772cdf0e10cSrcweir 773cdf0e10cSrcweir void SAL_CALL BackingComp::removeEventListener( /*IN*/ const css::uno::Reference< css::lang::XEventListener >& ) 774cdf0e10cSrcweir throw(css::uno::RuntimeException) 775cdf0e10cSrcweir { 776cdf0e10cSrcweir } 777cdf0e10cSrcweir 778cdf0e10cSrcweir //_______________________________________________ 779cdf0e10cSrcweir 780cdf0e10cSrcweir /** 781cdf0e10cSrcweir force initialiation for this component. 782cdf0e10cSrcweir 783cdf0e10cSrcweir Inside attachFrame() we created our component window. But it was not allowed there, to 784cdf0e10cSrcweir initialitze it. E.g. the menu must be set at the container window of the frame, which 785cdf0e10cSrcweir is our parent window. But may at that time another component used it. 78607a3d7f1SPedro Giffuni That's why our creator has to inform us, when it's time to initialize us really. 787cdf0e10cSrcweir Currently only calling of this method must be done. But further implementatoins 788cdf0e10cSrcweir can use special in parameter to configure this initialization ... 789cdf0e10cSrcweir 790cdf0e10cSrcweir @param lArgs 791cdf0e10cSrcweir currently not used 792cdf0e10cSrcweir 793cdf0e10cSrcweir @throw com::sun::star::uno::RuntimeException 794cdf0e10cSrcweir if some ressources are missing 795cdf0e10cSrcweir Means if may be attachedFrame() wasn't called before. 796cdf0e10cSrcweir */ 797cdf0e10cSrcweir 798cdf0e10cSrcweir void SAL_CALL BackingComp::initialize( /*IN*/ const css::uno::Sequence< css::uno::Any >& lArgs ) 799cdf0e10cSrcweir throw(css::uno::Exception, css::uno::RuntimeException) 800cdf0e10cSrcweir { 801cdf0e10cSrcweir /* SAFE { */ 802cdf0e10cSrcweir WriteGuard aWriteLock(m_aLock); 803cdf0e10cSrcweir 804cdf0e10cSrcweir if (m_xWindow.is()) 805cdf0e10cSrcweir throw css::uno::Exception( 806cdf0e10cSrcweir ::rtl::OUString::createFromAscii("already initialized"), 807cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >(this)); 808cdf0e10cSrcweir 809cdf0e10cSrcweir css::uno::Reference< css::awt::XWindow > xParentWindow; 810cdf0e10cSrcweir if ( 811cdf0e10cSrcweir (lArgs.getLength()!=1 ) || 812cdf0e10cSrcweir (!(lArgs[0] >>= xParentWindow)) || 813cdf0e10cSrcweir (!xParentWindow.is() ) 814cdf0e10cSrcweir ) 815cdf0e10cSrcweir { 816cdf0e10cSrcweir throw css::uno::Exception( 817cdf0e10cSrcweir ::rtl::OUString::createFromAscii("wrong or corrupt argument list"), 818cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >(this)); 819cdf0e10cSrcweir } 820cdf0e10cSrcweir 821cdf0e10cSrcweir // create the component window 822cdf0e10cSrcweir Window* pParent = VCLUnoHelper::GetWindow(xParentWindow); 823cdf0e10cSrcweir Window* pWindow = new BackingWindow(pParent); 824cdf0e10cSrcweir m_xWindow = VCLUnoHelper::GetInterface(pWindow); 825cdf0e10cSrcweir 826cdf0e10cSrcweir if (!m_xWindow.is()) 827cdf0e10cSrcweir throw css::uno::RuntimeException( 828cdf0e10cSrcweir ::rtl::OUString::createFromAscii("couldn't create component window"), 829cdf0e10cSrcweir static_cast< ::cppu::OWeakObject* >(this)); 830cdf0e10cSrcweir 831cdf0e10cSrcweir // start listening for window disposing 832cdf0e10cSrcweir // It's set at our owner frame as component window later too. So it will may be disposed there ... 833cdf0e10cSrcweir css::uno::Reference< css::lang::XComponent > xBroadcaster(m_xWindow, css::uno::UNO_QUERY); 834cdf0e10cSrcweir if (xBroadcaster.is()) 835cdf0e10cSrcweir xBroadcaster->addEventListener(static_cast< css::lang::XEventListener* >(this)); 836cdf0e10cSrcweir 837cdf0e10cSrcweir m_xWindow->setVisible(sal_True); 838cdf0e10cSrcweir 839cdf0e10cSrcweir aWriteLock.unlock(); 840cdf0e10cSrcweir /* } SAFE */ 841cdf0e10cSrcweir } 842cdf0e10cSrcweir 843cdf0e10cSrcweir //_______________________________________________ 844cdf0e10cSrcweir 845cdf0e10cSrcweir /** 846cdf0e10cSrcweir */ 847cdf0e10cSrcweir 848cdf0e10cSrcweir void SAL_CALL BackingComp::keyPressed( /*IN*/ const css::awt::KeyEvent& ) 849cdf0e10cSrcweir throw(css::uno::RuntimeException) 850cdf0e10cSrcweir { 851cdf0e10cSrcweir } 852cdf0e10cSrcweir 853cdf0e10cSrcweir //_______________________________________________ 854cdf0e10cSrcweir 855cdf0e10cSrcweir /** 856cdf0e10cSrcweir */ 857cdf0e10cSrcweir 858cdf0e10cSrcweir void SAL_CALL BackingComp::keyReleased( /*IN*/ const css::awt::KeyEvent& ) 859cdf0e10cSrcweir throw(css::uno::RuntimeException) 860cdf0e10cSrcweir { 861cdf0e10cSrcweir /* Attention 862cdf0e10cSrcweir Please use keyPressed() instead of this method. Otherwhise it would be possible, that 863cdf0e10cSrcweir - a key input may be first switch to the backing mode 864cdf0e10cSrcweir - and this component register itself as key listener too 865cdf0e10cSrcweir - and it's first event will be a keyRealeased() for the already well known event, which switched to the backing mode! 866cdf0e10cSrcweir So it will be handled twice! document => backing mode => exit app ... 867cdf0e10cSrcweir */ 868cdf0e10cSrcweir } 869cdf0e10cSrcweir 870cdf0e10cSrcweir } // namespace framework 871