xref: /AOO41X/main/sfx2/source/appl/appserv.cxx (revision ff0525f24f03981d56b7579b645949f111420994)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sfx2.hxx"
26 #include <com/sun/star/uno/Reference.hxx>
27 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
28 #include <com/sun/star/lang/IllegalArgumentException.hpp>
29 #include <com/sun/star/frame/DispatchResultEvent.hpp>
30 #include <com/sun/star/frame/DispatchResultState.hpp>
31 #include <com/sun/star/task/XJobExecutor.hpp>
32 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
33 #include <com/sun/star/frame/XDesktop.hpp>
34 #include <com/sun/star/frame/XDispatchHelper.hpp>
35 #include <com/sun/star/frame/XFramesSupplier.hpp>
36 #include <com/sun/star/util/XCloseable.hpp>
37 #include <com/sun/star/util/CloseVetoException.hpp>
38 #include <com/sun/star/frame/XLayoutManager.hpp>
39 #include <com/sun/star/document/XEmbeddedScripts.hpp>
40 #include <com/sun/star/embed/XStorage.hpp>
41 #include <com/sun/star/embed/ElementModes.hpp>
42 #include <com/sun/star/system/XSystemShellExecute.hpp>
43 #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
44 #include <com/sun/star/system/SystemShellExecuteException.hpp>
45 
46 #include <comphelper/processfactory.hxx>
47 #include <comphelper/storagehelper.hxx>
48 #include "comphelper/configurationhelper.hxx"
49 
50 #include <svtools/addresstemplate.hxx>
51 #include <svl/visitem.hxx>
52 #include <unotools/intlwrapper.hxx>
53 
54 #include <unotools/configmgr.hxx>
55 #include <tools/config.hxx>
56 #include <tools/diagnose_ex.h>
57 #include <vcl/msgbox.hxx>
58 #include <svl/intitem.hxx>
59 #include <svl/eitem.hxx>
60 #include <svl/stritem.hxx>
61 #include <basic/sbstar.hxx>
62 #include <basic/basmgr.hxx>
63 #include <basic/basrdll.hxx>
64 #include <svtools/sfxecode.hxx>
65 #include <svtools/ehdl.hxx>
66 #include <vcl/help.hxx>
67 #include <vcl/stdtext.hxx>
68 #include <rtl/ustrbuf.hxx>
69 
70 #include <unotools/pathoptions.hxx>
71 #include <unotools/moduleoptions.hxx>
72 #include <svtools/helpopt.hxx>
73 #include <toolkit/helper/vclunohelper.hxx>
74 #include <tools/shl.hxx>
75 #include <unotools/bootstrap.hxx>
76 #include <vos/process.hxx>
77 #include <rtl/bootstrap.hxx>
78 #include <cppuhelper/exc_hlp.hxx>
79 #include <rtl/ustrbuf.hxx>
80 
81 #include <com/sun/star/script/provider/XScriptProviderFactory.hpp>
82 #include <com/sun/star/frame/XModuleManager.hpp>
83 #include <com/sun/star/beans/XPropertySet.hpp>
84 
85 #include "frmload.hxx"
86 #include "referers.hxx"
87 #include <sfx2/app.hxx>
88 #include <sfx2/request.hxx>
89 #include <sfx2/dispatch.hxx>
90 #include <sfx2/bindings.hxx>
91 #include <sfx2/msg.hxx>
92 #include <sfx2/objface.hxx>
93 #include <sfx2/objitem.hxx>
94 #include <sfx2/objsh.hxx>
95 #include <sfx2/hintpost.hxx>
96 #include <sfx2/viewsh.hxx>
97 #include <sfx2/docfac.hxx>
98 #include <sfx2/docfile.hxx>
99 #include <sfx2/docfilt.hxx>
100 #include "docvor.hxx"
101 #include <sfx2/new.hxx>
102 #include <sfx2/templdlg.hxx>
103 #include "sfxtypes.hxx"
104 #include <sfx2/tabdlg.hxx>
105 #include "arrdecl.hxx"
106 #include "fltfnc.hxx"
107 #include <sfx2/sfx.hrc>
108 #include "app.hrc"
109 #include <sfx2/passwd.hxx>
110 #include "sfx2/sfxresid.hxx"
111 #include "arrdecl.hxx"
112 #include <sfx2/childwin.hxx>
113 #include "appdata.hxx"
114 #include "sfx2/minfitem.hxx"
115 #include <sfx2/event.hxx>
116 #include <sfx2/module.hxx>
117 #include <sfx2/viewfrm.hxx>
118 #include "sfxpicklist.hxx"
119 #include "imestatuswindow.hxx"
120 #include <sfx2/sfxdlg.hxx>
121 #include <sfx2/dialogs.hrc>
122 #include "sorgitm.hxx"
123 #include "sfx2/sfxhelp.hxx"
124 #include <tools/svlibrary.hxx>
125 
126 using namespace ::com::sun::star;
127 using namespace ::com::sun::star::beans;
128 using namespace ::com::sun::star::uno;
129 using namespace ::com::sun::star::frame;
130 using namespace ::com::sun::star::container;
131 using namespace ::com::sun::star::util;
132 using namespace ::com::sun::star::script;
133 using namespace ::com::sun::star::system;
134 using namespace ::com::sun::star::lang;
135 using namespace ::com::sun::star::document;
136 
137 namespace css = com::sun::star;
138 
139 //-------------------------------------------------------------------------
140 long QuitAgain_Impl( void* pObj, void* pArg )
141 {
142     SfxApplication* pApp = (SfxApplication*)pObj;
143     Timer* pTimer = (Timer*)pArg;
144     delete pTimer;
145     pApp->GetDispatcher_Impl()->Execute( SID_QUITAPP, SFX_CALLMODE_ASYNCHRON );
146     return 0;
147 }
148 
149 void SfxApplication::MiscExec_Impl( SfxRequest& rReq )
150 {
151     DBG_MEMTEST();
152     bool bDone = sal_False;
153     switch ( rReq.GetSlot() )
154     {
155         case SID_SETOPTIONS:
156         {
157             if( rReq.GetArgs() )
158                 SetOptions_Impl( *rReq.GetArgs() );
159             break;
160         }
161 
162         case SID_QUITAPP:
163         case SID_EXITANDRETURN:
164         case SID_LOGOUT:
165         {
166             // protect against reentrant calls
167             if ( pAppData_Impl->bInQuit )
168                 return;
169 
170             if ( rReq.GetSlot() == SID_LOGOUT )
171             {
172                 for ( SfxObjectShell *pObjSh = SfxObjectShell::GetFirst();
173                     pObjSh; pObjSh = SfxObjectShell::GetNext( *pObjSh ) )
174                 {
175                     if ( !pObjSh->IsModified() )
176                         continue;
177 
178                     SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pObjSh );
179                     if ( !pFrame || !pFrame->GetWindow().IsReallyVisible() )
180                         continue;
181 
182                     if ( pObjSh->PrepareClose(2) )
183                         pObjSh->SetModified( sal_False );
184                     else
185                         return;
186                 }
187 
188                 String aName = String::CreateFromAscii("vnd.sun.star.cmd:logout");
189                 SfxStringItem aNameItem( SID_FILE_NAME, aName );
190                 SfxStringItem aReferer( SID_REFERER, DEFINE_CONST_UNICODE( "private/user" ) );
191                 pAppData_Impl->pAppDispat->Execute( SID_OPENDOC, SFX_CALLMODE_SLOT, &aNameItem, &aReferer, 0L );
192                 return;
193             }
194 
195             // aus verschachtelten Requests nach 100ms nochmal probieren
196             if( Application::GetDispatchLevel() > 1 )
197             {
198                 /* Dont save the request for closing the application and try it later
199                    again. This is an UI bound functionality ... and the user will  try it again
200                    if the dialog is closed. But we shouldnt close the application automaticly
201                    if this dialog is closed by the user ...
202                    So we ignore this request now and wait for a new user decision.
203                 */
204                 DBG_TRACE1( "QueryExit => FALSE (DispatchLevel == %u)", Application::GetDispatchLevel() );
205                 return;
206             }
207 
208             // block reentrant calls
209             pAppData_Impl->bInQuit = sal_True;
210             Reference < XDesktop > xDesktop ( ::comphelper::getProcessServiceFactory()->createInstance( DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY );
211 
212             rReq.ForgetAllArgs();
213 
214             // if terminate() failed, pAppData_Impl->bInQuit will now be sal_False, allowing further calls of SID_QUITAPP
215             sal_Bool bTerminated = xDesktop->terminate();
216             if (!bTerminated)
217                 // if terminate() was successful, SfxApplication is now dead!
218                 pAppData_Impl->bInQuit = sal_False;
219 
220             // Returnwert setzten, ggf. terminieren
221             rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), bTerminated ) );
222             return;
223         }
224 
225         case SID_CONFIG:
226         case SID_TOOLBOXOPTIONS:
227         case SID_CONFIGSTATUSBAR:
228         case SID_CONFIGMENU:
229         case SID_CONFIGACCEL:
230         case SID_CONFIGEVENT:
231         {
232             SfxAbstractDialogFactory* pFact =
233                 SfxAbstractDialogFactory::Create();
234 
235             if ( pFact )
236             {
237                 SFX_REQUEST_ARG(rReq, pStringItem,
238                     SfxStringItem, SID_CONFIG, sal_False);
239 
240                 SfxItemSet aSet(
241                     GetPool(), SID_CONFIG, SID_CONFIG );
242 
243                 if ( pStringItem )
244                 {
245                     aSet.Put( SfxStringItem(
246                         SID_CONFIG, pStringItem->GetValue() ) );
247                 }
248 
249                 Reference< XFrame > xFrame;
250                 const SfxItemSet* pIntSet = rReq.GetInternalArgs_Impl();
251                 SFX_ITEMSET_ARG( pIntSet, pFrameItem, SfxUnoFrameItem, SID_FILLFRAME, sal_False );
252                 if ( pFrameItem )
253                     xFrame = pFrameItem->GetFrame();
254 
255                 SfxAbstractTabDialog* pDlg = pFact->CreateTabDialog(
256                     RID_SVXDLG_CUSTOMIZE,
257                     NULL, &aSet, xFrame );
258 
259                 if ( pDlg )
260                 {
261                     const short nRet = pDlg->Execute();
262 
263                     if ( nRet )
264                         bDone = sal_True;
265 
266                     delete pDlg;
267                 }
268             }
269             break;
270         }
271 
272         case SID_CLOSEDOCS:
273         case SID_CLOSEWINS:
274         {
275 
276             Reference < XFramesSupplier > xDesktop ( ::comphelper::getProcessServiceFactory()->createInstance( DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY );
277             Reference< XIndexAccess > xTasks( xDesktop->getFrames(), UNO_QUERY );
278             if ( !xTasks.is() )
279                 break;
280 
281             sal_Int32 n=0;
282             do
283             {
284                 if ( xTasks->getCount() <= n )
285                     break;
286 
287                 Any aAny = xTasks->getByIndex(n);
288                 Reference < XCloseable > xTask;
289                 aAny >>= xTask;
290                 try
291                 {
292                     xTask->close(sal_True);
293                     n++;
294                 }
295                 catch( CloseVetoException& )
296                 {
297                 }
298             }
299             while( sal_True );
300 
301             sal_Bool bOk = ( n == 0);
302             rReq.SetReturnValue( SfxBoolItem( 0, bOk ) );
303             bDone = sal_True;
304             break;
305         }
306 
307         case SID_SAVEDOCS:
308         {
309             sal_Bool bOK = sal_True;
310             sal_Bool bTmpDone = sal_True;
311             for ( SfxObjectShell *pObjSh = SfxObjectShell::GetFirst();
312                   pObjSh;
313                   pObjSh = SfxObjectShell::GetNext( *pObjSh ) )
314             {
315                 SfxRequest aReq( SID_SAVEDOC, 0, pObjSh->GetPool() );
316                 if ( pObjSh->IsModified() )
317                 {
318                     pObjSh->ExecuteSlot( aReq );
319                     SfxBoolItem *pItem = PTR_CAST( SfxBoolItem, aReq.GetReturnValue() );
320                     bTmpDone = aReq.IsDone();
321                     if ( !pItem || !pItem->GetValue() )
322                         bOK = sal_False;
323                 }
324             }
325 
326             rReq.SetReturnValue( SfxBoolItem( 0, bOK ) );
327             rReq.Done();
328             break;
329         }
330 
331         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
332         case SID_HELPINDEX:
333         case SID_HELP_SUPPORTPAGE:
334         {
335             Help* pHelp = Application::GetHelp();
336             if ( pHelp )
337             {
338                 if ( rReq.GetSlot() == SID_HELP_SUPPORTPAGE )
339                 {
340                     // show Support page with new URL
341                     // Create a dummy Help URL to get the Language and System
342                     // but don't use a real command, otherwise we may get an anchor
343                     rtl::OUString sEmpty;
344                     rtl::OUString sTmp( SfxHelp::CreateHelpURL( sEmpty, sEmpty ) );
345 
346                     rtl::OUStringBuffer aBuff;
347                     aBuff.appendAscii( RTL_CONSTASCII_STRINGPARAM( "vnd.sun.star.help://shared/text/shared/05/00000001.xhp" ) );
348                     aBuff.append( sTmp.copy( sTmp.indexOf( sal_Unicode( '?' ) ) ) );
349                     aBuff.appendAscii( RTL_CONSTASCII_STRINGPARAM( "&UseDB=no" ) );
350 
351                     pHelp->Start( aBuff.makeStringAndClear(), NULL );
352                 }
353                 else
354                     pHelp->Start( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:HelpIndex")), NULL ); // show start page
355                 bDone = sal_True;
356             }
357             break;
358         }
359 
360         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
361         case SID_HELPTIPS:
362         {
363             // Parameter aus werten
364             SFX_REQUEST_ARG(rReq, pOnItem, SfxBoolItem, SID_HELPTIPS, sal_False);
365             bool bOn = pOnItem
366                             ? ((SfxBoolItem*)pOnItem)->GetValue()
367                             : !Help::IsQuickHelpEnabled();
368 
369             // ausf"uhren
370             if ( bOn )
371                 Help::EnableQuickHelp();
372             else
373                 Help::DisableQuickHelp();
374             SvtHelpOptions().SetHelpTips( bOn );
375             Invalidate(SID_HELPTIPS);
376             bDone = sal_True;
377 
378             // ggf. recorden
379             if ( !rReq.IsAPI() )
380                 rReq.AppendItem( SfxBoolItem( SID_HELPTIPS, bOn) );
381             break;
382         }
383         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
384         case SID_EXTENDEDHELP:
385         {
386             Help::StartExtHelp();
387             break;
388         }
389         case SID_HELPBALLOONS:
390         {
391             // Parameter auswerten
392             SFX_REQUEST_ARG(rReq, pOnItem, SfxBoolItem, SID_HELPBALLOONS, sal_False);
393             bool bOn = pOnItem
394                             ? ((SfxBoolItem*)pOnItem)->GetValue()
395                             : !Help::IsBalloonHelpEnabled();
396 
397             // ausf"uhren
398             if ( bOn )
399                 Help::EnableBalloonHelp();
400             else
401                 Help::DisableBalloonHelp();
402             SvtHelpOptions().SetExtendedHelp( bOn );
403             Invalidate(SID_HELPBALLOONS);
404             bDone = sal_True;
405 
406             // ggf. recorden
407             if ( !rReq.IsAPI() )
408                 rReq.AppendItem( SfxBoolItem( SID_HELPBALLOONS, bOn) );
409             break;
410         }
411 
412         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
413         case SID_HELP_PI:
414         {
415             SvtHelpOptions aHelpOpt;
416             SFX_REQUEST_ARG(rReq, pOnItem, SfxBoolItem, SID_HELP_PI, sal_False);
417             sal_Bool bOn = pOnItem
418                             ? ((SfxBoolItem*)pOnItem)->GetValue()
419                             : !aHelpOpt.IsHelpAgentAutoStartMode();
420             aHelpOpt.SetHelpAgentAutoStartMode( bOn );
421             Invalidate(SID_HELP_PI);
422             bDone = sal_True;
423             break;
424         }
425 
426         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
427         case SID_ABOUT:
428         {
429             SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
430             if ( pFact )
431             {
432                 VclAbstractDialog* pDlg = pFact->CreateVclDialog( 0, RID_DEFAULTABOUT );
433                 pDlg->Execute();
434                 delete pDlg;
435                 bDone = sal_True;
436             }
437             break;
438         }
439 
440         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
441         case SID_ORGANIZER:
442         {
443             SfxTemplateOrganizeDlg  *pDlg =
444                 new SfxTemplateOrganizeDlg(NULL);
445             pDlg->Execute();
446             delete pDlg;
447             bDone = sal_True;
448             break;
449         }
450 
451         case SID_TEMPLATE_ADDRESSBOKSOURCE:
452         {
453             svt::AddressBookSourceDialog aDialog(GetTopWindow(), ::comphelper::getProcessServiceFactory());
454             aDialog.Execute();
455             bDone = sal_True;
456             break;
457         }
458 
459         case SID_BASICSTOP:
460             StarBASIC::Stop();
461             break;
462 
463         case SID_BASICBREAK :
464             BASIC_DLL()->BasicBreak();
465             break;
466 
467         case SID_CRASH :
468         {
469             // Provoke a crash:
470             char * crash = 0;
471             *crash = 0;
472             break;
473         }
474 
475         case SID_SHOW_IME_STATUS_WINDOW:
476             if (pAppData_Impl->m_xImeStatusWindow->canToggle())
477             {
478                 SfxBoolItem const * pItem = static_cast< SfxBoolItem const * >(
479                     rReq.GetArg(SID_SHOW_IME_STATUS_WINDOW, false,
480                                 TYPE(SfxBoolItem)));
481                 bool bShow = pItem == 0
482                     ? !pAppData_Impl->m_xImeStatusWindow->isShowing()
483                     : ( pItem->GetValue() == sal_True );
484                 pAppData_Impl->m_xImeStatusWindow->show(bShow);
485                 if (pItem == 0)
486                     rReq.AppendItem(SfxBoolItem(SID_SHOW_IME_STATUS_WINDOW,
487                                                 bShow));
488             }
489             bDone = true;
490             break;
491 
492         case SID_AVAILABLE_TOOLBARS:
493         {
494             SfxStringItem const * pToolbarName = static_cast< SfxStringItem const *>(
495                     rReq.GetArg(SID_AVAILABLE_TOOLBARS, false, TYPE(SfxStringItem)));
496 
497             if ( pToolbarName )
498             {
499                 com::sun::star::uno::Reference< com::sun::star::frame::XFrame > xFrame;
500                 Reference < XFramesSupplier > xDesktop ( ::comphelper::getProcessServiceFactory()->createInstance(
501                                                             DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY );
502                 xFrame = xDesktop->getActiveFrame();
503 
504                 Reference< com::sun::star::beans::XPropertySet > xPropSet( xFrame, UNO_QUERY );
505                 Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
506                 if ( xPropSet.is() )
507                 {
508                     try
509                     {
510                         Any aValue = xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
511                         aValue >>= xLayoutManager;
512                     }
513                     catch ( ::com::sun::star::uno::RuntimeException& e )
514                     {
515                         throw e;
516                     }
517                     catch ( ::com::sun::star::uno::Exception& )
518                     {
519                     }
520                 }
521 
522                 if ( xLayoutManager.is() )
523                 {
524                     rtl::OUString aToolbarResName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/" ));
525                     rtl::OUStringBuffer aBuf( aToolbarResName );
526                     aBuf.append( pToolbarName->GetValue() );
527 
528                     // Parameter auswerten
529                     rtl::OUString aToolbarName( aBuf.makeStringAndClear() );
530                     sal_Bool bShow( !xLayoutManager->isElementVisible( aToolbarName ));
531 
532                     if ( bShow )
533                     {
534                         xLayoutManager->createElement( aToolbarName );
535                         xLayoutManager->showElement( aToolbarName );
536                     }
537                     else
538                         xLayoutManager->hideElement( aToolbarName );
539                 }
540             }
541 
542             bDone = true;
543             break;
544         }
545 
546         default:
547             break;
548     }
549 
550     if ( bDone )
551         rReq.Done();
552 }
553 
554 //--------------------------------------------------------------------
555 
556 void SfxApplication::MiscState_Impl(SfxItemSet &rSet)
557 {
558     DBG_MEMTEST();
559 
560     LocaleDataWrapper aLocaleWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
561     const sal_uInt16 *pRanges = rSet.GetRanges();
562     DBG_ASSERT(pRanges && *pRanges, "Set ohne Bereich");
563     while ( *pRanges )
564     {
565         for(sal_uInt16 nWhich = *pRanges++; nWhich <= *pRanges; ++nWhich)
566         {
567             switch(nWhich)
568             {
569                 case SID_TEMPLATE_ADDRESSBOKSOURCE:
570                     if ( !SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SDATABASE) )
571                         rSet.Put(SfxVisibilityItem(nWhich, sal_False));
572                     break;
573                 case SID_EXITANDRETURN:
574                 case SID_QUITAPP:
575                 {
576                     if ( pAppData_Impl->nDocModalMode )
577                         rSet.DisableItem(nWhich);
578                     else
579                         rSet.Put(SfxStringItem(nWhich, String(SfxResId(STR_QUITAPP))));
580                     break;
581                 }
582 
583                 case SID_BASICSTOP:
584                     if ( !StarBASIC::IsRunning() )
585                         rSet.DisableItem(nWhich);
586                     break;
587 
588                 case SID_HELPTIPS:
589                 {
590                     rSet.Put( SfxBoolItem( SID_HELPTIPS, Help::IsQuickHelpEnabled() ) );
591                 }
592                 break;
593                 case SID_HELPBALLOONS:
594                 {
595                     rSet.Put( SfxBoolItem( SID_HELPBALLOONS, Help::IsBalloonHelpEnabled() ) );
596                 }
597                 break;
598                 case SID_HELP_PI:
599                 {
600                     rSet.Put( SfxBoolItem( SID_HELP_PI, SvtHelpOptions().IsHelpAgentAutoStartMode() ) );
601                 }
602                 break;
603 
604                 case SID_EXTENDEDHELP:
605                 {
606                 }
607                 break;
608 
609                 case SID_CLOSEDOCS:
610                 case SID_CLOSEWINS:
611                 {
612                     Reference < XFramesSupplier > xDesktop ( ::comphelper::getProcessServiceFactory()->createInstance( DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY );
613                     Reference< XIndexAccess > xTasks( xDesktop->getFrames(), UNO_QUERY );
614                     if ( !xTasks.is() || !xTasks->getCount() )
615                         rSet.DisableItem(nWhich);
616                     break;
617                 }
618 
619                 case SID_SAVEDOCS:
620                 {
621                     sal_Bool bModified = sal_False;
622                     for ( SfxObjectShell *pObjSh = SfxObjectShell::GetFirst();
623                           pObjSh;
624                           pObjSh = SfxObjectShell::GetNext( *pObjSh ) )
625                     {
626                         if ( pObjSh->IsModified() )
627                         {
628                             bModified = sal_True;
629                             break;
630                         }
631                     }
632 
633                     if ( !bModified )
634                         rSet.DisableItem( nWhich );
635                     break;
636                 }
637 
638                 case SID_SHOW_IME_STATUS_WINDOW:
639                     if (pAppData_Impl->m_xImeStatusWindow->canToggle())
640                         rSet.Put(SfxBoolItem(
641                                      SID_SHOW_IME_STATUS_WINDOW,
642                                      pAppData_Impl->m_xImeStatusWindow->
643                                          isShowing()));
644                     else
645                         rSet.DisableItem(SID_SHOW_IME_STATUS_WINDOW);
646                     break;
647 
648                 default:
649                     break;
650             }
651         }
652 
653         ++pRanges;
654     }
655 }
656 
657 typedef rtl_uString* (SAL_CALL *basicide_choose_macro)(XModel*, sal_Bool, rtl_uString*);
658 typedef void (SAL_CALL *basicide_macro_organizer)( sal_Int16 );
659 
660 #define DOSTRING( x )                       #x
661 #define STRING( x )                         DOSTRING( x )
662 
663 extern "C" { static void SAL_CALL thisModule() {} }
664 
665 ::rtl::OUString ChooseMacro( const Reference< XModel >& rxLimitToDocument, sal_Bool bChooseOnly, const ::rtl::OUString& rMacroDesc = ::rtl::OUString() )
666 {
667     // get basctl dllname
668     static ::rtl::OUString aLibName( RTL_CONSTASCII_USTRINGPARAM( SVLIBRARY( "basctl" ) ) );
669 
670     // load module
671     oslModule handleMod = osl_loadModuleRelative(
672         &thisModule, aLibName.pData, 0 );
673 
674     // get symbol
675     ::rtl::OUString aSymbol( RTL_CONSTASCII_USTRINGPARAM( "basicide_choose_macro" ) );
676     basicide_choose_macro pSymbol = (basicide_choose_macro) osl_getFunctionSymbol( handleMod, aSymbol.pData );
677 
678     // call basicide_choose_macro in basctl
679     rtl_uString* pScriptURL = pSymbol( rxLimitToDocument.get(), bChooseOnly, rMacroDesc.pData );
680     ::rtl::OUString aScriptURL( pScriptURL );
681     rtl_uString_release( pScriptURL );
682     return aScriptURL;
683 }
684 
685 void MacroOrganizer( sal_Int16 nTabId )
686 {
687     // get basctl dllname
688     static ::rtl::OUString aLibName( RTL_CONSTASCII_USTRINGPARAM( SVLIBRARY( "basctl" ) ) );
689 
690     // load module
691     oslModule handleMod = osl_loadModuleRelative(
692         &thisModule, aLibName.pData, 0 );
693 
694     // get symbol
695     ::rtl::OUString aSymbol( RTL_CONSTASCII_USTRINGPARAM( "basicide_macro_organizer" ) );
696     basicide_macro_organizer pSymbol = (basicide_macro_organizer) osl_getFunctionSymbol( handleMod, aSymbol.pData );
697 
698     // call basicide_macro_organizer in basctl
699     pSymbol( nTabId );
700 }
701 
702 #define RID_ERRBOX_MODULENOTINSTALLED     (RID_OFA_START + 72)
703 
704 ResMgr* SfxApplication::GetOffResManager_Impl()
705 {
706     if ( !pAppData_Impl->pOfaResMgr )
707         pAppData_Impl->pOfaResMgr = CreateResManager( "ofa");
708     return pAppData_Impl->pOfaResMgr;
709 }
710 
711 namespace
712 {
713     Window* lcl_getDialogParent( const Reference< XFrame >& _rxFrame, Window* _pFallback )
714     {
715         if ( !_rxFrame.is() )
716             return _pFallback;
717 
718         try
719         {
720             Reference< awt::XWindow > xContainerWindow( _rxFrame->getContainerWindow(), UNO_SET_THROW );
721             Window* pWindow = VCLUnoHelper::GetWindow( xContainerWindow );
722             OSL_ENSURE( pWindow, "lcl_getDialogParent: cool, somebody implemented a VCL-less toolkit!" );
723 
724             if ( pWindow )
725                 return pWindow->GetSystemWindow();
726         }
727         catch( const Exception& )
728         {
729             DBG_UNHANDLED_EXCEPTION();
730         }
731         return _pFallback;
732     }
733 
734     const ::rtl::OUString& lcl_getBasicIDEServiceName()
735     {
736         static const ::rtl::OUString s_sBasicName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.script.BasicIDE" ) );
737         return s_sBasicName;
738     }
739 
740     SfxViewFrame* lcl_getBasicIDEViewFrame( SfxObjectShell* i_pBasicIDE )
741     {
742         SfxViewFrame* pView = SfxViewFrame::GetFirst( i_pBasicIDE );
743         while ( pView )
744         {
745             if ( pView->GetObjectShell()->GetFactory().GetDocumentServiceName() == lcl_getBasicIDEServiceName() )
746                 break;
747             pView = SfxViewFrame::GetNext( *pView, i_pBasicIDE );
748         }
749         return pView;
750     }
751     Reference< XFrame > lcl_findStartModuleFrame( const ::comphelper::ComponentContext& i_rContext )
752     {
753         try
754         {
755             Reference < XFramesSupplier > xSupplier( i_rContext.createComponent( "com.sun.star.frame.Desktop" ), UNO_QUERY_THROW );
756             Reference < XIndexAccess > xContainer( xSupplier->getFrames(), UNO_QUERY_THROW );
757 
758             Reference< XModuleManager > xCheck( i_rContext.createComponent( "com.sun.star.frame.ModuleManager" ), UNO_QUERY_THROW );
759 
760             sal_Int32 nCount = xContainer->getCount();
761             for ( sal_Int32 i=0; i<nCount; ++i )
762             {
763                 try
764                 {
765                     Reference < XFrame > xFrame( xContainer->getByIndex(i), UNO_QUERY_THROW );
766                     ::rtl::OUString sModule = xCheck->identify( xFrame );
767                     if ( sModule.equalsAscii( "com.sun.star.frame.StartModule" ) )
768                         return xFrame;
769                 }
770                 catch( const UnknownModuleException& )
771                 {
772                     // silence
773                 }
774                 catch(const Exception&)
775                 {
776                     // re-throw, caught below
777                     throw;
778                 }
779             }
780         }
781         catch( const Exception& )
782         {
783                DBG_UNHANDLED_EXCEPTION();
784         }
785         return NULL;
786     }
787 }
788 
789 static ::rtl::OUString getConfigurationStringValue(
790     const ::rtl::OUString& rPackage,
791     const ::rtl::OUString& rRelPath,
792     const ::rtl::OUString& rKey,
793     const ::rtl::OUString& rDefaultValue )
794 {
795     ::rtl::OUString aDefVal( rDefaultValue );
796 
797     try
798     {
799         ::comphelper::ConfigurationHelper::readDirectKey(
800             comphelper::getProcessServiceFactory(),
801             rPackage,
802             rRelPath,
803             rKey,
804             ::comphelper::ConfigurationHelper::E_READONLY) >>= aDefVal;
805     }
806     catch(const com::sun::star::uno::RuntimeException& exRun)
807     { throw exRun; }
808     catch(const com::sun::star::uno::Exception&)
809     {}
810 
811     return aDefVal;
812 }
813 
814 void SfxApplication::OfaExec_Impl( SfxRequest& rReq )
815 {
816     DBG_MEMTEST();
817     switch ( rReq.GetSlot() )
818     {
819         case SID_OPTIONS_TREEDIALOG:
820         {
821             String sPageURL;
822             SFX_REQUEST_ARG( rReq, pURLItem, SfxStringItem, SID_OPTIONS_PAGEURL, sal_False );
823             if ( pURLItem )
824                 sPageURL = pURLItem->GetValue();
825             const SfxItemSet* pArgs = rReq.GetInternalArgs_Impl();
826             const SfxPoolItem* pItem = NULL;
827             Reference < XFrame > xFrame;
828             if ( pArgs && pArgs->GetItemState( SID_FILLFRAME, sal_False, &pItem ) == SFX_ITEM_SET )
829             {
830                 OSL_ENSURE( pItem->ISA( SfxUnoFrameItem ), "SfxApplication::OfaExec_Impl: XFrames are to be transported via SfxUnoFrameItem by now!" );
831                 xFrame = static_cast< const SfxUnoFrameItem*>( pItem )->GetFrame();
832             }
833             SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
834             if ( pFact )
835             {
836                 VclAbstractDialog* pDlg =
837                     pFact->CreateFrameDialog( NULL, xFrame, rReq.GetSlot(), sPageURL );
838                 pDlg->Execute();
839                 delete pDlg;
840                 SfxViewFrame* pView = SfxViewFrame::GetFirst();
841                 while ( pView )
842                 {
843                     pView->GetBindings().InvalidateAll(sal_False);
844                     pView = SfxViewFrame::GetNext( *pView );
845                 }
846             }
847             break;
848         }
849 
850         case SID_MORE_DICTIONARIES:
851         {
852             try
853             {
854                 uno::Reference< lang::XMultiServiceFactory > xSMGR =
855                     ::comphelper::getProcessServiceFactory();
856                 uno::Reference< css::system::XSystemShellExecute > xSystemShell(
857                     xSMGR->createInstance( DEFINE_CONST_UNICODE("com.sun.star.system.SystemShellExecute" ) ),
858                     uno::UNO_QUERY_THROW );
859 
860                 // read repository URL from configuration
861                 ::rtl::OUString sTemplRepoURL =
862                     getConfigurationStringValue(
863                         ::rtl::OUString::createFromAscii("org.openoffice.Office.Common"),
864                         ::rtl::OUString::createFromAscii("Dictionaries"),
865                         ::rtl::OUString::createFromAscii("RepositoryURL"),
866                         ::rtl::OUString());
867 
868                 if ( xSystemShell.is() && sTemplRepoURL.getLength() > 0 )
869                 {
870                     ::rtl::OUStringBuffer aURLBuf( sTemplRepoURL );
871                     aURLBuf.appendAscii( "?" );
872                     aURLBuf.appendAscii( "lang=" );
873 
874                     // read locale from configuration
875                     ::rtl::OUString sLocale = getConfigurationStringValue(
876                         ::rtl::OUString::createFromAscii("org.openoffice.Setup"),
877                         ::rtl::OUString::createFromAscii("L10N"),
878                         ::rtl::OUString::createFromAscii("ooLocale"),
879                         ::rtl::OUString::createFromAscii("en-US"));
880 
881                     aURLBuf.append( sLocale );
882                     xSystemShell->execute(
883                         aURLBuf.makeStringAndClear(),
884                         ::rtl::OUString(),
885                         css::system::SystemShellExecuteFlags::DEFAULTS );
886                 }
887             }
888             catch( const ::com::sun::star::uno::Exception& )
889             {
890                 DBG_ERRORFILE( "SfxApplication::OfaExec_Impl(SID_MORE_DICTIONARIES): caught an exception!" );
891             }
892             break;
893         }
894 
895         case SID_BASICIDE_APPEAR:
896         {
897             SfxViewFrame* pView = lcl_getBasicIDEViewFrame( NULL );
898             if ( !pView )
899             {
900                 SfxObjectShell* pBasicIDE = SfxObjectShell::CreateObject( lcl_getBasicIDEServiceName() );
901                 pBasicIDE->DoInitNew( 0 );
902                 pBasicIDE->SetModified( sal_False );
903                 try
904                 {
905                     // load the Basic IDE via direct access to the SFX frame loader. A generic loadComponentFromURL
906                     // (which could be done via SfxViewFrame::LoadDocumentIntoFrame) is not feasible here, since the Basic IDE
907                     // does not really play nice with the framework's concept. For instance, it is a "singleton document",
908                     // which conflicts, at the latest, with the framework's concept of loading into _blank frames.
909                     // So, since we know that our frame loader can handle it, we skip the generic framework loader
910                     // mechanism, and the type detection (which doesn't know about the Basic IDE).
911                     ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
912                     Reference< XSynchronousFrameLoader > xLoader( aContext.createComponent(
913                         SfxFrameLoader_Impl::impl_getStaticImplementationName() ), UNO_QUERY_THROW );
914                     ::comphelper::NamedValueCollection aLoadArgs;
915                     aLoadArgs.put( "Model", pBasicIDE->GetModel() );
916                     aLoadArgs.put( "URL", ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:factory/sbasic" ) ) );
917 
918                     Reference< XFrame > xTargetFrame( lcl_findStartModuleFrame( aContext ) );
919                     if ( !xTargetFrame.is() )
920                         xTargetFrame = SfxFrame::CreateBlankFrame();
921                     ENSURE_OR_THROW( xTargetFrame.is(), "could not obtain a frameto load the Basic IDE into!" );
922 
923                     xLoader->load( aLoadArgs.getPropertyValues(), xTargetFrame );
924                 }
925                 catch( const Exception& )
926                 {
927                     DBG_UNHANDLED_EXCEPTION();
928                 }
929 
930                 pView = lcl_getBasicIDEViewFrame( pBasicIDE );
931                 if ( pView )
932                     pView->SetName( String( RTL_CONSTASCII_USTRINGPARAM( "BASIC:1" ) ) );
933             }
934 
935             if ( pView )
936                 pView->GetFrame().Appear();
937 
938             const SfxItemSet* pArgs = rReq.GetArgs();
939             if ( pArgs && pView )
940             {
941                 SfxViewShell* pViewShell = pView->GetViewShell();
942                 SfxObjectShell* pObjShell = pView->GetObjectShell();
943                 if ( pViewShell && pObjShell )
944                 {
945                     SfxRequest aReq( SID_BASICIDE_SHOWWINDOW, SFX_CALLMODE_SYNCHRON, pObjShell->GetPool() );
946                     aReq.SetArgs( *pArgs );
947                     pViewShell->ExecuteSlot( aReq );
948                 }
949             }
950 
951             rReq.Done();
952         }
953         break;
954 
955         case SID_BASICCHOOSER:
956         {
957             const SfxItemSet* pArgs = rReq.GetArgs();
958             const SfxPoolItem* pItem;
959             sal_Bool bChooseOnly = sal_False;
960             Reference< XModel > xLimitToModel;
961             if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_RECORDMACRO, sal_False, &pItem) )
962             {
963                 sal_Bool bRecord = ((SfxBoolItem*)pItem)->GetValue();
964                 if ( bRecord )
965                 {
966                     // !Hack
967                     bChooseOnly = sal_False;
968                     SfxObjectShell* pCurrentShell = SfxObjectShell::Current();
969                     OSL_ENSURE( pCurrentShell, "macro recording outside an SFX document?" );
970                     if ( pCurrentShell )
971                         xLimitToModel = pCurrentShell->GetModel();
972                 }
973             }
974 
975             rReq.SetReturnValue( SfxStringItem( rReq.GetSlot(), ChooseMacro( xLimitToModel, bChooseOnly ) ) );
976             rReq.Done();
977         }
978         break;
979 
980         case SID_MACROORGANIZER:
981         {
982             OSL_TRACE("handling SID_MACROORGANIZER");
983             const SfxItemSet* pArgs = rReq.GetArgs();
984             const SfxPoolItem* pItem;
985             sal_Int16 nTabId = 0;
986             if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_MACROORGANIZER, sal_False, &pItem) )
987             {
988                 nTabId = ((SfxUInt16Item*)pItem)->GetValue();
989             }
990 
991             SfxApplication::MacroOrganizer( nTabId );
992             rReq.Done();
993         }
994         break;
995 
996         case SID_RUNMACRO:
997         {
998             SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
999             OSL_TRACE("SfxApplication::OfaExec_Impl: case ScriptOrg");
1000 
1001             Reference< XFrame > xFrame;
1002             const SfxItemSet* pIntSet = rReq.GetInternalArgs_Impl();
1003             SFX_ITEMSET_ARG( pIntSet, pFrameItem, SfxUnoFrameItem, SID_FILLFRAME, sal_False );
1004             if ( pFrameItem )
1005                 xFrame = pFrameItem->GetFrame();
1006 
1007             if ( !xFrame.is() )
1008             {
1009                 const SfxViewFrame* pViewFrame = SfxViewFrame::Current();
1010                 if ( pViewFrame )
1011                     xFrame = pViewFrame->GetFrame().GetFrameInterface();
1012             }
1013 
1014             do  // artificial loop for flow control
1015             {
1016                 AbstractScriptSelectorDialog* pDlg = pFact->CreateScriptSelectorDialog(
1017                     lcl_getDialogParent( xFrame, GetTopWindow() ), sal_False, xFrame );
1018                 OSL_ENSURE( pDlg, "SfxApplication::OfaExec_Impl( SID_RUNMACRO ): no dialog!" );
1019                 if ( !pDlg )
1020                     break;
1021                 pDlg->SetRunLabel();
1022 
1023                 short nDialogResult = pDlg->Execute();
1024                 if ( !nDialogResult )
1025                     break;
1026 
1027                 Sequence< Any > args;
1028                 Sequence< sal_Int16 > outIndex;
1029                 Sequence< Any > outArgs;
1030                 Any ret;
1031 
1032                 Reference< XInterface > xScriptContext;
1033 
1034                 Reference< XController > xController;
1035                 if ( xFrame.is() )
1036                     xController = xFrame->getController();
1037                 if ( xController.is() )
1038                     xScriptContext = xController->getModel();
1039                 if ( !xScriptContext.is() )
1040                     xScriptContext = xController;
1041 
1042                 SfxObjectShell::CallXScript( xScriptContext, pDlg->GetScriptURL(), args, ret, outIndex, outArgs );
1043             }
1044             while ( false );
1045             rReq.Done();
1046         }
1047         break;
1048 
1049         case SID_SCRIPTORGANIZER:
1050         {
1051             SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
1052             OSL_TRACE("SfxApplication::OfaExec_Impl: case ScriptOrg");
1053             const SfxItemSet* pArgs = rReq.GetArgs();
1054             const SfxPoolItem* pItem;
1055             String aLanguage;
1056             if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_SCRIPTORGANIZER, sal_False, &pItem) )
1057             {
1058                 aLanguage = ((SfxScriptOrganizerItem*)pItem)->getLanguage();
1059             }
1060 
1061             ::rtl::OUString aLang( aLanguage );
1062             OSL_TRACE("SfxApplication::OfaExec_Impl: about to create dialog for: %s", ::rtl::OUStringToOString( aLang , RTL_TEXTENCODING_ASCII_US ).pData->buffer);
1063             // not sure about the Window*
1064             VclAbstractDialog* pDlg = pFact->CreateSvxScriptOrgDialog( GetTopWindow(), aLanguage );
1065             if( pDlg )
1066             {
1067                 pDlg->Execute();
1068             }
1069             else
1070             {
1071                 OSL_TRACE("no dialog!!!");
1072             }
1073             rReq.Done();
1074         }
1075         break;
1076 
1077         case SID_OFFICE_CHECK_PLZ:
1078         {
1079             sal_Bool bRet = sal_False;
1080             SFX_REQUEST_ARG(rReq, pStringItem, SfxStringItem, rReq.GetSlot(), sal_False);
1081 
1082             if ( pStringItem )
1083             {
1084                 String aPLZ = pStringItem->GetValue();
1085                 bRet = sal_True /*!!!SfxIniManager::CheckPLZ( aPLZ )*/;
1086             }
1087             else
1088                 SbxBase::SetError( SbxERR_WRONG_ARGS );
1089             rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), bRet ) );
1090         }
1091         break;
1092 
1093         case SID_AUTO_CORRECT_DLG:
1094         {
1095             SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
1096             if ( pFact )
1097             {
1098                 SfxItemSet aSet(GetPool(), SID_AUTO_CORRECT_DLG, SID_AUTO_CORRECT_DLG);
1099                 const SfxPoolItem* pItem=NULL;
1100                 const SfxItemSet* pSet = rReq.GetArgs();
1101                 SfxItemPool* pSetPool = pSet ? pSet->GetPool() : NULL;
1102                 if ( pSet && pSet->GetItemState( pSetPool->GetWhich( SID_AUTO_CORRECT_DLG ), sal_False, &pItem ) == SFX_ITEM_SET )
1103                     aSet.Put( *pItem );
1104 
1105                 SfxAbstractTabDialog* pDlg = pFact->CreateTabDialog( RID_OFA_AUTOCORR_DLG, NULL, &aSet, NULL );
1106                 pDlg->Execute();
1107                 delete pDlg;
1108             }
1109 
1110             break;
1111         }
1112 
1113         case SID_SD_AUTOPILOT :
1114         case SID_NEWSD :
1115         {
1116             SvtModuleOptions aModuleOpt;
1117             if ( !aModuleOpt.IsImpress() )
1118             {
1119                 ErrorBox( 0, ResId( RID_ERRBOX_MODULENOTINSTALLED, *GetOffResManager_Impl() )).Execute();
1120                 return;
1121             }
1122 
1123             Reference< com::sun::star::lang::XMultiServiceFactory > xORB = ::comphelper::getProcessServiceFactory();
1124             Reference< com::sun::star::frame::XDispatchProvider > xProv(
1125                 xORB->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.drawing.ModuleDispatcher")), UNO_QUERY );
1126 
1127             if ( xProv.is() )
1128             {
1129                 ::rtl::OUString aCmd = ::rtl::OUString::createFromAscii( GetInterface()->GetSlot( rReq.GetSlot() )->GetUnoName() );
1130                 Reference< com::sun::star::frame::XDispatchHelper > xHelper(
1131                     xORB->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.frame.DispatchHelper")), UNO_QUERY );
1132                 if ( xHelper.is() )
1133                 {
1134                     Sequence < com::sun::star::beans::PropertyValue > aSeq;
1135                     if ( rReq.GetArgs() )
1136                         TransformItems( rReq.GetSlot(), *rReq.GetArgs(), aSeq );
1137                     Any aResult = xHelper->executeDispatch( xProv, aCmd, ::rtl::OUString(), 0, aSeq );
1138                     ::com::sun::star::frame::DispatchResultEvent aEvent;
1139                     sal_Bool bSuccess = (
1140                                          (aResult >>= aEvent) &&
1141                                          (aEvent.State == ::com::sun::star::frame::DispatchResultState::SUCCESS)
1142                                         );
1143                     rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), bSuccess ) );
1144                 }
1145             }
1146         }
1147         break;
1148 
1149         case FN_LABEL :
1150         case FN_BUSINESS_CARD :
1151         case FN_XFORMS_INIT :
1152         {
1153             Reference< com::sun::star::lang::XMultiServiceFactory > xORB = ::comphelper::getProcessServiceFactory();
1154             Reference< com::sun::star::frame::XDispatchProvider > xProv(
1155                 xORB->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.text.ModuleDispatcher")), UNO_QUERY );
1156 
1157             if ( xProv.is() )
1158             {
1159                 ::rtl::OUString aCmd = ::rtl::OUString::createFromAscii( GetInterface()->GetSlot( rReq.GetSlot() )->GetUnoName() );
1160                 Reference< com::sun::star::frame::XDispatchHelper > xHelper(
1161                     xORB->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.frame.DispatchHelper")), UNO_QUERY );
1162                 if ( xHelper.is() )
1163                 {
1164                     Sequence < com::sun::star::beans::PropertyValue > aSeq;
1165                     if ( rReq.GetArgs() )
1166                         TransformItems( rReq.GetSlot(), *rReq.GetArgs(), aSeq );
1167                     Any aResult = xHelper->executeDispatch( xProv, aCmd, ::rtl::OUString(), 0, aSeq );
1168                     ::com::sun::star::frame::DispatchResultEvent aEvent;
1169                     sal_Bool bSuccess = (
1170                                          (aResult >>= aEvent) &&
1171                                          (aEvent.State == ::com::sun::star::frame::DispatchResultState::SUCCESS)
1172                                         );
1173                     rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), bSuccess ) );
1174                 }
1175             }
1176         }
1177         break;
1178 
1179         case SID_ADDRESS_DATA_SOURCE:
1180         {
1181             ::rtl::OUString sDialogServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.AddressBookSourcePilot" ) );
1182             try
1183             {
1184                 Reference< com::sun::star::lang::XMultiServiceFactory > xORB = ::comphelper::getProcessServiceFactory();
1185                 Reference< com::sun::star::ui::dialogs::XExecutableDialog > xDialog;
1186                 if (xORB.is())
1187                     xDialog = Reference< com::sun::star::ui::dialogs::XExecutableDialog >(xORB->createInstance(sDialogServiceName), UNO_QUERY);
1188                 if (xDialog.is())
1189                     xDialog->execute();
1190                 else
1191                     ShowServiceNotAvailableError(NULL, sDialogServiceName, sal_True);
1192             }
1193             catch(::com::sun::star::uno::Exception&)
1194             {
1195             }
1196         }
1197         break;
1198 
1199         case SID_COMP_BIBLIOGRAPHY:
1200         {
1201             SfxStringItem aURL(SID_FILE_NAME, String::CreateFromAscii(".component:Bibliography/View1"));
1202             SfxStringItem aRef(SID_REFERER, String::CreateFromAscii("private:user"));
1203             SfxStringItem aTarget(SID_TARGETNAME, String::CreateFromAscii("_blank"));
1204             SfxViewFrame::Current()->GetDispatcher()->Execute( SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, &aURL, &aRef, &aTarget, 0L);
1205         }
1206         break;
1207     }
1208 }
1209 
1210 void SfxApplication::OfaState_Impl(SfxItemSet &rSet)
1211 {
1212     SvtModuleOptions aModuleOpt;
1213 
1214     if( !aModuleOpt.IsWriter())
1215     {
1216         rSet.DisableItem( FN_LABEL );
1217         rSet.DisableItem( FN_BUSINESS_CARD );
1218         rSet.DisableItem( FN_XFORMS_INIT );
1219     }
1220 
1221     if ( !aModuleOpt.IsImpress() )
1222         rSet.DisableItem( SID_SD_AUTOPILOT );
1223 }
1224