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