diff options
Diffstat (limited to 'sfx2/source/appl/app.cxx')
-rw-r--r-- | sfx2/source/appl/app.cxx | 845 |
1 files changed, 845 insertions, 0 deletions
diff --git a/sfx2/source/appl/app.cxx b/sfx2/source/appl/app.cxx new file mode 100644 index 000000000000..7e4e9921573a --- /dev/null +++ b/sfx2/source/appl/app.cxx @@ -0,0 +1,845 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * 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" + +#if defined UNX +#include <limits.h> +#else // UNX +#include <stdlib.h> +#define PATH_MAX _MAX_PATH +#endif // UNX + +#include <sfx2/app.hxx> +#include <sfx2/frame.hxx> +#include <vos/process.hxx> +#include <tools/simplerm.hxx> +#include <tools/config.hxx> +#include <basic/basrdll.hxx> +#include <svtools/asynclink.hxx> +#include <svl/stritem.hxx> +#ifndef _SOUND_HXX //autogen +#include <vcl/sound.hxx> +#endif +#include <svl/eitem.hxx> +#include <svl/urlbmk.hxx> +#ifndef _MSGBOX_HXX //autogen +#include <vcl/msgbox.hxx> +#endif +#include <svtools/sfxecode.hxx> +#include <svtools/ehdl.hxx> + +#include <svl/svdde.hxx> +#include <tools/urlobj.hxx> +#include <unotools/tempfile.hxx> +#include <osl/file.hxx> +#ifndef GCC +#endif + +#define _SVSTDARR_STRINGSDTOR +#include <svl/svstdarr.hxx> + +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/frame/XFrameActionListener.hpp> +#include <com/sun/star/frame/XComponentLoader.hpp> +#include <com/sun/star/frame/XFrame.hpp> +#include <com/sun/star/frame/FrameActionEvent.hpp> +#include <com/sun/star/frame/FrameAction.hpp> +#include <com/sun/star/loader/XImplementationLoader.hpp> +#include <com/sun/star/loader/CannotActivateFactoryException.hpp> +#include <com/sun/star/mozilla/XPluginInstance.hpp> +#include <com/sun/star/frame/XFramesSupplier.hpp> +#include <com/sun/star/container/XIndexAccess.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#ifndef _UNOTOOLS_PROCESSFACTORY_HXX +#include <comphelper/processfactory.hxx> +#endif +#include <com/sun/star/uri/XUriReferenceFactory.hpp> +#include <com/sun/star/uri/XVndSunStarScriptUrl.hpp> + +#include <basic/basmgr.hxx> +#include <toolkit/helper/vclunohelper.hxx> +#include <vcl/svapp.hxx> + +#include <rtl/logfile.hxx> + +#include <sfx2/appuno.hxx> +#include "sfxhelp.hxx" +#include <sfx2/request.hxx> +#include "sfxtypes.hxx" +#include "sfxresid.hxx" +#include "arrdecl.hxx" +#include <sfx2/progress.hxx> +#include <sfx2/objsh.hxx> +#include <sfx2/docfac.hxx> +#include <sfx2/docfile.hxx> +#include <sfx2/docfilt.hxx> +#include "fltfnc.hxx" +#include "nfltdlg.hxx" +#include <sfx2/new.hxx> +#include <sfx2/bindings.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/viewsh.hxx> +#include <sfx2/genlink.hxx> +#include <sfx2/viewfrm.hxx> +#include "appdata.hxx" +#include "openflag.hxx" +#include "app.hrc" +#include "virtmenu.hxx" +#include <sfx2/module.hxx> +#include <sfx2/event.hxx> +#include "imestatuswindow.hxx" +#include "workwin.hxx" +#include <sfx2/module.hxx> +#include <sfx2/tbxctrl.hxx> +#include <sfx2/sfxdlg.hxx> +#include "stbitem.hxx" +#include "eventsupplier.hxx" +#include <sfx2/dockwin.hxx> + +#ifdef DBG_UTIL +#include <sfx2/tbxctrl.hxx> +#include <sfx2/mnuitem.hxx> +#endif + +#if defined( WNT ) || defined( OS2 ) +#define DDE_AVAILABLE +#endif + +#include <unotools/saveopt.hxx> +#include <unotools/undoopt.hxx> +#include <svtools/helpopt.hxx> +#include <unotools/pathoptions.hxx> +#include <unotools/viewoptions.hxx> +#include <unotools/moduleoptions.hxx> +#include <unotools/historyoptions.hxx> +#include <svtools/menuoptions.hxx> +#include <svtools/miscopt.hxx> +#include <unotools/useroptions.hxx> +#include <unotools/startoptions.hxx> +#include <unotools/securityoptions.hxx> +#include <unotools/localisationoptions.hxx> +#include <unotools/inetoptions.hxx> +#include <unotools/fontoptions.hxx> +#include <unotools/internaloptions.hxx> +#include <unotools/workingsetoptions.hxx> +#include <unotools/syslocaleoptions.hxx> +#include <unotools/syslocale.hxx> +#include <framework/addonsoptions.hxx> +#include <svtools/ttprops.hxx> +#include <unotools/extendedsecurityoptions.hxx> + +using namespace ::com::sun::star; + +// Static member +SfxApplication* SfxApplication::pApp = NULL; +static BasicDLL* pBasic = NULL; + +class SfxPropertyHandler : public PropertyHandler +{ + virtual void Property( ApplicationProperty& ); +}; + +static SfxPropertyHandler* pPropertyHandler = 0; + +SfxPropertyHandler* GetOrCreatePropertyHandler() +{ + if ( !pPropertyHandler ) + { + ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); + if ( !pPropertyHandler ) + pPropertyHandler = new SfxPropertyHandler; + } + + return pPropertyHandler; +} + +void SfxPropertyHandler::Property( ApplicationProperty& rProp ) +{ + TTProperties* pTTProperties = PTR_CAST( TTProperties, &rProp ); + if ( pTTProperties ) + { + pTTProperties->nPropertyVersion = TT_PROPERTIES_VERSION; + switch ( pTTProperties->nActualPR ) + { + case TT_PR_SLOTS: + { + pTTProperties->nSidOpenUrl = SID_OPENURL; + pTTProperties->nSidFileName = SID_FILE_NAME; + pTTProperties->nSidNewDocDirect = SID_NEWDOCDIRECT; + pTTProperties->nSidCopy = SID_COPY; + pTTProperties->nSidPaste = SID_PASTE; + pTTProperties->nSidSourceView = SID_SOURCEVIEW; + pTTProperties->nSidSelectAll = SID_SELECTALL; + pTTProperties->nSidReferer = SID_REFERER; + pTTProperties->nActualPR = 0; + } + break; + case TT_PR_DISPATCHER: + { + // interface for TestTool + SfxViewFrame* pViewFrame=0; + SfxDispatcher* pDispatcher=0; + pViewFrame = SfxViewFrame::Current(); + if ( !pViewFrame ) + pViewFrame = SfxViewFrame::GetFirst(); + if ( pViewFrame ) + pDispatcher = pViewFrame->GetDispatcher(); + else + pDispatcher = NULL; + if ( !pDispatcher ) + pTTProperties->nActualPR = TT_PR_ERR_NODISPATCHER; + else + { + pDispatcher->SetExecuteMode(EXECUTEMODE_DIALOGASYNCHRON); + if ( pTTProperties->mnSID == SID_NEWDOCDIRECT + || pTTProperties->mnSID == SID_OPENDOC ) + { + SfxPoolItem** pArgs = pTTProperties->mppArgs; + SfxAllItemSet aSet( SFX_APP()->GetPool() ); + if ( pArgs && *pArgs ) + { + for ( SfxPoolItem **pArg = pArgs; *pArg; ++pArg ) + aSet.Put( **pArg ); + } + if ( pTTProperties->mnSID == SID_NEWDOCDIRECT ) + { + String aFactory = String::CreateFromAscii("private:factory/"); + if ( pArgs && *pArgs ) + { + SFX_ITEMSET_ARG( &aSet, pFactoryName, SfxStringItem, SID_NEWDOCDIRECT, FALSE ); + if ( pFactoryName ) + aFactory += pFactoryName->GetValue(); + else + aFactory += String::CreateFromAscii("swriter"); + } + else + aFactory += String::CreateFromAscii("swriter"); + + aSet.Put( SfxStringItem( SID_FILE_NAME, aFactory ) ); + aSet.ClearItem( SID_NEWDOCDIRECT ); + pTTProperties->mnSID = SID_OPENDOC; + } + + aSet.Put( SfxStringItem( SID_TARGETNAME, DEFINE_CONST_UNICODE("_blank") ) ); + if ( pDispatcher->ExecuteFunction( pTTProperties->mnSID, aSet, pTTProperties->mnMode ) + == EXECUTE_NO ) + pTTProperties->nActualPR = TT_PR_ERR_NOEXECUTE; + else + pTTProperties->nActualPR = 0; + } + else + { + if ( pDispatcher->ExecuteFunction( + pTTProperties->mnSID, pTTProperties->mppArgs, pTTProperties->mnMode ) + == EXECUTE_NO ) + pTTProperties->nActualPR = TT_PR_ERR_NOEXECUTE; + else + pTTProperties->nActualPR = 0; + } + } + } + break; +/* + case TT_PR_IMG: + { + SvDataMemberObjectRef aDataObject = new SvDataMemberObject(); + SvData* pDataBmp = new SvData( FORMAT_BITMAP ); + pDataBmp->SetData( pTTProperties->mpBmp ); + aDataObject->Append( pDataBmp ); + aDataObject->CopyClipboard(); + pTTProperties->nActualPR = 0; + } + break; +*/ + default: + { + pTTProperties->nPropertyVersion = 0; + } + } + return; + } +} + +#include <framework/imageproducer.hxx> +#include <framework/acceleratorinfo.hxx> +#include <framework/sfxhelperfunctions.hxx> +#include "imagemgr.hxx" +#include "fwkhelper.hxx" + +::osl::Mutex SfxApplication::gMutex; + +SfxApplication* SfxApplication::GetOrCreate() +{ + // SFX on demand + ::osl::MutexGuard aGuard(SfxApplication::gMutex); + if ( !pApp ) + { + SfxApplication *pNew = new SfxApplication; + + //TODO/CLEANUP + //ist das Mutex-Handling OK? + static ::osl::Mutex aProtector; + ::osl::MutexGuard aGuard2( aProtector ); + + RTL_LOGFILE_CONTEXT( aLog, "sfx2 (mb93783) ::SfxApplication::SetApp" ); + pApp = pNew; + + // at the moment a bug may occur when Initialize_Impl returns FALSE, but this is only temporary because all code that may cause such a + // fault will be moved outside the SFX + pApp->Initialize_Impl(); + + ::framework::SetImageProducer( GetImage ); + ::framework::SetRefreshToolbars( RefreshToolbars ); + ::framework::SetToolBoxControllerCreator( SfxToolBoxControllerFactory ); + ::framework::SetStatusBarControllerCreator( SfxStatusBarControllerFactory ); + ::framework::SetDockingWindowCreator( SfxDockingWindowFactory ); + ::framework::SetIsDockingWindowVisible( IsDockingWindowVisible ); + ::framework::SetActivateToolPanel( &SfxViewFrame::ActivateToolPanel ); + + SfxHelp* pSfxHelp = new SfxHelp; + Application::SetHelp( pSfxHelp ); + if ( SvtHelpOptions().IsHelpTips() ) + Help::EnableQuickHelp(); + else + Help::DisableQuickHelp(); + if ( SvtHelpOptions().IsHelpTips() && SvtHelpOptions().IsExtendedHelp() ) + Help::EnableBalloonHelp(); + else + Help::DisableBalloonHelp(); + } + return pApp; +} + +SfxApplication::SfxApplication() + : pAppData_Impl( 0 ) +{ + RTL_LOGFILE_CONTEXT( aLog, "sfx2 (mb93783) ::SfxApplication::SfxApplication" ); + + SetName( DEFINE_CONST_UNICODE("StarOffice") ); + GetpApp()->SetPropertyHandler( GetOrCreatePropertyHandler() ); + + SvtViewOptions::AcquireOptions(); + + pAppData_Impl = new SfxAppData_Impl( this ); + pAppData_Impl->UpdateApplicationSettings( SvtMenuOptions().IsEntryHidingEnabled() ); + pAppData_Impl->m_xImeStatusWindow->init(); + pApp->PreInit(); + + RTL_LOGFILE_CONTEXT_TRACE( aLog, "{ initialize DDE" ); + +#ifdef DDE_AVAILABLE +#ifndef DBG_UTIL + InitializeDde(); +#else + if( !InitializeDde() ) + { + ByteString aStr( "Kein DDE-Service moeglich. Fehler: " ); + if( GetDdeService() ) + aStr += ByteString::CreateFromInt32(GetDdeService()->GetError()); + else + aStr += '?'; + DBG_ASSERT( sal_False, aStr.GetBuffer() ); + } +#endif +#endif + + if ( !InitLabelResMgr( "iso" ) ) + // no "iso" resource -> search for "ooo" resource + InitLabelResMgr( "ooo", true ); + pBasic = new BasicDLL; + + StarBASIC::SetGlobalErrorHdl( LINK( this, SfxApplication, GlobalBasicErrorHdl_Impl ) ); + + + + RTL_LOGFILE_CONTEXT_TRACE( aLog, "} initialize DDE" ); +} + +SfxApplication::~SfxApplication() +{ + Broadcast( SfxSimpleHint(SFX_HINT_DYING) ); + + SfxModule::DestroyModules_Impl(); + + // delete global options + SvtViewOptions::ReleaseOptions(); + delete pBasic; + + if ( !pAppData_Impl->bDowning ) + Deinitialize(); + + delete pAppData_Impl; + pApp = 0; +} + +//==================================================================== + +const String& SfxApplication::GetLastDir_Impl() const + +/* [Beschreibung] + + Interne Methode, mit der im SFx das zuletzt mit der Methode + <SfxApplication::SetLastDir_Impl()> gesetzte Verzeichnis + zurueckgegeben wird. + + Dieses ist i.d.R. das zuletzt durch den SfxFileDialog + angesprochene Verzeichnis. + + [Querverweis] + <SfxApplication::SetLastDir_Impl()> +*/ + +{ + return pAppData_Impl->aLastDir; +} + +const String& SfxApplication::GetLastSaveDirectory() const + +/* [Beschreibung] + + Wie <SfxApplication::GetLastDir_Impl()>, nur extern + + [Querverweis] + <SfxApplication::GetLastDir_Impl()> +*/ + +{ + return GetLastDir_Impl(); +} + +//-------------------------------------------------------------------- + +void SfxApplication::SetLastDir_Impl +( + const String& rNewDir /* kompletter Verzeichnis-Pfad als String */ + ) + +/* [Beschreibung] + + Interne Methode, mit der ein Verzeichnis-Pfad gesetzt wird, der + zuletzt (z.B. durch den SfxFileDialog) angesprochen wurde. + + [Querverweis] + <SfxApplication::GetLastDir_Impl()> +*/ + +{ + pAppData_Impl->aLastDir = rNewDir; +} + +//-------------------------------------------------------------------- + +void SfxApplication::ResetLastDir() +{ + String aEmpty; + pAppData_Impl->aLastDir = aEmpty; +} + +//-------------------------------------------------------------------- + +SfxDispatcher* SfxApplication::GetDispatcher_Impl() +{ + return pAppData_Impl->pViewFrame? pAppData_Impl->pViewFrame->GetDispatcher(): pAppData_Impl->pAppDispat; +} + +//-------------------------------------------------------------------- +void SfxApplication::SetViewFrame_Impl( SfxViewFrame *pFrame ) +{ + if ( pFrame != pAppData_Impl->pViewFrame ) + { + // get the containerframes ( if one of the frames is an InPlaceFrame ) + SfxViewFrame *pOldContainerFrame = pAppData_Impl->pViewFrame; + while ( pOldContainerFrame && pOldContainerFrame->GetParentViewFrame_Impl() ) + pOldContainerFrame = pOldContainerFrame->GetParentViewFrame_Impl(); + SfxViewFrame *pNewContainerFrame = pFrame; + while ( pNewContainerFrame && pNewContainerFrame->GetParentViewFrame_Impl() ) + pNewContainerFrame = pNewContainerFrame->GetParentViewFrame_Impl(); + + // DocWinActivate : both frames belong to the same TopWindow + // TopWinActivate : both frames belong to different TopWindows +// not used anymore! +// BOOL bDocWinActivate = pOldContainerFrame && pNewContainerFrame && +// pOldContainerFrame->GetTopViewFrame() == pNewContainerFrame->GetTopViewFrame(); + BOOL bTaskActivate = pOldContainerFrame != pNewContainerFrame; + + if ( pOldContainerFrame ) + { + if ( bTaskActivate ) + NotifyEvent( SfxEventHint( SFX_EVENT_DEACTIVATEDOC, GlobalEventConfig::GetEventName(STR_EVENT_DEACTIVATEDOC), pOldContainerFrame->GetObjectShell() ) ); + pOldContainerFrame->DoDeactivate( bTaskActivate, pFrame ); + + if( pOldContainerFrame->GetProgress() ) + pOldContainerFrame->GetProgress()->Suspend(); + } + + pAppData_Impl->pViewFrame = pFrame; + + //const SfxObjectShell* pSh = pViewFrame ? pViewFrame->GetObjectShell() : 0; + //if ( !pSh ) + //{ + // // otherwise BaseURL is set in activation of document + // INetURLObject aObject( SvtPathOptions().GetWorkPath() ); + // aObject.setFinalSlash(); + // INetURLObject::SetBaseURL( aObject.GetMainURL( INetURLObject::NO_DECODE ) ); + //} + + if( pNewContainerFrame ) + { + pNewContainerFrame->DoActivate( bTaskActivate ); + if ( bTaskActivate && pNewContainerFrame->GetObjectShell() ) + { + pNewContainerFrame->GetObjectShell()->PostActivateEvent_Impl( pNewContainerFrame ); + NotifyEvent(SfxEventHint(SFX_EVENT_ACTIVATEDOC, GlobalEventConfig::GetEventName(STR_EVENT_ACTIVATEDOC), pNewContainerFrame->GetObjectShell() ) ); + } + + SfxProgress *pProgress = pNewContainerFrame->GetProgress(); + if ( pProgress ) + { + if( pProgress->IsSuspended() ) + pProgress->Resume(); + else + pProgress->SetState( pProgress->GetState() ); + } + + if ( pAppData_Impl->pViewFrame->GetViewShell() ) + { + SfxDispatcher* pDisp = pAppData_Impl->pViewFrame->GetDispatcher(); + pDisp->Flush(); + pDisp->Update_Impl(sal_True); + } + } + } + + // even if the frame actually didn't change, ensure its document is forwarded + // to SfxObjectShell::SetCurrentComponent. + // Otherwise, the CurrentComponent might not be correct, in case it has meanwhile + // been reset to some other document, by some non-SFX component. + // #i49133# / 2007-12-19 / frank.schoenheit@sun.com + if ( pFrame && pFrame->GetViewShell() ) + pFrame->GetViewShell()->SetCurrentDocument(); +} + +//-------------------------------------------------------------------- + +short SfxApplication::QuerySave_Impl( SfxObjectShell& rDoc, sal_Bool /*bAutoSave*/ ) +{ + if ( !rDoc.IsModified() ) + return RET_NO; + + String aMsg( SfxResId( STR_ISMODIFIED ) ); + aMsg.SearchAndReplaceAscii( "%1", rDoc.GetTitle() ); + + SfxFrame& rFrame = SfxViewFrame::GetFirst(&rDoc)->GetFrame(); + rFrame.Appear(); + + WinBits nBits = WB_YES_NO_CANCEL | WB_DEF_NO; + QueryBox aBox( &rFrame.GetWindow(), nBits, aMsg ); + + return aBox.Execute(); +} + +//--------------------------------------------------------------------- + +ResMgr* SfxApplication::CreateResManager( const char *pPrefix ) +{ + String aMgrName = String::CreateFromAscii( pPrefix ); + return ResMgr::CreateResMgr(U2S(aMgrName)); +} + +//--------------------------------------------------------------------- + +SimpleResMgr* SfxApplication::CreateSimpleResManager() +{ + SimpleResMgr *pRet; + const AllSettings& rAllSettings = Application::GetSettings(); + ::com::sun::star::lang::Locale aLocale = rAllSettings.GetUILocale(); + pRet = new SimpleResMgr( CREATEVERSIONRESMGR_NAME(sfx), aLocale ); + + return pRet; +} + +//-------------------------------------------------------------------- + +ResMgr* SfxApplication::GetSfxResManager() +{ + return SfxResId::GetResMgr(); +} + +//-------------------------------------------------------------------- + +ResMgr* SfxApplication::GetLabelResManager() const +{ + return pAppData_Impl->pLabelResMgr; +} + +//-------------------------------------------------------------------- + +SimpleResMgr* SfxApplication::GetSimpleResManager() +{ + if ( !pAppData_Impl->pSimpleResManager ) + pAppData_Impl->pSimpleResManager = CreateSimpleResManager(); + return pAppData_Impl->pSimpleResManager; +} + +//------------------------------------------------------------------------ + +void SfxApplication::SetProgress_Impl +( + SfxProgress *pProgress + +) +{ + DBG_ASSERT( ( !pAppData_Impl->pProgress && pProgress ) || + ( pAppData_Impl->pProgress && !pProgress ), + "Progress acitivation/deacitivation mismatch" ); + + if ( pAppData_Impl->pProgress && pProgress ) + { + pAppData_Impl->pProgress->Suspend(); + pAppData_Impl->pProgress->UnLock(); + delete pAppData_Impl->pProgress; + } + + pAppData_Impl->pProgress = pProgress; +} + +//------------------------------------------------------------------------ + +sal_uInt16 SfxApplication::GetFreeIndex() +{ + return pAppData_Impl->aIndexBitSet.GetFreeIndex()+1; +} + +//------------------------------------------------------------------------ + +void SfxApplication::ReleaseIndex(sal_uInt16 i) +{ + pAppData_Impl->aIndexBitSet.ReleaseIndex(i-1); +} + +//-------------------------------------------------------------------- + +void SfxApplication::EnterAsynchronCall_Impl() +{ + ++pAppData_Impl->nAsynchronCalls; +} + +//-------------------------------------------------------------------- + +void SfxApplication::LeaveAsynchronCall_Impl() +{ + --pAppData_Impl->nAsynchronCalls; +} + +//-------------------------------------------------------------------- + +FASTBOOL SfxApplication::IsInAsynchronCall_Impl() const +{ + return pAppData_Impl->nAsynchronCalls > 0; +} + +//-------------------------------------------------------------------- + +Window* SfxApplication::GetTopWindow() const +{ + SfxWorkWindow* pWork = GetWorkWindow_Impl( SfxViewFrame::Current() ); + return pWork ? pWork->GetWindow() : NULL; +} + +//-------------------------------------------------------------------- + +uno::Reference< task::XStatusIndicator > SfxApplication::GetStatusIndicator() const +{ + if ( !pAppData_Impl->pViewFrame ) + return uno::Reference< task::XStatusIndicator >(); + + SfxViewFrame *pTop = pAppData_Impl->pViewFrame; + while ( pTop->GetParentViewFrame_Impl() ) + pTop = pTop->GetParentViewFrame_Impl(); + + return pTop->GetFrame().GetWorkWindow_Impl()->GetStatusIndicator(); +} + +SfxTbxCtrlFactArr_Impl& SfxApplication::GetTbxCtrlFactories_Impl() const +{ + return *pAppData_Impl->pTbxCtrlFac; +} + +SfxStbCtrlFactArr_Impl& SfxApplication::GetStbCtrlFactories_Impl() const +{ + return *pAppData_Impl->pStbCtrlFac; +} + +SfxMenuCtrlFactArr_Impl& SfxApplication::GetMenuCtrlFactories_Impl() const +{ + return *pAppData_Impl->pMenuCtrlFac; +} + +SfxViewFrameArr_Impl& SfxApplication::GetViewFrames_Impl() const +{ + return *pAppData_Impl->pViewFrames; +} + +SfxViewShellArr_Impl& SfxApplication::GetViewShells_Impl() const +{ + return *pAppData_Impl->pViewShells; +} + +SfxObjectShellArr_Impl& SfxApplication::GetObjectShells_Impl() const +{ + return *pAppData_Impl->pObjShells; +} + +void SfxApplication::Invalidate( USHORT nId ) +{ + for( SfxViewFrame* pFrame = SfxViewFrame::GetFirst(); pFrame; pFrame = SfxViewFrame::GetNext( *pFrame ) ) + Invalidate_Impl( pFrame->GetBindings(), nId ); +} + +#define DOSTRING( x ) #x +#define STRING( x ) DOSTRING( x ) + +typedef long (SAL_CALL *basicide_handle_basic_error)(void*); +typedef rtl_uString* (SAL_CALL *basicide_choose_macro)(void*, BOOL, rtl_uString*); +typedef void* (SAL_CALL *basicide_macro_organizer)(INT16); + +extern "C" { static void SAL_CALL thisModule() {} } + +IMPL_LINK( SfxApplication, GlobalBasicErrorHdl_Impl, StarBASIC*, pStarBasic ) +{ + // get basctl dllname + String sLibName = String::CreateFromAscii( STRING( DLL_NAME ) ); + sLibName.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "sfx" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "basctl" ) ) ); + ::rtl::OUString aLibName( sLibName ); + + // load module + oslModule handleMod = osl_loadModuleRelative( + &thisModule, aLibName.pData, 0 ); + + // get symbol + ::rtl::OUString aSymbol( RTL_CONSTASCII_USTRINGPARAM( "basicide_handle_basic_error" ) ); + basicide_handle_basic_error pSymbol = (basicide_handle_basic_error) osl_getFunctionSymbol( handleMod, aSymbol.pData ); + + // call basicide_handle_basic_error in basctl + long nRet = pSymbol( pStarBasic ); + + return nRet; +} + +sal_Bool SfxApplication::IsXScriptURL( const String& rScriptURL ) +{ + sal_Bool result = FALSE; + + ::com::sun::star::uno::Reference + < ::com::sun::star::lang::XMultiServiceFactory > xSMgr = + ::comphelper::getProcessServiceFactory(); + + ::com::sun::star::uno::Reference + < ::com::sun::star::uri::XUriReferenceFactory > + xFactory( xSMgr->createInstance( + ::rtl::OUString::createFromAscii( + "com.sun.star.uri.UriReferenceFactory" ) ), + ::com::sun::star::uno::UNO_QUERY ); + + if ( xFactory.is() ) + { + try + { + ::com::sun::star::uno::Reference + < ::com::sun::star::uri::XVndSunStarScriptUrl > + xUrl( xFactory->parse( rScriptURL ), + ::com::sun::star::uno::UNO_QUERY ); + + if ( xUrl.is() ) + { + result = TRUE; + } + } + catch ( ::com::sun::star::uno::RuntimeException& ) + { + // ignore, will just return FALSE + } + } + return result; +} + +::rtl::OUString +SfxApplication::ChooseScript() +{ + ::rtl::OUString aScriptURL; + + SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create(); + if ( pFact ) + { + OSL_TRACE("create selector dialog"); + + const SfxViewFrame* pViewFrame = SfxViewFrame::Current(); + const SfxFrame* pFrame = pViewFrame ? &pViewFrame->GetFrame() : NULL; + uno::Reference< frame::XFrame > xFrame( pFrame ? pFrame->GetFrameInterface() : uno::Reference< frame::XFrame >() ); + + AbstractScriptSelectorDialog* pDlg = + pFact->CreateScriptSelectorDialog( NULL, FALSE, xFrame ); + + OSL_TRACE("done, now exec it"); + + USHORT nRet = pDlg->Execute(); + + OSL_TRACE("has returned"); + + if ( nRet == RET_OK ) + { + aScriptURL = pDlg->GetScriptURL(); + } + + delete pDlg; + } + return aScriptURL; +} + +void SfxApplication::MacroOrganizer( INT16 nTabId ) +{ + // get basctl dllname + String sLibName = String::CreateFromAscii( STRING( DLL_NAME ) ); + sLibName.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "sfx" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "basctl" ) ) ); + ::rtl::OUString aLibName( sLibName ); + + // load module + oslModule handleMod = osl_loadModuleRelative( + &thisModule, aLibName.pData, 0 ); + + // get symbol + ::rtl::OUString aSymbol( RTL_CONSTASCII_USTRINGPARAM( "basicide_macro_organizer" ) ); + basicide_macro_organizer pSymbol = (basicide_macro_organizer) osl_getFunctionSymbol( handleMod, aSymbol.pData ); + + // call basicide_choose_macro in basctl + pSymbol( nTabId ); +} + |