Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <uielement/statusbarmanager.hxx>
21 : #include <uielement/genericstatusbarcontroller.hxx>
22 :
23 : #include <framework/sfxhelperfunctions.hxx>
24 : #include <framework/addonsoptions.hxx>
25 : #include <uielement/statusbarmerger.hxx>
26 : #include <uielement/statusbaritem.hxx>
27 : #include <macros/generic.hxx>
28 : #include <macros/xinterface.hxx>
29 : #include <macros/xtypeprovider.hxx>
30 : #include <stdtypes.h>
31 : #include "services.h"
32 : #include "general.h"
33 : #include "properties.h"
34 : #include <helper/mischelper.hxx>
35 :
36 : #include <com/sun/star/frame/XFrame.hpp>
37 : #include <com/sun/star/frame/theStatusbarControllerFactory.hpp>
38 : #include <com/sun/star/ui/ItemStyle.hpp>
39 : #include <com/sun/star/ui/ItemType.hpp>
40 : #include <com/sun/star/lang/XMultiComponentFactory.hpp>
41 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
42 : #include <com/sun/star/beans/XPropertySet.hpp>
43 : #include <com/sun/star/awt/Command.hpp>
44 : #include <com/sun/star/ui/XStatusbarItem.hdl>
45 : #include <comphelper/processfactory.hxx>
46 : #include <toolkit/helper/vclunohelper.hxx>
47 : #include <svtools/statusbarcontroller.hxx>
48 :
49 : #include <vcl/status.hxx>
50 : #include <vcl/svapp.hxx>
51 : #include <vcl/settings.hxx>
52 :
53 : #include <functional>
54 :
55 : using namespace ::com::sun::star;
56 :
57 : // Property names of a menu/menu item ItemDescriptor
58 : static const char ITEM_DESCRIPTOR_COMMANDURL[] = "CommandURL";
59 : static const char ITEM_DESCRIPTOR_HELPURL[] = "HelpURL";
60 : static const char ITEM_DESCRIPTOR_OFFSET[] = "Offset";
61 : static const char ITEM_DESCRIPTOR_STYLE[] = "Style";
62 : static const char ITEM_DESCRIPTOR_WIDTH[] = "Width";
63 : static const char ITEM_DESCRIPTOR_TYPE[] = "Type";
64 :
65 : namespace framework
66 : {
67 :
68 : namespace
69 : {
70 :
71 : template< class MAP >
72 : struct lcl_UpdateController : public std::unary_function< typename MAP::value_type, void >
73 : {
74 6458 : void operator()( typename MAP::value_type &rElement ) const
75 : {
76 : try
77 : {
78 6458 : if ( rElement.second.is() )
79 6458 : rElement.second->update();
80 : }
81 0 : catch ( uno::Exception& )
82 : {
83 : }
84 6458 : }
85 : };
86 :
87 : template< class MAP >
88 : struct lcl_RemoveController : public std::unary_function< typename MAP::value_type, void >
89 : {
90 6458 : void operator()( typename MAP::value_type &rElement ) const
91 : {
92 : try
93 : {
94 6458 : if ( rElement.second.is() )
95 6458 : rElement.second->dispose();
96 : }
97 0 : catch ( uno::Exception& )
98 : {
99 : }
100 6458 : }
101 : };
102 :
103 6458 : static sal_uInt16 impl_convertItemStyleToItemBits( sal_Int16 nStyle )
104 : {
105 6458 : sal_uInt16 nItemBits( 0 );
106 :
107 6458 : if (( nStyle & ::com::sun::star::ui::ItemStyle::ALIGN_RIGHT ) == ::com::sun::star::ui::ItemStyle::ALIGN_RIGHT )
108 17 : nItemBits |= SIB_RIGHT;
109 6441 : else if ( nStyle & ::com::sun::star::ui::ItemStyle::ALIGN_LEFT )
110 2095 : nItemBits |= SIB_LEFT;
111 : else
112 4346 : nItemBits |= SIB_CENTER;
113 :
114 6458 : if (( nStyle & ::com::sun::star::ui::ItemStyle::DRAW_FLAT ) == ::com::sun::star::ui::ItemStyle::DRAW_FLAT )
115 0 : nItemBits |= SIB_FLAT;
116 6458 : else if ( nStyle & ::com::sun::star::ui::ItemStyle::DRAW_OUT3D )
117 0 : nItemBits |= SIB_OUT;
118 : else
119 6458 : nItemBits |= SIB_IN;
120 :
121 6458 : if (( nStyle & ::com::sun::star::ui::ItemStyle::AUTO_SIZE ) == ::com::sun::star::ui::ItemStyle::AUTO_SIZE )
122 2540 : nItemBits |= SIB_AUTOSIZE;
123 6458 : if ( nStyle & ::com::sun::star::ui::ItemStyle::OWNER_DRAW )
124 3267 : nItemBits |= SIB_USERDRAW;
125 :
126 6458 : return nItemBits;
127 : }
128 :
129 : }
130 :
131 3213 : StatusBarManager::StatusBarManager(
132 : const uno::Reference< uno::XComponentContext >& rxContext,
133 : const uno::Reference< frame::XFrame >& rFrame,
134 : const OUString& rResourceName,
135 : StatusBar* pStatusBar ) :
136 : m_bDisposed( false ),
137 : m_bFrameActionRegistered( false ),
138 : m_bUpdateControllers( false ),
139 : m_bModuleIdentified( false ),
140 : m_pStatusBar( pStatusBar ),
141 : m_aResourceName( rResourceName ),
142 : m_xFrame( rFrame ),
143 : m_aListenerContainer( m_mutex ),
144 3213 : m_xContext( rxContext )
145 : {
146 :
147 6426 : m_xStatusbarControllerFactory = frame::theStatusbarControllerFactory::get(
148 3213 : ::comphelper::getProcessComponentContext());
149 :
150 3213 : m_pStatusBar->AdjustItemWidthsForHiDPI(true);
151 3213 : m_pStatusBar->SetClickHdl( LINK( this, StatusBarManager, Click ) );
152 3213 : m_pStatusBar->SetDoubleClickHdl( LINK( this, StatusBarManager, DoubleClick ) );
153 3213 : }
154 :
155 6414 : StatusBarManager::~StatusBarManager()
156 : {
157 6414 : }
158 :
159 69703 : StatusBar* StatusBarManager::GetStatusBar() const
160 : {
161 69703 : SolarMutexGuard g;
162 69703 : return m_pStatusBar;
163 : }
164 :
165 1713 : void StatusBarManager::frameAction( const frame::FrameActionEvent& Action )
166 : throw ( uno::RuntimeException, std::exception )
167 : {
168 1713 : SolarMutexGuard g;
169 1713 : if ( Action.Action == frame::FrameAction_CONTEXT_CHANGED )
170 0 : UpdateControllers();
171 1713 : }
172 :
173 0 : void SAL_CALL StatusBarManager::disposing( const lang::EventObject& Source ) throw ( uno::RuntimeException, std::exception )
174 : {
175 : {
176 0 : SolarMutexGuard g;
177 0 : if ( m_bDisposed )
178 0 : return;
179 : }
180 :
181 0 : RemoveControllers();
182 :
183 : {
184 0 : SolarMutexGuard g;
185 0 : if ( Source.Source == uno::Reference< uno::XInterface >( m_xFrame, uno::UNO_QUERY ))
186 0 : m_xFrame.clear();
187 :
188 0 : m_xContext.clear();
189 : }
190 : }
191 :
192 : // XComponent
193 3207 : void SAL_CALL StatusBarManager::dispose() throw( uno::RuntimeException, std::exception )
194 : {
195 : uno::Reference< lang::XComponent > xThis(
196 3207 : static_cast< OWeakObject* >(this), uno::UNO_QUERY );
197 :
198 6414 : lang::EventObject aEvent( xThis );
199 3207 : m_aListenerContainer.disposeAndClear( aEvent );
200 :
201 : {
202 3207 : SolarMutexGuard g;
203 3207 : if ( m_bDisposed )
204 3207 : return;
205 :
206 3207 : RemoveControllers();
207 :
208 : // destroy the item data
209 9665 : for ( sal_uInt16 n = 0; n < m_pStatusBar->GetItemCount(); n++ )
210 : {
211 : AddonStatusbarItemData *pUserData = static_cast< AddonStatusbarItemData *>(
212 6458 : m_pStatusBar->GetItemData( m_pStatusBar->GetItemId( n ) ) );
213 6458 : if ( pUserData )
214 0 : delete pUserData;
215 : }
216 :
217 3207 : m_pStatusBar.disposeAndClear();
218 :
219 3207 : if ( m_bFrameActionRegistered && m_xFrame.is() )
220 : {
221 : try
222 : {
223 606 : m_xFrame->removeFrameActionListener( uno::Reference< frame::XFrameActionListener >(
224 : static_cast< ::cppu::OWeakObject *>( this ),
225 606 : uno::UNO_QUERY ));
226 : }
227 0 : catch ( const uno::Exception& )
228 : {
229 : }
230 : }
231 :
232 3207 : m_xFrame.clear();
233 3207 : m_xContext.clear();
234 :
235 3207 : m_bDisposed = true;
236 3207 : }
237 : }
238 :
239 0 : void SAL_CALL StatusBarManager::addEventListener( const uno::Reference< lang::XEventListener >& xListener ) throw( uno::RuntimeException, std::exception )
240 : {
241 0 : SolarMutexGuard g;
242 :
243 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
244 0 : if ( m_bDisposed )
245 0 : throw lang::DisposedException();
246 :
247 0 : m_aListenerContainer.addInterface( cppu::UnoType<lang::XEventListener>::get(), xListener );
248 0 : }
249 :
250 0 : void SAL_CALL StatusBarManager::removeEventListener( const uno::Reference< lang::XEventListener >& xListener ) throw( uno::RuntimeException, std::exception )
251 : {
252 0 : m_aListenerContainer.removeInterface( cppu::UnoType<lang::XEventListener>::get(), xListener );
253 0 : }
254 :
255 : // XUIConfigurationListener
256 0 : void SAL_CALL StatusBarManager::elementInserted( const css::ui::ConfigurationEvent& ) throw ( uno::RuntimeException, std::exception )
257 : {
258 0 : SolarMutexGuard g;
259 :
260 0 : if ( m_bDisposed )
261 0 : return;
262 : }
263 :
264 0 : void SAL_CALL StatusBarManager::elementRemoved( const css::ui::ConfigurationEvent& ) throw ( uno::RuntimeException, std::exception )
265 : {
266 0 : SolarMutexGuard g;
267 :
268 0 : if ( m_bDisposed )
269 0 : return;
270 : }
271 :
272 0 : void SAL_CALL StatusBarManager::elementReplaced( const css::ui::ConfigurationEvent& ) throw ( uno::RuntimeException, std::exception )
273 : {
274 0 : SolarMutexGuard g;
275 :
276 0 : if ( m_bDisposed )
277 0 : return;
278 : }
279 :
280 606 : void StatusBarManager::UpdateControllers()
281 : {
282 606 : if ( !m_bUpdateControllers )
283 : {
284 606 : m_bUpdateControllers = true;
285 : std::for_each( m_aControllerMap.begin(),
286 : m_aControllerMap.end(),
287 606 : lcl_UpdateController< StatusBarControllerMap >() );
288 : }
289 606 : m_bUpdateControllers = false;
290 606 : }
291 :
292 3813 : void StatusBarManager::RemoveControllers()
293 : {
294 3813 : SolarMutexGuard g;
295 :
296 3813 : if ( m_bDisposed )
297 3813 : return;
298 :
299 : std::for_each( m_aControllerMap.begin(),
300 : m_aControllerMap.end(),
301 3813 : lcl_RemoveController< StatusBarControllerMap >() );
302 3813 : m_aControllerMap.clear();
303 : }
304 :
305 6458 : OUString StatusBarManager::RetrieveLabelFromCommand( const OUString& aCmdURL )
306 : {
307 6458 : return framework::RetrieveLabelFromCommand(aCmdURL, m_xContext, m_xUICommandLabels,m_xFrame,m_aModuleIdentifier,m_bModuleIdentified,"Name");
308 : }
309 :
310 606 : void StatusBarManager::CreateControllers()
311 : {
312 606 : uno::Reference< awt::XWindow > xStatusbarWindow = VCLUnoHelper::GetInterface( m_pStatusBar );
313 :
314 7064 : for ( sal_uInt16 i = 0; i < m_pStatusBar->GetItemCount(); i++ )
315 : {
316 6458 : sal_uInt16 nId = m_pStatusBar->GetItemId( i );
317 6458 : if ( nId == 0 )
318 0 : continue;
319 :
320 6458 : OUString aCommandURL( m_pStatusBar->GetItemCommand( nId ));
321 6458 : bool bInit( true );
322 12916 : uno::Reference< frame::XStatusbarController > xController;
323 6458 : AddonStatusbarItemData *pItemData = static_cast< AddonStatusbarItemData *>( m_pStatusBar->GetItemData( nId ) );
324 : uno::Reference< ui::XStatusbarItem > xStatusbarItem(
325 12916 : static_cast< cppu::OWeakObject *>( new StatusbarItem( m_pStatusBar, pItemData, nId, aCommandURL ) ),
326 19374 : uno::UNO_QUERY );
327 :
328 12916 : beans::PropertyValue aPropValue;
329 12916 : std::vector< uno::Any > aPropVector;
330 :
331 6458 : aPropValue.Name = "CommandURL";
332 6458 : aPropValue.Value <<= aCommandURL;
333 6458 : aPropVector.push_back( uno::makeAny( aPropValue ) );
334 :
335 6458 : aPropValue.Name = "ModuleIdentifier";
336 6458 : aPropValue.Value <<= m_aModuleIdentifier;
337 6458 : aPropVector.push_back( uno::makeAny( aPropValue ) );
338 :
339 6458 : aPropValue.Name = "Frame";
340 6458 : aPropValue.Value <<= m_xFrame;
341 6458 : aPropVector.push_back( uno::makeAny( aPropValue ) );
342 :
343 : // TODO remove this
344 6458 : aPropValue.Name = "ServiceManager";
345 6458 : aPropValue.Value = uno::makeAny( uno::Reference<lang::XMultiServiceFactory>(m_xContext->getServiceManager(), uno::UNO_QUERY_THROW) );
346 6458 : aPropVector.push_back( uno::makeAny( aPropValue ) );
347 :
348 6458 : aPropValue.Name = "ParentWindow";
349 6458 : aPropValue.Value <<= xStatusbarWindow;
350 6458 : aPropVector.push_back( uno::makeAny( aPropValue ) );
351 :
352 : // TODO still needing with the css::ui::XStatusbarItem?
353 6458 : aPropValue.Name = "Identifier";
354 6458 : aPropValue.Value <<= nId;
355 6458 : aPropVector.push_back( uno::makeAny( aPropValue ) );
356 :
357 6458 : aPropValue.Name = "StatusbarItem";
358 6458 : aPropValue.Value <<= xStatusbarItem;
359 6458 : aPropVector.push_back( uno::makeAny( aPropValue ) );
360 :
361 12916 : uno::Sequence< uno::Any > aArgs( comphelper::containerToSequence( aPropVector ) );
362 :
363 : // 1) UNO Statusbar controllers, registered in Controllers.xcu
364 12916 : if ( m_xStatusbarControllerFactory.is() &&
365 6458 : m_xStatusbarControllerFactory->hasController( aCommandURL, m_aModuleIdentifier ))
366 : {
367 1038 : xController = uno::Reference< frame::XStatusbarController >(
368 346 : m_xStatusbarControllerFactory->createInstanceWithArgumentsAndContext(
369 346 : aCommandURL, aArgs, m_xContext ),
370 346 : uno::UNO_QUERY );
371 346 : bInit = false; // Initialization is done through the factory service
372 : }
373 :
374 6458 : if ( !xController.is() )
375 : {
376 6112 : svt::StatusbarController* pController( 0 );
377 :
378 : // 2) Old SFX2 Statusbar controllers
379 6112 : pController = CreateStatusBarController( m_xFrame, m_pStatusBar, nId, aCommandURL );
380 6112 : if ( !pController )
381 : {
382 : // 3) Is Add-on? Generic statusbar controller
383 667 : if ( pItemData )
384 : {
385 : pController = new GenericStatusbarController( m_xContext,
386 : m_xFrame,
387 : xStatusbarItem,
388 0 : pItemData );
389 : }
390 : else
391 : {
392 : // 4) Default Statusbar controller
393 667 : pController = new svt::StatusbarController( m_xContext, m_xFrame, aCommandURL, nId );
394 : }
395 : }
396 :
397 6112 : if ( pController )
398 12224 : xController = uno::Reference< frame::XStatusbarController >(
399 6112 : static_cast< ::cppu::OWeakObject *>( pController ),
400 6112 : uno::UNO_QUERY );
401 : }
402 :
403 6458 : m_aControllerMap[nId] = xController;
404 6458 : if ( bInit )
405 : {
406 6112 : xController->initialize( aArgs );
407 : }
408 6458 : }
409 :
410 606 : AddFrameActionListener();
411 606 : }
412 :
413 606 : void StatusBarManager::AddFrameActionListener()
414 : {
415 606 : if ( !m_bFrameActionRegistered && m_xFrame.is() )
416 : {
417 606 : m_bFrameActionRegistered = true;
418 606 : m_xFrame->addFrameActionListener( uno::Reference< frame::XFrameActionListener >(
419 606 : static_cast< ::cppu::OWeakObject *>( this ), uno::UNO_QUERY ));
420 : }
421 606 : }
422 :
423 606 : void StatusBarManager::FillStatusBar( const uno::Reference< container::XIndexAccess >& rItemContainer )
424 : {
425 606 : SolarMutexGuard g;
426 :
427 606 : if ( m_bDisposed || !m_pStatusBar )
428 606 : return;
429 :
430 606 : sal_uInt16 nId( 1 );
431 :
432 606 : RemoveControllers();
433 :
434 : // reset and fill command map
435 606 : m_pStatusBar->Clear();
436 606 : m_aControllerMap.clear();// TODO already done in RemoveControllers
437 :
438 7064 : for ( sal_Int32 n = 0; n < rItemContainer->getCount(); n++ )
439 : {
440 6458 : uno::Sequence< beans::PropertyValue > aProp;
441 12916 : OUString aCommandURL;
442 12916 : OUString aHelpURL;
443 6458 : sal_Int16 nOffset( 0 );
444 6458 : sal_Int16 nStyle( 0 );
445 6458 : sal_Int16 nWidth( 0 );
446 6458 : sal_uInt16 nType( ::com::sun::star::ui::ItemType::DEFAULT );
447 :
448 : try
449 : {
450 6458 : if ( rItemContainer->getByIndex( n ) >>= aProp )
451 : {
452 45206 : for ( int i = 0; i < aProp.getLength(); i++ )
453 : {
454 38748 : if ( aProp[i].Name == ITEM_DESCRIPTOR_COMMANDURL )
455 : {
456 6458 : aProp[i].Value >>= aCommandURL;
457 : }
458 32290 : else if ( aProp[i].Name == ITEM_DESCRIPTOR_HELPURL )
459 : {
460 6458 : aProp[i].Value >>= aHelpURL;
461 : }
462 25832 : else if ( aProp[i].Name == ITEM_DESCRIPTOR_STYLE )
463 : {
464 6458 : aProp[i].Value >>= nStyle;
465 : }
466 19374 : else if ( aProp[i].Name == ITEM_DESCRIPTOR_TYPE )
467 : {
468 6458 : aProp[i].Value >>= nType;
469 : }
470 12916 : else if ( aProp[i].Name == ITEM_DESCRIPTOR_WIDTH )
471 : {
472 6458 : aProp[i].Value >>= nWidth;
473 : }
474 6458 : else if ( aProp[i].Name == ITEM_DESCRIPTOR_OFFSET )
475 : {
476 6458 : aProp[i].Value >>= nOffset;
477 : }
478 : }
479 :
480 6458 : if (( nType == ::com::sun::star::ui::ItemType::DEFAULT ) && !aCommandURL.isEmpty() )
481 : {
482 6458 : OUString aString( RetrieveLabelFromCommand( aCommandURL ));
483 6458 : sal_uInt16 nItemBits( impl_convertItemStyleToItemBits( nStyle ));
484 :
485 6458 : m_pStatusBar->InsertItem( nId, nWidth, nItemBits, nOffset );
486 6458 : m_pStatusBar->SetItemCommand( nId, aCommandURL );
487 6458 : m_pStatusBar->SetAccessibleName( nId, aString );
488 6458 : ++nId;
489 : }
490 : }
491 : }
492 0 : catch ( const ::com::sun::star::lang::IndexOutOfBoundsException& )
493 : {
494 0 : break;
495 : }
496 6458 : }
497 :
498 : // Statusbar Merging
499 606 : const sal_uInt16 STATUSBAR_ITEM_STARTID = 1000;
500 1212 : MergeStatusbarInstructionContainer aMergeInstructions = AddonsOptions().GetMergeStatusbarInstructions();
501 606 : if ( !aMergeInstructions.empty() )
502 : {
503 0 : const sal_uInt32 nCount = aMergeInstructions.size();
504 0 : sal_uInt16 nItemId( STATUSBAR_ITEM_STARTID );
505 :
506 0 : for ( sal_uInt32 i = 0; i < nCount; i++ )
507 : {
508 0 : MergeStatusbarInstruction &rInstruction = aMergeInstructions[i];
509 0 : if ( !StatusbarMerger::IsCorrectContext( rInstruction.aMergeContext, m_aModuleIdentifier ) )
510 0 : continue;
511 :
512 0 : AddonStatusbarItemContainer aItems;
513 0 : StatusbarMerger::ConvertSeqSeqToVector( rInstruction.aMergeStatusbarItems, aItems );
514 :
515 0 : sal_uInt16 nRefPos = StatusbarMerger::FindReferencePos( m_pStatusBar, rInstruction.aMergePoint );
516 0 : if ( nRefPos != STATUSBAR_ITEM_NOTFOUND )
517 : {
518 : StatusbarMerger::ProcessMergeOperation( m_pStatusBar,
519 : nRefPos,
520 : nItemId,
521 : m_aModuleIdentifier,
522 : rInstruction.aMergeCommand,
523 : rInstruction.aMergeCommandParameter,
524 0 : aItems );
525 : }
526 : else
527 : {
528 : StatusbarMerger::ProcessMergeFallback( m_pStatusBar,
529 : nRefPos,
530 : nItemId,
531 : m_aModuleIdentifier,
532 : rInstruction.aMergeCommand,
533 : rInstruction.aMergeCommandParameter,
534 0 : aItems );
535 : }
536 0 : }
537 : }
538 :
539 : // Create controllers
540 606 : CreateControllers();
541 :
542 : // Notify controllers that they are now correctly initialized and can start listening
543 1212 : UpdateControllers();
544 : }
545 :
546 3 : void StatusBarManager::DataChanged( const DataChangedEvent& rDCEvt )
547 : {
548 3 : SolarMutexClearableGuard aGuard;
549 :
550 9 : if ((( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) ||
551 0 : ( rDCEvt.GetType() == DataChangedEventType::FONTS ) ||
552 0 : ( rDCEvt.GetType() == DataChangedEventType::FONTSUBSTITUTION ) ||
553 12 : ( rDCEvt.GetType() == DataChangedEventType::DISPLAY )) &&
554 12 : ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ))
555 : {
556 0 : css::uno::Reference< css::frame::XLayoutManager > xLayoutManager;
557 0 : css::uno::Reference< css::beans::XPropertySet > xPropSet( m_xFrame, css::uno::UNO_QUERY );
558 0 : if ( xPropSet.is() )
559 0 : xPropSet->getPropertyValue("LayoutManager") >>= xLayoutManager;
560 0 : if ( xLayoutManager.is() )
561 : {
562 0 : aGuard.clear();
563 0 : xLayoutManager->doLayout();
564 0 : }
565 3 : }
566 3 : }
567 :
568 23628 : void StatusBarManager::UserDraw( const UserDrawEvent& rUDEvt )
569 : {
570 23628 : SolarMutexClearableGuard aGuard;
571 :
572 23628 : if ( m_bDisposed )
573 23628 : return;
574 :
575 23628 : sal_uInt16 nId( rUDEvt.GetItemId() );
576 23628 : StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId );
577 23628 : if (( nId > 0 ) && ( it != m_aControllerMap.end() ))
578 : {
579 23628 : uno::Reference< frame::XStatusbarController > xController( it->second );
580 23628 : if ( xController.is() && rUDEvt.GetDevice() )
581 : {
582 : uno::Reference< awt::XGraphics > xGraphics =
583 23628 : rUDEvt.GetDevice()->CreateUnoGraphics();
584 :
585 23628 : awt::Rectangle aRect( rUDEvt.GetRect().Left(),
586 23628 : rUDEvt.GetRect().Top(),
587 23628 : rUDEvt.GetRect().GetWidth(),
588 94512 : rUDEvt.GetRect().GetHeight() );
589 23628 : aGuard.clear();
590 23628 : xController->paint( xGraphics, aRect, rUDEvt.GetStyle() );
591 23628 : }
592 23628 : }
593 : }
594 :
595 0 : void StatusBarManager::Command( const CommandEvent& rEvt )
596 : {
597 0 : SolarMutexGuard g;
598 :
599 0 : if ( m_bDisposed )
600 0 : return;
601 :
602 0 : if ( rEvt.GetCommand() == CommandEventId::ContextMenu )
603 : {
604 0 : sal_uInt16 nId = m_pStatusBar->GetItemId( rEvt.GetMousePosPixel() );
605 0 : StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId );
606 0 : if (( nId > 0 ) && ( it != m_aControllerMap.end() ))
607 : {
608 0 : uno::Reference< frame::XStatusbarController > xController( it->second );
609 0 : if ( xController.is() )
610 : {
611 0 : awt::Point aPos;
612 0 : aPos.X = rEvt.GetMousePosPixel().X();
613 0 : aPos.Y = rEvt.GetMousePosPixel().Y();
614 0 : xController->command( aPos, awt::Command::CONTEXTMENU, sal_True, uno::Any() );
615 0 : }
616 : }
617 0 : }
618 : }
619 :
620 0 : void StatusBarManager::MouseMove( const MouseEvent& rMEvt )
621 : {
622 0 : MouseButton(rMEvt,&frame::XStatusbarController::mouseMove);
623 0 : }
624 :
625 0 : void StatusBarManager::MouseButton( const MouseEvent& rMEvt ,sal_Bool ( SAL_CALL frame::XStatusbarController::*_pMethod )(const ::com::sun::star::awt::MouseEvent&))
626 : {
627 0 : SolarMutexGuard g;
628 :
629 0 : if ( !m_bDisposed )
630 : {
631 0 : sal_uInt16 nId = m_pStatusBar->GetItemId( rMEvt.GetPosPixel() );
632 0 : StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId );
633 0 : if (( nId > 0 ) && ( it != m_aControllerMap.end() ))
634 : {
635 0 : uno::Reference< frame::XStatusbarController > xController( it->second );
636 0 : if ( xController.is() )
637 : {
638 0 : ::com::sun::star::awt::MouseEvent aMouseEvent;
639 0 : aMouseEvent.Buttons = rMEvt.GetButtons();
640 0 : aMouseEvent.X = rMEvt.GetPosPixel().X();
641 0 : aMouseEvent.Y = rMEvt.GetPosPixel().Y();
642 0 : aMouseEvent.ClickCount = rMEvt.GetClicks();
643 0 : (xController.get()->*_pMethod)( aMouseEvent);
644 0 : }
645 : }
646 0 : }
647 0 : }
648 :
649 0 : void StatusBarManager::MouseButtonDown( const MouseEvent& rMEvt )
650 : {
651 0 : MouseButton(rMEvt,&frame::XStatusbarController::mouseButtonDown);
652 0 : }
653 :
654 0 : void StatusBarManager::MouseButtonUp( const MouseEvent& rMEvt )
655 : {
656 0 : MouseButton(rMEvt,&frame::XStatusbarController::mouseButtonUp);
657 0 : }
658 :
659 0 : IMPL_LINK_NOARG(StatusBarManager, Click)
660 : {
661 0 : SolarMutexGuard g;
662 :
663 0 : if ( m_bDisposed )
664 0 : return 1;
665 :
666 0 : sal_uInt16 nId = m_pStatusBar->GetCurItemId();
667 0 : StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId );
668 0 : if (( nId > 0 ) && ( it != m_aControllerMap.end() ))
669 : {
670 0 : uno::Reference< frame::XStatusbarController > xController( it->second );
671 0 : if ( xController.is() )
672 : {
673 0 : const Point aVCLPos = m_pStatusBar->GetPointerPosPixel();
674 0 : const awt::Point aAWTPoint( aVCLPos.X(), aVCLPos.Y() );
675 0 : xController->click( aAWTPoint );
676 0 : }
677 : }
678 :
679 0 : return 1;
680 : }
681 :
682 0 : IMPL_LINK_NOARG(StatusBarManager, DoubleClick)
683 : {
684 0 : SolarMutexGuard g;
685 :
686 0 : if ( m_bDisposed )
687 0 : return 1;
688 :
689 0 : sal_uInt16 nId = m_pStatusBar->GetCurItemId();
690 0 : StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId );
691 0 : if (( nId > 0 ) && ( it != m_aControllerMap.end() ))
692 : {
693 0 : uno::Reference< frame::XStatusbarController > xController( it->second );
694 0 : if ( xController.is() )
695 : {
696 0 : const Point aVCLPos = m_pStatusBar->GetPointerPosPixel();
697 0 : const awt::Point aAWTPoint( aVCLPos.X(), aVCLPos.Y() );
698 0 : xController->doubleClick( aAWTPoint );
699 0 : }
700 : }
701 :
702 0 : return 1;
703 : }
704 :
705 : }
706 :
707 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|