1c142477cSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3c142477cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4c142477cSAndrew Rist * or more contributor license agreements. See the NOTICE file 5c142477cSAndrew Rist * distributed with this work for additional information 6c142477cSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7c142477cSAndrew Rist * to you under the Apache License, Version 2.0 (the 8c142477cSAndrew Rist * "License"); you may not use this file except in compliance 9c142477cSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11c142477cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13c142477cSAndrew Rist * Unless required by applicable law or agreed to in writing, 14c142477cSAndrew Rist * software distributed under the License is distributed on an 15c142477cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16c142477cSAndrew Rist * KIND, either express or implied. See the License for the 17c142477cSAndrew Rist * specific language governing permissions and limitations 18c142477cSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20c142477cSAndrew Rist *************************************************************/ 21c142477cSAndrew Rist 22c142477cSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_sdext.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "PresenterScreen.hxx" 28cdf0e10cSrcweir #include "PresenterConfigurationAccess.hxx" 29cdf0e10cSrcweir #include "PresenterController.hxx" 30cdf0e10cSrcweir #include "PresenterFrameworkObserver.hxx" 31cdf0e10cSrcweir #include "PresenterHelper.hxx" 32cdf0e10cSrcweir #include "PresenterPaneContainer.hxx" 33cdf0e10cSrcweir #include "PresenterPaneFactory.hxx" 34cdf0e10cSrcweir #include "PresenterViewFactory.hxx" 35cdf0e10cSrcweir #include "PresenterWindowManager.hxx" 36cdf0e10cSrcweir #include <com/sun/star/frame/XController.hpp> 37cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp> 38cdf0e10cSrcweir #include <com/sun/star/drawing/framework/Configuration.hpp> 39cdf0e10cSrcweir #include <com/sun/star/drawing/framework/XControllerManager.hpp> 40cdf0e10cSrcweir #include <com/sun/star/drawing/framework/ResourceId.hpp> 41cdf0e10cSrcweir #include <com/sun/star/drawing/framework/ResourceActivationMode.hpp> 42cdf0e10cSrcweir #include <com/sun/star/presentation/XSlideShow.hpp> 43cdf0e10cSrcweir #include <com/sun/star/presentation/XPresentation2.hpp> 44cdf0e10cSrcweir #include <com/sun/star/presentation/XPresentationSupplier.hpp> 45cdf0e10cSrcweir #include <com/sun/star/document/XEventBroadcaster.hpp> 46cdf0e10cSrcweir #include <boost/bind.hpp> 47cdf0e10cSrcweir #include <tools/debug.hxx> 48cdf0e10cSrcweir 49cdf0e10cSrcweir #include <com/sun/star/view/XSelectionSupplier.hpp> 50cdf0e10cSrcweir 51cdf0e10cSrcweir using namespace ::com::sun::star; 52cdf0e10cSrcweir using namespace ::com::sun::star::uno; 53cdf0e10cSrcweir using namespace ::com::sun::star::lang; 54cdf0e10cSrcweir using namespace ::com::sun::star::presentation; 55cdf0e10cSrcweir using namespace ::com::sun::star::drawing::framework; 56cdf0e10cSrcweir using ::rtl::OUString; 57cdf0e10cSrcweir 58cdf0e10cSrcweir #define A2S(s) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))) 59cdf0e10cSrcweir 60cdf0e10cSrcweir namespace sdext { namespace presenter { 61cdf0e10cSrcweir 62cdf0e10cSrcweir namespace { 63*2da1a64cSAriel Constenla-Haile 64*2da1a64cSAriel Constenla-Haile static sal_Bool lcl_IsPresenterEnabled( 65*2da1a64cSAriel Constenla-Haile const css::uno::Reference< css::uno::XComponentContext > &rxContext ) 66*2da1a64cSAriel Constenla-Haile { 67*2da1a64cSAriel Constenla-Haile sal_Bool bEnabled( sal_True ); 68*2da1a64cSAriel Constenla-Haile PresenterConfigurationAccess aConfig( 69*2da1a64cSAriel Constenla-Haile rxContext, 70*2da1a64cSAriel Constenla-Haile A2S( "/org.openoffice.Office.Impress" ), 71*2da1a64cSAriel Constenla-Haile PresenterConfigurationAccess::READ_ONLY ); 72*2da1a64cSAriel Constenla-Haile if ( aConfig.IsValid() ) 73*2da1a64cSAriel Constenla-Haile { 74*2da1a64cSAriel Constenla-Haile sal_Bool bVal( sal_False ); 75*2da1a64cSAriel Constenla-Haile if ( ( aConfig.GetConfigurationNode( 76*2da1a64cSAriel Constenla-Haile A2S( "Misc/Start/PresenterScreen" )) >>= bVal ) ) 77*2da1a64cSAriel Constenla-Haile bEnabled = bVal; 78*2da1a64cSAriel Constenla-Haile } 79*2da1a64cSAriel Constenla-Haile return bEnabled; 80*2da1a64cSAriel Constenla-Haile } 81*2da1a64cSAriel Constenla-Haile 82cdf0e10cSrcweir typedef ::cppu::WeakComponentImplHelper1 < 83cdf0e10cSrcweir css::document::XEventListener 84cdf0e10cSrcweir > PresenterScreenListenerInterfaceBase; 85cdf0e10cSrcweir 86cdf0e10cSrcweir /** One instance of a PresenterScreenListener is registered per Impress 87cdf0e10cSrcweir document and waits for the full screen slide show to start and to 88cdf0e10cSrcweir end. 89cdf0e10cSrcweir */ 90cdf0e10cSrcweir class PresenterScreenListener 91cdf0e10cSrcweir : private ::boost::noncopyable, 92cdf0e10cSrcweir private ::cppu::BaseMutex, 93cdf0e10cSrcweir public PresenterScreenListenerInterfaceBase 94cdf0e10cSrcweir { 95cdf0e10cSrcweir public: 96cdf0e10cSrcweir PresenterScreenListener ( 97cdf0e10cSrcweir const css::uno::Reference<css::uno::XComponentContext>& rxContext, 98cdf0e10cSrcweir const css::uno::Reference<css::frame::XModel2>& rxModel); 99cdf0e10cSrcweir virtual ~PresenterScreenListener (void); 100cdf0e10cSrcweir 101cdf0e10cSrcweir void Initialize (void); 102cdf0e10cSrcweir virtual void SAL_CALL disposing (void); 103cdf0e10cSrcweir 104cdf0e10cSrcweir // document::XEventListener 105cdf0e10cSrcweir 106cdf0e10cSrcweir virtual void SAL_CALL notifyEvent( const css::document::EventObject& Event ) throw (css::uno::RuntimeException); 107cdf0e10cSrcweir 108cdf0e10cSrcweir // XEventListener 109cdf0e10cSrcweir 110cdf0e10cSrcweir virtual void SAL_CALL disposing ( const css::lang::EventObject& rEvent) throw (css::uno::RuntimeException); 111cdf0e10cSrcweir 112cdf0e10cSrcweir private: 113cdf0e10cSrcweir css::uno::Reference<css::frame::XModel2 > mxModel; 114cdf0e10cSrcweir css::uno::Reference<css::uno::XComponentContext> mxComponentContext; 115cdf0e10cSrcweir rtl::Reference<PresenterScreen> mpPresenterScreen; 116cdf0e10cSrcweir 117cdf0e10cSrcweir void ThrowIfDisposed (void) const throw (::com::sun::star::lang::DisposedException); 118cdf0e10cSrcweir }; 119cdf0e10cSrcweir } 120cdf0e10cSrcweir 121cdf0e10cSrcweir 122cdf0e10cSrcweir //----- Service --------------------------------------------------------------- 123cdf0e10cSrcweir 124cdf0e10cSrcweir OUString PresenterScreenJob::getImplementationName_static (void) 125cdf0e10cSrcweir { 126494ddcdcSAriel Constenla-Haile return A2S("com.sun.star.comp.presentation.PresenterScreenJob"); 127cdf0e10cSrcweir } 128cdf0e10cSrcweir 129cdf0e10cSrcweir 130cdf0e10cSrcweir 131cdf0e10cSrcweir 132cdf0e10cSrcweir Sequence<OUString> PresenterScreenJob::getSupportedServiceNames_static (void) 133cdf0e10cSrcweir { 134cdf0e10cSrcweir static const ::rtl::OUString sServiceName( 135494ddcdcSAriel Constenla-Haile A2S("com.sun.star.presentation.PresenterScreenJob")); 136cdf0e10cSrcweir return Sequence<rtl::OUString>(&sServiceName, 1); 137cdf0e10cSrcweir } 138cdf0e10cSrcweir 139cdf0e10cSrcweir 140cdf0e10cSrcweir 141cdf0e10cSrcweir 142cdf0e10cSrcweir Reference<XInterface> PresenterScreenJob::Create (const Reference<uno::XComponentContext>& rxContext) 143cdf0e10cSrcweir SAL_THROW((css::uno::Exception)) 144cdf0e10cSrcweir { 145cdf0e10cSrcweir return Reference<XInterface>(static_cast<XWeak*>(new PresenterScreenJob(rxContext))); 146cdf0e10cSrcweir } 147cdf0e10cSrcweir 148cdf0e10cSrcweir 149cdf0e10cSrcweir 150cdf0e10cSrcweir 151cdf0e10cSrcweir //===== PresenterScreenJob ==================================================== 152cdf0e10cSrcweir 153cdf0e10cSrcweir PresenterScreenJob::PresenterScreenJob (const Reference<XComponentContext>& rxContext) 154cdf0e10cSrcweir : PresenterScreenJobInterfaceBase(m_aMutex), 155cdf0e10cSrcweir mxComponentContext(rxContext) 156cdf0e10cSrcweir { 157cdf0e10cSrcweir } 158cdf0e10cSrcweir 159cdf0e10cSrcweir 160cdf0e10cSrcweir 161cdf0e10cSrcweir 162cdf0e10cSrcweir PresenterScreenJob::~PresenterScreenJob (void) 163cdf0e10cSrcweir { 164cdf0e10cSrcweir } 165cdf0e10cSrcweir 166cdf0e10cSrcweir 167cdf0e10cSrcweir 168cdf0e10cSrcweir 169cdf0e10cSrcweir void SAL_CALL PresenterScreenJob::disposing (void) 170cdf0e10cSrcweir { 171cdf0e10cSrcweir mxComponentContext = NULL; 172cdf0e10cSrcweir } 173cdf0e10cSrcweir 174cdf0e10cSrcweir 175cdf0e10cSrcweir 176cdf0e10cSrcweir 177cdf0e10cSrcweir //----- XJob ----------------------------------------------------------- 178cdf0e10cSrcweir 179cdf0e10cSrcweir Any SAL_CALL PresenterScreenJob::execute( 180cdf0e10cSrcweir const Sequence< beans::NamedValue >& Arguments ) 181cdf0e10cSrcweir throw (lang::IllegalArgumentException, Exception, RuntimeException) 182cdf0e10cSrcweir { 183cdf0e10cSrcweir Sequence< beans::NamedValue > lEnv; 184cdf0e10cSrcweir 185cdf0e10cSrcweir sal_Int32 i = 0; 186cdf0e10cSrcweir sal_Int32 c = Arguments.getLength(); 187cdf0e10cSrcweir const beans::NamedValue* p = Arguments.getConstArray(); 188cdf0e10cSrcweir for (i=0; i<c; ++i) 189cdf0e10cSrcweir { 190*2da1a64cSAriel Constenla-Haile if (p[i].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Environment"))) 191cdf0e10cSrcweir { 192cdf0e10cSrcweir p[i].Value >>= lEnv; 193cdf0e10cSrcweir break; 194cdf0e10cSrcweir } 195cdf0e10cSrcweir } 196cdf0e10cSrcweir 197cdf0e10cSrcweir Reference<frame::XModel2> xModel; 198cdf0e10cSrcweir c = lEnv.getLength(); 199cdf0e10cSrcweir p = lEnv.getConstArray(); 200cdf0e10cSrcweir for (i=0; i<c; ++i) 201cdf0e10cSrcweir { 202*2da1a64cSAriel Constenla-Haile if (p[i].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Model"))) 203cdf0e10cSrcweir { 204cdf0e10cSrcweir p[i].Value >>= xModel; 205cdf0e10cSrcweir break; 206cdf0e10cSrcweir } 207cdf0e10cSrcweir } 208cdf0e10cSrcweir 209cdf0e10cSrcweir Reference< XServiceInfo > xInfo( xModel, UNO_QUERY ); 210*2da1a64cSAriel Constenla-Haile if( !xInfo.is() || !xInfo->supportsService( 211*2da1a64cSAriel Constenla-Haile A2S( "com.sun.star.presentation.PresentationDocument" ) ) ) 212*2da1a64cSAriel Constenla-Haile return Any(); 213*2da1a64cSAriel Constenla-Haile 214cdf0e10cSrcweir // Create a new listener that waits for the full screen presentation 215cdf0e10cSrcweir // to start and to end. It takes care of its own lifetime. 216cdf0e10cSrcweir ::rtl::Reference<PresenterScreenListener> pListener ( 217cdf0e10cSrcweir new PresenterScreenListener(mxComponentContext, xModel)); 218cdf0e10cSrcweir pListener->Initialize(); 219cdf0e10cSrcweir 220cdf0e10cSrcweir return Any(); 221cdf0e10cSrcweir } 222cdf0e10cSrcweir 223cdf0e10cSrcweir 224cdf0e10cSrcweir 225cdf0e10cSrcweir 226cdf0e10cSrcweir //===== PresenterScreenListener =============================================== 227cdf0e10cSrcweir 228cdf0e10cSrcweir namespace { 229cdf0e10cSrcweir 230cdf0e10cSrcweir PresenterScreenListener::PresenterScreenListener ( 231cdf0e10cSrcweir const css::uno::Reference<css::uno::XComponentContext>& rxContext, 232cdf0e10cSrcweir const css::uno::Reference<css::frame::XModel2>& rxModel) 233cdf0e10cSrcweir : PresenterScreenListenerInterfaceBase(m_aMutex), 234cdf0e10cSrcweir mxModel(rxModel), 235cdf0e10cSrcweir mxComponentContext(rxContext), 236cdf0e10cSrcweir mpPresenterScreen() 237cdf0e10cSrcweir { 238cdf0e10cSrcweir } 239cdf0e10cSrcweir 240cdf0e10cSrcweir 241cdf0e10cSrcweir 242cdf0e10cSrcweir 243cdf0e10cSrcweir void PresenterScreenListener::Initialize (void) 244cdf0e10cSrcweir { 245cdf0e10cSrcweir Reference< document::XEventListener > xDocListener( 246cdf0e10cSrcweir static_cast< document::XEventListener* >(this), UNO_QUERY); 247cdf0e10cSrcweir Reference< document::XEventBroadcaster > xDocBroadcaster( mxModel, UNO_QUERY ); 248cdf0e10cSrcweir if( xDocBroadcaster.is() ) 249cdf0e10cSrcweir xDocBroadcaster->addEventListener(xDocListener); 250cdf0e10cSrcweir } 251cdf0e10cSrcweir 252cdf0e10cSrcweir 253cdf0e10cSrcweir 254cdf0e10cSrcweir 255cdf0e10cSrcweir PresenterScreenListener::~PresenterScreenListener (void) 256cdf0e10cSrcweir { 257cdf0e10cSrcweir } 258cdf0e10cSrcweir 259cdf0e10cSrcweir 260cdf0e10cSrcweir 261cdf0e10cSrcweir 262cdf0e10cSrcweir void SAL_CALL PresenterScreenListener::disposing (void) 263cdf0e10cSrcweir { 264cdf0e10cSrcweir Reference< document::XEventBroadcaster > xDocBroadcaster( mxModel, UNO_QUERY ); 265cdf0e10cSrcweir if( xDocBroadcaster.is() ) 266cdf0e10cSrcweir xDocBroadcaster->removeEventListener( 267cdf0e10cSrcweir Reference<document::XEventListener>( 268cdf0e10cSrcweir static_cast<document::XEventListener*>(this), UNO_QUERY)); 269cdf0e10cSrcweir 270cdf0e10cSrcweir if (mpPresenterScreen.is()) 271cdf0e10cSrcweir { 272cdf0e10cSrcweir mpPresenterScreen->RequestShutdownPresenterScreen(); 273cdf0e10cSrcweir mpPresenterScreen = NULL; 274cdf0e10cSrcweir } 275cdf0e10cSrcweir } 276cdf0e10cSrcweir 277cdf0e10cSrcweir 278cdf0e10cSrcweir 279cdf0e10cSrcweir 280cdf0e10cSrcweir // document::XEventListener 281cdf0e10cSrcweir 282cdf0e10cSrcweir void SAL_CALL PresenterScreenListener::notifyEvent( const css::document::EventObject& Event ) throw (css::uno::RuntimeException) 283cdf0e10cSrcweir { 284cdf0e10cSrcweir ThrowIfDisposed(); 285cdf0e10cSrcweir 286cdf0e10cSrcweir if( Event.EventName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OnStartPresentation" ) ) ) 287cdf0e10cSrcweir { 288cdf0e10cSrcweir mpPresenterScreen = new PresenterScreen(mxComponentContext, mxModel); 289cdf0e10cSrcweir mpPresenterScreen->InitializePresenterScreen(); 290cdf0e10cSrcweir } 291cdf0e10cSrcweir else if( Event.EventName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OnEndPresentation" ) ) ) 292cdf0e10cSrcweir { 293cdf0e10cSrcweir if (mpPresenterScreen.is()) 294cdf0e10cSrcweir { 295cdf0e10cSrcweir mpPresenterScreen->RequestShutdownPresenterScreen(); 296cdf0e10cSrcweir mpPresenterScreen = NULL; 297cdf0e10cSrcweir } 298cdf0e10cSrcweir } 299cdf0e10cSrcweir } 300cdf0e10cSrcweir 301cdf0e10cSrcweir 302cdf0e10cSrcweir 303cdf0e10cSrcweir 304cdf0e10cSrcweir // XEventListener 305cdf0e10cSrcweir 306cdf0e10cSrcweir void SAL_CALL PresenterScreenListener::disposing (const css::lang::EventObject& rEvent) 307cdf0e10cSrcweir throw (css::uno::RuntimeException) 308cdf0e10cSrcweir { 309cdf0e10cSrcweir (void)rEvent; 310cdf0e10cSrcweir 311cdf0e10cSrcweir if (mpPresenterScreen.is()) 312cdf0e10cSrcweir { 313cdf0e10cSrcweir mpPresenterScreen->RequestShutdownPresenterScreen(); 314cdf0e10cSrcweir mpPresenterScreen = NULL; 315cdf0e10cSrcweir } 316cdf0e10cSrcweir } 317cdf0e10cSrcweir 318cdf0e10cSrcweir 319cdf0e10cSrcweir 320cdf0e10cSrcweir 321cdf0e10cSrcweir void PresenterScreenListener::ThrowIfDisposed (void) const throw ( 322cdf0e10cSrcweir ::com::sun::star::lang::DisposedException) 323cdf0e10cSrcweir { 324cdf0e10cSrcweir if (rBHelper.bDisposed || rBHelper.bInDispose) 325cdf0e10cSrcweir { 326cdf0e10cSrcweir throw lang::DisposedException ( 327*2da1a64cSAriel Constenla-Haile A2S("PresenterScreenListener object has already been disposed"), 328cdf0e10cSrcweir const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this))); 329cdf0e10cSrcweir } 330cdf0e10cSrcweir } 331cdf0e10cSrcweir 332cdf0e10cSrcweir } // end of anonymous namespace 333cdf0e10cSrcweir 334cdf0e10cSrcweir 335cdf0e10cSrcweir 336cdf0e10cSrcweir 337cdf0e10cSrcweir //===== PresenterScreen ======================================================= 338cdf0e10cSrcweir 339cdf0e10cSrcweir PresenterScreen::PresenterScreen ( 340cdf0e10cSrcweir const Reference<XComponentContext>& rxContext, 341cdf0e10cSrcweir const css::uno::Reference<css::frame::XModel2>& rxModel) 342cdf0e10cSrcweir : PresenterScreenInterfaceBase(m_aMutex), 343cdf0e10cSrcweir mxModel(rxModel), 344cdf0e10cSrcweir mxController(), 345cdf0e10cSrcweir mxConfigurationControllerWeak(), 346cdf0e10cSrcweir mxContextWeak(rxContext), 347cdf0e10cSrcweir mxSlideShowControllerWeak(), 348cdf0e10cSrcweir mpPresenterController(), 349cdf0e10cSrcweir mxSlideShowViewId(), 350cdf0e10cSrcweir mxSavedConfiguration(), 351cdf0e10cSrcweir mpPaneContainer(), 352cdf0e10cSrcweir mnComponentIndex(0), 353cdf0e10cSrcweir mxPaneFactory(), 354cdf0e10cSrcweir mxViewFactory(), 355cdf0e10cSrcweir maViewDescriptors() 356cdf0e10cSrcweir { 357cdf0e10cSrcweir } 358cdf0e10cSrcweir 359cdf0e10cSrcweir 360cdf0e10cSrcweir 361cdf0e10cSrcweir 362cdf0e10cSrcweir PresenterScreen::~PresenterScreen (void) 363cdf0e10cSrcweir { 364cdf0e10cSrcweir } 365cdf0e10cSrcweir 366cdf0e10cSrcweir 367cdf0e10cSrcweir 368cdf0e10cSrcweir 369cdf0e10cSrcweir void SAL_CALL PresenterScreen::disposing (void) 370cdf0e10cSrcweir { 371cdf0e10cSrcweir Reference<XConfigurationController> xCC (mxConfigurationControllerWeak); 372cdf0e10cSrcweir if (xCC.is() && mxSavedConfiguration.is()) 373cdf0e10cSrcweir { 374cdf0e10cSrcweir xCC->restoreConfiguration(mxSavedConfiguration); 375cdf0e10cSrcweir } 376cdf0e10cSrcweir mxConfigurationControllerWeak = Reference<XConfigurationController>(NULL); 377cdf0e10cSrcweir 378cdf0e10cSrcweir Reference<lang::XComponent> xViewFactoryComponent (mxViewFactory, UNO_QUERY); 379cdf0e10cSrcweir if (xViewFactoryComponent.is()) 380cdf0e10cSrcweir xViewFactoryComponent->dispose(); 381cdf0e10cSrcweir Reference<lang::XComponent> xPaneFactoryComponent (mxPaneFactory, UNO_QUERY); 382cdf0e10cSrcweir if (xPaneFactoryComponent.is()) 383cdf0e10cSrcweir xPaneFactoryComponent->dispose(); 384cdf0e10cSrcweir 385cdf0e10cSrcweir mxModel = NULL; 386cdf0e10cSrcweir } 387cdf0e10cSrcweir 388cdf0e10cSrcweir 389cdf0e10cSrcweir 390cdf0e10cSrcweir 391cdf0e10cSrcweir //----- XEventListener -------------------------------------------------------- 392cdf0e10cSrcweir 393cdf0e10cSrcweir void SAL_CALL PresenterScreen::disposing (const lang::EventObject& /*rEvent*/) 394cdf0e10cSrcweir throw (RuntimeException) 395cdf0e10cSrcweir { 396cdf0e10cSrcweir mxSlideShowControllerWeak = WeakReference<presentation::XSlideShowController>(); 397cdf0e10cSrcweir RequestShutdownPresenterScreen(); 398cdf0e10cSrcweir } 399cdf0e10cSrcweir 400cdf0e10cSrcweir 401cdf0e10cSrcweir 402cdf0e10cSrcweir 403cdf0e10cSrcweir //----------------------------------------------------------------------------- 404cdf0e10cSrcweir 405cdf0e10cSrcweir void PresenterScreen::InitializePresenterScreen (void) 406cdf0e10cSrcweir { 407cdf0e10cSrcweir try 408cdf0e10cSrcweir { 409cdf0e10cSrcweir Reference<XComponentContext> xContext (mxContextWeak); 410*2da1a64cSAriel Constenla-Haile 411*2da1a64cSAriel Constenla-Haile // Check if disabled by configuration 412*2da1a64cSAriel Constenla-Haile if (!lcl_IsPresenterEnabled(xContext) ) 413*2da1a64cSAriel Constenla-Haile return; 414*2da1a64cSAriel Constenla-Haile 415cdf0e10cSrcweir mpPaneContainer = 416cdf0e10cSrcweir new PresenterPaneContainer(Reference<XComponentContext>(xContext)); 417cdf0e10cSrcweir 418cdf0e10cSrcweir Reference<XPresentationSupplier> xPS ( mxModel, UNO_QUERY_THROW); 419cdf0e10cSrcweir Reference<XPresentation2> xPresentation(xPS->getPresentation(), UNO_QUERY_THROW); 420cdf0e10cSrcweir Reference<presentation::XSlideShowController> xSlideShowController( xPresentation->getController() ); 421cdf0e10cSrcweir mxSlideShowControllerWeak = xSlideShowController; 422cdf0e10cSrcweir 423cdf0e10cSrcweir if( !xSlideShowController.is() || !xSlideShowController->isFullScreen() ) 424cdf0e10cSrcweir return; 425cdf0e10cSrcweir 426cdf0e10cSrcweir // find first controller that is not the current controller (the one with the slideshow 427cdf0e10cSrcweir mxController = mxModel->getCurrentController(); 428cdf0e10cSrcweir Reference< container::XEnumeration > xEnum( mxModel->getControllers() ); 429cdf0e10cSrcweir if( xEnum.is() ) 430cdf0e10cSrcweir { 431cdf0e10cSrcweir while( xEnum->hasMoreElements() ) 432cdf0e10cSrcweir { 433cdf0e10cSrcweir Reference< frame::XController > xC( xEnum->nextElement(), UNO_QUERY ); 434cdf0e10cSrcweir if( xC.is() && (xC != mxController) ) 435cdf0e10cSrcweir { 436cdf0e10cSrcweir mxController = xC; 437cdf0e10cSrcweir break; 438cdf0e10cSrcweir } 439cdf0e10cSrcweir } 440cdf0e10cSrcweir } 441cdf0e10cSrcweir // Get the XController from the first argument. 442cdf0e10cSrcweir Reference<XControllerManager> xCM(mxController, UNO_QUERY_THROW); 443cdf0e10cSrcweir 444cdf0e10cSrcweir Reference<XConfigurationController> xCC( xCM->getConfigurationController()); 445cdf0e10cSrcweir mxConfigurationControllerWeak = xCC; 446cdf0e10cSrcweir 447cdf0e10cSrcweir Reference<drawing::framework::XResourceId> xMainPaneId( 448cdf0e10cSrcweir GetMainPaneId(xPresentation)); 449cdf0e10cSrcweir // An empty reference means that the presenter screen can 450cdf0e10cSrcweir // not or must not be displayed. 451cdf0e10cSrcweir if ( ! xMainPaneId.is()) 452cdf0e10cSrcweir return; 453cdf0e10cSrcweir 454cdf0e10cSrcweir if (xCC.is() && xContext.is()) 455cdf0e10cSrcweir { 456cdf0e10cSrcweir // Store the current configuration so that we can restore it when 457cdf0e10cSrcweir // the presenter view is deactivated. 458cdf0e10cSrcweir mxSavedConfiguration = xCC->getRequestedConfiguration(); 459cdf0e10cSrcweir xCC->lock(); 460cdf0e10cSrcweir 461cdf0e10cSrcweir try 462cdf0e10cSrcweir { 463cdf0e10cSrcweir // At the moment the presenter controller is displayed in its 464cdf0e10cSrcweir // own full screen window that is controlled by the same 465cdf0e10cSrcweir // configuration controller as the Impress document from 466cdf0e10cSrcweir // which the presentation was started. Therefore the main 467cdf0e10cSrcweir // pane is actived additionally to the already existing 468cdf0e10cSrcweir // panes and does not replace them. 469cdf0e10cSrcweir xCC->requestResourceActivation( 470cdf0e10cSrcweir xMainPaneId, 471cdf0e10cSrcweir ResourceActivationMode_ADD); 472cdf0e10cSrcweir SetupConfiguration(xContext, xMainPaneId); 473cdf0e10cSrcweir 474cdf0e10cSrcweir mpPresenterController = new PresenterController( 475cdf0e10cSrcweir xContext, 476cdf0e10cSrcweir mxController, 477cdf0e10cSrcweir xSlideShowController, 478cdf0e10cSrcweir mpPaneContainer, 479cdf0e10cSrcweir xMainPaneId); 480cdf0e10cSrcweir 481cdf0e10cSrcweir // Create pane and view factories and integrate them into the 482cdf0e10cSrcweir // drawing framework. 483cdf0e10cSrcweir SetupPaneFactory(xContext); 484cdf0e10cSrcweir SetupViewFactory(xContext); 485cdf0e10cSrcweir 486cdf0e10cSrcweir mpPresenterController->GetWindowManager()->RestoreViewMode(); 487cdf0e10cSrcweir } 488cdf0e10cSrcweir catch (RuntimeException&) 489cdf0e10cSrcweir { 490cdf0e10cSrcweir xCC->restoreConfiguration(mxSavedConfiguration); 491cdf0e10cSrcweir } 492cdf0e10cSrcweir xCC->unlock(); 493cdf0e10cSrcweir } 494cdf0e10cSrcweir } 495cdf0e10cSrcweir catch (Exception&) 496cdf0e10cSrcweir { 497cdf0e10cSrcweir } 498cdf0e10cSrcweir } 499cdf0e10cSrcweir 500cdf0e10cSrcweir 501cdf0e10cSrcweir 502cdf0e10cSrcweir 503cdf0e10cSrcweir sal_Int32 PresenterScreen::GetScreenNumber ( 504cdf0e10cSrcweir const Reference<presentation::XPresentation2>& rxPresentation) const 505cdf0e10cSrcweir { 506cdf0e10cSrcweir // Determine the screen on which the full screen presentation is being 507cdf0e10cSrcweir // displayed. 508cdf0e10cSrcweir sal_Int32 nScreenNumber (0); 509cdf0e10cSrcweir sal_Int32 nScreenCount (1); 510cdf0e10cSrcweir try 511cdf0e10cSrcweir { 512cdf0e10cSrcweir Reference<beans::XPropertySet> xProperties (rxPresentation, UNO_QUERY); 513cdf0e10cSrcweir if ( ! xProperties.is()) 514cdf0e10cSrcweir return -1; 515cdf0e10cSrcweir 516cdf0e10cSrcweir sal_Int32 nDisplayNumber (-1); 517cdf0e10cSrcweir if ( ! (xProperties->getPropertyValue(A2S("Display")) >>= nDisplayNumber)) 518cdf0e10cSrcweir return -1; 519cdf0e10cSrcweir if (nDisplayNumber == -1) 520cdf0e10cSrcweir { 521cdf0e10cSrcweir // The special value -1 indicates that the slide show 522cdf0e10cSrcweir // spans all available displays. That leaves no room for 523cdf0e10cSrcweir // the presenter screen. 524cdf0e10cSrcweir return -1; 525cdf0e10cSrcweir } 526cdf0e10cSrcweir 527cdf0e10cSrcweir Reference<XComponentContext> xContext (mxContextWeak); 528cdf0e10cSrcweir if ( ! xContext.is()) 529cdf0e10cSrcweir return -1; 530cdf0e10cSrcweir Reference<lang::XMultiComponentFactory> xFactory ( 531cdf0e10cSrcweir xContext->getServiceManager(), UNO_QUERY); 532cdf0e10cSrcweir if ( ! xFactory.is()) 533cdf0e10cSrcweir return -1; 534cdf0e10cSrcweir Reference<beans::XPropertySet> xDisplayProperties ( 535cdf0e10cSrcweir xFactory->createInstanceWithContext(A2S("com.sun.star.awt.DisplayAccess"),xContext), 536cdf0e10cSrcweir UNO_QUERY); 537cdf0e10cSrcweir if ( ! xDisplayProperties.is()) 538cdf0e10cSrcweir return -1; 539cdf0e10cSrcweir 540cdf0e10cSrcweir if (nDisplayNumber > 0) 541cdf0e10cSrcweir { 542cdf0e10cSrcweir nScreenNumber = nDisplayNumber - 1; 543cdf0e10cSrcweir } 544cdf0e10cSrcweir else if (nDisplayNumber == 0) 545cdf0e10cSrcweir { 546cdf0e10cSrcweir // A display number value of 0 indicates the primary screen. 547cdf0e10cSrcweir // Instantiate the DisplayAccess service to find out which 548cdf0e10cSrcweir // screen number that is. 549cdf0e10cSrcweir if (nDisplayNumber <= 0 && xDisplayProperties.is()) 550cdf0e10cSrcweir xDisplayProperties->getPropertyValue(A2S("DefaultDisplay")) >>= nScreenNumber; 551cdf0e10cSrcweir } 552cdf0e10cSrcweir 553cdf0e10cSrcweir // We still have to determine the number of screens to decide 554cdf0e10cSrcweir // whether the presenter screen may be shown at all. 555cdf0e10cSrcweir Reference<container::XIndexAccess> xIndexAccess (xDisplayProperties, UNO_QUERY); 556cdf0e10cSrcweir if ( ! xIndexAccess.is()) 557cdf0e10cSrcweir return -1; 558cdf0e10cSrcweir nScreenCount = xIndexAccess->getCount(); 559cdf0e10cSrcweir 560cdf0e10cSrcweir if (nScreenCount < 2 || nDisplayNumber > nScreenCount) 561cdf0e10cSrcweir { 562cdf0e10cSrcweir // There is either only one screen or the full screen 563cdf0e10cSrcweir // presentation spans all available screens. The presenter 564cdf0e10cSrcweir // screen is shown only when a special flag in the configuration 565cdf0e10cSrcweir // is set. 566cdf0e10cSrcweir PresenterConfigurationAccess aConfiguration ( 567cdf0e10cSrcweir xContext, 568*2da1a64cSAriel Constenla-Haile A2S("/org.openoffice.Office.PresenterScreen/"), 569cdf0e10cSrcweir PresenterConfigurationAccess::READ_ONLY); 570cdf0e10cSrcweir bool bStartAlways (false); 571cdf0e10cSrcweir if (aConfiguration.GetConfigurationNode( 572*2da1a64cSAriel Constenla-Haile A2S("Presenter/StartAlways")) >>= bStartAlways) 573cdf0e10cSrcweir { 574cdf0e10cSrcweir if (bStartAlways) 575cdf0e10cSrcweir return nScreenNumber; 576cdf0e10cSrcweir } 577cdf0e10cSrcweir return -1; 578cdf0e10cSrcweir } 579cdf0e10cSrcweir } 580cdf0e10cSrcweir catch (beans::UnknownPropertyException&) 581cdf0e10cSrcweir { 582cdf0e10cSrcweir OSL_ASSERT(false); 583cdf0e10cSrcweir // For some reason we can not access the screen number. Use 584cdf0e10cSrcweir // the default instead. 585cdf0e10cSrcweir } 586cdf0e10cSrcweir 587cdf0e10cSrcweir return nScreenNumber; 588cdf0e10cSrcweir } 589cdf0e10cSrcweir 590cdf0e10cSrcweir 591cdf0e10cSrcweir 592cdf0e10cSrcweir 593cdf0e10cSrcweir Reference<drawing::framework::XResourceId> PresenterScreen::GetMainPaneId ( 594cdf0e10cSrcweir const Reference<presentation::XPresentation2>& rxPresentation) const 595cdf0e10cSrcweir { 596cdf0e10cSrcweir // A negative value means that the presentation spans all available 597cdf0e10cSrcweir // displays. That leaves no room for the presenter. 598cdf0e10cSrcweir const sal_Int32 nScreenNumber(GetScreenNumber(rxPresentation)); 599cdf0e10cSrcweir if (nScreenNumber < 0) 600cdf0e10cSrcweir return NULL; 601cdf0e10cSrcweir 602cdf0e10cSrcweir // Setup the resource id of the full screen background pane so that 603cdf0e10cSrcweir // it is displayed on another screen than the presentation. 604cdf0e10cSrcweir sal_Int32 nPresenterScreenNumber (1); 605cdf0e10cSrcweir switch (nScreenNumber) 606cdf0e10cSrcweir { 607cdf0e10cSrcweir case 0: 608cdf0e10cSrcweir nPresenterScreenNumber = 1; 609cdf0e10cSrcweir break; 610cdf0e10cSrcweir 611cdf0e10cSrcweir case 1: 612cdf0e10cSrcweir nPresenterScreenNumber = 0; 613cdf0e10cSrcweir break; 614cdf0e10cSrcweir 615cdf0e10cSrcweir default: 616cdf0e10cSrcweir // When the full screen presentation is displayed on a screen 617cdf0e10cSrcweir // other than 0 or 1 then place the presenter on the first 618cdf0e10cSrcweir // available screen. 619cdf0e10cSrcweir nPresenterScreenNumber = 0; 620cdf0e10cSrcweir break; 621cdf0e10cSrcweir } 622cdf0e10cSrcweir 623cdf0e10cSrcweir return ResourceId::create( 624cdf0e10cSrcweir Reference<XComponentContext>(mxContextWeak), 625cdf0e10cSrcweir PresenterHelper::msFullScreenPaneURL 626cdf0e10cSrcweir +A2S("?FullScreen=true&ScreenNumber=") 627cdf0e10cSrcweir + OUString::valueOf(nPresenterScreenNumber)); 628cdf0e10cSrcweir } 629cdf0e10cSrcweir 630cdf0e10cSrcweir 631cdf0e10cSrcweir 632cdf0e10cSrcweir 633cdf0e10cSrcweir void PresenterScreen::RequestShutdownPresenterScreen (void) 634cdf0e10cSrcweir { 635cdf0e10cSrcweir // Restore the configuration that was active before the presenter screen 636cdf0e10cSrcweir // has been activated. Now, that the presenter screen is displayed in 637cdf0e10cSrcweir // its own top level window this probably not necessary, but one never knows. 638cdf0e10cSrcweir Reference<XConfigurationController> xCC (mxConfigurationControllerWeak); 639cdf0e10cSrcweir if (xCC.is() && mxSavedConfiguration.is()) 640cdf0e10cSrcweir { 641cdf0e10cSrcweir xCC->restoreConfiguration(mxSavedConfiguration); 642cdf0e10cSrcweir mxSavedConfiguration = NULL; 643cdf0e10cSrcweir } 644cdf0e10cSrcweir 645cdf0e10cSrcweir if (xCC.is()) 646cdf0e10cSrcweir { 647cdf0e10cSrcweir // The actual restoration of the configuration takes place 648cdf0e10cSrcweir // asynchronously. The view and pane factories can only by disposed 649cdf0e10cSrcweir // after that. Therefore, set up a listener and wait for the 650cdf0e10cSrcweir // restoration. 651cdf0e10cSrcweir rtl::Reference<PresenterScreen> pSelf (this); 652cdf0e10cSrcweir PresenterFrameworkObserver::RunOnUpdateEnd( 653cdf0e10cSrcweir xCC, 654cdf0e10cSrcweir ::boost::bind(&PresenterScreen::ShutdownPresenterScreen, pSelf)); 655cdf0e10cSrcweir xCC->update(); 656cdf0e10cSrcweir } 657cdf0e10cSrcweir } 658cdf0e10cSrcweir 659cdf0e10cSrcweir 660cdf0e10cSrcweir 661cdf0e10cSrcweir 662cdf0e10cSrcweir void PresenterScreen::ShutdownPresenterScreen (void) 663cdf0e10cSrcweir { 664cdf0e10cSrcweir Reference<lang::XComponent> xViewFactoryComponent (mxViewFactory, UNO_QUERY); 665cdf0e10cSrcweir if (xViewFactoryComponent.is()) 666cdf0e10cSrcweir xViewFactoryComponent->dispose(); 667cdf0e10cSrcweir mxViewFactory = NULL; 668cdf0e10cSrcweir 669cdf0e10cSrcweir Reference<lang::XComponent> xPaneFactoryComponent (mxPaneFactory, UNO_QUERY); 670cdf0e10cSrcweir if (xPaneFactoryComponent.is()) 671cdf0e10cSrcweir xPaneFactoryComponent->dispose(); 672cdf0e10cSrcweir mxPaneFactory = NULL; 673cdf0e10cSrcweir 674cdf0e10cSrcweir if (mpPresenterController.get() != NULL) 675cdf0e10cSrcweir { 676cdf0e10cSrcweir mpPresenterController->dispose(); 677cdf0e10cSrcweir mpPresenterController = rtl::Reference<PresenterController>(); 678cdf0e10cSrcweir } 679cdf0e10cSrcweir mpPaneContainer = new PresenterPaneContainer(Reference<XComponentContext>(mxContextWeak)); 680cdf0e10cSrcweir } 681cdf0e10cSrcweir 682cdf0e10cSrcweir 683cdf0e10cSrcweir 684cdf0e10cSrcweir 685cdf0e10cSrcweir void PresenterScreen::SetupPaneFactory (const Reference<XComponentContext>& rxContext) 686cdf0e10cSrcweir { 687cdf0e10cSrcweir try 688cdf0e10cSrcweir { 689cdf0e10cSrcweir if ( ! mxPaneFactory.is()) 690cdf0e10cSrcweir mxPaneFactory = PresenterPaneFactory::Create( 691cdf0e10cSrcweir rxContext, 692cdf0e10cSrcweir mxController, 693cdf0e10cSrcweir mpPresenterController); 694cdf0e10cSrcweir } 695cdf0e10cSrcweir catch (RuntimeException&) 696cdf0e10cSrcweir { 697cdf0e10cSrcweir OSL_ASSERT(false); 698cdf0e10cSrcweir } 699cdf0e10cSrcweir } 700cdf0e10cSrcweir 701cdf0e10cSrcweir 702cdf0e10cSrcweir 703cdf0e10cSrcweir 704cdf0e10cSrcweir void PresenterScreen::SetupViewFactory (const Reference<XComponentContext>& rxContext) 705cdf0e10cSrcweir { 706cdf0e10cSrcweir try 707cdf0e10cSrcweir { 708cdf0e10cSrcweir if ( ! mxViewFactory.is()) 709cdf0e10cSrcweir mxViewFactory = PresenterViewFactory::Create( 710cdf0e10cSrcweir rxContext, 711cdf0e10cSrcweir mxController, 712cdf0e10cSrcweir mpPresenterController); 713cdf0e10cSrcweir } 714cdf0e10cSrcweir catch (RuntimeException&) 715cdf0e10cSrcweir { 716cdf0e10cSrcweir OSL_ASSERT(false); 717cdf0e10cSrcweir } 718cdf0e10cSrcweir } 719cdf0e10cSrcweir 720cdf0e10cSrcweir 721cdf0e10cSrcweir 722cdf0e10cSrcweir 723cdf0e10cSrcweir void PresenterScreen::SetupConfiguration ( 724cdf0e10cSrcweir const Reference<XComponentContext>& rxContext, 725cdf0e10cSrcweir const Reference<XResourceId>& rxAnchorId) 726cdf0e10cSrcweir { 727cdf0e10cSrcweir try 728cdf0e10cSrcweir { 729cdf0e10cSrcweir PresenterConfigurationAccess aConfiguration ( 730cdf0e10cSrcweir rxContext, 731*2da1a64cSAriel Constenla-Haile A2S("org.openoffice.Office.PresenterScreen"), 732cdf0e10cSrcweir PresenterConfigurationAccess::READ_ONLY); 733cdf0e10cSrcweir maViewDescriptors.clear(); 734cdf0e10cSrcweir ProcessViewDescriptions(aConfiguration); 735*2da1a64cSAriel Constenla-Haile OUString sLayoutName (RTL_CONSTASCII_USTRINGPARAM("DefaultLayout")); 736cdf0e10cSrcweir aConfiguration.GetConfigurationNode( 737*2da1a64cSAriel Constenla-Haile A2S("Presenter/CurrentLayout")) >>= sLayoutName; 738cdf0e10cSrcweir ProcessLayout(aConfiguration, sLayoutName, rxContext, rxAnchorId); 739cdf0e10cSrcweir } 740cdf0e10cSrcweir catch (RuntimeException&) 741cdf0e10cSrcweir { 742cdf0e10cSrcweir } 743cdf0e10cSrcweir } 744cdf0e10cSrcweir 745cdf0e10cSrcweir 746cdf0e10cSrcweir 747cdf0e10cSrcweir 748cdf0e10cSrcweir void PresenterScreen::ProcessLayout ( 749cdf0e10cSrcweir PresenterConfigurationAccess& rConfiguration, 750cdf0e10cSrcweir const OUString& rsLayoutName, 751cdf0e10cSrcweir const Reference<XComponentContext>& rxContext, 752cdf0e10cSrcweir const Reference<XResourceId>& rxAnchorId) 753cdf0e10cSrcweir { 754cdf0e10cSrcweir try 755cdf0e10cSrcweir { 756cdf0e10cSrcweir Reference<container::XHierarchicalNameAccess> xLayoutNode ( 757cdf0e10cSrcweir rConfiguration.GetConfigurationNode( 758*2da1a64cSAriel Constenla-Haile A2S("Presenter/Layouts/") + rsLayoutName), 759cdf0e10cSrcweir UNO_QUERY_THROW); 760cdf0e10cSrcweir 761cdf0e10cSrcweir // Read the parent layout first, if one is referenced. 762cdf0e10cSrcweir OUString sParentLayout; 763cdf0e10cSrcweir rConfiguration.GetConfigurationNode( 764cdf0e10cSrcweir xLayoutNode, 765*2da1a64cSAriel Constenla-Haile A2S("ParentLayout")) >>= sParentLayout; 766cdf0e10cSrcweir if (sParentLayout.getLength() > 0) 767cdf0e10cSrcweir { 768cdf0e10cSrcweir // Prevent infinite recursion. 769cdf0e10cSrcweir if (rsLayoutName != sParentLayout) 770cdf0e10cSrcweir ProcessLayout(rConfiguration, sParentLayout, rxContext, rxAnchorId); 771cdf0e10cSrcweir } 772cdf0e10cSrcweir 773cdf0e10cSrcweir // Process the actual layout list. 774cdf0e10cSrcweir Reference<container::XNameAccess> xList ( 775cdf0e10cSrcweir rConfiguration.GetConfigurationNode( 776cdf0e10cSrcweir xLayoutNode, 777*2da1a64cSAriel Constenla-Haile A2S("Layout")), 778cdf0e10cSrcweir UNO_QUERY_THROW); 779cdf0e10cSrcweir 780cdf0e10cSrcweir ::std::vector<rtl::OUString> aProperties (6); 781*2da1a64cSAriel Constenla-Haile aProperties[0] = A2S("PaneURL"); 782*2da1a64cSAriel Constenla-Haile aProperties[1] = A2S("ViewURL"); 783*2da1a64cSAriel Constenla-Haile aProperties[2] = A2S("RelativeX"); 784*2da1a64cSAriel Constenla-Haile aProperties[3] = A2S("RelativeY"); 785*2da1a64cSAriel Constenla-Haile aProperties[4] = A2S("RelativeWidth"); 786*2da1a64cSAriel Constenla-Haile aProperties[5] = A2S("RelativeHeight"); 787cdf0e10cSrcweir mnComponentIndex = 1; 788cdf0e10cSrcweir PresenterConfigurationAccess::ForAll( 789cdf0e10cSrcweir xList, 790cdf0e10cSrcweir aProperties, 791cdf0e10cSrcweir ::boost::bind(&PresenterScreen::ProcessComponent, this, 792cdf0e10cSrcweir _1, 793cdf0e10cSrcweir _2, 794cdf0e10cSrcweir rxContext, 795cdf0e10cSrcweir rxAnchorId)); 796cdf0e10cSrcweir } 797cdf0e10cSrcweir catch (RuntimeException&) 798cdf0e10cSrcweir { 799cdf0e10cSrcweir } 800cdf0e10cSrcweir } 801cdf0e10cSrcweir 802cdf0e10cSrcweir 803cdf0e10cSrcweir 804cdf0e10cSrcweir 805cdf0e10cSrcweir void PresenterScreen::ProcessViewDescriptions ( 806cdf0e10cSrcweir PresenterConfigurationAccess& rConfiguration) 807cdf0e10cSrcweir { 808cdf0e10cSrcweir try 809cdf0e10cSrcweir { 810cdf0e10cSrcweir Reference<container::XNameAccess> xViewDescriptionsNode ( 811cdf0e10cSrcweir rConfiguration.GetConfigurationNode(A2S("Presenter/Views")), 812cdf0e10cSrcweir UNO_QUERY_THROW); 813cdf0e10cSrcweir 814cdf0e10cSrcweir ::std::vector<rtl::OUString> aProperties (4); 815*2da1a64cSAriel Constenla-Haile aProperties[0] = A2S("ViewURL"); 816*2da1a64cSAriel Constenla-Haile aProperties[1] = A2S("Title"); 817*2da1a64cSAriel Constenla-Haile aProperties[2] = A2S("AccessibleTitle"); 818*2da1a64cSAriel Constenla-Haile aProperties[3] = A2S("IsOpaque"); 819cdf0e10cSrcweir mnComponentIndex = 1; 820cdf0e10cSrcweir PresenterConfigurationAccess::ForAll( 821cdf0e10cSrcweir xViewDescriptionsNode, 822cdf0e10cSrcweir aProperties, 823cdf0e10cSrcweir ::boost::bind(&PresenterScreen::ProcessViewDescription, this, _1, _2)); 824cdf0e10cSrcweir } 825cdf0e10cSrcweir catch (RuntimeException&) 826cdf0e10cSrcweir { 827cdf0e10cSrcweir OSL_ASSERT(false); 828cdf0e10cSrcweir } 829cdf0e10cSrcweir } 830cdf0e10cSrcweir 831cdf0e10cSrcweir 832cdf0e10cSrcweir 833cdf0e10cSrcweir 834cdf0e10cSrcweir void PresenterScreen::ProcessComponent ( 835cdf0e10cSrcweir const OUString& rsKey, 836cdf0e10cSrcweir const ::std::vector<Any>& rValues, 837cdf0e10cSrcweir const Reference<XComponentContext>& rxContext, 838cdf0e10cSrcweir const Reference<XResourceId>& rxAnchorId) 839cdf0e10cSrcweir { 840cdf0e10cSrcweir (void)rsKey; 841cdf0e10cSrcweir 842cdf0e10cSrcweir if (rValues.size() != 6) 843cdf0e10cSrcweir return; 844cdf0e10cSrcweir 845cdf0e10cSrcweir try 846cdf0e10cSrcweir { 847cdf0e10cSrcweir OUString sPaneURL; 848cdf0e10cSrcweir OUString sViewURL; 849cdf0e10cSrcweir double nX = 0; 850cdf0e10cSrcweir double nY = 0; 851cdf0e10cSrcweir double nWidth = 0; 852cdf0e10cSrcweir double nHeight = 0; 853cdf0e10cSrcweir rValues[0] >>= sPaneURL; 854cdf0e10cSrcweir rValues[1] >>= sViewURL; 855cdf0e10cSrcweir rValues[2] >>= nX; 856cdf0e10cSrcweir rValues[3] >>= nY; 857cdf0e10cSrcweir rValues[4] >>= nWidth; 858cdf0e10cSrcweir rValues[5] >>= nHeight; 859cdf0e10cSrcweir 860cdf0e10cSrcweir if (nX>=0 && nY>=0 && nWidth>0 && nHeight>0) 861cdf0e10cSrcweir { 862cdf0e10cSrcweir SetupView( 863cdf0e10cSrcweir rxContext, 864cdf0e10cSrcweir rxAnchorId, 865cdf0e10cSrcweir sPaneURL, 866cdf0e10cSrcweir sViewURL, 867cdf0e10cSrcweir PresenterPaneContainer::ViewInitializationFunction(), 868cdf0e10cSrcweir nX, 869cdf0e10cSrcweir nY, 870cdf0e10cSrcweir nX+nWidth, 871cdf0e10cSrcweir nY+nHeight); 872cdf0e10cSrcweir } 873cdf0e10cSrcweir } 874cdf0e10cSrcweir catch (Exception& e) 875cdf0e10cSrcweir { 876cdf0e10cSrcweir (void)e; 877cdf0e10cSrcweir OSL_ASSERT(false); 878cdf0e10cSrcweir } 879cdf0e10cSrcweir } 880cdf0e10cSrcweir 881cdf0e10cSrcweir 882cdf0e10cSrcweir 883cdf0e10cSrcweir 884cdf0e10cSrcweir void PresenterScreen::ProcessViewDescription ( 885cdf0e10cSrcweir const OUString& rsKey, 886cdf0e10cSrcweir const ::std::vector<Any>& rValues) 887cdf0e10cSrcweir { 888cdf0e10cSrcweir (void)rsKey; 889cdf0e10cSrcweir 890cdf0e10cSrcweir if (rValues.size() != 4) 891cdf0e10cSrcweir return; 892cdf0e10cSrcweir 893cdf0e10cSrcweir try 894cdf0e10cSrcweir { 895cdf0e10cSrcweir ViewDescriptor aViewDescriptor; 896cdf0e10cSrcweir OUString sViewURL; 897cdf0e10cSrcweir rValues[0] >>= sViewURL; 898cdf0e10cSrcweir rValues[1] >>= aViewDescriptor.msTitle; 899cdf0e10cSrcweir rValues[2] >>= aViewDescriptor.msAccessibleTitle; 900cdf0e10cSrcweir rValues[3] >>= aViewDescriptor.mbIsOpaque; 901cdf0e10cSrcweir if (aViewDescriptor.msAccessibleTitle.getLength()==0) 902cdf0e10cSrcweir aViewDescriptor.msAccessibleTitle = aViewDescriptor.msTitle; 903cdf0e10cSrcweir maViewDescriptors[sViewURL] = aViewDescriptor; 904cdf0e10cSrcweir } 905cdf0e10cSrcweir catch (Exception&) 906cdf0e10cSrcweir { 907cdf0e10cSrcweir OSL_ASSERT(false); 908cdf0e10cSrcweir } 909cdf0e10cSrcweir } 910cdf0e10cSrcweir 911cdf0e10cSrcweir 912cdf0e10cSrcweir 913cdf0e10cSrcweir 914cdf0e10cSrcweir void PresenterScreen::SetupView( 915cdf0e10cSrcweir const Reference<XComponentContext>& rxContext, 916cdf0e10cSrcweir const Reference<XResourceId>& rxAnchorId, 917cdf0e10cSrcweir const OUString& rsPaneURL, 918cdf0e10cSrcweir const OUString& rsViewURL, 919cdf0e10cSrcweir const PresenterPaneContainer::ViewInitializationFunction& rViewInitialization, 920cdf0e10cSrcweir const double nLeft, 921cdf0e10cSrcweir const double nTop, 922cdf0e10cSrcweir const double nRight, 923cdf0e10cSrcweir const double nBottom) 924cdf0e10cSrcweir { 925cdf0e10cSrcweir Reference<XConfigurationController> xCC (mxConfigurationControllerWeak); 926cdf0e10cSrcweir if (xCC.is()) 927cdf0e10cSrcweir { 928cdf0e10cSrcweir Reference<XResourceId> xPaneId (ResourceId::createWithAnchor(rxContext,rsPaneURL,rxAnchorId)); 929cdf0e10cSrcweir // Look up the view descriptor. 930cdf0e10cSrcweir ViewDescriptor aViewDescriptor; 931cdf0e10cSrcweir ViewDescriptorContainer::const_iterator iDescriptor (maViewDescriptors.find(rsViewURL)); 932cdf0e10cSrcweir if (iDescriptor != maViewDescriptors.end()) 933cdf0e10cSrcweir aViewDescriptor = iDescriptor->second; 934cdf0e10cSrcweir 935cdf0e10cSrcweir // Prepare the pane. 936cdf0e10cSrcweir OSL_ASSERT(mpPaneContainer.get() != NULL); 937cdf0e10cSrcweir mpPaneContainer->PreparePane( 938cdf0e10cSrcweir xPaneId, 939cdf0e10cSrcweir rsViewURL, 940cdf0e10cSrcweir aViewDescriptor.msTitle, 941cdf0e10cSrcweir aViewDescriptor.msAccessibleTitle, 942cdf0e10cSrcweir aViewDescriptor.mbIsOpaque, 943cdf0e10cSrcweir rViewInitialization, 944cdf0e10cSrcweir nLeft, 945cdf0e10cSrcweir nTop, 946cdf0e10cSrcweir nRight, 947cdf0e10cSrcweir nBottom); 948cdf0e10cSrcweir } 949cdf0e10cSrcweir } 950cdf0e10cSrcweir 951cdf0e10cSrcweir 952cdf0e10cSrcweir 953cdf0e10cSrcweir 954cdf0e10cSrcweir } } // end of namespace ::sdext::presenter 955