diff options
Diffstat (limited to 'sfx2/source/appl/appinit.cxx')
-rw-r--r-- | sfx2/source/appl/appinit.cxx | 326 |
1 files changed, 326 insertions, 0 deletions
diff --git a/sfx2/source/appl/appinit.cxx b/sfx2/source/appl/appinit.cxx new file mode 100644 index 000000000000..98439eb5a6dc --- /dev/null +++ b/sfx2/source/appl/appinit.cxx @@ -0,0 +1,326 @@ +/************************************************************************* + * + * 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: appinit.cxx,v $ + * $Revision: 1.65 $ + * + * 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_sfx2.hxx" + +#include <sfx2/app.hxx> +#include <com/sun/star/frame/XTerminateListener.hpp> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/frame/XDesktop.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> + +#include <svtools/soerr.hxx> +#include <svtools/svtools.hrc> +#include <svtools/saveopt.hxx> +#include <svtools/localisationoptions.hxx> +#include <tools/config.hxx> +#ifndef _SV_RESARY_HXX +#include <tools/resary.hxx> +#endif +#include <tools/urlobj.hxx> +#include <svtools/intitem.hxx> +#include <svtools/eitem.hxx> +#include <svtools/stritem.hxx> +#ifndef _MSGBOX_HXX //autogen +#include <vcl/msgbox.hxx> +#endif +#include <svtools/ehdl.hxx> +#ifndef _UNOTOOLS_PROCESSFACTORY_HXX +#include <comphelper/processfactory.hxx> +#endif +#include <unotools/configmgr.hxx> +#include <rtl/ustrbuf.hxx> +#include <vos/security.hxx> +#include <ucbhelper/configurationkeys.hxx> +#include <svtools/pathoptions.hxx> +#include <svtools/historyoptions.hxx> +#include <svtools/moduleoptions.hxx> +#include <cppuhelper/implbase2.hxx> + +#include <rtl/logfile.hxx> +#include <vcl/edit.hxx> + +#ifndef GCC +#endif + +#include <sfx2/unoctitm.hxx> +#include "app.hrc" +#include "sfxlocal.hrc" +#include "appdata.hxx" +#include "arrdecl.hxx" +#include <sfx2/dispatch.hxx> +#include <sfx2/docfac.hxx> +#include <sfx2/evntconf.hxx> +#include "intro.hxx" +#include <sfx2/macrconf.hxx> +#include <sfx2/mnumgr.hxx> +#include <sfx2/msgpool.hxx> +#include <sfx2/progress.hxx> +#include "sfxhelp.hxx" +#include "sfxresid.hxx" +#include "sfxtypes.hxx" +#include <sfx2/viewsh.hxx> +#include "nochaos.hxx" +#include <sfx2/fcontnr.hxx> +#include "helper.hxx" // SfxContentHelper::Kill() +#include "sfxpicklist.hxx" + +#ifdef UNX +#define stricmp(a,b) strcmp(a,b) +#endif + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star; +namespace css = ::com::sun::star; + +class SfxTerminateListener_Impl : public ::cppu::WeakImplHelper2< XTerminateListener, XServiceInfo > +{ +public: + + // XTerminateListener + virtual void SAL_CALL queryTermination( const EventObject& aEvent ) throw( TerminationVetoException, RuntimeException ); + virtual void SAL_CALL notifyTermination( const EventObject& aEvent ) throw( RuntimeException ); + virtual void SAL_CALL disposing( const EventObject& Source ) throw( RuntimeException ); + + // XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName() throw (RuntimeException); + virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& sServiceName ) throw (RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw (RuntimeException); +}; + +void SAL_CALL SfxTerminateListener_Impl::disposing( const EventObject& ) throw( RuntimeException ) +{ +} + +void SAL_CALL SfxTerminateListener_Impl::queryTermination( const EventObject& ) throw(TerminationVetoException, RuntimeException ) +{ + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + if ( !SFX_APP()->QueryExit_Impl() ) + throw TerminationVetoException(); +} + +void SAL_CALL SfxTerminateListener_Impl::notifyTermination( const EventObject& aEvent ) throw(RuntimeException ) +{ + static ::rtl::OUString SERVICE_GLOBALEVENTBROADCASTER = ::rtl::OUString::createFromAscii("com.sun.star.frame.GlobalEventBroadcaster"); + static ::rtl::OUString EVENT_QUIT_APP = ::rtl::OUString::createFromAscii("OnCloseApp"); + + Reference< XDesktop > xDesktop( aEvent.Source, UNO_QUERY ); + if( xDesktop.is() == sal_True ) + xDesktop->removeTerminateListener( this ); + + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + utl::ConfigManager::GetConfigManager()->StoreConfigItems(); + SfxApplication* pApp = SFX_APP(); + pApp->Broadcast( SfxSimpleHint( SFX_HINT_DEINITIALIZING ) ); + pApp->Get_Impl()->pAppDispatch->ReleaseAll(); + pApp->Get_Impl()->pAppDispatch->release(); + + css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory(); + css::uno::Reference< css::document::XEventListener > xGlobalBroadcaster(xSMGR->createInstance(SERVICE_GLOBALEVENTBROADCASTER), css::uno::UNO_QUERY); + if (xGlobalBroadcaster.is()) + { + css::document::EventObject aEvent2; + aEvent2.EventName = EVENT_QUIT_APP; + xGlobalBroadcaster->notifyEvent(aEvent2); + } + + //pApp->Deinitialize(); + delete pApp; + Application::Quit(); +} + +::rtl::OUString SAL_CALL SfxTerminateListener_Impl::getImplementationName() throw (RuntimeException) +{ + static const ::rtl::OUString IMPLNAME = ::rtl::OUString::createFromAscii("com.sun.star.comp.sfx2.SfxTerminateListener"); + return IMPLNAME; +} + +::sal_Bool SAL_CALL SfxTerminateListener_Impl::supportsService( const ::rtl::OUString& sServiceName ) throw (RuntimeException) +{ + Sequence< ::rtl::OUString > lNames = getSupportedServiceNames(); + ::sal_Int32 c = lNames.getLength(); + ::sal_Int32 i = 0; + + for (i=0; i<c; ++i) + { + if (lNames[i].equals(sServiceName)) + return sal_True; + } + + return sal_False; +} + +Sequence< ::rtl::OUString > SAL_CALL SfxTerminateListener_Impl::getSupportedServiceNames() throw (RuntimeException) +{ + // Note: That service does not realy exists .-) + // But this implementation is not thought to be registered realy within our service.rdb. + // At least we need the implementation name only to identify these service at the global desktop instance. + // The desktop must know, which listener will terminate the SfxApplication in real ! + // It must call this special listener as last one ... otherwise we shutdown the SfxApplication BEFORE other listener + // can react ... + static const ::rtl::OUString SERVICENAME = ::rtl::OUString::createFromAscii("com.sun.star.frame.TerminateListener"); + Sequence< ::rtl::OUString > lNames(1); + lNames[0] = SERVICENAME; + return lNames; +} + +//==================================================================== + +#define DOSTRING( x ) #x +#define STRING( x ) DOSTRING( x ) + +typedef bool ( *PFunc_getSpecialCharsForEdit)( Window* i_pParent, const Font& i_rFont, String& o_rOutString ); + +//==================================================================== +// Lazy binding of the GetSpecialCharsForEdit function as it resides in +// a library above us. +//==================================================================== + +extern "C" { static void SAL_CALL thisModule() {} } + +String GetSpecialCharsForEdit(Window* pParent, const Font& rFont) +{ + static bool bDetermineFunction = false; + static PFunc_getSpecialCharsForEdit pfunc_getSpecialCharsForEdit = 0; + + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + if ( !bDetermineFunction ) + { + bDetermineFunction = true; + + String sLibName = String::CreateFromAscii( STRING( DLL_NAME ) ); + sLibName.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "sfx" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "cui" ) ) ); + + rtl::OUString aLibName( sLibName ); + oslModule handleMod = osl_loadModuleRelative( + &thisModule, aLibName.pData, 0 ); + + // get symbol + ::rtl::OUString aSymbol( RTL_CONSTASCII_USTRINGPARAM( "GetSpecialCharsForEdit" ) ); + pfunc_getSpecialCharsForEdit = (PFunc_getSpecialCharsForEdit)osl_getFunctionSymbol( handleMod, aSymbol.pData ); + DBG_ASSERT( pfunc_getSpecialCharsForEdit, "GetSpecialCharsForEdit() not found!" ); + } + + String aRet; + if ( pfunc_getSpecialCharsForEdit ) + (*pfunc_getSpecialCharsForEdit)( pParent, rFont, aRet ); + return aRet; +} + +//==================================================================== + +FASTBOOL SfxApplication::Initialize_Impl() +{ + RTL_LOGFILE_CONTEXT( aLog, "sfx2 (mb93783) ::SfxApplication::Initialize_Impl" ); + +#ifdef TLX_VALIDATE + StgIo::SetErrorLink( LINK( this, SfxStorageErrHdl, Error ) ); +#endif + + Reference < XDesktop > xDesktop ( ::comphelper::getProcessServiceFactory()->createInstance( DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY ); + if (!xDesktop.is()) + throw RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Couldn't create mandatory desktop service!" )), xDesktop ); + xDesktop->addTerminateListener( new SfxTerminateListener_Impl() ); + + Application::EnableAutoHelpId(); + + pAppData_Impl->pAppDispatch = new SfxStatusDispatcher; + pAppData_Impl->pAppDispatch->acquire(); + + // SV-Look + Help::EnableContextHelp(); + Help::EnableExtHelp(); + + SvtLocalisationOptions aLocalisation; + Application::EnableAutoMnemonic ( aLocalisation.IsAutoMnemonic() ); + Application::SetDialogScaleX ( (short)(aLocalisation.GetDialogScale()) ); + + +#ifdef DBG_UTIL + // Der SimplerErrorHandler dient Debugzwecken. In der Product werden + // nichtgehandelte Fehler durch Errorcode 1 an SFX gegeben. + new SimpleErrorHandler; +#endif + new SfxErrorHandler(RID_ERRHDL, ERRCODE_AREA_TOOLS, ERRCODE_AREA_LIB1); + + new SfxErrorHandler( + RID_SO_ERROR_HANDLER, ERRCODE_AREA_SO, ERRCODE_AREA_SO_END); + new SfxErrorHandler( + (RID_SJ_START +1), ERRCODE_AREA_JAVA, ERRCODE_AREA_JAVA_END); + new SfxErrorHandler( + RID_BASIC_START, ERRCODE_AREA_SBX, ERRCODE_AREA_SBX_END ); + + // diverse Pointer + SfxPickList::GetOrCreate( SvtHistoryOptions().GetSize( ePICKLIST ) ); + + ///////////////////////////////////////////////////////////////// + + DBG_ASSERT( !pAppData_Impl->pAppDispat, "AppDispatcher already exists" ); + pAppData_Impl->pAppDispat = new SfxDispatcher((SfxDispatcher*)0); + pAppData_Impl->pSlotPool = new SfxSlotPool; + pAppData_Impl->pTbxCtrlFac = new SfxTbxCtrlFactArr_Impl; + pAppData_Impl->pStbCtrlFac = new SfxStbCtrlFactArr_Impl; + pAppData_Impl->pMenuCtrlFac = new SfxMenuCtrlFactArr_Impl; + pAppData_Impl->pViewFrames = new SfxViewFrameArr_Impl; + pAppData_Impl->pViewShells = new SfxViewShellArr_Impl; + pAppData_Impl->pObjShells = new SfxObjectShellArr_Impl; + pAppData_Impl->nInterfaces = SFX_INTERFACE_APP+8; + pAppData_Impl->pInterfaces = new SfxInterface*[pAppData_Impl->nInterfaces]; + memset( pAppData_Impl->pInterfaces, 0, sizeof(SfxInterface*) * pAppData_Impl->nInterfaces ); + + Registrations_Impl(); + + // Subklasse initialisieren + pAppData_Impl->bDowning = sal_False; + Init(); + + // get CHAOS item pool... + pAppData_Impl->pPool = NoChaos::GetItemPool(); + SetPool( pAppData_Impl->pPool ); + + if ( pAppData_Impl->bDowning ) + return sal_False; + + // App-Dispatcher aufbauen + pAppData_Impl->pAppDispat->Push(*this); + pAppData_Impl->pAppDispat->Flush(); + pAppData_Impl->pAppDispat->DoActivate_Impl( sal_True, NULL ); + + { + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + // Set special characters callback on vcl edit control + Edit::SetGetSpecialCharsFunction(&GetSpecialCharsForEdit); + } + + return sal_True; +} |