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