1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: stbitem.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sfx2.hxx"
33 #include <svtools/stritem.hxx>
36 #include <com/sun/star/util/URL.hpp>
37 #include <com/sun/star/util/XURLTransformer.hpp>
38 #include <com/sun/star/frame/XController.hpp>
39 #include <com/sun/star/lang/XUnoTunnel.hpp>
40 #include <com/sun/star/frame/status/ItemStatus.hpp>
41 #include <com/sun/star/frame/status/ItemState.hpp>
42 #include <com/sun/star/awt/MouseButton.hpp>
44 #include <vcl/status.hxx>
46 #include <sfx2/app.hxx>
47 #include "stbitem.hxx"
48 #include "sfxtypes.hxx"
49 #include <sfx2/msg.hxx>
50 #include "arrdecl.hxx"
51 #include <sfx2/bindings.hxx>
52 #include <sfx2/msgpool.hxx>
53 #include <sfx2/module.hxx>
54 #include <sfx2/dispatch.hxx>
55 #include <sfx2/unoctitm.hxx>
56 #include <sfx2/objsh.hxx>
57 #include <sfx2/sfx.hrc>
59 #include <comphelper/processfactory.hxx>
60 #include <svtools/eitem.hxx>
61 #include <svtools/stritem.hxx>
62 #include <svtools/intitem.hxx>
63 #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
64 #include <toolkit/unohlp.hxx>
66 #include <toolkit/helper/convert.hxx>
68 using namespace ::com::sun::star
;
70 //--------------------------------------------------------------------
72 USHORT
SfxStatusBarControl::convertAwtToVCLMouseButtons( sal_Int16 nAwtMouseButtons
)
74 USHORT
nVCLMouseButtons( 0 );
76 if ( nAwtMouseButtons
& awt::MouseButton::LEFT
)
77 nVCLMouseButtons
|= MOUSE_LEFT
;
78 if ( nAwtMouseButtons
& awt::MouseButton::RIGHT
)
79 nVCLMouseButtons
|= MOUSE_RIGHT
;
80 if ( nAwtMouseButtons
& awt::MouseButton::MIDDLE
)
81 nVCLMouseButtons
|= MOUSE_MIDDLE
;
83 return nVCLMouseButtons
;
86 //--------------------------------------------------------------------
88 svt::StatusbarController
* SAL_CALL
SfxStatusBarControllerFactory(
89 const uno::Reference
< frame::XFrame
>& rFrame
,
90 StatusBar
* pStatusBar
,
92 const ::rtl::OUString
& aCommandURL
)
94 ::vos::OGuard
aGuard( Application::GetSolarMutex() );
97 aTargetURL
.Complete
= aCommandURL
;
98 uno::Reference
< util::XURLTransformer
> xTrans( ::comphelper::getProcessServiceFactory()->createInstance(
99 rtl::OUString::createFromAscii( "com.sun.star.util.URLTransformer" )), uno::UNO_QUERY
);
100 xTrans
->parseStrict( aTargetURL
);
102 SfxObjectShell
* pObjShell
= NULL
;
103 uno::Reference
< frame::XController
> xController
;
104 uno::Reference
< frame::XModel
> xModel
;
107 xController
= rFrame
->getController();
108 if ( xController
.is() )
109 xModel
= xController
->getModel();
114 // Get tunnel from model to retrieve the SfxObjectShell pointer from it
115 ::com::sun::star::uno::Reference
< ::com::sun::star::lang::XUnoTunnel
> xObj( xModel
, uno::UNO_QUERY
);
116 ::com::sun::star::uno::Sequence
< sal_Int8
> aSeq
= SvGlobalName( SFX_GLOBAL_CLASSID
).GetByteSequence();
119 sal_Int64 nHandle
= xObj
->getSomething( aSeq
);
121 pObjShell
= reinterpret_cast< SfxObjectShell
* >( sal::static_int_cast
< sal_IntPtr
>( nHandle
));
125 SfxModule
* pModule
= pObjShell
? pObjShell
->GetModule() : NULL
;
126 SfxSlotPool
* pSlotPool
= 0;
129 pSlotPool
= pModule
->GetSlotPool();
131 pSlotPool
= &(SfxSlotPool::GetSlotPool( NULL
));
133 const SfxSlot
* pSlot
= pSlotPool
->GetUnoSlot( aTargetURL
.Path
);
136 USHORT nSlotId
= pSlot
->GetSlotId();
138 return SfxStatusBarControl::CreateControl( nSlotId
, nID
, pStatusBar
, pModule
);
144 //--------------------------------------------------------------------
146 SfxStatusBarControl::SfxStatusBarControl
148 USHORT nSlotID
, /* Slot-Id, mit der diese Instanz
149 verbunden wird. Wurde bei der
150 Registrierung eine Slot-Id != 0
151 angegeben, ist dies immer die dort
153 USHORT nCtrlID
, /* ID of this controller in the status bar */
155 StatusBar
& rBar
/* Referenz auf die StatusBar, f"ur die
156 dieses Control erzeugt wurde. */
161 Konstruktor der Klasse SfxStatusBarControl. Die Subclasses werden
162 bei Bedarf per Factory vom SFx erzeugt.
164 Instanzen dieser Basisklasse werden f"ur alle StatusBar-Felder
165 erzeugt, f"ur die keine speziellen registriert wurden.
168 : svt::StatusbarController(),
175 //--------------------------------------------------------------------
177 SfxStatusBarControl::~SfxStatusBarControl()
181 Destruktor der Klasse SfxStatusBarControl. Die Instanzen dieser
182 Klasse und deren Subklassen werden vom SFx zerst"ort.
187 //--------------------------------------------------------------------
189 uno::Any SAL_CALL
SfxStatusBarControl::queryInterface( const uno::Type
& rType
)
190 throw( uno::RuntimeException
)
192 return svt::StatusbarController::queryInterface( rType
);
195 void SAL_CALL
SfxStatusBarControl::acquire() throw()
197 OWeakObject::acquire();
200 void SAL_CALL
SfxStatusBarControl::release() throw()
202 OWeakObject::release();
205 //--------------------------------------------------------------------
207 void SAL_CALL
SfxStatusBarControl::disposing( const lang::EventObject
& aEvent
)
208 throw( uno::RuntimeException
)
210 svt::StatusbarController::disposing( aEvent
);
213 //--------------------------------------------------------------------
215 void SAL_CALL
SfxStatusBarControl::dispose()
216 throw (uno::RuntimeException
)
218 svt::StatusbarController::dispose();
221 //--------------------------------------------------------------------
223 void SAL_CALL
SfxStatusBarControl::statusChanged( const frame::FeatureStateEvent
& rEvent
)
224 throw ( ::com::sun::star::uno::RuntimeException
)
226 SfxViewFrame
* pViewFrame
= NULL
;
227 uno::Reference
< frame::XController
> xController
;
229 ::vos::OGuard
aGuard( Application::GetSolarMutex() );
231 xController
= m_xFrame
->getController();
233 uno::Reference
< frame::XDispatchProvider
> xProvider( xController
, uno::UNO_QUERY
);
234 if ( xProvider
.is() )
236 uno::Reference
< frame::XDispatch
> xDisp
= xProvider
->queryDispatch( rEvent
.FeatureURL
, ::rtl::OUString(), 0 );
239 uno::Reference
< lang::XUnoTunnel
> xTunnel( xDisp
, uno::UNO_QUERY
);
240 SfxOfficeDispatch
* pDisp
= NULL
;
243 sal_Int64 nImplementation
= xTunnel
->getSomething(SfxOfficeDispatch::impl_getStaticIdentifier());
244 pDisp
= reinterpret_cast< SfxOfficeDispatch
* >(sal::static_int_cast
< sal_IntPtr
>( nImplementation
));
248 pViewFrame
= pDisp
->GetDispatcher_Impl()->GetFrame();
253 SfxSlotPool
& rPool
= SfxSlotPool::GetSlotPool( pViewFrame
);
254 const SfxSlot
* pSlot
= rPool
.GetUnoSlot( rEvent
.FeatureURL
.Path
);
256 nSlotID
= pSlot
->GetSlotId();
260 if ( rEvent
.Requery
)
261 svt::StatusbarController::statusChanged( rEvent
);
264 SfxItemState eState
= SFX_ITEM_DISABLED
;
265 SfxPoolItem
* pItem
= NULL
;
266 if ( rEvent
.IsEnabled
)
268 eState
= SFX_ITEM_AVAILABLE
;
269 uno::Type pType
= rEvent
.State
.getValueType();
271 if ( pType
== ::getVoidCppuType() )
273 pItem
= new SfxVoidItem( nSlotID
);
274 eState
= SFX_ITEM_UNKNOWN
;
276 else if ( pType
== ::getBooleanCppuType() )
279 rEvent
.State
>>= bTemp
;
280 pItem
= new SfxBoolItem( nSlotID
, bTemp
);
282 else if ( pType
== ::getCppuType((const sal_uInt16
*)0) )
284 sal_uInt16 nTemp
= 0;
285 rEvent
.State
>>= nTemp
;
286 pItem
= new SfxUInt16Item( nSlotID
, nTemp
);
288 else if ( pType
== ::getCppuType((const sal_uInt32
*)0) )
290 sal_uInt32 nTemp
= 0;
291 rEvent
.State
>>= nTemp
;
292 pItem
= new SfxUInt32Item( nSlotID
, nTemp
);
294 else if ( pType
== ::getCppuType((const ::rtl::OUString
*)0) )
296 ::rtl::OUString sTemp
;
297 rEvent
.State
>>= sTemp
;
298 pItem
= new SfxStringItem( nSlotID
, sTemp
);
300 else if ( pType
== ::getCppuType((const ::com::sun::star::frame::status::ItemStatus
*)0) )
302 frame::status::ItemStatus aItemStatus
;
303 rEvent
.State
>>= aItemStatus
;
304 eState
= aItemStatus
.State
;
305 pItem
= new SfxVoidItem( nSlotID
);
310 pItem
= pSlot
->GetType()->CreateItem();
313 pItem
->SetWhich( nSlotID
);
314 pItem
->PutValue( rEvent
.State
);
317 pItem
= new SfxVoidItem( nSlotID
);
321 StateChanged( nSlotID
, eState
, pItem
);
327 //--------------------------------------------------------------------
328 // XStatusbarController
330 ::sal_Bool SAL_CALL
SfxStatusBarControl::mouseButtonDown(
331 const awt::MouseEvent
& rMouseEvent
)
332 throw ( uno::RuntimeException
)
334 ::vos::OGuard
aGuard( Application::GetSolarMutex() );
335 ::Point
aPos( rMouseEvent
.X
, rMouseEvent
.Y
);
337 ::MouseEvent
aMouseEvent( aPos
,
338 (USHORT
)rMouseEvent
.ClickCount
,
340 convertAwtToVCLMouseButtons( rMouseEvent
.Buttons
),
343 return MouseButtonDown( aMouseEvent
);
346 //--------------------------------------------------------------------
348 ::sal_Bool SAL_CALL
SfxStatusBarControl::mouseMove(
349 const awt::MouseEvent
& rMouseEvent
)
350 throw (uno::RuntimeException
)
352 ::vos::OGuard
aGuard( Application::GetSolarMutex() );
353 ::Point
aPos( rMouseEvent
.X
, rMouseEvent
.Y
);
355 ::MouseEvent
aMouseEvent( aPos
,
356 (USHORT
)rMouseEvent
.ClickCount
,
358 convertAwtToVCLMouseButtons( rMouseEvent
.Buttons
),
360 return MouseMove( aMouseEvent
);
363 //--------------------------------------------------------------------
365 ::sal_Bool SAL_CALL
SfxStatusBarControl::mouseButtonUp(
366 const ::awt::MouseEvent
& rMouseEvent
)
367 throw ( uno::RuntimeException
)
369 ::vos::OGuard
aGuard( Application::GetSolarMutex() );
370 ::Point
aPos( rMouseEvent
.X
, rMouseEvent
.Y
);
372 ::MouseEvent
aMouseEvent( aPos
,
373 (USHORT
)rMouseEvent
.ClickCount
,
375 convertAwtToVCLMouseButtons( rMouseEvent
.Buttons
),
377 return MouseButtonUp( aMouseEvent
);
380 //--------------------------------------------------------------------
382 void SAL_CALL
SfxStatusBarControl::command(
383 const awt::Point
& rPos
,
384 ::sal_Int32 nCommand
,
385 ::sal_Bool
/*bMouseEvent*/,
386 const ::com::sun::star::uno::Any
& /*aData*/ )
387 throw (::com::sun::star::uno::RuntimeException
)
389 ::vos::OGuard
aGuard( Application::GetSolarMutex() );
390 ::Point
aPos( rPos
.X
, rPos
.Y
);
391 CommandEvent
aCmdEvent( aPos
, (USHORT
)nCommand
, TRUE
, NULL
);
393 Command( aCmdEvent
);
396 //--------------------------------------------------------------------
398 void SAL_CALL
SfxStatusBarControl::paint(
399 const uno::Reference
< awt::XGraphics
>& xGraphics
,
400 const awt::Rectangle
& rOutputRectangle
,
403 throw ( ::uno::RuntimeException
)
405 ::vos::OGuard
aGuard( Application::GetSolarMutex() );
407 OutputDevice
* pOutDev
= VCLUnoHelper::GetOutputDevice( xGraphics
);;
410 ::Rectangle aRect
= VCLRectangle( rOutputRectangle
);
411 UserDrawEvent
aUserDrawEvent( pOutDev
, aRect
, (USHORT
)nItemId
, (USHORT
)nStyle
);
412 Paint( aUserDrawEvent
);
416 //--------------------------------------------------------------------
418 void SAL_CALL
SfxStatusBarControl::click()
419 throw ( uno::RuntimeException
)
421 ::vos::OGuard
aGuard( Application::GetSolarMutex() );
425 //--------------------------------------------------------------------
427 void SAL_CALL
SfxStatusBarControl::doubleClick()
428 throw ( uno::RuntimeException
)
430 ::vos::OGuard
aGuard( Application::GetSolarMutex() );
434 //--------------------------------------------------------------------
435 // old sfx2 interface
436 //--------------------------------------------------------------------
438 void SfxStatusBarControl::StateChanged
442 const SfxPoolItem
* pState
/* Zeiger auf ein SfxPoolItem, welches nur
443 innerhalb dieses Methodenaufrufs g"ultig
444 ist. Es kann ein 0-Pointer, ein Pointer
445 auf ein SfxVoidItem oder auf den Typ, f"ur
446 den die Subclass von SfxStatusBarControl
447 registriert ist vorkommen. */
452 Die Basisimplementation versteht Items vom Type SfxStringItem, bei
453 denen der Text in das Status-Zeilen-Feld eingetragen wird und
454 SfxVoidItem, bei denen das Feld geleert wird. Die Basisimplementierng
455 sollte in "uberladenen Methoden nicht gerufen werden.
460 DBG_ASSERT( pBar
!= 0, "setting state to dangling StatusBar" );
462 const SfxStringItem
* pStr
= PTR_CAST( SfxStringItem
, pState
);
463 if ( eState
== SFX_ITEM_AVAILABLE
&& pStr
)
464 pBar
->SetItemText( nSID
, pStr
->GetValue() );
467 DBG_ASSERT( eState
!= SFX_ITEM_AVAILABLE
|| pState
->ISA(SfxVoidItem
),
468 "wrong SfxPoolItem subclass in SfxStatusBarControl" );
469 pBar
->SetItemText( nSID
, String() );
473 //--------------------------------------------------------------------
475 BOOL
SfxStatusBarControl::MouseButtonDown( const MouseEvent
& )
479 Diese virtuelle Methode ist eine Weiterleitung des Events
480 MouseButtonDown() der StatusBar, falls die Maus-Position innerhalb
481 des Bereichs des betreffenden Items ist, oder die Maus von diesem
482 Control mit <SfxStatusBarControl::CaptureMouse()> gecaptured wurde.
484 Die Defaultimplementierung ist leer und gibt FALSE zur"uck.
490 das Event wurde bearbeitet und soll nicht an
491 die StatusBar weitergeleitet werden
494 das Event wurde nicht bearbeitet und soll an
495 die StatusBar weitergeleitet werden
502 //--------------------------------------------------------------------
504 BOOL
SfxStatusBarControl::MouseMove( const MouseEvent
& )
508 Diese virtuelle Methode ist eine Weiterleitung des Events
509 MouseMove() der StatusBar, falls die Maus-Position innerhalb
510 des Bereichs des betreffenden Items ist, oder die Maus von diesem
511 Control mit <SfxStatusBarControl::CaptureMouse()> gecaptured wurde.
513 Die Defaultimplementierung ist leer und gibt FALSE zur"uck.
519 das Event wurde bearbeitet und soll nicht an
520 die StatusBar weitergeleitet werden
523 das Event wurde nicht bearbeitet und soll an
524 die StatusBar weitergeleitet werden
531 //--------------------------------------------------------------------
533 BOOL
SfxStatusBarControl::MouseButtonUp( const MouseEvent
& )
537 Diese virtuelle Methode ist eine Weiterleitung des Events
538 MouseButtonUp() der StatusBar, falls die Maus-Position innerhalb
539 des Bereichs des betreffenden Items ist, oder die Maus von diesem
540 Control mit <SfxStatusBarControl::CaptureMouse()> gecaptured wurde.
542 Die Defaultimplementierung ist leer und gibt FALSE zur"uck.
548 das Event wurde bearbeitet und soll nicht an
549 die StatusBar weitergeleitet werden
552 das Event wurde nicht bearbeitet und soll an
553 die StatusBar weitergeleitet werden
560 //--------------------------------------------------------------------
562 void SfxStatusBarControl::Command( const CommandEvent
& )
566 Diese virtuelle Methode wird gerufen, wenn f"ur dieses SfxStatusBarControl
567 ein CommandEvent f"ur erkannt wurde.
569 Die Defaultimplementierung ist leer.
575 //--------------------------------------------------------------------
577 void SfxStatusBarControl::Click()
581 Diese virtuelle Methode wird gerufen, wenn der Anwender mit der Maus
582 in das zu diesem Control geh"orige Feld der Statuszeile klickt.
584 Die Defaultimplementierung ist leer.
590 //--------------------------------------------------------------------
592 void SfxStatusBarControl::DoubleClick()
596 Diese virtuelle Methode wird gerufen, wenn der Anwender mit der Maus
597 in das zu diesem Control geh"orige Feld der Statuszeile doppel-klickt.
601 ::com::sun::star::uno::Sequence
< ::com::sun::star::beans::PropertyValue
> aArgs
;
605 //--------------------------------------------------------------------
607 void SfxStatusBarControl::Paint
609 const UserDrawEvent
& /* Referenz auf einen UserDrawEvent */
614 Diese virtuelle Methode wird gerufen, falls das betreffende Feld
615 mit SIB_USERDRAW gekennzeichnet ist, um den Inhalt zu zeichnen.
616 Die Ausgabe mu"s auf dem in durch rUDEvt.GetDevice() erh"altlichen
617 OutputDevice innerhalb des durch rUDEvt.GetRect() angegebenenen
620 Die Defaultimplementierung ist leer.
626 //--------------------------------------------------------------------
628 void SfxStatusBarControl::CaptureMouse()
632 //--------------------------------------------------------------------
634 void SfxStatusBarControl::ReleaseMouse()
638 //--------------------------------------------------------------------
640 SfxStatusBarControl
* SfxStatusBarControl::CreateControl
648 ::vos::OGuard
aGuard( Application::GetSolarMutex() );
649 SfxApplication
*pApp
= SFX_APP();
651 SfxSlotPool
*pSlotPool
;
653 pSlotPool
= pMod
->GetSlotPool();
655 pSlotPool
= &SfxSlotPool::GetSlotPool();
657 TypeId aSlotType
= pSlotPool
->GetSlotType(nSlotID
);
662 SfxStbCtrlFactArr_Impl
*pFactories
= pMod
->GetStbCtrlFactories_Impl();
665 SfxStbCtrlFactArr_Impl
&rFactories
= *pFactories
;
666 for ( USHORT 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
);
674 SfxStbCtrlFactArr_Impl
&rFactories
= pApp
->GetStbCtrlFactories_Impl();
675 for ( USHORT nFactory
= 0; nFactory
< rFactories
.Count(); ++nFactory
)
676 if ( rFactories
[nFactory
]->nTypeId
== aSlotType
&&
677 ( ( rFactories
[nFactory
]->nSlotId
== 0 ) ||
678 ( rFactories
[nFactory
]->nSlotId
== nSlotID
) ) )
679 return rFactories
[nFactory
]->pCtor( nSlotID
, nStbId
, *pBar
);
685 //--------------------------------------------------------------------
686 void SfxStatusBarControl::RegisterStatusBarControl(SfxModule
* pMod
, SfxStbCtrlFactory
* pFact
)
688 SFX_APP()->RegisterStatusBarControl_Impl( pMod
, pFact
);
690 //--------------------------------------------------------------------