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 {
operator ()framework::__anon24ffa81f0111::lcl_UpdateController94 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 {
operator ()framework::__anon24ffa81f0111::lcl_RemoveController110 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
impl_convertItemStyleToItemBits(sal_Int16 nStyle)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 //*****************************************************************************************************************
DEFINE_XINTERFACE_5(StatusBarManager,::cppu::OWeakObject,DIRECT_INTERFACE (lang::XTypeProvider),DIRECT_INTERFACE (lang::XComponent),DIRECT_INTERFACE (frame::XFrameActionListener),DIRECT_INTERFACE (css::ui::XUIConfigurationListener),DERIVED_INTERFACE (lang::XEventListener,frame::XFrameActionListener))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
~StatusBarManager()196 StatusBarManager::~StatusBarManager()
197 {
198 }
199
GetStatusBar() const200 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
frameAction(const frame::FrameActionEvent & Action)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
disposing(const lang::EventObject & Source)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
dispose()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
addEventListener(const uno::Reference<lang::XEventListener> & xListener)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
removeEventListener(const uno::Reference<lang::XEventListener> & xListener)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
elementInserted(const css::ui::ConfigurationEvent &)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
elementRemoved(const css::ui::ConfigurationEvent &)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
elementReplaced(const css::ui::ConfigurationEvent &)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
UpdateControllers()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
RemoveControllers()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
RetrieveLabelFromCommand(const rtl::OUString & aCmdURL)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
CreateControllers()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
AddFrameActionListener()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
FillStatusBar(const uno::Reference<container::XIndexAccess> & rItemContainer)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
StateChanged(StateChangedType)611 void StatusBarManager::StateChanged( StateChangedType )
612 {
613 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::StateChanged" );
614 }
615
DataChanged(const DataChangedEvent & rDCEvt)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
UserDraw(const UserDrawEvent & rUDEvt)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
Command(const CommandEvent & rEvt)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
MouseMove(const MouseEvent & rMEvt)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
MouseButton(const MouseEvent & rMEvt,sal_Bool (SAL_CALL frame::XStatusbarController::* _pMethod)(const::com::sun::star::awt::MouseEvent &))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
MouseButtonDown(const MouseEvent & rMEvt)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
MouseButtonUp(const MouseEvent & rMEvt)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
IMPL_LINK(StatusBarManager,Click,StatusBar *,EMPTYARG)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
IMPL_LINK(StatusBarManager,DoubleClick,StatusBar *,EMPTYARG)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