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 75 void ShowErrorDialog( const Any& aException ) 76 { 77 SvxScriptErrorDialog* pDlg = new SvxScriptErrorDialog( NULL, aException ); 78 pDlg->Execute(); 79 delete pDlg; 80 } 81 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 106 SFTreeListBox::~SFTreeListBox() 107 { 108 deleteAllTree(); 109 } 110 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 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 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 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 > 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 > 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 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 366 long SFTreeListBox::ExpandingHdl() 367 { 368 return sal_True; 369 } 370 371 void SFTreeListBox::ExpandAllTrees() 372 { 373 } 374 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 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 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 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 // ---------------------------------------------------------------------------- 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 528 InputDialog::~InputDialog() 529 { 530 } 531 // ---------------------------------------------------------------------------- 532 // ScriptOrgDialog ------------------------------------------------------------ 533 // ---------------------------------------------------------------------------- 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 582 __EXPORT SvxScriptOrgDialog::~SvxScriptOrgDialog() 583 { 584 // clear the SelectHdl so that it isn't called during the dtor 585 aScriptsBox.SetSelectHdl( Link() ); 586 }; 587 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 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 695 IMPL_LINK_INLINE_START( SvxScriptOrgDialog, MacroDoubleClickHdl, SvTreeListBox *, EMPTYARG ) 696 { 697 return 0; 698 } 699 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 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 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 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 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 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 } 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 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 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 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 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 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 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 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 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 } 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 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 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 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 occured 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 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 1582 SvxScriptErrorDialog::~SvxScriptErrorDialog() 1583 { 1584 } 1585 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 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