1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_sfx2.hxx" 30 #include <svl/stritem.hxx> 31 #ifndef GCC 32 #endif 33 #include <com/sun/star/util/URL.hpp> 34 #include <com/sun/star/util/XURLTransformer.hpp> 35 #include <com/sun/star/frame/XController.hpp> 36 #include <com/sun/star/lang/XUnoTunnel.hpp> 37 #include <com/sun/star/frame/status/ItemStatus.hpp> 38 #include <com/sun/star/frame/status/ItemState.hpp> 39 #include <com/sun/star/awt/MouseButton.hpp> 40 41 #include <vcl/status.hxx> 42 43 #include <sfx2/app.hxx> 44 #include "sfx2/stbitem.hxx" 45 #include "sfxtypes.hxx" 46 #include <sfx2/msg.hxx> 47 #include "arrdecl.hxx" 48 #include <sfx2/bindings.hxx> 49 #include <sfx2/msgpool.hxx> 50 #include <sfx2/module.hxx> 51 #include <sfx2/dispatch.hxx> 52 #include <sfx2/unoctitm.hxx> 53 #include <sfx2/objsh.hxx> 54 #include <sfx2/sfx.hrc> 55 56 #include <comphelper/processfactory.hxx> 57 #include <svl/eitem.hxx> 58 #include <svl/stritem.hxx> 59 #include <svl/intitem.hxx> 60 #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_ 61 #include <toolkit/unohlp.hxx> 62 #endif 63 #include <toolkit/helper/convert.hxx> 64 65 using namespace ::com::sun::star; 66 67 //-------------------------------------------------------------------- 68 69 sal_uInt16 SfxStatusBarControl::convertAwtToVCLMouseButtons( sal_Int16 nAwtMouseButtons ) 70 { 71 sal_uInt16 nVCLMouseButtons( 0 ); 72 73 if ( nAwtMouseButtons & awt::MouseButton::LEFT ) 74 nVCLMouseButtons |= MOUSE_LEFT; 75 if ( nAwtMouseButtons & awt::MouseButton::RIGHT ) 76 nVCLMouseButtons |= MOUSE_RIGHT; 77 if ( nAwtMouseButtons & awt::MouseButton::MIDDLE ) 78 nVCLMouseButtons |= MOUSE_MIDDLE; 79 80 return nVCLMouseButtons; 81 } 82 83 //-------------------------------------------------------------------- 84 85 svt::StatusbarController* SAL_CALL SfxStatusBarControllerFactory( 86 const uno::Reference< frame::XFrame >& rFrame, 87 StatusBar* pStatusBar, 88 unsigned short nID, 89 const ::rtl::OUString& aCommandURL ) 90 { 91 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 92 93 util::URL aTargetURL; 94 aTargetURL.Complete = aCommandURL; 95 uno::Reference < util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance( 96 rtl::OUString::createFromAscii( "com.sun.star.util.URLTransformer" )), uno::UNO_QUERY ); 97 xTrans->parseStrict( aTargetURL ); 98 99 SfxObjectShell* pObjShell = NULL; 100 uno::Reference < frame::XController > xController; 101 uno::Reference < frame::XModel > xModel; 102 if ( rFrame.is() ) 103 { 104 xController = rFrame->getController(); 105 if ( xController.is() ) 106 xModel = xController->getModel(); 107 } 108 109 if ( xModel.is() ) 110 { 111 // Get tunnel from model to retrieve the SfxObjectShell pointer from it 112 ::com::sun::star::uno::Reference < ::com::sun::star::lang::XUnoTunnel > xObj( xModel, uno::UNO_QUERY ); 113 ::com::sun::star::uno::Sequence < sal_Int8 > aSeq = SvGlobalName( SFX_GLOBAL_CLASSID ).GetByteSequence(); 114 if ( xObj.is() ) 115 { 116 sal_Int64 nHandle = xObj->getSomething( aSeq ); 117 if ( nHandle ) 118 pObjShell = reinterpret_cast< SfxObjectShell* >( sal::static_int_cast< sal_IntPtr >( nHandle )); 119 } 120 } 121 122 SfxModule* pModule = pObjShell ? pObjShell->GetModule() : NULL; 123 SfxSlotPool* pSlotPool = 0; 124 125 if ( pModule ) 126 pSlotPool = pModule->GetSlotPool(); 127 else 128 pSlotPool = &(SfxSlotPool::GetSlotPool( NULL )); 129 130 const SfxSlot* pSlot = pSlotPool->GetUnoSlot( aTargetURL.Path ); 131 if ( pSlot ) 132 { 133 sal_uInt16 nSlotId = pSlot->GetSlotId(); 134 if ( nSlotId > 0 ) 135 { 136 rtl::OString aCmd(".uno:"); 137 aCmd += pSlot->GetUnoName(); 138 pStatusBar->SetHelpId( nSlotId, aCmd ); 139 return SfxStatusBarControl::CreateControl( nSlotId, nID, pStatusBar, pModule ); 140 } 141 } 142 143 return NULL; 144 } 145 146 //-------------------------------------------------------------------- 147 148 SfxStatusBarControl::SfxStatusBarControl 149 ( 150 sal_uInt16 nSlotID, /* Slot-Id, mit der diese Instanz 151 verbunden wird. Wurde bei der 152 Registrierung eine Slot-Id != 0 153 angegeben, ist dies immer die dort 154 angegebene. */ 155 sal_uInt16 nCtrlID, /* ID of this controller in the status bar */ 156 157 StatusBar& rBar /* Referenz auf die StatusBar, f"ur die 158 dieses Control erzeugt wurde. */ 159 ) 160 161 /* [Beschreibung] 162 163 Konstruktor der Klasse SfxStatusBarControl. Die Subclasses werden 164 bei Bedarf per Factory vom SFx erzeugt. 165 166 Instanzen dieser Basisklasse werden f"ur alle StatusBar-Felder 167 erzeugt, f"ur die keine speziellen registriert wurden. 168 */ 169 170 : svt::StatusbarController(), 171 nSlotId( nSlotID ), 172 nId( nCtrlID ), 173 pBar( &rBar ) 174 { 175 } 176 177 //-------------------------------------------------------------------- 178 179 SfxStatusBarControl::~SfxStatusBarControl() 180 181 /* [Beschreibung] 182 183 Destruktor der Klasse SfxStatusBarControl. Die Instanzen dieser 184 Klasse und deren Subklassen werden vom SFx zerst"ort. 185 */ 186 187 {} 188 189 //-------------------------------------------------------------------- 190 // XInterface 191 uno::Any SAL_CALL SfxStatusBarControl::queryInterface( const uno::Type & rType ) 192 throw( uno::RuntimeException) 193 { 194 return svt::StatusbarController::queryInterface( rType ); 195 } 196 197 void SAL_CALL SfxStatusBarControl::acquire() throw() 198 { 199 OWeakObject::acquire(); 200 } 201 202 void SAL_CALL SfxStatusBarControl::release() throw() 203 { 204 OWeakObject::release(); 205 } 206 207 //-------------------------------------------------------------------- 208 // XEventListener 209 void SAL_CALL SfxStatusBarControl::disposing( const lang::EventObject& aEvent ) 210 throw( uno::RuntimeException ) 211 { 212 svt::StatusbarController::disposing( aEvent ); 213 } 214 215 //-------------------------------------------------------------------- 216 // XComponent 217 void SAL_CALL SfxStatusBarControl::dispose() 218 throw (uno::RuntimeException) 219 { 220 svt::StatusbarController::dispose(); 221 } 222 223 //-------------------------------------------------------------------- 224 // XStatusListener 225 void SAL_CALL SfxStatusBarControl::statusChanged( const frame::FeatureStateEvent& rEvent ) 226 throw ( ::com::sun::star::uno::RuntimeException ) 227 { 228 SfxViewFrame* pViewFrame = NULL; 229 uno::Reference < frame::XController > xController; 230 231 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 232 if ( m_xFrame.is() ) 233 xController = m_xFrame->getController(); 234 235 uno::Reference < frame::XDispatchProvider > xProvider( xController, uno::UNO_QUERY ); 236 if ( xProvider.is() ) 237 { 238 uno::Reference < frame::XDispatch > xDisp = xProvider->queryDispatch( rEvent.FeatureURL, ::rtl::OUString(), 0 ); 239 if ( xDisp.is() ) 240 { 241 uno::Reference< lang::XUnoTunnel > xTunnel( xDisp, uno::UNO_QUERY ); 242 SfxOfficeDispatch* pDisp = NULL; 243 if ( xTunnel.is() ) 244 { 245 sal_Int64 nImplementation = xTunnel->getSomething(SfxOfficeDispatch::impl_getStaticIdentifier()); 246 pDisp = reinterpret_cast< SfxOfficeDispatch* >(sal::static_int_cast< sal_IntPtr >( nImplementation )); 247 } 248 249 if ( pDisp ) 250 pViewFrame = pDisp->GetDispatcher_Impl()->GetFrame(); 251 } 252 } 253 254 sal_uInt16 nSlotID = 0; 255 SfxSlotPool& rPool = SfxSlotPool::GetSlotPool( pViewFrame ); 256 const SfxSlot* pSlot = rPool.GetUnoSlot( rEvent.FeatureURL.Path ); 257 if ( pSlot ) 258 nSlotID = pSlot->GetSlotId(); 259 260 if ( nSlotID > 0 ) 261 { 262 if ( rEvent.Requery ) 263 svt::StatusbarController::statusChanged( rEvent ); 264 else 265 { 266 SfxItemState eState = SFX_ITEM_DISABLED; 267 SfxPoolItem* pItem = NULL; 268 if ( rEvent.IsEnabled ) 269 { 270 eState = SFX_ITEM_AVAILABLE; 271 uno::Type pType = rEvent.State.getValueType(); 272 273 if ( pType == ::getVoidCppuType() ) 274 { 275 pItem = new SfxVoidItem( nSlotID ); 276 eState = SFX_ITEM_UNKNOWN; 277 } 278 else if ( pType == ::getBooleanCppuType() ) 279 { 280 sal_Bool bTemp = 0; 281 rEvent.State >>= bTemp ; 282 pItem = new SfxBoolItem( nSlotID, bTemp ); 283 } 284 else if ( pType == ::getCppuType((const sal_uInt16*)0) ) 285 { 286 sal_uInt16 nTemp = 0; 287 rEvent.State >>= nTemp ; 288 pItem = new SfxUInt16Item( nSlotID, nTemp ); 289 } 290 else if ( pType == ::getCppuType((const sal_uInt32*)0) ) 291 { 292 sal_uInt32 nTemp = 0; 293 rEvent.State >>= nTemp ; 294 pItem = new SfxUInt32Item( nSlotID, nTemp ); 295 } 296 else if ( pType == ::getCppuType((const ::rtl::OUString*)0) ) 297 { 298 ::rtl::OUString sTemp ; 299 rEvent.State >>= sTemp ; 300 pItem = new SfxStringItem( nSlotID, sTemp ); 301 } 302 else if ( pType == ::getCppuType((const ::com::sun::star::frame::status::ItemStatus*)0) ) 303 { 304 frame::status::ItemStatus aItemStatus; 305 rEvent.State >>= aItemStatus; 306 eState = aItemStatus.State; 307 pItem = new SfxVoidItem( nSlotID ); 308 } 309 else 310 { 311 if ( pSlot ) 312 pItem = pSlot->GetType()->CreateItem(); 313 if ( pItem ) 314 { 315 pItem->SetWhich( nSlotID ); 316 pItem->PutValue( rEvent.State ); 317 } 318 else 319 pItem = new SfxVoidItem( nSlotID ); 320 } 321 } 322 323 StateChanged( nSlotID, eState, pItem ); 324 delete pItem; 325 } 326 } 327 } 328 329 //-------------------------------------------------------------------- 330 // XStatusbarController 331 332 ::sal_Bool SAL_CALL SfxStatusBarControl::mouseButtonDown( 333 const awt::MouseEvent& rMouseEvent ) 334 throw ( uno::RuntimeException ) 335 { 336 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 337 ::Point aPos( rMouseEvent.X, rMouseEvent.Y ); 338 339 ::MouseEvent aMouseEvent( aPos, 340 (sal_uInt16)rMouseEvent.ClickCount, 341 0, 342 convertAwtToVCLMouseButtons( rMouseEvent.Buttons ), 343 0 ); 344 345 return MouseButtonDown( aMouseEvent ); 346 } 347 348 //-------------------------------------------------------------------- 349 350 ::sal_Bool SAL_CALL SfxStatusBarControl::mouseMove( 351 const awt::MouseEvent& rMouseEvent ) 352 throw (uno::RuntimeException) 353 { 354 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 355 ::Point aPos( rMouseEvent.X, rMouseEvent.Y ); 356 357 ::MouseEvent aMouseEvent( aPos, 358 (sal_uInt16)rMouseEvent.ClickCount, 359 0, 360 convertAwtToVCLMouseButtons( rMouseEvent.Buttons ), 361 0 ); 362 return MouseMove( aMouseEvent ); 363 } 364 365 //-------------------------------------------------------------------- 366 367 ::sal_Bool SAL_CALL SfxStatusBarControl::mouseButtonUp( 368 const ::awt::MouseEvent& rMouseEvent ) 369 throw ( uno::RuntimeException ) 370 { 371 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 372 ::Point aPos( rMouseEvent.X, rMouseEvent.Y ); 373 374 ::MouseEvent aMouseEvent( aPos, 375 (sal_uInt16)rMouseEvent.ClickCount, 376 0, 377 convertAwtToVCLMouseButtons( rMouseEvent.Buttons ), 378 0 ); 379 return MouseButtonUp( aMouseEvent ); 380 } 381 382 //-------------------------------------------------------------------- 383 384 void SAL_CALL SfxStatusBarControl::command( 385 const awt::Point& rPos, 386 ::sal_Int32 nCommand, 387 ::sal_Bool /*bMouseEvent*/, 388 const ::com::sun::star::uno::Any& /*aData*/ ) 389 throw (::com::sun::star::uno::RuntimeException) 390 { 391 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 392 ::Point aPos( rPos.X, rPos.Y ); 393 CommandEvent aCmdEvent( aPos, (sal_uInt16)nCommand, sal_True, NULL ); 394 395 Command( aCmdEvent ); 396 } 397 398 //-------------------------------------------------------------------- 399 400 void SAL_CALL SfxStatusBarControl::paint( 401 const uno::Reference< awt::XGraphics >& xGraphics, 402 const awt::Rectangle& rOutputRectangle, 403 ::sal_Int32 nItemId, 404 ::sal_Int32 nStyle ) 405 throw ( ::uno::RuntimeException ) 406 { 407 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 408 409 OutputDevice* pOutDev = VCLUnoHelper::GetOutputDevice( xGraphics );; 410 if ( pOutDev ) 411 { 412 ::Rectangle aRect = VCLRectangle( rOutputRectangle ); 413 UserDrawEvent aUserDrawEvent( pOutDev, aRect, (sal_uInt16)nItemId, (sal_uInt16)nStyle ); 414 Paint( aUserDrawEvent ); 415 } 416 } 417 418 //-------------------------------------------------------------------- 419 420 void SAL_CALL SfxStatusBarControl::click() 421 throw ( uno::RuntimeException ) 422 { 423 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 424 Click(); 425 } 426 427 //-------------------------------------------------------------------- 428 429 void SAL_CALL SfxStatusBarControl::doubleClick() 430 throw ( uno::RuntimeException ) 431 { 432 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 433 DoubleClick(); 434 } 435 436 //-------------------------------------------------------------------- 437 // old sfx2 interface 438 //-------------------------------------------------------------------- 439 440 void SfxStatusBarControl::StateChanged 441 ( 442 sal_uInt16 nSID, 443 SfxItemState eState, 444 const SfxPoolItem* pState /* Zeiger auf ein SfxPoolItem, welches nur 445 innerhalb dieses Methodenaufrufs g"ultig 446 ist. Es kann ein 0-Pointer, ein Pointer 447 auf ein SfxVoidItem oder auf den Typ, f"ur 448 den die Subclass von SfxStatusBarControl 449 registriert ist vorkommen. */ 450 ) 451 452 /* [Beschreibung] 453 454 Die Basisimplementation versteht Items vom Type SfxStringItem, bei 455 denen der Text in das Status-Zeilen-Feld eingetragen wird und 456 SfxVoidItem, bei denen das Feld geleert wird. Die Basisimplementierng 457 sollte in "uberladenen Methoden nicht gerufen werden. 458 */ 459 460 { 461 DBG_MEMTEST(); 462 DBG_ASSERT( pBar != 0, "setting state to dangling StatusBar" ); 463 464 const SfxStringItem* pStr = PTR_CAST( SfxStringItem, pState ); 465 if ( eState == SFX_ITEM_AVAILABLE && pStr ) 466 pBar->SetItemText( nSID, pStr->GetValue() ); 467 else 468 { 469 DBG_ASSERT( eState != SFX_ITEM_AVAILABLE || pState->ISA(SfxVoidItem), 470 "wrong SfxPoolItem subclass in SfxStatusBarControl" ); 471 pBar->SetItemText( nSID, String() ); 472 } 473 } 474 475 //-------------------------------------------------------------------- 476 477 sal_Bool SfxStatusBarControl::MouseButtonDown( const MouseEvent & ) 478 479 /* [Beschreibung] 480 481 Diese virtuelle Methode ist eine Weiterleitung des Events 482 MouseButtonDown() der StatusBar, falls die Maus-Position innerhalb 483 des Bereichs des betreffenden Items ist, oder die Maus von diesem 484 Control mit <SfxStatusBarControl::CaptureMouse()> gecaptured wurde. 485 486 Die Defaultimplementierung ist leer und gibt FALSE zur"uck. 487 488 489 [Rueckgabewert] 490 491 sal_Bool TRUE 492 das Event wurde bearbeitet und soll nicht an 493 die StatusBar weitergeleitet werden 494 495 FALSE 496 das Event wurde nicht bearbeitet und soll an 497 die StatusBar weitergeleitet werden 498 */ 499 500 { 501 return sal_False; 502 } 503 504 //-------------------------------------------------------------------- 505 506 sal_Bool SfxStatusBarControl::MouseMove( const MouseEvent & ) 507 508 /* [Beschreibung] 509 510 Diese virtuelle Methode ist eine Weiterleitung des Events 511 MouseMove() der StatusBar, falls die Maus-Position innerhalb 512 des Bereichs des betreffenden Items ist, oder die Maus von diesem 513 Control mit <SfxStatusBarControl::CaptureMouse()> gecaptured wurde. 514 515 Die Defaultimplementierung ist leer und gibt FALSE zur"uck. 516 517 518 [Rueckgabewert] 519 520 sal_Bool TRUE 521 das Event wurde bearbeitet und soll nicht an 522 die StatusBar weitergeleitet werden 523 524 FALSE 525 das Event wurde nicht bearbeitet und soll an 526 die StatusBar weitergeleitet werden 527 */ 528 529 { 530 return sal_False; 531 } 532 533 //-------------------------------------------------------------------- 534 535 sal_Bool SfxStatusBarControl::MouseButtonUp( const MouseEvent & ) 536 537 /* [Beschreibung] 538 539 Diese virtuelle Methode ist eine Weiterleitung des Events 540 MouseButtonUp() der StatusBar, falls die Maus-Position innerhalb 541 des Bereichs des betreffenden Items ist, oder die Maus von diesem 542 Control mit <SfxStatusBarControl::CaptureMouse()> gecaptured wurde. 543 544 Die Defaultimplementierung ist leer und gibt FALSE zur"uck. 545 546 547 [Rueckgabewert] 548 549 sal_Bool TRUE 550 das Event wurde bearbeitet und soll nicht an 551 die StatusBar weitergeleitet werden 552 553 FALSE 554 das Event wurde nicht bearbeitet und soll an 555 die StatusBar weitergeleitet werden 556 */ 557 558 { 559 return sal_False; 560 } 561 562 //-------------------------------------------------------------------- 563 564 void SfxStatusBarControl::Command( const CommandEvent& ) 565 566 /* [Beschreibung] 567 568 Diese virtuelle Methode wird gerufen, wenn f"ur dieses SfxStatusBarControl 569 ein CommandEvent f"ur erkannt wurde. 570 571 Die Defaultimplementierung ist leer. 572 */ 573 574 { 575 } 576 577 //-------------------------------------------------------------------- 578 579 void SfxStatusBarControl::Click() 580 581 /* [Beschreibung] 582 583 Diese virtuelle Methode wird gerufen, wenn der Anwender mit der Maus 584 in das zu diesem Control geh"orige Feld der Statuszeile klickt. 585 586 Die Defaultimplementierung ist leer. 587 */ 588 589 { 590 } 591 592 //-------------------------------------------------------------------- 593 594 void SfxStatusBarControl::DoubleClick() 595 596 /* [Beschreibung] 597 598 Diese virtuelle Methode wird gerufen, wenn der Anwender mit der Maus 599 in das zu diesem Control geh"orige Feld der Statuszeile doppel-klickt. 600 */ 601 602 { 603 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aArgs; 604 execute( aArgs ); 605 } 606 607 //-------------------------------------------------------------------- 608 609 void SfxStatusBarControl::Paint 610 ( 611 const UserDrawEvent& /* Referenz auf einen UserDrawEvent */ 612 ) 613 614 /* [Beschreibung] 615 616 Diese virtuelle Methode wird gerufen, falls das betreffende Feld 617 mit SIB_USERDRAW gekennzeichnet ist, um den Inhalt zu zeichnen. 618 Die Ausgabe mu"s auf dem in durch rUDEvt.GetDevice() erh"altlichen 619 OutputDevice innerhalb des durch rUDEvt.GetRect() angegebenenen 620 Rechtecks erfolgen. 621 622 Die Defaultimplementierung ist leer. 623 */ 624 625 { 626 } 627 628 //-------------------------------------------------------------------- 629 630 void SfxStatusBarControl::CaptureMouse() 631 { 632 } 633 634 //-------------------------------------------------------------------- 635 636 void SfxStatusBarControl::ReleaseMouse() 637 { 638 } 639 640 //-------------------------------------------------------------------- 641 642 SfxStatusBarControl* SfxStatusBarControl::CreateControl 643 ( 644 sal_uInt16 nSlotID, 645 sal_uInt16 nStbId, 646 StatusBar* pBar, 647 SfxModule* pMod 648 ) 649 { 650 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 651 SfxApplication *pApp = SFX_APP(); 652 653 SfxSlotPool *pSlotPool; 654 if ( pMod ) 655 pSlotPool = pMod->GetSlotPool(); 656 else 657 pSlotPool = &SfxSlotPool::GetSlotPool(); 658 659 TypeId aSlotType = pSlotPool->GetSlotType(nSlotID); 660 if ( aSlotType ) 661 { 662 if ( pMod ) 663 { 664 SfxStbCtrlFactArr_Impl *pFactories = pMod->GetStbCtrlFactories_Impl(); 665 if ( pFactories ) 666 { 667 SfxStbCtrlFactArr_Impl &rFactories = *pFactories; 668 for ( sal_uInt16 nFactory = 0; nFactory < rFactories.Count(); ++nFactory ) 669 if ( rFactories[nFactory]->nTypeId == aSlotType && 670 ( ( rFactories[nFactory]->nSlotId == 0 ) || 671 ( rFactories[nFactory]->nSlotId == nSlotID) ) ) 672 return rFactories[nFactory]->pCtor( nSlotID, nStbId, *pBar ); 673 } 674 } 675 676 SfxStbCtrlFactArr_Impl &rFactories = pApp->GetStbCtrlFactories_Impl(); 677 for ( sal_uInt16 nFactory = 0; nFactory < rFactories.Count(); ++nFactory ) 678 if ( rFactories[nFactory]->nTypeId == aSlotType && 679 ( ( rFactories[nFactory]->nSlotId == 0 ) || 680 ( rFactories[nFactory]->nSlotId == nSlotID) ) ) 681 return rFactories[nFactory]->pCtor( nSlotID, nStbId, *pBar ); 682 } 683 684 return NULL; 685 } 686 687 //-------------------------------------------------------------------- 688 void SfxStatusBarControl::RegisterStatusBarControl(SfxModule* pMod, SfxStbCtrlFactory* pFact) 689 { 690 SFX_APP()->RegisterStatusBarControl_Impl( pMod, pFact ); 691 } 692 //-------------------------------------------------------------------- 693