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