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