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