blob: d3aeac5d6f9ce77b9e3556f8faefb78a87675679 [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 _SFX_BINDINGS_HXX
#define _SFX_BINDINGS_HXX
#include "sal/config.h"
#include "sfx2/dllapi.h"
#include "sal/types.h"
#include <com/sun/star/frame/XFrame.hpp>
#include <com/sun/star/frame/XDispatchProvider.hpp>
#include <com/sun/star/uno/Reference.h>
#include <com/sun/star/frame/XDispatchRecorderSupplier.hpp>
//________________________________________________________________________________________________________________
// some other includes
//________________________________________________________________________________________________________________
#include <sfx2/minarray.hxx>
#include <sfx2/viewfrm.hxx>
//________________________________________________________________________________________________________________
// forwards, typedefs, declarations
//________________________________________________________________________________________________________________
class SfxConfigManager;
class SystemWindow;
class SfxArg;
class SfxSlot;
class SfxSlotServer;
class SfxControllerItem;
class SfxStateCache;
class SfxItemSet;
class SfxDispatcher;
class SfxBindings;
class SfxBindings_Impl;
class Timer;
struct SfxFoundCache_Impl;
class SfxFoundCacheArr_Impl;
class SfxWorkWindow;
class SfxUnoControllerItem;
typedef SfxUnoControllerItem* SfxUnoControllerItemPtr;
SV_DECL_PTRARR( SfxUnoControllerArr_Impl, SfxUnoControllerItemPtr, 20, 20 )
//________________________________________________________________________________________________________________
// defines
//________________________________________________________________________________________________________________
#define SFX_CALLMODE_SLOT 0x00 // sync/async vom Slot
#define SFX_CALLMODE_SYNCHRON 0x01 // synchron im selben Stackframe
#define SFX_CALLMODE_ASYNCHRON 0x02 // asynchron per AppEvent
#define SFX_CALLMODE_RECORD 0x04 // beim Recorden ber"ucksichtigen
#define SFX_CALLMODE_API 0x08 // Call von der API (silent)
#define SFX_CALLMODE_MODAL 0x10 // trotz ModalMode
#define SFX_CALLMODE_STANDARD SFX_CALLMODE_RECORD
typedef sal_uInt16 SfxCallMode;
enum SfxPopupAction
{
SFX_POPUP_DELETE,
SFX_POPUP_HIDE,
SFX_POPUP_SHOW
};
//====================================================================
class SFX2_DLLPUBLIC SfxBindings: public SfxBroadcaster
/* [Beschreibung]
In jeder SFx-Applikation existiert "uber die Laufzeit von vor
<SfxApplication::Init()> bis nach <SfxApplication::Exit()> eine Instanz
der Klasse SfxBindings. Sie wird von der SfxApplication automatisch
angelegt und zerst"ort. Instanzen werden aber i.d.R. "uber das
Makro <SFX_BINDINGS> oder den zugeh"origen <SfxViewFrame> besorgt
werden.
Die SfxBindings verwalten alle in den an ihr angemeldeten Controllern
gebundenen Slot-Ids und cachen die jeweiligen <Slot-Server>
(so nenne wir die Kombination aus SfxShell-Instanz und SfxSlot).
In den SfxBindings ist gespeichert, ob und welche Controller dirty
sind sowie welche Slot-Server-Caches jeweils dirty sind. Sie fa"st
Status-Anfragen (Aufrufe der in der IDL genannten Status-Methoden)
zusammen, die von derselben Status-Methode bedient werden, und sorgt
f"ur die Simulation der <Pseudo-Slots>.
*/
{
friend class SfxApplication;
friend class SfxShell;
friend class SfxBindings_Impl;
SfxBindings_Impl*pImp; // Daten der Bindings-Instanz
SfxDispatcher* pDispatcher; // zu verwendender Dispatcher
sal_uInt16 nRegLevel; // Lock-Level waehrend Reconfig
//#if 0 // _SOLAR__PRIVATE
private:
SAL_DLLPRIVATE const SfxPoolItem* Execute_Impl( sal_uInt16 nSlot, const SfxPoolItem **pArgs, sal_uInt16 nModi,
SfxCallMode nCall, const SfxPoolItem **pInternalArgs, sal_Bool bGlobalOnly=sal_False);
SAL_DLLPRIVATE void SetSubBindings_Impl( SfxBindings* );
SAL_DLLPRIVATE void UpdateSlotServer_Impl(); // SlotServer aktualisieren
SAL_DLLPRIVATE SfxItemSet* CreateSet_Impl( SfxStateCache* &pCache,
const SfxSlot* &pRealSlot,
const SfxSlotServer**,
SfxFoundCacheArr_Impl& );
SAL_DLLPRIVATE sal_uInt16 GetSlotPos( sal_uInt16 nId, sal_uInt16 nStartSearchAt = 0 );
SAL_DLLPRIVATE void Update_Impl( SfxStateCache* pCache );
SAL_DLLPRIVATE void UpdateControllers_Impl(
const SfxInterface* pIF,
const SfxFoundCache_Impl* pFound,
const SfxPoolItem *pItem,
SfxItemState eItemState );
DECL_DLLPRIVATE_LINK( NextJob_Impl, Timer * );
//#endif
public:
SfxBindings();
~SfxBindings();
void HidePopups( bool bHide = true );
SAL_DLLPRIVATE void HidePopupCtrls_Impl( int bHide = sal_True );
void SetDispatcher(SfxDispatcher *pDisp);
void Update( sal_uInt16 nId ); // z.B. aus Menu::Activate
void Update();
SAL_DLLPRIVATE void StartUpdate_Impl(sal_Bool bComplete=sal_False);
void Invalidate( sal_uInt16 nId );
void Invalidate( const sal_uInt16* pIds );
void InvalidateShell( const SfxShell &rSh, sal_Bool bDeep = sal_False );
void InvalidateAll( sal_Bool bWithMsg );
void SetState( const SfxItemSet &rSet );
void SetState( const SfxPoolItem &rItem );
void Invalidate( sal_uInt16 nId, sal_Bool bWithItem, sal_Bool bWithMsg=sal_False);
void Invalidate( sal_uInt16 nId, sal_Bool bWithMsg);
sal_Bool IsInUpdate() const;
void SetVisibleState( sal_uInt16 nId, sal_Bool bShow );
sal_Bool IsBound( sal_uInt16 nMsgId, sal_uInt16 nStartSearchAt = 0 );
const SfxSlot* GetSlot( sal_uInt16 nMsgId );
SfxStateCache* GetStateCache( sal_uInt16 nId, sal_uInt16 *pPos = 0 );
SAL_DLLPRIVATE SfxStateCache* GetAnyStateCache_Impl( sal_uInt16 nId );
SfxItemState QueryState( sal_uInt16 nSID, SfxPoolItem* &rpState );
const SfxPoolItem* ExecuteSynchron( sal_uInt16 nSlot,
const SfxPoolItem **pArgs = 0,
sal_uInt16 nModi = 0,
const SfxPoolItem **pInternalArgs = 0);
sal_Bool Execute( sal_uInt16 nSlot,
const SfxPoolItem **pArgs = 0,
sal_uInt16 nModi = 0,
SfxCallMode nCall = SFX_CALLMODE_SLOT,
const SfxPoolItem **pInternalArgs = 0);
SAL_DLLPRIVATE void SetDispatchProvider_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > & rFrame );
SAL_DLLPRIVATE const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > & GetDispatchProvider_Impl() const;
void SetActiveFrame( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > & rFrame );
const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > GetActiveFrame() const;
// Reconfig
int IsInRegistrations() const;
sal_uInt16 EnterRegistrations(const char *pFile = 0, int nLine = 0);
void LeaveRegistrations( sal_uInt16 nLevel = USHRT_MAX, const char *pFile = 0, int nLine = 0 );
void Register( SfxControllerItem& rBinding );
void Release( SfxControllerItem& rBinding );
SystemWindow* GetSystemWindow() const;
SfxDispatcher* GetDispatcher() const
{ return pDispatcher; }
com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > GetRecorder() const;
com::sun::star::uno::Reference < com::sun::star::frame::XDispatch >
GetDispatch( const SfxSlot*, const com::sun::star::util::URL& aURL, sal_Bool bMasterCommand );
//#if 0 // _SOLAR__PRIVATE
SAL_DLLPRIVATE void ContextChanged_Impl();
SAL_DLLPRIVATE void Execute_Impl( SfxRequest& rReq, const SfxSlot* pSlot, SfxShell* pShell );
SAL_DLLPRIVATE void DeleteControllers_Impl();
SAL_DLLPRIVATE SfxPopupAction GetPopupAction_Impl() const;
SAL_DLLPRIVATE SfxDispatcher* GetDispatcher_Impl() { return pDispatcher; }
SAL_DLLPRIVATE void ClearCache_Impl( sal_uInt16 nSlotId );
SAL_DLLPRIVATE sal_Bool IsInUpdate_Impl() const{ return IsInUpdate(); }
SAL_DLLPRIVATE void RegisterInternal_Impl( SfxControllerItem& rBinding );
SAL_DLLPRIVATE void Register_Impl( SfxControllerItem& rBinding, sal_Bool );
SAL_DLLPRIVATE SfxWorkWindow* GetWorkWindow_Impl() const;
SAL_DLLPRIVATE void SetWorkWindow_Impl( SfxWorkWindow* );
SAL_DLLPRIVATE SfxBindings* GetSubBindings_Impl( sal_Bool bTop = sal_False ) const;
SAL_DLLPRIVATE void InvalidateUnoControllers_Impl();
SAL_DLLPRIVATE void RegisterUnoController_Impl( SfxUnoControllerItem* );
SAL_DLLPRIVATE void ReleaseUnoController_Impl( SfxUnoControllerItem* );
SAL_DLLPRIVATE sal_Bool ExecuteCommand_Impl( const String& rCommand );
SAL_DLLPRIVATE void SetRecorder_Impl( com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder >& );
SAL_DLLPRIVATE void ExecuteGlobal_Impl( sal_uInt16 nId );
SAL_DLLPRIVATE void InvalidateSlotsInMap_Impl();
SAL_DLLPRIVATE void AddSlotToInvalidateSlotsMap_Impl( sal_uInt16 nId );
//#endif
};
#ifdef DBG_UTIL
#define ENTERREGISTRATIONS() EnterRegistrations(__FILE__, __LINE__)
#define LEAVEREGISTRATIONS() LeaveRegistrations(USHRT_MAX, __FILE__, __LINE__)
#define DENTERREGISTRATIONS( ) \
EnterRegistrations( (ByteString(__FILE__).Append('(').Append(ByteString::CreateFromInt64((sal_uIntPtr)this).Append(')'))).GetBufferAccess(), __LINE__ )
#define DLEAVEREGISTRATIONS( ) \
LeaveRegistrations( USHRT_MAX, (ByteString(__FILE__).Append('(').Append(ByteString::CreateFromInt64((sal_uIntPtr)this).Append(')'))).GetBufferAccess(), __LINE__ )
#else
#define ENTERREGISTRATIONS() EnterRegistrations()
#define LEAVEREGISTRATIONS() LeaveRegistrations()
#define DENTERREGISTRATIONS( ) EnterRegistrations()
#define DLEAVEREGISTRATIONS( ) LeaveRegistrations()
#endif
//--------------------------------------------------------------------
inline int SfxBindings::IsInRegistrations() const
/* [Beschreibung]
Stellt fest, ob an der SfxBindings Instanz gerade <SfxContollerItems>
an- oder abgemeldet werden, also noch <SfxBindings::EnterRegistrations()>
Aufrufe nicht mit <SfxBindings::EnterRegistrations()> geschlo"sen wurden.
[R"uckgabewert]
int sal_True
Die SfxBindings Instanz ist gerade im Registrierungs-
Modus. Es erfolgen also keine Status-Updates.
sal_False
Die SfxBindings Instanz ist gerade im normalen
Modus. Es k"oennen also Status-Updates erfolgen.
*/
{
return 0 != nRegLevel;
}
//--------------------------------------------------------------------
#endif