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