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_framework.hxx" 26 27 #include <uielement/statusbarmanager.hxx> 28 #include <uielement/genericstatusbarcontroller.hxx> 29 30 #include <threadhelp/threadhelpbase.hxx> 31 #include <threadhelp/resetableguard.hxx> 32 #include <framework/sfxhelperfunctions.hxx> 33 #include <framework/addonsoptions.hxx> 34 #include <uielement/statusbarmerger.hxx> 35 #include <uielement/statusbaritem.hxx> 36 #include <macros/generic.hxx> 37 #include <macros/xinterface.hxx> 38 #include <macros/xtypeprovider.hxx> 39 #include <stdtypes.h> 40 #include "services.h" 41 #include "general.h" 42 #include "properties.h" 43 #include <helper/mischelper.hxx> 44 45 #include <com/sun/star/frame/XFrame.hpp> 46 #include <com/sun/star/frame/StatusbarControllerFactory.hpp> 47 #include <com/sun/star/ui/ItemStyle.hpp> 48 #include <com/sun/star/ui/ItemType.hpp> 49 #include <com/sun/star/lang/XMultiComponentFactory.hpp> 50 #include <com/sun/star/beans/XPropertySet.hpp> 51 #include <com/sun/star/awt/Command.hpp> 52 #include <com/sun/star/ui/XStatusbarItem.hpp> 53 #include <com/sun/star/lang/DisposedException.hpp> 54 55 #include <toolkit/helper/vclunohelper.hxx> 56 57 #include <svtools/statusbarcontroller.hxx> 58 #include <comphelper/processfactory.hxx> 59 60 #include <vcl/status.hxx> 61 #include <vcl/svapp.hxx> 62 #include <rtl/logfile.hxx> 63 64 #include <functional> 65 66 using namespace ::com::sun::star; 67 #ifndef css 68 #define css ::com::sun::star 69 #endif 70 #ifndef css_ui 71 #define css_ui ::com::sun::star::ui 72 #endif 73 74 const sal_Int32 HELPID_PREFIX_LENGTH = 7; 75 static const char* HELPID_PREFIX = "helpid:"; 76 77 // Property names of a menu/menu item ItemDescriptor 78 static const char ITEM_DESCRIPTOR_COMMANDURL[] = "CommandURL"; 79 static const char ITEM_DESCRIPTOR_HELPURL[] = "HelpURL"; 80 static const char ITEM_DESCRIPTOR_OFFSET[] = "Offset"; 81 static const char ITEM_DESCRIPTOR_STYLE[] = "Style"; 82 static const char ITEM_DESCRIPTOR_WIDTH[] = "Width"; 83 static const char ITEM_DESCRIPTOR_TYPE[] = "Type"; 84 85 namespace framework 86 { 87 88 namespace 89 { 90 91 template< class MAP > 92 struct lcl_UpdateController : public std::unary_function< typename MAP::value_type, void > 93 { 94 void operator()( typename MAP::value_type &rElement ) const 95 { 96 try 97 { 98 if ( rElement.second.is() ) 99 rElement.second->update(); 100 } 101 catch ( uno::Exception& ) 102 { 103 } 104 } 105 }; 106 107 template< class MAP > 108 struct lcl_RemoveController : public std::unary_function< typename MAP::value_type, void > 109 { 110 void operator()( typename MAP::value_type &rElement ) const 111 { 112 try 113 { 114 if ( rElement.second.is() ) 115 rElement.second->dispose(); 116 } 117 catch ( uno::Exception& ) 118 { 119 } 120 } 121 }; 122 123 static sal_uInt16 impl_convertItemStyleToItemBits( sal_Int16 nStyle ) 124 { 125 sal_uInt16 nItemBits( 0 ); 126 127 if (( nStyle & css_ui::ItemStyle::ALIGN_RIGHT ) == css_ui::ItemStyle::ALIGN_RIGHT ) 128 nItemBits |= SIB_RIGHT; 129 else if ( nStyle & css_ui::ItemStyle::ALIGN_LEFT ) 130 nItemBits |= SIB_LEFT; 131 else 132 nItemBits |= SIB_CENTER; 133 134 if (( nStyle & css_ui::ItemStyle::DRAW_FLAT ) == css_ui::ItemStyle::DRAW_FLAT ) 135 nItemBits |= SIB_FLAT; 136 else if ( nStyle & css_ui::ItemStyle::DRAW_OUT3D ) 137 nItemBits |= SIB_OUT; 138 else 139 nItemBits |= SIB_IN; 140 141 if (( nStyle & css_ui::ItemStyle::AUTO_SIZE ) == css_ui::ItemStyle::AUTO_SIZE ) 142 nItemBits |= SIB_AUTOSIZE; 143 if ( nStyle & css_ui::ItemStyle::OWNER_DRAW ) 144 nItemBits |= SIB_USERDRAW; 145 146 return nItemBits; 147 } 148 149 } 150 //***************************************************************************************************************** 151 // XInterface, XTypeProvider, XServiceInfo 152 //***************************************************************************************************************** 153 DEFINE_XINTERFACE_5 ( StatusBarManager , 154 ::cppu::OWeakObject , 155 DIRECT_INTERFACE( lang::XTypeProvider ), 156 DIRECT_INTERFACE( lang::XComponent ), 157 DIRECT_INTERFACE( frame::XFrameActionListener ), 158 DIRECT_INTERFACE( css::ui::XUIConfigurationListener ), 159 DERIVED_INTERFACE( lang::XEventListener, frame::XFrameActionListener ) 160 ) 161 162 DEFINE_XTYPEPROVIDER_5 ( StatusBarManager , 163 lang::XTypeProvider , 164 lang::XComponent , 165 css::ui::XUIConfigurationListener , 166 frame::XFrameActionListener , 167 lang::XEventListener 168 ) 169 170 StatusBarManager::StatusBarManager( 171 const uno::Reference< lang::XMultiServiceFactory >& rServiceManager, 172 const uno::Reference< frame::XFrame >& rFrame, 173 const rtl::OUString& rResourceName, 174 StatusBar* pStatusBar ) : 175 ThreadHelpBase( &Application::GetSolarMutex() ), 176 OWeakObject(), 177 m_bDisposed( sal_False ), 178 m_bFrameActionRegistered( sal_False ), 179 m_bUpdateControllers( sal_False ), 180 m_bModuleIdentified( sal_False ), 181 m_pStatusBar( pStatusBar ), 182 m_aResourceName( rResourceName ), 183 m_xFrame( rFrame ), 184 m_aListenerContainer( m_aLock.getShareableOslMutex() ), 185 m_xServiceManager( rServiceManager ) 186 { 187 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::StatusBarManager" ); 188 189 m_xStatusbarControllerFactory = frame::StatusbarControllerFactory::create( 190 ::comphelper::getProcessComponentContext()); 191 192 m_pStatusBar->SetClickHdl( LINK( this, StatusBarManager, Click ) ); 193 m_pStatusBar->SetDoubleClickHdl( LINK( this, StatusBarManager, DoubleClick ) ); 194 } 195 196 StatusBarManager::~StatusBarManager() 197 { 198 } 199 200 StatusBar* StatusBarManager::GetStatusBar() const 201 { 202 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::GetStatusBar" ); 203 ResetableGuard aGuard( m_aLock ); 204 return m_pStatusBar; 205 } 206 207 void StatusBarManager::frameAction( const frame::FrameActionEvent& Action ) 208 { 209 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::frameAction" ); 210 ResetableGuard aGuard( m_aLock ); 211 if ( Action.Action == frame::FrameAction_CONTEXT_CHANGED ) 212 UpdateControllers(); 213 } 214 215 void SAL_CALL StatusBarManager::disposing( const lang::EventObject& Source ) 216 { 217 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::disposing" ); 218 { 219 ResetableGuard aGuard( m_aLock ); 220 if ( m_bDisposed ) 221 return; 222 } 223 224 RemoveControllers(); 225 226 { 227 ResetableGuard aGuard( m_aLock ); 228 if ( Source.Source == uno::Reference< uno::XInterface >( m_xFrame, uno::UNO_QUERY )) 229 m_xFrame.clear(); 230 231 m_xServiceManager.clear(); 232 } 233 } 234 235 // XComponent 236 void SAL_CALL StatusBarManager::dispose() 237 { 238 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::dispose" ); 239 uno::Reference< lang::XComponent > xThis( 240 static_cast< OWeakObject* >(this), uno::UNO_QUERY ); 241 242 lang::EventObject aEvent( xThis ); 243 m_aListenerContainer.disposeAndClear( aEvent ); 244 245 { 246 ResetableGuard aGuard( m_aLock ); 247 if ( !m_bDisposed ) 248 { 249 RemoveControllers(); 250 251 // destroy the item data 252 for ( sal_uInt16 n = 0; n < m_pStatusBar->GetItemCount(); n++ ) 253 { 254 AddonStatusbarItemData *pUserData = static_cast< AddonStatusbarItemData *>( 255 m_pStatusBar->GetItemData( m_pStatusBar->GetItemId( n ) ) ); 256 if ( pUserData ) 257 delete pUserData; 258 } 259 260 delete m_pStatusBar; 261 m_pStatusBar = 0; 262 263 if ( m_bFrameActionRegistered && m_xFrame.is() ) 264 { 265 try 266 { 267 m_xFrame->removeFrameActionListener( uno::Reference< frame::XFrameActionListener >( 268 static_cast< ::cppu::OWeakObject *>( this ), 269 uno::UNO_QUERY )); 270 } 271 catch ( uno::Exception& ) 272 { 273 } 274 } 275 276 m_xFrame.clear(); 277 m_xServiceManager.clear(); 278 279 m_bDisposed = sal_True; 280 } 281 } 282 } 283 284 void SAL_CALL StatusBarManager::addEventListener( const uno::Reference< lang::XEventListener >& xListener ) 285 { 286 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::addEventListener" ); 287 ResetableGuard aGuard( m_aLock ); 288 289 /* SAFE AREA ----------------------------------------------------------------------------------------------- */ 290 if ( m_bDisposed ) 291 throw lang::DisposedException(); 292 293 m_aListenerContainer.addInterface( ::getCppuType( 294 ( const uno::Reference< lang::XEventListener >* ) NULL ), xListener ); 295 } 296 297 void SAL_CALL StatusBarManager::removeEventListener( const uno::Reference< lang::XEventListener >& xListener ) 298 { 299 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::removeEventListener" ); 300 m_aListenerContainer.removeInterface( ::getCppuType( 301 ( const uno::Reference< lang::XEventListener >* ) NULL ), xListener ); 302 } 303 304 // XUIConfigurationListener 305 void SAL_CALL StatusBarManager::elementInserted( const css::ui::ConfigurationEvent& ) 306 { 307 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::elementInserted" ); 308 ResetableGuard aGuard( m_aLock ); 309 310 if ( m_bDisposed ) 311 return; 312 } 313 314 void SAL_CALL StatusBarManager::elementRemoved( const css::ui::ConfigurationEvent& ) 315 { 316 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::elementRemoved" ); 317 ResetableGuard aGuard( m_aLock ); 318 319 if ( m_bDisposed ) 320 return; 321 } 322 323 void SAL_CALL StatusBarManager::elementReplaced( const css::ui::ConfigurationEvent& ) 324 { 325 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::elementReplaced" ); 326 ResetableGuard aGuard( m_aLock ); 327 328 if ( m_bDisposed ) 329 return; 330 } 331 332 void StatusBarManager::UpdateControllers() 333 { 334 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::UpdateControllers" ); 335 if ( !m_bUpdateControllers ) 336 { 337 m_bUpdateControllers = sal_True; 338 std::for_each( m_aControllerMap.begin(), 339 m_aControllerMap.end(), 340 lcl_UpdateController< StatusBarControllerMap >() ); 341 } 342 m_bUpdateControllers = sal_False; 343 } 344 345 void StatusBarManager::RemoveControllers() 346 { 347 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::RemoveControllers" ); 348 ResetableGuard aGuard( m_aLock ); 349 350 if ( m_bDisposed ) 351 return; 352 353 std::for_each( m_aControllerMap.begin(), 354 m_aControllerMap.end(), 355 lcl_RemoveController< StatusBarControllerMap >() ); 356 m_aControllerMap.clear(); 357 } 358 359 rtl::OUString StatusBarManager::RetrieveLabelFromCommand( const rtl::OUString& aCmdURL ) 360 { 361 return framework::RetrieveLabelFromCommand(aCmdURL,m_xServiceManager,m_xUICommandLabels,m_xFrame,m_aModuleIdentifier,m_bModuleIdentified,"Name"); 362 } 363 364 void StatusBarManager::CreateControllers() 365 { 366 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::CreateControllers" ); 367 uno::Reference< uno::XComponentContext > xComponentContext; 368 uno::Reference< beans::XPropertySet > xProps( m_xServiceManager, uno::UNO_QUERY ); 369 uno::Reference< awt::XWindow > xStatusbarWindow = VCLUnoHelper::GetInterface( m_pStatusBar ); 370 371 if ( xProps.is() ) 372 xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))) >>= xComponentContext; 373 374 for ( sal_uInt16 i = 0; i < m_pStatusBar->GetItemCount(); i++ ) 375 { 376 sal_uInt16 nId = m_pStatusBar->GetItemId( i ); 377 if ( nId == 0 ) 378 continue; 379 380 rtl::OUString aCommandURL( m_pStatusBar->GetItemCommand( nId )); 381 sal_Bool bInit( sal_True ); 382 uno::Reference< frame::XStatusbarController > xController; 383 AddonStatusbarItemData *pItemData = static_cast< AddonStatusbarItemData *>( m_pStatusBar->GetItemData( nId ) ); 384 uno::Reference< ui::XStatusbarItem > xStatusbarItem( 385 static_cast< cppu::OWeakObject *>( new StatusbarItem( m_pStatusBar, pItemData, nId, aCommandURL ) ), 386 uno::UNO_QUERY ); 387 388 beans::PropertyValue aPropValue; 389 std::vector< uno::Any > aPropVector; 390 391 aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CommandURL" )); 392 aPropValue.Value <<= aCommandURL; 393 aPropVector.push_back( uno::makeAny( aPropValue ) ); 394 395 aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ModuleIdentifier" )); 396 aPropValue.Value <<= m_aModuleIdentifier; 397 aPropVector.push_back( uno::makeAny( aPropValue ) ); 398 399 aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Frame" )); 400 aPropValue.Value <<= m_xFrame; 401 aPropVector.push_back( uno::makeAny( aPropValue ) ); 402 403 // TODO remove this 404 aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ServiceManager" )); 405 aPropValue.Value <<= m_xServiceManager; 406 aPropVector.push_back( uno::makeAny( aPropValue ) ); 407 408 aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ParentWindow" )); 409 aPropValue.Value <<= xStatusbarWindow; 410 aPropVector.push_back( uno::makeAny( aPropValue ) ); 411 412 // TODO still needing with the css::ui::XStatusbarItem? 413 aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Identifier" )); 414 aPropValue.Value <<= nId; 415 aPropVector.push_back( uno::makeAny( aPropValue ) ); 416 417 aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StatusbarItem" )); 418 aPropValue.Value <<= xStatusbarItem; 419 aPropVector.push_back( uno::makeAny( aPropValue ) ); 420 421 uno::Sequence< uno::Any > aArgs( comphelper::containerToSequence( aPropVector ) ); 422 423 // 1º) UNO Statusbar controllers, registered in Controllers.xcu 424 if ( m_xStatusbarControllerFactory.is() && 425 m_xStatusbarControllerFactory->hasController( aCommandURL, m_aModuleIdentifier )) 426 { 427 xController = uno::Reference< frame::XStatusbarController >( 428 m_xStatusbarControllerFactory->createInstanceWithArgumentsAndContext( 429 aCommandURL, aArgs, xComponentContext ), 430 uno::UNO_QUERY ); 431 bInit = sal_False; // Initialization is done through the factory service 432 } 433 434 if ( !xController.is() ) 435 { 436 svt::StatusbarController* pController( 0 ); 437 438 // 2º) Old SFX2 Statusbar controllers 439 pController = CreateStatusBarController( m_xFrame, m_pStatusBar, nId, aCommandURL ); 440 if ( !pController ) 441 { 442 // 3º) Is Add-on? Generic statusbar controller 443 if ( pItemData ) 444 { 445 pController = new GenericStatusbarController( m_xServiceManager, 446 m_xFrame, 447 xStatusbarItem, 448 pItemData ); 449 } 450 else 451 { 452 // 4º) Default Statusbar controller 453 pController = new svt::StatusbarController( m_xServiceManager, m_xFrame, aCommandURL, nId ); 454 } 455 } 456 457 if ( pController ) 458 xController = uno::Reference< frame::XStatusbarController >( 459 static_cast< ::cppu::OWeakObject *>( pController ), 460 uno::UNO_QUERY ); 461 } 462 463 m_aControllerMap[nId] = xController; 464 if ( bInit ) 465 { 466 xController->initialize( aArgs ); 467 } 468 } 469 470 AddFrameActionListener(); 471 } 472 473 void StatusBarManager::AddFrameActionListener() 474 { 475 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::AddFrameActionListener" ); 476 if ( !m_bFrameActionRegistered && m_xFrame.is() ) 477 { 478 m_bFrameActionRegistered = sal_True; 479 m_xFrame->addFrameActionListener( uno::Reference< frame::XFrameActionListener >( 480 static_cast< ::cppu::OWeakObject *>( this ), uno::UNO_QUERY )); 481 } 482 } 483 484 void StatusBarManager::FillStatusBar( const uno::Reference< container::XIndexAccess >& rItemContainer ) 485 { 486 RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::StatusBarManager::FillStatusbar" ); 487 488 ResetableGuard aGuard( m_aLock ); 489 490 if ( m_bDisposed || !m_pStatusBar ) 491 return; 492 493 sal_uInt16 nId( 1 ); 494 rtl::OUString aHelpIdPrefix( RTL_CONSTASCII_USTRINGPARAM( HELPID_PREFIX )); 495 496 RemoveControllers(); 497 498 // reset and fill command map 499 m_pStatusBar->Clear(); 500 m_aControllerMap.clear();// TODO already done in RemoveControllers 501 502 for ( sal_Int32 n = 0; n < rItemContainer->getCount(); n++ ) 503 { 504 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::FillStatusBar" ); 505 uno::Sequence< beans::PropertyValue > aProp; 506 rtl::OUString aCommandURL; 507 rtl::OUString aHelpURL; 508 sal_Int16 nOffset( 0 ); 509 sal_Int16 nStyle( 0 ); 510 sal_Int16 nWidth( 0 ); 511 sal_uInt16 nType( css_ui::ItemType::DEFAULT ); 512 513 try 514 { 515 if ( rItemContainer->getByIndex( n ) >>= aProp ) 516 { 517 for ( int i = 0; i < aProp.getLength(); i++ ) 518 { 519 if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_COMMANDURL )) 520 { 521 aProp[i].Value >>= aCommandURL; 522 } 523 else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_HELPURL )) 524 { 525 aProp[i].Value >>= aHelpURL; 526 } 527 else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_STYLE )) 528 { 529 aProp[i].Value >>= nStyle; 530 } 531 else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_TYPE )) 532 { 533 aProp[i].Value >>= nType; 534 } 535 else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_WIDTH )) 536 { 537 aProp[i].Value >>= nWidth; 538 } 539 else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_OFFSET )) 540 { 541 aProp[i].Value >>= nOffset; 542 } 543 } 544 545 if (( nType == ::com::sun::star::ui::ItemType::DEFAULT ) && ( aCommandURL.getLength() > 0 )) 546 { 547 rtl::OUString aString( RetrieveLabelFromCommand( aCommandURL )); 548 sal_uInt16 nItemBits( impl_convertItemStyleToItemBits( nStyle )); 549 550 m_pStatusBar->InsertItem( nId, nWidth, nItemBits, nOffset ); 551 m_pStatusBar->SetItemCommand( nId, aCommandURL ); 552 m_pStatusBar->SetAccessibleName( nId, aString ); 553 ++nId; 554 } 555 } 556 } 557 catch ( ::com::sun::star::lang::IndexOutOfBoundsException& ) 558 { 559 break; 560 } 561 } 562 563 // Statusbar Merging 564 const sal_uInt16 STATUSBAR_ITEM_STARTID = 1000; 565 MergeStatusbarInstructionContainer aMergeInstructions = AddonsOptions().GetMergeStatusbarInstructions(); 566 if ( !aMergeInstructions.empty() ) 567 { 568 const sal_uInt32 nCount = aMergeInstructions.size(); 569 sal_uInt16 nItemId( STATUSBAR_ITEM_STARTID ); 570 571 for ( sal_uInt32 i = 0; i < nCount; i++ ) 572 { 573 MergeStatusbarInstruction &rInstruction = aMergeInstructions[i]; 574 if ( !StatusbarMerger::IsCorrectContext( rInstruction.aMergeContext, m_aModuleIdentifier ) ) 575 continue; 576 577 AddonStatusbarItemContainer aItems; 578 StatusbarMerger::ConvertSeqSeqToVector( rInstruction.aMergeStatusbarItems, aItems ); 579 580 sal_uInt16 nRefPos = StatusbarMerger::FindReferencePos( m_pStatusBar, rInstruction.aMergePoint ); 581 if ( nRefPos != STATUSBAR_ITEM_NOTFOUND ) 582 { 583 StatusbarMerger::ProcessMergeOperation( m_pStatusBar, 584 nRefPos, 585 nItemId, 586 m_aModuleIdentifier, 587 rInstruction.aMergeCommand, 588 rInstruction.aMergeCommandParameter, 589 aItems ); 590 } 591 else 592 { 593 StatusbarMerger::ProcessMergeFallback( m_pStatusBar, 594 nRefPos, 595 nItemId, 596 m_aModuleIdentifier, 597 rInstruction.aMergeCommand, 598 rInstruction.aMergeCommandParameter, 599 aItems ); 600 } 601 } 602 } 603 604 // Create controllers 605 CreateControllers(); 606 607 // Notify controllers that they are now correctly initialized and can start listening 608 UpdateControllers(); 609 } 610 611 void StatusBarManager::StateChanged( StateChangedType ) 612 { 613 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::StateChanged" ); 614 } 615 616 void StatusBarManager::DataChanged( const DataChangedEvent& rDCEvt ) 617 { 618 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::DataChanged" ); 619 ResetableGuard aGuard( m_aLock ); 620 621 if ((( rDCEvt.GetType() == DATACHANGED_SETTINGS ) || 622 ( rDCEvt.GetType() == DATACHANGED_FONTS ) || 623 ( rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION ) || 624 ( rDCEvt.GetType() == DATACHANGED_DISPLAY )) && 625 ( rDCEvt.GetFlags() & SETTINGS_STYLE )) 626 { 627 css::uno::Reference< css::frame::XLayoutManager > xLayoutManager; 628 css::uno::Reference< css::beans::XPropertySet > xPropSet( m_xFrame, css::uno::UNO_QUERY ); 629 if ( xPropSet.is() ) 630 xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" ))) >>= xLayoutManager; 631 if ( xLayoutManager.is() ) 632 { 633 aGuard.unlock(); 634 xLayoutManager->doLayout(); 635 } 636 } 637 } 638 639 void StatusBarManager::UserDraw( const UserDrawEvent& rUDEvt ) 640 { 641 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::UserDraw" ); 642 ResetableGuard aGuard( m_aLock ); 643 644 if ( m_bDisposed ) 645 return; 646 647 sal_uInt16 nId( rUDEvt.GetItemId() ); 648 StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId ); 649 if (( nId > 0 ) && ( it != m_aControllerMap.end() )) 650 { 651 uno::Reference< frame::XStatusbarController > xController( it->second ); 652 if ( xController.is() && rUDEvt.GetDevice() ) 653 { 654 uno::Reference< awt::XGraphics > xGraphics = 655 rUDEvt.GetDevice()->CreateUnoGraphics(); 656 657 awt::Rectangle aRect( rUDEvt.GetRect().Left(), 658 rUDEvt.GetRect().Top(), 659 rUDEvt.GetRect().GetWidth(), 660 rUDEvt.GetRect().GetHeight() ); 661 aGuard.unlock(); 662 xController->paint( xGraphics, aRect, rUDEvt.GetStyle() ); 663 } 664 } 665 } 666 667 void StatusBarManager::Command( const CommandEvent& rEvt ) 668 { 669 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::Command" ); 670 ResetableGuard aGuard( m_aLock ); 671 672 if ( m_bDisposed ) 673 return; 674 675 if ( rEvt.GetCommand() == COMMAND_CONTEXTMENU ) 676 { 677 sal_uInt16 nId = m_pStatusBar->GetItemId( rEvt.GetMousePosPixel() ); 678 StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId ); 679 if (( nId > 0 ) && ( it != m_aControllerMap.end() )) 680 { 681 uno::Reference< frame::XStatusbarController > xController( it->second ); 682 if ( xController.is() ) 683 { 684 awt::Point aPos; 685 aPos.X = rEvt.GetMousePosPixel().X(); 686 aPos.Y = rEvt.GetMousePosPixel().Y(); 687 xController->command( aPos, awt::Command::CONTEXTMENU, sal_True, uno::Any() ); 688 } 689 } 690 } 691 } 692 693 void StatusBarManager::MouseMove( const MouseEvent& rMEvt ) 694 { 695 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::MouseMove" ); 696 MouseButton(rMEvt,&frame::XStatusbarController::mouseMove); 697 } 698 699 void StatusBarManager::MouseButton( const MouseEvent& rMEvt ,sal_Bool ( SAL_CALL frame::XStatusbarController::*_pMethod )(const ::com::sun::star::awt::MouseEvent&)) 700 { 701 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::MouseButton" ); 702 ResetableGuard aGuard( m_aLock ); 703 704 if ( !m_bDisposed ) 705 { 706 sal_uInt16 nId = m_pStatusBar->GetItemId( rMEvt.GetPosPixel() ); 707 StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId ); 708 if (( nId > 0 ) && ( it != m_aControllerMap.end() )) 709 { 710 uno::Reference< frame::XStatusbarController > xController( it->second ); 711 if ( xController.is() ) 712 { 713 ::com::sun::star::awt::MouseEvent aMouseEvent; 714 aMouseEvent.Buttons = rMEvt.GetButtons(); 715 aMouseEvent.X = rMEvt.GetPosPixel().X(); 716 aMouseEvent.Y = rMEvt.GetPosPixel().Y(); 717 aMouseEvent.ClickCount = rMEvt.GetClicks(); 718 (xController.get()->*_pMethod)( aMouseEvent); 719 } 720 } 721 } 722 } 723 724 void StatusBarManager::MouseButtonDown( const MouseEvent& rMEvt ) 725 { 726 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::MouseButtonDown" ); 727 MouseButton(rMEvt,&frame::XStatusbarController::mouseButtonDown); 728 } 729 730 void StatusBarManager::MouseButtonUp( const MouseEvent& rMEvt ) 731 { 732 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::MouseButtonUp" ); 733 MouseButton(rMEvt,&frame::XStatusbarController::mouseButtonUp); 734 } 735 736 IMPL_LINK( StatusBarManager, Click, StatusBar*, EMPTYARG ) 737 { 738 ResetableGuard aGuard( m_aLock ); 739 740 if ( m_bDisposed ) 741 return 1; 742 743 sal_uInt16 nId = m_pStatusBar->GetCurItemId(); 744 StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId ); 745 if (( nId > 0 ) && ( it != m_aControllerMap.end() )) 746 { 747 uno::Reference< frame::XStatusbarController > xController( it->second ); 748 if ( xController.is() ) 749 { 750 const Point aVCLPos = m_pStatusBar->GetPointerPosPixel(); 751 const awt::Point aAWTPoint( aVCLPos.X(), aVCLPos.Y() ); 752 xController->click( aAWTPoint ); 753 } 754 } 755 756 return 1; 757 } 758 759 IMPL_LINK( StatusBarManager, DoubleClick, StatusBar*, EMPTYARG ) 760 { 761 ResetableGuard aGuard( m_aLock ); 762 763 if ( m_bDisposed ) 764 return 1; 765 766 sal_uInt16 nId = m_pStatusBar->GetCurItemId(); 767 StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId ); 768 if (( nId > 0 ) && ( it != m_aControllerMap.end() )) 769 { 770 uno::Reference< frame::XStatusbarController > xController( it->second ); 771 if ( xController.is() ) 772 { 773 const Point aVCLPos = m_pStatusBar->GetPointerPosPixel(); 774 const awt::Point aAWTPoint( aVCLPos.X(), aVCLPos.Y() ); 775 xController->doubleClick( aAWTPoint ); 776 } 777 } 778 779 return 1; 780 } 781 782 } 783