blob: 50b3fe0455b8f09e4af4138c9078754822f32733 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _SFXTBXCTRL_HXX
#define _SFXTBXCTRL_HXX
#include "sal/config.h"
#include "sfx2/dllapi.h"
#include "sal/types.h"
#include <vcl/timer.hxx>
#ifndef _MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif
#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _FLOATWIN_HXX //autogen
#include <vcl/floatwin.hxx>
#endif
#include <sfx2/ctrlitem.hxx>
#include <sfx2/sfxstatuslistener.hxx>
#include <svtools/toolboxcontroller.hxx>
#include <svtools/framestatuslistener.hxx>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/frame/XDispatchProvider.hpp>
#include <com/sun/star/frame/XFrame.hpp>
#include <com/sun/star/awt/XDockableWindowListener.hpp>
#include <com/sun/star/awt/XDockableWindow.hpp>
#include <com/sun/star/frame/XSubToolbarController.hpp>
//------------------------------------------------------------------
class SfxUnoToolBoxControl;
class SfxToolBoxControl;
class SfxBindings;
class SfxModule;
class SfxUnoControllerItem;
svt::ToolboxController* SAL_CALL SfxToolBoxControllerFactory( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, ToolBox* pToolbox, unsigned short nID, const ::rtl::OUString& aCommandURL );
//typedef SfxToolBoxControl* (*SfxToolBoxControlCtor)( sal_uInt16 nId, ToolBox &rTbx, SfxBindings & );
typedef SfxToolBoxControl* (*SfxToolBoxControlCtor)( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rBox );
struct SfxTbxCtrlFactory
{
SfxToolBoxControlCtor pCtor;
TypeId nTypeId;
sal_uInt16 nSlotId;
SfxTbxCtrlFactory( SfxToolBoxControlCtor pTheCtor,
TypeId nTheTypeId, sal_uInt16 nTheSlotId ):
pCtor(pTheCtor),
nTypeId(nTheTypeId),
nSlotId(nTheSlotId)
{}
};
//------------------------------------------------------------------
enum SfxPopupWindowType
{
SFX_POPUPWINDOW_NONE,
SFX_POPUPWINDOW_ONCLICK,
SFX_POPUPWINDOW_ONTIMEOUT,
SFX_POPUPWINDOW_ONCLICKANDMOVE,
SFX_POPUPWINDOW_ONTIMEOUTANDMOVE,
SFX_POPUPWINDOW_CONTEXTMENU
};
//------------------------------------------------------------------
class SfxFrameStatusListener : public svt::FrameStatusListener
{
public:
SfxFrameStatusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rServiceManager,
const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& xFrame,
SfxStatusListenerInterface* pCallee );
virtual ~SfxFrameStatusListener();
// XStatusListener
virtual void SAL_CALL statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event )
throw ( ::com::sun::star::uno::RuntimeException );
private:
SfxStatusListenerInterface* m_pCallee;
};
//------------------------------------------------------------------
/* FloatingWindows, die aus ToolBoxen abgerissen werden k"onnen, sollten
dieser Klasse abgeleitet werden. Da sie ebenfalls von SfxControllerItem
abgeleitet ist, erhalten ihre Instanzen auch die StateChanged Aufrufe.
*/
class SFX2_DLLPUBLIC SfxPopupWindow: public FloatingWindow, public SfxStatusListenerInterface
{
friend class SfxToolBox_Impl;
sal_Bool m_bFloating;
sal_uIntPtr m_nEventId;
sal_Bool m_bCascading;
Link m_aDeleteLink;
sal_uInt16 m_nId;
::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > m_xFrame;
SfxFrameStatusListener* m_pStatusListener;
::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > m_xStatusListener;
::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xServiceManager;
private:
SfxFrameStatusListener* GetOrCreateStatusListener();
SAL_DLLPRIVATE SfxPopupWindow(SfxPopupWindow &); // not defined
SAL_DLLPRIVATE void operator =(SfxPopupWindow &); // not defined
//#if 0 // _SOLAR__PRIVATE
DECL_DLLPRIVATE_LINK( Delete, void * );
//#endif
protected:
virtual void PopupModeEnd();
virtual sal_Bool Close();
virtual void DeleteFloatingWindow();
sal_uInt16 GetId() const { return m_nId; }
const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& GetFrame() const { return m_xFrame; }
const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& GetServiceManager() const { return m_xServiceManager; }
void BindListener();
void UnbindListener();
void AddStatusListener( const rtl::OUString& rCommandURL );
void RemoveStatusListener( const rtl::OUString& rCommandURL );
void UpdateStatus( const rtl::OUString& rCommandURL );
// SfxStatusListenerInterface
using FloatingWindow::StateChanged;
virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState,
const SfxPoolItem* pState );
public:
SfxPopupWindow( sal_uInt16 nId,
const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame,
WinBits nBits );
SfxPopupWindow( sal_uInt16 nId,
const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame,
const ResId &rId );
SfxPopupWindow( sal_uInt16 nId,
const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame,
Window* pParentWindow,
const ResId &rId );
SfxPopupWindow( sal_uInt16 nId,
const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame,
Window* pParentWindow,
WinBits nBits );
~SfxPopupWindow();
virtual SfxPopupWindow* Clone() const;
virtual void MouseMove( const MouseEvent& rMEvt );
void StartCascading();
void EndCascading();
SAL_DLLPRIVATE void SetDeleteLink_Impl( const Link& rLink )
{
m_aDeleteLink = rLink;
}
};
//------------------------------------------------------------------
//------------------------------------------------------------------
#define SFX_DECL_TOOLBOX_CONTROL() \
static SfxToolBoxControl* CreateImpl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx ); \
static void RegisterControl(sal_uInt16 nSlotId = 0, SfxModule *pMod=NULL)
/* F"ur spezielle ToolBox-Controls, z.B. eine Font-Auswahl-Box oder
aus ToolBoxen abrei"sbare FloatingWindows mu"s passend zur Item-Subclass
eine Subclass von SfxTooBoxControl implementiert werden.
Diese Klasse mu"s in SfxApplication::Init() mit der statischen Methode
RegisterControl() registriert werden. Der SFx erzeugt dann automatisch
diese Controls in ToolBoxen, wenn die dazugeh"origen Slots von dem
angegebenen Typ sind.
*/
struct SfxToolBoxControl_Impl;
class SFX2_DLLPUBLIC SfxToolBoxControl:
public ::com::sun::star::awt::XDockableWindowListener,
public ::com::sun::star::frame::XSubToolbarController,
public svt::ToolboxController
{
friend class SfxToolbox;
friend class SfxToolBox_Impl;
friend class SfxToolboxCustomizer;
friend class SfxPopupWindow;
friend struct SfxTbxCtrlFactory;
SfxToolBoxControl_Impl* pImpl;
protected:
DECL_LINK( PopupModeEndHdl, void * );
DECL_LINK( ClosePopupWindow, SfxPopupWindow * );
// old SfxToolBoxControl methods
virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState );
virtual void Select( sal_Bool bMod1 = sal_False );
virtual void Select( sal_uInt16 nModifier );
virtual void DoubleClick();
virtual void Click();
virtual SfxPopupWindowType GetPopupWindowType() const;
virtual SfxPopupWindow* CreatePopupWindow();
virtual SfxPopupWindow* CreatePopupWindowCascading();
virtual Window* CreateItemWindow( Window *pParent );
// Must be called by subclass to set a new popup window instance
void SetPopupWindow( SfxPopupWindow* pWindow );
// XInterface
virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL acquire() throw();
virtual void SAL_CALL release() throw();
// XEventListener
using ::cppu::OPropertySetHelper::disposing;
virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& aEvent ) throw( ::com::sun::star::uno::RuntimeException );
// XComponent
virtual void SAL_CALL dispose() throw (::com::sun::star::uno::RuntimeException);
// new controller API
// XStatusListener
virtual void SAL_CALL statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event )
throw ( ::com::sun::star::uno::RuntimeException );
// XToolbarController
virtual void SAL_CALL execute( sal_Int16 KeyModifier )
throw (::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL click()
throw (::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL doubleClick()
throw (::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > SAL_CALL createPopupWindow()
throw (::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > SAL_CALL createItemWindow( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& rParent )
throw (::com::sun::star::uno::RuntimeException);
// XSubToolbarController
virtual ::sal_Bool SAL_CALL opensSubToolbar( ) throw (::com::sun::star::uno::RuntimeException);
virtual ::rtl::OUString SAL_CALL getSubToolbarName( ) throw (::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL functionSelected( const ::rtl::OUString& aCommand ) throw (::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL updateImage( ) throw (::com::sun::star::uno::RuntimeException);
// XDockableWindowListener
virtual void SAL_CALL startDocking( const ::com::sun::star::awt::DockingEvent& e ) throw (::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::awt::DockingData SAL_CALL docking( const ::com::sun::star::awt::DockingEvent& e ) throw (::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL endDocking( const ::com::sun::star::awt::EndDockingEvent& e ) throw (::com::sun::star::uno::RuntimeException);
virtual sal_Bool SAL_CALL prepareToggleFloatingMode( const ::com::sun::star::lang::EventObject& e ) throw (::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL toggleFloatingMode( const ::com::sun::star::lang::EventObject& e ) throw (::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL closed( const ::com::sun::star::lang::EventObject& e ) throw (::com::sun::star::uno::RuntimeException);
virtual void SAL_CALL endPopupMode( const ::com::sun::star::awt::EndPopupModeEvent& e ) throw (::com::sun::star::uno::RuntimeException);
// helper methods
void createAndPositionSubToolBar( const ::rtl::OUString& rSubToolBarResName );
::Size getPersistentFloatingSize( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& xFrame, const ::rtl::OUString& rSubToolBarResName );
public:
SFX_DECL_TOOLBOX_CONTROL();
SfxToolBoxControl( sal_uInt16 nSlotID, sal_uInt16 nId, ToolBox& rBox, sal_Bool bShowStrings = sal_False );
virtual ~SfxToolBoxControl();
ToolBox& GetToolBox() const;
unsigned short GetId() const;
unsigned short GetSlotId() const;
void Dispatch( const ::rtl::OUString& aCommand,
::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aArgs );
static void Dispatch( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider >& rDispatchProvider,
const rtl::OUString& rCommand,
::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aArgs );
static SfxItemState GetItemState( const SfxPoolItem* pState );
static SfxToolBoxControl* CreateControl( sal_uInt16 nSlotId, sal_uInt16 nTbxId, ToolBox *pBox, SfxModule *pMod );
static void RegisterToolBoxControl( SfxModule*, SfxTbxCtrlFactory*);
};
#define SFX_IMPL_TOOLBOX_CONTROL(Class, nItemClass) \
SfxToolBoxControl* __EXPORT Class::CreateImpl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx ) \
{ return new Class( nSlotId, nId, rTbx ); } \
void Class::RegisterControl(sal_uInt16 nSlotId, SfxModule *pMod) \
{ SfxToolBoxControl::RegisterToolBoxControl( pMod, new SfxTbxCtrlFactory( \
Class::CreateImpl, TYPE(nItemClass), nSlotId ) ); }
#define SFX_IMPL_TOOLBOX_CONTROL_ARG(Class, nItemClass, Arg) \
SfxToolBoxControl* __EXPORT Class::CreateImpl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx ) \
{ return new Class( nSlotId, nId, rTbx, Arg); } \
void Class::RegisterControl(sal_uInt16 nSlotId, SfxModule *pMod) \
{ SfxToolBoxControl::RegisterToolBoxControl( pMod, new SfxTbxCtrlFactory( \
Class::CreateImpl, TYPE(nItemClass), nSlotId ) ); }
//=========================================================================
//#if 0 // _SOLAR__PRIVATE
class SfxDragButton_Impl : public FixedImage
{
public:
SfxDragButton_Impl( Window *pParent );
virtual void Command ( const CommandEvent& rCEvt );
virtual void MouseMove( const MouseEvent& rMEvt );
virtual void MouseButtonDown( const MouseEvent& rMEvt );
};
class SfxDragToolBoxControl_Impl : public SfxToolBoxControl
/* [Beschreibung]
*/
{
public:
SFX_DECL_TOOLBOX_CONTROL();
SfxDragToolBoxControl_Impl( sal_uInt16 nId, ToolBox& rBox );
virtual Window* CreateItemWindow( Window *pParent );
using SfxToolBoxControl::Select;
virtual void Select( sal_Bool bMod1 = sal_False );
};
//------------------------------------------------------------------------
class SfxHistoryToolBoxControl_Impl : public SfxToolBoxControl
{
Timer aTimer;
private:
DECL_LINK( Timeout, Timer * );
protected:
virtual void Click( );
using SfxToolBoxControl::Select;
virtual void Select( sal_Bool );
public:
SFX_DECL_TOOLBOX_CONTROL();
SfxHistoryToolBoxControl_Impl( sal_uInt16 nId, ToolBox& rBox );
};
class SfxReloadToolBoxControl_Impl : public SfxToolBoxControl
{
protected:
using SfxToolBoxControl::Select;
virtual void Select( sal_uInt16 nSelectModifier );
public:
SFX_DECL_TOOLBOX_CONTROL();
SfxReloadToolBoxControl_Impl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rBox );
};
class SfxPopupMenuManager;
class SfxAddonsToolBoxControl_Impl : public SfxToolBoxControl
/* [Description]
Internal helper class to provide the addons popup menu through the addons
toolbox button.
*/
{
sal_Bool bBigImages;
PopupMenu* pMenu;
sal_Bool m_bWasHiContrastMode;
sal_Bool m_bShowMenuImages;
protected:
virtual void Click();
using SfxToolBoxControl::Select;
virtual void Select( sal_Bool );
virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState );
DECL_LINK( Activate, Menu * ); // Needed to support high contrast images
public:
SFX_DECL_TOOLBOX_CONTROL();
SfxAddonsToolBoxControl_Impl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rBox );
~SfxAddonsToolBoxControl_Impl();
void RefreshMenuImages( Menu* pMenu );
};
//#endif
#endif