/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_framework.hxx" #include //_______________________________________________ // my own includes #include #include #include #include #include #include #include #include //_______________________________________________ // interface includes #include #include #include #include #include "com/sun/star/beans/XFastPropertySet.hpp" #include //_______________________________________________ // includes of other projects #include #include #include #include #include //_______________________________________________ // namespace namespace framework{ #ifdef fpf #error "Who uses \"fpf\" as define. It will overwrite my namespace alias ..." #endif namespace fpf = ::framework::pattern::frame; //_______________________________________________ // declarations DEFINE_XINTERFACE_4(StartModuleDispatcher , OWeakObject , DIRECT_INTERFACE(css::lang::XTypeProvider ), DIRECT_INTERFACE(css::frame::XNotifyingDispatch ), DIRECT_INTERFACE(css::frame::XDispatch ), DIRECT_INTERFACE(css::frame::XDispatchInformationProvider)) // Note: XStatusListener is an implementation detail. Hide it for scripting! DEFINE_XTYPEPROVIDER_4(StartModuleDispatcher , css::lang::XTypeProvider , css::frame::XDispatchInformationProvider, css::frame::XNotifyingDispatch , css::frame::XDispatch ) //----------------------------------------------- StartModuleDispatcher::StartModuleDispatcher(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR , const css::uno::Reference< css::frame::XFrame >& xFrame , const ::rtl::OUString& sTarget) : ThreadHelpBase (&Application::GetSolarMutex() ) , ::cppu::OWeakObject( ) , m_xSMGR (xSMGR ) , m_xOwner (xFrame ) , m_sDispatchTarget (sTarget ) , m_lStatusListener (m_aLock.getShareableOslMutex()) { } //----------------------------------------------- StartModuleDispatcher::~StartModuleDispatcher() { } //----------------------------------------------- void SAL_CALL StartModuleDispatcher::dispatch(const css::util::URL& aURL , const css::uno::Sequence< css::beans::PropertyValue >& lArguments) throw(css::uno::RuntimeException) { dispatchWithNotification(aURL, lArguments, css::uno::Reference< css::frame::XDispatchResultListener >()); } //----------------------------------------------- void SAL_CALL StartModuleDispatcher::dispatchWithNotification(const css::util::URL& aURL , const css::uno::Sequence< css::beans::PropertyValue >& /*lArguments*/, const css::uno::Reference< css::frame::XDispatchResultListener >& xListener ) throw(css::uno::RuntimeException) { ::sal_Int16 nResult = css::frame::DispatchResultState::DONTKNOW; if (aURL.Complete.equals (CMD_UNO_SHOWSTARTMODULE)) { nResult = css::frame::DispatchResultState::FAILURE; if (implts_isBackingModePossible ()) { if (implts_establishBackingMode ()) nResult = css::frame::DispatchResultState::SUCCESS; } } implts_notifyResultListener(xListener, nResult, css::uno::Any()); } //----------------------------------------------- css::uno::Sequence< ::sal_Int16 > SAL_CALL StartModuleDispatcher::getSupportedCommandGroups() throw(css::uno::RuntimeException) { return css::uno::Sequence< ::sal_Int16 >(); } //----------------------------------------------- css::uno::Sequence< css::frame::DispatchInformation > SAL_CALL StartModuleDispatcher::getConfigurableDispatchInformation(::sal_Int16 /*nCommandGroup*/) throw(css::uno::RuntimeException) { return css::uno::Sequence< css::frame::DispatchInformation >(); } //----------------------------------------------- void SAL_CALL StartModuleDispatcher::addStatusListener(const css::uno::Reference< css::frame::XStatusListener >& /*xListener*/, const css::util::URL& /*aURL*/ ) throw(css::uno::RuntimeException) { } //----------------------------------------------- void SAL_CALL StartModuleDispatcher::removeStatusListener(const css::uno::Reference< css::frame::XStatusListener >& /*xListener*/, const css::util::URL& /*aURL*/ ) throw(css::uno::RuntimeException) { } //----------------------------------------------- ::sal_Bool StartModuleDispatcher::implts_isBackingModePossible () { if ( ! SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SSTARTMODULE)) return sal_False; // SAFE -> ---------------------------------- ReadGuard aReadLock(m_aLock); css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR; aReadLock.unlock(); // <- SAFE ---------------------------------- css::uno::Reference< css::frame::XFramesSupplier > xDesktop( xSMGR->createInstance(SERVICENAME_DESKTOP), css::uno::UNO_QUERY); FrameListAnalyzer aCheck( xDesktop, css::uno::Reference< css::frame::XFrame >(), FrameListAnalyzer::E_HELP | FrameListAnalyzer::E_BACKINGCOMPONENT); ::sal_Bool bIsPossible = sal_False; ::sal_Int32 nVisibleFrames = aCheck.m_lOtherVisibleFrames.getLength (); if ( ( ! aCheck.m_xBackingComponent.is ()) && ( nVisibleFrames < 1 ) ) { bIsPossible = sal_True; } return bIsPossible; } //----------------------------------------------- ::sal_Bool StartModuleDispatcher::implts_establishBackingMode() { // SAFE -> ---------------------------------- ReadGuard aReadLock(m_aLock); css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR; aReadLock.unlock(); // <- SAFE ---------------------------------- css::uno::Reference< css::frame::XFrame > xDesktop (xSMGR->createInstance(SERVICENAME_DESKTOP), css::uno::UNO_QUERY); css::uno::Reference< css::frame::XFrame > xFrame = xDesktop->findFrame (SPECIALTARGET_BLANK, 0); css::uno::Reference< css::awt::XWindow > xContainerWindow = xFrame->getContainerWindow (); css::uno::Sequence< css::uno::Any > lArgs(1); lArgs[0] <<= xContainerWindow; css::uno::Reference< css::frame::XController > xStartModule( xSMGR->createInstanceWithArguments(SERVICENAME_STARTMODULE, lArgs), css::uno::UNO_QUERY_THROW); css::uno::Reference< css::awt::XWindow > xComponentWindow(xStartModule, css::uno::UNO_QUERY); xFrame->setComponent(xComponentWindow, xStartModule); xStartModule->attachFrame(xFrame); xContainerWindow->setVisible(sal_True); return sal_True; } //----------------------------------------------- void StartModuleDispatcher::implts_notifyResultListener(const css::uno::Reference< css::frame::XDispatchResultListener >& xListener, ::sal_Int16 nState , const css::uno::Any& aResult ) { if ( ! xListener.is()) return; css::frame::DispatchResultEvent aEvent( css::uno::Reference< css::uno::XInterface >(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY), nState, aResult); xListener->dispatchFinished(aEvent); } } // namespace framework