diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2009-01-02 15:26:18 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2009-01-02 15:26:18 +0000 |
commit | fd7a3970bcb83087846232a3de4fa08b9b0dccfe (patch) | |
tree | c3707399e13348189abd8fa2724ed6a6ee4b9da9 /framework/source | |
parent | 2c579a73a7ca9891e044baca8e73608f19c2376d (diff) |
CWS-TOOLING: integrate CWS vcl97
2008-12-11 20:47:52 +0100 pl r265361 : #i93173# revert change, event listeners on the toolbar can lead to crashes
2008-12-11 17:55:54 +0100 pl r265344 : #i92715# fix some border cases
2008-12-11 16:36:01 +0100 pl r265334 : remove forgotten debug printf
2008-12-11 15:54:25 +0100 pl r265323 : add missing pointer initializer
2008-12-11 14:08:44 +0100 as r265297 : #i86520# dont show start module twice
2008-12-11 12:56:34 +0100 as r265289 : #i86520# dont show start module twice
2008-12-11 12:22:18 +0100 pl r265280 : fix a snafu
2008-12-11 12:15:27 +0100 hdu r265279 : #i96549# change some dbg_assert to dbg_warn
2008-12-11 11:57:22 +0100 pl r265276 : #i86520# startcenter on dock item click for mac
2008-12-11 11:31:47 +0100 pl r265271 : #i96964# fix a wrong condition
2008-12-11 11:21:49 +0100 as r265268 : #i86520# new framework slot for ShowStartModule
2008-12-11 10:17:32 +0100 hdu r265251 : #i97127# use fontconfig fallbacks for psprinting too (thanks CMC!)
2008-12-09 10:18:41 +0100 hdu r265060 : #i96549# workaround MAC_OS_X_VERSION_* macros not defined in older SDKs
2008-12-09 09:39:47 +0100 hdu r265057 : #i89650# workaround bogus device resolutions
2008-12-09 09:14:23 +0100 hdu r265054 : #i96549# set MAC_OS_X_VERSION_MIN_REQUIRED=1040
2008-12-08 19:17:42 +0100 pl r265016 : CWS-TOOLING: rebase CWS vcl97 to trunk@264807 (milestone: DEV300:m37)
2008-12-08 16:06:58 +0100 hdu r265004 : #i96549# set MAC_OS_X_VERSION_MIN_REQUIRED=1040 only for the Aqua port
2008-12-08 12:16:26 +0100 hdu r264988 : #i96549# prepare for MAC_OS_X_VERSION_MIN_REQUIRED>=1050
2008-12-08 11:59:25 +0100 hdu r264982 : #i96549# set MAC_OS_X_VERSION_MIN_REQUIRED=1040
2008-12-04 18:19:43 +0100 pl r264866 : #i86520# install a handler to be called on dock icon clicked
2008-12-03 13:04:32 +0100 pl r264769 : #i96551# on quartz build neither gtk nor cups in psprint is needed
2008-11-26 15:07:07 +0100 hdu r264400 : #i96317# adjust to extented SAL_DISABLE_FC_SUBST semantic
2008-11-21 16:15:31 +0100 pl r264147 : #i94443# generalize focus behavior when a child window becomes invisible
2008-11-21 15:45:03 +0100 pl r264144 : #i96433# improve torn off toolbar behavior
2008-11-21 11:50:01 +0100 pl r264119 : #i90083# improve key event dispatching
2008-11-20 17:28:03 +0100 pl r264076 : #i92715# do not execute app events during document recovery
2008-11-20 15:04:32 +0100 pl r264057 : #i92224# #i93249# more aqua key codes
2008-11-20 14:03:00 +0100 pl r264052 : #i92224# #i93249# remove debug printf
2008-11-20 14:00:29 +0100 pl r264049 : #i92224# #i93249# more aqua key codes
2008-11-20 13:59:34 +0100 pl r264048 : #i92224# #i93249# more aqua key codes
2008-11-20 13:52:38 +0100 pl r264047 : #i92224# #i93249# more aqua key codes
2008-11-19 18:42:17 +0100 pl r264017 : #i93249# support some mac specifc key codes: select to line end/begin
2008-11-19 18:40:26 +0100 pl r264016 : #i93249# support some mac specifc key codes: select to line end/begin
2008-11-19 18:32:31 +0100 pl r264014 : #i92224# support some mac specifc key codes: select to line end/begin
2008-11-19 17:34:50 +0100 pl r264009 : #i92224# some more needed keycodes
2008-11-19 16:11:33 +0100 pl r264003 : #i93249# support some mac specifc key codes
2008-11-19 16:10:31 +0100 pl r264002 : #i93249# support some mac specifc key codes
2008-11-19 15:50:03 +0100 pl r264000 : #i93249# support some mac specifc key codes
2008-11-19 14:17:41 +0100 pl r263993 : #i90015# strip appended parenthese entries from menubar
2008-11-17 18:30:37 +0100 pl r263737 : #i94601# emulate menu functionality for non vcl dialogs
2008-11-17 17:31:12 +0100 pl r263731 : #i95263# set inactive tab color on mac more distinct from the active tab color
2008-11-17 17:13:38 +0100 pl r263729 : #i93173# delete toolbar window in a more stack aware manner
Diffstat (limited to 'framework/source')
-rw-r--r-- | framework/source/dispatch/dispatchprovider.cxx | 42 | ||||
-rw-r--r-- | framework/source/dispatch/makefile.mk | 1 | ||||
-rw-r--r-- | framework/source/dispatch/startmoduledispatcher.cxx | 244 |
3 files changed, 278 insertions, 9 deletions
diff --git a/framework/source/dispatch/dispatchprovider.cxx b/framework/source/dispatch/dispatchprovider.cxx index 45a410f78d..3b3790d638 100644 --- a/framework/source/dispatch/dispatchprovider.cxx +++ b/framework/source/dispatch/dispatchprovider.cxx @@ -42,11 +42,13 @@ #include <dispatch/closedispatcher.hxx> #include <dispatch/menudispatcher.hxx> #include <dispatch/helpagentdispatcher.hxx> +#include <dispatch/startmoduledispatcher.hxx> #include <pattern/window.hxx> #include <threadhelp/transactionguard.hxx> #include <threadhelp/readguard.hxx> -#include <threadhelp/writeguard.hxx> +#include <threadhelp/writeguard.hxx>
+#include <dispatchcommands.h> #include <protocols.h> #include <services.h> #include <targets.h> @@ -222,6 +224,24 @@ css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL Disp return lDispatcher; } +//_________________________________________________________________________________________________________________
+
+::sal_Bool lcl_isCloseDispatch (const css::util::URL& aURL)
+{
+ return (
+ (aURL.Complete.equals(CMD_UNO_CLOSEDOC )) || + (aURL.Complete.equals(CMD_UNO_CLOSEWIN )) || + (aURL.Complete.equals(CMD_UNO_CLOSEFRAME))
+ ); +}
+ +//_________________________________________________________________________________________________________________
+
+::sal_Bool lcl_isStartModuleDispatch (const css::util::URL& aURL)
+{
+ return (aURL.Complete.equals(CMD_UNO_SHOWSTARTMODULE));
+}
+
//_________________________________________________________________________________________________________________ /** @@ -276,7 +296,10 @@ css::uno::Reference< css::frame::XDispatch > DispatchProvider::implts_queryDeskt if (sTargetFrameName==SPECIALTARGET_DEFAULT) { if (implts_isLoadableContent(aURL)) - xDispatcher = implts_getOrCreateDispatchHelper( E_DEFAULTDISPATCHER, xDesktop ); + xDispatcher = implts_getOrCreateDispatchHelper( E_DEFAULTDISPATCHER, xDesktop );
+
+ if (lcl_isStartModuleDispatch(aURL))
+ xDispatcher = implts_getOrCreateDispatchHelper( E_STARTMODULEDISPATCHER, xDesktop );
} //----------------------------------------------------------------------------------------------------- @@ -466,14 +489,8 @@ css::uno::Reference< css::frame::XDispatch > DispatchProvider::implts_queryFrame ) { // There exist a hard coded interception for special URLs. - if ( - (aURL.Complete.equalsAscii(".uno:CloseDoc" )) || - (aURL.Complete.equalsAscii(".uno:CloseWin" )) || - (aURL.Complete.equalsAscii(".uno:CloseFrame")) - ) - { + if (lcl_isCloseDispatch (aURL)) xDispatcher = implts_getOrCreateDispatchHelper( E_CLOSEDISPATCHER, xFrame ); - } if ( ! xDispatcher.is()) { @@ -737,6 +754,13 @@ css::uno::Reference< css::frame::XDispatch > DispatchProvider::implts_getOrCreat CloseDispatcher* pDispatcher = new CloseDispatcher( xFactory, xOwner, sTarget ); xDispatchHelper = css::uno::Reference< css::frame::XDispatch >( static_cast< ::cppu::OWeakObject* >(pDispatcher), css::uno::UNO_QUERY ); } + break;
+ + case E_STARTMODULEDISPATCHER : + { + StartModuleDispatcher* pDispatcher = new StartModuleDispatcher( xFactory, xOwner, sTarget ); + xDispatchHelper = css::uno::Reference< css::frame::XDispatch >( static_cast< ::cppu::OWeakObject* >(pDispatcher), css::uno::UNO_QUERY ); + } break; } diff --git a/framework/source/dispatch/makefile.mk b/framework/source/dispatch/makefile.mk index 6f551252cd..352aa66bfd 100644 --- a/framework/source/dispatch/makefile.mk +++ b/framework/source/dispatch/makefile.mk @@ -60,6 +60,7 @@ SLOFILES=\ $(SLO)$/servicehandler.obj \ $(SLO)$/systemexec.obj \ $(SLO)$/windowcommanddispatch.obj \ + $(SLO)$/startmoduledispatcher.obj # --- Targets ------------------------------------------------------ diff --git a/framework/source/dispatch/startmoduledispatcher.cxx b/framework/source/dispatch/startmoduledispatcher.cxx new file mode 100644 index 0000000000..def4f785be --- /dev/null +++ b/framework/source/dispatch/startmoduledispatcher.cxx @@ -0,0 +1,244 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: closedispatcher.cxx,v $ + * $Revision: 1.22 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_framework.hxx" + +#include <dispatch/startmoduledispatcher.hxx>
+
+//_______________________________________________ +// my own includes + +#include <pattern/frame.hxx> +#include <threadhelp/readguard.hxx> +#include <threadhelp/writeguard.hxx> +#include <classes/framelistanalyzer.hxx>
+#include <dispatchcommands.h> +#include <targets.h> +#include <services.h> +#include <general.h> + +//_______________________________________________ +// interface includes +#include <com/sun/star/frame/XDesktop.hpp> +#include <com/sun/star/frame/XController.hpp> +#include <com/sun/star/frame/CommandGroup.hpp> +#include <com/sun/star/awt/XTopWindow.hpp> +#include "com/sun/star/beans/XFastPropertySet.hpp" +#include <com/sun/star/frame/XModuleManager.hpp> + +//_______________________________________________ +// includes of other projects +#include <toolkit/helper/vclunohelper.hxx> +#include <vcl/window.hxx> +#include <vcl/svapp.hxx> +#include <vos/mutex.hxx> +#include <svtools/moduleoptions.hxx> + +//_______________________________________________ +// 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 |