Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <com/sun/star/document/XEmbeddedScripts.hpp>
21 : #include <com/sun/star/drawing/ModuleDispatcher.hpp>
22 : #include <com/sun/star/embed/XStorage.hpp>
23 : #include <com/sun/star/embed/ElementModes.hpp>
24 : #include <com/sun/star/frame/Desktop.hpp>
25 : #include <com/sun/star/frame/DispatchResultEvent.hpp>
26 : #include <com/sun/star/frame/DispatchResultState.hpp>
27 : #include <com/sun/star/frame/DispatchHelper.hpp>
28 : #include <com/sun/star/frame/XDesktop.hpp>
29 : #include <com/sun/star/frame/XFramesSupplier.hpp>
30 : #include <com/sun/star/frame/XLayoutManager.hpp>
31 : #include <com/sun/star/frame/XSynchronousFrameLoader.hpp>
32 : #include <com/sun/star/sdbc/DriverManager.hpp>
33 : #include <com/sun/star/system/SystemShellExecute.hpp>
34 : #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
35 : #include <com/sun/star/system/SystemShellExecuteException.hpp>
36 : #include <com/sun/star/task/XJobExecutor.hpp>
37 : #include <com/sun/star/text/ModuleDispatcher.hpp>
38 : #include <com/sun/star/ui/dialogs/AddressBookSourcePilot.hpp>
39 : #include <com/sun/star/uno/Reference.hxx>
40 : #include <com/sun/star/util/XCloseable.hpp>
41 : #include <com/sun/star/util/CloseVetoException.hpp>
42 : #include <org/freedesktop/PackageKit/SyncDbusSessionHelper.hpp>
43 :
44 : #include <com/sun/star/frame/XComponentLoader.hpp>
45 :
46 : #include <comphelper/processfactory.hxx>
47 : #include <comphelper/storagehelper.hxx>
48 :
49 : #include <svtools/addresstemplate.hxx>
50 : #include <svtools/miscopt.hxx>
51 : #include <svtools/restartdialog.hxx>
52 : #include <svl/visitem.hxx>
53 : #include <unotools/intlwrapper.hxx>
54 :
55 : #include <unotools/configmgr.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 : #include <osl/file.hxx>
70 :
71 : #include <unotools/pathoptions.hxx>
72 : #include <unotools/moduleoptions.hxx>
73 : #include <svtools/helpopt.hxx>
74 : #include <toolkit/helper/vclunohelper.hxx>
75 : #include <tools/shl.hxx>
76 : #include <unotools/bootstrap.hxx>
77 : #include <rtl/bootstrap.hxx>
78 : #include <cppuhelper/exc_hlp.hxx>
79 :
80 : #include <com/sun/star/script/provider/XScriptProviderFactory.hpp>
81 : #include <com/sun/star/frame/ModuleManager.hpp>
82 : #include <com/sun/star/beans/XPropertySet.hpp>
83 :
84 : #include <sfx2/app.hxx>
85 : #include <sfx2/request.hxx>
86 : #include <sfx2/dispatch.hxx>
87 : #include <sfx2/bindings.hxx>
88 : #include <sfx2/msg.hxx>
89 : #include <sfx2/objface.hxx>
90 : #include <sfx2/objitem.hxx>
91 : #include <sfx2/objsh.hxx>
92 : #include <sfx2/hintpost.hxx>
93 : #include <sfx2/viewsh.hxx>
94 : #include <sfx2/docfac.hxx>
95 : #include <sfx2/docfile.hxx>
96 : #include <sfx2/docfilt.hxx>
97 : #include <sfx2/new.hxx>
98 : #include "sfxtypes.hxx"
99 : #include <sfx2/tabdlg.hxx>
100 : #include "arrdecl.hxx"
101 : #include <sfx2/sfx.hrc>
102 : #include "app.hrc"
103 : #include <sfx2/passwd.hxx>
104 : #include <sfx2/sfxresid.hxx>
105 : #include <sfx2/childwin.hxx>
106 : #include "appdata.hxx"
107 : #include <sfx2/minfitem.hxx>
108 : #include <sfx2/event.hxx>
109 : #include <sfx2/module.hxx>
110 : #include <sfx2/viewfrm.hxx>
111 : #include "sfxpicklist.hxx"
112 : #include "imestatuswindow.hxx"
113 : #include <sfx2/sfxdlg.hxx>
114 : #include <sfx2/dialogs.hrc>
115 : #include "sorgitm.hxx"
116 : #include <sfx2/sfxhelp.hxx>
117 : #include <sfx2/zoomitem.hxx>
118 : #include "templatedlg.hxx"
119 :
120 : #include <officecfg/Office/Common.hxx>
121 : #include <officecfg/Setup.hxx>
122 :
123 : using namespace ::com::sun::star;
124 : using namespace ::com::sun::star::beans;
125 : using namespace ::com::sun::star::uno;
126 : using namespace ::com::sun::star::frame;
127 : using namespace ::com::sun::star::container;
128 : using namespace ::com::sun::star::util;
129 : using namespace ::com::sun::star::script;
130 : using namespace ::com::sun::star::system;
131 : using namespace ::com::sun::star::lang;
132 : using namespace ::com::sun::star::document;
133 :
134 : namespace
135 : {
136 : // lp#527938, debian#602953, fdo#33266, i#105408
137 0 : static bool lcl_isBaseAvailable()
138 : {
139 : try
140 : {
141 : // if we get com::sun::star::sdbc::DriverManager, libsdbc2 is there
142 : // and the bibliography is assumed to work
143 0 : return com::sun::star::sdbc::DriverManager::create(comphelper::getProcessComponentContext()).is();
144 : }
145 0 : catch (Exception & e)
146 : {
147 : SAL_INFO(
148 : "sfx.appl",
149 : "assuming Base to be missing; caught " << e.Message);
150 0 : return false;
151 : }
152 : }
153 0 : static void lcl_tryLoadBibliography()
154 : {
155 : // lp#527938, debian#602953, fdo#33266, i#105408
156 : // make sure we actually can instanciate services from base first
157 0 : if(!lcl_isBaseAvailable())
158 : {
159 : try
160 : {
161 : using namespace org::freedesktop::PackageKit;
162 : using namespace svtools;
163 0 : Reference< XSyncDbusSessionHelper > xSyncDbusSessionHelper(SyncDbusSessionHelper::create(comphelper::getProcessComponentContext()));
164 0 : Sequence< OUString > vPackages(1);
165 0 : vPackages[0] = "libreoffice-base";
166 0 : OUString sInteraction;
167 0 : xSyncDbusSessionHelper->InstallPackageNames(0, vPackages, sInteraction);
168 : // Ill be back (hopefully)!
169 0 : SolarMutexGuard aGuard;
170 0 : executeRestartDialog(comphelper::getProcessComponentContext(), NULL, RESTART_REASON_BIBLIOGRAPHY_INSTALL);
171 : }
172 0 : catch (const Exception & e)
173 : {
174 : SAL_INFO(
175 : "sfx.appl",
176 : "trying to install LibreOffice Base, caught " << e.Message);
177 : }
178 0 : return;
179 : }
180 :
181 : try // fdo#48775
182 : {
183 0 : SfxStringItem aURL(SID_FILE_NAME, OUString(".component:Bibliography/View1"));
184 0 : SfxStringItem aRef(SID_REFERER, OUString("private:user"));
185 0 : SfxStringItem aTarget(SID_TARGETNAME, OUString("_blank"));
186 0 : SfxViewFrame::Current()->GetDispatcher()->Execute( SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, &aURL, &aRef, &aTarget, 0L);
187 : }
188 0 : catch (const Exception & e)
189 : {
190 : SAL_INFO( "sfx.appl",
191 : "trying to load bibliography database, caught " << e.Message);
192 : }
193 : }
194 : }
195 : /// Find the correct location of the document (LICENSE.fodt, etc.), and return
196 : /// it in rURL if found.
197 0 : static bool checkURL( const char *pName, const char *pExt, OUString &rURL )
198 : {
199 : using namespace osl;
200 0 : DirectoryItem aDirItem;
201 :
202 0 : rURL = "$BRAND_BASE_DIR/" + OUString::createFromAscii( pName ) +
203 0 : OUString::createFromAscii( pExt );
204 0 : rtl::Bootstrap::expandMacros( rURL );
205 :
206 0 : if (!rURL.isEmpty())
207 0 : return DirectoryItem::get( rURL, aDirItem ) == DirectoryItem::E_None;
208 : else
209 0 : return false;
210 : }
211 :
212 : /// Displays CREDITS or LICENSE in any of the available version
213 0 : static void showDocument( const char* pBaseName )
214 : {
215 : try {
216 0 : Reference < XDesktop2 > xDesktop = Desktop::create( ::comphelper::getProcessComponentContext() );
217 0 : Sequence < com::sun::star::beans::PropertyValue > args(2);
218 0 : args[0].Name = "ViewOnly";
219 0 : args[0].Value <<= sal_True;
220 0 : args[1].Name = "ReadOnly";
221 0 : args[1].Value <<= sal_True;
222 :
223 0 : OUString aURL;
224 0 : if ( checkURL ( pBaseName, ".fodt", aURL ) ||
225 0 : checkURL ( pBaseName, ".html", aURL ) ||
226 0 : checkURL ( pBaseName, "", aURL ) ) {
227 0 : xDesktop->loadComponentFromURL( aURL, OUString("_blank"), 0, args );
228 0 : }
229 0 : } catch (const ::com::sun::star::uno::Exception &) {
230 : }
231 0 : }
232 :
233 : namespace
234 : {
235 0 : class LicenseDialog : public ModalDialog
236 : {
237 : private:
238 : DECL_LINK(ShowHdl, void *);
239 : public:
240 : LicenseDialog(Window *pParent=NULL);
241 : };
242 :
243 0 : LicenseDialog::LicenseDialog(Window *pParent)
244 0 : : ModalDialog(pParent, "LicenseDialog", "sfx/ui/licensedialog.ui")
245 : {
246 0 : get<PushButton>("show")->SetClickHdl(LINK(this, LicenseDialog, ShowHdl));
247 0 : }
248 :
249 0 : IMPL_LINK_NOARG(LicenseDialog, ShowHdl)
250 : {
251 0 : EndDialog(RET_OK);
252 0 : showDocument("LICENSE");
253 0 : return 0;
254 : }
255 : }
256 :
257 0 : void SfxApplication::MiscExec_Impl( SfxRequest& rReq )
258 : {
259 0 : bool bDone = false;
260 0 : switch ( rReq.GetSlot() )
261 : {
262 : case SID_SETOPTIONS:
263 : {
264 0 : if( rReq.GetArgs() )
265 0 : SetOptions_Impl( *rReq.GetArgs() );
266 0 : break;
267 : }
268 :
269 : case SID_QUITAPP:
270 : case SID_EXITANDRETURN:
271 : case SID_LOGOUT:
272 : {
273 : // protect against reentrant calls
274 0 : if ( pAppData_Impl->bInQuit )
275 0 : return;
276 :
277 0 : if ( rReq.GetSlot() == SID_LOGOUT )
278 : {
279 0 : for ( SfxObjectShell *pObjSh = SfxObjectShell::GetFirst();
280 : pObjSh; pObjSh = SfxObjectShell::GetNext( *pObjSh ) )
281 : {
282 0 : if ( !pObjSh->IsModified() )
283 0 : continue;
284 :
285 0 : SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pObjSh );
286 0 : if ( !pFrame || !pFrame->GetWindow().IsReallyVisible() )
287 0 : continue;
288 :
289 0 : if (pObjSh->PrepareClose(true))
290 0 : pObjSh->SetModified( false );
291 : else
292 0 : return;
293 : }
294 :
295 0 : SfxStringItem aNameItem( SID_FILE_NAME, OUString("vnd.sun.star.cmd:logout") );
296 0 : SfxStringItem aReferer( SID_REFERER, "private/user" );
297 0 : pAppData_Impl->pAppDispat->Execute( SID_OPENDOC, SFX_CALLMODE_SLOT, &aNameItem, &aReferer, 0L );
298 0 : return;
299 : }
300 :
301 : // aus verschachtelten Requests nach 100ms nochmal probieren
302 0 : if( Application::GetDispatchLevel() > 1 )
303 : {
304 : /* Dont save the request for closing the application and try it later
305 : again. This is an UI bound functionality ... and the user will try it again
306 : if the dialog is closed. But we should not close the application automaticly
307 : if this dialog is closed by the user ...
308 : So we ignore this request now and wait for a new user decision.
309 : */
310 : OSL_TRACE( "QueryExit => sal_False (DispatchLevel == %u)", Application::GetDispatchLevel() );
311 0 : return;
312 : }
313 :
314 : // block reentrant calls
315 0 : pAppData_Impl->bInQuit = true;
316 0 : Reference < XDesktop2 > xDesktop = Desktop::create ( ::comphelper::getProcessComponentContext() );
317 :
318 0 : rReq.ForgetAllArgs();
319 :
320 : // if terminate() failed, pAppData_Impl->bInQuit will now be sal_False, allowing further calls of SID_QUITAPP
321 0 : bool bTerminated = xDesktop->terminate();
322 0 : if (!bTerminated)
323 : // if terminate() was successful, SfxApplication is now dead!
324 0 : pAppData_Impl->bInQuit = false;
325 :
326 : // Set return value, terminate if possible
327 0 : rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), bTerminated ) );
328 0 : return;
329 : }
330 :
331 : case SID_CONFIG:
332 : case SID_TOOLBOXOPTIONS:
333 : case SID_CONFIGSTATUSBAR:
334 : case SID_CONFIGMENU:
335 : case SID_CONFIGACCEL:
336 : case SID_CONFIGEVENT:
337 : {
338 : SfxAbstractDialogFactory* pFact =
339 0 : SfxAbstractDialogFactory::Create();
340 :
341 0 : if ( pFact )
342 : {
343 0 : SFX_REQUEST_ARG(rReq, pStringItem,
344 : SfxStringItem, SID_CONFIG, false);
345 :
346 : SfxItemSet aSet(
347 0 : GetPool(), SID_CONFIG, SID_CONFIG );
348 :
349 0 : if ( pStringItem )
350 : {
351 : aSet.Put( SfxStringItem(
352 0 : SID_CONFIG, pStringItem->GetValue() ) );
353 : }
354 :
355 0 : Reference< XFrame > xFrame;
356 0 : const SfxItemSet* pIntSet = rReq.GetInternalArgs_Impl();
357 0 : SFX_ITEMSET_ARG( pIntSet, pFrameItem, SfxUnoFrameItem, SID_FILLFRAME, false );
358 0 : if ( pFrameItem )
359 0 : xFrame = pFrameItem->GetFrame();
360 :
361 : SfxAbstractTabDialog* pDlg = pFact->CreateTabDialog(
362 : RID_SVXDLG_CUSTOMIZE,
363 0 : NULL, &aSet, xFrame );
364 :
365 0 : if ( pDlg )
366 : {
367 0 : const short nRet = pDlg->Execute();
368 :
369 0 : if ( nRet )
370 0 : bDone = true;
371 :
372 0 : delete pDlg;
373 0 : }
374 : }
375 0 : break;
376 : }
377 :
378 : case SID_CLOSEDOCS:
379 : case SID_CLOSEWINS:
380 : {
381 :
382 0 : Reference < XDesktop2 > xDesktop = Desktop::create( ::comphelper::getProcessComponentContext() );
383 0 : Reference< XIndexAccess > xTasks( xDesktop->getFrames(), UNO_QUERY );
384 0 : if ( !xTasks.is() )
385 0 : break;
386 :
387 0 : sal_Int32 n=0;
388 : do
389 : {
390 0 : if ( xTasks->getCount() <= n )
391 0 : break;
392 :
393 0 : Any aAny = xTasks->getByIndex(n);
394 0 : Reference < XCloseable > xTask;
395 0 : aAny >>= xTask;
396 : try
397 : {
398 0 : xTask->close(sal_True);
399 0 : n++;
400 : }
401 0 : catch( CloseVetoException& )
402 : {
403 0 : }
404 : }
405 : while( true );
406 :
407 0 : bool bOk = ( n == 0);
408 0 : rReq.SetReturnValue( SfxBoolItem( 0, bOk ) );
409 0 : bDone = true;
410 0 : break;
411 : }
412 :
413 : case SID_SAVEDOCS:
414 : {
415 0 : bool bOK = true;
416 0 : for ( SfxObjectShell *pObjSh = SfxObjectShell::GetFirst();
417 : pObjSh;
418 : pObjSh = SfxObjectShell::GetNext( *pObjSh ) )
419 : {
420 0 : SfxRequest aReq( SID_SAVEDOC, 0, pObjSh->GetPool() );
421 0 : if ( pObjSh->IsModified() )
422 : {
423 0 : pObjSh->ExecuteSlot( aReq );
424 0 : SfxBoolItem *pItem = PTR_CAST( SfxBoolItem, aReq.GetReturnValue() );
425 0 : if ( !pItem || !pItem->GetValue() )
426 0 : bOK = false;
427 : }
428 0 : }
429 :
430 0 : rReq.SetReturnValue( SfxBoolItem( 0, bOK ) );
431 0 : rReq.Done();
432 0 : break;
433 : }
434 :
435 : case SID_SEND_FEEDBACK:
436 : {
437 0 : OUString module = SfxHelp::GetCurrentModuleIdentifier();
438 0 : OUString sURL("http://hub.libreoffice.org/send-feedback/?LOversion=" + utl::ConfigManager::getAboutBoxProductVersion() +
439 0 : "&LOlocale=" + utl::ConfigManager::getLocale() + "&LOmodule=" + module.copy(module.lastIndexOf('.') + 1 ) );
440 : try
441 : {
442 : uno::Reference< com::sun::star::system::XSystemShellExecute > xSystemShellExecute(
443 0 : com::sun::star::system::SystemShellExecute::create(::comphelper::getProcessComponentContext()) );
444 0 : xSystemShellExecute->execute( sURL, OUString(), com::sun::star::system::SystemShellExecuteFlags::URIS_ONLY );
445 : }
446 0 : catch ( uno::Exception& )
447 : {
448 : }
449 0 : break;
450 : }
451 :
452 : case SID_SHOW_LICENSE:
453 : {
454 0 : LicenseDialog aDialog;
455 0 : aDialog.Execute();
456 0 : break;
457 : }
458 :
459 : case SID_SHOW_CREDITS:
460 : {
461 0 : showDocument( "CREDITS" );
462 0 : break;
463 : }
464 :
465 : // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
466 : case SID_HELPINDEX:
467 : {
468 0 : Help* pHelp = Application::GetHelp();
469 0 : if ( pHelp )
470 : {
471 0 : pHelp->Start( OUString(".uno:HelpIndex"), NULL ); // show start page
472 0 : bDone = true;
473 : }
474 0 : break;
475 : }
476 :
477 : // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
478 : case SID_HELPTIPS:
479 : {
480 : // Evaluate Parameter
481 0 : SFX_REQUEST_ARG(rReq, pOnItem, SfxBoolItem, SID_HELPTIPS, false);
482 : bool bOn = pOnItem
483 : ? ((SfxBoolItem*)pOnItem)->GetValue()
484 0 : : !Help::IsQuickHelpEnabled();
485 :
486 0 : if ( bOn )
487 0 : Help::EnableQuickHelp();
488 : else
489 0 : Help::DisableQuickHelp();
490 0 : SvtHelpOptions().SetHelpTips( bOn );
491 0 : Invalidate(SID_HELPTIPS);
492 0 : bDone = true;
493 :
494 : // Record if possible
495 0 : if ( !rReq.IsAPI() )
496 0 : rReq.AppendItem( SfxBoolItem( SID_HELPTIPS, bOn) );
497 0 : break;
498 : }
499 : // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
500 : case SID_EXTENDEDHELP:
501 : {
502 0 : Help::StartExtHelp();
503 0 : break;
504 : }
505 : case SID_HELPBALLOONS:
506 : {
507 : // Evaluate Parameter
508 0 : SFX_REQUEST_ARG(rReq, pOnItem, SfxBoolItem, SID_HELPBALLOONS, false);
509 : bool bOn = pOnItem
510 : ? ((SfxBoolItem*)pOnItem)->GetValue()
511 0 : : !Help::IsBalloonHelpEnabled();
512 :
513 0 : if ( bOn )
514 0 : Help::EnableBalloonHelp();
515 : else
516 0 : Help::DisableBalloonHelp();
517 0 : SvtHelpOptions().SetExtendedHelp( bOn );
518 0 : Invalidate(SID_HELPBALLOONS);
519 0 : bDone = true;
520 :
521 : // Record if possible
522 0 : if ( !rReq.IsAPI() )
523 0 : rReq.AppendItem( SfxBoolItem( SID_HELPBALLOONS, bOn) );
524 0 : break;
525 : }
526 :
527 : // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
528 : case SID_ABOUT:
529 : {
530 0 : SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
531 0 : if ( pFact )
532 : {
533 0 : VclAbstractDialog* pDlg = pFact->CreateVclDialog( 0, RID_DEFAULTABOUT );
534 0 : pDlg->Execute();
535 0 : delete pDlg;
536 0 : bDone = true;
537 : }
538 0 : break;
539 : }
540 :
541 : case SID_TEMPLATE_MANAGER:
542 : {
543 0 : SfxTemplateManagerDlg dlg;
544 0 : dlg.Execute();
545 0 : bDone = true;
546 0 : break;
547 : }
548 :
549 : case SID_TEMPLATE_ADDRESSBOKSOURCE:
550 : {
551 0 : svt::AddressBookSourceDialog aDialog(GetTopWindow(), ::comphelper::getProcessComponentContext());
552 0 : aDialog.Execute();
553 0 : bDone = true;
554 0 : break;
555 : }
556 :
557 : #ifndef DISABLE_SCRIPTING
558 : case SID_BASICSTOP:
559 0 : StarBASIC::Stop();
560 0 : break;
561 :
562 : case SID_BASICBREAK :
563 0 : BASIC_DLL()->BasicBreak();
564 0 : break;
565 : #endif
566 :
567 : case SID_SHOW_IME_STATUS_WINDOW:
568 0 : if (pAppData_Impl->m_xImeStatusWindow->canToggle())
569 : {
570 : SfxBoolItem const * pItem = static_cast< SfxBoolItem const * >(
571 : rReq.GetArg(SID_SHOW_IME_STATUS_WINDOW, false,
572 0 : TYPE(SfxBoolItem)));
573 : bool bShow = pItem == 0
574 0 : ? !pAppData_Impl->m_xImeStatusWindow->isShowing()
575 0 : : pItem->GetValue();
576 0 : pAppData_Impl->m_xImeStatusWindow->show(bShow);
577 0 : if (pItem == 0)
578 : rReq.AppendItem(SfxBoolItem(SID_SHOW_IME_STATUS_WINDOW,
579 0 : bShow));
580 : }
581 0 : bDone = true;
582 0 : break;
583 :
584 : case SID_ZOOM_50_PERCENT:
585 : case SID_ZOOM_75_PERCENT:
586 : case SID_ZOOM_100_PERCENT:
587 : case SID_ZOOM_150_PERCENT:
588 : case SID_ZOOM_200_PERCENT:
589 : case SID_ZOOM_OPTIMAL:
590 : case SID_ZOOM_ENTIRE_PAGE:
591 : case SID_ZOOM_PAGE_WIDTH:
592 : {
593 0 : SfxObjectShell* pCurrentShell = SfxObjectShell::Current();
594 0 : if (!pCurrentShell)
595 0 : return;
596 :
597 : // make sure aZoom is initialized with a proper value if SetType
598 : // doesn't work
599 0 : SvxZoomItem aZoom( SVX_ZOOM_PERCENT, 100 );
600 :
601 0 : switch (rReq.GetSlot())
602 : {
603 : case SID_ZOOM_50_PERCENT:
604 0 : aZoom.SetValue(50);
605 0 : break;
606 : case SID_ZOOM_75_PERCENT:
607 0 : aZoom.SetValue(75);
608 0 : break;
609 : case SID_ZOOM_100_PERCENT:
610 0 : aZoom.SetValue(100);
611 0 : break;
612 : case SID_ZOOM_150_PERCENT:
613 0 : aZoom.SetValue(150);
614 0 : break;
615 : case SID_ZOOM_200_PERCENT:
616 0 : aZoom.SetValue(200);
617 0 : break;
618 : case SID_ZOOM_OPTIMAL:
619 0 : aZoom.SetType( SVX_ZOOM_OPTIMAL );
620 0 : break;
621 : case SID_ZOOM_ENTIRE_PAGE:
622 0 : aZoom.SetType( SVX_ZOOM_WHOLEPAGE );
623 0 : break;
624 : case SID_ZOOM_PAGE_WIDTH:
625 0 : aZoom.SetType( SVX_ZOOM_PAGEWIDTH );
626 0 : break;
627 : }
628 :
629 0 : pCurrentShell->GetDispatcher()->Execute(SID_ATTR_ZOOM, SFX_CALLMODE_ASYNCHRON, &aZoom, 0L);
630 :
631 0 : break;
632 : }
633 : case SID_AVAILABLE_TOOLBARS:
634 : {
635 : SfxStringItem const * pToolbarName = static_cast< SfxStringItem const *>(
636 0 : rReq.GetArg(SID_AVAILABLE_TOOLBARS, false, TYPE(SfxStringItem)));
637 :
638 0 : if ( pToolbarName )
639 : {
640 0 : Reference < XDesktop2 > xDesktop = Desktop::create ( ::comphelper::getProcessComponentContext() );
641 0 : Reference< XFrame > xFrame = xDesktop->getActiveFrame();
642 :
643 0 : Reference< com::sun::star::beans::XPropertySet > xPropSet( xFrame, UNO_QUERY );
644 0 : Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
645 0 : if ( xPropSet.is() )
646 : {
647 : try
648 : {
649 0 : Any aValue = xPropSet->getPropertyValue("LayoutManager");
650 0 : aValue >>= xLayoutManager;
651 : }
652 0 : catch ( const ::com::sun::star::uno::RuntimeException& )
653 : {
654 0 : throw;
655 : }
656 0 : catch ( ::com::sun::star::uno::Exception& )
657 : {
658 : }
659 : }
660 :
661 0 : if ( xLayoutManager.is() )
662 : {
663 0 : OUString aToolbarResName( "private:resource/toolbar/" );
664 0 : OUStringBuffer aBuf( aToolbarResName );
665 0 : aBuf.append( pToolbarName->GetValue() );
666 :
667 : // Evaluate Parameter
668 0 : OUString aToolbarName( aBuf.makeStringAndClear() );
669 0 : bool bShow( !xLayoutManager->isElementVisible( aToolbarName ));
670 :
671 0 : if ( bShow )
672 : {
673 0 : xLayoutManager->createElement( aToolbarName );
674 0 : xLayoutManager->showElement( aToolbarName );
675 : }
676 : else
677 0 : xLayoutManager->hideElement( aToolbarName );
678 0 : }
679 : }
680 :
681 0 : bDone = true;
682 0 : break;
683 : }
684 :
685 : default:
686 0 : break;
687 : }
688 :
689 0 : if ( bDone )
690 0 : rReq.Done();
691 : }
692 :
693 :
694 :
695 0 : void SfxApplication::MiscState_Impl(SfxItemSet &rSet)
696 : {
697 0 : const sal_uInt16 *pRanges = rSet.GetRanges();
698 : DBG_ASSERT(pRanges && *pRanges, "Set without range");
699 0 : while ( *pRanges )
700 : {
701 0 : for(sal_uInt16 nWhich = *pRanges++; nWhich <= *pRanges; ++nWhich)
702 : {
703 0 : switch(nWhich)
704 : {
705 : case SID_TEMPLATE_ADDRESSBOKSOURCE:
706 0 : if ( !SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SDATABASE) )
707 0 : rSet.Put(SfxVisibilityItem(nWhich, false));
708 0 : break;
709 : case SID_EXITANDRETURN:
710 : case SID_QUITAPP:
711 : {
712 0 : if ( pAppData_Impl->nDocModalMode )
713 0 : rSet.DisableItem(nWhich);
714 : else
715 0 : rSet.Put(SfxStringItem(nWhich, SfxResId(STR_QUITAPP).toString()));
716 0 : break;
717 : }
718 :
719 : case SID_CONFIG:
720 : case SID_TOOLBOXOPTIONS:
721 : case SID_CONFIGSTATUSBAR:
722 : case SID_CONFIGMENU:
723 : case SID_CONFIGACCEL:
724 : case SID_CONFIGEVENT:
725 : {
726 0 : if( SvtMiscOptions().DisableUICustomization() )
727 0 : rSet.DisableItem(nWhich);
728 0 : break;
729 : }
730 :
731 : #ifndef DISABLE_SCRIPTING
732 : case SID_BASICSTOP:
733 0 : if ( !StarBASIC::IsRunning() )
734 0 : rSet.DisableItem(nWhich);
735 0 : break;
736 : #endif
737 :
738 : case SID_HELPTIPS:
739 : {
740 0 : rSet.Put( SfxBoolItem( SID_HELPTIPS, Help::IsQuickHelpEnabled() ) );
741 : }
742 0 : break;
743 : case SID_HELPBALLOONS:
744 : {
745 0 : rSet.Put( SfxBoolItem( SID_HELPBALLOONS, Help::IsBalloonHelpEnabled() ) );
746 : }
747 0 : break;
748 :
749 : case SID_EXTENDEDHELP:
750 : {
751 : }
752 0 : break;
753 :
754 : case SID_CLOSEDOCS:
755 : case SID_CLOSEWINS:
756 : {
757 0 : Reference < XDesktop2 > xDesktop = Desktop::create( ::comphelper::getProcessComponentContext() );
758 0 : Reference< XIndexAccess > xTasks( xDesktop->getFrames(), UNO_QUERY );
759 0 : if ( !xTasks.is() || !xTasks->getCount() )
760 0 : rSet.DisableItem(nWhich);
761 0 : break;
762 : }
763 :
764 : case SID_SAVEDOCS:
765 : {
766 0 : bool bModified = false;
767 0 : for ( SfxObjectShell *pObjSh = SfxObjectShell::GetFirst();
768 : pObjSh;
769 : pObjSh = SfxObjectShell::GetNext( *pObjSh ) )
770 : {
771 0 : if ( pObjSh->IsModified() )
772 : {
773 0 : bModified = true;
774 0 : break;
775 : }
776 : }
777 :
778 0 : if ( !bModified )
779 0 : rSet.DisableItem( nWhich );
780 0 : break;
781 : }
782 :
783 : case SID_SHOW_IME_STATUS_WINDOW:
784 0 : if (pAppData_Impl->m_xImeStatusWindow->canToggle())
785 : rSet.Put(SfxBoolItem(
786 : SID_SHOW_IME_STATUS_WINDOW,
787 : pAppData_Impl->m_xImeStatusWindow->
788 0 : isShowing()));
789 : else
790 0 : rSet.DisableItem(SID_SHOW_IME_STATUS_WINDOW);
791 0 : break;
792 :
793 : case SID_TEMPLATE_MANAGER:
794 : {
795 0 : SvtMiscOptions aMiscOptions;
796 0 : if ( !aMiscOptions.IsExperimentalMode() )
797 : {
798 0 : rSet.DisableItem( nWhich );
799 0 : rSet.Put( SfxVisibilityItem( nWhich, false ) );
800 0 : }
801 : }
802 0 : break;
803 :
804 : case SID_ZOOM_50_PERCENT:
805 : case SID_ZOOM_75_PERCENT:
806 : case SID_ZOOM_100_PERCENT:
807 : case SID_ZOOM_150_PERCENT:
808 : case SID_ZOOM_200_PERCENT:
809 : case SID_ZOOM_OPTIMAL:
810 : case SID_ZOOM_ENTIRE_PAGE:
811 : case SID_ZOOM_PAGE_WIDTH:
812 : {
813 0 : SfxObjectShell* pCurrentShell = SfxObjectShell::Current();
814 :
815 : const SfxPoolItem *pItem;
816 : SfxItemState aState = pCurrentShell ?
817 0 : pCurrentShell->GetDispatcher()->QueryState(SID_ATTR_ZOOM, pItem) : SFX_ITEM_DISABLED;
818 0 : if ( aState == SFX_ITEM_DISABLED )
819 0 : rSet.DisableItem( nWhich );
820 : }
821 0 : break;
822 :
823 : default:
824 0 : break;
825 : }
826 : }
827 :
828 0 : ++pRanges;
829 : }
830 0 : }
831 :
832 : #ifndef DISABLE_SCRIPTING
833 :
834 : #ifndef DISABLE_DYNLOADING
835 :
836 : typedef rtl_uString* (SAL_CALL *basicide_choose_macro)(XModel*, sal_Bool, rtl_uString*);
837 : typedef void (SAL_CALL *basicide_macro_organizer)( sal_Int16 );
838 :
839 0 : extern "C" { static void SAL_CALL thisModule() {} }
840 :
841 : #else
842 :
843 : extern "C" rtl_uString* basicide_choose_macro(XModel*, sal_Bool, rtl_uString*);
844 : extern "C" void basicide_macro_organizer( sal_Int16 );
845 :
846 : #endif
847 :
848 0 : OUString ChooseMacro( const Reference< XModel >& rxLimitToDocument, bool bChooseOnly, const OUString& rMacroDesc = OUString() )
849 : {
850 : #ifndef DISABLE_DYNLOADING
851 : // get basctl dllname
852 0 : static OUString aLibName( SVLIBRARY( "basctl" ) );
853 :
854 : // load module
855 : oslModule handleMod = osl_loadModuleRelative(
856 0 : &thisModule, aLibName.pData, 0 );
857 :
858 : // get symbol
859 0 : OUString aSymbol( "basicide_choose_macro" );
860 0 : basicide_choose_macro pSymbol = (basicide_choose_macro) osl_getFunctionSymbol( handleMod, aSymbol.pData );
861 : #else
862 : #define pSymbol basicide_choose_macro
863 : #endif
864 :
865 : // call basicide_choose_macro in basctl
866 0 : rtl_uString* pScriptURL = pSymbol( rxLimitToDocument.get(), bChooseOnly, rMacroDesc.pData );
867 0 : OUString aScriptURL( pScriptURL );
868 0 : rtl_uString_release( pScriptURL );
869 0 : return aScriptURL;
870 :
871 : #ifdef DISABLE_DYNLOADING
872 : #undef pSymbol
873 : #endif
874 : }
875 :
876 : #endif
877 :
878 :
879 : #define RID_ERRBOX_MODULENOTINSTALLED (RID_OFA_START + 72)
880 :
881 0 : ResMgr* SfxApplication::GetOffResManager_Impl()
882 : {
883 0 : if ( !pAppData_Impl->pOfaResMgr )
884 0 : pAppData_Impl->pOfaResMgr = CreateResManager( "ofa");
885 0 : return pAppData_Impl->pOfaResMgr;
886 : }
887 :
888 : namespace
889 : {
890 : #ifndef DISABLE_SCRIPTING
891 0 : Window* lcl_getDialogParent( const Reference< XFrame >& _rxFrame, Window* _pFallback )
892 : {
893 0 : if ( !_rxFrame.is() )
894 0 : return _pFallback;
895 :
896 : try
897 : {
898 0 : Reference< awt::XWindow > xContainerWindow( _rxFrame->getContainerWindow(), UNO_SET_THROW );
899 0 : Window* pWindow = VCLUnoHelper::GetWindow( xContainerWindow );
900 : OSL_ENSURE( pWindow, "lcl_getDialogParent: cool, somebody implemented a VCL-less toolkit!" );
901 :
902 0 : if ( pWindow )
903 0 : return pWindow->GetSystemWindow();
904 : }
905 0 : catch( const Exception& )
906 : {
907 : DBG_UNHANDLED_EXCEPTION();
908 : }
909 0 : return _pFallback;
910 : }
911 :
912 0 : const OUString& lcl_getBasicIDEServiceName()
913 : {
914 0 : static const OUString s_sBasicName( "com.sun.star.script.BasicIDE" );
915 0 : return s_sBasicName;
916 : }
917 :
918 0 : SfxViewFrame* lcl_getBasicIDEViewFrame( SfxObjectShell* i_pBasicIDE )
919 : {
920 0 : SfxViewFrame* pView = SfxViewFrame::GetFirst( i_pBasicIDE );
921 0 : while ( pView )
922 : {
923 0 : if ( pView->GetObjectShell()->GetFactory().GetDocumentServiceName() == lcl_getBasicIDEServiceName() )
924 0 : break;
925 0 : pView = SfxViewFrame::GetNext( *pView, i_pBasicIDE );
926 : }
927 0 : return pView;
928 : }
929 0 : Reference< XFrame > lcl_findStartModuleFrame( const Reference<XComponentContext> & rxContext )
930 : {
931 : try
932 : {
933 0 : Reference < XDesktop2 > xDesktop = Desktop::create( rxContext );
934 0 : Reference < XIndexAccess > xContainer( xDesktop->getFrames(), UNO_QUERY_THROW );
935 :
936 0 : Reference< XModuleManager2 > xCheck = ModuleManager::create(rxContext);
937 :
938 0 : sal_Int32 nCount = xContainer->getCount();
939 0 : for ( sal_Int32 i=0; i<nCount; ++i )
940 : {
941 : try
942 : {
943 0 : Reference < XFrame > xFrame( xContainer->getByIndex(i), UNO_QUERY_THROW );
944 0 : OUString sModule = xCheck->identify( xFrame );
945 0 : if ( sModule == "com.sun.star.frame.StartModule" )
946 0 : return xFrame;
947 : }
948 0 : catch( const UnknownModuleException& )
949 : {
950 : // silence
951 : }
952 0 : catch(const Exception&)
953 : {
954 : // re-throw, caught below
955 0 : throw;
956 : }
957 0 : }
958 : }
959 0 : catch( const Exception& )
960 : {
961 : DBG_UNHANDLED_EXCEPTION();
962 : }
963 0 : return NULL;
964 : }
965 : #endif // !DISABLE_SCRIPTING
966 : }
967 :
968 0 : void SfxApplication::OfaExec_Impl( SfxRequest& rReq )
969 : {
970 0 : switch ( rReq.GetSlot() )
971 : {
972 : case SID_OPTIONS_TREEDIALOG:
973 : {
974 0 : OUString sPageURL;
975 0 : SFX_REQUEST_ARG( rReq, pURLItem, SfxStringItem, SID_OPTIONS_PAGEURL, false );
976 0 : if ( pURLItem )
977 0 : sPageURL = pURLItem->GetValue();
978 0 : const SfxItemSet* pArgs = rReq.GetInternalArgs_Impl();
979 0 : const SfxPoolItem* pItem = NULL;
980 0 : Reference < XFrame > xFrame;
981 0 : if ( pArgs && pArgs->GetItemState( SID_FILLFRAME, false, &pItem ) == SFX_ITEM_SET )
982 : {
983 : OSL_ENSURE( pItem->ISA( SfxUnoFrameItem ), "SfxApplication::OfaExec_Impl: XFrames are to be transported via SfxUnoFrameItem by now!" );
984 0 : xFrame = static_cast< const SfxUnoFrameItem*>( pItem )->GetFrame();
985 : }
986 0 : SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
987 0 : if ( pFact )
988 : {
989 : VclAbstractDialog* pDlg =
990 0 : pFact->CreateFrameDialog( NULL, xFrame, rReq.GetSlot(), sPageURL );
991 0 : short nRet = pDlg->Execute();
992 0 : delete pDlg;
993 0 : SfxViewFrame* pView = SfxViewFrame::GetFirst();
994 0 : while ( pView )
995 : {
996 0 : if (nRet == RET_OK)
997 : {
998 0 : SfxObjectShell* pObjSh = pView->GetObjectShell();
999 0 : if (pObjSh)
1000 0 : pObjSh->SetConfigOptionsChecked(false);
1001 : }
1002 0 : pView->GetBindings().InvalidateAll(false);
1003 0 : pView = SfxViewFrame::GetNext( *pView );
1004 : }
1005 : }
1006 0 : break;
1007 : }
1008 :
1009 : case SID_MORE_DICTIONARIES:
1010 : {
1011 : try
1012 : {
1013 : uno::Reference< uno::XComponentContext > xContext =
1014 0 : ::comphelper::getProcessComponentContext();
1015 : uno::Reference< css::system::XSystemShellExecute > xSystemShell(
1016 0 : css::system::SystemShellExecute::create(xContext) );
1017 :
1018 : // read repository URL from configuration
1019 0 : OUString sTemplRepoURL(officecfg::Office::Common::Dictionaries::RepositoryURL::get());
1020 :
1021 0 : if ( xSystemShell.is() && !sTemplRepoURL.isEmpty() )
1022 : {
1023 0 : OUStringBuffer aURLBuf( sTemplRepoURL );
1024 0 : aURLBuf.append("?lang=");
1025 :
1026 : // read locale from configuration
1027 0 : OUString sLocale(officecfg::Setup::L10N::ooLocale::get());
1028 0 : if (sLocale.isEmpty())
1029 0 : sLocale = "en-US";
1030 :
1031 0 : aURLBuf.append( sLocale );
1032 0 : xSystemShell->execute(
1033 : aURLBuf.makeStringAndClear(),
1034 : OUString(),
1035 0 : css::system::SystemShellExecuteFlags::URIS_ONLY );
1036 0 : }
1037 : }
1038 0 : catch( const ::com::sun::star::uno::Exception& )
1039 : {
1040 : SAL_WARN( "sfx.appl", "SfxApplication::OfaExec_Impl(SID_MORE_DICTIONARIES): caught an exception!" );
1041 : }
1042 0 : break;
1043 : }
1044 : #ifndef DISABLE_SCRIPTING
1045 : case SID_BASICIDE_APPEAR:
1046 : {
1047 0 : SfxViewFrame* pView = lcl_getBasicIDEViewFrame( NULL );
1048 0 : if ( !pView )
1049 : {
1050 0 : SfxObjectShell* pBasicIDE = SfxObjectShell::CreateObject( lcl_getBasicIDEServiceName() );
1051 0 : pBasicIDE->DoInitNew( 0 );
1052 0 : pBasicIDE->SetModified( false );
1053 : try
1054 : {
1055 : // load the Basic IDE via direct access to the SFX frame loader. A generic loadComponentFromURL
1056 : // (which could be done via SfxViewFrame::LoadDocumentIntoFrame) is not feasible here, since the Basic IDE
1057 : // does not really play nice with the framework's concept. For instance, it is a "singleton document",
1058 : // which conflicts, at the latest, with the framework's concept of loading into _blank frames.
1059 : // So, since we know that our frame loader can handle it, we skip the generic framework loader
1060 : // mechanism, and the type detection (which doesn't know about the Basic IDE).
1061 0 : Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
1062 : Reference< XSynchronousFrameLoader > xLoader(
1063 0 : xContext->getServiceManager()->createInstanceWithContext("com.sun.star.comp.office.FrameLoader", xContext),
1064 0 : UNO_QUERY_THROW );
1065 0 : ::comphelper::NamedValueCollection aLoadArgs;
1066 0 : aLoadArgs.put( "Model", pBasicIDE->GetModel() );
1067 0 : aLoadArgs.put( "URL", OUString( "private:factory/sbasic" ) );
1068 :
1069 0 : Reference< XFrame > xTargetFrame( lcl_findStartModuleFrame( xContext ) );
1070 0 : if ( !xTargetFrame.is() )
1071 0 : xTargetFrame = SfxFrame::CreateBlankFrame();
1072 0 : ENSURE_OR_THROW( xTargetFrame.is(), "could not obtain a frameto load the Basic IDE into!" );
1073 :
1074 0 : xLoader->load( aLoadArgs.getPropertyValues(), xTargetFrame );
1075 : }
1076 0 : catch( const Exception& )
1077 : {
1078 : DBG_UNHANDLED_EXCEPTION();
1079 : }
1080 :
1081 0 : pView = lcl_getBasicIDEViewFrame( pBasicIDE );
1082 0 : if ( pView )
1083 0 : pView->SetName( OUString( "BASIC:1" ) );
1084 : }
1085 :
1086 0 : if ( pView )
1087 0 : pView->GetFrame().Appear();
1088 :
1089 0 : const SfxItemSet* pArgs = rReq.GetArgs();
1090 0 : if ( pArgs && pView )
1091 : {
1092 0 : SfxViewShell* pViewShell = pView->GetViewShell();
1093 0 : SfxObjectShell* pObjShell = pView->GetObjectShell();
1094 0 : if ( pViewShell && pObjShell )
1095 : {
1096 0 : SfxRequest aReq( SID_BASICIDE_SHOWWINDOW, SFX_CALLMODE_SYNCHRON, pObjShell->GetPool() );
1097 0 : aReq.SetArgs( *pArgs );
1098 0 : pViewShell->ExecuteSlot( aReq );
1099 : }
1100 : }
1101 :
1102 0 : rReq.Done();
1103 : }
1104 0 : break;
1105 :
1106 : case SID_BASICCHOOSER:
1107 : {
1108 0 : const SfxItemSet* pArgs = rReq.GetArgs();
1109 : const SfxPoolItem* pItem;
1110 0 : bool bChooseOnly = false;
1111 0 : Reference< XModel > xLimitToModel;
1112 0 : if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_RECORDMACRO, false, &pItem) )
1113 : {
1114 0 : bool bRecord = ((SfxBoolItem*)pItem)->GetValue();
1115 0 : if ( bRecord )
1116 : {
1117 : // !Hack
1118 0 : bChooseOnly = false;
1119 0 : SfxObjectShell* pCurrentShell = SfxObjectShell::Current();
1120 : OSL_ENSURE( pCurrentShell, "macro recording outside an SFX document?" );
1121 0 : if ( pCurrentShell )
1122 0 : xLimitToModel = pCurrentShell->GetModel();
1123 : }
1124 : }
1125 :
1126 0 : rReq.SetReturnValue( SfxStringItem( rReq.GetSlot(), ChooseMacro( xLimitToModel, bChooseOnly ) ) );
1127 0 : rReq.Done();
1128 : }
1129 0 : break;
1130 :
1131 : case SID_MACROORGANIZER:
1132 : {
1133 : OSL_TRACE("handling SID_MACROORGANIZER");
1134 0 : const SfxItemSet* pArgs = rReq.GetArgs();
1135 : const SfxPoolItem* pItem;
1136 0 : sal_Int16 nTabId = 0;
1137 0 : if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_MACROORGANIZER, false, &pItem) )
1138 : {
1139 0 : nTabId = ((SfxUInt16Item*)pItem)->GetValue();
1140 : }
1141 :
1142 0 : SfxApplication::MacroOrganizer( nTabId );
1143 0 : rReq.Done();
1144 : }
1145 0 : break;
1146 :
1147 : case SID_RUNMACRO:
1148 : {
1149 0 : SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
1150 : OSL_TRACE("SfxApplication::OfaExec_Impl: case ScriptOrg");
1151 :
1152 0 : Reference< XFrame > xFrame;
1153 0 : const SfxItemSet* pIntSet = rReq.GetInternalArgs_Impl();
1154 0 : SFX_ITEMSET_ARG( pIntSet, pFrameItem, SfxUnoFrameItem, SID_FILLFRAME, false );
1155 0 : if ( pFrameItem )
1156 0 : xFrame = pFrameItem->GetFrame();
1157 :
1158 0 : if ( !xFrame.is() )
1159 : {
1160 0 : const SfxViewFrame* pViewFrame = SfxViewFrame::Current();
1161 0 : if ( pViewFrame )
1162 0 : xFrame = pViewFrame->GetFrame().GetFrameInterface();
1163 : }
1164 :
1165 : do // artificial loop for flow control
1166 : {
1167 : AbstractScriptSelectorDialog* pDlg = pFact->CreateScriptSelectorDialog(
1168 0 : lcl_getDialogParent( xFrame, GetTopWindow() ), false, xFrame );
1169 : OSL_ENSURE( pDlg, "SfxApplication::OfaExec_Impl( SID_RUNMACRO ): no dialog!" );
1170 0 : if ( !pDlg )
1171 0 : break;
1172 0 : pDlg->SetRunLabel();
1173 :
1174 0 : short nDialogResult = pDlg->Execute();
1175 0 : if ( !nDialogResult )
1176 : {
1177 0 : delete pDlg;
1178 0 : break;
1179 : }
1180 :
1181 0 : Sequence< Any > args;
1182 0 : Sequence< sal_Int16 > outIndex;
1183 0 : Sequence< Any > outArgs;
1184 0 : Any ret;
1185 :
1186 0 : Reference< XInterface > xScriptContext;
1187 :
1188 0 : Reference< XController > xController;
1189 0 : if ( xFrame.is() )
1190 0 : xController = xFrame->getController();
1191 0 : if ( xController.is() )
1192 0 : xScriptContext = xController->getModel();
1193 0 : if ( !xScriptContext.is() )
1194 0 : xScriptContext = xController;
1195 :
1196 0 : SfxObjectShell::CallXScript( xScriptContext, pDlg->GetScriptURL(), args, ret, outIndex, outArgs );
1197 0 : delete pDlg;
1198 : }
1199 : while ( false );
1200 0 : rReq.Done();
1201 : }
1202 0 : break;
1203 :
1204 : case SID_SCRIPTORGANIZER:
1205 : {
1206 0 : SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
1207 : OSL_TRACE("SfxApplication::OfaExec_Impl: case ScriptOrg");
1208 0 : const SfxItemSet* pArgs = rReq.GetArgs();
1209 : const SfxPoolItem* pItem;
1210 0 : OUString aLanguage;
1211 0 : if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_SCRIPTORGANIZER, false, &pItem) )
1212 : {
1213 0 : aLanguage = ((SfxScriptOrganizerItem*)pItem)->getLanguage();
1214 : }
1215 :
1216 0 : OUString aLang( aLanguage );
1217 : OSL_TRACE("SfxApplication::OfaExec_Impl: about to create dialog for: %s", OUStringToOString( aLang , RTL_TEXTENCODING_ASCII_US ).pData->buffer);
1218 : // not sure about the Window*
1219 0 : VclAbstractDialog* pDlg = pFact->CreateSvxScriptOrgDialog( GetTopWindow(), aLanguage );
1220 0 : if( pDlg )
1221 : {
1222 0 : pDlg->Execute();
1223 0 : delete pDlg;
1224 : }
1225 : else
1226 : {
1227 : OSL_TRACE("no dialog!!!");
1228 : }
1229 0 : rReq.Done();
1230 : }
1231 0 : break;
1232 : #endif // !DISABLE_SCRIPTING
1233 :
1234 : case SID_OFFICE_CHECK_PLZ:
1235 : {
1236 0 : bool bRet = false;
1237 0 : SFX_REQUEST_ARG(rReq, pStringItem, SfxStringItem, rReq.GetSlot(), false);
1238 :
1239 0 : if ( pStringItem )
1240 : {
1241 0 : bRet = true /*!!!SfxIniManager::CheckPLZ( aPLZ )*/;
1242 : }
1243 : #ifndef DISABLE_SCRIPTING
1244 : else
1245 0 : SbxBase::SetError( SbxERR_WRONG_ARGS );
1246 : #endif
1247 0 : rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), bRet ) );
1248 : }
1249 0 : break;
1250 :
1251 : case SID_AUTO_CORRECT_DLG:
1252 : {
1253 0 : SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
1254 0 : if ( pFact )
1255 : {
1256 0 : SfxItemSet aSet(GetPool(), SID_AUTO_CORRECT_DLG, SID_AUTO_CORRECT_DLG);
1257 0 : const SfxPoolItem* pItem=NULL;
1258 0 : const SfxItemSet* pSet = rReq.GetArgs();
1259 0 : SfxItemPool* pSetPool = pSet ? pSet->GetPool() : NULL;
1260 0 : if ( pSet && pSet->GetItemState( pSetPool->GetWhich( SID_AUTO_CORRECT_DLG ), false, &pItem ) == SFX_ITEM_SET )
1261 0 : aSet.Put( *pItem );
1262 :
1263 0 : SfxAbstractTabDialog* pDlg = pFact->CreateTabDialog( RID_OFA_AUTOCORR_DLG, NULL, &aSet, NULL );
1264 0 : pDlg->Execute();
1265 0 : delete pDlg;
1266 : }
1267 :
1268 0 : break;
1269 : }
1270 :
1271 : case SID_SD_AUTOPILOT :
1272 : case SID_NEWSD :
1273 : {
1274 0 : SvtModuleOptions aModuleOpt;
1275 0 : if ( !aModuleOpt.IsImpress() )
1276 : {
1277 0 : ErrorBox( 0, ResId( RID_ERRBOX_MODULENOTINSTALLED, *GetOffResManager_Impl() )).Execute();
1278 0 : return;
1279 : }
1280 :
1281 0 : Reference< uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
1282 0 : Reference< frame::XDispatchProvider > xProv = drawing::ModuleDispatcher::create( xContext );
1283 :
1284 0 : OUString aCmd = OUString::createFromAscii( GetInterface()->GetSlot( rReq.GetSlot() )->GetUnoName() );
1285 0 : Reference< frame::XDispatchHelper > xHelper( frame::DispatchHelper::create(xContext) );
1286 0 : Sequence < beans::PropertyValue > aSeq;
1287 0 : if ( rReq.GetArgs() )
1288 0 : TransformItems( rReq.GetSlot(), *rReq.GetArgs(), aSeq );
1289 0 : Any aResult = xHelper->executeDispatch( xProv, aCmd, OUString(), 0, aSeq );
1290 0 : frame::DispatchResultEvent aEvent;
1291 0 : bool bSuccess = (aResult >>= aEvent) &&
1292 0 : (aEvent.State == frame::DispatchResultState::SUCCESS);
1293 0 : rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), bSuccess ) );
1294 : }
1295 0 : break;
1296 :
1297 : case FN_LABEL :
1298 : case FN_BUSINESS_CARD :
1299 : case FN_XFORMS_INIT :
1300 : {
1301 0 : Reference< uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
1302 0 : Reference< frame::XDispatchProvider > xProv = text::ModuleDispatcher::create( xContext );
1303 :
1304 0 : OUString aCmd = OUString::createFromAscii( GetInterface()->GetSlot( rReq.GetSlot() )->GetUnoName() );
1305 0 : Reference< frame::XDispatchHelper > xHelper( frame::DispatchHelper::create(xContext) );
1306 0 : Sequence < beans::PropertyValue > aSeq;
1307 0 : if ( rReq.GetArgs() )
1308 0 : TransformItems( rReq.GetSlot(), *rReq.GetArgs(), aSeq );
1309 0 : Any aResult = xHelper->executeDispatch( xProv, aCmd, OUString(), 0, aSeq );
1310 0 : frame::DispatchResultEvent aEvent;
1311 0 : bool bSuccess = (aResult >>= aEvent) &&
1312 0 : (aEvent.State == frame::DispatchResultState::SUCCESS);
1313 0 : rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), bSuccess ) );
1314 : }
1315 0 : break;
1316 :
1317 : case SID_ADDRESS_DATA_SOURCE:
1318 : {
1319 : try
1320 : {
1321 0 : Reference< uno::XComponentContext > xORB = ::comphelper::getProcessComponentContext();
1322 0 : Reference< ui::dialogs::XExecutableDialog > xDialog;
1323 0 : xDialog = ui::dialogs::AddressBookSourcePilot::createWithParent(xORB, 0);
1324 0 : xDialog->execute();
1325 : }
1326 0 : catch(const ::com::sun::star::uno::Exception&)
1327 : {
1328 : DBG_UNHANDLED_EXCEPTION();
1329 : }
1330 : }
1331 0 : break;
1332 :
1333 : case SID_COMP_BIBLIOGRAPHY:
1334 0 : lcl_tryLoadBibliography();
1335 0 : break;
1336 : }
1337 : }
1338 :
1339 0 : void SfxApplication::OfaState_Impl(SfxItemSet &rSet)
1340 : {
1341 0 : SvtModuleOptions aModuleOpt;
1342 :
1343 0 : if( !aModuleOpt.IsWriter())
1344 : {
1345 0 : rSet.DisableItem( FN_LABEL );
1346 0 : rSet.DisableItem( FN_BUSINESS_CARD );
1347 0 : rSet.DisableItem( FN_XFORMS_INIT );
1348 : }
1349 :
1350 0 : if ( !aModuleOpt.IsImpress() )
1351 0 : rSet.DisableItem( SID_SD_AUTOPILOT );
1352 3 : }
1353 :
1354 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|