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_svtools.hxx" 26 #include <svtools/acceleratorexecute.hxx> 27 28 //=============================================== 29 // includes 30 31 #ifndef __COM_SUN_STAR_FRAME_XMODULEMANAGER_HPP_ 32 #include <com/sun/star/frame/XModuleManager.hpp> 33 #endif 34 35 #ifndef __COM_SUN_STAR_FRAME_XDESKTOP_HPP_ 36 #include <com/sun/star/frame/XDesktop.hpp> 37 #endif 38 39 #ifndef __COM_SUN_STAR_UI_XUICONFIGURATIONMANAGER_HPP_ 40 #include <com/sun/star/ui/XUIConfigurationManager.hpp> 41 #endif 42 43 #ifndef __COM_SUN_STAR_UI_XMODULEUICONFIGURATIONMANAGERSUPPLIER_HPP_ 44 #include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp> 45 #endif 46 47 #ifndef __COM_SUN_STAR_UI_XUICONFIGURATIONMANAGERSUPPLIER_HPP_ 48 #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp> 49 #endif 50 51 #ifndef __COM_SUN_STAR_AWT_XTOPWINDOW_HPP_ 52 #include <com/sun/star/awt/XTopWindow.hpp> 53 #endif 54 55 #ifndef __COM_SUN_STAR_AWT_KEYMODIFIER_HPP_ 56 #include <com/sun/star/awt/KeyModifier.hpp> 57 #endif 58 59 #ifndef __COM_SUN_STAR_UNO_SEQUENCE_HXX_ 60 #include <com/sun/star/uno/Sequence.hxx> 61 #endif 62 63 #ifndef __COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_ 64 #include <com/sun/star/beans/PropertyValue.hpp> 65 #endif 66 67 #ifndef __COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_ 68 #include <com/sun/star/lang/DisposedException.hpp> 69 #endif 70 #include <toolkit/helper/vclunohelper.hxx> 71 72 #include <vcl/window.hxx> 73 #include <vcl/svapp.hxx> 74 #include <vos/mutex.hxx> 75 #include <comphelper/uieventslogger.hxx> 76 77 //=============================================== 78 // namespace 79 80 namespace css = ::com::sun::star; 81 82 namespace svt 83 { 84 85 //=============================================== 86 // definitions 87 88 //----------------------------------------------- 89 class SVT_DLLPRIVATE AsyncAccelExec 90 { 91 public: 92 93 //--------------------------------------- 94 /** creates a new instance of this class, which can be used 95 one times only! 96 97 This instance can be forced to execute it's internal set request 98 asynchronous. After that it deletes itself ! 99 */ 100 static AsyncAccelExec* createOnShotInstance(const css::uno::Reference< css::frame::XDispatch >& xDispatch, 101 const css::util::URL& aURL ); 102 103 void execAsync(); 104 105 private: 106 107 //--------------------------------------- 108 /** @short allow creation of instances of this class 109 by using our factory only! 110 */ 111 SVT_DLLPRIVATE AsyncAccelExec(const css::uno::Reference< css::frame::XDispatch >& xDispatch, 112 const css::util::URL& aURL ); 113 114 DECL_DLLPRIVATE_LINK(impl_ts_asyncCallback, void*); 115 116 private: 117 118 ::vcl::EventPoster m_aAsyncCallback; 119 css::uno::Reference< css::frame::XDispatch > m_xDispatch; 120 css::util::URL m_aURL; 121 }; 122 123 //----------------------------------------------- 124 AcceleratorExecute::AcceleratorExecute() 125 : TMutexInit ( ) 126 , m_aAsyncCallback(LINK(this, AcceleratorExecute, impl_ts_asyncCallback)) 127 { 128 } 129 130 //----------------------------------------------- 131 AcceleratorExecute::AcceleratorExecute(const AcceleratorExecute&) 132 : TMutexInit ( ) 133 , m_aAsyncCallback(LINK(this, AcceleratorExecute, impl_ts_asyncCallback)) 134 { 135 // copy construction sint supported in real ... 136 // but we need this ctor to init our async callback ... 137 } 138 139 //----------------------------------------------- 140 AcceleratorExecute::~AcceleratorExecute() 141 { 142 // does nothing real 143 } 144 145 //----------------------------------------------- 146 AcceleratorExecute* AcceleratorExecute::createAcceleratorHelper() 147 { 148 AcceleratorExecute* pNew = new AcceleratorExecute(); 149 return pNew; 150 } 151 152 //----------------------------------------------- 153 void AcceleratorExecute::init(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR, 154 const css::uno::Reference< css::frame::XFrame >& xEnv ) 155 { 156 // SAFE -> ---------------------------------- 157 ::osl::ResettableMutexGuard aLock(m_aLock); 158 159 // take over the uno service manager 160 m_xSMGR = xSMGR; 161 162 // specify our internal dispatch provider 163 // frame or desktop?! => document or global config. 164 sal_Bool bDesktopIsUsed = sal_False; 165 m_xDispatcher = css::uno::Reference< css::frame::XDispatchProvider >(xEnv, css::uno::UNO_QUERY); 166 if (!m_xDispatcher.is()) 167 { 168 aLock.clear(); 169 // <- SAFE ------------------------------ 170 171 css::uno::Reference< css::frame::XDispatchProvider > xDispatcher( 172 xSMGR->createInstance(::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop")), 173 css::uno::UNO_QUERY_THROW); 174 175 // SAFE -> ------------------------------ 176 aLock.reset(); 177 178 m_xDispatcher = xDispatcher; 179 bDesktopIsUsed = sal_True; 180 } 181 182 aLock.clear(); 183 // <- SAFE ---------------------------------- 184 185 // open all needed configuration objects 186 css::uno::Reference< css::ui::XAcceleratorConfiguration > xGlobalCfg; 187 css::uno::Reference< css::ui::XAcceleratorConfiguration > xModuleCfg; 188 css::uno::Reference< css::ui::XAcceleratorConfiguration > xDocCfg ; 189 190 // global cfg 191 xGlobalCfg = AcceleratorExecute::st_openGlobalConfig(xSMGR); 192 if (!bDesktopIsUsed) 193 { 194 // module cfg 195 xModuleCfg = AcceleratorExecute::st_openModuleConfig(xSMGR, xEnv); 196 197 // doc cfg 198 css::uno::Reference< css::frame::XController > xController; 199 css::uno::Reference< css::frame::XModel > xModel; 200 xController = xEnv->getController(); 201 if (xController.is()) 202 xModel = xController->getModel(); 203 if (xModel.is()) 204 xDocCfg = AcceleratorExecute::st_openDocConfig(xModel); 205 } 206 207 // SAFE -> ------------------------------ 208 aLock.reset(); 209 210 m_xGlobalCfg = xGlobalCfg; 211 m_xModuleCfg = xModuleCfg; 212 m_xDocCfg = xDocCfg ; 213 214 aLock.clear(); 215 // <- SAFE ---------------------------------- 216 } 217 218 //----------------------------------------------- 219 sal_Bool AcceleratorExecute::execute(const KeyCode& aVCLKey) 220 { 221 css::awt::KeyEvent aAWTKey = AcceleratorExecute::st_VCLKey2AWTKey(aVCLKey); 222 return execute(aAWTKey); 223 } 224 225 //----------------------------------------------- 226 sal_Bool AcceleratorExecute::execute(const css::awt::KeyEvent& aAWTKey) 227 { 228 ::rtl::OUString sCommand = impl_ts_findCommand(aAWTKey); 229 230 // No Command found? Do nothing! User isnt interested on any error handling .-) 231 if (!sCommand.getLength()) 232 return sal_False; 233 234 // SAFE -> ---------------------------------- 235 ::osl::ResettableMutexGuard aLock(m_aLock); 236 237 css::uno::Reference< css::frame::XDispatchProvider > xProvider = m_xDispatcher; 238 239 aLock.clear(); 240 // <- SAFE ---------------------------------- 241 242 // convert command in URL structure 243 css::uno::Reference< css::util::XURLTransformer > xParser = impl_ts_getURLParser(); 244 css::util::URL aURL; 245 aURL.Complete = sCommand; 246 xParser->parseStrict(aURL); 247 248 // ask for dispatch object 249 css::uno::Reference< css::frame::XDispatch > xDispatch = xProvider->queryDispatch(aURL, ::rtl::OUString(), 0); 250 sal_Bool bRet = xDispatch.is(); 251 if ( bRet ) 252 { 253 if(::comphelper::UiEventsLogger::isEnabled() && m_xSMGR.is() && m_xDispatcher.is()) //#i88653# 254 { 255 try 256 { 257 css::uno::Reference< css::frame::XModuleManager > xModuleDetection( 258 m_xSMGR->createInstance(::rtl::OUString::createFromAscii("com.sun.star.frame.ModuleManager")), 259 css::uno::UNO_QUERY_THROW); 260 261 const ::rtl::OUString sModule = xModuleDetection->identify(m_xDispatcher); 262 css::uno::Sequence<css::beans::PropertyValue> source; 263 ::comphelper::UiEventsLogger::appendDispatchOrigin(source, sModule, ::rtl::OUString::createFromAscii("AcceleratorExecute")); 264 ::comphelper::UiEventsLogger::logDispatch(aURL, source); 265 } 266 catch(const css::uno::Exception&) 267 { } 268 } 269 // Note: Such instance can be used one times only and destroy itself afterwards .-) 270 AsyncAccelExec* pExec = AsyncAccelExec::createOnShotInstance(xDispatch, aURL); 271 pExec->execAsync(); 272 } 273 274 return bRet; 275 } 276 277 //----------------------------------------------- 278 css::awt::KeyEvent AcceleratorExecute::st_VCLKey2AWTKey(const KeyCode& aVCLKey) 279 { 280 css::awt::KeyEvent aAWTKey; 281 aAWTKey.Modifiers = 0; 282 aAWTKey.KeyCode = (sal_Int16)aVCLKey.GetCode(); 283 284 if (aVCLKey.IsShift()) 285 aAWTKey.Modifiers |= css::awt::KeyModifier::SHIFT; 286 if (aVCLKey.IsMod1()) 287 aAWTKey.Modifiers |= css::awt::KeyModifier::MOD1; 288 if (aVCLKey.IsMod2()) 289 aAWTKey.Modifiers |= css::awt::KeyModifier::MOD2; 290 if (aVCLKey.IsMod3()) 291 aAWTKey.Modifiers |= css::awt::KeyModifier::MOD3; 292 return aAWTKey; 293 } 294 295 //----------------------------------------------- 296 KeyCode AcceleratorExecute::st_AWTKey2VCLKey(const css::awt::KeyEvent& aAWTKey) 297 { 298 sal_Bool bShift = ((aAWTKey.Modifiers & css::awt::KeyModifier::SHIFT) == css::awt::KeyModifier::SHIFT ); 299 sal_Bool bMod1 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD1 ) == css::awt::KeyModifier::MOD1 ); 300 sal_Bool bMod2 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD2 ) == css::awt::KeyModifier::MOD2 ); 301 sal_Bool bMod3 = ((aAWTKey.Modifiers & css::awt::KeyModifier::MOD3 ) == css::awt::KeyModifier::MOD3 ); 302 sal_uInt16 nKey = (sal_uInt16)aAWTKey.KeyCode; 303 304 return KeyCode(nKey, bShift, bMod1, bMod2, bMod3); 305 } 306 //----------------------------------------------- 307 ::rtl::OUString AcceleratorExecute::findCommand(const css::awt::KeyEvent& aKey) 308 { 309 return impl_ts_findCommand(aKey); 310 } 311 //----------------------------------------------- 312 ::rtl::OUString AcceleratorExecute::impl_ts_findCommand(const css::awt::KeyEvent& aKey) 313 { 314 // SAFE -> ---------------------------------- 315 ::osl::ResettableMutexGuard aLock(m_aLock); 316 317 css::uno::Reference< css::ui::XAcceleratorConfiguration > xGlobalCfg = m_xGlobalCfg; 318 css::uno::Reference< css::ui::XAcceleratorConfiguration > xModuleCfg = m_xModuleCfg; 319 css::uno::Reference< css::ui::XAcceleratorConfiguration > xDocCfg = m_xDocCfg ; 320 321 aLock.clear(); 322 // <- SAFE ---------------------------------- 323 324 ::rtl::OUString sCommand; 325 326 try 327 { 328 if (xDocCfg.is()) 329 sCommand = xDocCfg->getCommandByKeyEvent(aKey); 330 if (sCommand.getLength()) 331 return sCommand; 332 } 333 catch(const css::container::NoSuchElementException&) 334 {} 335 336 try 337 { 338 if (xModuleCfg.is()) 339 sCommand = xModuleCfg->getCommandByKeyEvent(aKey); 340 if (sCommand.getLength()) 341 return sCommand; 342 } 343 catch(const css::container::NoSuchElementException&) 344 {} 345 346 try 347 { 348 if (xGlobalCfg.is()) 349 sCommand = xGlobalCfg->getCommandByKeyEvent(aKey); 350 if (sCommand.getLength()) 351 return sCommand; 352 } 353 catch(const css::container::NoSuchElementException&) 354 {} 355 356 // fall back to functional key codes 357 if( aKey.Modifiers == 0 ) 358 { 359 switch( aKey.KeyCode ) 360 { 361 case com::sun::star::awt::Key::DELETE_TO_BEGIN_OF_LINE: 362 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:DelToStartOfLine" ) ); 363 364 case com::sun::star::awt::Key::DELETE_TO_END_OF_LINE: 365 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:DelToEndOfLine" ) ); 366 367 case com::sun::star::awt::Key::DELETE_TO_BEGIN_OF_PARAGRAPH: 368 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:DelToStartOfPara" ) ); 369 370 case com::sun::star::awt::Key::DELETE_TO_END_OF_PARAGRAPH: 371 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:DelToEndOfPara" ) ); 372 373 case com::sun::star::awt::Key::DELETE_WORD_BACKWARD: 374 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:DelToStartOfWord" ) ); 375 376 case com::sun::star::awt::Key::DELETE_WORD_FORWARD: 377 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:DelToEndOfWord" ) ); 378 379 case com::sun::star::awt::Key::INSERT_LINEBREAK: 380 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:InsertLinebreak" ) ); 381 382 case com::sun::star::awt::Key::INSERT_PARAGRAPH: 383 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:InsertPara" ) ); 384 385 case com::sun::star::awt::Key::MOVE_WORD_BACKWARD: 386 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GoToPrevWord" ) ); 387 388 case com::sun::star::awt::Key::MOVE_WORD_FORWARD: 389 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GoToNextWord" ) ); 390 391 case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_LINE: 392 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GoToStartOfLine" ) ); 393 394 case com::sun::star::awt::Key::MOVE_TO_END_OF_LINE: 395 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GoToEndOfLine" ) ); 396 397 case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_PARAGRAPH: 398 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GoToStartOfPara" ) ); 399 400 case com::sun::star::awt::Key::MOVE_TO_END_OF_PARAGRAPH: 401 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GoToEndOfPara" ) ); 402 403 case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT: 404 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GoToStartOfDoc" ) ); 405 406 case com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT: 407 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GoToEndOfDoc" ) ); 408 409 case com::sun::star::awt::Key::SELECT_BACKWARD: 410 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CharLeftSel" ) ); 411 412 case com::sun::star::awt::Key::SELECT_FORWARD: 413 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CharRightSel" ) ); 414 415 case com::sun::star::awt::Key::SELECT_WORD_BACKWARD: 416 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:WordLeftSel" ) ); 417 418 case com::sun::star::awt::Key::SELECT_WORD_FORWARD: 419 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:WordRightSel" ) ); 420 421 case com::sun::star::awt::Key::SELECT_WORD: 422 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:SelectWord" ) ); 423 424 case com::sun::star::awt::Key::SELECT_LINE: 425 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "" ) ); 426 427 case com::sun::star::awt::Key::SELECT_PARAGRAPH: 428 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:SelectText" ) ); 429 430 case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE: 431 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:StartOfLineSel" ) ); 432 433 case com::sun::star::awt::Key::SELECT_TO_END_OF_LINE: 434 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:EndOfLineSel" ) ); 435 436 case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_PARAGRAPH: 437 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:StartOfParaSel" ) ); 438 439 case com::sun::star::awt::Key::SELECT_TO_END_OF_PARAGRAPH: 440 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:EndOfParaSel" ) ); 441 442 case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT: 443 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:StartOfDocumentSel" ) ); 444 445 case com::sun::star::awt::Key::SELECT_TO_END_OF_DOCUMENT: 446 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:EndOfDocumentSel" ) ); 447 448 case com::sun::star::awt::Key::SELECT_ALL: 449 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:SelectAll" ) ); 450 default: 451 break; 452 } 453 } 454 455 return ::rtl::OUString(); 456 } 457 458 //----------------------------------------------- 459 css::uno::Reference< css::ui::XAcceleratorConfiguration > AcceleratorExecute::st_openGlobalConfig(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR) 460 { 461 css::uno::Reference< css::ui::XAcceleratorConfiguration > xAccCfg( 462 xSMGR->createInstance(::rtl::OUString::createFromAscii("com.sun.star.ui.GlobalAcceleratorConfiguration")), 463 css::uno::UNO_QUERY_THROW); 464 return xAccCfg; 465 } 466 467 //----------------------------------------------- 468 css::uno::Reference< css::ui::XAcceleratorConfiguration > AcceleratorExecute::st_openModuleConfig(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR , 469 const css::uno::Reference< css::frame::XFrame >& xFrame) 470 { 471 css::uno::Reference< css::frame::XModuleManager > xModuleDetection( 472 xSMGR->createInstance(::rtl::OUString::createFromAscii("com.sun.star.frame.ModuleManager")), 473 css::uno::UNO_QUERY_THROW); 474 475 ::rtl::OUString sModule; 476 try 477 { 478 sModule = xModuleDetection->identify(xFrame); 479 } 480 catch(const css::uno::RuntimeException&rEx) 481 { (void) rEx; throw; } 482 catch(const css::uno::Exception&) 483 { return css::uno::Reference< css::ui::XAcceleratorConfiguration >(); } 484 485 css::uno::Reference< css::ui::XModuleUIConfigurationManagerSupplier > xUISupplier( 486 xSMGR->createInstance(::rtl::OUString::createFromAscii("com.sun.star.ui.ModuleUIConfigurationManagerSupplier")), 487 css::uno::UNO_QUERY_THROW); 488 489 css::uno::Reference< css::ui::XAcceleratorConfiguration > xAccCfg; 490 try 491 { 492 css::uno::Reference< css::ui::XUIConfigurationManager > xUIManager = xUISupplier->getUIConfigurationManager(sModule); 493 xAccCfg = css::uno::Reference< css::ui::XAcceleratorConfiguration >(xUIManager->getShortCutManager(), css::uno::UNO_QUERY_THROW); 494 } 495 catch(const css::container::NoSuchElementException&) 496 {} 497 return xAccCfg; 498 } 499 500 //----------------------------------------------- 501 css::uno::Reference< css::ui::XAcceleratorConfiguration > AcceleratorExecute::st_openDocConfig(const css::uno::Reference< css::frame::XModel >& xModel) 502 { 503 css::uno::Reference< css::ui::XAcceleratorConfiguration > xAccCfg; 504 css::uno::Reference< css::ui::XUIConfigurationManagerSupplier > xUISupplier(xModel, css::uno::UNO_QUERY); 505 if (xUISupplier.is()) 506 { 507 css::uno::Reference< css::ui::XUIConfigurationManager > xUIManager = xUISupplier->getUIConfigurationManager(); 508 xAccCfg.set(xUIManager->getShortCutManager(), css::uno::UNO_QUERY_THROW); 509 } 510 return xAccCfg; 511 } 512 513 //----------------------------------------------- 514 css::uno::Reference< css::util::XURLTransformer > AcceleratorExecute::impl_ts_getURLParser() 515 { 516 // SAFE -> ---------------------------------- 517 ::osl::ResettableMutexGuard aLock(m_aLock); 518 519 if (m_xURLParser.is()) 520 return m_xURLParser; 521 css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR; 522 523 aLock.clear(); 524 // <- SAFE ---------------------------------- 525 526 css::uno::Reference< css::util::XURLTransformer > xParser( 527 xSMGR->createInstance(::rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer")), 528 css::uno::UNO_QUERY_THROW); 529 530 // SAFE -> ---------------------------------- 531 aLock.reset(); 532 m_xURLParser = xParser; 533 aLock.clear(); 534 // <- SAFE ---------------------------------- 535 536 return xParser; 537 } 538 539 //----------------------------------------------- 540 IMPL_LINK(AcceleratorExecute, impl_ts_asyncCallback, void*, EMPTYARG) 541 { 542 // replaced by AsyncAccelExec! 543 return 0; 544 } 545 546 //----------------------------------------------- 547 AsyncAccelExec::AsyncAccelExec(const css::uno::Reference< css::frame::XDispatch >& xDispatch, 548 const css::util::URL& aURL ) 549 : m_aAsyncCallback(LINK(this, AsyncAccelExec, impl_ts_asyncCallback)) 550 , m_xDispatch (xDispatch ) 551 , m_aURL (aURL ) 552 { 553 } 554 555 //----------------------------------------------- 556 AsyncAccelExec* AsyncAccelExec::createOnShotInstance(const css::uno::Reference< css::frame::XDispatch >& xDispatch, 557 const css::util::URL& aURL ) 558 { 559 AsyncAccelExec* pExec = new AsyncAccelExec(xDispatch, aURL); 560 return pExec; 561 } 562 563 //----------------------------------------------- 564 void AsyncAccelExec::execAsync() 565 { 566 m_aAsyncCallback.Post(0); 567 } 568 569 //----------------------------------------------- 570 IMPL_LINK(AsyncAccelExec, impl_ts_asyncCallback, void*,) 571 { 572 if (! m_xDispatch.is()) 573 return 0; 574 575 try 576 { 577 m_xDispatch->dispatch(m_aURL, css::uno::Sequence< css::beans::PropertyValue >()); 578 } 579 catch(const css::lang::DisposedException&) 580 {} 581 catch(const css::uno::RuntimeException& ) 582 { throw; } 583 catch(const css::uno::Exception&) 584 {} 585 586 delete this; 587 588 return 0; 589 } 590 591 } // namespace svt 592