summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2009-01-02 15:26:18 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2009-01-02 15:26:18 +0000
commit35e8d6de60cf91e97fe722834c294a0a9223922f (patch)
tree92c59ec6f18a49adf74678259cf5a9aef446a539
parent0416c98d433be40fe2e2d0199ebaa8d029e8e338 (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
-rw-r--r--desktop/source/app/app.cxx6
-rw-r--r--desktop/source/app/dispatchwatcher.cxx4
-rw-r--r--desktop/source/app/dispatchwatcher.hxx2
-rw-r--r--desktop/source/app/officeipcthread.cxx50
-rw-r--r--desktop/source/app/officeipcthread.hxx10
-rw-r--r--framework/inc/dispatch/dispatchprovider.hxx5
-rw-r--r--framework/inc/dispatch/startmoduledispatcher.hxx200
-rw-r--r--framework/inc/dispatchcommands.h55
-rw-r--r--framework/source/dispatch/dispatchprovider.cxx42
-rw-r--r--framework/source/dispatch/makefile.mk1
-rw-r--r--framework/source/dispatch/startmoduledispatcher.cxx244
-rw-r--r--framework/util/makefile.mk1
-rw-r--r--sfx2/source/appl/app.hrc1
-rw-r--r--sfx2/source/appl/app.src5
-rw-r--r--sfx2/source/appl/shutdownicon.cxx13
-rw-r--r--sfx2/source/appl/shutdownicon.hxx1
-rw-r--r--sfx2/source/appl/shutdowniconaqua.mm86
-rw-r--r--svx/source/editeng/editeng.cxx20
-rw-r--r--svx/source/editeng/impedit2.cxx52
19 files changed, 725 insertions, 73 deletions
diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index 66be5ffb69cd..6f9b9d423c37 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -1604,12 +1604,12 @@ void Desktop::Main()
}
catch(const com::sun::star::document::CorruptedFilterConfigurationException& exFilterCfg)
{
- OfficeIPCThread::BlockAllRequests();
+ OfficeIPCThread::SetDowning();
FatalError( MakeStartupErrorMessage(exFilterCfg.Message) );
}
catch(const com::sun::star::configuration::CorruptedConfigurationException& exAnyCfg)
{
- OfficeIPCThread::BlockAllRequests();
+ OfficeIPCThread::SetDowning();
FatalError( MakeStartupErrorMessage(exAnyCfg.Message) );
}
@@ -2439,6 +2439,8 @@ void Desktop::OpenClients()
}
}
+ OfficeIPCThread::EnableRequests();
+
sal_Bool bShutdown( sal_False );
if ( !pArgs->IsServer() )
{
diff --git a/desktop/source/app/dispatchwatcher.cxx b/desktop/source/app/dispatchwatcher.cxx
index ab134f400d25..0c6de1db2225 100644
--- a/desktop/source/app/dispatchwatcher.cxx
+++ b/desktop/source/app/dispatchwatcher.cxx
@@ -132,7 +132,7 @@ DispatchWatcher::~DispatchWatcher()
}
-sal_Bool DispatchWatcher::executeDispatchRequests( const DispatchList& aDispatchRequestsList )
+sal_Bool DispatchWatcher::executeDispatchRequests( const DispatchList& aDispatchRequestsList, bool bNoTerminate )
{
Reference< XComponentLoader > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance(
OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop")) ),
@@ -442,7 +442,7 @@ sal_Bool DispatchWatcher::executeDispatchRequests( const DispatchList& aDispatch
// No more asynchronous requests?
// The requests are removed from the request container after they called back to this
// implementation via statusChanged!!
- if ( !m_nRequestCount /*m_aRequestContainer.empty()*/ )
+ if ( !m_nRequestCount && ! bNoTerminate /*m_aRequestContainer.empty()*/ )
{
// We have to check if we have an open task otherwise we have to shutdown the office.
Reference< XFramesSupplier > xTasksSupplier( xDesktop, UNO_QUERY );
diff --git a/desktop/source/app/dispatchwatcher.hxx b/desktop/source/app/dispatchwatcher.hxx
index d4eb51800715..364933ffe962 100644
--- a/desktop/source/app/dispatchwatcher.hxx
+++ b/desktop/source/app/dispatchwatcher.hxx
@@ -108,7 +108,7 @@ class DispatchWatcher : public ::cppu::WeakImplHelper1< ::com::sun::star::frame:
static DispatchWatcher* GetDispatchWatcher();
// execute new dispatch request
- sal_Bool executeDispatchRequests( const DispatchList& aDispatches );
+ sal_Bool executeDispatchRequests( const DispatchList& aDispatches, bool bNoTerminate = false );
private:
DispatchWatcher();
diff --git a/desktop/source/app/officeipcthread.cxx b/desktop/source/app/officeipcthread.cxx
index 8798710f9abd..cb2856fb897d 100644
--- a/desktop/source/app/officeipcthread.cxx
+++ b/desktop/source/app/officeipcthread.cxx
@@ -349,7 +349,7 @@ throw( TerminationVetoException, RuntimeException )
if ( OfficeIPCThread::AreRequestsPending() )
throw TerminationVetoException();
else
- OfficeIPCThread::BlockAllRequests();
+ OfficeIPCThread::SetDowning();
}
void SAL_CALL OfficeIPCThreadController::notifyTermination( const EventObject& )
@@ -372,7 +372,7 @@ throw( RuntimeException )
return *pOfficeIPCThreadMutex;
}
-void OfficeIPCThread::BlockAllRequests()
+void OfficeIPCThread::SetDowning()
{
// We have the order to block all incoming requests. Framework
// wants to shutdown and we have to make sure that no loading/printing
@@ -380,7 +380,29 @@ void OfficeIPCThread::BlockAllRequests()
::osl::MutexGuard aGuard( GetMutex() );
if ( pGlobalOfficeIPCThread )
- pGlobalOfficeIPCThread->mbBlockRequests = sal_True;
+ pGlobalOfficeIPCThread->mbDowning = true;
+}
+
+static bool s_bInEnableRequests = false;
+
+void OfficeIPCThread::EnableRequests( bool i_bEnable )
+{
+ // switch between just queueing the requests and executing them
+ ::osl::MutexGuard aGuard( GetMutex() );
+
+ if ( pGlobalOfficeIPCThread )
+ {
+ s_bInEnableRequests = true;
+ pGlobalOfficeIPCThread->mbRequestsEnabled = i_bEnable;
+ if( i_bEnable )
+ {
+ // hit the compiler over the head
+ ProcessDocumentsRequest aEmptyReq = ProcessDocumentsRequest( boost::optional< rtl::OUString >() );
+ // trigger already queued requests
+ OfficeIPCThread::ExecuteCmdLineRequests( aEmptyReq );
+ }
+ s_bInEnableRequests = false;
+ }
}
sal_Bool OfficeIPCThread::AreRequestsPending()
@@ -599,7 +621,8 @@ void OfficeIPCThread::DisableOfficeIPCThread()
}
OfficeIPCThread::OfficeIPCThread() :
- mbBlockRequests( sal_False ),
+ mbDowning( false ),
+ mbRequestsEnabled( false ),
mnPendingRequests( 0 ),
mpDispatchWatcher( 0 )
{
@@ -679,7 +702,7 @@ void SAL_CALL OfficeIPCThread::run()
// is this a termination message ? if so, terminate
if(( aArguments.CompareTo( sc_aTerminationSequence, sc_nTSeqLength ) == COMPARE_EQUAL ) ||
- mbBlockRequests ) return;
+ mbDowning ) return;
String aEmpty;
std::auto_ptr< CommandLineArgs > aCmdLineArgs;
try
@@ -927,9 +950,12 @@ static void AddToDispatchList(
sal_Bool OfficeIPCThread::ExecuteCmdLineRequests( ProcessDocumentsRequest& aRequest )
{
- ::rtl::OUString aEmpty;
- DispatchWatcher::DispatchList aDispatchList;
+ // protect the dispatch list
+ osl::ClearableMutexGuard aGuard( GetMutex() );
+ static DispatchWatcher::DispatchList aDispatchList;
+
+ rtl::OUString aEmpty;
// Create dispatch list for dispatch watcher
AddToDispatchList( aDispatchList, aRequest.aCwdUrl, aRequest.aOpenList, DispatchWatcher::REQUEST_OPEN, aEmpty, aRequest.aModule );
AddToDispatchList( aDispatchList, aRequest.aCwdUrl, aRequest.aViewList, DispatchWatcher::REQUEST_VIEW, aEmpty, aRequest.aModule );
@@ -939,11 +965,13 @@ sal_Bool OfficeIPCThread::ExecuteCmdLineRequests( ProcessDocumentsRequest& aRequ
AddToDispatchList( aDispatchList, aRequest.aCwdUrl, aRequest.aForceOpenList, DispatchWatcher::REQUEST_FORCEOPEN, aEmpty, aRequest.aModule );
AddToDispatchList( aDispatchList, aRequest.aCwdUrl, aRequest.aForceNewList, DispatchWatcher::REQUEST_FORCENEW, aEmpty, aRequest.aModule );
- osl::ClearableMutexGuard aGuard( GetMutex() );
sal_Bool bShutdown( sal_False );
if ( pGlobalOfficeIPCThread )
{
+ if( ! pGlobalOfficeIPCThread->AreRequestsEnabled() )
+ return bShutdown;
+
pGlobalOfficeIPCThread->mnPendingRequests += aDispatchList.size();
if ( !pGlobalOfficeIPCThread->mpDispatchWatcher )
{
@@ -951,10 +979,14 @@ sal_Bool OfficeIPCThread::ExecuteCmdLineRequests( ProcessDocumentsRequest& aRequ
pGlobalOfficeIPCThread->mpDispatchWatcher->acquire();
}
+ // copy for execute
+ DispatchWatcher::DispatchList aTempList( aDispatchList );
+ aDispatchList.clear();
+
aGuard.clear();
// Execute dispatch requests
- bShutdown = pGlobalOfficeIPCThread->mpDispatchWatcher->executeDispatchRequests( aDispatchList );
+ bShutdown = pGlobalOfficeIPCThread->mpDispatchWatcher->executeDispatchRequests( aTempList, s_bInEnableRequests );
// set processed flag
if (aRequest.pcProcessed != NULL)
diff --git a/desktop/source/app/officeipcthread.hxx b/desktop/source/app/officeipcthread.hxx
index 90e8f7062c6e..0b78eb5ff5a0 100644
--- a/desktop/source/app/officeipcthread.hxx
+++ b/desktop/source/app/officeipcthread.hxx
@@ -57,7 +57,7 @@ class SalMainPipeExchangeSignalHandler : public vos::OSignalHandler
struct ProcessDocumentsRequest
{
ProcessDocumentsRequest(boost::optional< rtl::OUString > const & cwdUrl):
- aCwdUrl(cwdUrl) {}
+ aCwdUrl(cwdUrl), pcProcessed( NULL ) {}
boost::optional< ::rtl::OUString > aCwdUrl;
::rtl::OUString aModule;
@@ -82,7 +82,8 @@ class OfficeIPCThread : public vos::OThread
vos::OPipe maPipe;
vos::OStreamPipe maStreamPipe;
rtl::OUString maPipeIdent;
- sal_Bool mbBlockRequests;
+ bool mbDowning;
+ bool mbRequestsEnabled;
int mnPendingRequests;
DispatchWatcher* mpDispatchWatcher;
@@ -119,7 +120,8 @@ class OfficeIPCThread : public vos::OThread
virtual ~OfficeIPCThread();
// controlling pipe communication during shutdown
- static void BlockAllRequests();
+ static void SetDowning();
+ static void EnableRequests( bool i_bEnable = true );
static sal_Bool AreRequestsPending();
static void RequestsCompleted( int n = 1 );
static sal_Bool ExecuteCmdLineRequests( ProcessDocumentsRequest& );
@@ -129,6 +131,8 @@ class OfficeIPCThread : public vos::OThread
static void DisableOfficeIPCThread();
// start dispatching events...
static void SetReady(OfficeIPCThread* pThread = NULL);
+
+ bool AreRequestsEnabled() const { return mbRequestsEnabled && ! mbDowning; }
};
diff --git a/framework/inc/dispatch/dispatchprovider.hxx b/framework/inc/dispatch/dispatchprovider.hxx
index 633e4b64aca7..16a94fa2acd4 100644
--- a/framework/inc/dispatch/dispatchprovider.hxx
+++ b/framework/inc/dispatch/dispatchprovider.hxx
@@ -76,8 +76,6 @@ namespace framework{
@descr We know some special dispatch objects with diffrent functionality.
The can be created internaly by the following DispatchProvider.
Here we define some identifier to force creation of the right one.
-
- @modified 20.08.2003 08:34, as96863
*/
enum EDispatchHelper
{
@@ -87,7 +85,8 @@ enum EDispatchHelper
E_CREATEDISPATCHER ,
E_BLANKDISPATCHER ,
E_SELFDISPATCHER ,
- E_CLOSEDISPATCHER
+ E_CLOSEDISPATCHER ,
+ E_STARTMODULEDISPATCHER
};
//_________________________________________________________________________________________________________________
diff --git a/framework/inc/dispatch/startmoduledispatcher.hxx b/framework/inc/dispatch/startmoduledispatcher.hxx
new file mode 100644
index 000000000000..99c5e5bfa81e
--- /dev/null
+++ b/framework/inc/dispatch/startmoduledispatcher.hxx
@@ -0,0 +1,200 @@
+/*************************************************************************
+ *
+ * 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.hxx,v $
+ * $Revision: 1.14 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#ifndef __FRAMEWORK_DISPATCH_STARTMODULEDISPATCHER_HXX_
+#define __FRAMEWORK_DISPATCH_STARTMODULEDISPATCHER_HXX_
+
+//_______________________________________________
+// my own includes
+
+#include <threadhelp/threadhelpbase.hxx>
+#include <macros/xinterface.hxx>
+#include <macros/xtypeprovider.hxx>
+#include <macros/debug.hxx>
+#include <macros/generic.hxx>
+#include <stdtypes.h>
+#include <general.h>
+
+//_______________________________________________
+// interface includes
+#include <com/sun/star/lang/XTypeProvider.hpp>
+#include <com/sun/star/frame/XFrame.hpp>
+#include <com/sun/star/frame/XStatusListener.hpp>
+#include <com/sun/star/frame/XNotifyingDispatch.hpp>
+#include <com/sun/star/frame/XDispatchInformationProvider.hpp>
+#include <com/sun/star/util/URL.hpp>
+#include <com/sun/star/frame/XDispatchResultListener.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/frame/DispatchResultState.hpp>
+
+//_______________________________________________
+// other includes
+#include <cppuhelper/weak.hxx>
+#include <vcl/evntpost.hxx>
+
+//_______________________________________________
+// namespace
+
+namespace framework{
+
+//-----------------------------------------------
+/**
+ @short helper to handle all URLs related to the StartModule
+ */
+class StartModuleDispatcher : public css::lang::XTypeProvider
+ , public css::frame::XNotifyingDispatch // => XDispatch
+ , public css::frame::XDispatchInformationProvider
+ // baseclasses ... order is neccessary for right initialization!
+ , private ThreadHelpBase
+ , public ::cppu::OWeakObject
+{
+ //-------------------------------------------
+ // member
+
+ private:
+
+ //---------------------------------------
+ /** @short reference to an uno service manager,
+ which can be used to create own needed
+ uno resources. */
+ css::uno::Reference< css::lang::XMultiServiceFactory > m_xSMGR;
+
+ //---------------------------------------
+ /** @short our "context" frame. */
+ css::uno::WeakReference< css::frame::XFrame > m_xOwner;
+
+ //---------------------------------------
+ /** @short the original queryDispatch() target. */
+ ::rtl::OUString m_sDispatchTarget;
+
+ //---------------------------------------
+ /** @short list of registered status listener */
+ ListenerHash m_lStatusListener;
+
+ //-------------------------------------------
+ // native interface
+
+ public:
+
+ //---------------------------------------
+ /** @short connect a new StartModuleDispatcher instance to its "owner frame".
+
+ @descr Such "owner frame" is used as context for all related operations.
+
+ @param xSMGR
+ an uno service manager, which is needed to create uno resource
+ internaly.
+
+ @param xFrame
+ the frame where the corresponding dispatch was started.
+
+ @param sTarget
+ the original target information used for the related queryDispatch() call.
+ */
+ StartModuleDispatcher(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR ,
+ const css::uno::Reference< css::frame::XFrame >& xFrame ,
+ const ::rtl::OUString& sTarget);
+
+ //---------------------------------------
+ /** @short does nothing real. */
+ virtual ~StartModuleDispatcher();
+
+ //-------------------------------------------
+ // uno interface
+
+ public:
+
+ //---------------------------------------
+ FWK_DECLARE_XINTERFACE
+ FWK_DECLARE_XTYPEPROVIDER
+
+ //---------------------------------------
+ // XNotifyingDispatch
+ virtual void SAL_CALL 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);
+
+ //---------------------------------------
+ // XDispatch
+ virtual void SAL_CALL dispatch ( const css::util::URL& aURL ,
+ const css::uno::Sequence< css::beans::PropertyValue >& lArguments) throw(css::uno::RuntimeException);
+ virtual void SAL_CALL addStatusListener ( const css::uno::Reference< css::frame::XStatusListener >& xListener ,
+ const css::util::URL& aURL ) throw(css::uno::RuntimeException);
+ virtual void SAL_CALL removeStatusListener( const css::uno::Reference< css::frame::XStatusListener >& xListener ,
+ const css::util::URL& aURL ) throw(css::uno::RuntimeException);
+
+ //---------------------------------------
+ // XDispatchInformationProvider
+ virtual css::uno::Sequence< sal_Int16 > SAL_CALL getSupportedCommandGroups ( ) throw (css::uno::RuntimeException);
+ virtual css::uno::Sequence< css::frame::DispatchInformation > SAL_CALL getConfigurableDispatchInformation( sal_Int16 nCommandGroup ) throw (css::uno::RuntimeException);
+
+ //-------------------------------------------
+ // internal helper
+
+ private:
+
+ //---------------------------------------
+ /** @short check if StartModule can be shown.
+ */
+ ::sal_Bool implts_isBackingModePossible();
+
+ //---------------------------------------
+ /** @short open the special BackingComponent (now StartModule)
+
+ @return [bool]
+ TRUE if operation was successfully.
+ */
+ ::sal_Bool implts_establishBackingMode();
+
+ //---------------------------------------
+ /** @short notify a DispatchResultListener.
+
+ @descr We check the listener reference before we use it.
+ So this method can be called everytimes!
+
+ @parama xListener
+ the listener, which should be notified.
+ Can be null!
+
+ @param nState
+ directly used as css::frame::DispatchResultState value.
+
+ @param aResult
+ not used yet realy ...
+ */
+ void implts_notifyResultListener(const css::uno::Reference< css::frame::XDispatchResultListener >& xListener,
+ sal_Int16 nState ,
+ const css::uno::Any& aResult );
+
+}; // class StartModuleDispatcher
+
+} // namespace framework
+
+#endif // #ifndef __FRAMEWORK_DISPATCH_STARTMODULEDISPATCHER_HXX_
diff --git a/framework/inc/dispatchcommands.h b/framework/inc/dispatchcommands.h
new file mode 100644
index 000000000000..00adf73db6af
--- /dev/null
+++ b/framework/inc/dispatchcommands.h
@@ -0,0 +1,55 @@
+/*************************************************************************
+ *
+ * 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: targets.h,v $
+ * $Revision: 1.10 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#ifndef __FRAMEWORK_DISPATCHCOMMANDS_H_
+#define __FRAMEWORK_DISPATCHCOMMANDS_H_
+
+//_________________________________________________________________________________________________________________
+// includes
+//_________________________________________________________________________________________________________________
+
+#include <macros/generic.hxx>
+
+//_________________________________________________________________________________________________________________
+// namespace
+//_________________________________________________________________________________________________________________
+
+namespace framework{
+
+//_________________________________________________________________________________________________________________
+
+static ::rtl::OUString CMD_UNO_SHOWSTARTMODULE = ::rtl::OUString::createFromAscii(".uno:ShowStartModule");
+static ::rtl::OUString CMD_UNO_CLOSEDOC = ::rtl::OUString::createFromAscii(".uno:CloseDoc" );
+static ::rtl::OUString CMD_UNO_CLOSEWIN = ::rtl::OUString::createFromAscii(".uno:CloseWin" );
+static ::rtl::OUString CMD_UNO_CLOSEFRAME = ::rtl::OUString::createFromAscii(".uno:CloseFrame" );
+
+} // namespace framework
+
+#endif // #ifndef __FRAMEWORK_DISPATCHCOMMANDS_H_
diff --git a/framework/source/dispatch/dispatchprovider.cxx b/framework/source/dispatch/dispatchprovider.cxx
index 731273d11fd4..051640fc3724 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 6f551252cdd5..352aa66bfda7 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 000000000000..80f02236065f
--- /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
diff --git a/framework/util/makefile.mk b/framework/util/makefile.mk
index 7f755a9528cc..f9244a9031ce 100644
--- a/framework/util/makefile.mk
+++ b/framework/util/makefile.mk
@@ -332,6 +332,7 @@ SHL4OBJS= \
$(SLO)$/windowcommanddispatch.obj \
$(SLO)$/windowstateconfiguration.obj \
$(SLO)$/windowcontentfactorymanager.obj
+ $(SLO)$/startmoduledispatcher.obj
SHL4STDLIBS= \
$(FWILIB) \
diff --git a/sfx2/source/appl/app.hrc b/sfx2/source/appl/app.hrc
index 87cec75f26a5..707b52e0b4d2 100644
--- a/sfx2/source/appl/app.hrc
+++ b/sfx2/source/appl/app.hrc
@@ -216,6 +216,7 @@
#define STR_HELP_MENU_TEXT_COPY (RID_SFX_APP_START+144)
#define STR_QUICKSTART_PRELAUNCH_UNX (RID_SFX_APP_START+146)
#define STR_QUICKSTART_FILE (RID_SFX_APP_START+147)
+#define STR_QUICKSTART_STARTCENTER (RID_SFX_APP_START+148)
#define RID_HELP_ONSTARTUP_BOX (RID_SFX_APP_START+144)
#define RID_HELP_ONSTARTUP_TEXT (RID_SFX_APP_START+145)
diff --git a/sfx2/source/appl/app.src b/sfx2/source/appl/app.src
index cf966f861416..26e3985d1eb7 100644
--- a/sfx2/source/appl/app.src
+++ b/sfx2/source/appl/app.src
@@ -1029,6 +1029,11 @@ String STR_QUICKSTART_FILE
Text [ en-US ] = "File";
};
+String STR_QUICKSTART_STARTCENTER
+{
+ Text [ en-US ] = "Startcenter";
+};
+
String STR_QUERY_UPDATE_LINKS
{
Text [ en-US ] = "Update all links?" ;
diff --git a/sfx2/source/appl/shutdownicon.cxx b/sfx2/source/appl/shutdownicon.cxx
index a9243c6a8587..3dddea833123 100644
--- a/sfx2/source/appl/shutdownicon.cxx
+++ b/sfx2/source/appl/shutdownicon.cxx
@@ -680,19 +680,6 @@ void SAL_CALL ShutdownIcon::initialize( const ::com::sun::star::uno::Sequence< :
ShutdownIcon::getInstance()->addTerminateListener();
}
#endif
-#ifdef OS2
- // above win32 starts the quickstart thread, but we have
- // quickstart running only when -quickstart is specified
- // on command line (next boot).
- // so if -quickstart was not specified, we cannot issue
- // quickstart veto on shutdown.
- if (bQuickstart)
- {
- // disable shutdown
- ShutdownIcon::getInstance()->SetVeto( true );
- ShutdownIcon::getInstance()->addTerminateListener();
- }
-#endif
}
catch(const ::com::sun::star::lang::IllegalArgumentException&)
{
diff --git a/sfx2/source/appl/shutdownicon.hxx b/sfx2/source/appl/shutdownicon.hxx
index eaaaf1bfa806..4e7cc6ecc247 100644
--- a/sfx2/source/appl/shutdownicon.hxx
+++ b/sfx2/source/appl/shutdownicon.hxx
@@ -44,6 +44,7 @@ typedef ::cppu::WeakComponentImplHelper4<
#define DRAW_URL "private:factory/sdraw"
#define MATH_URL "private:factory/smath"
#define BASE_URL "private:factory/sdatabase?Interactive"
+#define STARTMODULE_URL ".uno:ShowStartModule"
#endif
class SFX2_DLLPUBLIC ShutdownIcon : public ShutdownIconServiceBase
diff --git a/sfx2/source/appl/shutdowniconaqua.mm b/sfx2/source/appl/shutdowniconaqua.mm
index 0b57b006e38f..92f0408ead82 100644
--- a/sfx2/source/appl/shutdowniconaqua.mm
+++ b/sfx2/source/appl/shutdowniconaqua.mm
@@ -61,12 +61,13 @@ using namespace ::com::sun::star::beans;
#define MI_BASE 6
#define MI_MATH 7
#define MI_TEMPLATE 8
-
+#define MI_STARTMODULE 9
@interface QSMenuExecute : NSObject
{
}
-(void)executeMenuItem: (NSMenuItem*)pItem;
+-(void)dockIconClicked: (NSObject*)pSender;
@end
@implementation QSMenuExecute
@@ -98,10 +99,20 @@ using namespace ::com::sun::star::beans;
case MI_TEMPLATE:
ShutdownIcon::FromTemplate();
break;
+ case MI_STARTMODULE:
+ ShutdownIcon::OpenURL( OUString( RTL_CONSTASCII_USTRINGPARAM( STARTMODULE_URL ) ), OUString( RTL_CONSTASCII_USTRINGPARAM( "_default" ) ) );
+ break;
default:
break;
}
}
+
+-(void)dockIconClicked: (NSObject*)pSender
+{
+ // start start module
+ ShutdownIcon::OpenURL( OUString( RTL_CONSTASCII_USTRINGPARAM( STARTMODULE_URL ) ), OUString( RTL_CONSTASCII_USTRINGPARAM( "_default" ) ) );
+}
+
@end
bool ShutdownIcon::IsQuickstarterInstalled()
@@ -119,16 +130,13 @@ static NSString* getAutoreleasedString( const rtl::OUString& rStr )
return [[[NSString alloc] initWithCharacters: rStr.getStr() length: rStr.getLength()] autorelease];
}
-static void appendMenuItem( NSMenu* pMenu, NSMenu* pDockMenu, const rtl::OUString& rTitle, int nTag )
+static rtl::OUString getShortCut( const rtl::OUString i_rTitle )
{
- if( ! rTitle.getLength() )
- return;
-
// create shortcut
rtl::OUString aKeyEquiv;
- for( sal_Int32 nIndex = 0; nIndex < rTitle.getLength(); nIndex++ )
+ for( sal_Int32 nIndex = 0; nIndex < i_rTitle.getLength(); nIndex++ )
{
- rtl::OUString aShortcut( rTitle.copy( nIndex, 1 ).toAsciiLowerCase() );
+ rtl::OUString aShortcut( i_rTitle.copy( nIndex, 1 ).toAsciiLowerCase() );
if( aShortcuts.find( aShortcut ) == aShortcuts.end() )
{
aShortcuts.insert( aShortcut );
@@ -136,25 +144,36 @@ static void appendMenuItem( NSMenu* pMenu, NSMenu* pDockMenu, const rtl::OUStrin
break;
}
}
+
+ return aKeyEquiv;
+}
+
+static void appendMenuItem( NSMenu* i_pMenu, NSMenu* i_pDockMenu, const rtl::OUString& i_rTitle, int i_nTag, const rtl::OUString& i_rKeyEquiv )
+{
+ if( ! i_rTitle.getLength() )
+ return;
- NSMenuItem* pItem = [[NSMenuItem alloc] initWithTitle: getAutoreleasedString( rTitle )
+ NSMenuItem* pItem = [[NSMenuItem alloc] initWithTitle: getAutoreleasedString( i_rTitle )
action: @selector(executeMenuItem:)
- keyEquivalent: (aKeyEquiv.getLength() ? getAutoreleasedString( aKeyEquiv ) : @"")
+ keyEquivalent: (i_rKeyEquiv.getLength() ? getAutoreleasedString( i_rKeyEquiv ) : @"")
];
- [pItem setTag: nTag];
+ [pItem setTag: i_nTag];
[pItem setTarget: pExecute];
[pItem setEnabled: YES];
- [pMenu addItem: pItem];
+ [i_pMenu addItem: pItem];
- // create a similar entry in the dock menu
- pItem = [[NSMenuItem alloc] initWithTitle: getAutoreleasedString( rTitle )
- action: @selector(executeMenuItem:)
- keyEquivalent: @""
- ];
- [pItem setTag: nTag];
- [pItem setTarget: pExecute];
- [pItem setEnabled: YES];
- [pDockMenu addItem: pItem];
+ if( i_pDockMenu )
+ {
+ // create a similar entry in the dock menu
+ pItem = [[NSMenuItem alloc] initWithTitle: getAutoreleasedString( i_rTitle )
+ action: @selector(executeMenuItem:)
+ keyEquivalent: @""
+ ];
+ [pItem setTag: i_nTag];
+ [pItem setTarget: pExecute];
+ [pItem setEnabled: YES];
+ [i_pDockMenu addItem: pItem];
+ }
}
@@ -203,7 +222,7 @@ void aqua_init_systray()
if ( sURL.getLength() )
aFileNewAppsAvailable.insert( sURL );
}
-
+
// describe the menu entries for launching the applications
struct MenuEntryDescriptor
{
@@ -220,6 +239,17 @@ void aqua_init_systray()
{ SvtModuleOptions::E_SMATH, MI_MATH, MATH_URL }
};
+ // insert entry for startcenter
+ if( aModuleOptions.IsModuleInstalled( SvtModuleOptions::E_SSTARTMODULE ) )
+ {
+ appendMenuItem( pMenu, nil, pShutdownIcon->GetResString( STR_QUICKSTART_STARTCENTER ), MI_STARTMODULE, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "n" ) ) );
+ if( [NSApp respondsToSelector: @selector(setDockIconClickHandler:)] )
+ [NSApp performSelector:@selector(setDockIconClickHandler:) withObject: pExecute];
+ else
+ DBG_ERROR( "setDockIconClickHandler selector failed on NSApp\n" );
+
+ }
+
// insert the menu entries for launching the applications
for ( size_t i = 0; i < sizeof( aMenuItems ) / sizeof( aMenuItems[0] ); ++i )
{
@@ -233,18 +263,24 @@ void aqua_init_systray()
// the application is installed, but the entry has been configured to *not* appear in the File/New
// menu => also let not appear it in the quickstarter
continue;
+
+ rtl::OUString aKeyEquiv( getShortCut( pShutdownIcon->GetUrlDescription( sURL ) ) );
- appendMenuItem( pMenu, pDockMenu, pShutdownIcon->GetUrlDescription( sURL ), aMenuItems[i].nMenuTag );
+ appendMenuItem( pMenu, pDockMenu, pShutdownIcon->GetUrlDescription( sURL ), aMenuItems[i].nMenuTag, aKeyEquiv );
}
// insert the remaining menu entries
- appendMenuItem( pMenu, pDockMenu, pShutdownIcon->GetResString( STR_QUICKSTART_FROMTEMPLATE ), MI_TEMPLATE );
- appendMenuItem( pMenu, pDockMenu, pShutdownIcon->GetResString( STR_QUICKSTART_FILEOPEN ), MI_OPEN );
+ rtl::OUString aTitle( pShutdownIcon->GetResString( STR_QUICKSTART_FROMTEMPLATE ) );
+ rtl::OUString aKeyEquiv( getShortCut( aTitle ) );
+ appendMenuItem( pMenu, pDockMenu, aTitle, MI_TEMPLATE, aKeyEquiv );
+ aTitle = pShutdownIcon->GetResString( STR_QUICKSTART_FILEOPEN );
+ aKeyEquiv = getShortCut( aTitle );
+ appendMenuItem( pMenu, pDockMenu, aTitle, MI_OPEN, aKeyEquiv );
[pDefMenu setSubmenu: pMenu];
[NSApp performSelector:@selector(addFallbackMenuItem:) withObject: pDefMenu];
- if( [NSApp respondsToSelector: @selector(addFallbackMenuItem:)] )
+ if( [NSApp respondsToSelector: @selector(addDockMenuItem:)] )
{
[pDockSubMenu setSubmenu: pDockMenu];
// insert a separator to the dock menu
diff --git a/svx/source/editeng/editeng.cxx b/svx/source/editeng/editeng.cxx
index 467fabdc8d6b..bd0ebbe015a3 100644
--- a/svx/source/editeng/editeng.cxx
+++ b/svx/source/editeng/editeng.cxx
@@ -930,16 +930,22 @@ sal_Bool EditEngine::PostKeyEvent( const KeyEvent& rKeyEvent, EditView* pEditVie
case KEY_END:
case KEY_PAGEUP:
case KEY_PAGEDOWN:
+ case com::sun::star::awt::Key::MOVE_WORD_FORWARD:
+ case com::sun::star::awt::Key::SELECT_WORD_FORWARD:
+ case com::sun::star::awt::Key::MOVE_WORD_BACKWARD:
+ case com::sun::star::awt::Key::SELECT_WORD_BACKWARD:
case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_LINE:
case com::sun::star::awt::Key::MOVE_TO_END_OF_LINE:
+ case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE:
+ case com::sun::star::awt::Key::SELECT_TO_END_OF_LINE:
case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_PARAGRAPH:
case com::sun::star::awt::Key::MOVE_TO_END_OF_PARAGRAPH:
- case com::sun::star::awt::Key::MOVE_WORD_BACKWARD:
- case com::sun::star::awt::Key::MOVE_WORD_FORWARD:
- case com::sun::star::awt::Key::SELECT_BACKWARD:
- case com::sun::star::awt::Key::SELECT_FORWARD:
- case com::sun::star::awt::Key::SELECT_WORD_BACKWARD:
- case com::sun::star::awt::Key::SELECT_WORD_FORWARD:
+ case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_PARAGRAPH:
+ case com::sun::star::awt::Key::SELECT_TO_END_OF_PARAGRAPH:
+ case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT:
+ case com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT:
+ case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT:
+ case com::sun::star::awt::Key::SELECT_TO_END_OF_DOCUMENT:
{
if ( !rKeyEvent.GetKeyCode().IsMod2() || ( nCode == KEY_LEFT ) || ( nCode == KEY_RIGHT ) )
{
@@ -969,6 +975,8 @@ sal_Bool EditEngine::PostKeyEvent( const KeyEvent& rKeyEvent, EditView* pEditVie
case KEY_DELETE:
case com::sun::star::awt::Key::DELETE_WORD_BACKWARD:
case com::sun::star::awt::Key::DELETE_WORD_FORWARD:
+ case com::sun::star::awt::Key::DELETE_TO_BEGIN_OF_PARAGRAPH:
+ case com::sun::star::awt::Key::DELETE_TO_END_OF_PARAGRAPH:
{
if ( !bReadOnly && !rKeyEvent.GetKeyCode().IsMod2() )
{
diff --git a/svx/source/editeng/impedit2.cxx b/svx/source/editeng/impedit2.cxx
index 66d322c26e52..5b5ca97174f5 100644
--- a/svx/source/editeng/impedit2.cxx
+++ b/svx/source/editeng/impedit2.cxx
@@ -895,12 +895,38 @@ EditSelection ImpEditEngine::MoveCursor( const KeyEvent& rKeyEvent, EditView* pE
break;
case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_PARAGRAPH:
aPaM = CursorStartOfParagraph( aPaM );
+ if( aPaM == aOldPaM )
+ {
+ aPaM = CursorLeft( aPaM, i18n::CharacterIteratorMode::SKIPCELL );
+ aPaM = CursorStartOfParagraph( aPaM );
+ }
bKeyModifySelection = false;
break;
case com::sun::star::awt::Key::MOVE_TO_END_OF_PARAGRAPH:
aPaM = CursorEndOfParagraph( aPaM );
+ if( aPaM == aOldPaM )
+ {
+ aPaM = CursorRight( aPaM, i18n::CharacterIteratorMode::SKIPCELL );
+ aPaM = CursorEndOfParagraph( aPaM );
+ }
+ bKeyModifySelection = false;
+ break;
+ case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT:
+ aPaM = CursorStartOfDoc();
+ bKeyModifySelection = false;
+ break;
+ case com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT:
+ aPaM = CursorEndOfDoc();
bKeyModifySelection = false;
break;
+ case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE:
+ aPaM = CursorStartOfLine( aPaM );
+ bKeyModifySelection = true;
+ break;
+ case com::sun::star::awt::Key::SELECT_TO_END_OF_LINE:
+ aPaM = CursorEndOfLine( aPaM );
+ bKeyModifySelection = true;
+ break;
case com::sun::star::awt::Key::SELECT_BACKWARD:
aPaM = CursorLeft( aPaM, i18n::CharacterIteratorMode::SKIPCELL );
bKeyModifySelection = true;
@@ -917,6 +943,32 @@ EditSelection ImpEditEngine::MoveCursor( const KeyEvent& rKeyEvent, EditView* pE
aPaM = WordRight( aPaM );
bKeyModifySelection = true;
break;
+ case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_PARAGRAPH:
+ aPaM = CursorStartOfParagraph( aPaM );
+ if( aPaM == aOldPaM )
+ {
+ aPaM = CursorLeft( aPaM, i18n::CharacterIteratorMode::SKIPCELL );
+ aPaM = CursorStartOfParagraph( aPaM );
+ }
+ bKeyModifySelection = true;
+ break;
+ case com::sun::star::awt::Key::SELECT_TO_END_OF_PARAGRAPH:
+ aPaM = CursorEndOfParagraph( aPaM );
+ if( aPaM == aOldPaM )
+ {
+ aPaM = CursorRight( aPaM, i18n::CharacterIteratorMode::SKIPCELL );
+ aPaM = CursorEndOfParagraph( aPaM );
+ }
+ bKeyModifySelection = true;
+ break;
+ case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT:
+ aPaM = CursorStartOfDoc();
+ bKeyModifySelection = true;
+ break;
+ case com::sun::star::awt::Key::SELECT_TO_END_OF_DOCUMENT:
+ aPaM = CursorEndOfDoc();
+ bKeyModifySelection = true;
+ break;
}
if ( aOldPaM != aPaM )