xref: /trunk/main/sfx2/source/statbar/stbitem.cxx (revision 989b13ef2270bbb43d1b5fb03162470a47d7f4cc)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_sfx2.hxx"
24 #include <svl/stritem.hxx>
25 #ifndef GCC
26 #endif
27 #include <com/sun/star/util/URL.hpp>
28 #include <com/sun/star/util/XURLTransformer.hpp>
29 #include <com/sun/star/frame/XController.hpp>
30 #include <com/sun/star/lang/XUnoTunnel.hpp>
31 #include <com/sun/star/frame/status/ItemStatus.hpp>
32 #include <com/sun/star/frame/status/ItemState.hpp>
33 #include <com/sun/star/awt/MouseButton.hpp>
34 
35 #include <vcl/status.hxx>
36 
37 #include <sfx2/app.hxx>
38 #include "sfx2/stbitem.hxx"
39 #include "sfxtypes.hxx"
40 #include <sfx2/msg.hxx>
41 #include "arrdecl.hxx"
42 #include <sfx2/bindings.hxx>
43 #include <sfx2/msgpool.hxx>
44 #include <sfx2/module.hxx>
45 #include <sfx2/dispatch.hxx>
46 #include <sfx2/unoctitm.hxx>
47 #include <sfx2/objsh.hxx>
48 #include <sfx2/sfx.hrc>
49 
50 #include <comphelper/processfactory.hxx>
51 #include <svl/eitem.hxx>
52 #include <svl/stritem.hxx>
53 #include <svl/intitem.hxx>
54 #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
55 #include <toolkit/helper/vclunohelper.hxx>
56 #endif
57 #include <toolkit/helper/convert.hxx>
58 
59 using namespace ::com::sun::star;
60 
61 //--------------------------------------------------------------------
62 
63 sal_uInt16 SfxStatusBarControl::convertAwtToVCLMouseButtons( sal_Int16 nAwtMouseButtons )
64 {
65     sal_uInt16 nVCLMouseButtons( 0 );
66 
67     if ( nAwtMouseButtons & awt::MouseButton::LEFT )
68         nVCLMouseButtons |= MOUSE_LEFT;
69     if ( nAwtMouseButtons & awt::MouseButton::RIGHT )
70         nVCLMouseButtons |= MOUSE_RIGHT;
71     if ( nAwtMouseButtons & awt::MouseButton::MIDDLE )
72         nVCLMouseButtons |= MOUSE_MIDDLE;
73 
74     return nVCLMouseButtons;
75 }
76 
77 //--------------------------------------------------------------------
78 
79 svt::StatusbarController* SAL_CALL SfxStatusBarControllerFactory(
80     const uno::Reference< frame::XFrame >& rFrame,
81     StatusBar* pStatusBar,
82     unsigned short nID,
83     const ::rtl::OUString& aCommandURL )
84 {
85     ::vos::OGuard aGuard( Application::GetSolarMutex() );
86 
87     util::URL aTargetURL;
88     aTargetURL.Complete = aCommandURL;
89     uno::Reference < util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance(
90         rtl::OUString::createFromAscii( "com.sun.star.util.URLTransformer" )), uno::UNO_QUERY );
91     xTrans->parseStrict( aTargetURL );
92 
93     SfxObjectShell* pObjShell = NULL;
94     uno::Reference < frame::XController > xController;
95     uno::Reference < frame::XModel > xModel;
96     if ( rFrame.is() )
97     {
98         xController = rFrame->getController();
99         if ( xController.is() )
100             xModel = xController->getModel();
101     }
102 
103     if ( xModel.is() )
104     {
105         // Get tunnel from model to retrieve the SfxObjectShell pointer from it
106         ::com::sun::star::uno::Reference < ::com::sun::star::lang::XUnoTunnel > xObj( xModel, uno::UNO_QUERY );
107         ::com::sun::star::uno::Sequence < sal_Int8 > aSeq = SvGlobalName( SFX_GLOBAL_CLASSID ).GetByteSequence();
108         if ( xObj.is() )
109         {
110             sal_Int64 nHandle = xObj->getSomething( aSeq );
111             if ( nHandle )
112                         pObjShell = reinterpret_cast< SfxObjectShell* >( sal::static_int_cast< sal_IntPtr >( nHandle ));
113         }
114     }
115 
116     SfxModule*     pModule   = pObjShell ? pObjShell->GetModule() : NULL;
117     SfxSlotPool*   pSlotPool = 0;
118 
119     if ( pModule )
120         pSlotPool = pModule->GetSlotPool();
121     else
122         pSlotPool = &(SfxSlotPool::GetSlotPool( NULL ));
123 
124     const SfxSlot* pSlot = pSlotPool->GetUnoSlot( aTargetURL.Path );
125     if ( pSlot )
126     {
127         sal_uInt16 nSlotId = pSlot->GetSlotId();
128         if ( nSlotId > 0 )
129         {
130             rtl::OString aCmd(".uno:");
131             aCmd += pSlot->GetUnoName();
132             pStatusBar->SetHelpId( nSlotId, aCmd );
133             return SfxStatusBarControl::CreateControl( nSlotId, nID, pStatusBar, pModule );
134         }
135     }
136 
137     return NULL;
138 }
139 
140 //--------------------------------------------------------------------
141 
142 SfxStatusBarControl::SfxStatusBarControl
143 (
144     sal_uInt16      nSlotID,            /* Slot-Id, mit der diese Instanz
145                                        verbunden wird. Wurde bei der
146                                        Registrierung eine Slot-Id != 0
147                                        angegeben, ist dies immer die dort
148                                        angegebene. */
149     sal_uInt16      nCtrlID,            /* ID of this controller in the status bar */
150 
151     StatusBar&  rBar                /* Referenz auf die StatusBar, für die
152                                        dieses Control erzeugt wurde. */
153 )
154 
155 /*  [Beschreibung]
156 
157     Konstruktor der Klasse SfxStatusBarControl. Die Subclasses werden
158     bei Bedarf per Factory vom SFx erzeugt.
159 
160     Instanzen dieser Basisklasse werden für alle StatusBar-Felder
161     erzeugt, für die keine speziellen registriert wurden.
162 */
163 
164 :   svt::StatusbarController(),
165     nSlotId( nSlotID ),
166     nId( nCtrlID ),
167     pBar( &rBar )
168 {
169 }
170 
171 //--------------------------------------------------------------------
172 
173 SfxStatusBarControl::~SfxStatusBarControl()
174 
175 /*  [Beschreibung]
176 
177     Destruktor der Klasse SfxStatusBarControl. Die Instanzen dieser
178     Klasse und deren Subklassen werden vom SFx zerstört.
179 */
180 
181 {}
182 
183 //--------------------------------------------------------------------
184 // XInterface
185 uno::Any SAL_CALL SfxStatusBarControl::queryInterface( const uno::Type & rType )
186 throw( uno::RuntimeException)
187 {
188     return svt::StatusbarController::queryInterface( rType );
189 }
190 
191 void SAL_CALL SfxStatusBarControl::acquire() throw()
192 {
193     OWeakObject::acquire();
194 }
195 
196 void SAL_CALL SfxStatusBarControl::release() throw()
197 {
198     OWeakObject::release();
199 }
200 
201 //--------------------------------------------------------------------
202 // XEventListener
203 void SAL_CALL SfxStatusBarControl::disposing( const lang::EventObject& aEvent )
204 throw( uno::RuntimeException )
205 {
206     svt::StatusbarController::disposing( aEvent );
207 }
208 
209 //--------------------------------------------------------------------
210 // XComponent
211 void SAL_CALL SfxStatusBarControl::dispose()
212 throw (uno::RuntimeException)
213 {
214     svt::StatusbarController::dispose();
215 }
216 
217 //--------------------------------------------------------------------
218 // XStatusListener
219 void SAL_CALL SfxStatusBarControl::statusChanged( const frame::FeatureStateEvent& rEvent )
220 throw ( ::com::sun::star::uno::RuntimeException )
221 {
222     SfxViewFrame* pViewFrame = NULL;
223     uno::Reference < frame::XController > xController;
224 
225     ::vos::OGuard aGuard( Application::GetSolarMutex() );
226     if ( m_xFrame.is() )
227         xController = m_xFrame->getController();
228 
229     uno::Reference < frame::XDispatchProvider > xProvider( xController, uno::UNO_QUERY );
230     if ( xProvider.is() )
231     {
232         uno::Reference < frame::XDispatch > xDisp = xProvider->queryDispatch( rEvent.FeatureURL, ::rtl::OUString(), 0 );
233         if ( xDisp.is() )
234         {
235             uno::Reference< lang::XUnoTunnel > xTunnel( xDisp, uno::UNO_QUERY );
236             SfxOfficeDispatch* pDisp = NULL;
237             if ( xTunnel.is() )
238             {
239                 sal_Int64 nImplementation = xTunnel->getSomething(SfxOfficeDispatch::impl_getStaticIdentifier());
240                 pDisp = reinterpret_cast< SfxOfficeDispatch* >(sal::static_int_cast< sal_IntPtr >( nImplementation ));
241             }
242 
243             if ( pDisp )
244                 pViewFrame = pDisp->GetDispatcher_Impl()->GetFrame();
245         }
246     }
247 
248     sal_uInt16 nSlotID = 0;
249     SfxSlotPool& rPool = SfxSlotPool::GetSlotPool( pViewFrame );
250     const SfxSlot* pSlot = rPool.GetUnoSlot( rEvent.FeatureURL.Path );
251     if ( pSlot )
252         nSlotID = pSlot->GetSlotId();
253 
254     if ( nSlotID > 0 )
255     {
256         if ( rEvent.Requery )
257             svt::StatusbarController::statusChanged( rEvent );
258         else
259         {
260             SfxItemState eState = SFX_ITEM_DISABLED;
261             SfxPoolItem* pItem = NULL;
262             if ( rEvent.IsEnabled )
263             {
264                 eState = SFX_ITEM_AVAILABLE;
265                 uno::Type pType = rEvent.State.getValueType();
266 
267                 if ( pType == ::getVoidCppuType() )
268                 {
269                     pItem = new SfxVoidItem( nSlotID );
270                     eState = SFX_ITEM_UNKNOWN;
271                 }
272                 else if ( pType == ::getBooleanCppuType() )
273                 {
274                     sal_Bool bTemp = 0;
275                     rEvent.State >>= bTemp ;
276                     pItem = new SfxBoolItem( nSlotID, bTemp );
277                 }
278                 else if ( pType == ::getCppuType((const sal_uInt16*)0) )
279                 {
280                     sal_uInt16 nTemp = 0;
281                     rEvent.State >>= nTemp ;
282                     pItem = new SfxUInt16Item( nSlotID, nTemp );
283                 }
284                 else if ( pType == ::getCppuType((const sal_uInt32*)0) )
285                 {
286                     sal_uInt32 nTemp = 0;
287                     rEvent.State >>= nTemp ;
288                     pItem = new SfxUInt32Item( nSlotID, nTemp );
289                 }
290                 else if ( pType == ::getCppuType((const ::rtl::OUString*)0) )
291                 {
292                     ::rtl::OUString sTemp ;
293                     rEvent.State >>= sTemp ;
294                     pItem = new SfxStringItem( nSlotID, sTemp );
295                 }
296                 else if ( pType == ::getCppuType((const ::com::sun::star::frame::status::ItemStatus*)0) )
297                 {
298                     frame::status::ItemStatus aItemStatus;
299                     rEvent.State >>= aItemStatus;
300                     eState = aItemStatus.State;
301                     pItem = new SfxVoidItem( nSlotID );
302                 }
303                 else
304                 {
305                     if ( pSlot )
306                         pItem = pSlot->GetType()->CreateItem();
307                     if ( pItem )
308                     {
309                         pItem->SetWhich( nSlotID );
310                         pItem->PutValue( rEvent.State );
311                     }
312                     else
313                         pItem = new SfxVoidItem( nSlotID );
314                 }
315             }
316 
317             StateChanged( nSlotID, eState, pItem );
318             delete pItem;
319         }
320     }
321 }
322 
323 //--------------------------------------------------------------------
324 // XStatusbarController
325 
326 ::sal_Bool SAL_CALL SfxStatusBarControl::mouseButtonDown(
327     const awt::MouseEvent& rMouseEvent )
328 throw ( uno::RuntimeException )
329 {
330     ::vos::OGuard aGuard( Application::GetSolarMutex() );
331     ::Point aPos( rMouseEvent.X, rMouseEvent.Y );
332 
333     ::MouseEvent aMouseEvent( aPos,
334                               (sal_uInt16)rMouseEvent.ClickCount,
335                               0,
336                               convertAwtToVCLMouseButtons( rMouseEvent.Buttons ),
337                               0 );
338     return MouseButtonDown( aMouseEvent );
339 }
340 
341 //--------------------------------------------------------------------
342 
343 ::sal_Bool SAL_CALL SfxStatusBarControl::mouseMove(
344     const awt::MouseEvent& rMouseEvent )
345 throw (uno::RuntimeException)
346 {
347     ::vos::OGuard aGuard( Application::GetSolarMutex() );
348     ::Point aPos( rMouseEvent.X, rMouseEvent.Y );
349 
350     ::MouseEvent aMouseEvent( aPos,
351                               (sal_uInt16)rMouseEvent.ClickCount,
352                               0,
353                               convertAwtToVCLMouseButtons( rMouseEvent.Buttons ),
354                               0 );
355     return MouseMove( aMouseEvent );
356 }
357 
358 //--------------------------------------------------------------------
359 
360 ::sal_Bool SAL_CALL SfxStatusBarControl::mouseButtonUp(
361     const ::awt::MouseEvent& rMouseEvent )
362 throw ( uno::RuntimeException )
363 {
364     ::vos::OGuard aGuard( Application::GetSolarMutex() );
365     ::Point aPos( rMouseEvent.X, rMouseEvent.Y );
366 
367     ::MouseEvent aMouseEvent( aPos,
368                               (sal_uInt16)rMouseEvent.ClickCount,
369                               0,
370                               convertAwtToVCLMouseButtons( rMouseEvent.Buttons ),
371                               0 );
372     return MouseButtonUp( aMouseEvent );
373 }
374 
375 //--------------------------------------------------------------------
376 
377 void SAL_CALL SfxStatusBarControl::command(
378     const awt::Point& rPos,
379     ::sal_Int32 nCommand,
380     ::sal_Bool /*bMouseEvent*/,
381     const ::com::sun::star::uno::Any& /*aData*/ )
382 throw (::com::sun::star::uno::RuntimeException)
383 {
384     ::vos::OGuard aGuard( Application::GetSolarMutex() );
385     ::Point aPos( rPos.X, rPos.Y );
386     CommandEvent aCmdEvent( aPos, (sal_uInt16)nCommand, sal_True, NULL );
387 
388     Command( aCmdEvent );
389 }
390 
391 //--------------------------------------------------------------------
392 
393 void SAL_CALL SfxStatusBarControl::paint(
394     const uno::Reference< awt::XGraphics >& xGraphics,
395     const awt::Rectangle& rOutputRectangle,
396     ::sal_Int32 nStyle )
397 throw ( ::uno::RuntimeException )
398 {
399     ::vos::OGuard aGuard( Application::GetSolarMutex() );
400 
401     OutputDevice* pOutDev = VCLUnoHelper::GetOutputDevice( xGraphics );
402     if ( pOutDev )
403     {
404         ::Rectangle aRect = VCLRectangle( rOutputRectangle );
405         UserDrawEvent aUserDrawEvent( pOutDev, aRect, pBar->GetCurItemId(), (sal_uInt16)nStyle );
406         Paint( aUserDrawEvent );
407     }
408 }
409 
410 //--------------------------------------------------------------------
411 
412 void SAL_CALL SfxStatusBarControl::click( const awt::Point& )
413 throw ( uno::RuntimeException )
414 {
415     ::vos::OGuard aGuard( Application::GetSolarMutex() );
416     Click();
417 }
418 
419 //--------------------------------------------------------------------
420 
421 void SAL_CALL SfxStatusBarControl::doubleClick( const awt::Point& )
422 throw ( uno::RuntimeException )
423 {
424     ::vos::OGuard aGuard( Application::GetSolarMutex() );
425     DoubleClick();
426 }
427 
428 //--------------------------------------------------------------------
429 // old sfx2 interface
430 //--------------------------------------------------------------------
431 
432 void SfxStatusBarControl::StateChanged
433 (
434     sal_uInt16              nSID,
435     SfxItemState        eState,
436     const SfxPoolItem*  pState  /* Zeiger auf ein SfxPoolItem, welches nur
437                                    innerhalb dieses Methodenaufrufs gültig
438                                    ist. Es kann ein 0-Pointer, ein Pointer
439                                    auf ein SfxVoidItem oder auf den Typ, für
440                                    den die Subclass von SfxStatusBarControl
441                                    registriert ist vorkommen. */
442 )
443 
444 /*  [Beschreibung]
445 
446     Die Basisimplementation versteht Items vom Type SfxStringItem, bei
447     denen der Text in das Status-Zeilen-Feld eingetragen wird und
448     SfxVoidItem, bei denen das Feld geleert wird. Die Basisimplementierung
449     sollte in überladenen Methoden nicht gerufen werden.
450 */
451 
452 {
453     DBG_MEMTEST();
454     DBG_ASSERT( pBar != 0, "setting state to dangling StatusBar" );
455 
456     const SfxStringItem* pStr = PTR_CAST( SfxStringItem, pState );
457     if ( eState == SFX_ITEM_AVAILABLE && pStr )
458         pBar->SetItemText( nSID, pStr->GetValue() );
459     else
460     {
461         DBG_ASSERT( eState != SFX_ITEM_AVAILABLE || pState->ISA(SfxVoidItem),
462                     "wrong SfxPoolItem subclass in SfxStatusBarControl" );
463         pBar->SetItemText( nSID, String() );
464     }
465 }
466 
467 //--------------------------------------------------------------------
468 
469 sal_Bool SfxStatusBarControl::MouseButtonDown( const MouseEvent & )
470 
471 /*  [Beschreibung]
472 
473     Diese virtuelle Methode ist eine Weiterleitung des Events
474     MouseButtonDown() der StatusBar, falls die Maus-Position innerhalb
475     des Bereichs des betreffenden Items ist, oder die Maus von diesem
476     Control mit <SfxStatusBarControl::CaptureMouse()> gecaptured wurde.
477 
478     Die Defaultimplementierung ist leer und gibt FALSE zurück.
479 
480     [Rückgabewert]
481 
482     sal_Bool                TRUE
483                         das Event wurde bearbeitet und soll nicht an
484                         die StatusBar weitergeleitet werden
485 
486                         FALSE
487                         das Event wurde nicht bearbeitet und soll an
488                         die StatusBar weitergeleitet werden
489 */
490 
491 {
492     return sal_False;
493 }
494 
495 //--------------------------------------------------------------------
496 
497 sal_Bool SfxStatusBarControl::MouseMove( const MouseEvent & )
498 
499 /*  [Beschreibung]
500 
501     Diese virtuelle Methode ist eine Weiterleitung des Events
502     MouseMove() der StatusBar, falls die Maus-Position innerhalb
503     des Bereichs des betreffenden Items ist, oder die Maus von diesem
504     Control mit <SfxStatusBarControl::CaptureMouse()> gecaptured wurde.
505 
506     Die Defaultimplementierung ist leer und gibt FALSE zurück.
507 
508     [Rückgabewert]
509 
510     sal_Bool                TRUE
511                         das Event wurde bearbeitet und soll nicht an
512                         die StatusBar weitergeleitet werden
513 
514                         FALSE
515                         das Event wurde nicht bearbeitet und soll an
516                         die StatusBar weitergeleitet werden
517 */
518 
519 {
520     return sal_False;
521 }
522 
523 //--------------------------------------------------------------------
524 
525 sal_Bool SfxStatusBarControl::MouseButtonUp( const MouseEvent & )
526 
527 /*  [Beschreibung]
528 
529     Diese virtuelle Methode ist eine Weiterleitung des Events
530     MouseButtonUp() der StatusBar, falls die Maus-Position innerhalb
531     des Bereichs des betreffenden Items ist, oder die Maus von diesem
532     Control mit <SfxStatusBarControl::CaptureMouse()> gecaptured wurde.
533 
534     Die Defaultimplementierung ist leer und gibt FALSE zurück.
535 
536     [Rückgabewert]
537 
538     sal_Bool                TRUE
539                         das Event wurde bearbeitet und soll nicht an
540                         die StatusBar weitergeleitet werden
541 
542                         FALSE
543                         das Event wurde nicht bearbeitet und soll an
544                         die StatusBar weitergeleitet werden
545 */
546 
547 {
548     return sal_False;
549 }
550 
551 //--------------------------------------------------------------------
552 
553 void SfxStatusBarControl::Command( const CommandEvent& )
554 
555 /*  [Beschreibung]
556 
557     Diese virtuelle Methode wird gerufen, wenn für dieses SfxStatusBarControl
558     ein CommandEvent für erkannt wurde.
559 
560     Die Defaultimplementierung ist leer.
561 */
562 
563 {
564 }
565 
566 //--------------------------------------------------------------------
567 
568 void SfxStatusBarControl::Click()
569 
570 /*  [Beschreibung]
571 
572     Diese virtuelle Methode wird gerufen, wenn der Anwender mit der Maus
573     in das zu diesem Control gehörige Feld der Statuszeile klickt.
574 
575     Die Defaultimplementierung ist leer.
576 */
577 
578 {
579 }
580 
581 //--------------------------------------------------------------------
582 
583 void SfxStatusBarControl::DoubleClick()
584 
585 /*  [Beschreibung]
586 
587     Diese virtuelle Methode wird gerufen, wenn der Anwender mit der Maus
588     in das zu diesem Control gehörige Feld der Statuszeile doppel-klickt.
589 */
590 
591 {
592     ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aArgs;
593     execute( aArgs );
594 }
595 
596 //--------------------------------------------------------------------
597 
598 void SfxStatusBarControl::Paint
599 (
600     const UserDrawEvent& /* Referenz auf einen UserDrawEvent */
601 )
602 
603 /*  [Beschreibung]
604 
605     Diese virtuelle Methode wird gerufen, falls das betreffende Feld
606     mit SIB_USERDRAW gekennzeichnet ist, um den Inhalt zu zeichnen.
607     Die Ausgabe mu"s auf dem in durch rUDEvt.GetDevice() erhältlichen
608     OutputDevice innerhalb des durch rUDEvt.GetRect() angegebenen
609     Rechtecks erfolgen.
610 
611     Die Defaultimplementierung ist leer.
612 */
613 
614 {
615 }
616 
617 //--------------------------------------------------------------------
618 
619 void SfxStatusBarControl::CaptureMouse()
620 {
621 }
622 
623 //--------------------------------------------------------------------
624 
625 void SfxStatusBarControl::ReleaseMouse()
626 {
627 }
628 
629 //--------------------------------------------------------------------
630 
631 SfxStatusBarControl* SfxStatusBarControl::CreateControl
632 (
633     sal_uInt16     nSlotID,
634     sal_uInt16     nStbId,
635     StatusBar* pBar,
636     SfxModule* pMod
637 )
638 {
639     ::vos::OGuard aGuard( Application::GetSolarMutex() );
640     SfxApplication *pApp = SFX_APP();
641 
642     SfxSlotPool *pSlotPool;
643     if ( pMod )
644         pSlotPool = pMod->GetSlotPool();
645     else
646         pSlotPool = &SfxSlotPool::GetSlotPool();
647 
648     TypeId aSlotType = pSlotPool->GetSlotType(nSlotID);
649     if ( aSlotType )
650     {
651         if ( pMod )
652         {
653             SfxStbCtrlFactArr_Impl *pFactories = pMod->GetStbCtrlFactories_Impl();
654             if ( pFactories )
655             {
656                 SfxStbCtrlFactArr_Impl &rFactories = *pFactories;
657                 for ( sal_uInt16 nFactory = 0; nFactory < rFactories.Count(); ++nFactory )
658                 if ( rFactories[nFactory]->nTypeId == aSlotType &&
659                      ( ( rFactories[nFactory]->nSlotId == 0 ) ||
660                      ( rFactories[nFactory]->nSlotId == nSlotID) ) )
661                     return rFactories[nFactory]->pCtor( nSlotID, nStbId, *pBar );
662             }
663         }
664 
665         SfxStbCtrlFactArr_Impl &rFactories = pApp->GetStbCtrlFactories_Impl();
666         for ( sal_uInt16 nFactory = 0; nFactory < rFactories.Count(); ++nFactory )
667         if ( rFactories[nFactory]->nTypeId == aSlotType &&
668              ( ( rFactories[nFactory]->nSlotId == 0 ) ||
669              ( rFactories[nFactory]->nSlotId == nSlotID) ) )
670             return rFactories[nFactory]->pCtor( nSlotID, nStbId, *pBar );
671     }
672 
673     return NULL;
674 }
675 
676 //--------------------------------------------------------------------
677 void SfxStatusBarControl::RegisterStatusBarControl(SfxModule* pMod, SfxStbCtrlFactory* pFact)
678 {
679     SFX_APP()->RegisterStatusBarControl_Impl( pMod, pFact );
680 }
681 
682 /* vim: set noet sw=4 ts=4: */
683