16d739b60SAndrew Rist /**************************************************************
22503e1a5SAriel Constenla-Haile  *
36d739b60SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
46d739b60SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
56d739b60SAndrew Rist  * distributed with this work for additional information
66d739b60SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
76d739b60SAndrew Rist  * to you under the Apache License, Version 2.0 (the
86d739b60SAndrew Rist  * "License"); you may not use this file except in compliance
96d739b60SAndrew Rist  * with the License.  You may obtain a copy of the License at
102503e1a5SAriel Constenla-Haile  *
116d739b60SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
122503e1a5SAriel Constenla-Haile  *
136d739b60SAndrew Rist  * Unless required by applicable law or agreed to in writing,
146d739b60SAndrew Rist  * software distributed under the License is distributed on an
156d739b60SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
166d739b60SAndrew Rist  * KIND, either express or implied.  See the License for the
176d739b60SAndrew Rist  * specific language governing permissions and limitations
186d739b60SAndrew Rist  * under the License.
192503e1a5SAriel Constenla-Haile  *
206d739b60SAndrew Rist  *************************************************************/
216d739b60SAndrew Rist 
226d739b60SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_framework.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <uielement/statusbarmanager.hxx>
282503e1a5SAriel Constenla-Haile #include <uielement/genericstatusbarcontroller.hxx>
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include <threadhelp/threadhelpbase.hxx>
31cdf0e10cSrcweir #include <threadhelp/resetableguard.hxx>
32cdf0e10cSrcweir #include <framework/sfxhelperfunctions.hxx>
332503e1a5SAriel Constenla-Haile #include <framework/addonsoptions.hxx>
342503e1a5SAriel Constenla-Haile #include <uielement/statusbarmerger.hxx>
352503e1a5SAriel Constenla-Haile #include <uielement/statusbaritem.hxx>
36cdf0e10cSrcweir #include <macros/generic.hxx>
37cdf0e10cSrcweir #include <macros/xinterface.hxx>
38cdf0e10cSrcweir #include <macros/xtypeprovider.hxx>
39cdf0e10cSrcweir #include <stdtypes.h>
40cdf0e10cSrcweir #include "services.h"
41cdf0e10cSrcweir #include "general.h"
42cdf0e10cSrcweir #include "properties.h"
43cdf0e10cSrcweir #include <helper/mischelper.hxx>
44cdf0e10cSrcweir 
45cdf0e10cSrcweir #include <com/sun/star/frame/XFrame.hpp>
46dccf82beSAriel Constenla-Haile #include <com/sun/star/frame/StatusbarControllerFactory.hpp>
47cdf0e10cSrcweir #include <com/sun/star/ui/ItemStyle.hpp>
48cdf0e10cSrcweir #include <com/sun/star/ui/ItemType.hpp>
49cdf0e10cSrcweir #include <com/sun/star/lang/XMultiComponentFactory.hpp>
50cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
51cdf0e10cSrcweir #include <com/sun/star/awt/Command.hpp>
52*d3bacab6SAriel Constenla-Haile #include <com/sun/star/ui/XStatusbarItem.hpp>
53cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp>
54cdf0e10cSrcweir 
552503e1a5SAriel Constenla-Haile #include <toolkit/helper/vclunohelper.hxx>
56cdf0e10cSrcweir 
57cdf0e10cSrcweir #include <svtools/statusbarcontroller.hxx>
58dccf82beSAriel Constenla-Haile #include <comphelper/processfactory.hxx>
59cdf0e10cSrcweir 
60cdf0e10cSrcweir #include <vcl/status.hxx>
61cdf0e10cSrcweir #include <vcl/svapp.hxx>
62cdf0e10cSrcweir #include <rtl/logfile.hxx>
63cdf0e10cSrcweir 
642503e1a5SAriel Constenla-Haile #include <functional>
652503e1a5SAriel Constenla-Haile 
66cdf0e10cSrcweir using namespace ::com::sun::star;
67cdf0e10cSrcweir #ifndef css
68cdf0e10cSrcweir #define css ::com::sun::star
69cdf0e10cSrcweir #endif
70cdf0e10cSrcweir #ifndef css_ui
71cdf0e10cSrcweir #define css_ui ::com::sun::star::ui
72cdf0e10cSrcweir #endif
73cdf0e10cSrcweir 
74cdf0e10cSrcweir const sal_Int32  HELPID_PREFIX_LENGTH    = 7;
75cdf0e10cSrcweir static const char*      HELPID_PREFIX           = "helpid:";
76cdf0e10cSrcweir 
77cdf0e10cSrcweir // Property names of a menu/menu item ItemDescriptor
78cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_COMMANDURL[]  = "CommandURL";
79cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_HELPURL[]     = "HelpURL";
80cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_OFFSET[]      = "Offset";
81cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_STYLE[]       = "Style";
82cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_WIDTH[]       = "Width";
83cdf0e10cSrcweir static const char ITEM_DESCRIPTOR_TYPE[]        = "Type";
84cdf0e10cSrcweir 
85cdf0e10cSrcweir namespace framework
86cdf0e10cSrcweir {
87cdf0e10cSrcweir 
882503e1a5SAriel Constenla-Haile namespace
892503e1a5SAriel Constenla-Haile {
902503e1a5SAriel Constenla-Haile 
912503e1a5SAriel Constenla-Haile template< class MAP >
922503e1a5SAriel Constenla-Haile struct lcl_UpdateController : public std::unary_function< typename MAP::value_type, void >
932503e1a5SAriel Constenla-Haile {
operator ()framework::__anon633ae83f0111::lcl_UpdateController942503e1a5SAriel Constenla-Haile     void operator()( typename MAP::value_type &rElement ) const
952503e1a5SAriel Constenla-Haile     {
962503e1a5SAriel Constenla-Haile         try
972503e1a5SAriel Constenla-Haile         {
98*d3bacab6SAriel Constenla-Haile             if ( rElement.second.is() )
99*d3bacab6SAriel Constenla-Haile                 rElement.second->update();
1002503e1a5SAriel Constenla-Haile         }
1012503e1a5SAriel Constenla-Haile         catch ( uno::Exception& )
1022503e1a5SAriel Constenla-Haile         {
1032503e1a5SAriel Constenla-Haile         }
1042503e1a5SAriel Constenla-Haile     }
1052503e1a5SAriel Constenla-Haile };
1062503e1a5SAriel Constenla-Haile 
1072503e1a5SAriel Constenla-Haile template< class MAP >
1082503e1a5SAriel Constenla-Haile struct lcl_RemoveController : public std::unary_function< typename MAP::value_type, void >
1092503e1a5SAriel Constenla-Haile {
operator ()framework::__anon633ae83f0111::lcl_RemoveController1102503e1a5SAriel Constenla-Haile     void operator()( typename MAP::value_type &rElement ) const
1112503e1a5SAriel Constenla-Haile     {
1122503e1a5SAriel Constenla-Haile         try
1132503e1a5SAriel Constenla-Haile         {
114*d3bacab6SAriel Constenla-Haile             if ( rElement.second.is() )
115*d3bacab6SAriel Constenla-Haile                 rElement.second->dispose();
1162503e1a5SAriel Constenla-Haile         }
1172503e1a5SAriel Constenla-Haile         catch ( uno::Exception& )
1182503e1a5SAriel Constenla-Haile         {
1192503e1a5SAriel Constenla-Haile         }
1202503e1a5SAriel Constenla-Haile     }
1212503e1a5SAriel Constenla-Haile };
1222503e1a5SAriel Constenla-Haile 
impl_convertItemStyleToItemBits(sal_Int16 nStyle)123cdf0e10cSrcweir static sal_uInt16 impl_convertItemStyleToItemBits( sal_Int16 nStyle )
124cdf0e10cSrcweir {
125cdf0e10cSrcweir     sal_uInt16 nItemBits( 0 );
126cdf0e10cSrcweir 
127cdf0e10cSrcweir     if (( nStyle & css_ui::ItemStyle::ALIGN_RIGHT ) == css_ui::ItemStyle::ALIGN_RIGHT )
128cdf0e10cSrcweir         nItemBits |= SIB_RIGHT;
129cdf0e10cSrcweir     else if ( nStyle & css_ui::ItemStyle::ALIGN_LEFT )
130cdf0e10cSrcweir         nItemBits |= SIB_LEFT;
131cdf0e10cSrcweir     else
132cdf0e10cSrcweir         nItemBits |= SIB_CENTER;
133cdf0e10cSrcweir 
134cdf0e10cSrcweir     if (( nStyle & css_ui::ItemStyle::DRAW_FLAT ) == css_ui::ItemStyle::DRAW_FLAT )
135cdf0e10cSrcweir         nItemBits |= SIB_FLAT;
136cdf0e10cSrcweir     else if ( nStyle & css_ui::ItemStyle::DRAW_OUT3D )
137cdf0e10cSrcweir         nItemBits |= SIB_OUT;
138cdf0e10cSrcweir     else
139cdf0e10cSrcweir         nItemBits |= SIB_IN;
140cdf0e10cSrcweir 
141cdf0e10cSrcweir     if (( nStyle & css_ui::ItemStyle::AUTO_SIZE ) == css_ui::ItemStyle::AUTO_SIZE )
142cdf0e10cSrcweir         nItemBits |= SIB_AUTOSIZE;
143cdf0e10cSrcweir     if ( nStyle & css_ui::ItemStyle::OWNER_DRAW )
144cdf0e10cSrcweir         nItemBits |= SIB_USERDRAW;
145cdf0e10cSrcweir 
146cdf0e10cSrcweir     return nItemBits;
147cdf0e10cSrcweir }
1482503e1a5SAriel Constenla-Haile 
1492503e1a5SAriel Constenla-Haile }
150cdf0e10cSrcweir //*****************************************************************************************************************
151cdf0e10cSrcweir //	XInterface, XTypeProvider, XServiceInfo
152cdf0e10cSrcweir //*****************************************************************************************************************
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))153cdf0e10cSrcweir DEFINE_XINTERFACE_5                     (   StatusBarManager                                                        ,
154cdf0e10cSrcweir                                             ::cppu::OWeakObject                                                     ,
155cdf0e10cSrcweir                                             DIRECT_INTERFACE( lang::XTypeProvider                                   ),
156cdf0e10cSrcweir                                             DIRECT_INTERFACE( lang::XComponent                                      ),
157cdf0e10cSrcweir 											DIRECT_INTERFACE( frame::XFrameActionListener                           ),
158cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::ui::XUIConfigurationListener                    ),
159cdf0e10cSrcweir 											DERIVED_INTERFACE( lang::XEventListener, frame::XFrameActionListener    )
160cdf0e10cSrcweir 										)
161cdf0e10cSrcweir 
162cdf0e10cSrcweir DEFINE_XTYPEPROVIDER_5                  (   StatusBarManager                    ,
163cdf0e10cSrcweir                                             lang::XTypeProvider		            ,
164cdf0e10cSrcweir                                             lang::XComponent                    ,
165cdf0e10cSrcweir                                             css::ui::XUIConfigurationListener  ,
166cdf0e10cSrcweir 											frame::XFrameActionListener         ,
167cdf0e10cSrcweir 											lang::XEventListener
168cdf0e10cSrcweir 										)
169cdf0e10cSrcweir 
170cdf0e10cSrcweir StatusBarManager::StatusBarManager(
171cdf0e10cSrcweir     const uno::Reference< lang::XMultiServiceFactory >& rServiceManager,
172cdf0e10cSrcweir     const uno::Reference< frame::XFrame >& rFrame,
173cdf0e10cSrcweir     const rtl::OUString& rResourceName,
174cdf0e10cSrcweir     StatusBar* pStatusBar ) :
175cdf0e10cSrcweir     ThreadHelpBase( &Application::GetSolarMutex() ),
176cdf0e10cSrcweir     OWeakObject(),
177cdf0e10cSrcweir     m_bDisposed( sal_False ),
178cdf0e10cSrcweir     m_bFrameActionRegistered( sal_False ),
179cdf0e10cSrcweir     m_bUpdateControllers( sal_False ),
180cdf0e10cSrcweir     m_bModuleIdentified( sal_False ),
181cdf0e10cSrcweir     m_pStatusBar( pStatusBar ),
182cdf0e10cSrcweir     m_aResourceName( rResourceName ),
183cdf0e10cSrcweir     m_xFrame( rFrame ),
184cdf0e10cSrcweir     m_aListenerContainer( m_aLock.getShareableOslMutex() ),
185cdf0e10cSrcweir     m_xServiceManager( rServiceManager )
186cdf0e10cSrcweir {
187cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::StatusBarManager" );
188cdf0e10cSrcweir 
189dccf82beSAriel Constenla-Haile     m_xStatusbarControllerFactory = frame::StatusbarControllerFactory::create(
190dccf82beSAriel Constenla-Haile         ::comphelper::getProcessComponentContext());
191cdf0e10cSrcweir 
192cdf0e10cSrcweir     m_pStatusBar->SetClickHdl( LINK( this, StatusBarManager, Click ) );
193cdf0e10cSrcweir     m_pStatusBar->SetDoubleClickHdl( LINK( this, StatusBarManager, DoubleClick ) );
194cdf0e10cSrcweir }
195cdf0e10cSrcweir 
~StatusBarManager()196cdf0e10cSrcweir StatusBarManager::~StatusBarManager()
197cdf0e10cSrcweir {
198cdf0e10cSrcweir }
199cdf0e10cSrcweir 
GetStatusBar() const200cdf0e10cSrcweir StatusBar* StatusBarManager::GetStatusBar() const
201cdf0e10cSrcweir {
202cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::GetStatusBar" );
203cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
204cdf0e10cSrcweir     return m_pStatusBar;
205cdf0e10cSrcweir }
206cdf0e10cSrcweir 
frameAction(const frame::FrameActionEvent & Action)207cdf0e10cSrcweir void StatusBarManager::frameAction( const frame::FrameActionEvent& Action )
208cdf0e10cSrcweir throw ( uno::RuntimeException )
209cdf0e10cSrcweir {
210cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::frameAction" );
211cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
212cdf0e10cSrcweir     if ( Action.Action == frame::FrameAction_CONTEXT_CHANGED )
213cdf0e10cSrcweir         UpdateControllers();
214cdf0e10cSrcweir }
215cdf0e10cSrcweir 
disposing(const lang::EventObject & Source)216cdf0e10cSrcweir void SAL_CALL StatusBarManager::disposing( const lang::EventObject& Source ) throw ( uno::RuntimeException )
217cdf0e10cSrcweir {
218cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::disposing" );
219cdf0e10cSrcweir     {
220cdf0e10cSrcweir         ResetableGuard aGuard( m_aLock );
221cdf0e10cSrcweir         if ( m_bDisposed )
222cdf0e10cSrcweir             return;
223cdf0e10cSrcweir     }
224cdf0e10cSrcweir 
225cdf0e10cSrcweir     RemoveControllers();
226cdf0e10cSrcweir 
227cdf0e10cSrcweir 	{
228cdf0e10cSrcweir 	    ResetableGuard aGuard( m_aLock );
229cdf0e10cSrcweir         if ( Source.Source == uno::Reference< uno::XInterface >( m_xFrame, uno::UNO_QUERY ))
230cdf0e10cSrcweir             m_xFrame.clear();
231cdf0e10cSrcweir 
232cdf0e10cSrcweir         m_xServiceManager.clear();
233cdf0e10cSrcweir     }
234cdf0e10cSrcweir }
235cdf0e10cSrcweir 
236cdf0e10cSrcweir // XComponent
dispose()237cdf0e10cSrcweir void SAL_CALL StatusBarManager::dispose() throw( uno::RuntimeException )
238cdf0e10cSrcweir {
239cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::dispose" );
240cdf0e10cSrcweir     uno::Reference< lang::XComponent > xThis(
241cdf0e10cSrcweir         static_cast< OWeakObject* >(this), uno::UNO_QUERY );
242cdf0e10cSrcweir 
243cdf0e10cSrcweir     lang::EventObject aEvent( xThis );
244cdf0e10cSrcweir     m_aListenerContainer.disposeAndClear( aEvent );
2452503e1a5SAriel Constenla-Haile 
246cdf0e10cSrcweir     {
247cdf0e10cSrcweir 	    ResetableGuard aGuard( m_aLock );
248cdf0e10cSrcweir         if ( !m_bDisposed )
249cdf0e10cSrcweir         {
250cdf0e10cSrcweir             RemoveControllers();
2512503e1a5SAriel Constenla-Haile 
2522503e1a5SAriel Constenla-Haile             // destroy the item data
2532503e1a5SAriel Constenla-Haile             for ( sal_uInt16 n = 0; n < m_pStatusBar->GetItemCount(); n++ )
2542503e1a5SAriel Constenla-Haile             {
2552503e1a5SAriel Constenla-Haile                 AddonStatusbarItemData *pUserData = static_cast< AddonStatusbarItemData *>(
2562503e1a5SAriel Constenla-Haile                     m_pStatusBar->GetItemData( m_pStatusBar->GetItemId( n ) ) );
2572503e1a5SAriel Constenla-Haile                 if ( pUserData )
2582503e1a5SAriel Constenla-Haile                     delete pUserData;
2592503e1a5SAriel Constenla-Haile             }
2602503e1a5SAriel Constenla-Haile 
261cdf0e10cSrcweir             delete m_pStatusBar;
262cdf0e10cSrcweir             m_pStatusBar = 0;
263cdf0e10cSrcweir 
264cdf0e10cSrcweir             if ( m_bFrameActionRegistered && m_xFrame.is() )
265cdf0e10cSrcweir             {
266cdf0e10cSrcweir                 try
267cdf0e10cSrcweir                 {
268cdf0e10cSrcweir                     m_xFrame->removeFrameActionListener( uno::Reference< frame::XFrameActionListener >(
269cdf0e10cSrcweir                                                             static_cast< ::cppu::OWeakObject *>( this ),
270cdf0e10cSrcweir                                                             uno::UNO_QUERY ));
271cdf0e10cSrcweir                 }
272cdf0e10cSrcweir                 catch ( uno::Exception& )
273cdf0e10cSrcweir                 {
274cdf0e10cSrcweir                 }
275cdf0e10cSrcweir             }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir             m_xFrame.clear();
278cdf0e10cSrcweir             m_xServiceManager.clear();
279cdf0e10cSrcweir 
280cdf0e10cSrcweir             m_bDisposed = sal_True;
281cdf0e10cSrcweir         }
282cdf0e10cSrcweir     }
283cdf0e10cSrcweir }
284cdf0e10cSrcweir 
addEventListener(const uno::Reference<lang::XEventListener> & xListener)285cdf0e10cSrcweir void SAL_CALL StatusBarManager::addEventListener( const uno::Reference< lang::XEventListener >& xListener ) throw( uno::RuntimeException )
286cdf0e10cSrcweir {
287cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::addEventListener" );
288cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
289cdf0e10cSrcweir 
290cdf0e10cSrcweir 	/* SAFE AREA ----------------------------------------------------------------------------------------------- */
291cdf0e10cSrcweir     if ( m_bDisposed )
292cdf0e10cSrcweir         throw lang::DisposedException();
293cdf0e10cSrcweir 
294cdf0e10cSrcweir     m_aListenerContainer.addInterface( ::getCppuType(
295cdf0e10cSrcweir         ( const uno::Reference< lang::XEventListener >* ) NULL ), xListener );
296cdf0e10cSrcweir }
297cdf0e10cSrcweir 
removeEventListener(const uno::Reference<lang::XEventListener> & xListener)298cdf0e10cSrcweir void SAL_CALL StatusBarManager::removeEventListener( const uno::Reference< lang::XEventListener >& xListener ) throw( uno::RuntimeException )
299cdf0e10cSrcweir {
300cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::removeEventListener" );
301cdf0e10cSrcweir     m_aListenerContainer.removeInterface( ::getCppuType(
302cdf0e10cSrcweir         ( const uno::Reference< lang::XEventListener >* ) NULL ), xListener );
303cdf0e10cSrcweir }
304cdf0e10cSrcweir 
305cdf0e10cSrcweir // XUIConfigurationListener
elementInserted(const css::ui::ConfigurationEvent &)306cdf0e10cSrcweir void SAL_CALL StatusBarManager::elementInserted( const css::ui::ConfigurationEvent& ) throw ( uno::RuntimeException )
307cdf0e10cSrcweir {
308cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::elementInserted" );
309cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
3102503e1a5SAriel Constenla-Haile 
311cdf0e10cSrcweir     if ( m_bDisposed )
312cdf0e10cSrcweir         return;
313cdf0e10cSrcweir }
314cdf0e10cSrcweir 
elementRemoved(const css::ui::ConfigurationEvent &)315cdf0e10cSrcweir void SAL_CALL StatusBarManager::elementRemoved( const css::ui::ConfigurationEvent& ) throw ( uno::RuntimeException )
316cdf0e10cSrcweir {
317cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::elementRemoved" );
318cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
3192503e1a5SAriel Constenla-Haile 
320cdf0e10cSrcweir     if ( m_bDisposed )
321cdf0e10cSrcweir         return;
322cdf0e10cSrcweir }
3232503e1a5SAriel Constenla-Haile 
elementReplaced(const css::ui::ConfigurationEvent &)324cdf0e10cSrcweir void SAL_CALL StatusBarManager::elementReplaced( const css::ui::ConfigurationEvent& ) throw ( uno::RuntimeException )
325cdf0e10cSrcweir {
326cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::elementReplaced" );
327cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
3282503e1a5SAriel Constenla-Haile 
329cdf0e10cSrcweir     if ( m_bDisposed )
330cdf0e10cSrcweir         return;
331cdf0e10cSrcweir }
332cdf0e10cSrcweir 
UpdateControllers()333cdf0e10cSrcweir void StatusBarManager::UpdateControllers()
334cdf0e10cSrcweir {
335cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::UpdateControllers" );
336cdf0e10cSrcweir     if ( !m_bUpdateControllers )
337cdf0e10cSrcweir     {
338cdf0e10cSrcweir         m_bUpdateControllers = sal_True;
3392503e1a5SAriel Constenla-Haile         std::for_each( m_aControllerMap.begin(),
3402503e1a5SAriel Constenla-Haile                        m_aControllerMap.end(),
3412503e1a5SAriel Constenla-Haile                        lcl_UpdateController< StatusBarControllerMap >() );
342cdf0e10cSrcweir     }
343cdf0e10cSrcweir     m_bUpdateControllers = sal_False;
344cdf0e10cSrcweir }
345cdf0e10cSrcweir 
RemoveControllers()346cdf0e10cSrcweir void StatusBarManager::RemoveControllers()
347cdf0e10cSrcweir {
348cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::RemoveControllers" );
349cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
350cdf0e10cSrcweir 
351cdf0e10cSrcweir     if ( m_bDisposed )
352cdf0e10cSrcweir         return;
353cdf0e10cSrcweir 
3542503e1a5SAriel Constenla-Haile     std::for_each( m_aControllerMap.begin(),
3552503e1a5SAriel Constenla-Haile                    m_aControllerMap.end(),
3562503e1a5SAriel Constenla-Haile                    lcl_RemoveController< StatusBarControllerMap >() );
3572503e1a5SAriel Constenla-Haile     m_aControllerMap.clear();
358cdf0e10cSrcweir }
359cdf0e10cSrcweir 
RetrieveLabelFromCommand(const rtl::OUString & aCmdURL)360cdf0e10cSrcweir rtl::OUString StatusBarManager::RetrieveLabelFromCommand( const rtl::OUString& aCmdURL )
361cdf0e10cSrcweir {
362cdf0e10cSrcweir     return framework::RetrieveLabelFromCommand(aCmdURL,m_xServiceManager,m_xUICommandLabels,m_xFrame,m_aModuleIdentifier,m_bModuleIdentified,"Name");
363cdf0e10cSrcweir }
364cdf0e10cSrcweir 
CreateControllers()365cdf0e10cSrcweir void StatusBarManager::CreateControllers()
366cdf0e10cSrcweir {
367cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::CreateControllers" );
368cdf0e10cSrcweir     uno::Reference< uno::XComponentContext > xComponentContext;
369cdf0e10cSrcweir     uno::Reference< beans::XPropertySet > xProps( m_xServiceManager, uno::UNO_QUERY );
370cdf0e10cSrcweir     uno::Reference< awt::XWindow > xStatusbarWindow = VCLUnoHelper::GetInterface( m_pStatusBar );
3712503e1a5SAriel Constenla-Haile 
372cdf0e10cSrcweir     if ( xProps.is() )
373cdf0e10cSrcweir         xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))) >>= xComponentContext;
3742503e1a5SAriel Constenla-Haile 
375cdf0e10cSrcweir     for ( sal_uInt16 i = 0; i < m_pStatusBar->GetItemCount(); i++ )
376cdf0e10cSrcweir     {
377cdf0e10cSrcweir         sal_uInt16 nId = m_pStatusBar->GetItemId( i );
378cdf0e10cSrcweir         if ( nId == 0 )
379cdf0e10cSrcweir             continue;
3802503e1a5SAriel Constenla-Haile 
381*d3bacab6SAriel Constenla-Haile         rtl::OUString aCommandURL( m_pStatusBar->GetItemCommand( nId ));
382*d3bacab6SAriel Constenla-Haile         sal_Bool bInit( sal_True );
383*d3bacab6SAriel Constenla-Haile         uno::Reference< frame::XStatusbarController > xController;
3842503e1a5SAriel Constenla-Haile         AddonStatusbarItemData *pItemData = static_cast< AddonStatusbarItemData *>( m_pStatusBar->GetItemData( nId ) );
3852503e1a5SAriel Constenla-Haile         uno::Reference< ui::XStatusbarItem > xStatusbarItem(
3862503e1a5SAriel Constenla-Haile             static_cast< cppu::OWeakObject *>( new StatusbarItem( m_pStatusBar, pItemData, nId, aCommandURL ) ),
3872503e1a5SAriel Constenla-Haile             uno::UNO_QUERY );
3882503e1a5SAriel Constenla-Haile 
389*d3bacab6SAriel Constenla-Haile         beans::PropertyValue aPropValue;
390*d3bacab6SAriel Constenla-Haile         std::vector< uno::Any > aPropVector;
3912503e1a5SAriel Constenla-Haile 
392*d3bacab6SAriel Constenla-Haile         aPropValue.Name     = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CommandURL" ));
393*d3bacab6SAriel Constenla-Haile         aPropValue.Value    <<= aCommandURL;
394*d3bacab6SAriel Constenla-Haile         aPropVector.push_back( uno::makeAny( aPropValue ) );
395dccf82beSAriel Constenla-Haile 
396*d3bacab6SAriel Constenla-Haile         aPropValue.Name     = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ModuleIdentifier" ));
397*d3bacab6SAriel Constenla-Haile         aPropValue.Value    <<= m_aModuleIdentifier;
398*d3bacab6SAriel Constenla-Haile         aPropVector.push_back( uno::makeAny( aPropValue ) );
399dccf82beSAriel Constenla-Haile 
400*d3bacab6SAriel Constenla-Haile         aPropValue.Name     = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Frame" ));
401*d3bacab6SAriel Constenla-Haile         aPropValue.Value    <<= m_xFrame;
402*d3bacab6SAriel Constenla-Haile         aPropVector.push_back( uno::makeAny( aPropValue ) );
403dccf82beSAriel Constenla-Haile 
404*d3bacab6SAriel Constenla-Haile         // TODO remove this
405*d3bacab6SAriel Constenla-Haile         aPropValue.Name     = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ServiceManager" ));
406*d3bacab6SAriel Constenla-Haile         aPropValue.Value    <<= m_xServiceManager;
407*d3bacab6SAriel Constenla-Haile         aPropVector.push_back( uno::makeAny( aPropValue ) );
408dccf82beSAriel Constenla-Haile 
409*d3bacab6SAriel Constenla-Haile         aPropValue.Name     = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ParentWindow" ));
410*d3bacab6SAriel Constenla-Haile         aPropValue.Value    <<= xStatusbarWindow;
411*d3bacab6SAriel Constenla-Haile         aPropVector.push_back( uno::makeAny( aPropValue ) );
412dccf82beSAriel Constenla-Haile 
413*d3bacab6SAriel Constenla-Haile         // TODO still needing with the css::ui::XStatusbarItem?
414*d3bacab6SAriel Constenla-Haile         aPropValue.Name     = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Identifier" ));
415*d3bacab6SAriel Constenla-Haile         aPropValue.Value    <<= nId;
416*d3bacab6SAriel Constenla-Haile         aPropVector.push_back( uno::makeAny( aPropValue ) );
417dccf82beSAriel Constenla-Haile 
418*d3bacab6SAriel Constenla-Haile         aPropValue.Name     = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StatusbarItem" ));
419*d3bacab6SAriel Constenla-Haile         aPropValue.Value    <<= xStatusbarItem;
420*d3bacab6SAriel Constenla-Haile         aPropVector.push_back( uno::makeAny( aPropValue ) );
421dccf82beSAriel Constenla-Haile 
422*d3bacab6SAriel Constenla-Haile         uno::Sequence< uno::Any > aArgs( comphelper::containerToSequence( aPropVector ) );
423*d3bacab6SAriel Constenla-Haile 
424*d3bacab6SAriel Constenla-Haile         // 1º) UNO Statusbar controllers, registered in Controllers.xcu
425*d3bacab6SAriel Constenla-Haile         if ( m_xStatusbarControllerFactory.is() &&
426*d3bacab6SAriel Constenla-Haile              m_xStatusbarControllerFactory->hasController( aCommandURL, m_aModuleIdentifier ))
427*d3bacab6SAriel Constenla-Haile         {
428*d3bacab6SAriel Constenla-Haile             xController = uno::Reference< frame::XStatusbarController >(
429dccf82beSAriel Constenla-Haile                             m_xStatusbarControllerFactory->createInstanceWithArgumentsAndContext(
430dccf82beSAriel Constenla-Haile                                 aCommandURL, aArgs, xComponentContext ),
431dccf82beSAriel Constenla-Haile                             uno::UNO_QUERY );
432dccf82beSAriel Constenla-Haile             bInit = sal_False; // Initialization is done through the factory service
433cdf0e10cSrcweir         }
434*d3bacab6SAriel Constenla-Haile 
435cdf0e10cSrcweir         if ( !xController.is() )
436cdf0e10cSrcweir         {
437*d3bacab6SAriel Constenla-Haile             svt::StatusbarController* pController( 0 );
438*d3bacab6SAriel Constenla-Haile 
4392503e1a5SAriel Constenla-Haile             // 2º) Old SFX2 Statusbar controllers
440cdf0e10cSrcweir             pController = CreateStatusBarController( m_xFrame, m_pStatusBar, nId, aCommandURL );
441cdf0e10cSrcweir             if ( !pController )
4422503e1a5SAriel Constenla-Haile             {
4432503e1a5SAriel Constenla-Haile                 // 3º) Is Add-on? Generic statusbar controller
4442503e1a5SAriel Constenla-Haile                 if ( pItemData )
4452503e1a5SAriel Constenla-Haile                 {
4462503e1a5SAriel Constenla-Haile                     pController = new GenericStatusbarController( m_xServiceManager,
4472503e1a5SAriel Constenla-Haile                                                                   m_xFrame,
4482503e1a5SAriel Constenla-Haile                                                                   xStatusbarItem,
4492503e1a5SAriel Constenla-Haile                                                                   pItemData );
4502503e1a5SAriel Constenla-Haile                 }
4512503e1a5SAriel Constenla-Haile                 else
4522503e1a5SAriel Constenla-Haile                 {
4532503e1a5SAriel Constenla-Haile                     // 4º) Default Statusbar controller
4542503e1a5SAriel Constenla-Haile                     pController = new svt::StatusbarController( m_xServiceManager, m_xFrame, aCommandURL, nId );
4552503e1a5SAriel Constenla-Haile                 }
4562503e1a5SAriel Constenla-Haile             }
4572503e1a5SAriel Constenla-Haile 
458cdf0e10cSrcweir             if ( pController )
459*d3bacab6SAriel Constenla-Haile                 xController = uno::Reference< frame::XStatusbarController >(
460cdf0e10cSrcweir                                 static_cast< ::cppu::OWeakObject *>( pController ),
461cdf0e10cSrcweir                                 uno::UNO_QUERY );
462cdf0e10cSrcweir         }
4632503e1a5SAriel Constenla-Haile 
4642503e1a5SAriel Constenla-Haile         m_aControllerMap[nId] = xController;
465*d3bacab6SAriel Constenla-Haile         if ( bInit )
466cdf0e10cSrcweir         {
467*d3bacab6SAriel Constenla-Haile             xController->initialize( aArgs );
468cdf0e10cSrcweir         }
469cdf0e10cSrcweir     }
470cdf0e10cSrcweir 
471cdf0e10cSrcweir     AddFrameActionListener();
472cdf0e10cSrcweir }
473cdf0e10cSrcweir 
AddFrameActionListener()474cdf0e10cSrcweir void StatusBarManager::AddFrameActionListener()
475cdf0e10cSrcweir {
476cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::AddFrameActionListener" );
477cdf0e10cSrcweir     if ( !m_bFrameActionRegistered && m_xFrame.is() )
478cdf0e10cSrcweir     {
479cdf0e10cSrcweir         m_bFrameActionRegistered = sal_True;
480cdf0e10cSrcweir         m_xFrame->addFrameActionListener( uno::Reference< frame::XFrameActionListener >(
481cdf0e10cSrcweir             static_cast< ::cppu::OWeakObject *>( this ), uno::UNO_QUERY ));
482cdf0e10cSrcweir     }
483cdf0e10cSrcweir }
484cdf0e10cSrcweir 
FillStatusBar(const uno::Reference<container::XIndexAccess> & rItemContainer)485cdf0e10cSrcweir void StatusBarManager::FillStatusBar( const uno::Reference< container::XIndexAccess >& rItemContainer )
486cdf0e10cSrcweir {
487cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::StatusBarManager::FillStatusbar" );
488cdf0e10cSrcweir 
489cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
490cdf0e10cSrcweir 
491cdf0e10cSrcweir     if ( m_bDisposed || !m_pStatusBar )
492cdf0e10cSrcweir         return;
493cdf0e10cSrcweir 
494cdf0e10cSrcweir     sal_uInt16         nId( 1 );
495cdf0e10cSrcweir     rtl::OUString  aHelpIdPrefix( RTL_CONSTASCII_USTRINGPARAM( HELPID_PREFIX ));
496cdf0e10cSrcweir 
497cdf0e10cSrcweir     RemoveControllers();
498cdf0e10cSrcweir 
499cdf0e10cSrcweir     // reset and fill command map
500cdf0e10cSrcweir     m_pStatusBar->Clear();
5012503e1a5SAriel Constenla-Haile     m_aControllerMap.clear();// TODO already done in RemoveControllers
502cdf0e10cSrcweir 
503cdf0e10cSrcweir     for ( sal_Int32 n = 0; n < rItemContainer->getCount(); n++ )
504cdf0e10cSrcweir     {
505cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::FillStatusBar" );
506cdf0e10cSrcweir         uno::Sequence< beans::PropertyValue >   aProp;
507cdf0e10cSrcweir         rtl::OUString                           aCommandURL;
508cdf0e10cSrcweir         rtl::OUString                           aHelpURL;
509cdf0e10cSrcweir         sal_Int16                               nOffset( 0 );
510cdf0e10cSrcweir         sal_Int16                               nStyle( 0 );
511cdf0e10cSrcweir         sal_Int16                               nWidth( 0 );
512cdf0e10cSrcweir         sal_uInt16                              nType( css_ui::ItemType::DEFAULT );
513cdf0e10cSrcweir 
514cdf0e10cSrcweir         try
515cdf0e10cSrcweir         {
516cdf0e10cSrcweir             if ( rItemContainer->getByIndex( n ) >>= aProp )
517cdf0e10cSrcweir             {
518cdf0e10cSrcweir                 for ( int i = 0; i < aProp.getLength(); i++ )
519cdf0e10cSrcweir                 {
520cdf0e10cSrcweir                     if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_COMMANDURL ))
521cdf0e10cSrcweir                     {
522cdf0e10cSrcweir                         aProp[i].Value >>= aCommandURL;
523cdf0e10cSrcweir                     }
524cdf0e10cSrcweir                     else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_HELPURL ))
525cdf0e10cSrcweir                     {
526cdf0e10cSrcweir                         aProp[i].Value >>= aHelpURL;
527cdf0e10cSrcweir                     }
528cdf0e10cSrcweir                     else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_STYLE ))
529cdf0e10cSrcweir                     {
530cdf0e10cSrcweir                         aProp[i].Value >>= nStyle;
531cdf0e10cSrcweir                     }
532cdf0e10cSrcweir                     else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_TYPE ))
533cdf0e10cSrcweir                     {
534cdf0e10cSrcweir                         aProp[i].Value >>= nType;
535cdf0e10cSrcweir                     }
536cdf0e10cSrcweir                     else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_WIDTH ))
537cdf0e10cSrcweir                     {
538cdf0e10cSrcweir                         aProp[i].Value >>= nWidth;
539cdf0e10cSrcweir                     }
540cdf0e10cSrcweir                     else if ( aProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_OFFSET ))
541cdf0e10cSrcweir                     {
542cdf0e10cSrcweir                         aProp[i].Value >>= nOffset;
543cdf0e10cSrcweir                     }
544cdf0e10cSrcweir                 }
545cdf0e10cSrcweir 
546cdf0e10cSrcweir                 if (( nType == ::com::sun::star::ui::ItemType::DEFAULT ) && ( aCommandURL.getLength() > 0 ))
547cdf0e10cSrcweir                 {
548cdf0e10cSrcweir                     rtl::OUString aString( RetrieveLabelFromCommand( aCommandURL ));
549cdf0e10cSrcweir                     sal_uInt16        nItemBits( impl_convertItemStyleToItemBits( nStyle ));
5502503e1a5SAriel Constenla-Haile 
551cdf0e10cSrcweir                     m_pStatusBar->InsertItem( nId, nWidth, nItemBits, nOffset );
552cdf0e10cSrcweir                     m_pStatusBar->SetItemCommand( nId, aCommandURL );
553cdf0e10cSrcweir                     m_pStatusBar->SetAccessibleName( nId, aString );
554cdf0e10cSrcweir                     ++nId;
555cdf0e10cSrcweir                 }
556cdf0e10cSrcweir             }
557cdf0e10cSrcweir         }
558cdf0e10cSrcweir         catch ( ::com::sun::star::lang::IndexOutOfBoundsException& )
559cdf0e10cSrcweir         {
560cdf0e10cSrcweir             break;
561cdf0e10cSrcweir         }
562cdf0e10cSrcweir     }
563cdf0e10cSrcweir 
5642503e1a5SAriel Constenla-Haile     // Statusbar Merging
5652503e1a5SAriel Constenla-Haile     const sal_uInt16 STATUSBAR_ITEM_STARTID = 1000;
5662503e1a5SAriel Constenla-Haile     MergeStatusbarInstructionContainer aMergeInstructions = AddonsOptions().GetMergeStatusbarInstructions();
5672503e1a5SAriel Constenla-Haile     if ( !aMergeInstructions.empty() )
5682503e1a5SAriel Constenla-Haile     {
5692503e1a5SAriel Constenla-Haile         const sal_uInt32 nCount = aMergeInstructions.size();
5702503e1a5SAriel Constenla-Haile         sal_uInt16 nItemId( STATUSBAR_ITEM_STARTID );
5712503e1a5SAriel Constenla-Haile 
5722503e1a5SAriel Constenla-Haile         for ( sal_uInt32 i = 0; i < nCount; i++ )
5732503e1a5SAriel Constenla-Haile         {
5742503e1a5SAriel Constenla-Haile             MergeStatusbarInstruction &rInstruction = aMergeInstructions[i];
5752503e1a5SAriel Constenla-Haile             if ( !StatusbarMerger::IsCorrectContext( rInstruction.aMergeContext, m_aModuleIdentifier ) )
5762503e1a5SAriel Constenla-Haile                 continue;
5772503e1a5SAriel Constenla-Haile 
5782503e1a5SAriel Constenla-Haile             AddonStatusbarItemContainer aItems;
5792503e1a5SAriel Constenla-Haile             StatusbarMerger::ConvertSeqSeqToVector( rInstruction.aMergeStatusbarItems, aItems );
5802503e1a5SAriel Constenla-Haile 
5812503e1a5SAriel Constenla-Haile             sal_uInt16 nRefPos = StatusbarMerger::FindReferencePos( m_pStatusBar, rInstruction.aMergePoint );
5822503e1a5SAriel Constenla-Haile             if ( nRefPos != STATUSBAR_ITEM_NOTFOUND )
5832503e1a5SAriel Constenla-Haile             {
5842503e1a5SAriel Constenla-Haile                 StatusbarMerger::ProcessMergeOperation( m_pStatusBar,
5852503e1a5SAriel Constenla-Haile                                                         nRefPos,
5862503e1a5SAriel Constenla-Haile                                                         nItemId,
5872503e1a5SAriel Constenla-Haile                                                         m_aModuleIdentifier,
5882503e1a5SAriel Constenla-Haile                                                         rInstruction.aMergeCommand,
5892503e1a5SAriel Constenla-Haile                                                         rInstruction.aMergeCommandParameter,
5902503e1a5SAriel Constenla-Haile                                                         aItems );
5912503e1a5SAriel Constenla-Haile             }
5922503e1a5SAriel Constenla-Haile             else
5932503e1a5SAriel Constenla-Haile             {
5942503e1a5SAriel Constenla-Haile                 StatusbarMerger::ProcessMergeFallback( m_pStatusBar,
5952503e1a5SAriel Constenla-Haile                                                        nRefPos,
5962503e1a5SAriel Constenla-Haile                                                        nItemId,
5972503e1a5SAriel Constenla-Haile                                                        m_aModuleIdentifier,
5982503e1a5SAriel Constenla-Haile                                                        rInstruction.aMergeCommand,
5992503e1a5SAriel Constenla-Haile                                                        rInstruction.aMergeCommandParameter,
6002503e1a5SAriel Constenla-Haile                                                        aItems );
6012503e1a5SAriel Constenla-Haile             }
6022503e1a5SAriel Constenla-Haile         }
6032503e1a5SAriel Constenla-Haile     }
6042503e1a5SAriel Constenla-Haile 
605cdf0e10cSrcweir     // Create controllers
606cdf0e10cSrcweir     CreateControllers();
607cdf0e10cSrcweir 
608cdf0e10cSrcweir     // Notify controllers that they are now correctly initialized and can start listening
609cdf0e10cSrcweir     UpdateControllers();
610cdf0e10cSrcweir }
611cdf0e10cSrcweir 
StateChanged(StateChangedType)612cdf0e10cSrcweir void StatusBarManager::StateChanged( StateChangedType )
613cdf0e10cSrcweir {
614cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::StateChanged" );
615cdf0e10cSrcweir }
616cdf0e10cSrcweir 
DataChanged(const DataChangedEvent & rDCEvt)617cdf0e10cSrcweir void StatusBarManager::DataChanged( const DataChangedEvent& rDCEvt )
618cdf0e10cSrcweir {
619cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::DataChanged" );
620cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
621cdf0e10cSrcweir 
622cdf0e10cSrcweir     if ((( rDCEvt.GetType() == DATACHANGED_SETTINGS	        ) ||
623cdf0e10cSrcweir          ( rDCEvt.GetType() == DATACHANGED_FONTS            ) ||
624cdf0e10cSrcweir 		 ( rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION ) ||
625cdf0e10cSrcweir 		 ( rDCEvt.GetType() == DATACHANGED_DISPLAY	        ))	&&
626cdf0e10cSrcweir          ( rDCEvt.GetFlags() & SETTINGS_STYLE		        ))
627cdf0e10cSrcweir     {
628cdf0e10cSrcweir         css::uno::Reference< css::frame::XLayoutManager > xLayoutManager;
629cdf0e10cSrcweir         css::uno::Reference< css::beans::XPropertySet > xPropSet( m_xFrame, css::uno::UNO_QUERY );
630cdf0e10cSrcweir         if ( xPropSet.is() )
631cdf0e10cSrcweir             xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" ))) >>= xLayoutManager;
632cdf0e10cSrcweir         if ( xLayoutManager.is() )
633cdf0e10cSrcweir         {
634cdf0e10cSrcweir             aGuard.unlock();
635cdf0e10cSrcweir             xLayoutManager->doLayout();
636cdf0e10cSrcweir         }
637cdf0e10cSrcweir     }
638cdf0e10cSrcweir }
639cdf0e10cSrcweir 
UserDraw(const UserDrawEvent & rUDEvt)640cdf0e10cSrcweir void StatusBarManager::UserDraw( const UserDrawEvent& rUDEvt )
641cdf0e10cSrcweir {
642cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::UserDraw" );
643cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
6442503e1a5SAriel Constenla-Haile 
645cdf0e10cSrcweir     if ( m_bDisposed )
646cdf0e10cSrcweir         return;
6472503e1a5SAriel Constenla-Haile 
648cdf0e10cSrcweir     sal_uInt16 nId( rUDEvt.GetItemId() );
6492503e1a5SAriel Constenla-Haile     StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId );
6502503e1a5SAriel Constenla-Haile     if (( nId > 0 ) && ( it != m_aControllerMap.end() ))
651cdf0e10cSrcweir     {
652*d3bacab6SAriel Constenla-Haile         uno::Reference< frame::XStatusbarController > xController( it->second );
653cdf0e10cSrcweir         if ( xController.is() && rUDEvt.GetDevice() )
654cdf0e10cSrcweir         {
6552503e1a5SAriel Constenla-Haile             uno::Reference< awt::XGraphics > xGraphics =
656cdf0e10cSrcweir                 rUDEvt.GetDevice()->CreateUnoGraphics();
657cdf0e10cSrcweir 
6582503e1a5SAriel Constenla-Haile             awt::Rectangle aRect( rUDEvt.GetRect().Left(),
659cdf0e10cSrcweir                                   rUDEvt.GetRect().Top(),
6602503e1a5SAriel Constenla-Haile                                   rUDEvt.GetRect().GetWidth(),
661cdf0e10cSrcweir                                   rUDEvt.GetRect().GetHeight() );
662cdf0e10cSrcweir             aGuard.unlock();
6632503e1a5SAriel Constenla-Haile             xController->paint( xGraphics, aRect, rUDEvt.GetStyle() );
664cdf0e10cSrcweir         }
665cdf0e10cSrcweir     }
666cdf0e10cSrcweir }
667cdf0e10cSrcweir 
Command(const CommandEvent & rEvt)668cdf0e10cSrcweir void StatusBarManager::Command( const CommandEvent& rEvt )
669cdf0e10cSrcweir {
670cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::Command" );
671cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
6722503e1a5SAriel Constenla-Haile 
673cdf0e10cSrcweir     if ( m_bDisposed )
674cdf0e10cSrcweir         return;
6752503e1a5SAriel Constenla-Haile 
676cdf0e10cSrcweir     if ( rEvt.GetCommand() == COMMAND_CONTEXTMENU )
677cdf0e10cSrcweir     {
678cdf0e10cSrcweir         sal_uInt16 nId = m_pStatusBar->GetItemId( rEvt.GetMousePosPixel() );
6792503e1a5SAriel Constenla-Haile         StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId );
6802503e1a5SAriel Constenla-Haile         if (( nId > 0 ) && ( it != m_aControllerMap.end() ))
681cdf0e10cSrcweir         {
682*d3bacab6SAriel Constenla-Haile             uno::Reference< frame::XStatusbarController > xController( it->second );
683cdf0e10cSrcweir             if ( xController.is() )
684cdf0e10cSrcweir             {
685cdf0e10cSrcweir                 awt::Point aPos;
686cdf0e10cSrcweir                 aPos.X = rEvt.GetMousePosPixel().X();
687cdf0e10cSrcweir                 aPos.Y = rEvt.GetMousePosPixel().Y();
688cdf0e10cSrcweir                 xController->command( aPos, awt::Command::CONTEXTMENU, sal_True, uno::Any() );
689cdf0e10cSrcweir             }
690cdf0e10cSrcweir         }
691cdf0e10cSrcweir     }
692cdf0e10cSrcweir }
693cdf0e10cSrcweir 
MouseMove(const MouseEvent & rMEvt)694cdf0e10cSrcweir void StatusBarManager::MouseMove( const MouseEvent& rMEvt )
695cdf0e10cSrcweir {
696cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::MouseMove" );
697cdf0e10cSrcweir     MouseButton(rMEvt,&frame::XStatusbarController::mouseMove);
698cdf0e10cSrcweir }
6992503e1a5SAriel Constenla-Haile 
MouseButton(const MouseEvent & rMEvt,sal_Bool (SAL_CALL frame::XStatusbarController::* _pMethod)(const::com::sun::star::awt::MouseEvent &))700cdf0e10cSrcweir void StatusBarManager::MouseButton( const MouseEvent& rMEvt ,sal_Bool ( SAL_CALL frame::XStatusbarController::*_pMethod )(const ::com::sun::star::awt::MouseEvent&))
701cdf0e10cSrcweir {
702cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::MouseButton" );
703cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
7042503e1a5SAriel Constenla-Haile 
705cdf0e10cSrcweir     if ( !m_bDisposed )
706cdf0e10cSrcweir     {
707cdf0e10cSrcweir         sal_uInt16 nId = m_pStatusBar->GetItemId( rMEvt.GetPosPixel() );
7082503e1a5SAriel Constenla-Haile         StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId );
7092503e1a5SAriel Constenla-Haile         if (( nId > 0 ) && ( it != m_aControllerMap.end() ))
710cdf0e10cSrcweir         {
711*d3bacab6SAriel Constenla-Haile             uno::Reference< frame::XStatusbarController > xController( it->second );
712cdf0e10cSrcweir             if ( xController.is() )
713cdf0e10cSrcweir             {
714cdf0e10cSrcweir                 ::com::sun::star::awt::MouseEvent aMouseEvent;
715cdf0e10cSrcweir                 aMouseEvent.Buttons = rMEvt.GetButtons();
716cdf0e10cSrcweir                 aMouseEvent.X = rMEvt.GetPosPixel().X();
717cdf0e10cSrcweir                 aMouseEvent.Y = rMEvt.GetPosPixel().Y();
718cdf0e10cSrcweir                 aMouseEvent.ClickCount = rMEvt.GetClicks();
719cdf0e10cSrcweir                 (xController.get()->*_pMethod)( aMouseEvent);
720cdf0e10cSrcweir             }
7212503e1a5SAriel Constenla-Haile         }
722cdf0e10cSrcweir     }
723cdf0e10cSrcweir }
7242503e1a5SAriel Constenla-Haile 
MouseButtonDown(const MouseEvent & rMEvt)725cdf0e10cSrcweir void StatusBarManager::MouseButtonDown( const MouseEvent& rMEvt )
726cdf0e10cSrcweir {
727cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::MouseButtonDown" );
728cdf0e10cSrcweir     MouseButton(rMEvt,&frame::XStatusbarController::mouseButtonDown);
729cdf0e10cSrcweir }
730cdf0e10cSrcweir 
MouseButtonUp(const MouseEvent & rMEvt)731cdf0e10cSrcweir void StatusBarManager::MouseButtonUp( const MouseEvent& rMEvt )
732cdf0e10cSrcweir {
733cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "StatusBarManager::MouseButtonUp" );
734cdf0e10cSrcweir     MouseButton(rMEvt,&frame::XStatusbarController::mouseButtonUp);
735cdf0e10cSrcweir }
736cdf0e10cSrcweir 
IMPL_LINK(StatusBarManager,Click,StatusBar *,EMPTYARG)737cdf0e10cSrcweir IMPL_LINK( StatusBarManager, Click, StatusBar*, EMPTYARG )
738cdf0e10cSrcweir {
739cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
7402503e1a5SAriel Constenla-Haile 
741cdf0e10cSrcweir     if ( m_bDisposed )
742cdf0e10cSrcweir         return 1;
7432503e1a5SAriel Constenla-Haile 
744cdf0e10cSrcweir     sal_uInt16 nId = m_pStatusBar->GetCurItemId();
7452503e1a5SAriel Constenla-Haile     StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId );
7462503e1a5SAriel Constenla-Haile     if (( nId > 0 ) && ( it != m_aControllerMap.end() ))
747cdf0e10cSrcweir     {
748*d3bacab6SAriel Constenla-Haile         uno::Reference< frame::XStatusbarController > xController( it->second );
749cdf0e10cSrcweir         if ( xController.is() )
7502503e1a5SAriel Constenla-Haile         {
7512503e1a5SAriel Constenla-Haile             const Point aVCLPos = m_pStatusBar->GetPointerPosPixel();
7522503e1a5SAriel Constenla-Haile             const awt::Point aAWTPoint( aVCLPos.X(), aVCLPos.Y() );
7532503e1a5SAriel Constenla-Haile             xController->click( aAWTPoint );
7542503e1a5SAriel Constenla-Haile         }
755cdf0e10cSrcweir     }
7562503e1a5SAriel Constenla-Haile 
757cdf0e10cSrcweir     return 1;
758cdf0e10cSrcweir }
759cdf0e10cSrcweir 
IMPL_LINK(StatusBarManager,DoubleClick,StatusBar *,EMPTYARG)760cdf0e10cSrcweir IMPL_LINK( StatusBarManager, DoubleClick, StatusBar*, EMPTYARG )
761cdf0e10cSrcweir {
762cdf0e10cSrcweir     ResetableGuard aGuard( m_aLock );
7632503e1a5SAriel Constenla-Haile 
764cdf0e10cSrcweir     if ( m_bDisposed )
765cdf0e10cSrcweir         return 1;
7662503e1a5SAriel Constenla-Haile 
767cdf0e10cSrcweir     sal_uInt16 nId = m_pStatusBar->GetCurItemId();
7682503e1a5SAriel Constenla-Haile     StatusBarControllerMap::const_iterator it = m_aControllerMap.find( nId );
7692503e1a5SAriel Constenla-Haile     if (( nId > 0 ) && ( it != m_aControllerMap.end() ))
770cdf0e10cSrcweir     {
771*d3bacab6SAriel Constenla-Haile         uno::Reference< frame::XStatusbarController > xController( it->second );
772cdf0e10cSrcweir         if ( xController.is() )
7732503e1a5SAriel Constenla-Haile         {
7742503e1a5SAriel Constenla-Haile             const Point aVCLPos = m_pStatusBar->GetPointerPosPixel();
7752503e1a5SAriel Constenla-Haile             const awt::Point aAWTPoint( aVCLPos.X(), aVCLPos.Y() );
7762503e1a5SAriel Constenla-Haile             xController->doubleClick( aAWTPoint );
7772503e1a5SAriel Constenla-Haile         }
778cdf0e10cSrcweir     }
7792503e1a5SAriel Constenla-Haile 
780cdf0e10cSrcweir     return 1;
781cdf0e10cSrcweir }
782cdf0e10cSrcweir 
783cdf0e10cSrcweir }
784