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 <memory>
21 : #include <utility>
22 :
23 : #include <sfx2/objsh.hxx>
24 : #include <vcl/svapp.hxx>
25 : #include <vcl/layout.hxx>
26 : #include <vcl/builderfactory.hxx>
27 : #include <osl/mutex.hxx>
28 :
29 : #include <cuires.hrc>
30 : #include "scriptdlg.hrc"
31 : #include "scriptdlg.hxx"
32 : #include <dialmgr.hxx>
33 : #include "selector.hxx"
34 :
35 : #include <com/sun/star/uno/XComponentContext.hpp>
36 : #include <com/sun/star/frame/XDesktop.hpp>
37 : #include <com/sun/star/script/provider/XScriptProviderSupplier.hpp>
38 : #include <com/sun/star/script/provider/XScriptProvider.hpp>
39 : #include <com/sun/star/script/browse/BrowseNodeTypes.hpp>
40 : #include <com/sun/star/script/browse/XBrowseNodeFactory.hpp>
41 : #include <com/sun/star/script/browse/BrowseNodeFactoryViewTypes.hpp>
42 : #include <com/sun/star/script/browse/theBrowseNodeFactory.hpp>
43 : #include <com/sun/star/script/provider/ScriptErrorRaisedException.hpp>
44 : #include <com/sun/star/script/provider/ScriptExceptionRaisedException.hpp>
45 : #include <com/sun/star/script/provider/ScriptFrameworkErrorType.hpp>
46 : #include <com/sun/star/frame/Desktop.hpp>
47 : #include <com/sun/star/frame/ModuleManager.hpp>
48 : #include <com/sun/star/script/XInvocation.hpp>
49 : #include <com/sun/star/document/XEmbeddedScripts.hpp>
50 :
51 : #include <cppuhelper/implbase1.hxx>
52 : #include <comphelper/documentinfo.hxx>
53 : #include <comphelper/uno3.hxx>
54 : #include <comphelper/processfactory.hxx>
55 : #include <comphelper/broadcasthelper.hxx>
56 : #include <comphelper/propertycontainer.hxx>
57 : #include <comphelper/proparrhlp.hxx>
58 :
59 : #include <basic/sbx.hxx>
60 : #include <svtools/imagemgr.hxx>
61 : #include "svtools/treelistentry.hxx"
62 : #include <tools/urlobj.hxx>
63 : #include <vector>
64 : #include <algorithm>
65 : #include <boost/scoped_ptr.hpp>
66 :
67 : using namespace ::com::sun::star;
68 : using namespace ::com::sun::star::uno;
69 : using namespace ::com::sun::star::script;
70 : using namespace ::com::sun::star::frame;
71 : using namespace ::com::sun::star::document;
72 :
73 0 : void ShowErrorDialog( const Any& aException )
74 : {
75 0 : boost::scoped_ptr<SvxScriptErrorDialog> pDlg(new SvxScriptErrorDialog( NULL, aException ));
76 0 : pDlg->Execute();
77 0 : }
78 :
79 0 : SFTreeListBox::SFTreeListBox(vcl::Window* pParent)
80 : : SvTreeListBox(pParent)
81 0 : , m_hdImage(CUI_RES(RID_CUIIMG_HARDDISK))
82 0 : , m_libImage(CUI_RES(RID_CUIIMG_LIB))
83 0 : , m_macImage(CUI_RES(RID_CUIIMG_MACRO))
84 0 : , m_docImage(CUI_RES(RID_CUIIMG_DOC))
85 0 : , m_sMyMacros(CUI_RESSTR(RID_SVXSTR_MYMACROS))
86 0 : , m_sProdMacros(CUI_RESSTR(RID_SVXSTR_PRODMACROS))
87 : {
88 0 : SetSelectionMode( SINGLE_SELECTION );
89 :
90 0 : SetStyle( GetStyle() | WB_CLIPCHILDREN | WB_HSCROLL |
91 : WB_HASBUTTONS | WB_HASBUTTONSATROOT | WB_HIDESELECTION |
92 0 : WB_HASLINES | WB_HASLINESATROOT | WB_TABSTOP );
93 0 : SetNodeDefaultImages();
94 :
95 0 : nMode = 0xFF; // everything
96 0 : }
97 :
98 0 : VCL_BUILDER_FACTORY(SFTreeListBox)
99 :
100 0 : SFTreeListBox::~SFTreeListBox()
101 : {
102 0 : disposeOnce();
103 0 : }
104 :
105 0 : void SFTreeListBox::dispose()
106 : {
107 0 : deleteAllTree();
108 0 : SvTreeListBox::dispose();
109 0 : }
110 :
111 0 : void SFTreeListBox::delUserData( SvTreeListEntry* pEntry )
112 : {
113 0 : if ( pEntry )
114 : {
115 0 : SFEntry* pUserData = static_cast<SFEntry*>(pEntry->GetUserData());
116 0 : if ( pUserData )
117 : {
118 0 : delete pUserData;
119 : // TBD seem to get a Select event on node that is remove ( below )
120 : // so need to be able to detect that this node is not to be
121 : // processed in order to do this, setting userData to NULL ( must
122 : // be a better way to do this )
123 0 : pUserData = 0;
124 0 : pEntry->SetUserData( pUserData );
125 : }
126 : }
127 0 : }
128 :
129 0 : void SFTreeListBox::deleteTree( SvTreeListEntry* pEntry )
130 : {
131 :
132 0 : delUserData( pEntry );
133 0 : pEntry = FirstChild( pEntry );
134 0 : while ( pEntry )
135 : {
136 0 : SvTreeListEntry* pNextEntry = NextSibling( pEntry );
137 0 : deleteTree( pEntry );
138 0 : GetModel()->Remove( pEntry );
139 0 : pEntry = pNextEntry;
140 : }
141 0 : }
142 :
143 0 : void SFTreeListBox::deleteAllTree()
144 : {
145 0 : SvTreeListEntry* pEntry = GetEntry( 0 );
146 :
147 : // TBD - below is a candidate for a destroyAllTrees method
148 0 : if ( pEntry )
149 : {
150 0 : while ( pEntry )
151 : {
152 0 : SvTreeListEntry* pNextEntry = NextSibling( pEntry ) ;
153 0 : deleteTree( pEntry );
154 0 : GetModel()->Remove( pEntry );
155 0 : pEntry = pNextEntry;
156 : }
157 : }
158 0 : }
159 :
160 0 : void SFTreeListBox::Init( const OUString& language )
161 : {
162 0 : SetUpdateMode( false );
163 :
164 0 : deleteAllTree();
165 :
166 0 : Reference< browse::XBrowseNode > rootNode;
167 : Reference< XComponentContext > xCtx(
168 0 : comphelper::getProcessComponentContext() );
169 :
170 0 : Sequence< Reference< browse::XBrowseNode > > children;
171 :
172 0 : OUString userStr("user");
173 0 : OUString shareStr("share");
174 :
175 : try
176 : {
177 0 : Reference< browse::XBrowseNodeFactory > xFac = browse::theBrowseNodeFactory::get(xCtx);
178 :
179 0 : rootNode.set( xFac->createView(
180 0 : browse::BrowseNodeFactoryViewTypes::MACROORGANIZER ) );
181 :
182 0 : if ( rootNode.is() && rootNode->hasChildNodes() == sal_True )
183 : {
184 0 : children = rootNode->getChildNodes();
185 0 : }
186 : }
187 0 : catch( Exception& e )
188 : {
189 : OSL_TRACE("Exception getting root browse node from factory: %s",
190 : OUStringToOString(
191 : e.Message , RTL_TEXTENCODING_ASCII_US ).pData->buffer );
192 : // TODO exception handling
193 : }
194 :
195 0 : Reference<XModel> xDocumentModel;
196 0 : for ( sal_Int32 n = 0; n < children.getLength(); n++ )
197 : {
198 0 : bool app = false;
199 0 : OUString uiName = children[ n ]->getName();
200 0 : OUString factoryURL;
201 0 : if ( uiName.equals( userStr ) || uiName.equals( shareStr ) )
202 : {
203 0 : app = true;
204 0 : if ( uiName.equals( userStr ) )
205 : {
206 0 : uiName = m_sMyMacros;
207 : }
208 : else
209 : {
210 0 : uiName = m_sProdMacros;
211 : }
212 : }
213 : else
214 : {
215 0 : xDocumentModel.set(getDocumentModel(xCtx, uiName ), UNO_QUERY);
216 :
217 0 : if ( xDocumentModel.is() )
218 : {
219 0 : Reference< frame::XModuleManager2 > xModuleManager( frame::ModuleManager::create(xCtx) );
220 :
221 : // get the long name of the document:
222 0 : Sequence<beans::PropertyValue> moduleDescr;
223 : try{
224 0 : OUString appModule = xModuleManager->identify( xDocumentModel );
225 0 : xModuleManager->getByName(appModule) >>= moduleDescr;
226 0 : } catch(const uno::Exception&)
227 : {}
228 :
229 : beans::PropertyValue const * pmoduleDescr =
230 0 : moduleDescr.getConstArray();
231 0 : for ( sal_Int32 pos = moduleDescr.getLength(); pos--; )
232 : {
233 0 : if ( pmoduleDescr[ pos ].Name == "ooSetupFactoryEmptyDocumentURL" )
234 : {
235 0 : pmoduleDescr[ pos ].Value >>= factoryURL;
236 0 : break;
237 : }
238 0 : }
239 : }
240 : }
241 :
242 0 : OUString lang( language );
243 : Reference< browse::XBrowseNode > langEntries =
244 0 : getLangNodeFromRootNode( children[ n ], lang );
245 :
246 : insertEntry( uiName, app ? RID_CUIIMG_HARDDISK : RID_CUIIMG_DOC,
247 0 : 0, true, std::unique_ptr< SFEntry >(new SFEntry( OBJTYPE_SFROOT, langEntries, xDocumentModel )), factoryURL );
248 0 : }
249 :
250 0 : SetUpdateMode( true );
251 0 : }
252 :
253 : Reference< XInterface >
254 0 : SFTreeListBox::getDocumentModel( Reference< XComponentContext >& xCtx, OUString& docName )
255 : {
256 0 : Reference< XInterface > xModel;
257 0 : Reference< frame::XDesktop2 > desktop = frame::Desktop::create(xCtx);
258 :
259 : Reference< container::XEnumerationAccess > componentsAccess =
260 0 : desktop->getComponents();
261 : Reference< container::XEnumeration > components =
262 0 : componentsAccess->createEnumeration();
263 0 : while (components->hasMoreElements())
264 : {
265 : Reference< frame::XModel > model(
266 0 : components->nextElement(), UNO_QUERY );
267 0 : if ( model.is() )
268 : {
269 0 : OUString sTdocUrl = ::comphelper::DocumentInfo::getDocumentTitle( model );
270 0 : if( sTdocUrl.equals( docName ) )
271 : {
272 0 : xModel = model;
273 0 : break;
274 0 : }
275 : }
276 0 : }
277 0 : return xModel;
278 : }
279 :
280 : Reference< browse::XBrowseNode >
281 0 : SFTreeListBox::getLangNodeFromRootNode( Reference< browse::XBrowseNode >& rootNode, OUString& language )
282 : {
283 0 : Reference< browse::XBrowseNode > langNode;
284 :
285 : try
286 : {
287 0 : Sequence < Reference< browse::XBrowseNode > > children = rootNode->getChildNodes();
288 0 : for ( sal_Int32 n = 0; n < children.getLength(); n++ )
289 : {
290 0 : if ( children[ n ]->getName().equals( language ) )
291 : {
292 0 : langNode = children[ n ];
293 0 : break;
294 : }
295 0 : }
296 : }
297 0 : catch ( Exception& )
298 : {
299 : // if getChildNodes() throws an exception we just return
300 : // the empty Reference
301 : }
302 0 : return langNode;
303 : }
304 :
305 0 : void SFTreeListBox:: RequestSubEntries( SvTreeListEntry* pRootEntry, Reference< ::com::sun::star::script::browse::XBrowseNode >& node,
306 : Reference< XModel >& model )
307 : {
308 0 : if (! node.is() )
309 : {
310 0 : return;
311 : }
312 :
313 0 : Sequence< Reference< browse::XBrowseNode > > children;
314 : try
315 : {
316 0 : children = node->getChildNodes();
317 : }
318 0 : catch ( Exception& )
319 : {
320 : // if we catch an exception in getChildNodes then no entries are added
321 : }
322 :
323 0 : for ( sal_Int32 n = 0; n < children.getLength(); n++ )
324 : {
325 0 : OUString name( children[ n ]->getName() );
326 0 : if ( children[ n ]->getType() != browse::BrowseNodeTypes::SCRIPT)
327 : {
328 0 : insertEntry( name, RID_CUIIMG_LIB, pRootEntry, true, std::unique_ptr< SFEntry >(new SFEntry( OBJTYPE_SCRIPTCONTAINER, children[ n ],model )));
329 : }
330 : else
331 : {
332 0 : if ( children[ n ]->getType() == browse::BrowseNodeTypes::SCRIPT )
333 : {
334 0 : insertEntry( name, RID_CUIIMG_MACRO, pRootEntry, false, std::unique_ptr< SFEntry >(new SFEntry( OBJTYPE_METHOD, children[ n ],model )));
335 :
336 : }
337 : }
338 0 : }
339 : }
340 :
341 0 : bool SFTreeListBox::ExpandingHdl()
342 : {
343 0 : return true;
344 : }
345 :
346 0 : SvTreeListEntry * SFTreeListBox::insertEntry(
347 : OUString const & rText, sal_uInt16 nBitmap, SvTreeListEntry * pParent,
348 : bool bChildrenOnDemand, std::unique_ptr< SFEntry > && aUserData, const OUString& factoryURL )
349 : {
350 : SvTreeListEntry * p;
351 0 : if( nBitmap == RID_CUIIMG_DOC && !factoryURL.isEmpty() )
352 : {
353 0 : Image aImage = SvFileInformationManager::GetFileImage( INetURLObject(factoryURL), false );
354 : p = InsertEntry(
355 : rText, aImage, aImage, pParent, bChildrenOnDemand, TREELIST_APPEND,
356 0 : aUserData.release()); // XXX possible leak
357 : }
358 : else
359 : {
360 0 : p = insertEntry( rText, nBitmap, pParent, bChildrenOnDemand, std::move(aUserData) );
361 : }
362 0 : return p;
363 : }
364 :
365 0 : SvTreeListEntry * SFTreeListBox::insertEntry(
366 : OUString const & rText, sal_uInt16 nBitmap, SvTreeListEntry * pParent,
367 : bool bChildrenOnDemand, std::unique_ptr< SFEntry > && aUserData )
368 : {
369 0 : Image aImage;
370 0 : if( nBitmap == RID_CUIIMG_HARDDISK )
371 : {
372 0 : aImage = m_hdImage;
373 : }
374 0 : else if( nBitmap == RID_CUIIMG_LIB )
375 : {
376 0 : aImage = m_libImage;
377 : }
378 0 : else if( nBitmap == RID_CUIIMG_MACRO )
379 : {
380 0 : aImage = m_macImage;
381 : }
382 0 : else if( nBitmap == RID_CUIIMG_DOC )
383 : {
384 0 : aImage = m_docImage;
385 : }
386 : SvTreeListEntry * p = InsertEntry(
387 : rText, aImage, aImage, pParent, bChildrenOnDemand, TREELIST_APPEND,
388 0 : aUserData.release()); // XXX possible leak
389 0 : return p;
390 : }
391 :
392 0 : void SFTreeListBox::RequestingChildren( SvTreeListEntry* pEntry )
393 : {
394 0 : SFEntry* userData = 0;
395 0 : if ( !pEntry )
396 : {
397 0 : return;
398 : }
399 0 : userData = static_cast<SFEntry*>(pEntry->GetUserData());
400 :
401 0 : Reference< browse::XBrowseNode > node;
402 0 : Reference< XModel > model;
403 0 : if ( userData && !userData->isLoaded() )
404 : {
405 0 : node = userData->GetNode();
406 0 : model = userData->GetModel();
407 0 : RequestSubEntries( pEntry, node, model );
408 0 : userData->setLoaded();
409 0 : }
410 : }
411 :
412 0 : void SFTreeListBox::ExpandedHdl()
413 : {
414 0 : }
415 :
416 :
417 : // CuiInputDialog ------------------------------------------------------------
418 :
419 0 : CuiInputDialog::CuiInputDialog(vcl::Window * pParent, sal_uInt16 nMode )
420 : : ModalDialog(pParent, "NewLibDialog",
421 0 : "cui/ui/newlibdialog.ui")
422 : {
423 0 : get(m_pEdit, "entry");
424 0 : m_pEdit->GrabFocus();
425 :
426 0 : FixedText *pNewLibFT = get<FixedText>("newlibft");
427 :
428 0 : if ( nMode == INPUTMODE_NEWMACRO )
429 : {
430 0 : pNewLibFT->Hide();
431 0 : FixedText *pNewMacroFT = get<FixedText>("newmacroft");
432 0 : pNewMacroFT->Show();
433 0 : SetText(get<FixedText>("altmacrotitle")->GetText());
434 : }
435 0 : else if ( nMode == INPUTMODE_RENAME )
436 : {
437 0 : pNewLibFT->Hide();
438 0 : FixedText *pRenameFT = get<FixedText>("renameft");
439 0 : pRenameFT->Show();
440 0 : SetText(get<FixedText>("altrenametitle")->GetText());
441 : }
442 0 : }
443 :
444 0 : CuiInputDialog::~CuiInputDialog()
445 : {
446 0 : disposeOnce();
447 0 : }
448 :
449 0 : void CuiInputDialog::dispose()
450 : {
451 0 : m_pEdit.clear();
452 0 : ModalDialog::dispose();
453 0 : }
454 :
455 :
456 : // ScriptOrgDialog ------------------------------------------------------------
457 :
458 0 : SvxScriptOrgDialog::SvxScriptOrgDialog( vcl::Window* pParent, const OUString& language )
459 : : SfxModalDialog(pParent, "ScriptOrganizerDialog",
460 : "cui/ui/scriptorganizer.ui")
461 : , m_sLanguage(language)
462 0 : , m_delErrStr(CUI_RESSTR(RID_SVXSTR_DELFAILED))
463 0 : , m_delErrTitleStr(CUI_RESSTR(RID_SVXSTR_DELFAILED_TITLE))
464 0 : , m_delQueryStr(CUI_RES(RID_SVXSTR_DELQUERY))
465 0 : , m_delQueryTitleStr(CUI_RESSTR(RID_SVXSTR_DELQUERY_TITLE))
466 0 : , m_createErrStr(CUI_RESSTR(RID_SVXSTR_CREATEFAILED))
467 0 : , m_createDupStr(CUI_RESSTR(RID_SVXSTR_CREATEFAILEDDUP))
468 0 : , m_createErrTitleStr(CUI_RESSTR(RID_SVXSTR_CREATEFAILED_TITLE))
469 0 : , m_renameErrStr(CUI_RESSTR(RID_SVXSTR_RENAMEFAILED))
470 0 : , m_renameErrTitleStr(CUI_RESSTR(RID_SVXSTR_RENAMEFAILED_TITLE))
471 : {
472 0 : get(m_pScriptsBox, "scripts");
473 0 : get(m_pRunButton, "run");
474 0 : get(m_pCloseButton, "close");
475 0 : get(m_pCreateButton, "create");
476 0 : get(m_pEditButton, "edit");
477 0 : get(m_pRenameButton, "rename");
478 0 : get(m_pDelButton, "delete");
479 : // must be a neater way to deal with the strings than as above
480 : // append the language to the dialog title
481 0 : OUString winTitle( GetText() );
482 0 : winTitle = winTitle.replaceFirst( "%MACROLANG", m_sLanguage );
483 0 : SetText( winTitle );
484 :
485 0 : m_pScriptsBox->SetSelectHdl( LINK( this, SvxScriptOrgDialog, ScriptSelectHdl ) );
486 0 : m_pRunButton->SetClickHdl( LINK( this, SvxScriptOrgDialog, ButtonHdl ) );
487 0 : m_pCloseButton->SetClickHdl( LINK( this, SvxScriptOrgDialog, ButtonHdl ) );
488 0 : m_pRenameButton->SetClickHdl( LINK( this, SvxScriptOrgDialog, ButtonHdl ) );
489 0 : m_pEditButton->SetClickHdl( LINK( this, SvxScriptOrgDialog, ButtonHdl ) );
490 0 : m_pDelButton->SetClickHdl( LINK( this, SvxScriptOrgDialog, ButtonHdl ) );
491 0 : m_pCreateButton->SetClickHdl( LINK( this, SvxScriptOrgDialog, ButtonHdl ) );
492 :
493 0 : m_pRunButton->Disable();
494 0 : m_pRenameButton->Disable();
495 0 : m_pEditButton->Disable();
496 0 : m_pDelButton->Disable();
497 0 : m_pCreateButton->Disable();
498 :
499 0 : m_pScriptsBox->Init( m_sLanguage );
500 0 : RestorePreviousSelection();
501 0 : }
502 :
503 0 : SvxScriptOrgDialog::~SvxScriptOrgDialog()
504 : {
505 0 : disposeOnce();
506 0 : }
507 :
508 0 : void SvxScriptOrgDialog::dispose()
509 : {
510 : // clear the SelectHdl so that it isn't called during the dtor
511 0 : m_pScriptsBox->SetSelectHdl( Link<>() );
512 0 : m_pScriptsBox.clear();
513 0 : m_pRunButton.clear();
514 0 : m_pCloseButton.clear();
515 0 : m_pCreateButton.clear();
516 0 : m_pEditButton.clear();
517 0 : m_pRenameButton.clear();
518 0 : m_pDelButton.clear();
519 0 : SfxModalDialog::dispose();
520 0 : };
521 :
522 0 : short SvxScriptOrgDialog::Execute()
523 : {
524 :
525 0 : SfxObjectShell *pDoc = SfxObjectShell::GetFirst();
526 :
527 : // force load of MSPs for all documents
528 0 : while ( pDoc )
529 : {
530 : Reference< provider::XScriptProviderSupplier > xSPS =
531 : Reference< provider::XScriptProviderSupplier >
532 0 : ( pDoc->GetModel(), UNO_QUERY );
533 0 : if ( xSPS.is() )
534 : {
535 : Reference< provider::XScriptProvider > ScriptProvider =
536 0 : xSPS->getScriptProvider();
537 : }
538 :
539 0 : pDoc = SfxObjectShell::GetNext(*pDoc);
540 0 : }
541 :
542 0 : vcl::Window* pPrevDlgParent = Application::GetDefDialogParent();
543 0 : Application::SetDefDialogParent( this );
544 0 : short nRet = ModalDialog::Execute();
545 0 : Application::SetDefDialogParent( pPrevDlgParent );
546 0 : return nRet;
547 : }
548 :
549 0 : void SvxScriptOrgDialog::CheckButtons( Reference< browse::XBrowseNode >& node )
550 : {
551 0 : if ( node.is() )
552 : {
553 0 : if ( node->getType() == browse::BrowseNodeTypes::SCRIPT)
554 : {
555 0 : m_pRunButton->Enable();
556 : }
557 : else
558 : {
559 0 : m_pRunButton->Disable();
560 : }
561 0 : Reference< beans::XPropertySet > xProps( node, UNO_QUERY );
562 :
563 0 : if ( !xProps.is() )
564 : {
565 0 : m_pEditButton->Disable();
566 0 : m_pDelButton->Disable();
567 0 : m_pCreateButton->Disable();
568 0 : m_pRunButton->Disable();
569 0 : return;
570 : }
571 :
572 0 : OUString sName("Editable");
573 :
574 0 : if ( getBoolProperty( xProps, sName ) )
575 : {
576 0 : m_pEditButton->Enable();
577 : }
578 : else
579 : {
580 0 : m_pEditButton->Disable();
581 : }
582 :
583 0 : sName = "Deletable";
584 :
585 0 : if ( getBoolProperty( xProps, sName ) )
586 : {
587 0 : m_pDelButton->Enable();
588 : }
589 : else
590 : {
591 0 : m_pDelButton->Disable();
592 : }
593 :
594 0 : sName = "Creatable";
595 :
596 0 : if ( getBoolProperty( xProps, sName ) )
597 : {
598 0 : m_pCreateButton->Enable();
599 : }
600 : else
601 : {
602 0 : m_pCreateButton->Disable();
603 : }
604 :
605 0 : sName = "Renamable";
606 :
607 0 : if ( getBoolProperty( xProps, sName ) )
608 : {
609 0 : m_pRenameButton->Enable();
610 : }
611 : else
612 : {
613 0 : m_pRenameButton->Disable();
614 0 : }
615 : }
616 : else
617 : {
618 : // no node info available, disable all configurable actions
619 0 : m_pDelButton->Disable();
620 0 : m_pCreateButton->Disable();
621 0 : m_pEditButton->Disable();
622 0 : m_pRunButton->Disable();
623 0 : m_pRenameButton->Disable();
624 : }
625 : }
626 :
627 0 : IMPL_LINK( SvxScriptOrgDialog, ScriptSelectHdl, SvTreeListBox *, pBox )
628 : {
629 0 : if ( !pBox->IsSelected( pBox->GetHdlEntry() ) )
630 : {
631 0 : return 0;
632 : }
633 :
634 0 : SvTreeListEntry* pEntry = pBox->GetHdlEntry();
635 :
636 0 : SFEntry* userData = 0;
637 0 : if ( !pEntry )
638 : {
639 0 : return 0;
640 : }
641 0 : userData = static_cast<SFEntry*>(pEntry->GetUserData());
642 :
643 0 : Reference< browse::XBrowseNode > node;
644 0 : if ( userData )
645 : {
646 0 : node = userData->GetNode();
647 0 : CheckButtons( node );
648 : }
649 :
650 0 : return 0;
651 : }
652 :
653 0 : IMPL_LINK( SvxScriptOrgDialog, ButtonHdl, Button *, pButton )
654 : {
655 0 : if ( pButton == m_pCloseButton )
656 : {
657 0 : StoreCurrentSelection();
658 0 : EndDialog( 0 );
659 : }
660 0 : if ( pButton == m_pEditButton ||
661 0 : pButton == m_pCreateButton ||
662 0 : pButton == m_pDelButton ||
663 0 : pButton == m_pRunButton ||
664 0 : pButton == m_pRenameButton )
665 :
666 : {
667 0 : if ( m_pScriptsBox->IsSelected( m_pScriptsBox->GetHdlEntry() ) )
668 : {
669 0 : SvTreeListEntry* pEntry = m_pScriptsBox->GetHdlEntry();
670 0 : SFEntry* userData = 0;
671 0 : if ( !pEntry )
672 : {
673 0 : return 0;
674 : }
675 0 : userData = static_cast<SFEntry*>(pEntry->GetUserData());
676 0 : if ( userData )
677 : {
678 0 : Reference< browse::XBrowseNode > node;
679 0 : Reference< XModel > xModel;
680 :
681 0 : node = userData->GetNode();
682 0 : xModel = userData->GetModel();
683 :
684 0 : if ( !node.is() )
685 : {
686 0 : return 0;
687 : }
688 :
689 0 : if ( pButton == m_pRunButton )
690 : {
691 0 : OUString tmpString;
692 0 : Reference< beans::XPropertySet > xProp( node, UNO_QUERY );
693 0 : Reference< provider::XScriptProvider > mspNode;
694 0 : if( !xProp.is() )
695 : {
696 0 : return 0;
697 : }
698 :
699 0 : if ( xModel.is() )
700 : {
701 0 : Reference< XEmbeddedScripts > xEmbeddedScripts( xModel, UNO_QUERY);
702 0 : if( !xEmbeddedScripts.is() )
703 : {
704 0 : return 0;
705 : }
706 :
707 0 : if (!xEmbeddedScripts->getAllowMacroExecution())
708 : {
709 : // Please FIXME: Show a message box if AllowMacroExecution is false
710 0 : return 0;
711 0 : }
712 : }
713 :
714 :
715 0 : SvTreeListEntry* pParent = m_pScriptsBox->GetParent( pEntry );
716 0 : while ( pParent && !mspNode.is() )
717 : {
718 0 : SFEntry* mspUserData = static_cast<SFEntry*>(pParent->GetUserData());
719 0 : mspNode.set( mspUserData->GetNode() , UNO_QUERY );
720 0 : pParent = m_pScriptsBox->GetParent( pParent );
721 : }
722 0 : xProp->getPropertyValue("URI") >>= tmpString;
723 0 : const OUString scriptURL( tmpString );
724 :
725 0 : if ( mspNode.is() )
726 : {
727 : try
728 : {
729 : Reference< provider::XScript > xScript(
730 0 : mspNode->getScript( scriptURL ), UNO_QUERY_THROW );
731 :
732 0 : const Sequence< Any > args(0);
733 0 : Any aRet;
734 0 : Sequence< sal_Int16 > outIndex;
735 0 : Sequence< Any > outArgs( 0 );
736 0 : aRet = xScript->invoke( args, outIndex, outArgs );
737 : }
738 0 : catch ( reflection::InvocationTargetException& ite )
739 : {
740 0 : ::com::sun::star::uno::Any a = makeAny(ite);
741 0 : ShowErrorDialog(a);
742 : }
743 0 : catch ( provider::ScriptFrameworkErrorException& ite )
744 : {
745 0 : ::com::sun::star::uno::Any a = makeAny(ite);
746 0 : ShowErrorDialog(a);
747 : }
748 0 : catch ( RuntimeException& re )
749 : {
750 0 : ::com::sun::star::uno::Any a = makeAny(re);
751 0 : ShowErrorDialog(a);
752 : }
753 0 : catch ( Exception& e )
754 : {
755 0 : ::com::sun::star::uno::Any a = makeAny(e);
756 0 : ShowErrorDialog(a);
757 : }
758 : }
759 0 : StoreCurrentSelection();
760 0 : EndDialog( 0 );
761 : }
762 0 : else if ( pButton == m_pEditButton )
763 : {
764 0 : Reference< script::XInvocation > xInv( node, UNO_QUERY );
765 0 : if ( xInv.is() )
766 : {
767 0 : StoreCurrentSelection();
768 0 : EndDialog( 0 );
769 0 : Sequence< Any > args(0);
770 0 : Sequence< Any > outArgs( 0 );
771 0 : Sequence< sal_Int16 > outIndex;
772 : try
773 : {
774 : // ISSUE need code to run script here
775 0 : xInv->invoke( "Editable", args, outIndex, outArgs );
776 : }
777 0 : catch( Exception& e )
778 : {
779 : OSL_TRACE("Caught exception trying to invoke %s", OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
780 :
781 0 : }
782 0 : }
783 : }
784 0 : else if ( pButton == m_pCreateButton )
785 : {
786 0 : createEntry( pEntry );
787 : }
788 0 : else if ( pButton == m_pDelButton )
789 : {
790 0 : deleteEntry( pEntry );
791 : }
792 0 : else if ( pButton == m_pRenameButton )
793 : {
794 0 : renameEntry( pEntry );
795 0 : }
796 : }
797 : }
798 : }
799 0 : return 0;
800 : }
801 :
802 0 : Reference< browse::XBrowseNode > SvxScriptOrgDialog::getBrowseNode( SvTreeListEntry* pEntry )
803 : {
804 0 : Reference< browse::XBrowseNode > node;
805 0 : if ( pEntry )
806 : {
807 0 : SFEntry* userData = static_cast<SFEntry*>(pEntry->GetUserData());
808 0 : if ( userData )
809 : {
810 0 : node = userData->GetNode();
811 : }
812 : }
813 :
814 0 : return node;
815 : }
816 :
817 0 : Reference< XModel > SvxScriptOrgDialog::getModel( SvTreeListEntry* pEntry )
818 : {
819 0 : Reference< XModel > model;
820 0 : if ( pEntry )
821 : {
822 0 : SFEntry* userData = static_cast<SFEntry*>(pEntry->GetUserData());
823 0 : if ( userData )
824 : {
825 0 : model = userData->GetModel();
826 : }
827 : }
828 :
829 0 : return model;
830 : }
831 :
832 0 : void SvxScriptOrgDialog::createEntry( SvTreeListEntry* pEntry )
833 : {
834 :
835 0 : Reference< browse::XBrowseNode > aChildNode;
836 0 : Reference< browse::XBrowseNode > node = getBrowseNode( pEntry );
837 0 : Reference< script::XInvocation > xInv( node, UNO_QUERY );
838 :
839 0 : if ( xInv.is() )
840 : {
841 0 : OUString aNewName;
842 0 : OUString aNewStdName;
843 0 : sal_uInt16 nMode = INPUTMODE_NEWLIB;
844 0 : if( m_pScriptsBox->GetModel()->GetDepth( pEntry ) == 0 )
845 : {
846 0 : aNewStdName = "Library" ;
847 : }
848 : else
849 : {
850 0 : aNewStdName = "Macro" ;
851 0 : nMode = INPUTMODE_NEWMACRO;
852 : }
853 : //do we need L10N for this? ie something like:
854 : //String aNewStdName( ResId( STR_STDMODULENAME ) );
855 0 : bool bValid = false;
856 0 : sal_Int32 i = 1;
857 :
858 0 : Sequence< Reference< browse::XBrowseNode > > childNodes;
859 : // no children => ok to create Parcel1 or Script1 without checking
860 : try
861 : {
862 0 : if( node->hasChildNodes() == sal_False )
863 : {
864 0 : aNewName = aNewStdName + OUString::number(i);
865 0 : bValid = true;
866 : }
867 : else
868 : {
869 0 : childNodes = node->getChildNodes();
870 : }
871 : }
872 0 : catch ( Exception& )
873 : {
874 : // ignore, will continue on with empty sequence
875 : }
876 :
877 0 : OUString extn;
878 0 : while ( !bValid )
879 : {
880 0 : aNewName = aNewStdName + OUString::number(i);
881 0 : bool bFound = false;
882 0 : if(childNodes.getLength() > 0 )
883 : {
884 0 : OUString nodeName = childNodes[0]->getName();
885 0 : sal_Int32 extnPos = nodeName.lastIndexOf( '.' );
886 0 : if(extnPos>0)
887 0 : extn = nodeName.copy(extnPos);
888 : }
889 0 : for( sal_Int32 index = 0; index < childNodes.getLength(); index++ )
890 : {
891 0 : if (aNewName+extn == childNodes[index]->getName())
892 : {
893 0 : bFound = true;
894 0 : break;
895 : }
896 : }
897 0 : if( bFound )
898 : {
899 0 : i++;
900 : }
901 : else
902 : {
903 0 : bValid = true;
904 : }
905 : }
906 :
907 0 : ScopedVclPtrInstance< CuiInputDialog > xNewDlg( static_cast<vcl::Window*>(this), nMode );
908 0 : xNewDlg->SetObjectName( aNewName );
909 :
910 0 : do
911 : {
912 0 : if ( xNewDlg->Execute() && !xNewDlg->GetObjectName().isEmpty() )
913 : {
914 0 : OUString aUserSuppliedName = xNewDlg->GetObjectName();
915 0 : bValid = true;
916 0 : for( sal_Int32 index = 0; index < childNodes.getLength(); index++ )
917 : {
918 0 : if (aUserSuppliedName+extn == childNodes[index]->getName())
919 : {
920 0 : bValid = false;
921 0 : OUString aError( m_createErrStr );
922 0 : aError += m_createDupStr;
923 0 : ScopedVclPtrInstance< MessageDialog > aErrorBox(static_cast<vcl::Window*>(this), aError);
924 0 : aErrorBox->SetText( m_createErrTitleStr );
925 0 : aErrorBox->Execute();
926 0 : xNewDlg->SetObjectName( aNewName );
927 0 : break;
928 : }
929 : }
930 0 : if( bValid )
931 0 : aNewName = aUserSuppliedName;
932 : }
933 : else
934 : {
935 : // user hit cancel or hit OK with nothing in the editbox
936 :
937 0 : return;
938 : }
939 : }
940 0 : while ( !bValid );
941 :
942 : // open up parent node (which ensures it's loaded)
943 0 : m_pScriptsBox->RequestingChildren( pEntry );
944 :
945 0 : Sequence< Any > args( 1 );
946 0 : args[ 0 ] <<= aNewName;
947 0 : Sequence< Any > outArgs( 0 );
948 0 : Sequence< sal_Int16 > outIndex;
949 : try
950 : {
951 0 : Any aResult;
952 0 : aResult = xInv->invoke( "Creatable", args, outIndex, outArgs );
953 0 : Reference< browse::XBrowseNode > newNode( aResult, UNO_QUERY );
954 0 : aChildNode = newNode;
955 :
956 : }
957 0 : catch( Exception& e )
958 : {
959 : OSL_TRACE("Caught exception trying to Create %s",
960 : OUStringToOString(
961 : e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
962 0 : }
963 : }
964 0 : if ( aChildNode.is() )
965 : {
966 0 : OUString aChildName = aChildNode->getName();
967 0 : SvTreeListEntry* pNewEntry = NULL;
968 :
969 0 : Reference<XModel> xDocumentModel = getModel( pEntry );
970 :
971 : // ISSUE do we need to remove all entries for parent
972 : // to achieve sort? Just need to determine position
973 : // SvTreeListBox::InsertEntry can take position arg
974 : // -- Basic doesn't do this on create.
975 : // Suppose we could avoid this too. -> created nodes are
976 : // not in alphabetical order
977 0 : if ( aChildNode->getType() == browse::BrowseNodeTypes::SCRIPT )
978 : {
979 : pNewEntry = m_pScriptsBox->insertEntry( aChildName,
980 0 : RID_CUIIMG_MACRO, pEntry, false, std::unique_ptr< SFEntry >(new SFEntry( OBJTYPE_METHOD, aChildNode,xDocumentModel ) ) );
981 : }
982 : else
983 : {
984 : pNewEntry = m_pScriptsBox->insertEntry( aChildName,
985 0 : RID_CUIIMG_LIB, pEntry, false, std::unique_ptr< SFEntry >(new SFEntry( OBJTYPE_SCRIPTCONTAINER, aChildNode,xDocumentModel ) ) );
986 :
987 : // If the Parent is not loaded then set to
988 : // loaded, this will prevent RequestingChildren ( called
989 : // from vcl via RequestingChildren ) from
990 : // creating new ( duplicate ) children
991 0 : SFEntry* userData = static_cast<SFEntry*>(pEntry->GetUserData());
992 0 : if ( userData && !userData->isLoaded() )
993 : {
994 0 : userData->setLoaded();
995 : }
996 : }
997 0 : m_pScriptsBox->SetCurEntry( pNewEntry );
998 0 : m_pScriptsBox->Select( m_pScriptsBox->GetCurEntry() );
999 :
1000 : }
1001 : else
1002 : {
1003 : //ISSUE L10N & message from exception?
1004 0 : OUString aError( m_createErrStr );
1005 0 : ScopedVclPtrInstance< MessageDialog > aErrorBox(static_cast<vcl::Window*>(this), aError);
1006 0 : aErrorBox->SetText( m_createErrTitleStr );
1007 0 : aErrorBox->Execute();
1008 0 : }
1009 : }
1010 :
1011 0 : void SvxScriptOrgDialog::renameEntry( SvTreeListEntry* pEntry )
1012 : {
1013 :
1014 0 : Reference< browse::XBrowseNode > aChildNode;
1015 0 : Reference< browse::XBrowseNode > node = getBrowseNode( pEntry );
1016 0 : Reference< script::XInvocation > xInv( node, UNO_QUERY );
1017 :
1018 0 : if ( xInv.is() )
1019 : {
1020 0 : OUString aNewName = node->getName();
1021 0 : sal_Int32 extnPos = aNewName.lastIndexOf( '.' );
1022 0 : OUString extn;
1023 0 : if(extnPos>0)
1024 : {
1025 0 : extn = aNewName.copy(extnPos);
1026 0 : aNewName = aNewName.copy(0,extnPos);
1027 : }
1028 0 : sal_uInt16 nMode = INPUTMODE_RENAME;
1029 :
1030 0 : ScopedVclPtrInstance< CuiInputDialog > xNewDlg( static_cast<vcl::Window*>(this), nMode );
1031 0 : xNewDlg->SetObjectName( aNewName );
1032 :
1033 : bool bValid;
1034 0 : do
1035 : {
1036 0 : if ( xNewDlg->Execute() && !xNewDlg->GetObjectName().isEmpty() )
1037 : {
1038 0 : OUString aUserSuppliedName = xNewDlg->GetObjectName();
1039 0 : bValid = true;
1040 0 : if( bValid )
1041 0 : aNewName = aUserSuppliedName;
1042 : }
1043 : else
1044 : {
1045 : // user hit cancel or hit OK with nothing in the editbox
1046 0 : return;
1047 : }
1048 : }
1049 0 : while ( !bValid );
1050 :
1051 0 : Sequence< Any > args( 1 );
1052 0 : args[ 0 ] <<= aNewName;
1053 0 : Sequence< Any > outArgs( 0 );
1054 0 : Sequence< sal_Int16 > outIndex;
1055 : try
1056 : {
1057 0 : Any aResult;
1058 0 : aResult = xInv->invoke( "Renamable", args, outIndex, outArgs );
1059 0 : Reference< browse::XBrowseNode > newNode( aResult, UNO_QUERY );
1060 0 : aChildNode = newNode;
1061 :
1062 : }
1063 0 : catch( Exception& e )
1064 : {
1065 : OSL_TRACE("Caught exception trying to Rename %s",
1066 : OUStringToOString(
1067 : e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
1068 0 : }
1069 : }
1070 0 : if ( aChildNode.is() )
1071 : {
1072 0 : m_pScriptsBox->SetEntryText( pEntry, aChildNode->getName() );
1073 0 : m_pScriptsBox->SetCurEntry( pEntry );
1074 0 : m_pScriptsBox->Select( m_pScriptsBox->GetCurEntry() );
1075 :
1076 : }
1077 : else
1078 : {
1079 : //ISSUE L10N & message from exception?
1080 0 : OUString aError( m_renameErrStr );
1081 0 : ScopedVclPtrInstance< MessageDialog > aErrorBox(static_cast<vcl::Window*>(this), aError);
1082 0 : aErrorBox->SetText( m_renameErrTitleStr );
1083 0 : aErrorBox->Execute();
1084 0 : }
1085 : }
1086 0 : void SvxScriptOrgDialog::deleteEntry( SvTreeListEntry* pEntry )
1087 : {
1088 0 : bool result = false;
1089 0 : Reference< browse::XBrowseNode > node = getBrowseNode( pEntry );
1090 : // ISSUE L10N string & can we centre list?
1091 0 : OUString aQuery = m_delQueryStr + getListOfChildren( node, 0 );
1092 0 : VclPtrInstance< MessageDialog > aQueryBox(static_cast<vcl::Window*>(this), aQuery, VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
1093 0 : aQueryBox->SetText( m_delQueryTitleStr );
1094 0 : if ( aQueryBox->Execute() == RET_NO )
1095 : {
1096 0 : return;
1097 : }
1098 :
1099 0 : Reference< script::XInvocation > xInv( node, UNO_QUERY );
1100 0 : if ( xInv.is() )
1101 : {
1102 0 : Sequence< Any > args( 0 );
1103 0 : Sequence< Any > outArgs( 0 );
1104 0 : Sequence< sal_Int16 > outIndex;
1105 : try
1106 : {
1107 0 : Any aResult;
1108 0 : aResult = xInv->invoke( "Deletable", args, outIndex, outArgs );
1109 0 : aResult >>= result; // or do we just assume true if no exception ?
1110 : }
1111 0 : catch( Exception& e )
1112 : {
1113 : OSL_TRACE("Caught exception trying to delete %s",
1114 : OUStringToOString(
1115 : e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
1116 0 : }
1117 : }
1118 :
1119 0 : if ( result )
1120 : {
1121 0 : m_pScriptsBox->deleteTree( pEntry );
1122 0 : m_pScriptsBox->GetModel()->Remove( pEntry );
1123 : }
1124 : else
1125 : {
1126 : //ISSUE L10N & message from exception?
1127 0 : ScopedVclPtrInstance< MessageDialog > aErrorBox(static_cast<vcl::Window*>(this), m_delErrStr);
1128 0 : aErrorBox->SetText( m_delErrTitleStr );
1129 0 : aErrorBox->Execute();
1130 0 : }
1131 :
1132 : }
1133 :
1134 0 : bool SvxScriptOrgDialog::getBoolProperty( Reference< beans::XPropertySet >& xProps,
1135 : OUString& propName )
1136 : {
1137 0 : bool result = false;
1138 : try
1139 : {
1140 0 : xProps->getPropertyValue( propName ) >>= result;
1141 : }
1142 0 : catch ( Exception& )
1143 : {
1144 0 : return result;
1145 : }
1146 0 : return result;
1147 : }
1148 :
1149 0 : OUString SvxScriptOrgDialog::getListOfChildren( Reference< browse::XBrowseNode > node, int depth )
1150 : {
1151 0 : OUString result = "\n";
1152 0 : for( int i=0;i<=depth;i++ )
1153 : {
1154 0 : result += "\t";
1155 : }
1156 0 : result += node->getName();
1157 :
1158 : try
1159 : {
1160 0 : if ( node->hasChildNodes() == sal_True )
1161 : {
1162 : Sequence< Reference< browse::XBrowseNode > > children
1163 0 : = node->getChildNodes();
1164 0 : for ( sal_Int32 n = 0; n < children.getLength(); n++ )
1165 : {
1166 0 : result += getListOfChildren( children[ n ] , depth+1 );
1167 0 : }
1168 : }
1169 : }
1170 0 : catch ( Exception& )
1171 : {
1172 : // ignore, will return an empty string
1173 : }
1174 :
1175 0 : return result;
1176 : }
1177 :
1178 0 : Selection_hash SvxScriptOrgDialog::m_lastSelection;
1179 :
1180 0 : void SvxScriptOrgDialog::StoreCurrentSelection()
1181 : {
1182 0 : OUString aDescription;
1183 0 : if ( m_pScriptsBox->IsSelected( m_pScriptsBox->GetHdlEntry() ) )
1184 : {
1185 0 : SvTreeListEntry* pEntry = m_pScriptsBox->GetHdlEntry();
1186 0 : while( pEntry )
1187 : {
1188 0 : aDescription = m_pScriptsBox->GetEntryText( pEntry ) + aDescription;
1189 0 : pEntry = m_pScriptsBox->GetParent( pEntry );
1190 0 : if ( pEntry )
1191 0 : aDescription = ";" + aDescription;
1192 : }
1193 0 : OUString sDesc( aDescription );
1194 0 : m_lastSelection[ m_sLanguage ] = sDesc;
1195 0 : }
1196 0 : }
1197 :
1198 0 : void SvxScriptOrgDialog::RestorePreviousSelection()
1199 : {
1200 0 : OUString aStoredEntry = m_lastSelection[ m_sLanguage ];
1201 0 : if( aStoredEntry.isEmpty() )
1202 0 : return;
1203 0 : SvTreeListEntry* pEntry = 0;
1204 0 : sal_Int32 nIndex = 0;
1205 0 : while ( nIndex != -1 )
1206 : {
1207 0 : OUString aTmp( aStoredEntry.getToken( 0, ';', nIndex ) );
1208 0 : SvTreeListEntry* pTmpEntry = m_pScriptsBox->FirstChild( pEntry );
1209 0 : while ( pTmpEntry )
1210 : {
1211 0 : if ( m_pScriptsBox->GetEntryText( pTmpEntry ) == aTmp )
1212 : {
1213 0 : pEntry = pTmpEntry;
1214 0 : break;
1215 : }
1216 0 : pTmpEntry = SvTreeListBox::NextSibling( pTmpEntry );
1217 : }
1218 0 : if ( !pTmpEntry )
1219 0 : break;
1220 0 : m_pScriptsBox->RequestingChildren( pEntry );
1221 0 : }
1222 0 : m_pScriptsBox->SetCurEntry( pEntry );
1223 : }
1224 :
1225 0 : OUString ReplaceString(
1226 : const OUString& source,
1227 : const OUString& token,
1228 : const OUString& value )
1229 : {
1230 0 : sal_Int32 pos = source.indexOf( token );
1231 :
1232 0 : if ( pos != -1 && !value.isEmpty() )
1233 : {
1234 0 : return source.replaceAt( pos, token.getLength(), value );
1235 : }
1236 : else
1237 : {
1238 0 : return source;
1239 : }
1240 : }
1241 :
1242 0 : OUString FormatErrorString(
1243 : const OUString& unformatted,
1244 : const OUString& language,
1245 : const OUString& script,
1246 : const OUString& line,
1247 : const OUString& type,
1248 : const OUString& message )
1249 : {
1250 0 : OUString result = unformatted.copy( 0 );
1251 :
1252 0 : result = ReplaceString(result, "%LANGUAGENAME", language );
1253 0 : result = ReplaceString(result, "%SCRIPTNAME", script );
1254 0 : result = ReplaceString(result, "%LINENUMBER", line );
1255 :
1256 0 : if ( !type.isEmpty() )
1257 : {
1258 0 : result += "\n\n" +
1259 0 : OUString(CUI_RES(RID_SVXSTR_ERROR_TYPE_LABEL)) +
1260 0 : " " +
1261 0 : type;
1262 : }
1263 :
1264 0 : if ( !message.isEmpty() )
1265 : {
1266 0 : result += "\n\n" +
1267 0 : OUString(CUI_RES(RID_SVXSTR_ERROR_MESSAGE_LABEL)) +
1268 0 : " " +
1269 0 : message;
1270 : }
1271 :
1272 0 : return result;
1273 : }
1274 :
1275 0 : OUString GetErrorMessage(
1276 : const provider::ScriptErrorRaisedException& eScriptError )
1277 : {
1278 0 : OUString unformatted = CUI_RES( RID_SVXSTR_ERROR_AT_LINE );
1279 :
1280 0 : OUString unknown("UNKNOWN");
1281 0 : OUString language = unknown;
1282 0 : OUString script = unknown;
1283 0 : OUString line = unknown;
1284 0 : OUString type = "";
1285 0 : OUString message = eScriptError.Message;
1286 :
1287 0 : if ( !eScriptError.language.isEmpty() )
1288 : {
1289 0 : language = eScriptError.language;
1290 : }
1291 :
1292 0 : if ( !eScriptError.scriptName.isEmpty() )
1293 : {
1294 0 : script = eScriptError.scriptName;
1295 : }
1296 :
1297 0 : if ( !eScriptError.Message.isEmpty() )
1298 : {
1299 0 : message = eScriptError.Message;
1300 : }
1301 0 : if ( eScriptError.lineNum != -1 )
1302 : {
1303 0 : line = OUString::number( eScriptError.lineNum );
1304 0 : unformatted = CUI_RES( RID_SVXSTR_ERROR_AT_LINE );
1305 : }
1306 : else
1307 : {
1308 0 : unformatted = CUI_RES( RID_SVXSTR_ERROR_RUNNING );
1309 : }
1310 :
1311 : return FormatErrorString(
1312 0 : unformatted, language, script, line, type, message );
1313 : }
1314 :
1315 0 : OUString GetErrorMessage(
1316 : const provider::ScriptExceptionRaisedException& eScriptException )
1317 : {
1318 0 : OUString unformatted = CUI_RES( RID_SVXSTR_EXCEPTION_AT_LINE );
1319 :
1320 0 : OUString unknown("UNKNOWN");
1321 0 : OUString language = unknown;
1322 0 : OUString script = unknown;
1323 0 : OUString line = unknown;
1324 0 : OUString type = unknown;
1325 0 : OUString message = eScriptException.Message;
1326 :
1327 0 : if ( !eScriptException.language.isEmpty() )
1328 : {
1329 0 : language = eScriptException.language;
1330 : }
1331 0 : if ( !eScriptException.scriptName.isEmpty() )
1332 : {
1333 0 : script = eScriptException.scriptName;
1334 : }
1335 :
1336 0 : if ( !eScriptException.Message.isEmpty() )
1337 : {
1338 0 : message = eScriptException.Message;
1339 : }
1340 :
1341 0 : if ( eScriptException.lineNum != -1 )
1342 : {
1343 0 : line = OUString::number( eScriptException.lineNum );
1344 0 : unformatted = CUI_RES( RID_SVXSTR_EXCEPTION_AT_LINE );
1345 : }
1346 : else
1347 : {
1348 0 : unformatted = CUI_RES( RID_SVXSTR_EXCEPTION_RUNNING );
1349 : }
1350 :
1351 0 : if ( !eScriptException.exceptionType.isEmpty() )
1352 : {
1353 0 : type = eScriptException.exceptionType;
1354 : }
1355 :
1356 : return FormatErrorString(
1357 0 : unformatted, language, script, line, type, message );
1358 :
1359 : }
1360 0 : OUString GetErrorMessage(
1361 : const provider::ScriptFrameworkErrorException& sError )
1362 : {
1363 0 : OUString unformatted = CUI_RES( RID_SVXSTR_FRAMEWORK_ERROR_RUNNING );
1364 :
1365 0 : OUString language("UNKNOWN");
1366 :
1367 0 : OUString script("UNKNOWN");
1368 :
1369 0 : OUString message;
1370 :
1371 0 : if ( !sError.scriptName.isEmpty() )
1372 : {
1373 0 : script = sError.scriptName;
1374 : }
1375 0 : if ( !sError.language.isEmpty() )
1376 : {
1377 0 : language = sError.language;
1378 : }
1379 0 : if ( sError.errorType == provider::ScriptFrameworkErrorType::NOTSUPPORTED )
1380 : {
1381 0 : message = OUString(
1382 0 : CUI_RES( RID_SVXSTR_ERROR_LANG_NOT_SUPPORTED ) );
1383 0 : message = ReplaceString(message, "%LANGUAGENAME", language );
1384 :
1385 : }
1386 : else
1387 : {
1388 0 : message = sError.Message;
1389 : }
1390 : return FormatErrorString(
1391 0 : unformatted, language, script, OUString(), OUString(), message );
1392 : }
1393 :
1394 0 : OUString GetErrorMessage( const RuntimeException& re )
1395 : {
1396 0 : Type t = cppu::UnoType<decltype(re)>::get();
1397 0 : OUString message = t.getTypeName();
1398 0 : message += re.Message;
1399 :
1400 0 : return message;
1401 : }
1402 :
1403 0 : OUString GetErrorMessage( const Exception& e )
1404 : {
1405 0 : Type t = cppu::UnoType<decltype(e)>::get();
1406 0 : OUString message = t.getTypeName();
1407 0 : message += e.Message;
1408 :
1409 0 : return message;
1410 : }
1411 :
1412 0 : OUString GetErrorMessage( const com::sun::star::uno::Any& aException )
1413 : {
1414 0 : if ( aException.getValueType() ==
1415 0 : cppu::UnoType<reflection::InvocationTargetException>::get())
1416 : {
1417 0 : reflection::InvocationTargetException ite;
1418 0 : aException >>= ite;
1419 0 : if ( ite.TargetException.getValueType() == cppu::UnoType<provider::ScriptErrorRaisedException>::get())
1420 : {
1421 : // Error raised by script
1422 0 : provider::ScriptErrorRaisedException scriptError;
1423 0 : ite.TargetException >>= scriptError;
1424 0 : return GetErrorMessage( scriptError );
1425 : }
1426 0 : else if ( ite.TargetException.getValueType() == cppu::UnoType<provider::ScriptExceptionRaisedException>::get())
1427 : {
1428 : // Exception raised by script
1429 0 : provider::ScriptExceptionRaisedException scriptException;
1430 0 : ite.TargetException >>= scriptException;
1431 0 : return GetErrorMessage( scriptException );
1432 : }
1433 : else
1434 : {
1435 : // Unknown error, shouldn't happen
1436 : // OSL_ASSERT(...)
1437 0 : }
1438 :
1439 : }
1440 0 : else if ( aException.getValueType() == cppu::UnoType<provider::ScriptFrameworkErrorException>::get())
1441 : {
1442 : // A Script Framework error has occurred
1443 0 : provider::ScriptFrameworkErrorException sfe;
1444 0 : aException >>= sfe;
1445 0 : return GetErrorMessage( sfe );
1446 :
1447 : }
1448 : // unknown exception
1449 0 : Exception e;
1450 0 : RuntimeException rte;
1451 0 : if ( aException >>= rte )
1452 : {
1453 0 : return GetErrorMessage( rte );
1454 : }
1455 :
1456 0 : aException >>= e;
1457 0 : return GetErrorMessage( e );
1458 :
1459 : }
1460 :
1461 0 : SvxScriptErrorDialog::SvxScriptErrorDialog(
1462 : vcl::Window* , ::com::sun::star::uno::Any aException )
1463 0 : : m_sMessage()
1464 : {
1465 0 : SolarMutexGuard aGuard;
1466 0 : m_sMessage = GetErrorMessage( aException );
1467 0 : }
1468 :
1469 0 : SvxScriptErrorDialog::~SvxScriptErrorDialog()
1470 : {
1471 0 : }
1472 :
1473 0 : short SvxScriptErrorDialog::Execute()
1474 : {
1475 : // Show Error dialog asynchronously
1476 :
1477 : // Pass a copy of the message to the ShowDialog method as the
1478 : // SvxScriptErrorDialog may be deleted before ShowDialog is called
1479 : Application::PostUserEvent(
1480 : LINK( this, SvxScriptErrorDialog, ShowDialog ),
1481 0 : new OUString( m_sMessage ) );
1482 :
1483 0 : return 0;
1484 : }
1485 :
1486 0 : IMPL_STATIC_LINK(
1487 : SvxScriptErrorDialog, ShowDialog, OUString*, pMessage )
1488 : {
1489 0 : OUString message;
1490 :
1491 0 : if ( pMessage && !pMessage->isEmpty() )
1492 : {
1493 0 : message = *pMessage;
1494 : }
1495 : else
1496 : {
1497 0 : message = OUString( CUI_RES( RID_SVXSTR_ERROR_TITLE ) );
1498 : }
1499 :
1500 0 : ScopedVclPtrInstance<MessageDialog> pBox( nullptr, message, VCL_MESSAGE_WARNING );
1501 0 : pBox->SetText( CUI_RES( RID_SVXSTR_ERROR_TITLE ) );
1502 0 : pBox->Execute();
1503 :
1504 0 : delete pMessage;
1505 :
1506 0 : return 0;
1507 0 : }
1508 :
1509 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|