ade26b5c7b
Change-Id: I751832d8725354cebd892738fa80fd7bc5e43925
416 lines
18 KiB
C++
416 lines
18 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* 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 .
|
|
*/
|
|
#ifndef _SFXTBXCTRL_HXX
|
|
#define _SFXTBXCTRL_HXX
|
|
|
|
#include "sal/config.h"
|
|
#include "sfx2/dllapi.h"
|
|
#include "sal/types.h"
|
|
#include <vcl/timer.hxx>
|
|
#include <vcl/menu.hxx>
|
|
#include <vcl/fixed.hxx>
|
|
#include <vcl/floatwin.hxx>
|
|
#include <comphelper/processfactory.hxx>
|
|
#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 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 OUString& aCommandURL );
|
|
|
|
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::uno::XComponentContext >& rxContext,
|
|
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;
|
|
};
|
|
|
|
//------------------------------------------------------------------
|
|
|
|
/* Floating windows that can be torn from tool boxes should be derived from
|
|
this class. Since it is also derived from SfxControllerItem, its instances
|
|
will also receive the StateChanged calls.
|
|
*/
|
|
|
|
class SFX2_DLLPUBLIC SfxPopupWindow: public FloatingWindow, public SfxStatusListenerInterface
|
|
{
|
|
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;
|
|
|
|
private:
|
|
SfxFrameStatusListener* GetOrCreateStatusListener();
|
|
|
|
SAL_DLLPRIVATE SfxPopupWindow(SfxPopupWindow &); // not defined
|
|
SAL_DLLPRIVATE void operator =(SfxPopupWindow &); // not defined
|
|
void Delete();
|
|
|
|
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; }
|
|
|
|
void BindListener();
|
|
void UnbindListener();
|
|
void AddStatusListener( const 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,
|
|
WinBits nBits );
|
|
~SfxPopupWindow();
|
|
|
|
virtual SfxPopupWindow* Clone() const;
|
|
virtual void MouseMove( const MouseEvent& rMEvt );
|
|
|
|
void StartCascading();
|
|
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)
|
|
|
|
/* For special ToolBox controls, such as a font selection box or toolbox
|
|
tear-off floating windows, an appropriate Item-Subclass of SfxTooBoxControl
|
|
has to be implemented.
|
|
|
|
This class has to be registered in SfxApplication:Init() with the static
|
|
control method RegisterControl(). The SFx then automatically creates these
|
|
controls in the toolbox, if the associated slots are of the specific type.
|
|
*/
|
|
|
|
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 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 OUString SAL_CALL getSubToolbarName( ) throw (::com::sun::star::uno::RuntimeException);
|
|
virtual void SAL_CALL functionSelected( const 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 OUString& rSubToolBarResName );
|
|
::Size getPersistentFloatingSize( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& xFrame, const 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 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 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* 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* 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 ) ); }
|
|
|
|
//=========================================================================
|
|
|
|
|
|
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
|
|
{
|
|
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 SfxAppToolBoxControl_Impl : public SfxToolBoxControl
|
|
|
|
/* [Description]
|
|
|
|
Internal helper class for the pop-up menu <AppMenu_Impl> under new
|
|
start in the SDT.
|
|
*/
|
|
|
|
{
|
|
public:
|
|
SFX_DECL_TOOLBOX_CONTROL();
|
|
SfxAppToolBoxControl_Impl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rBox );
|
|
~SfxAppToolBoxControl_Impl();
|
|
void SetImage( const String& rFacName );
|
|
|
|
struct ExecuteInfo
|
|
{
|
|
::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > xDispatch;
|
|
::com::sun::star::util::URL aTargetURL;
|
|
::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aArgs;
|
|
};
|
|
|
|
DECL_STATIC_LINK( SfxAppToolBoxControl_Impl, ExecuteHdl_Impl, ExecuteInfo* );
|
|
|
|
protected:
|
|
virtual void Click();
|
|
using SfxToolBoxControl::Select;
|
|
virtual void Select( sal_Bool );
|
|
virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState );
|
|
virtual SfxPopupWindow* CreatePopupWindow();
|
|
DECL_LINK( Activate, Menu * );
|
|
private:
|
|
String aLastURL;
|
|
PopupMenu* pMenu;
|
|
sal_uIntPtr m_nSymbolsStyle;
|
|
sal_Bool m_bShowMenuImages;
|
|
};
|
|
|
|
/** Toolbox that implements recent files menu for the Open file toolbar button.
|
|
|
|
To use that, the appropriate Sfx*Item (like Open, OpenFromCalc, or
|
|
OpenFromWriter) has to have SlotType = SfxStringItem, and the appropriate
|
|
module initialization has to call RegisterControl().
|
|
*/
|
|
class SfxRecentFilesToolBoxControl : public SfxToolBoxControl
|
|
{
|
|
public:
|
|
// We don't use SFX_DECL_TOOLBOX_CONTROL() here as we need to have this
|
|
// RegisterControl() marked as SFX2_DLLPUBLIC
|
|
static SfxToolBoxControl* CreateImpl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx );
|
|
static void SFX2_DLLPUBLIC RegisterControl(sal_uInt16 nSlotId = 0, SfxModule *pMod=NULL);
|
|
|
|
SfxRecentFilesToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rBox );
|
|
virtual ~SfxRecentFilesToolBoxControl();
|
|
|
|
protected:
|
|
virtual SfxPopupWindow* CreatePopupWindow();
|
|
};
|
|
|
|
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_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 * );
|
|
public:
|
|
SFX_DECL_TOOLBOX_CONTROL();
|
|
SfxAddonsToolBoxControl_Impl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rBox );
|
|
~SfxAddonsToolBoxControl_Impl();
|
|
|
|
void RefreshMenuImages( Menu* pMenu );
|
|
};
|
|
|
|
#endif
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|