blob: 31112feffb3a92f1802ee21759f517617ce5b87d [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 _SFXDISPATCH_HXX
#define _SFXDISPATCH_HXX
#include "sal/config.h"
#include "sfx2/dllapi.h"
#include "sal/types.h"
#include <stdarg.h>
#define _SVSTDARR_USHORTS
#include <svl/svstdarr.hxx> // SvUShorts
#include <sfx2/bindings.hxx>
#include <sfx2/viewfrm.hxx>
class SfxSlotServer;
class SfxShell;
class SfxRequest;
class SfxShellStack_Impl;
class SfxHintPoster;
class SfxViewFrame;
class SfxBindings;
class SfxItemSet;
class SfxPopupMenuManager;
class SfxModule;
struct SfxDispatcher_Impl;
struct SfxPlugInInfo_Impl;
namespace com
{
namespace sun
{
namespace star
{
namespace frame
{
class XDispatch;
}
}
}
}
//=========================================================================
#define SFX_SHELL_POP_UNTIL 4
#define SFX_SHELL_POP_DELETE 2
#define SFX_SHELL_PUSH 1
//=========================================================================
typedef SfxPoolItem* SfxPoolItemPtr;
SV_DECL_PTRARR_DEL( SfxItemPtrArray, SfxPoolItemPtr, 4, 4 )
// fuer shell.cxx
typedef SfxItemPtrArray SfxItemArray_Impl;
class SfxExecuteItem : public SfxItemPtrArray, public SfxPoolItem
{
sal_uInt16 nSlot;
SfxCallMode eCall;
sal_uInt16 nModifier;
public:
sal_uInt16 GetSlot() const { return nSlot; }
sal_uInt16 GetModifier() const { return nModifier; }
void SetModifier( sal_uInt16 nModifierP ) { nModifier = nModifierP; }
SfxCallMode GetCallMode() const { return eCall; }
void SetCallMode( SfxCallMode eMode ) { eCall = eMode; }
virtual int operator==( const SfxPoolItem& ) const;
virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const;
SfxExecuteItem(
sal_uInt16 nWhich, sal_uInt16 nSlot, SfxCallMode eMode,
const SfxPoolItem *pArg1, ... );
SfxExecuteItem(
sal_uInt16 nWhich, sal_uInt16 nSlot, SfxCallMode eMode );
SfxExecuteItem( const SfxExecuteItem& );
};
//=========================================================================
class SFX2_DLLPUBLIC SfxDispatcher
{
SfxDispatcher_Impl* pImp;
sal_Bool bFlushed;
private:
// auf temporaer ausgewerteten Todos suchen
SAL_DLLPRIVATE sal_Bool CheckVirtualStack( const SfxShell& rShell, sal_Bool bDeep );
#ifndef _SFX_HXX
friend class SfxApplication;
friend class SfxViewFrame;
DECL_DLLPRIVATE_LINK( EventHdl_Impl, void * );
DECL_DLLPRIVATE_LINK( PostMsgHandler, SfxRequest * );
SAL_DLLPRIVATE int Call_Impl( SfxShell& rShell, const SfxSlot &rSlot, SfxRequest &rReq, sal_Bool bRecord );
SAL_DLLPRIVATE void _Update_Impl( sal_Bool,sal_Bool,sal_Bool,SfxWorkWindow*);
SAL_DLLPRIVATE void CollectTools_Impl(SfxWorkWindow*);
protected:
friend class SfxBindings;
friend class SfxStateCache;
friend class SfxPopupMenuManager;
friend class SfxHelp;
// Fuer die Bindings: Finden einer Message; Level fuer
// erneuten Zugriff
SAL_DLLPRIVATE sal_Bool _TryIntercept_Impl( sal_uInt16 nId, SfxSlotServer &rServer, sal_Bool bModal );
sal_Bool _FindServer( sal_uInt16 nId, SfxSlotServer &rServer, sal_Bool bModal );
sal_Bool _FillState( const SfxSlotServer &rServer,
SfxItemSet &rState, const SfxSlot *pRealSlot );
const SfxPoolItem* _Execute( const SfxSlotServer &rServer );
void _Execute( SfxShell &rShell, const SfxSlot &rSlot,
SfxRequest &rReq,
SfxCallMode eCall = SFX_CALLMODE_STANDARD);
const SfxPoolItem* _Execute( sal_uInt16 nSlot, SfxCallMode eCall,
va_list pArgs, const SfxPoolItem *pArg1 );
#endif
protected:
void FlushImpl();
public:
SfxDispatcher( SfxDispatcher* pParent );
SfxDispatcher( SfxViewFrame *pFrame = 0 );
SAL_DLLPRIVATE void Construct_Impl( SfxDispatcher* pParent );
virtual ~SfxDispatcher();
const SfxPoolItem* Execute( const SfxExecuteItem& rItem );
virtual sal_uInt16 ExecuteFunction( sal_uInt16 nSID, SfxPoolItem** ppArgs=0, sal_uInt16 nMode=0 );
sal_uInt16 ExecuteFunction( sal_uInt16 nSID, const SfxItemSet& rArgs , sal_uInt16 nMode=0 );
virtual void SetExecuteMode( sal_uInt16 );
const SfxPoolItem* Execute( sal_uInt16 nSlot,
SfxCallMode nCall = SFX_CALLMODE_SLOT,
const SfxPoolItem **pArgs = 0,
sal_uInt16 nModi = 0,
const SfxPoolItem **pInternalArgs = 0);
const SfxPoolItem* Execute( sal_uInt16 nSlot,
SfxCallMode nCall,
SfxItemSet* pArgs,
SfxItemSet* pInternalArgs,
sal_uInt16 nModi = 0);
const SfxPoolItem* Execute( sal_uInt16 nSlot,
SfxCallMode nCall,
const SfxPoolItem *pArg1, ... );
const SfxPoolItem* Execute( sal_uInt16 nSlot,
SfxCallMode nCall,
const SfxItemSet &rArgs );
const SfxPoolItem* Execute( sal_uInt16 nSlot,
SfxCallMode nCall,
sal_uInt16 nModi,
const SfxItemSet &rArgs );
sal_uInt16 GetSlotId( const String& rCommand );
const SfxSlot* GetSlot( const String& rCommand );
sal_Bool IsActive( const SfxShell& rShell );
sal_Bool IsOnTop( const SfxShell& rShell );
sal_uInt16 GetShellLevel( const SfxShell &rShell );
SfxBindings* GetBindings() const;
void Push( SfxShell& rShell );
void Pop( SfxShell& rShell, sal_uInt16 nMode = 0 );
SfxShell* GetShell(sal_uInt16 nIdx) const;
SfxViewFrame* GetFrame() const;
SfxModule* GetModule() const;
// caller has to clean up the Manager on his own
static SfxPopupMenuManager* Popup( sal_uInt16 nConfigId,Window *pWin, const Point *pPos );
void ExecutePopup( const ResId &rId,
Window *pWin = 0, const Point *pPosPixel = 0 );
static void ExecutePopup( sal_uInt16 nConfigId = 0,
Window *pWin = 0, const Point *pPosPixel = 0 );
static void ExecutePopup( sal_uInt16 nConfigId,
Window *pWin, const Point *pPosPixel,
const SfxPoolItem *pArg1, ... );
sal_Bool IsAppDispatcher() const;
sal_Bool IsFlushed() const;
void Flush();
void Lock( sal_Bool bLock );
sal_Bool IsLocked( sal_uInt16 nSID = 0 ) const;
void SetSlotFilter( sal_Bool bEnable = sal_False,
sal_uInt16 nCount = 0, const sal_uInt16 *pSIDs = 0 );
void HideUI( sal_Bool bHide = sal_True );
void ShowObjectBar(sal_uInt16 nId, SfxShell *pShell=0) const;
sal_uInt32 GetObjectBarId( sal_uInt16 nPos ) const;
SfxItemState QueryState( sal_uInt16 nSID, const SfxPoolItem* &rpState );
SfxItemState QueryState( sal_uInt16 nSID, ::com::sun::star::uno::Any& rAny );
sal_Bool IsAllowed( sal_uInt16 nSlot ) const;
::com::sun::star::frame::XDispatch* GetDispatchInterface( const String& );
void SetDisableFlags( sal_uInt32 nFlags );
sal_uInt32 GetDisableFlags() const;
//#if 0 // _SOLAR__PRIVATE
SAL_DLLPRIVATE sal_Bool HasSlot_Impl( sal_uInt16 );
SAL_DLLPRIVATE void SetMenu_Impl();
SAL_DLLPRIVATE void Update_Impl( sal_Bool bForce = sal_False ); // ObjectBars etc.
SAL_DLLPRIVATE sal_Bool IsUpdated_Impl() const;
SAL_DLLPRIVATE void DebugOutput_Impl() const;
SAL_DLLPRIVATE void ResetObjectBars_Impl();
SAL_DLLPRIVATE int GetShellAndSlot_Impl( sal_uInt16 nSlot, SfxShell **ppShell, const SfxSlot **ppSlot,
sal_Bool bOwnShellsOnly, sal_Bool bModal, sal_Bool bRealSlot=sal_True );
SAL_DLLPRIVATE void LockUI_Impl( sal_Bool bLock = sal_True );
SAL_DLLPRIVATE void SetReadOnly_Impl( sal_Bool bOn );
SAL_DLLPRIVATE sal_Bool GetReadOnly_Impl() const;
SAL_DLLPRIVATE sal_Bool IsSlotEnabledByFilter_Impl( sal_uInt16 nSID ) const;
SAL_DLLPRIVATE void SetQuietMode_Impl( sal_Bool bOn );
SAL_DLLPRIVATE void SetModalMode_Impl( sal_Bool bOn );
SAL_DLLPRIVATE sal_Bool IsReadOnlyShell_Impl( sal_uInt16 nShell ) const;
SAL_DLLPRIVATE void RemoveShell_Impl( SfxShell& rShell );
SAL_DLLPRIVATE void InsertShell_Impl( SfxShell& rShell, sal_uInt16 nPos );
SAL_DLLPRIVATE void DoParentActivate_Impl();
SAL_DLLPRIVATE void DoParentDeactivate_Impl();
SAL_DLLPRIVATE void DoActivate_Impl( sal_Bool bMDI, SfxViewFrame* pOld );
SAL_DLLPRIVATE void DoDeactivate_Impl( sal_Bool bMDI, SfxViewFrame* pNew );
SAL_DLLPRIVATE void InvalidateBindings_Impl(sal_Bool);
SAL_DLLPRIVATE sal_uInt16 GetNextToolBox_Impl( sal_uInt16 nPos, sal_uInt16 nType, String *pStr );
//#endif
};
//--------------------------------------------------------------------
inline sal_Bool SfxDispatcher::IsFlushed() const
/* [Beschreibung]
Mit dieser Methode l"a"st sich erfragen, ob der Stack des
SfxDispatchers geflusht ist, oder noch Push- oder Pop-Befehle
ausstehen.
*/
{
return bFlushed;
}
//--------------------------------------------------------------------
inline void SfxDispatcher::Flush()
/* [Beschreibung]
Diese Methode f"uhrt ausstehenden Push- und Pop-Befehle aus.
F"ur <SfxShell>s, die dabei neu auf den Stack kommen, wird
<SfxShell::Activate(sal_Bool)> mit bMDI == sal_True aufgerufen, f"ur
SfxShells, die vom Stack entfernt werden, wird <SfxShell::Deactivate(sal_Bool)>
mit bMDI == sal_True aufgerufen.
*/
{
if ( !bFlushed ) FlushImpl();
}
//--------------------------------------------------------------------
inline void SfxDispatcher::Push( SfxShell& rShell )
/* [Beschreibung]
Mit dieser Methode wird eine <SfxShell> auf den SfxDispatcher
gepusht. Die SfxShell wird zun"achst zum pushen vermerkt und
es wird ein Timer aufgesetzt. Erst bei Ablauf des Timers wird
tats"achlich gepusht (<SfxDispatcher::Flush()>) und die <SfxBindings>
werden invalidiert. W"ahrend der Timer l"auft gleichen sich
entgegengesetzte Push und Pop Befehle mit derselben SfxShell aus.
*/
{
Pop( rShell, SFX_SHELL_PUSH );
}
//--------------------------------------------------------------------
inline sal_Bool SfxDispatcher::IsActive( const SfxShell& rShell )
/* [Beschreibung]
Mit dieser Methode kann abgefragt werden, ob sich eine bestimmte
<SfxShell>-Instanz auf dem SfxDispatcher befindet.
[R"uckgabewert]
sal_Bool sal_True
Die SfxShell-Instanz befindet sich auf dem
SfxDispatcher.
sal_False
Die SfxShell-Instanz befindet sich nicht auf dem
SfxDispatcher.
*/
{
return CheckVirtualStack( rShell, sal_True );
}
//--------------------------------------------------------------------
inline sal_Bool SfxDispatcher::IsOnTop( const SfxShell& rShell )
/* [Beschreibung]
Mit dieser Methode kann abgefragt werden, ob sich eine bestimmte
<SfxShell>-Instanz zuoberst auf dem SfxDispatcher befindet.
[R"uckgabewert]
sal_Bool sal_True
Die SfxShell-Instanz befindet sich als oberste
SfxShell auf dem SfxDispatcher.
sal_False
Die SfxShell-Instanz befindet sich nicht als
oberste SfxShell auf dem SfxDispatcher.
*/
{
return CheckVirtualStack( rShell, sal_False );
}
//--------------------------------------------------------------------
#endif