xref: /aoo4110/main/sfx2/source/control/dispatch.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sfx2.hxx"
26*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDispatchRecorderSupplier.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XLayoutManager.hpp>
29*b1cdbd2cSJim Jagielski #include <svl/itempool.hxx>
30*b1cdbd2cSJim Jagielski #include <svl/itemiter.hxx>
31*b1cdbd2cSJim Jagielski #include <svl/whiter.hxx>
32*b1cdbd2cSJim Jagielski #include <svl/intitem.hxx>
33*b1cdbd2cSJim Jagielski #ifndef _SFXEITEM_HXX //autogen
34*b1cdbd2cSJim Jagielski #include <svl/eitem.hxx>
35*b1cdbd2cSJim Jagielski #endif
36*b1cdbd2cSJim Jagielski #include <svl/undo.hxx>
37*b1cdbd2cSJim Jagielski #ifndef _WRKWIN_HXX //autogen
38*b1cdbd2cSJim Jagielski #include <vcl/wrkwin.hxx>
39*b1cdbd2cSJim Jagielski #endif
40*b1cdbd2cSJim Jagielski #include <svtools/ttprops.hxx>
41*b1cdbd2cSJim Jagielski #include <stdio.h>
42*b1cdbd2cSJim Jagielski #include <stdarg.h>
43*b1cdbd2cSJim Jagielski #include <stdlib.h>				// wg. bsearch
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #define _SVSTDARR_ULONGS
46*b1cdbd2cSJim Jagielski #include <svl/svstdarr.hxx>
47*b1cdbd2cSJim Jagielski #include <svtools/helpopt.hxx>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XLayoutManager.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski #ifndef GCC
52*b1cdbd2cSJim Jagielski #endif
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski // wg. nAutoPageID
55*b1cdbd2cSJim Jagielski #include "appdata.hxx"
56*b1cdbd2cSJim Jagielski #include "sfx2/sfxhelp.hxx"
57*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
58*b1cdbd2cSJim Jagielski #include <sfx2/minstack.hxx>
59*b1cdbd2cSJim Jagielski #include <sfx2/msg.hxx>
60*b1cdbd2cSJim Jagielski #include <sfx2/objface.hxx>
61*b1cdbd2cSJim Jagielski #include <sfx2/bindings.hxx>
62*b1cdbd2cSJim Jagielski #include <sfx2/request.hxx>
63*b1cdbd2cSJim Jagielski #include <sfx2/app.hxx>
64*b1cdbd2cSJim Jagielski #include <sfx2/hintpost.hxx>
65*b1cdbd2cSJim Jagielski #include "slotserv.hxx"
66*b1cdbd2cSJim Jagielski #include <sfx2/ipclient.hxx>
67*b1cdbd2cSJim Jagielski #include "sfxtypes.hxx"
68*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
69*b1cdbd2cSJim Jagielski #include <sfx2/viewsh.hxx>
70*b1cdbd2cSJim Jagielski #include <sfx2/childwin.hxx>
71*b1cdbd2cSJim Jagielski #include <sfx2/docfac.hxx>
72*b1cdbd2cSJim Jagielski #include <sfx2/msgpool.hxx>
73*b1cdbd2cSJim Jagielski #include <sfx2/module.hxx>
74*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
75*b1cdbd2cSJim Jagielski #include <sfx2/sfxuno.hxx>
76*b1cdbd2cSJim Jagielski #include <sfx2/docfile.hxx>
77*b1cdbd2cSJim Jagielski #include <sfx2/mnumgr.hxx>
78*b1cdbd2cSJim Jagielski #include "workwin.hxx"
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski namespace css = ::com::sun::star;
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski //==================================================================
83*b1cdbd2cSJim Jagielski DBG_NAME(SfxDispatcherFlush)
84*b1cdbd2cSJim Jagielski DBG_NAME(SfxDispatcherFillState)
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski //==================================================================
87*b1cdbd2cSJim Jagielski typedef SfxRequest* SfxRequestPtr;
88*b1cdbd2cSJim Jagielski SV_IMPL_PTRARR( SfxItemPtrArray, SfxPoolItemPtr );
89*b1cdbd2cSJim Jagielski SV_DECL_PTRARR_DEL( SfxRequestPtrArray, SfxRequestPtr, 4, 4 )
90*b1cdbd2cSJim Jagielski SV_IMPL_PTRARR( SfxRequestPtrArray, SfxRequestPtr );
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski DECL_PTRSTACK(SfxShellStack_Impl, SfxShell*, 8, 4 );
93*b1cdbd2cSJim Jagielski //==================================================================
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski struct SfxToDo_Impl
96*b1cdbd2cSJim Jagielski {
97*b1cdbd2cSJim Jagielski 	SfxShell*			pCluster;
98*b1cdbd2cSJim Jagielski 	bool               	bPush;
99*b1cdbd2cSJim Jagielski 	bool    			bDelete;
100*b1cdbd2cSJim Jagielski 	bool    			bUntil;
101*b1cdbd2cSJim Jagielski 
SfxToDo_ImplSfxToDo_Impl102*b1cdbd2cSJim Jagielski 	SfxToDo_Impl()
103*b1cdbd2cSJim Jagielski 		: pCluster(0)
104*b1cdbd2cSJim Jagielski 		, bPush(false)
105*b1cdbd2cSJim Jagielski 		, bDelete(false)
106*b1cdbd2cSJim Jagielski 		, bUntil(false)
107*b1cdbd2cSJim Jagielski 				{}
SfxToDo_ImplSfxToDo_Impl108*b1cdbd2cSJim Jagielski 	SfxToDo_Impl( bool bOpPush, bool bOpDelete, bool bOpUntil, SfxShell& rCluster )
109*b1cdbd2cSJim Jagielski 		: pCluster(&rCluster)
110*b1cdbd2cSJim Jagielski 		, bPush(bOpPush)
111*b1cdbd2cSJim Jagielski 		, bDelete(bOpDelete)
112*b1cdbd2cSJim Jagielski 		, bUntil(bOpUntil)
113*b1cdbd2cSJim Jagielski 				{}
~SfxToDo_ImplSfxToDo_Impl114*b1cdbd2cSJim Jagielski 	~SfxToDo_Impl(){}
115*b1cdbd2cSJim Jagielski 
operator ==SfxToDo_Impl116*b1cdbd2cSJim Jagielski 	bool operator==( const SfxToDo_Impl& rWith ) const
117*b1cdbd2cSJim Jagielski 	{ return pCluster==rWith.pCluster && bPush==rWith.bPush; }
118*b1cdbd2cSJim Jagielski };
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski DECL_OBJSTACK(SfxToDoStack_Impl, SfxToDo_Impl, 8, 4);
121*b1cdbd2cSJim Jagielski IMPL_OBJSTACK(SfxToDoStack_Impl, SfxToDo_Impl);
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski struct SfxObjectBars_Impl
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski 	sal_uInt32          nResId;	// Resource - und ConfigId der Toolbox
126*b1cdbd2cSJim Jagielski 	sal_uInt16          nMode;	// spezielle Sichtbarkeitsflags
127*b1cdbd2cSJim Jagielski 	String   			aName;
128*b1cdbd2cSJim Jagielski 	SfxInterface*		pIFace;
129*b1cdbd2cSJim Jagielski 
SfxObjectBars_ImplSfxObjectBars_Impl130*b1cdbd2cSJim Jagielski 	SfxObjectBars_Impl() :
131*b1cdbd2cSJim Jagielski 		nResId( 0 )
132*b1cdbd2cSJim Jagielski 	{}
133*b1cdbd2cSJim Jagielski };
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski struct SfxDispatcher_Impl
138*b1cdbd2cSJim Jagielski {
139*b1cdbd2cSJim Jagielski     SfxRequestPtrArray      aReqArr;
140*b1cdbd2cSJim Jagielski 	const SfxSlotServer* pCachedServ1;		 // zuletzt gerufene Message
141*b1cdbd2cSJim Jagielski 	const SfxSlotServer* pCachedServ2;		 // vorletzt gerufene Message
142*b1cdbd2cSJim Jagielski 	SfxShellStack_Impl		aStack; 			// aktive Funktionalitaet
143*b1cdbd2cSJim Jagielski 	Timer					aTimer; 			// fuers flushen
144*b1cdbd2cSJim Jagielski 	SfxToDoStack_Impl		aToDoStack; 		// nicht abgearb. Push/Pop
145*b1cdbd2cSJim Jagielski 	SfxViewFrame*           pFrame;         	// 0 oder zugeh"or. Frame
146*b1cdbd2cSJim Jagielski 	SfxDispatcher*			pParent;			// z.B. AppDispatcher, ggf. 0
147*b1cdbd2cSJim Jagielski 	SfxHintPosterRef		xPoster;			// asynchrones Execute
148*b1cdbd2cSJim Jagielski 	sal_Bool                    bFlushing;      	// sal_True waehrend Flush //?
149*b1cdbd2cSJim Jagielski 	sal_Bool					bUpdated;			// Update_Impl gelaufen
150*b1cdbd2cSJim Jagielski 	sal_Bool                    bLocked;        	// kein Execute
151*b1cdbd2cSJim Jagielski 	sal_Bool					bInvalidateOnUnlock;// da fragte jemand
152*b1cdbd2cSJim Jagielski 	sal_Bool					bActive;			// nicht verwechseln mit gesetzt!
153*b1cdbd2cSJim Jagielski 	sal_Bool*   				pInCallAliveFlag;   // dem Stack den Dtor anzeigen
154*b1cdbd2cSJim Jagielski 	SfxObjectBars_Impl		aObjBars[SFX_OBJECTBAR_MAX];
155*b1cdbd2cSJim Jagielski 	SfxObjectBars_Impl		aFixedObjBars[SFX_OBJECTBAR_MAX];
156*b1cdbd2cSJim Jagielski 	SvULongs				aChildWins;
157*b1cdbd2cSJim Jagielski 	sal_uInt32					nEventId;			// EventId UserEvent
158*b1cdbd2cSJim Jagielski 	sal_Bool					bUILocked;			// Update abgeklemmt (!zappeln)
159*b1cdbd2cSJim Jagielski 	sal_Bool					bNoUI;				// UI nur vom Parent Dispatcher
160*b1cdbd2cSJim Jagielski 	sal_Bool					bReadOnly;			// Dokument ist ReadOnly
161*b1cdbd2cSJim Jagielski 	sal_Bool					bQuiet;             // nur parent dispatcher verwenden
162*b1cdbd2cSJim Jagielski 	sal_Bool					bModal;             // nur Slots vom Parent-Dispatcher
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 	sal_Bool					bFilterEnabling;	// sal_True=filter enabled slots, 2==ReadOnlyDoc uebersteuert
165*b1cdbd2cSJim Jagielski 	sal_uInt16					nFilterCount;		// Anzahl der SIDs in pFilterSIDs
166*b1cdbd2cSJim Jagielski 	const sal_uInt16*			pFilterSIDs;		// sortiertes Array von SIDs
167*b1cdbd2cSJim Jagielski 	sal_uInt16					nStandardMode;		// ExecuteMode f. PlugInDispatcher
168*b1cdbd2cSJim Jagielski 	SvUShorts*				pDisableList;
169*b1cdbd2cSJim Jagielski 	sal_uInt32					nDisableFlags;
170*b1cdbd2cSJim Jagielski };
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski #define NO_OBJECTBAR	0
173*b1cdbd2cSJim Jagielski #define OWN_OBJECTBAR	1
174*b1cdbd2cSJim Jagielski #define OTHER_OBJECTBAR 2
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski #define SFX_FLUSH_TIMEOUT    50
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski //====================================================================
IsLocked(sal_uInt16) const181*b1cdbd2cSJim Jagielski sal_Bool SfxDispatcher::IsLocked( sal_uInt16 ) const
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski /*  [Beschreibung]
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 	Mit dieser Methode kann festgestellt werden, ob der SfxDispatcher
186*b1cdbd2cSJim Jagielski 	gesperrt oder freigegeben ist. Ein gesperrter SfxDispatcher
187*b1cdbd2cSJim Jagielski 	f"uhrt keine <SfxRequest>s mehr aus und liefert keine
188*b1cdbd2cSJim Jagielski 	Status-Informationen mehr. Er verh"alt sich so als w"aren alle
189*b1cdbd2cSJim Jagielski 	Slots disabled.
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski 	Der Dispatcher gilt auch als gesperrt, wenn alle Dispatcher
192*b1cdbd2cSJim Jagielski 	gelockt sind (<SfxApplication::LockDispatcher()>) oder der zugeh"orige
193*b1cdbd2cSJim Jagielski 	Top-Frame im modal-mode ist und der angegebene Slot Frame-spezifisch
194*b1cdbd2cSJim Jagielski 	(also nicht von der Application) bedient wird.
195*b1cdbd2cSJim Jagielski */
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski {
198*b1cdbd2cSJim Jagielski     return pImp->bLocked;
199*b1cdbd2cSJim Jagielski }
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
IsAppDispatcher() const202*b1cdbd2cSJim Jagielski sal_Bool SfxDispatcher::IsAppDispatcher() const
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski /*	[Beschreibung]
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski 	Mit dieser Methode l"a\st sich festellen, ob der SfxDispacher der
207*b1cdbd2cSJim Jagielski 	Applikations-Dispatcher ist.
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski 	[R"uckgabewert]
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski 	sal_Bool				sal_True
213*b1cdbd2cSJim Jagielski 						Es ist der Applikations-Dispatcher.
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 						sal_False
216*b1cdbd2cSJim Jagielski 						Es ist ein Dispatcher eines SfxViewFrame.
217*b1cdbd2cSJim Jagielski */
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski {
220*b1cdbd2cSJim Jagielski     return !pImp->pFrame;
221*b1cdbd2cSJim Jagielski }
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
Call_Impl(SfxShell & rShell,const SfxSlot & rSlot,SfxRequest & rReq,sal_Bool bRecord)224*b1cdbd2cSJim Jagielski int SfxDispatcher::Call_Impl( SfxShell& rShell, const SfxSlot &rSlot, SfxRequest &rReq, sal_Bool bRecord )
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski /*	[Beschreibung]
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 	Hilfsfunktion zum pr"ufen, ob ein Slot executed werden darf und
229*b1cdbd2cSJim Jagielski 	der Execution selbst.
230*b1cdbd2cSJim Jagielski */
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski {
233*b1cdbd2cSJim Jagielski 	SFX_STACK(SfxDispatcher::Call_Impl);
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski 	// darf der Slot gerufen werden (i.S.v. enabled)
236*b1cdbd2cSJim Jagielski 	if ( rSlot.IsMode(SFX_SLOT_FASTCALL) || rShell.CanExecuteSlot_Impl(rSlot) )
237*b1cdbd2cSJim Jagielski 	{
238*b1cdbd2cSJim Jagielski         if ( GetFrame() )
239*b1cdbd2cSJim Jagielski         {
240*b1cdbd2cSJim Jagielski             // ggf. Recording anwerfen
241*b1cdbd2cSJim Jagielski             com::sun::star::uno::Reference< com::sun::star::frame::XFrame > xFrame(
242*b1cdbd2cSJim Jagielski                     GetFrame()->GetFrame().GetFrameInterface(),
243*b1cdbd2cSJim Jagielski                     com::sun::star::uno::UNO_QUERY);
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski             com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xSet(
246*b1cdbd2cSJim Jagielski                     xFrame,
247*b1cdbd2cSJim Jagielski                     com::sun::star::uno::UNO_QUERY);
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 			if ( xSet.is() )
250*b1cdbd2cSJim Jagielski 			{
251*b1cdbd2cSJim Jagielski 				com::sun::star::uno::Any aProp = xSet->getPropertyValue(::rtl::OUString::createFromAscii("DispatchRecorderSupplier"));
252*b1cdbd2cSJim Jagielski 	            com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorderSupplier > xSupplier;
253*b1cdbd2cSJim Jagielski 	            com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > xRecorder;
254*b1cdbd2cSJim Jagielski 	            aProp >>= xSupplier;
255*b1cdbd2cSJim Jagielski 	            if(xSupplier.is())
256*b1cdbd2cSJim Jagielski 	                xRecorder = xSupplier->getDispatchRecorder();
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski 	            if ( bRecord && xRecorder.is() && !rSlot.IsMode(SFX_SLOT_NORECORD) )
259*b1cdbd2cSJim Jagielski 	                rReq.Record_Impl( rShell, rSlot, xRecorder, GetFrame() );
260*b1cdbd2cSJim Jagielski 			}
261*b1cdbd2cSJim Jagielski         }
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski 		// Alles holen, was gebraucht wird, da der Slot den Execute evtl. nicht
264*b1cdbd2cSJim Jagielski 		// "uberlebt, falls es ein 'Pseudoslot' f"ur Macros oder Verben ist
265*b1cdbd2cSJim Jagielski 		sal_Bool bAutoUpdate = rSlot.IsMode(SFX_SLOT_AUTOUPDATE);
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski 		// API-Call-Klammerung und Document-Lock w"ahrend des Calls
268*b1cdbd2cSJim Jagielski 		{
269*b1cdbd2cSJim Jagielski 			// 'this' mu\s im Dtor bescheid sagen
270*b1cdbd2cSJim Jagielski 			sal_Bool bThisDispatcherAlive = sal_True;
271*b1cdbd2cSJim Jagielski 			sal_Bool *pOldInCallAliveFlag = pImp->pInCallAliveFlag;
272*b1cdbd2cSJim Jagielski 			pImp->pInCallAliveFlag = &bThisDispatcherAlive;
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski             SfxViewFrame* pView = GetFrame();
275*b1cdbd2cSJim Jagielski             if ( !pView )
276*b1cdbd2cSJim Jagielski                 pView = SfxViewFrame::Current();
277*b1cdbd2cSJim Jagielski             if ( pView )
278*b1cdbd2cSJim Jagielski             {
279*b1cdbd2cSJim Jagielski                 rtl::OString aCmd(".uno:");
280*b1cdbd2cSJim Jagielski                 aCmd += rSlot.GetUnoName();
281*b1cdbd2cSJim Jagielski                 SfxHelp::OpenHelpAgent( &pView->GetFrame(), aCmd );
282*b1cdbd2cSJim Jagielski             }
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski             SfxExecFunc pFunc = rSlot.GetExecFnc();
285*b1cdbd2cSJim Jagielski             rShell.CallExec( pFunc, rReq );
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski 			// falls 'this' noch lebt
288*b1cdbd2cSJim Jagielski 			if ( bThisDispatcherAlive )
289*b1cdbd2cSJim Jagielski 				pImp->pInCallAliveFlag = pOldInCallAliveFlag;
290*b1cdbd2cSJim Jagielski 			else
291*b1cdbd2cSJim Jagielski             {
292*b1cdbd2cSJim Jagielski                 if ( pOldInCallAliveFlag )
293*b1cdbd2cSJim Jagielski                 {
294*b1cdbd2cSJim Jagielski                     // auch verschachtelte Stack-Frames sch"utzen
295*b1cdbd2cSJim Jagielski                     *pOldInCallAliveFlag = sal_False;
296*b1cdbd2cSJim Jagielski                 }
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski                 // do nothing after this object is dead
299*b1cdbd2cSJim Jagielski                 return rReq.IsDone();
300*b1cdbd2cSJim Jagielski             }
301*b1cdbd2cSJim Jagielski 		}
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski 		if ( rReq.IsDone() )
304*b1cdbd2cSJim Jagielski 		{
305*b1cdbd2cSJim Jagielski             SfxBindings *pBindings = GetBindings();
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski 			// bei AutoUpdate sofort updaten; "Pseudoslots" d"urfen nicht
308*b1cdbd2cSJim Jagielski 			// Autoupdate sein!
309*b1cdbd2cSJim Jagielski             if ( bAutoUpdate && pBindings )
310*b1cdbd2cSJim Jagielski 			{
311*b1cdbd2cSJim Jagielski 				const SfxSlot* pSlave = rSlot.GetLinkedSlot();
312*b1cdbd2cSJim Jagielski 				if (pSlave)
313*b1cdbd2cSJim Jagielski 				{
314*b1cdbd2cSJim Jagielski 					// bei Enum-Slots irgendeinen gebundenen Slave-Slot nehmen
315*b1cdbd2cSJim Jagielski 					while (!pBindings->IsBound(pSlave->GetSlotId()) && pSlave != &rSlot )
316*b1cdbd2cSJim Jagielski 						pSlave = pSlave->GetLinkedSlot();
317*b1cdbd2cSJim Jagielski 					pBindings->Invalidate(pSlave->GetSlotId());
318*b1cdbd2cSJim Jagielski 					pBindings->Update(pSlave->GetSlotId());
319*b1cdbd2cSJim Jagielski 				}
320*b1cdbd2cSJim Jagielski 				else
321*b1cdbd2cSJim Jagielski 				{
322*b1cdbd2cSJim Jagielski 					pBindings->Invalidate(rSlot.GetSlotId());
323*b1cdbd2cSJim Jagielski 					pBindings->Update(rSlot.GetSlotId());
324*b1cdbd2cSJim Jagielski 				}
325*b1cdbd2cSJim Jagielski 			}
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski 			return sal_True;
328*b1cdbd2cSJim Jagielski 		}
329*b1cdbd2cSJim Jagielski 	}
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski 	return sal_False;
332*b1cdbd2cSJim Jagielski }
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski //====================================================================
Construct_Impl(SfxDispatcher * pParent)335*b1cdbd2cSJim Jagielski void SfxDispatcher::Construct_Impl( SfxDispatcher* pParent )
336*b1cdbd2cSJim Jagielski {
337*b1cdbd2cSJim Jagielski 	pImp = new SfxDispatcher_Impl;
338*b1cdbd2cSJim Jagielski 	bFlushed = sal_True;
339*b1cdbd2cSJim Jagielski 	SfxApplication *pSfxApp = SFX_APP();
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski 	pImp->pCachedServ1 = 0;
342*b1cdbd2cSJim Jagielski 	pImp->pCachedServ2 = 0;
343*b1cdbd2cSJim Jagielski 	pImp->bFlushing = sal_False;
344*b1cdbd2cSJim Jagielski 	pImp->bUpdated = sal_False;
345*b1cdbd2cSJim Jagielski 	pImp->bLocked = sal_False;
346*b1cdbd2cSJim Jagielski 	pImp->bActive = sal_False;
347*b1cdbd2cSJim Jagielski 	pImp->pParent = NULL;
348*b1cdbd2cSJim Jagielski 	pImp->bUILocked = sal_False;
349*b1cdbd2cSJim Jagielski 	pImp->bNoUI = sal_False;
350*b1cdbd2cSJim Jagielski 	pImp->bReadOnly = sal_False;
351*b1cdbd2cSJim Jagielski 	pImp->bQuiet = sal_False;
352*b1cdbd2cSJim Jagielski 	pImp->bModal = sal_False;
353*b1cdbd2cSJim Jagielski 	pImp->pInCallAliveFlag = 0;
354*b1cdbd2cSJim Jagielski 	pImp->bFilterEnabling = sal_False;
355*b1cdbd2cSJim Jagielski 	pImp->nFilterCount = 0;
356*b1cdbd2cSJim Jagielski 	pImp->pFilterSIDs = 0;
357*b1cdbd2cSJim Jagielski 	pImp->nStandardMode = 0;
358*b1cdbd2cSJim Jagielski 	pImp->pDisableList = pSfxApp->GetDisabledSlotList_Impl();
359*b1cdbd2cSJim Jagielski 	pImp->nDisableFlags = 0;
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski 	pImp->pParent = pParent;
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski 	pImp->bInvalidateOnUnlock = sal_False;
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski 	for (sal_uInt16 n=0; n<SFX_OBJECTBAR_MAX; n++)
366*b1cdbd2cSJim Jagielski 		pImp->aObjBars[n].nResId = 0;
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski 	GenLink aGenLink( LINK(this, SfxDispatcher, PostMsgHandler) );
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski 	pImp->xPoster = new SfxHintPoster(aGenLink);
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski 	pImp->aTimer.SetTimeout(SFX_FLUSH_TIMEOUT);
373*b1cdbd2cSJim Jagielski 	pImp->aTimer.SetTimeoutHdl( LINK(this, SfxDispatcher, EventHdl_Impl ) );
374*b1cdbd2cSJim Jagielski }
375*b1cdbd2cSJim Jagielski 
SfxDispatcher(SfxDispatcher * pParent)376*b1cdbd2cSJim Jagielski SfxDispatcher::SfxDispatcher( SfxDispatcher* pParent )
377*b1cdbd2cSJim Jagielski {
378*b1cdbd2cSJim Jagielski 	Construct_Impl( pParent );
379*b1cdbd2cSJim Jagielski 	pImp->pFrame = 0;
380*b1cdbd2cSJim Jagielski }
381*b1cdbd2cSJim Jagielski 
SfxDispatcher(SfxViewFrame * pViewFrame)382*b1cdbd2cSJim Jagielski SfxDispatcher::SfxDispatcher( SfxViewFrame *pViewFrame )
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski /*	[Beschreibung]
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 	Der Konstruktor der Klasse SfxDispatcher legt einen leeren Stack
387*b1cdbd2cSJim Jagielski 	von <SfxShell>-Pointern an. Er ist initial nicht gelockt und gilt als
388*b1cdbd2cSJim Jagielski 	geflusht.
389*b1cdbd2cSJim Jagielski */
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski {
392*b1cdbd2cSJim Jagielski 	if ( pViewFrame )
393*b1cdbd2cSJim Jagielski 	{
394*b1cdbd2cSJim Jagielski 		SfxViewFrame *pFrame = pViewFrame->GetParentViewFrame();
395*b1cdbd2cSJim Jagielski 		if ( pFrame )
396*b1cdbd2cSJim Jagielski 			Construct_Impl(  pFrame->GetDispatcher() );
397*b1cdbd2cSJim Jagielski         else
398*b1cdbd2cSJim Jagielski             Construct_Impl( 0 );
399*b1cdbd2cSJim Jagielski 	}
400*b1cdbd2cSJim Jagielski 	else
401*b1cdbd2cSJim Jagielski 		Construct_Impl( 0 );
402*b1cdbd2cSJim Jagielski 	pImp->pFrame = pViewFrame;
403*b1cdbd2cSJim Jagielski }
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski //====================================================================
~SfxDispatcher()406*b1cdbd2cSJim Jagielski SfxDispatcher::~SfxDispatcher()
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski /*	[Beschreibung]
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski 	Der Destruktor der Klasse SfxDispatcher darf nicht gerufen werden,
411*b1cdbd2cSJim Jagielski 	wenn die SfxDispatcher-Instanz aktiv ist. Es d"urfen sich allerdings
412*b1cdbd2cSJim Jagielski 	noch <SfxShell>-Pointer auf dem Stack befinden.
413*b1cdbd2cSJim Jagielski */
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski {
416*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
417*b1cdbd2cSJim Jagielski 	ByteString sTemp( "Delete Dispatcher " );
418*b1cdbd2cSJim Jagielski 	sTemp += ByteString::CreateFromInt64( (sal_uIntPtr)this );
419*b1cdbd2cSJim Jagielski 	DBG_TRACE( sTemp.GetBuffer() );
420*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !pImp->bActive, "deleting active Dispatcher" );
421*b1cdbd2cSJim Jagielski #endif
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski 	// Damit in LeaveRegistrations kein Timer per Reschedule in PlugComm
424*b1cdbd2cSJim Jagielski 	// zuschlaegt
425*b1cdbd2cSJim Jagielski 	pImp->aTimer.Stop();
426*b1cdbd2cSJim Jagielski 	pImp->xPoster->SetEventHdl( Link() );
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski 	// die Stack-Varialblem in Call_Impl benachrichtigen
429*b1cdbd2cSJim Jagielski 	if ( pImp->pInCallAliveFlag )
430*b1cdbd2cSJim Jagielski 		*pImp->pInCallAliveFlag = sal_False;
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski 	// Bindings und App besorgen
433*b1cdbd2cSJim Jagielski 	SfxApplication *pSfxApp = SFX_APP();
434*b1cdbd2cSJim Jagielski     SfxBindings* pBindings = GetBindings();
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski //	if (pImp->nEventId)
437*b1cdbd2cSJim Jagielski //		pSfxApp->RemoveEventHdl(pImp->nEventId);
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski 	// wenn noch nicht flushed, die Bindings wiederbeleben
440*b1cdbd2cSJim Jagielski     if ( pBindings && !pSfxApp->IsDowning() && !bFlushed )
441*b1cdbd2cSJim Jagielski         pBindings->DLEAVEREGISTRATIONS();
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski 	// ggf. bei den Bindings abmelden
444*b1cdbd2cSJim Jagielski     while ( pBindings )
445*b1cdbd2cSJim Jagielski 	{
446*b1cdbd2cSJim Jagielski         if ( pBindings->GetDispatcher_Impl() == this)
447*b1cdbd2cSJim Jagielski             pBindings->SetDispatcher(0);
448*b1cdbd2cSJim Jagielski         pBindings = pBindings->GetSubBindings_Impl();
449*b1cdbd2cSJim Jagielski 	}
450*b1cdbd2cSJim Jagielski 
451*b1cdbd2cSJim Jagielski 	delete pImp;
452*b1cdbd2cSJim Jagielski }
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski //====================================================================
Pop(SfxShell & rShell,sal_uInt16 nMode)455*b1cdbd2cSJim Jagielski void SfxDispatcher::Pop
456*b1cdbd2cSJim Jagielski (
457*b1cdbd2cSJim Jagielski 	SfxShell&   rShell,     /*  Die vom Stack zu nehmende SfxShell-Instanz. */
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski 	sal_uInt16      nMode       /*  SFX_SHELL_POP_UNTIL
460*b1cdbd2cSJim Jagielski 								Es werden auch alle "uber 'rShell' liegenenden
461*b1cdbd2cSJim Jagielski 								SfxShell's vom Stack genommen.
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski 								SFX_SHELL_POP_DELETE
464*b1cdbd2cSJim Jagielski 								Alle tats"achlich vom Stack genommenen
465*b1cdbd2cSJim Jagielski 								SfxShells werden gel"oscht.
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski 								SFX_SHELL_PUSH (InPlace use only)
468*b1cdbd2cSJim Jagielski 								Die Shell wird gepusht. */
469*b1cdbd2cSJim Jagielski )
470*b1cdbd2cSJim Jagielski /*  [Beschreibung]
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski 	Mit dieser Methode wird eine oder mehrere <SfxShell> vom SfxDispatcher
473*b1cdbd2cSJim Jagielski 	gepoppt. Die SfxShell wird zun"achst zum poppen vermerkt und
474*b1cdbd2cSJim Jagielski 	es wird ein Timer aufgesetzt. Erst bei Ablauf des Timers wird
475*b1cdbd2cSJim Jagielski 	tats"achlich gepoppt (<SfxDispatcher::Flush()>) und die <SfxBindings>
476*b1cdbd2cSJim Jagielski 	werden invalidiert. W"ahrend der Timer l"auft gleichen sich
477*b1cdbd2cSJim Jagielski 	entgegengesetzte Push und Pop Befehle mit derselben SfxShell aus.
478*b1cdbd2cSJim Jagielski */
479*b1cdbd2cSJim Jagielski 
480*b1cdbd2cSJim Jagielski {
481*b1cdbd2cSJim Jagielski 	DBG_MEMTEST();
482*b1cdbd2cSJim Jagielski 	DBG_ASSERT( rShell.GetInterface(),
483*b1cdbd2cSJim Jagielski 				"pushing SfxShell without previous RegisterInterface()" );
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski 	bool bDelete = (nMode & SFX_SHELL_POP_DELETE) == SFX_SHELL_POP_DELETE;
486*b1cdbd2cSJim Jagielski 	bool bUntil = (nMode & SFX_SHELL_POP_UNTIL) == SFX_SHELL_POP_UNTIL;
487*b1cdbd2cSJim Jagielski 	bool bPush = (nMode & SFX_SHELL_PUSH) == SFX_SHELL_PUSH;
488*b1cdbd2cSJim Jagielski 
489*b1cdbd2cSJim Jagielski 	SfxApplication *pSfxApp = SFX_APP();
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
492*b1cdbd2cSJim Jagielski 	ByteString aMsg( "-SfxDispatcher(" );
493*b1cdbd2cSJim Jagielski 	aMsg += ByteString::CreateFromInt64( (sal_uIntPtr) this );
494*b1cdbd2cSJim Jagielski 	aMsg += bPush ? ")::Push(" : ")::Pop(";
495*b1cdbd2cSJim Jagielski 	if ( rShell.GetInterface() )
496*b1cdbd2cSJim Jagielski 		aMsg += rShell.GetInterface()->GetClassName();
497*b1cdbd2cSJim Jagielski 	else
498*b1cdbd2cSJim Jagielski 		aMsg += ByteString::CreateFromInt64( (sal_uIntPtr) &rShell );
499*b1cdbd2cSJim Jagielski 	aMsg += bDelete ? ") with delete" : ")";
500*b1cdbd2cSJim Jagielski     if ( bUntil ) aMsg += " (up to)";
501*b1cdbd2cSJim Jagielski 	DbgTrace( aMsg.GetBuffer() );
502*b1cdbd2cSJim Jagielski #endif
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski 	// gleiche Shell wie on-Top des ToDo-Stacks?
505*b1cdbd2cSJim Jagielski 	if ( pImp->aToDoStack.Count() && pImp->aToDoStack.Top().pCluster == &rShell )
506*b1cdbd2cSJim Jagielski 	{
507*b1cdbd2cSJim Jagielski 		// inverse Actions heben sich auf
508*b1cdbd2cSJim Jagielski 		if ( pImp->aToDoStack.Top().bPush != bPush )
509*b1cdbd2cSJim Jagielski 			pImp->aToDoStack.Pop();
510*b1cdbd2cSJim Jagielski 		else
511*b1cdbd2cSJim Jagielski 		{
512*b1cdbd2cSJim Jagielski 			DBG_ASSERT( bPush, "SfxInterface pushed more than once" );
513*b1cdbd2cSJim Jagielski 			DBG_ASSERT( !bPush, "SfxInterface popped more than once" );
514*b1cdbd2cSJim Jagielski 		}
515*b1cdbd2cSJim Jagielski 	}
516*b1cdbd2cSJim Jagielski 	else
517*b1cdbd2cSJim Jagielski 	{
518*b1cdbd2cSJim Jagielski 		// ::com::sun::star::chaos::Action merken
519*b1cdbd2cSJim Jagielski 		pImp->aToDoStack.Push( SfxToDo_Impl(bPush, bDelete, bUntil, rShell) );
520*b1cdbd2cSJim Jagielski 		if ( bFlushed )
521*b1cdbd2cSJim Jagielski 		{
522*b1cdbd2cSJim Jagielski 			DBG_TRACE("Unflushed dispatcher!");
523*b1cdbd2cSJim Jagielski 			bFlushed = sal_False;
524*b1cdbd2cSJim Jagielski 			pImp->bUpdated = sal_False;
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski 			// Bindings schlafen legen
527*b1cdbd2cSJim Jagielski             SfxBindings* pBindings = GetBindings();
528*b1cdbd2cSJim Jagielski             if ( pBindings )
529*b1cdbd2cSJim Jagielski                 pBindings->DENTERREGISTRATIONS();
530*b1cdbd2cSJim Jagielski 		}
531*b1cdbd2cSJim Jagielski 	}
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski 	if ( !pSfxApp->IsDowning() && pImp->aToDoStack.Count() )
534*b1cdbd2cSJim Jagielski 	{
535*b1cdbd2cSJim Jagielski 		//! if (SFX_APP()->AnyInput(INPUT_KEYBOARD | INPUT_MOUSE) )
536*b1cdbd2cSJim Jagielski 		//! AnyInput haut nicht hin; hier muss noch ein Kriterium gefunden
537*b1cdbd2cSJim Jagielski 		//! werden. Solange wieder immer mit Timer.
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski 		if (sal_True)
540*b1cdbd2cSJim Jagielski 		{
541*b1cdbd2cSJim Jagielski 			// Kein sofortiges Update gewuenscht
542*b1cdbd2cSJim Jagielski 			pImp->aTimer.SetTimeout(SFX_FLUSH_TIMEOUT);
543*b1cdbd2cSJim Jagielski 			pImp->aTimer.SetTimeoutHdl( LINK(this, SfxDispatcher, EventHdl_Impl ) );
544*b1cdbd2cSJim Jagielski 			pImp->aTimer.Start();
545*b1cdbd2cSJim Jagielski 		}
546*b1cdbd2cSJim Jagielski 		else
547*b1cdbd2cSJim Jagielski 		{
548*b1cdbd2cSJim Jagielski 			// Schnellstmoegliches Update (sollte Normalfall sein)
549*b1cdbd2cSJim Jagielski 			pImp->aTimer.Stop();
550*b1cdbd2cSJim Jagielski 			GetpApp()->PostUserEvent(pImp->nEventId, (void*)0);
551*b1cdbd2cSJim Jagielski 		}
552*b1cdbd2cSJim Jagielski 	}
553*b1cdbd2cSJim Jagielski 	else
554*b1cdbd2cSJim Jagielski 	{
555*b1cdbd2cSJim Jagielski 		// doch nichts zu tun
556*b1cdbd2cSJim Jagielski 		pImp->aTimer.Stop();
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski 		// ggf. Bindings wieder aufwecken
559*b1cdbd2cSJim Jagielski 		if ( !pImp->aToDoStack.Count() )
560*b1cdbd2cSJim Jagielski 		{
561*b1cdbd2cSJim Jagielski             SfxBindings* pBindings = GetBindings();
562*b1cdbd2cSJim Jagielski             if ( pBindings )
563*b1cdbd2cSJim Jagielski                 pBindings->DLEAVEREGISTRATIONS();
564*b1cdbd2cSJim Jagielski 		}
565*b1cdbd2cSJim Jagielski 	}
566*b1cdbd2cSJim Jagielski }
567*b1cdbd2cSJim Jagielski 
568*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
569*b1cdbd2cSJim Jagielski 
IMPL_LINK_INLINE_START(SfxDispatcher,EventHdl_Impl,void *,pvoid)570*b1cdbd2cSJim Jagielski IMPL_LINK_INLINE_START( SfxDispatcher, EventHdl_Impl, void *, pvoid )
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski /*	[Beschreibung]
573*b1cdbd2cSJim Jagielski 
574*b1cdbd2cSJim Jagielski 	Dieser Handler wird nach <SfxDispatcher::Invalidate()> oder Bewegungen
575*b1cdbd2cSJim Jagielski 	auf dem Stack (<SfxDispatcher::Push()> und <SfxDispatcher::Pop()) gerufen.
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 	Er flusht den Stack, falls er dirty ist, f"uhrt also die ausstehenden
578*b1cdbd2cSJim Jagielski 	Push und Pop Befehle tats"achlich aus.
579*b1cdbd2cSJim Jagielski */
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski {
582*b1cdbd2cSJim Jagielski     (void)pvoid; // unused
583*b1cdbd2cSJim Jagielski     DBG_MEMTEST();
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski 	Flush();
586*b1cdbd2cSJim Jagielski 	Update_Impl();
587*b1cdbd2cSJim Jagielski     SfxBindings* pBindings = GetBindings();
588*b1cdbd2cSJim Jagielski     if ( pBindings )
589*b1cdbd2cSJim Jagielski         pBindings->StartUpdate_Impl(sal_False);
590*b1cdbd2cSJim Jagielski 	return 0;
591*b1cdbd2cSJim Jagielski }
IMPL_LINK_INLINE_END(SfxDispatcher,EventHdl_Impl,void *,pvoid)592*b1cdbd2cSJim Jagielski IMPL_LINK_INLINE_END( SfxDispatcher, EventHdl_Impl, void *, pvoid )
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
595*b1cdbd2cSJim Jagielski sal_Bool SfxDispatcher::CheckVirtualStack( const SfxShell& rShell, sal_Bool bDeep )
596*b1cdbd2cSJim Jagielski 
597*b1cdbd2cSJim Jagielski /*	[Beschreibung]
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski 	Mit dieser Methode kann gepr"uft werden, ob sich die <SfxShell> rShell
600*b1cdbd2cSJim Jagielski 	auf dem Stack befindet, wenn er geflusht w"are. Dabei wird der
601*b1cdbd2cSJim Jagielski 	SfxDispatcher jedoch nicht tats"achlich geflusht.
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 	Diese Methode ist u.a. dazu gedacht, Assertions zu erm"oglichen, ohne
604*b1cdbd2cSJim Jagielski 	als Seiteneffekt den SfxDispathcer flushen zu m"ussen.
605*b1cdbd2cSJim Jagielski */
606*b1cdbd2cSJim Jagielski 
607*b1cdbd2cSJim Jagielski {
608*b1cdbd2cSJim Jagielski 	DBG_MEMTEST();
609*b1cdbd2cSJim Jagielski 	SFX_STACK(SfxDispatcher::CheckVirtualStack);
610*b1cdbd2cSJim Jagielski 
611*b1cdbd2cSJim Jagielski 	SfxShellStack_Impl aStack( pImp->aStack );
612*b1cdbd2cSJim Jagielski 	for ( short nToDo = pImp->aToDoStack.Count()-1; nToDo >= 0; --nToDo )
613*b1cdbd2cSJim Jagielski 	{
614*b1cdbd2cSJim Jagielski 		SfxToDo_Impl aToDo( pImp->aToDoStack.Top(nToDo) );
615*b1cdbd2cSJim Jagielski 		if ( aToDo.bPush )
616*b1cdbd2cSJim Jagielski 			aStack.Push( (SfxShell*) aToDo.pCluster );
617*b1cdbd2cSJim Jagielski 		else
618*b1cdbd2cSJim Jagielski 		{
619*b1cdbd2cSJim Jagielski 			SfxShell* pPopped = 0;
620*b1cdbd2cSJim Jagielski 			do
621*b1cdbd2cSJim Jagielski 			{
622*b1cdbd2cSJim Jagielski 				DBG_ASSERT( aStack.Count(), "popping from empty stack" );
623*b1cdbd2cSJim Jagielski 				pPopped = aStack.Pop();
624*b1cdbd2cSJim Jagielski 			}
625*b1cdbd2cSJim Jagielski 			while ( aToDo.bUntil && pPopped != aToDo.pCluster );
626*b1cdbd2cSJim Jagielski 			DBG_ASSERT( pPopped == aToDo.pCluster, "popping unpushed SfxInterface" );
627*b1cdbd2cSJim Jagielski 		}
628*b1cdbd2cSJim Jagielski 	}
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski 	sal_Bool bReturn;
631*b1cdbd2cSJim Jagielski 	if ( bDeep )
632*b1cdbd2cSJim Jagielski 		bReturn = aStack.Contains(&rShell);
633*b1cdbd2cSJim Jagielski 	else
634*b1cdbd2cSJim Jagielski 		bReturn = aStack.Top() == &rShell;
635*b1cdbd2cSJim Jagielski 	return bReturn;
636*b1cdbd2cSJim Jagielski }
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
GetShellLevel(const SfxShell & rShell)639*b1cdbd2cSJim Jagielski sal_uInt16 SfxDispatcher::GetShellLevel( const SfxShell& rShell )
640*b1cdbd2cSJim Jagielski 
641*b1cdbd2cSJim Jagielski /*	[Beschreibung]
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski 	Ermittelt die Position einer SfxShell im Stack des Dispatchers.
644*b1cdbd2cSJim Jagielski 	Dazu wird dieser ggf. zuvor geflusht.
645*b1cdbd2cSJim Jagielski 
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski     [Rueckgabewert]
648*b1cdbd2cSJim Jagielski 
649*b1cdbd2cSJim Jagielski 	sal_uInt16						== USRT_MAX
650*b1cdbd2cSJim Jagielski 								Die SfxShell befindet sich nicht auf
651*b1cdbd2cSJim Jagielski 								diesem SfxDispatcher.
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski 								< USHRT_MAX
654*b1cdbd2cSJim Jagielski 								Position der SfxShell auf dem Dispatcher
655*b1cdbd2cSJim Jagielski 								von oben mit 0 beginnend gez"ahlt.
656*b1cdbd2cSJim Jagielski */
657*b1cdbd2cSJim Jagielski 
658*b1cdbd2cSJim Jagielski {
659*b1cdbd2cSJim Jagielski 	DBG_MEMTEST();
660*b1cdbd2cSJim Jagielski 	SFX_STACK(SfxDispatcher::GetShellLevel);
661*b1cdbd2cSJim Jagielski 	Flush();
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 n = 0; n < pImp->aStack.Count(); ++n )
664*b1cdbd2cSJim Jagielski 		if ( pImp->aStack.Top( n ) == &rShell )
665*b1cdbd2cSJim Jagielski 			return n;
666*b1cdbd2cSJim Jagielski 	if ( pImp->pParent )
667*b1cdbd2cSJim Jagielski     {
668*b1cdbd2cSJim Jagielski         sal_uInt16 nRet = pImp->pParent->GetShellLevel(rShell);
669*b1cdbd2cSJim Jagielski         if ( nRet == USHRT_MAX )
670*b1cdbd2cSJim Jagielski             return nRet;
671*b1cdbd2cSJim Jagielski         return  nRet + pImp->aStack.Count();
672*b1cdbd2cSJim Jagielski     }
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski 	return USHRT_MAX;
675*b1cdbd2cSJim Jagielski }
676*b1cdbd2cSJim Jagielski 
677*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
GetShell(sal_uInt16 nIdx) const678*b1cdbd2cSJim Jagielski SfxShell *SfxDispatcher::GetShell(sal_uInt16 nIdx) const
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski /*	[Beschreibung]
681*b1cdbd2cSJim Jagielski 
682*b1cdbd2cSJim Jagielski 	Liefert einen Pointer auf die <SfxShell>, welche sich an der Position
683*b1cdbd2cSJim Jagielski 	nIdx (von oben, letzt-gepushte liegt bei 0) auf dem Stack befindet.
684*b1cdbd2cSJim Jagielski 
685*b1cdbd2cSJim Jagielski 	Dabei wird der SfxDispatcher nicht geflusht.
686*b1cdbd2cSJim Jagielski 
687*b1cdbd2cSJim Jagielski 	Ist der Stack nicht tief genug, wird ein 0-Pointer zur"uckgegeben.
688*b1cdbd2cSJim Jagielski */
689*b1cdbd2cSJim Jagielski 
690*b1cdbd2cSJim Jagielski {
691*b1cdbd2cSJim Jagielski 	DBG_MEMTEST();
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski 	sal_uInt16 nShellCount = pImp->aStack.Count();
694*b1cdbd2cSJim Jagielski 	if ( nIdx < nShellCount )
695*b1cdbd2cSJim Jagielski 		return pImp->aStack.Top(nIdx);
696*b1cdbd2cSJim Jagielski 	else if ( pImp->pParent )
697*b1cdbd2cSJim Jagielski 		return pImp->pParent->GetShell(	nIdx - nShellCount );
698*b1cdbd2cSJim Jagielski 	return 0;
699*b1cdbd2cSJim Jagielski }
700*b1cdbd2cSJim Jagielski 
701*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
GetBindings() const702*b1cdbd2cSJim Jagielski SfxBindings* SfxDispatcher::GetBindings() const
703*b1cdbd2cSJim Jagielski 
704*b1cdbd2cSJim Jagielski /*	[Beschreibung]
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski 	Diese Methode liefert einen Pointer auf die <SfxBindings> Instanz
707*b1cdbd2cSJim Jagielski 	zur"uck, an die der SfxDispatcher gerade gebunden ist. Ein SfxDispatcher
708*b1cdbd2cSJim Jagielski 	ist nur dann an SfxBindings gebunden, wenn er <UI-aktiv> ist. Ist
709*b1cdbd2cSJim Jagielski 	er nicht UI-aktiv, wird ein 0-Pointer zur"uckgegeben.
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski 	Der zur"uckgegebene Pointer ist nur im <unmittelbaren Kontext> des
712*b1cdbd2cSJim Jagielski 	Methodenaufrufs g"ultig.
713*b1cdbd2cSJim Jagielski */
714*b1cdbd2cSJim Jagielski 
715*b1cdbd2cSJim Jagielski {
716*b1cdbd2cSJim Jagielski 	if ( pImp->pFrame )
717*b1cdbd2cSJim Jagielski 		return &pImp->pFrame->GetBindings();
718*b1cdbd2cSJim Jagielski     else
719*b1cdbd2cSJim Jagielski         return NULL;
720*b1cdbd2cSJim Jagielski }
721*b1cdbd2cSJim Jagielski 
722*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
GetFrame() const723*b1cdbd2cSJim Jagielski SfxViewFrame* SfxDispatcher::GetFrame() const
724*b1cdbd2cSJim Jagielski 
725*b1cdbd2cSJim Jagielski /*	[Beschreibung]
726*b1cdbd2cSJim Jagielski 
727*b1cdbd2cSJim Jagielski 	Liefert einen Pointer auf die <SfxViewFrame> Instanz, der dieser
728*b1cdbd2cSJim Jagielski 	SfxDispatcher geh"ort. Falls es sich um den Applikations-Dispatcher
729*b1cdbd2cSJim Jagielski 	handelt, wird ein 0-Pointer zur"uckgegeben.
730*b1cdbd2cSJim Jagielski */
731*b1cdbd2cSJim Jagielski 
732*b1cdbd2cSJim Jagielski {
733*b1cdbd2cSJim Jagielski 	DBG_MEMTEST();
734*b1cdbd2cSJim Jagielski 	return pImp->pFrame;
735*b1cdbd2cSJim Jagielski }
736*b1cdbd2cSJim Jagielski 
737*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
DoActivate_Impl(sal_Bool bMDI,SfxViewFrame *)738*b1cdbd2cSJim Jagielski void SfxDispatcher::DoActivate_Impl( sal_Bool bMDI, SfxViewFrame* /* pOld */ )
739*b1cdbd2cSJim Jagielski 
740*b1cdbd2cSJim Jagielski /*	[Beschreibung]
741*b1cdbd2cSJim Jagielski 
742*b1cdbd2cSJim Jagielski 	Diese Methode steuert das Aktivieren eines Dispatchers.
743*b1cdbd2cSJim Jagielski 
744*b1cdbd2cSJim Jagielski 	Da der Applikations-Dispatcher immer aktiv ist, entweder als
745*b1cdbd2cSJim Jagielski 	Unterdispatcher des <SfxViewFrame>-Dispatchers oder selbst, wird
746*b1cdbd2cSJim Jagielski 	er nie als ganzes Aktiviert, sondern nur seine einzelnen <SfxShell>s
747*b1cdbd2cSJim Jagielski 	bei <SfxDispatcher::Push(SfxShell&)>.
748*b1cdbd2cSJim Jagielski 
749*b1cdbd2cSJim Jagielski 	Beim Aktivieren eines SfxDispatchers wird an allen auf seinem
750*b1cdbd2cSJim Jagielski 	Stack befindlichen SfxShells, beginnend mit der untersten, der Handler
751*b1cdbd2cSJim Jagielski 	<SfxShell::Activate(sal_Bool)> gerufen.
752*b1cdbd2cSJim Jagielski */
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski {
755*b1cdbd2cSJim Jagielski 	DBG_MEMTEST();
756*b1cdbd2cSJim Jagielski 	SFX_STACK(SfxDispatcher::DoActivate);
757*b1cdbd2cSJim Jagielski 	if ( bMDI )
758*b1cdbd2cSJim Jagielski 	{
759*b1cdbd2cSJim Jagielski 		#ifdef DBG_UTIL
760*b1cdbd2cSJim Jagielski 		ByteString sTemp("Activate Dispatcher ");
761*b1cdbd2cSJim Jagielski 		sTemp += ByteString::CreateFromInt64( (sal_uIntPtr) this );
762*b1cdbd2cSJim Jagielski 		DBG_TRACE(sTemp.GetBuffer());
763*b1cdbd2cSJim Jagielski 		DBG_ASSERT( !pImp->bActive, "Activate-Fehler" );
764*b1cdbd2cSJim Jagielski 		#endif
765*b1cdbd2cSJim Jagielski 		pImp->bActive = sal_True;
766*b1cdbd2cSJim Jagielski 		pImp->bUpdated = sal_False;
767*b1cdbd2cSJim Jagielski         SfxBindings* pBindings = GetBindings();
768*b1cdbd2cSJim Jagielski         if ( pBindings )
769*b1cdbd2cSJim Jagielski         {
770*b1cdbd2cSJim Jagielski             pBindings->SetDispatcher(this);
771*b1cdbd2cSJim Jagielski             pBindings->SetActiveFrame( pImp->pFrame->GetFrame().GetFrameInterface() );
772*b1cdbd2cSJim Jagielski         }
773*b1cdbd2cSJim Jagielski 	}
774*b1cdbd2cSJim Jagielski 	else
775*b1cdbd2cSJim Jagielski 	{
776*b1cdbd2cSJim Jagielski 		#ifdef DBG_UTIL
777*b1cdbd2cSJim Jagielski 		ByteString sTemp("Non-MDI-Activate Dispatcher");
778*b1cdbd2cSJim Jagielski 		sTemp += ByteString::CreateFromInt64( (sal_uIntPtr) this );
779*b1cdbd2cSJim Jagielski 		DBG_TRACE( sTemp.GetBuffer() );
780*b1cdbd2cSJim Jagielski 		#endif
781*b1cdbd2cSJim Jagielski 	}
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski 	if ( IsAppDispatcher() )
784*b1cdbd2cSJim Jagielski 		return;
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski 	for ( int i = int(pImp->aStack.Count()) - 1; i >= 0; --i )
787*b1cdbd2cSJim Jagielski 		pImp->aStack.Top( (sal_uInt16) i )->DoActivate_Impl(pImp->pFrame, bMDI);
788*b1cdbd2cSJim Jagielski 
789*b1cdbd2cSJim Jagielski     if ( bMDI && pImp->pFrame )
790*b1cdbd2cSJim Jagielski     {
791*b1cdbd2cSJim Jagielski         //SfxWorkWindow *pWorkWin = pImp->pFrame->GetFrame().GetWorkWindow_Impl();
792*b1cdbd2cSJim Jagielski         SfxBindings *pBind = GetBindings();
793*b1cdbd2cSJim Jagielski         while ( pBind )
794*b1cdbd2cSJim Jagielski         {
795*b1cdbd2cSJim Jagielski             pBind->HidePopupCtrls_Impl( sal_False );
796*b1cdbd2cSJim Jagielski             pBind = pBind->GetSubBindings_Impl();
797*b1cdbd2cSJim Jagielski         }
798*b1cdbd2cSJim Jagielski 
799*b1cdbd2cSJim Jagielski         pImp->pFrame->GetFrame().GetWorkWindow_Impl()->HidePopups_Impl( sal_False, sal_False, 1 );
800*b1cdbd2cSJim Jagielski     }
801*b1cdbd2cSJim Jagielski 
802*b1cdbd2cSJim Jagielski 	if ( pImp->aToDoStack.Count() )
803*b1cdbd2cSJim Jagielski 	{
804*b1cdbd2cSJim Jagielski 		if (sal_True)
805*b1cdbd2cSJim Jagielski 		{
806*b1cdbd2cSJim Jagielski 			// Kein sofortiges Update gewuenscht
807*b1cdbd2cSJim Jagielski 			pImp->aTimer.SetTimeout(SFX_FLUSH_TIMEOUT);
808*b1cdbd2cSJim Jagielski 			pImp->aTimer.SetTimeoutHdl( LINK(this, SfxDispatcher, EventHdl_Impl ) );
809*b1cdbd2cSJim Jagielski 			pImp->aTimer.Start();
810*b1cdbd2cSJim Jagielski 		}
811*b1cdbd2cSJim Jagielski 		else
812*b1cdbd2cSJim Jagielski 		{
813*b1cdbd2cSJim Jagielski 			// Schnellstmoegliches Update (sollte Normalfall sein)
814*b1cdbd2cSJim Jagielski 			pImp->aTimer.Stop();
815*b1cdbd2cSJim Jagielski 			GetpApp()->PostUserEvent(pImp->nEventId, (void*)0);
816*b1cdbd2cSJim Jagielski 		}
817*b1cdbd2cSJim Jagielski 	}
818*b1cdbd2cSJim Jagielski }
819*b1cdbd2cSJim Jagielski 
DoParentActivate_Impl()820*b1cdbd2cSJim Jagielski void SfxDispatcher::DoParentActivate_Impl()
821*b1cdbd2cSJim Jagielski {
822*b1cdbd2cSJim Jagielski 	for ( int i = int(pImp->aStack.Count()) - 1; i >= 0; --i )
823*b1cdbd2cSJim Jagielski 		pImp->aStack.Top( (sal_uInt16) i )->ParentActivate();
824*b1cdbd2cSJim Jagielski }
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
DoDeactivate_Impl(sal_Bool bMDI,SfxViewFrame * pNew)827*b1cdbd2cSJim Jagielski void SfxDispatcher::DoDeactivate_Impl( sal_Bool bMDI, SfxViewFrame* pNew )
828*b1cdbd2cSJim Jagielski 
829*b1cdbd2cSJim Jagielski /*  [Beschreibung]
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski 	Diese Methode steuert das Deaktivieren eines Dispatchers.
832*b1cdbd2cSJim Jagielski 
833*b1cdbd2cSJim Jagielski 	Da der Applikations-Dispatcher immer aktiv ist, entweder als
834*b1cdbd2cSJim Jagielski 	Unterdispatcher des <SfxViewFrame>-Dispatchers oder selbst, wird
835*b1cdbd2cSJim Jagielski 	er nie als ganzes Deaktiviert, sondern nur seine einzelnen <SfxShell>s
836*b1cdbd2cSJim Jagielski 	bei <SfxDispatcher::Pop(SfxShell&)>.
837*b1cdbd2cSJim Jagielski 
838*b1cdbd2cSJim Jagielski 	Beim Deaktivieren eines SfxDispatchers wird an allen auf seinem
839*b1cdbd2cSJim Jagielski 	Stack befindlichen SfxShells, beginnend mit der obersten, der Handler
840*b1cdbd2cSJim Jagielski 	<SfxShell::Deactivate(sal_Bool)> gerufen.
841*b1cdbd2cSJim Jagielski */
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski {
844*b1cdbd2cSJim Jagielski 	DBG_MEMTEST();
845*b1cdbd2cSJim Jagielski 	SFX_STACK(SfxDispatcher::DoDeactivate);
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski 	SfxApplication *pSfxApp = SFX_APP();
848*b1cdbd2cSJim Jagielski 
849*b1cdbd2cSJim Jagielski 	if ( bMDI )
850*b1cdbd2cSJim Jagielski 	{
851*b1cdbd2cSJim Jagielski 		DBG_TRACE(ByteString("Deactivate Dispatcher ").Append(ByteString::CreateFromInt64( (sal_uIntPtr) this )).GetBuffer());
852*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pImp->bActive, "Deactivate-Fehler" );
853*b1cdbd2cSJim Jagielski 		pImp->bActive = sal_False;
854*b1cdbd2cSJim Jagielski 
855*b1cdbd2cSJim Jagielski         if ( pImp->pFrame && !(pImp->pFrame->GetObjectShell()->IsInPlaceActive() ) )
856*b1cdbd2cSJim Jagielski 		{
857*b1cdbd2cSJim Jagielski             SfxWorkWindow *pWorkWin = pImp->pFrame->GetFrame().GetWorkWindow_Impl();
858*b1cdbd2cSJim Jagielski             if ( pWorkWin )
859*b1cdbd2cSJim Jagielski             {
860*b1cdbd2cSJim Jagielski                 for (sal_uInt16 n=0; n<pImp->aChildWins.Count();)
861*b1cdbd2cSJim Jagielski                 {
862*b1cdbd2cSJim Jagielski                     SfxChildWindow *pWin = pWorkWin->GetChildWindow_Impl( (sal_uInt16) ( pImp->aChildWins[n] & 0xFFFF ) );
863*b1cdbd2cSJim Jagielski                     if (!pWin || (pWin && pWin->GetAlignment() == SFX_ALIGN_NOALIGNMENT))
864*b1cdbd2cSJim Jagielski                         pImp->aChildWins.Remove(n);
865*b1cdbd2cSJim Jagielski                     else
866*b1cdbd2cSJim Jagielski                         n++;
867*b1cdbd2cSJim Jagielski                 }
868*b1cdbd2cSJim Jagielski             }
869*b1cdbd2cSJim Jagielski 		}
870*b1cdbd2cSJim Jagielski 	}
871*b1cdbd2cSJim Jagielski 	else {
872*b1cdbd2cSJim Jagielski 		DBG_TRACE( ByteString ("Non-MDI-DeActivate Dispatcher").Append(ByteString::CreateFromInt64( (sal_uIntPtr) this )).GetBuffer() );
873*b1cdbd2cSJim Jagielski     }
874*b1cdbd2cSJim Jagielski 
875*b1cdbd2cSJim Jagielski 	if ( IsAppDispatcher() && !pSfxApp->IsDowning() )
876*b1cdbd2cSJim Jagielski 		return;
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < pImp->aStack.Count(); ++i )
879*b1cdbd2cSJim Jagielski 		pImp->aStack.Top(i)->DoDeactivate_Impl(pImp->pFrame, bMDI);
880*b1cdbd2cSJim Jagielski 
881*b1cdbd2cSJim Jagielski     sal_Bool bHidePopups = bMDI && pImp->pFrame;
882*b1cdbd2cSJim Jagielski     if ( pNew && pImp->pFrame )
883*b1cdbd2cSJim Jagielski     {
884*b1cdbd2cSJim Jagielski         com::sun::star::uno::Reference< com::sun::star::frame::XFrame > xOldFrame(
885*b1cdbd2cSJim Jagielski             pNew->GetFrame().GetFrameInterface()->getCreator(), com::sun::star::uno::UNO_QUERY );
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski         com::sun::star::uno::Reference< com::sun::star::frame::XFrame > xMyFrame(
888*b1cdbd2cSJim Jagielski             GetFrame()->GetFrame().GetFrameInterface(), com::sun::star::uno::UNO_QUERY );
889*b1cdbd2cSJim Jagielski 
890*b1cdbd2cSJim Jagielski         if ( xOldFrame == xMyFrame )
891*b1cdbd2cSJim Jagielski             bHidePopups = sal_False;
892*b1cdbd2cSJim Jagielski     }
893*b1cdbd2cSJim Jagielski 
894*b1cdbd2cSJim Jagielski     if ( bHidePopups )
895*b1cdbd2cSJim Jagielski     {
896*b1cdbd2cSJim Jagielski         //SfxWorkWindow *pWorkWin = pImp->pFrame->GetFrame().GetWorkWindow_Impl();
897*b1cdbd2cSJim Jagielski         SfxBindings *pBind = GetBindings();
898*b1cdbd2cSJim Jagielski         while ( pBind )
899*b1cdbd2cSJim Jagielski         {
900*b1cdbd2cSJim Jagielski             pBind->HidePopupCtrls_Impl( sal_True );
901*b1cdbd2cSJim Jagielski             pBind = pBind->GetSubBindings_Impl();
902*b1cdbd2cSJim Jagielski         }
903*b1cdbd2cSJim Jagielski 
904*b1cdbd2cSJim Jagielski         pImp->pFrame->GetFrame().GetWorkWindow_Impl()->HidePopups_Impl( sal_True, sal_False, 1 );
905*b1cdbd2cSJim Jagielski     }
906*b1cdbd2cSJim Jagielski 
907*b1cdbd2cSJim Jagielski 	Flush();
908*b1cdbd2cSJim Jagielski }
909*b1cdbd2cSJim Jagielski 
DoParentDeactivate_Impl()910*b1cdbd2cSJim Jagielski void SfxDispatcher::DoParentDeactivate_Impl()
911*b1cdbd2cSJim Jagielski {
912*b1cdbd2cSJim Jagielski 	for ( int i = int(pImp->aStack.Count()) - 1; i >= 0; --i )
913*b1cdbd2cSJim Jagielski 		pImp->aStack.Top( (sal_uInt16) i )->ParentDeactivate();
914*b1cdbd2cSJim Jagielski }
915*b1cdbd2cSJim Jagielski 
916*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
GetShellAndSlot_Impl(sal_uInt16 nSlot,SfxShell ** ppShell,const SfxSlot ** ppSlot,sal_Bool bOwnShellsOnly,sal_Bool bModal,sal_Bool bRealSlot)917*b1cdbd2cSJim Jagielski int SfxDispatcher::GetShellAndSlot_Impl
918*b1cdbd2cSJim Jagielski (
919*b1cdbd2cSJim Jagielski 	sal_uInt16			nSlot,		// die zu suchende Slot-Id
920*b1cdbd2cSJim Jagielski 	SfxShell**		ppShell,	// die SfxShell, welche nSlot z.Zt. bedient
921*b1cdbd2cSJim Jagielski 	const SfxSlot** ppSlot, 	// der SfxSlot, welcher nSlot z.Zt. bedient
922*b1cdbd2cSJim Jagielski 	sal_Bool			bOwnShellsOnly,
923*b1cdbd2cSJim Jagielski 	sal_Bool			bModal,		// trotz ModalMode
924*b1cdbd2cSJim Jagielski 	sal_Bool		bRealSlot
925*b1cdbd2cSJim Jagielski )
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski /*	[Beschreibung]
928*b1cdbd2cSJim Jagielski 
929*b1cdbd2cSJim Jagielski 	Diese Methode sucht im SfxDispatcher nach der <SfxShell>, von der
930*b1cdbd2cSJim Jagielski 	die Slot-Id nSlot zur Zeit bedient wird. Dazu wird der Dispatcher
931*b1cdbd2cSJim Jagielski 	zuvor geflusht.
932*b1cdbd2cSJim Jagielski 
933*b1cdbd2cSJim Jagielski 
934*b1cdbd2cSJim Jagielski 	[R"uckgabewert]
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski 	int 				sal_True
937*b1cdbd2cSJim Jagielski 						Die SfxShell wurde gefunden, ppShell und ppSlot
938*b1cdbd2cSJim Jagielski 						sind g"ultig.
939*b1cdbd2cSJim Jagielski 
940*b1cdbd2cSJim Jagielski 						sal_True
941*b1cdbd2cSJim Jagielski 						Die SfxShell wurde nicht gefunden, ppShell und ppSlot
942*b1cdbd2cSJim Jagielski 						sind ung"ultig.
943*b1cdbd2cSJim Jagielski */
944*b1cdbd2cSJim Jagielski 
945*b1cdbd2cSJim Jagielski {
946*b1cdbd2cSJim Jagielski 	SFX_STACK(SfxDispatcher::GetShellAndSlot_Impl);
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski 	Flush();
949*b1cdbd2cSJim Jagielski 	SfxSlotServer aSvr;
950*b1cdbd2cSJim Jagielski 	if ( _FindServer(nSlot, aSvr, bModal) )
951*b1cdbd2cSJim Jagielski 	{
952*b1cdbd2cSJim Jagielski 		if ( bOwnShellsOnly && aSvr.GetShellLevel() >= pImp->aStack.Count() )
953*b1cdbd2cSJim Jagielski 			return sal_False;
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski 		*ppShell = GetShell(aSvr.GetShellLevel());
956*b1cdbd2cSJim Jagielski 		*ppSlot = aSvr.GetSlot();
957*b1cdbd2cSJim Jagielski 		if ( 0 == (*ppSlot)->GetExecFnc() && bRealSlot )
958*b1cdbd2cSJim Jagielski 			*ppSlot = (*ppShell)->GetInterface()->GetRealSlot(*ppSlot);
959*b1cdbd2cSJim Jagielski 		// Check only real slots as enum slots don't have an execute function!
960*b1cdbd2cSJim Jagielski         if ( bRealSlot && ((0 == *ppSlot) || (0 == (*ppSlot)->GetExecFnc()) ))
961*b1cdbd2cSJim Jagielski 			return sal_False;
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski #ifdef DBG_UTILx
964*b1cdbd2cSJim Jagielski 		ByteString aMsg( nSlot );
965*b1cdbd2cSJim Jagielski 		aMsg += " found in ";
966*b1cdbd2cSJim Jagielski 		aMsg += (*ppShell)->GetInterface()->GetClassName();
967*b1cdbd2cSJim Jagielski 		DbgTrace( aMsg.GetBuffer() );
968*b1cdbd2cSJim Jagielski #endif
969*b1cdbd2cSJim Jagielski 
970*b1cdbd2cSJim Jagielski 		return sal_True;
971*b1cdbd2cSJim Jagielski 	}
972*b1cdbd2cSJim Jagielski 
973*b1cdbd2cSJim Jagielski #ifdef DBG_UTILx
974*b1cdbd2cSJim Jagielski 	ByteString aMsg( nSlot );
975*b1cdbd2cSJim Jagielski 	aMsg += " not found";
976*b1cdbd2cSJim Jagielski 	DbgTrace( aMsg.GetBuffer() );
977*b1cdbd2cSJim Jagielski #endif
978*b1cdbd2cSJim Jagielski 
979*b1cdbd2cSJim Jagielski 	return sal_False;
980*b1cdbd2cSJim Jagielski }
981*b1cdbd2cSJim Jagielski 
982*b1cdbd2cSJim Jagielski /*
983*b1cdbd2cSJim Jagielski struct Executer : public SfxHint
984*b1cdbd2cSJim Jagielski {
985*b1cdbd2cSJim Jagielski     SfxRequest *pRequest;
986*b1cdbd2cSJim Jagielski     const SfxSlot* pSlot;
987*b1cdbd2cSJim Jagielski     sal_uInt16 nLevel;
988*b1cdbd2cSJim Jagielski 
989*b1cdbd2cSJim Jagielski     Executer( SfxRequest* pReq, const SfxSlot* p, sal_uInt16 n )
990*b1cdbd2cSJim Jagielski         :  pRequest( pReq )
991*b1cdbd2cSJim Jagielski         , pSlot(p)
992*b1cdbd2cSJim Jagielski         , nLevel(n)
993*b1cdbd2cSJim Jagielski         {}
994*b1cdbd2cSJim Jagielski     ~Executer()
995*b1cdbd2cSJim Jagielski     {delete pRequest;}
996*b1cdbd2cSJim Jagielski };
997*b1cdbd2cSJim Jagielski */
998*b1cdbd2cSJim Jagielski 
999*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
_Execute(SfxShell & rShell,const SfxSlot & rSlot,SfxRequest & rReq,SfxCallMode eCallMode)1000*b1cdbd2cSJim Jagielski void SfxDispatcher::_Execute
1001*b1cdbd2cSJim Jagielski (
1002*b1cdbd2cSJim Jagielski 	SfxShell&		rShell,		// zu rufende <SfxShell>
1003*b1cdbd2cSJim Jagielski 	const SfxSlot&	rSlot,		// zu rufender <SfxSlot>
1004*b1cdbd2cSJim Jagielski 	SfxRequest&		rReq,		// auszuf"uhrende Funktion (Id und optional Parameter)
1005*b1cdbd2cSJim Jagielski 	SfxCallMode 	eCallMode	// synchron, asynchron oder wie beim Slot angegeben
1006*b1cdbd2cSJim Jagielski )
1007*b1cdbd2cSJim Jagielski 
1008*b1cdbd2cSJim Jagielski /*	[Beschreibung]
1009*b1cdbd2cSJim Jagielski 
1010*b1cdbd2cSJim Jagielski 	Diese Methode f"uhrt einen Request "uber einen gecachten <Slot-Server>
1011*b1cdbd2cSJim Jagielski 	aus.
1012*b1cdbd2cSJim Jagielski */
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski {
1015*b1cdbd2cSJim Jagielski 	DBG_MEMTEST();
1016*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !pImp->bFlushing, "recursive call to dispatcher" );
1017*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !pImp->aToDoStack.Count(), "unprepared InPlace _Execute" );
1018*b1cdbd2cSJim Jagielski 
1019*b1cdbd2cSJim Jagielski 	if ( IsLocked( rSlot.GetSlotId() ) )
1020*b1cdbd2cSJim Jagielski 		return;
1021*b1cdbd2cSJim Jagielski 
1022*b1cdbd2cSJim Jagielski 	if ( (eCallMode & SFX_CALLMODE_ASYNCHRON) ||
1023*b1cdbd2cSJim Jagielski 		 ( !(eCallMode & SFX_CALLMODE_SYNCHRON) &&
1024*b1cdbd2cSJim Jagielski 		   rSlot.IsMode(SFX_SLOT_ASYNCHRON) ) )
1025*b1cdbd2cSJim Jagielski 	{
1026*b1cdbd2cSJim Jagielski 		SfxDispatcher *pDispat = this;
1027*b1cdbd2cSJim Jagielski 		while ( pDispat )
1028*b1cdbd2cSJim Jagielski 		{
1029*b1cdbd2cSJim Jagielski 			sal_uInt16 nShellCount = pDispat->pImp->aStack.Count();
1030*b1cdbd2cSJim Jagielski 			for ( sal_uInt16 n=0; n<nShellCount; n++ )
1031*b1cdbd2cSJim Jagielski 			{
1032*b1cdbd2cSJim Jagielski 				if ( &rShell == pDispat->pImp->aStack.Top(n) )
1033*b1cdbd2cSJim Jagielski 				{
1034*b1cdbd2cSJim Jagielski                     if ( eCallMode & SFX_CALLMODE_RECORD )
1035*b1cdbd2cSJim Jagielski                         rReq.AllowRecording( sal_True );
1036*b1cdbd2cSJim Jagielski                     pDispat->pImp->xPoster->Post(new SfxRequest(rReq));
1037*b1cdbd2cSJim Jagielski //                    pDispat->pImp->xPoster->Post(new Executer(new SfxRequest(rReq), &rSlot, n ));
1038*b1cdbd2cSJim Jagielski 					return;
1039*b1cdbd2cSJim Jagielski 				}
1040*b1cdbd2cSJim Jagielski 			}
1041*b1cdbd2cSJim Jagielski 
1042*b1cdbd2cSJim Jagielski 			pDispat = pDispat->pImp->pParent;
1043*b1cdbd2cSJim Jagielski 		}
1044*b1cdbd2cSJim Jagielski 	}
1045*b1cdbd2cSJim Jagielski 	else
1046*b1cdbd2cSJim Jagielski 		Call_Impl( rShell, rSlot, rReq, SFX_CALLMODE_RECORD==(eCallMode&SFX_CALLMODE_RECORD) );
1047*b1cdbd2cSJim Jagielski }
1048*b1cdbd2cSJim Jagielski 
1049*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
MappedPut_Impl(SfxAllItemSet & rSet,const SfxPoolItem & rItem)1050*b1cdbd2cSJim Jagielski void MappedPut_Impl( SfxAllItemSet &rSet, const SfxPoolItem &rItem )
1051*b1cdbd2cSJim Jagielski 
1052*b1cdbd2cSJim Jagielski /*	[Beschreibung]
1053*b1cdbd2cSJim Jagielski 
1054*b1cdbd2cSJim Jagielski 	Hilfsfunktion zum putten von rItem unter der im Pool des Item-Sets
1055*b1cdbd2cSJim Jagielski 	rSet geltenden Which-Id.
1056*b1cdbd2cSJim Jagielski */
1057*b1cdbd2cSJim Jagielski 
1058*b1cdbd2cSJim Jagielski {
1059*b1cdbd2cSJim Jagielski 	// mit ggf. gemappter Which-Id putten
1060*b1cdbd2cSJim Jagielski 	const SfxItemPool *pPool = rSet.GetPool();
1061*b1cdbd2cSJim Jagielski 	sal_uInt16 nWhich = rItem.Which();
1062*b1cdbd2cSJim Jagielski #ifdef TF_POOLABLE
1063*b1cdbd2cSJim Jagielski 	if ( pPool->IsSlot(nWhich) )
1064*b1cdbd2cSJim Jagielski #else
1065*b1cdbd2cSJim Jagielski 	if ( pPool->HasMap() && pPool->IsSlot(nWhich) )
1066*b1cdbd2cSJim Jagielski #endif
1067*b1cdbd2cSJim Jagielski 		nWhich = pPool->GetWhich(nWhich);
1068*b1cdbd2cSJim Jagielski 	rSet.Put( rItem, nWhich );
1069*b1cdbd2cSJim Jagielski }
1070*b1cdbd2cSJim Jagielski 
1071*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
1072*b1cdbd2cSJim Jagielski 
1073*b1cdbd2cSJim Jagielski #ifndef SFX_USE_BINDINGS
1074*b1cdbd2cSJim Jagielski #define SFX_USE_BINDINGS 0x8000
1075*b1cdbd2cSJim Jagielski #endif
1076*b1cdbd2cSJim Jagielski 
ExecuteFunction(sal_uInt16 nSlot,SfxPoolItem ** pArgs,sal_uInt16 nMode)1077*b1cdbd2cSJim Jagielski sal_uInt16 SfxDispatcher::ExecuteFunction( sal_uInt16 nSlot, SfxPoolItem **pArgs,
1078*b1cdbd2cSJim Jagielski 									   sal_uInt16 nMode )
1079*b1cdbd2cSJim Jagielski {
1080*b1cdbd2cSJim Jagielski 	if ( !nMode )
1081*b1cdbd2cSJim Jagielski 		nMode = pImp->nStandardMode;
1082*b1cdbd2cSJim Jagielski 
1083*b1cdbd2cSJim Jagielski 	// via Bindings/Interceptor? (dann ist der Returnwert nicht exakt)
1084*b1cdbd2cSJim Jagielski 	sal_Bool bViaBindings = SFX_USE_BINDINGS == ( nMode & SFX_USE_BINDINGS );
1085*b1cdbd2cSJim Jagielski 	nMode &= ~sal_uInt16(SFX_USE_BINDINGS);
1086*b1cdbd2cSJim Jagielski     if ( bViaBindings && GetBindings() )
1087*b1cdbd2cSJim Jagielski 		return GetBindings()->Execute( nSlot, (const SfxPoolItem **) pArgs, nMode )
1088*b1cdbd2cSJim Jagielski 				? EXECUTE_POSSIBLE
1089*b1cdbd2cSJim Jagielski 				: EXECUTE_NO;
1090*b1cdbd2cSJim Jagielski 
1091*b1cdbd2cSJim Jagielski 	// sonst via Dispatcher
1092*b1cdbd2cSJim Jagielski 	if ( IsLocked(nSlot) )
1093*b1cdbd2cSJim Jagielski 		return 0;
1094*b1cdbd2cSJim Jagielski 	SfxShell *pShell = 0;
1095*b1cdbd2cSJim Jagielski 	SfxCallMode eCall = SFX_CALLMODE_SYNCHRON;
1096*b1cdbd2cSJim Jagielski 	sal_uInt16 nRet = EXECUTE_NO;
1097*b1cdbd2cSJim Jagielski 	const SfxSlot *pSlot = 0;
1098*b1cdbd2cSJim Jagielski 	if ( GetShellAndSlot_Impl( nSlot, &pShell, &pSlot, sal_False, sal_False ) )
1099*b1cdbd2cSJim Jagielski 	{
1100*b1cdbd2cSJim Jagielski 		// Ausf"uhrbarkeit vorher testen
1101*b1cdbd2cSJim Jagielski 		if ( pSlot->IsMode( SFX_SLOT_FASTCALL ) ||
1102*b1cdbd2cSJim Jagielski 			pShell->CanExecuteSlot_Impl( *pSlot ) )
1103*b1cdbd2cSJim Jagielski 				nRet = EXECUTE_POSSIBLE;
1104*b1cdbd2cSJim Jagielski 
1105*b1cdbd2cSJim Jagielski 		if ( nMode == EXECUTEMODE_ASYNCHRON )
1106*b1cdbd2cSJim Jagielski 			eCall = SFX_CALLMODE_ASYNCHRON;
1107*b1cdbd2cSJim Jagielski 		else if ( nMode == EXECUTEMODE_DIALOGASYNCHRON && pSlot->IsMode( SFX_SLOT_HASDIALOG ) )
1108*b1cdbd2cSJim Jagielski 			eCall = SFX_CALLMODE_ASYNCHRON;
1109*b1cdbd2cSJim Jagielski 		else if ( pSlot->GetMode() & SFX_SLOT_ASYNCHRON )
1110*b1cdbd2cSJim Jagielski 			eCall = SFX_CALLMODE_ASYNCHRON;
1111*b1cdbd2cSJim Jagielski 		sal_Bool bDone = sal_False;
1112*b1cdbd2cSJim Jagielski 		if ( pArgs && *pArgs )
1113*b1cdbd2cSJim Jagielski 		{
1114*b1cdbd2cSJim Jagielski 			SfxAllItemSet aSet( pShell->GetPool() );
1115*b1cdbd2cSJim Jagielski 			for ( SfxPoolItem **pArg = pArgs; *pArg; ++pArg )
1116*b1cdbd2cSJim Jagielski 				MappedPut_Impl( aSet, **pArg );
1117*b1cdbd2cSJim Jagielski 			SfxRequest aReq( nSlot, eCall, aSet );
1118*b1cdbd2cSJim Jagielski 			_Execute( *pShell, *pSlot, aReq, eCall );
1119*b1cdbd2cSJim Jagielski 			bDone = aReq.IsDone();
1120*b1cdbd2cSJim Jagielski 		}
1121*b1cdbd2cSJim Jagielski 		else
1122*b1cdbd2cSJim Jagielski 		{
1123*b1cdbd2cSJim Jagielski 			SfxRequest aReq( nSlot, eCall, pShell->GetPool() );
1124*b1cdbd2cSJim Jagielski 			_Execute( *pShell, *pSlot, aReq, eCall );
1125*b1cdbd2cSJim Jagielski 			bDone = aReq.IsDone();
1126*b1cdbd2cSJim Jagielski 		}
1127*b1cdbd2cSJim Jagielski 	}
1128*b1cdbd2cSJim Jagielski 
1129*b1cdbd2cSJim Jagielski 	return nRet;
1130*b1cdbd2cSJim Jagielski }
1131*b1cdbd2cSJim Jagielski 
ExecuteFunction(sal_uInt16 nSlot,const SfxItemSet & rArgs,sal_uInt16 nMode)1132*b1cdbd2cSJim Jagielski sal_uInt16 SfxDispatcher::ExecuteFunction( sal_uInt16 nSlot, const SfxItemSet& rArgs,
1133*b1cdbd2cSJim Jagielski 									   sal_uInt16 nMode )
1134*b1cdbd2cSJim Jagielski {
1135*b1cdbd2cSJim Jagielski 	if ( !nMode )
1136*b1cdbd2cSJim Jagielski 		nMode = pImp->nStandardMode;
1137*b1cdbd2cSJim Jagielski 
1138*b1cdbd2cSJim Jagielski /*
1139*b1cdbd2cSJim Jagielski     // at the moment not implemented
1140*b1cdbd2cSJim Jagielski     // via Bindings/Interceptor? (dann ist der Returnwert nicht exakt)
1141*b1cdbd2cSJim Jagielski 	sal_Bool bViaBindings = SFX_USE_BINDINGS == ( nMode & SFX_USE_BINDINGS );
1142*b1cdbd2cSJim Jagielski 	nMode &= ~sal_uInt16(SFX_USE_BINDINGS);
1143*b1cdbd2cSJim Jagielski     if ( bViaBindings && GetBindings() )
1144*b1cdbd2cSJim Jagielski         return GetBindings()->Execute( nSlot, rArgs, nMode )
1145*b1cdbd2cSJim Jagielski 				? EXECUTE_POSSIBLE
1146*b1cdbd2cSJim Jagielski 				: EXECUTE_NO;
1147*b1cdbd2cSJim Jagielski */
1148*b1cdbd2cSJim Jagielski 	// sonst via Dispatcher
1149*b1cdbd2cSJim Jagielski 	if ( IsLocked(nSlot) )
1150*b1cdbd2cSJim Jagielski 		return 0;
1151*b1cdbd2cSJim Jagielski 	SfxShell *pShell = 0;
1152*b1cdbd2cSJim Jagielski 	SfxCallMode eCall = SFX_CALLMODE_SYNCHRON;
1153*b1cdbd2cSJim Jagielski 	sal_uInt16 nRet = EXECUTE_NO;
1154*b1cdbd2cSJim Jagielski 	const SfxSlot *pSlot = 0;
1155*b1cdbd2cSJim Jagielski 	if ( GetShellAndSlot_Impl( nSlot, &pShell, &pSlot, sal_False, sal_False ) )
1156*b1cdbd2cSJim Jagielski 	{
1157*b1cdbd2cSJim Jagielski 		// Ausf"uhrbarkeit vorher testen
1158*b1cdbd2cSJim Jagielski 		if ( pSlot->IsMode( SFX_SLOT_FASTCALL ) ||
1159*b1cdbd2cSJim Jagielski 			pShell->CanExecuteSlot_Impl( *pSlot ) )
1160*b1cdbd2cSJim Jagielski 				nRet = EXECUTE_POSSIBLE;
1161*b1cdbd2cSJim Jagielski 
1162*b1cdbd2cSJim Jagielski 		if ( nMode == EXECUTEMODE_ASYNCHRON )
1163*b1cdbd2cSJim Jagielski 			eCall = SFX_CALLMODE_ASYNCHRON;
1164*b1cdbd2cSJim Jagielski 		else if ( nMode == EXECUTEMODE_DIALOGASYNCHRON && pSlot->IsMode( SFX_SLOT_HASDIALOG ) )
1165*b1cdbd2cSJim Jagielski 			eCall = SFX_CALLMODE_ASYNCHRON;
1166*b1cdbd2cSJim Jagielski 		else if ( pSlot->GetMode() & SFX_SLOT_ASYNCHRON )
1167*b1cdbd2cSJim Jagielski 			eCall = SFX_CALLMODE_ASYNCHRON;
1168*b1cdbd2cSJim Jagielski 		sal_Bool bDone = sal_False;
1169*b1cdbd2cSJim Jagielski             SfxRequest aReq( nSlot, eCall, rArgs );
1170*b1cdbd2cSJim Jagielski 			_Execute( *pShell, *pSlot, aReq, eCall );
1171*b1cdbd2cSJim Jagielski 			bDone = aReq.IsDone();
1172*b1cdbd2cSJim Jagielski 	}
1173*b1cdbd2cSJim Jagielski 
1174*b1cdbd2cSJim Jagielski 	return nRet;
1175*b1cdbd2cSJim Jagielski }
1176*b1cdbd2cSJim Jagielski 
GetSlotId(const String & rCommand)1177*b1cdbd2cSJim Jagielski sal_uInt16 SfxDispatcher::GetSlotId( const String& rCommand )
1178*b1cdbd2cSJim Jagielski {
1179*b1cdbd2cSJim Jagielski     const SfxSlot *pSlot = GetSlot( rCommand );
1180*b1cdbd2cSJim Jagielski     if ( pSlot )
1181*b1cdbd2cSJim Jagielski         return pSlot->GetSlotId();
1182*b1cdbd2cSJim Jagielski 	return 0;
1183*b1cdbd2cSJim Jagielski }
1184*b1cdbd2cSJim Jagielski 
GetSlot(const String & rCommand)1185*b1cdbd2cSJim Jagielski const SfxSlot* SfxDispatcher::GetSlot( const String& rCommand )
1186*b1cdbd2cSJim Jagielski {
1187*b1cdbd2cSJim Jagielski 	// Anzahl der Shells auf den verkettenten Dispatchern z"ahlen
1188*b1cdbd2cSJim Jagielski 	Flush();
1189*b1cdbd2cSJim Jagielski 	sal_uInt16 nTotCount = pImp->aStack.Count();
1190*b1cdbd2cSJim Jagielski 	if ( pImp->pParent )
1191*b1cdbd2cSJim Jagielski 	{
1192*b1cdbd2cSJim Jagielski 		SfxDispatcher *pParent = pImp->pParent;
1193*b1cdbd2cSJim Jagielski 		while ( pParent )
1194*b1cdbd2cSJim Jagielski 		{
1195*b1cdbd2cSJim Jagielski 			nTotCount = nTotCount + pParent->pImp->aStack.Count();
1196*b1cdbd2cSJim Jagielski 			pParent = pParent->pImp->pParent;
1197*b1cdbd2cSJim Jagielski 		}
1198*b1cdbd2cSJim Jagielski 	}
1199*b1cdbd2cSJim Jagielski 
1200*b1cdbd2cSJim Jagielski 	const SfxSlot *pSlot=NULL;
1201*b1cdbd2cSJim Jagielski 	sal_uInt16 nFirstShell = 0;
1202*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = nFirstShell; i < nTotCount; ++i )
1203*b1cdbd2cSJim Jagielski 	{
1204*b1cdbd2cSJim Jagielski 		SfxShell *pObjShell = GetShell(i);
1205*b1cdbd2cSJim Jagielski 		SfxInterface *pIFace = pObjShell->GetInterface();
1206*b1cdbd2cSJim Jagielski 		pSlot = pIFace->GetSlot( rCommand );
1207*b1cdbd2cSJim Jagielski         if ( pSlot )
1208*b1cdbd2cSJim Jagielski             return pSlot;
1209*b1cdbd2cSJim Jagielski 	}
1210*b1cdbd2cSJim Jagielski 
1211*b1cdbd2cSJim Jagielski 	return 0;
1212*b1cdbd2cSJim Jagielski }
1213*b1cdbd2cSJim Jagielski 
1214*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
operator ==(const SfxPoolItem & rItem) const1215*b1cdbd2cSJim Jagielski int SfxExecuteItem::operator==( const SfxPoolItem& rItem ) const
1216*b1cdbd2cSJim Jagielski {
1217*b1cdbd2cSJim Jagielski 	SfxExecuteItem& rArg = (SfxExecuteItem& )rItem;
1218*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = Count();
1219*b1cdbd2cSJim Jagielski 	if( nCount != rArg.Count() )
1220*b1cdbd2cSJim Jagielski 		return sal_False;
1221*b1cdbd2cSJim Jagielski 	while( nCount -- )
1222*b1cdbd2cSJim Jagielski 		if( *GetObject( nCount ) != *rArg.GetObject( nCount ) )
1223*b1cdbd2cSJim Jagielski 			return sal_False;
1224*b1cdbd2cSJim Jagielski 	return  eCall == rArg.eCall;
1225*b1cdbd2cSJim Jagielski }
1226*b1cdbd2cSJim Jagielski 
1227*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
Clone(SfxItemPool *) const1228*b1cdbd2cSJim Jagielski SfxPoolItem* SfxExecuteItem::Clone( SfxItemPool* ) const
1229*b1cdbd2cSJim Jagielski {
1230*b1cdbd2cSJim Jagielski 	return new SfxExecuteItem( *this );
1231*b1cdbd2cSJim Jagielski }
1232*b1cdbd2cSJim Jagielski 
1233*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
SfxExecuteItem(const SfxExecuteItem & rArg)1234*b1cdbd2cSJim Jagielski SfxExecuteItem::SfxExecuteItem( const SfxExecuteItem& rArg )
1235*b1cdbd2cSJim Jagielski 	: SfxItemPtrArray(), SfxPoolItem( rArg ), nModifier( 0 )
1236*b1cdbd2cSJim Jagielski {
1237*b1cdbd2cSJim Jagielski 	eCall = rArg.eCall;
1238*b1cdbd2cSJim Jagielski 	nSlot = rArg.nSlot;
1239*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = rArg.Count();
1240*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nPos = 0; nPos < nCount; nPos++ )
1241*b1cdbd2cSJim Jagielski 		Insert( rArg[ nPos ]->Clone(), nPos );
1242*b1cdbd2cSJim Jagielski }
1243*b1cdbd2cSJim Jagielski 
1244*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
SfxExecuteItem(sal_uInt16 nWhichId,sal_uInt16 nSlotP,SfxCallMode eModeP,const SfxPoolItem * pArg1,...)1245*b1cdbd2cSJim Jagielski SfxExecuteItem::SfxExecuteItem(
1246*b1cdbd2cSJim Jagielski 	sal_uInt16 nWhichId, sal_uInt16 nSlotP, SfxCallMode eModeP,
1247*b1cdbd2cSJim Jagielski 	const SfxPoolItem*	pArg1, ... ) :
1248*b1cdbd2cSJim Jagielski 	SfxPoolItem( nWhichId ), nSlot( nSlotP ), eCall( eModeP ), nModifier( 0 )
1249*b1cdbd2cSJim Jagielski {
1250*b1cdbd2cSJim Jagielski 	va_list pVarArgs;
1251*b1cdbd2cSJim Jagielski 	va_start( pVarArgs, pArg1 );
1252*b1cdbd2cSJim Jagielski 	for ( const SfxPoolItem *pArg = pArg1; pArg;
1253*b1cdbd2cSJim Jagielski 		  pArg = va_arg( pVarArgs, const SfxPoolItem* ) )
1254*b1cdbd2cSJim Jagielski 		Insert( pArg->Clone(), Count() );
1255*b1cdbd2cSJim Jagielski 	va_end(pVarArgs);
1256*b1cdbd2cSJim Jagielski }
1257*b1cdbd2cSJim Jagielski 
1258*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
SfxExecuteItem(sal_uInt16 nWhichId,sal_uInt16 nSlotP,SfxCallMode eModeP)1259*b1cdbd2cSJim Jagielski SfxExecuteItem::SfxExecuteItem(
1260*b1cdbd2cSJim Jagielski 	sal_uInt16 nWhichId, sal_uInt16 nSlotP, SfxCallMode eModeP )
1261*b1cdbd2cSJim Jagielski 	: SfxPoolItem( nWhichId ), nSlot( nSlotP ), eCall( eModeP ), nModifier( 0 )
1262*b1cdbd2cSJim Jagielski {
1263*b1cdbd2cSJim Jagielski }
1264*b1cdbd2cSJim Jagielski 
1265*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
Execute(const SfxExecuteItem & rItem)1266*b1cdbd2cSJim Jagielski const SfxPoolItem* SfxDispatcher::Execute( const SfxExecuteItem& rItem )
1267*b1cdbd2cSJim Jagielski {
1268*b1cdbd2cSJim Jagielski 	const SfxPoolItem** pPtr = new const SfxPoolItem*[ rItem.Count() + 1 ];
1269*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nPos = rItem.Count(); nPos--; )
1270*b1cdbd2cSJim Jagielski 		pPtr[ nPos ] = rItem.GetObject( nPos );
1271*b1cdbd2cSJim Jagielski 	pPtr[ rItem.Count() ] = 0;
1272*b1cdbd2cSJim Jagielski 	const SfxPoolItem* pRet = Execute(
1273*b1cdbd2cSJim Jagielski 		rItem.GetSlot(), rItem.GetCallMode(), pPtr, rItem.GetModifier() );
1274*b1cdbd2cSJim Jagielski 
1275*b1cdbd2cSJim Jagielski 	delete [] (SfxPoolItem**)pPtr;
1276*b1cdbd2cSJim Jagielski 
1277*b1cdbd2cSJim Jagielski 	return pRet;
1278*b1cdbd2cSJim Jagielski }
1279*b1cdbd2cSJim Jagielski 
1280*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
Execute(sal_uInt16 nSlot,SfxCallMode nCall,SfxItemSet * pArgs,SfxItemSet * pInternalArgs,sal_uInt16 nModi)1281*b1cdbd2cSJim Jagielski const SfxPoolItem*	SfxDispatcher::Execute(
1282*b1cdbd2cSJim Jagielski     sal_uInt16 nSlot,
1283*b1cdbd2cSJim Jagielski     SfxCallMode nCall,
1284*b1cdbd2cSJim Jagielski     SfxItemSet* pArgs,
1285*b1cdbd2cSJim Jagielski     SfxItemSet* pInternalArgs,
1286*b1cdbd2cSJim Jagielski     sal_uInt16 nModi)
1287*b1cdbd2cSJim Jagielski {
1288*b1cdbd2cSJim Jagielski 	if ( IsLocked(nSlot) )
1289*b1cdbd2cSJim Jagielski 		return 0;
1290*b1cdbd2cSJim Jagielski 
1291*b1cdbd2cSJim Jagielski 	SfxShell *pShell = 0;
1292*b1cdbd2cSJim Jagielski 	const SfxSlot *pSlot = 0;
1293*b1cdbd2cSJim Jagielski 	if ( GetShellAndSlot_Impl( nSlot,  &pShell, &pSlot, sal_False,
1294*b1cdbd2cSJim Jagielski 							   SFX_CALLMODE_MODAL==(nCall&SFX_CALLMODE_MODAL) ) )
1295*b1cdbd2cSJim Jagielski 	{
1296*b1cdbd2cSJim Jagielski 		SfxAllItemSet aSet( pShell->GetPool() );
1297*b1cdbd2cSJim Jagielski 		if ( pArgs )
1298*b1cdbd2cSJim Jagielski 		{
1299*b1cdbd2cSJim Jagielski 		    SfxItemIter aIter(*pArgs);
1300*b1cdbd2cSJim Jagielski 		    for ( const SfxPoolItem *pArg = aIter.FirstItem();
1301*b1cdbd2cSJim Jagielski 			    pArg;
1302*b1cdbd2cSJim Jagielski 			    pArg = aIter.NextItem() )
1303*b1cdbd2cSJim Jagielski 			    MappedPut_Impl( aSet, *pArg );
1304*b1cdbd2cSJim Jagielski 		}
1305*b1cdbd2cSJim Jagielski 		SfxRequest aReq( nSlot, nCall, aSet );
1306*b1cdbd2cSJim Jagielski         if (pInternalArgs)
1307*b1cdbd2cSJim Jagielski     		aReq.SetInternalArgs_Impl( *pInternalArgs );
1308*b1cdbd2cSJim Jagielski         aReq.SetModifier( nModi );
1309*b1cdbd2cSJim Jagielski 
1310*b1cdbd2cSJim Jagielski 		_Execute( *pShell, *pSlot, aReq, nCall );
1311*b1cdbd2cSJim Jagielski 		return aReq.GetReturnValue();
1312*b1cdbd2cSJim Jagielski 	}
1313*b1cdbd2cSJim Jagielski 	return 0;
1314*b1cdbd2cSJim Jagielski }
1315*b1cdbd2cSJim Jagielski 
1316*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
Execute(sal_uInt16 nSlot,SfxCallMode eCall,const SfxPoolItem ** pArgs,sal_uInt16 nModi,const SfxPoolItem ** pInternalArgs)1317*b1cdbd2cSJim Jagielski const SfxPoolItem* SfxDispatcher::Execute
1318*b1cdbd2cSJim Jagielski (
1319*b1cdbd2cSJim Jagielski 	sal_uInt16 nSlot,				// die Id der auszufuehrenden Funktion
1320*b1cdbd2cSJim Jagielski 	SfxCallMode eCall,			// SFX_CALLMODE_SYNCRHON, ..._ASYNCHRON oder ..._SLOT
1321*b1cdbd2cSJim Jagielski 	const SfxPoolItem **pArgs,	// 0-terminiertes C-Array von Parametern
1322*b1cdbd2cSJim Jagielski 	sal_uInt16 nModi,
1323*b1cdbd2cSJim Jagielski 	const SfxPoolItem **pInternalArgs // 0-terminiertes C-Array von Parametern
1324*b1cdbd2cSJim Jagielski )
1325*b1cdbd2cSJim Jagielski 
1326*b1cdbd2cSJim Jagielski /*  [Beschreibung]
1327*b1cdbd2cSJim Jagielski 
1328*b1cdbd2cSJim Jagielski 	Methode zum Ausf"uhren eines <SfxSlot>s "uber die Slot-Id.
1329*b1cdbd2cSJim Jagielski 
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski 	[R"uckgabewert]
1332*b1cdbd2cSJim Jagielski 
1333*b1cdbd2cSJim Jagielski 	const SfxPoolItem*		Pointer auf ein bis zum n"achsten Durchlauf
1334*b1cdbd2cSJim Jagielski 							der Message-Loop g"ultiges SfxPoolItem,
1335*b1cdbd2cSJim Jagielski 							welches den R"uckgabewert enth"alt.
1336*b1cdbd2cSJim Jagielski 
1337*b1cdbd2cSJim Jagielski 							Oder ein 0-Pointer, wenn die Funktion nicht
1338*b1cdbd2cSJim Jagielski 							ausgef"uhrt wurde (z.B. Abbruch durch den
1339*b1cdbd2cSJim Jagielski 							Benutzer).
1340*b1cdbd2cSJim Jagielski */
1341*b1cdbd2cSJim Jagielski 
1342*b1cdbd2cSJim Jagielski {
1343*b1cdbd2cSJim Jagielski 	if ( IsLocked(nSlot) )
1344*b1cdbd2cSJim Jagielski 		return 0;
1345*b1cdbd2cSJim Jagielski 
1346*b1cdbd2cSJim Jagielski 	SfxShell *pShell = 0;
1347*b1cdbd2cSJim Jagielski 	const SfxSlot *pSlot = 0;
1348*b1cdbd2cSJim Jagielski 	if ( GetShellAndSlot_Impl( nSlot,  &pShell, &pSlot, sal_False,
1349*b1cdbd2cSJim Jagielski 							   SFX_CALLMODE_MODAL==(eCall&SFX_CALLMODE_MODAL) ) )
1350*b1cdbd2cSJim Jagielski 	{
1351*b1cdbd2cSJim Jagielski 		SfxRequest* pReq;
1352*b1cdbd2cSJim Jagielski 		if ( pArgs && *pArgs )
1353*b1cdbd2cSJim Jagielski 		{
1354*b1cdbd2cSJim Jagielski 			SfxAllItemSet aSet( pShell->GetPool() );
1355*b1cdbd2cSJim Jagielski 			for ( const SfxPoolItem **pArg = pArgs; *pArg; ++pArg )
1356*b1cdbd2cSJim Jagielski 				MappedPut_Impl( aSet, **pArg );
1357*b1cdbd2cSJim Jagielski 			pReq = new SfxRequest( nSlot, eCall, aSet );
1358*b1cdbd2cSJim Jagielski 		}
1359*b1cdbd2cSJim Jagielski 		else
1360*b1cdbd2cSJim Jagielski 			pReq =  new SfxRequest( nSlot, eCall, pShell->GetPool() );
1361*b1cdbd2cSJim Jagielski 		pReq->SetModifier( nModi );
1362*b1cdbd2cSJim Jagielski 		if( pInternalArgs && *pInternalArgs)
1363*b1cdbd2cSJim Jagielski 		{
1364*b1cdbd2cSJim Jagielski 			SfxAllItemSet aSet( SFX_APP()->GetPool() );
1365*b1cdbd2cSJim Jagielski 			for ( const SfxPoolItem **pArg = pInternalArgs; *pArg; ++pArg )
1366*b1cdbd2cSJim Jagielski 				aSet.Put( **pArg );
1367*b1cdbd2cSJim Jagielski 			pReq->SetInternalArgs_Impl( aSet );
1368*b1cdbd2cSJim Jagielski 		}
1369*b1cdbd2cSJim Jagielski 		_Execute( *pShell, *pSlot, *pReq, eCall );
1370*b1cdbd2cSJim Jagielski 		const SfxPoolItem* pRet = pReq->GetReturnValue();
1371*b1cdbd2cSJim Jagielski 		delete pReq; return pRet;
1372*b1cdbd2cSJim Jagielski 	}
1373*b1cdbd2cSJim Jagielski 	return 0;
1374*b1cdbd2cSJim Jagielski }
1375*b1cdbd2cSJim Jagielski 
1376*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
Execute(sal_uInt16 nSlot,SfxCallMode eCall,const SfxItemSet & rArgs)1377*b1cdbd2cSJim Jagielski const SfxPoolItem* SfxDispatcher::Execute
1378*b1cdbd2cSJim Jagielski (
1379*b1cdbd2cSJim Jagielski 	sal_uInt16 nSlot,				// die Id der auszufuehrenden Funktion
1380*b1cdbd2cSJim Jagielski 	SfxCallMode eCall,			// SFX_CALLMODE_SYNCRHON, ..._ASYNCHRON oder ..._SLOT
1381*b1cdbd2cSJim Jagielski 	const SfxItemSet &rArgs	    // <SfxItemSet> mit Parametern
1382*b1cdbd2cSJim Jagielski )
1383*b1cdbd2cSJim Jagielski 
1384*b1cdbd2cSJim Jagielski /*  [Beschreibung]
1385*b1cdbd2cSJim Jagielski 
1386*b1cdbd2cSJim Jagielski 	Methode zum Ausf"uhren eines <SfxSlot>s "uber die Slot-Id.
1387*b1cdbd2cSJim Jagielski 
1388*b1cdbd2cSJim Jagielski 
1389*b1cdbd2cSJim Jagielski 	[R"uckgabewert]
1390*b1cdbd2cSJim Jagielski 
1391*b1cdbd2cSJim Jagielski 	const SfxPoolItem*		Pointer auf ein bis zum n"achsten Durchlauf
1392*b1cdbd2cSJim Jagielski 							der Message-Loop g"ultiges SfxPoolItem,
1393*b1cdbd2cSJim Jagielski 							welches den R"uckgabewert enth"alt.
1394*b1cdbd2cSJim Jagielski 
1395*b1cdbd2cSJim Jagielski 							Oder ein 0-Pointer, wenn die Funktion nicht
1396*b1cdbd2cSJim Jagielski 							ausgef"uhrt wurde (z.B. Abbruch durch den
1397*b1cdbd2cSJim Jagielski 							Benutzer).
1398*b1cdbd2cSJim Jagielski */
1399*b1cdbd2cSJim Jagielski 
1400*b1cdbd2cSJim Jagielski {
1401*b1cdbd2cSJim Jagielski     return Execute( nSlot, eCall, 0, rArgs );
1402*b1cdbd2cSJim Jagielski }
1403*b1cdbd2cSJim Jagielski 
1404*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
Execute(sal_uInt16 nSlot,SfxCallMode eCall,sal_uInt16 nModi,const SfxItemSet & rArgs)1405*b1cdbd2cSJim Jagielski const SfxPoolItem*  SfxDispatcher::Execute
1406*b1cdbd2cSJim Jagielski (
1407*b1cdbd2cSJim Jagielski     sal_uInt16 nSlot,
1408*b1cdbd2cSJim Jagielski     SfxCallMode eCall,
1409*b1cdbd2cSJim Jagielski     sal_uInt16 nModi,
1410*b1cdbd2cSJim Jagielski     const SfxItemSet &rArgs
1411*b1cdbd2cSJim Jagielski )
1412*b1cdbd2cSJim Jagielski {
1413*b1cdbd2cSJim Jagielski 	if ( IsLocked(nSlot) )
1414*b1cdbd2cSJim Jagielski 		return 0;
1415*b1cdbd2cSJim Jagielski 
1416*b1cdbd2cSJim Jagielski 	SfxShell *pShell = 0;
1417*b1cdbd2cSJim Jagielski 	const SfxSlot *pSlot = 0;
1418*b1cdbd2cSJim Jagielski 	if ( GetShellAndSlot_Impl( nSlot,  &pShell, &pSlot, sal_False,
1419*b1cdbd2cSJim Jagielski 							   SFX_CALLMODE_MODAL==(eCall&SFX_CALLMODE_MODAL) ) )
1420*b1cdbd2cSJim Jagielski 	{
1421*b1cdbd2cSJim Jagielski 		SfxAllItemSet aSet( pShell->GetPool() );
1422*b1cdbd2cSJim Jagielski 		SfxItemIter aIter(rArgs);
1423*b1cdbd2cSJim Jagielski 		for ( const SfxPoolItem *pArg = aIter.FirstItem();
1424*b1cdbd2cSJim Jagielski 			  pArg;
1425*b1cdbd2cSJim Jagielski 			  pArg = aIter.NextItem() )
1426*b1cdbd2cSJim Jagielski 			MappedPut_Impl( aSet, *pArg );
1427*b1cdbd2cSJim Jagielski 		SfxRequest aReq( nSlot, eCall, aSet );
1428*b1cdbd2cSJim Jagielski         aReq.SetModifier( nModi );
1429*b1cdbd2cSJim Jagielski 		_Execute( *pShell, *pSlot, aReq, eCall );
1430*b1cdbd2cSJim Jagielski 		return aReq.GetReturnValue();
1431*b1cdbd2cSJim Jagielski 	}
1432*b1cdbd2cSJim Jagielski 	return 0;
1433*b1cdbd2cSJim Jagielski }
1434*b1cdbd2cSJim Jagielski 
1435*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
_Execute(sal_uInt16 nSlot,SfxCallMode eCall,va_list pVarArgs,const SfxPoolItem * pArg1)1436*b1cdbd2cSJim Jagielski const SfxPoolItem* SfxDispatcher::_Execute
1437*b1cdbd2cSJim Jagielski (
1438*b1cdbd2cSJim Jagielski 	sal_uInt16				nSlot,		// die Id der auszufuehrenden Funktion
1439*b1cdbd2cSJim Jagielski 	SfxCallMode 		eCall,		// SFX_CALLMODE_SYNCRHON, ..._ASYNCHRON oder ..._SLOT
1440*b1cdbd2cSJim Jagielski 	va_list 			pVarArgs,	// Parameterliste ab 2. Parameter
1441*b1cdbd2cSJim Jagielski 	const SfxPoolItem*	pArg1   	// erster Parameter
1442*b1cdbd2cSJim Jagielski )
1443*b1cdbd2cSJim Jagielski 
1444*b1cdbd2cSJim Jagielski /*  [Beschreibung]
1445*b1cdbd2cSJim Jagielski 
1446*b1cdbd2cSJim Jagielski 	Methode zum Ausf"uhren eines <SfxSlot>s "uber die Slot-Id.
1447*b1cdbd2cSJim Jagielski 
1448*b1cdbd2cSJim Jagielski 
1449*b1cdbd2cSJim Jagielski 	[R"uckgabewert]
1450*b1cdbd2cSJim Jagielski 
1451*b1cdbd2cSJim Jagielski 	const SfxPoolItem*		Pointer auf ein bis zum n"achsten Durchlauf
1452*b1cdbd2cSJim Jagielski 							der Message-Loop g"ultiges SfxPoolItem,
1453*b1cdbd2cSJim Jagielski 							welches den R"uckgabewert enth"alt.
1454*b1cdbd2cSJim Jagielski 
1455*b1cdbd2cSJim Jagielski 							Oder ein 0-Pointer, wenn die Funktion nicht
1456*b1cdbd2cSJim Jagielski 							ausgef"uhrt wurde (z.B. Abbruch durch den
1457*b1cdbd2cSJim Jagielski 							Benutzer).
1458*b1cdbd2cSJim Jagielski */
1459*b1cdbd2cSJim Jagielski 
1460*b1cdbd2cSJim Jagielski {
1461*b1cdbd2cSJim Jagielski 	if ( IsLocked(nSlot) )
1462*b1cdbd2cSJim Jagielski 		return 0;
1463*b1cdbd2cSJim Jagielski 
1464*b1cdbd2cSJim Jagielski 	SfxShell *pShell = 0;
1465*b1cdbd2cSJim Jagielski 	const SfxSlot *pSlot = 0;
1466*b1cdbd2cSJim Jagielski 	if ( GetShellAndSlot_Impl( nSlot, &pShell, &pSlot, sal_False,
1467*b1cdbd2cSJim Jagielski 							   SFX_CALLMODE_MODAL==(eCall&SFX_CALLMODE_MODAL) ) )
1468*b1cdbd2cSJim Jagielski 	{
1469*b1cdbd2cSJim Jagielski 	   SfxAllItemSet aSet( pShell->GetPool() );
1470*b1cdbd2cSJim Jagielski 
1471*b1cdbd2cSJim Jagielski 	   for ( const SfxPoolItem *pArg = pArg1;
1472*b1cdbd2cSJim Jagielski 			 pArg;
1473*b1cdbd2cSJim Jagielski 			 pArg = va_arg( pVarArgs, const SfxPoolItem* ) )
1474*b1cdbd2cSJim Jagielski 		   MappedPut_Impl( aSet, *pArg );
1475*b1cdbd2cSJim Jagielski 
1476*b1cdbd2cSJim Jagielski 	   SfxRequest aReq( nSlot, eCall, aSet );
1477*b1cdbd2cSJim Jagielski 	   _Execute( *pShell, *pSlot, aReq, eCall );
1478*b1cdbd2cSJim Jagielski 	   return aReq.GetReturnValue();
1479*b1cdbd2cSJim Jagielski 	}
1480*b1cdbd2cSJim Jagielski 	return 0;
1481*b1cdbd2cSJim Jagielski }
1482*b1cdbd2cSJim Jagielski 
1483*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
Execute(sal_uInt16 nSlot,SfxCallMode eCall,const SfxPoolItem * pArg1,...)1484*b1cdbd2cSJim Jagielski const SfxPoolItem* SfxDispatcher::Execute
1485*b1cdbd2cSJim Jagielski (
1486*b1cdbd2cSJim Jagielski 	sal_uInt16				nSlot,		// die Id der auszufuehrenden Funktion
1487*b1cdbd2cSJim Jagielski 	SfxCallMode 		eCall,		// SFX_CALLMODE_SYNCRHON, ..._ASYNCHRON oder ..._SLOT
1488*b1cdbd2cSJim Jagielski 	const SfxPoolItem*	pArg1,		// erster Parameter
1489*b1cdbd2cSJim Jagielski 	... 							// 0-terminiertes Liste Parametern
1490*b1cdbd2cSJim Jagielski )
1491*b1cdbd2cSJim Jagielski 
1492*b1cdbd2cSJim Jagielski /*  [Beschreibung]
1493*b1cdbd2cSJim Jagielski 
1494*b1cdbd2cSJim Jagielski 	Methode zum Ausf"uhren eines <SfxSlot>s "uber die Slot-Id.
1495*b1cdbd2cSJim Jagielski 
1496*b1cdbd2cSJim Jagielski 
1497*b1cdbd2cSJim Jagielski 	[Anmerkung]
1498*b1cdbd2cSJim Jagielski 
1499*b1cdbd2cSJim Jagielski 	Die Parameter werden kopiert, k"onnen daher als Adresse von
1500*b1cdbd2cSJim Jagielski 	Stack-Objekten "ubergeben werden.
1501*b1cdbd2cSJim Jagielski 
1502*b1cdbd2cSJim Jagielski 
1503*b1cdbd2cSJim Jagielski 	[R"uckgabewert]
1504*b1cdbd2cSJim Jagielski 
1505*b1cdbd2cSJim Jagielski 	const SfxPoolItem*		Pointer auf ein bis zum n"achsten Durchlauf
1506*b1cdbd2cSJim Jagielski 							der Message-Loop g"ultiges SfxPoolItem,
1507*b1cdbd2cSJim Jagielski 							welches den R"uckgabewert enth"alt.
1508*b1cdbd2cSJim Jagielski 
1509*b1cdbd2cSJim Jagielski 							Oder ein 0-Pointer, wenn die Funktion nicht
1510*b1cdbd2cSJim Jagielski 							ausgef"uhrt wurde (z.B. Abbruch durch den
1511*b1cdbd2cSJim Jagielski 							Benutzer).
1512*b1cdbd2cSJim Jagielski 
1513*b1cdbd2cSJim Jagielski 
1514*b1cdbd2cSJim Jagielski 	[Beispiel]
1515*b1cdbd2cSJim Jagielski 
1516*b1cdbd2cSJim Jagielski     pDispatcher->Execute( SID_OPENDOCUMENT, SFX_CALLMODE_SYNCHRON,
1517*b1cdbd2cSJim Jagielski 		&SfxStringItem( SID_FILE_NAME, "\\tmp\\temp.sdd" ),
1518*b1cdbd2cSJim Jagielski 		&SfxStringItem( SID_FILTER_NAME, "StarDraw Presentation" ),
1519*b1cdbd2cSJim Jagielski 		&SfxBoolItem( SID_DOC_READONLY, sal_False ),
1520*b1cdbd2cSJim Jagielski 		0L );
1521*b1cdbd2cSJim Jagielski */
1522*b1cdbd2cSJim Jagielski 
1523*b1cdbd2cSJim Jagielski {
1524*b1cdbd2cSJim Jagielski 	if ( IsLocked(nSlot) )
1525*b1cdbd2cSJim Jagielski 		return 0;
1526*b1cdbd2cSJim Jagielski 
1527*b1cdbd2cSJim Jagielski 	SfxShell *pShell = 0;
1528*b1cdbd2cSJim Jagielski 	const SfxSlot *pSlot = 0;
1529*b1cdbd2cSJim Jagielski 	if ( GetShellAndSlot_Impl( nSlot, &pShell, &pSlot, sal_False,
1530*b1cdbd2cSJim Jagielski 							   SFX_CALLMODE_MODAL==(eCall&SFX_CALLMODE_MODAL) ) )
1531*b1cdbd2cSJim Jagielski 	{
1532*b1cdbd2cSJim Jagielski 	   SfxAllItemSet aSet( pShell->GetPool() );
1533*b1cdbd2cSJim Jagielski 
1534*b1cdbd2cSJim Jagielski 	   va_list pVarArgs;
1535*b1cdbd2cSJim Jagielski 	   va_start( pVarArgs, pArg1 );
1536*b1cdbd2cSJim Jagielski 	   for ( const SfxPoolItem *pArg = pArg1;
1537*b1cdbd2cSJim Jagielski 			 pArg;
1538*b1cdbd2cSJim Jagielski 			 pArg = va_arg( pVarArgs, const SfxPoolItem* ) )
1539*b1cdbd2cSJim Jagielski 		   MappedPut_Impl( aSet, *pArg );
1540*b1cdbd2cSJim Jagielski 	   va_end(pVarArgs);
1541*b1cdbd2cSJim Jagielski 
1542*b1cdbd2cSJim Jagielski 	   SfxRequest aReq( nSlot, eCall, aSet );
1543*b1cdbd2cSJim Jagielski 	   _Execute( *pShell, *pSlot, aReq, eCall );
1544*b1cdbd2cSJim Jagielski 	   return aReq.GetReturnValue();
1545*b1cdbd2cSJim Jagielski 	}
1546*b1cdbd2cSJim Jagielski 	return 0;
1547*b1cdbd2cSJim Jagielski }
1548*b1cdbd2cSJim Jagielski 
1549*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
1550*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxDispatcher,PostMsgHandler,SfxRequest *,pReq)1551*b1cdbd2cSJim Jagielski IMPL_LINK( SfxDispatcher, PostMsgHandler, SfxRequest*, pReq )
1552*b1cdbd2cSJim Jagielski 
1553*b1cdbd2cSJim Jagielski /*	[Beschreibung]
1554*b1cdbd2cSJim Jagielski 
1555*b1cdbd2cSJim Jagielski 	Hilfsmethode zum Empfangen der asynchron auszuf"uhrenden <SfxRequest>s.
1556*b1cdbd2cSJim Jagielski */
1557*b1cdbd2cSJim Jagielski 
1558*b1cdbd2cSJim Jagielski {
1559*b1cdbd2cSJim Jagielski 	DBG_MEMTEST();
1560*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !pImp->bFlushing, "recursive call to dispatcher" );
1561*b1cdbd2cSJim Jagielski 	SFX_STACK(SfxDispatcher::PostMsgHandler);
1562*b1cdbd2cSJim Jagielski 
1563*b1cdbd2cSJim Jagielski 	// ist auch der Pool noch nicht gestorben?
1564*b1cdbd2cSJim Jagielski //    SfxRequest* pReq = pExec->pRequest;
1565*b1cdbd2cSJim Jagielski 	if ( !pReq->IsCancelled() )
1566*b1cdbd2cSJim Jagielski 	{
1567*b1cdbd2cSJim Jagielski 		if ( !IsLocked(pReq->GetSlot()) )
1568*b1cdbd2cSJim Jagielski 		{
1569*b1cdbd2cSJim Jagielski 			Flush();
1570*b1cdbd2cSJim Jagielski             SfxSlotServer aSvr;
1571*b1cdbd2cSJim Jagielski             if ( _FindServer(pReq->GetSlot(), aSvr, HACK(x) sal_True ) )
1572*b1cdbd2cSJim Jagielski //            SfxShell *pShell = GetShell(pExec->nLevel);
1573*b1cdbd2cSJim Jagielski //            if ( pShell && pShell->GetInterface()->GetSlot( pExec->pSlot->GetSlotId() ) )
1574*b1cdbd2cSJim Jagielski 			{
1575*b1cdbd2cSJim Jagielski                 const SfxSlot *pSlot = aSvr.GetSlot();
1576*b1cdbd2cSJim Jagielski                 SfxShell *pSh = GetShell(aSvr.GetShellLevel());
1577*b1cdbd2cSJim Jagielski 
1578*b1cdbd2cSJim Jagielski 				DBG( SfxApplication *pSfxApp = SFX_APP() );
1579*b1cdbd2cSJim Jagielski 				DBG( pSfxApp->EnterAsynchronCall_Impl() );
1580*b1cdbd2cSJim Jagielski 
1581*b1cdbd2cSJim Jagielski 				// Wenn pSlot ein "Pseudoslot" f"ur Macros oder Verben ist, kann
1582*b1cdbd2cSJim Jagielski 				// er im Call_Impl zerst"ort werden, also nicht mehr benutzen!
1583*b1cdbd2cSJim Jagielski 				pReq->SetSynchronCall( sal_False );
1584*b1cdbd2cSJim Jagielski                 Call_Impl( *pSh, *pSlot, *pReq, pReq->AllowsRecording() ); //! woher bRecord?
1585*b1cdbd2cSJim Jagielski //                Call_Impl( *pShell, *pExec->pSlot, *pReq, sal_True ); //! woher bRecord?
1586*b1cdbd2cSJim Jagielski 				DBG( pSfxApp->LeaveAsynchronCall_Impl() );
1587*b1cdbd2cSJim Jagielski 			}
1588*b1cdbd2cSJim Jagielski 
1589*b1cdbd2cSJim Jagielski //            delete pExec;
1590*b1cdbd2cSJim Jagielski 		}
1591*b1cdbd2cSJim Jagielski 		else
1592*b1cdbd2cSJim Jagielski 		{
1593*b1cdbd2cSJim Jagielski //            pImp->xPoster->Post(pExec);
1594*b1cdbd2cSJim Jagielski             if ( pImp->bLocked )
1595*b1cdbd2cSJim Jagielski                 pImp->aReqArr.Insert( new SfxRequest(*pReq), pImp->aReqArr.Count() );
1596*b1cdbd2cSJim Jagielski             else
1597*b1cdbd2cSJim Jagielski                 pImp->xPoster->Post(new SfxRequest(*pReq));
1598*b1cdbd2cSJim Jagielski 		}
1599*b1cdbd2cSJim Jagielski 	}
1600*b1cdbd2cSJim Jagielski //    else
1601*b1cdbd2cSJim Jagielski //        delete pExec;
1602*b1cdbd2cSJim Jagielski 
1603*b1cdbd2cSJim Jagielski     delete pReq;
1604*b1cdbd2cSJim Jagielski 	return 0;
1605*b1cdbd2cSJim Jagielski }
1606*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
SetMenu_Impl()1607*b1cdbd2cSJim Jagielski void SfxDispatcher::SetMenu_Impl()
1608*b1cdbd2cSJim Jagielski {
1609*b1cdbd2cSJim Jagielski 	if ( pImp->pFrame )
1610*b1cdbd2cSJim Jagielski 	{
1611*b1cdbd2cSJim Jagielski         SfxViewFrame* pTop = pImp->pFrame->GetTopViewFrame();
1612*b1cdbd2cSJim Jagielski         if ( pTop && pTop->GetBindings().GetDispatcher() == this )
1613*b1cdbd2cSJim Jagielski         {
1614*b1cdbd2cSJim Jagielski 			SfxFrame& rFrame = pTop->GetFrame();
1615*b1cdbd2cSJim Jagielski             if ( rFrame.IsMenuBarOn_Impl() )
1616*b1cdbd2cSJim Jagielski             {
1617*b1cdbd2cSJim Jagielski                 com::sun::star::uno::Reference < com::sun::star::beans::XPropertySet > xPropSet( rFrame.GetFrameInterface(), com::sun::star::uno::UNO_QUERY );
1618*b1cdbd2cSJim Jagielski                 if ( xPropSet.is() )
1619*b1cdbd2cSJim Jagielski                 {
1620*b1cdbd2cSJim Jagielski                     com::sun::star::uno::Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
1621*b1cdbd2cSJim Jagielski                     com::sun::star::uno::Any aValue = xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
1622*b1cdbd2cSJim Jagielski                     aValue >>= xLayoutManager;
1623*b1cdbd2cSJim Jagielski                     if ( xLayoutManager.is() )
1624*b1cdbd2cSJim Jagielski                     {
1625*b1cdbd2cSJim Jagielski                         rtl::OUString aMenuBarURL( RTL_CONSTASCII_USTRINGPARAM( "private:resource/menubar/menubar" ));
1626*b1cdbd2cSJim Jagielski 						if ( !xLayoutManager->isElementVisible( aMenuBarURL ) )
1627*b1cdbd2cSJim Jagielski                         	xLayoutManager->createElement( aMenuBarURL );
1628*b1cdbd2cSJim Jagielski                     }
1629*b1cdbd2cSJim Jagielski                 }
1630*b1cdbd2cSJim Jagielski             }
1631*b1cdbd2cSJim Jagielski         }
1632*b1cdbd2cSJim Jagielski     }
1633*b1cdbd2cSJim Jagielski }
1634*b1cdbd2cSJim Jagielski 
1635*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
Update_Impl(sal_Bool bForce)1636*b1cdbd2cSJim Jagielski void SfxDispatcher::Update_Impl( sal_Bool bForce )
1637*b1cdbd2cSJim Jagielski {
1638*b1cdbd2cSJim Jagielski 	SFX_STACK(SfxDispatcher::Update_Impl);
1639*b1cdbd2cSJim Jagielski 
1640*b1cdbd2cSJim Jagielski 	Flush();
1641*b1cdbd2cSJim Jagielski 
1642*b1cdbd2cSJim Jagielski     if ( !pImp->pFrame || pImp->bUILocked )
1643*b1cdbd2cSJim Jagielski 		return;
1644*b1cdbd2cSJim Jagielski 
1645*b1cdbd2cSJim Jagielski 	SFX_APP();  // -Wall is this required???
1646*b1cdbd2cSJim Jagielski 	SfxDispatcher *pDisp = this;
1647*b1cdbd2cSJim Jagielski 	sal_Bool bUpdate = bForce;
1648*b1cdbd2cSJim Jagielski     while ( pDisp && pDisp->pImp->pFrame )
1649*b1cdbd2cSJim Jagielski 	{
1650*b1cdbd2cSJim Jagielski         SfxWorkWindow *pWork = pDisp->pImp->pFrame->GetFrame().GetWorkWindow_Impl();
1651*b1cdbd2cSJim Jagielski 		SfxDispatcher *pAct = pWork->GetBindings().GetDispatcher_Impl();
1652*b1cdbd2cSJim Jagielski 		if ( pAct == pDisp || pAct == this )
1653*b1cdbd2cSJim Jagielski 		{
1654*b1cdbd2cSJim Jagielski 			if ( !bUpdate )
1655*b1cdbd2cSJim Jagielski 				bUpdate = !pDisp->pImp->bUpdated;
1656*b1cdbd2cSJim Jagielski 			pDisp->pImp->bUpdated = sal_True;
1657*b1cdbd2cSJim Jagielski 		}
1658*b1cdbd2cSJim Jagielski 		else
1659*b1cdbd2cSJim Jagielski 			break;
1660*b1cdbd2cSJim Jagielski 
1661*b1cdbd2cSJim Jagielski 		pDisp = pDisp->pImp->pParent;
1662*b1cdbd2cSJim Jagielski 	}
1663*b1cdbd2cSJim Jagielski 
1664*b1cdbd2cSJim Jagielski     if ( !bUpdate || pImp->pFrame->GetFrame().IsClosing_Impl() )
1665*b1cdbd2cSJim Jagielski 		return;
1666*b1cdbd2cSJim Jagielski 
1667*b1cdbd2cSJim Jagielski     SfxViewFrame* pTop = pImp->pFrame ? pImp->pFrame->GetTopViewFrame() : NULL;
1668*b1cdbd2cSJim Jagielski     sal_Bool bUIActive = pTop && pTop->GetBindings().GetDispatcher() == this;
1669*b1cdbd2cSJim Jagielski 
1670*b1cdbd2cSJim Jagielski     if ( !bUIActive && pTop && GetBindings() == &pTop->GetBindings() )
1671*b1cdbd2cSJim Jagielski         // keep own tools internally for collecting
1672*b1cdbd2cSJim Jagielski         GetBindings()->GetDispatcher()->pImp->bUpdated = sal_False;
1673*b1cdbd2cSJim Jagielski 
1674*b1cdbd2cSJim Jagielski     SfxBindings* pBindings = GetBindings();
1675*b1cdbd2cSJim Jagielski     if ( pBindings )
1676*b1cdbd2cSJim Jagielski         pBindings->DENTERREGISTRATIONS();
1677*b1cdbd2cSJim Jagielski 
1678*b1cdbd2cSJim Jagielski     com::sun::star::uno::Reference< com::sun::star::frame::XFrame > xFrame = pBindings->GetActiveFrame();
1679*b1cdbd2cSJim Jagielski     com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xPropSet( xFrame, com::sun::star::uno::UNO_QUERY );
1680*b1cdbd2cSJim Jagielski     com::sun::star::uno::Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
1681*b1cdbd2cSJim Jagielski     if ( xPropSet.is() )
1682*b1cdbd2cSJim Jagielski     {
1683*b1cdbd2cSJim Jagielski         try
1684*b1cdbd2cSJim Jagielski         {
1685*b1cdbd2cSJim Jagielski             com::sun::star::uno::Any aValue = xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )) );
1686*b1cdbd2cSJim Jagielski 	        aValue >>= xLayoutManager;
1687*b1cdbd2cSJim Jagielski         }
1688*b1cdbd2cSJim Jagielski         catch ( com::sun::star::uno::Exception& )
1689*b1cdbd2cSJim Jagielski         {
1690*b1cdbd2cSJim Jagielski         }
1691*b1cdbd2cSJim Jagielski     }
1692*b1cdbd2cSJim Jagielski 
1693*b1cdbd2cSJim Jagielski     if ( xLayoutManager.is() )
1694*b1cdbd2cSJim Jagielski         xLayoutManager->lock();
1695*b1cdbd2cSJim Jagielski 
1696*b1cdbd2cSJim Jagielski     sal_Bool bIsIPActive = pImp->pFrame && pImp->pFrame->GetObjectShell()->IsInPlaceActive();
1697*b1cdbd2cSJim Jagielski     SfxInPlaceClient *pClient = pImp->pFrame ? pImp->pFrame->GetViewShell()->GetUIActiveClient() : NULL;
1698*b1cdbd2cSJim Jagielski     if ( bUIActive && /* !bIsIPActive && */ ( !pClient || !pClient->IsObjectUIActive() ) )
1699*b1cdbd2cSJim Jagielski 		SetMenu_Impl();
1700*b1cdbd2cSJim Jagielski 
1701*b1cdbd2cSJim Jagielski     SfxWorkWindow *pWorkWin = pImp->pFrame->GetFrame().GetWorkWindow_Impl();
1702*b1cdbd2cSJim Jagielski     SfxWorkWindow *pTaskWin = pImp->pFrame->GetTopFrame().GetWorkWindow_Impl();
1703*b1cdbd2cSJim Jagielski     pTaskWin->ResetStatusBar_Impl();
1704*b1cdbd2cSJim Jagielski 
1705*b1cdbd2cSJim Jagielski 	SfxDispatcher *pDispat = this;
1706*b1cdbd2cSJim Jagielski 	while ( pDispat )
1707*b1cdbd2cSJim Jagielski 	{
1708*b1cdbd2cSJim Jagielski         SfxWorkWindow *pWork = pDispat->pImp->pFrame->GetFrame().GetWorkWindow_Impl();
1709*b1cdbd2cSJim Jagielski 		SfxDispatcher *pAct = pWork->GetBindings().GetDispatcher_Impl();
1710*b1cdbd2cSJim Jagielski 		if ( pAct == pDispat || pAct == this )
1711*b1cdbd2cSJim Jagielski 		{
1712*b1cdbd2cSJim Jagielski 			pWork->ResetObjectBars_Impl();
1713*b1cdbd2cSJim Jagielski 			pWork->ResetChildWindows_Impl();
1714*b1cdbd2cSJim Jagielski 		}
1715*b1cdbd2cSJim Jagielski 
1716*b1cdbd2cSJim Jagielski 		pDispat = pDispat->pImp->pParent;
1717*b1cdbd2cSJim Jagielski 	}
1718*b1cdbd2cSJim Jagielski 
1719*b1cdbd2cSJim Jagielski 	sal_Bool bIsActive = sal_False;
1720*b1cdbd2cSJim Jagielski 	SfxDispatcher *pActDispat = pWorkWin->GetBindings().GetDispatcher_Impl();
1721*b1cdbd2cSJim Jagielski 	pDispat = this;
1722*b1cdbd2cSJim Jagielski 	while ( pActDispat && !bIsActive )
1723*b1cdbd2cSJim Jagielski 	{
1724*b1cdbd2cSJim Jagielski 		if ( pDispat == pActDispat )
1725*b1cdbd2cSJim Jagielski 			bIsActive = sal_True;
1726*b1cdbd2cSJim Jagielski 		pActDispat = pActDispat->pImp->pParent;
1727*b1cdbd2cSJim Jagielski 	}
1728*b1cdbd2cSJim Jagielski 
1729*b1cdbd2cSJim Jagielski     _Update_Impl( bUIActive, !bIsIPActive, bIsIPActive, pTaskWin );
1730*b1cdbd2cSJim Jagielski 	if ( bUIActive || bIsActive )
1731*b1cdbd2cSJim Jagielski 		pWorkWin->UpdateObjectBars_Impl();
1732*b1cdbd2cSJim Jagielski 
1733*b1cdbd2cSJim Jagielski     if ( pBindings )
1734*b1cdbd2cSJim Jagielski         pBindings->DLEAVEREGISTRATIONS();
1735*b1cdbd2cSJim Jagielski 
1736*b1cdbd2cSJim Jagielski     if ( xLayoutManager.is() )
1737*b1cdbd2cSJim Jagielski         xLayoutManager->unlock();
1738*b1cdbd2cSJim Jagielski 
1739*b1cdbd2cSJim Jagielski     return;
1740*b1cdbd2cSJim Jagielski }
1741*b1cdbd2cSJim Jagielski 
_Update_Impl(sal_Bool bUIActive,sal_Bool bIsMDIApp,sal_Bool bIsIPOwner,SfxWorkWindow * pTaskWin)1742*b1cdbd2cSJim Jagielski void SfxDispatcher::_Update_Impl( sal_Bool bUIActive, sal_Bool bIsMDIApp, sal_Bool bIsIPOwner, SfxWorkWindow *pTaskWin )
1743*b1cdbd2cSJim Jagielski {
1744*b1cdbd2cSJim Jagielski 	SFX_APP();
1745*b1cdbd2cSJim Jagielski     SfxWorkWindow *pWorkWin = pImp->pFrame->GetFrame().GetWorkWindow_Impl();
1746*b1cdbd2cSJim Jagielski 	sal_Bool bIsActive = sal_False;
1747*b1cdbd2cSJim Jagielski 	sal_Bool bIsTaskActive = sal_False;
1748*b1cdbd2cSJim Jagielski 	SfxDispatcher *pActDispat = pWorkWin->GetBindings().GetDispatcher_Impl();
1749*b1cdbd2cSJim Jagielski 	SfxDispatcher *pDispat = this;
1750*b1cdbd2cSJim Jagielski 	while ( pActDispat && !bIsActive )
1751*b1cdbd2cSJim Jagielski 	{
1752*b1cdbd2cSJim Jagielski 		if ( pDispat == pActDispat )
1753*b1cdbd2cSJim Jagielski 			bIsActive = sal_True;
1754*b1cdbd2cSJim Jagielski 		pActDispat = pActDispat->pImp->pParent;
1755*b1cdbd2cSJim Jagielski 	}
1756*b1cdbd2cSJim Jagielski 
1757*b1cdbd2cSJim Jagielski     if ( pImp->pParent && !pImp->bQuiet /* && bUIActive */ )
1758*b1cdbd2cSJim Jagielski         pImp->pParent->_Update_Impl( bUIActive, bIsMDIApp, bIsIPOwner, pTaskWin );
1759*b1cdbd2cSJim Jagielski 
1760*b1cdbd2cSJim Jagielski 	for (sal_uInt16 n=0; n<SFX_OBJECTBAR_MAX; n++)
1761*b1cdbd2cSJim Jagielski 		pImp->aObjBars[n].nResId = 0;
1762*b1cdbd2cSJim Jagielski 	pImp->aChildWins.Remove(0, pImp->aChildWins.Count());
1763*b1cdbd2cSJim Jagielski 
1764*b1cdbd2cSJim Jagielski     // bQuiet : own shells aren't considered for UI and SlotServer
1765*b1cdbd2cSJim Jagielski     // bNoUI: own Shells aren't considered fors UI
1766*b1cdbd2cSJim Jagielski     if ( pImp->bQuiet || pImp->bNoUI || (pImp->pFrame && pImp->pFrame->GetObjectShell()->IsPreview()) )
1767*b1cdbd2cSJim Jagielski 		return;
1768*b1cdbd2cSJim Jagielski 
1769*b1cdbd2cSJim Jagielski 	sal_uInt32 nStatBarId=0;
1770*b1cdbd2cSJim Jagielski 	SfxShell *pStatusBarShell = NULL;
1771*b1cdbd2cSJim Jagielski 
1772*b1cdbd2cSJim Jagielski     SfxSlotPool* pSlotPool = &SfxSlotPool::GetSlotPool( GetFrame() );
1773*b1cdbd2cSJim Jagielski 	sal_uInt16 nTotCount = pImp->aStack.Count();
1774*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 nShell = nTotCount; nShell > 0; --nShell )
1775*b1cdbd2cSJim Jagielski 	{
1776*b1cdbd2cSJim Jagielski 		SfxShell *pShell = GetShell( nShell-1 );
1777*b1cdbd2cSJim Jagielski 		SfxInterface *pIFace = pShell->GetInterface();
1778*b1cdbd2cSJim Jagielski 
1779*b1cdbd2cSJim Jagielski         // don't consider shells if "Hidden" oder "Quiet"
1780*b1cdbd2cSJim Jagielski 		sal_Bool bReadOnlyShell = IsReadOnlyShell_Impl( nShell-1 );
1781*b1cdbd2cSJim Jagielski 		sal_uInt16 nNo;
1782*b1cdbd2cSJim Jagielski 		for ( nNo = 0; pIFace && nNo<pIFace->GetObjectBarCount(); ++nNo )
1783*b1cdbd2cSJim Jagielski 		{
1784*b1cdbd2cSJim Jagielski 			sal_uInt16 nPos = pIFace->GetObjectBarPos(nNo);
1785*b1cdbd2cSJim Jagielski 			if ( bReadOnlyShell && !( nPos & SFX_VISIBILITY_READONLYDOC ) )
1786*b1cdbd2cSJim Jagielski 				continue;
1787*b1cdbd2cSJim Jagielski 
1788*b1cdbd2cSJim Jagielski             // check wether toolbar needs activation of a special feature
1789*b1cdbd2cSJim Jagielski             sal_uInt32 nFeature = pIFace->GetObjectBarFeature(nNo);
1790*b1cdbd2cSJim Jagielski 			if ( nFeature && !pShell->HasUIFeature( nFeature ) )
1791*b1cdbd2cSJim Jagielski 				continue;
1792*b1cdbd2cSJim Jagielski 
1793*b1cdbd2cSJim Jagielski 			// check for toolboxes that are exclusively for a viewer
1794*b1cdbd2cSJim Jagielski 			if ( pImp->pFrame)
1795*b1cdbd2cSJim Jagielski 			{
1796*b1cdbd2cSJim Jagielski 				sal_Bool bViewerTbx = SFX_VISIBILITY_VIEWER == ( nPos & SFX_VISIBILITY_VIEWER );
1797*b1cdbd2cSJim Jagielski 				SfxObjectShell* pSh = pImp->pFrame->GetObjectShell();
1798*b1cdbd2cSJim Jagielski 				SFX_ITEMSET_ARG( pSh->GetMedium()->GetItemSet(), pItem, SfxBoolItem, SID_VIEWONLY, sal_False );
1799*b1cdbd2cSJim Jagielski 				sal_Bool bIsViewer = pItem && pItem->GetValue();
1800*b1cdbd2cSJim Jagielski 				if ( bIsViewer != bViewerTbx )
1801*b1cdbd2cSJim Jagielski 					continue;
1802*b1cdbd2cSJim Jagielski 			}
1803*b1cdbd2cSJim Jagielski 
1804*b1cdbd2cSJim Jagielski             // always register toolbars, allows to switch them on
1805*b1cdbd2cSJim Jagielski             sal_Bool bVisible = pIFace->IsObjectBarVisible(nNo);
1806*b1cdbd2cSJim Jagielski 			if ( !bVisible )
1807*b1cdbd2cSJim Jagielski 				nPos &= SFX_POSITION_MASK;
1808*b1cdbd2cSJim Jagielski 
1809*b1cdbd2cSJim Jagielski 			SfxObjectBars_Impl& rBar = pImp->aObjBars[nPos & SFX_POSITION_MASK];
1810*b1cdbd2cSJim Jagielski 			rBar.nMode = nPos;
1811*b1cdbd2cSJim Jagielski 			rBar.nResId = pIFace->GetObjectBarResId(nNo).GetId();
1812*b1cdbd2cSJim Jagielski 			const String *pName = pIFace->GetObjectBarName(nNo);
1813*b1cdbd2cSJim Jagielski 			if ( pName )
1814*b1cdbd2cSJim Jagielski 				rBar.aName = *pName;
1815*b1cdbd2cSJim Jagielski 			else
1816*b1cdbd2cSJim Jagielski 				rBar.aName.Erase();
1817*b1cdbd2cSJim Jagielski 			rBar.pIFace = pIFace;
1818*b1cdbd2cSJim Jagielski 
1819*b1cdbd2cSJim Jagielski 			if ( bUIActive || bIsActive )
1820*b1cdbd2cSJim Jagielski 			{
1821*b1cdbd2cSJim Jagielski 				pWorkWin->SetObjectBar_Impl(
1822*b1cdbd2cSJim Jagielski 					nPos, rBar.nResId, rBar.pIFace, &rBar.aName );
1823*b1cdbd2cSJim Jagielski 			}
1824*b1cdbd2cSJim Jagielski 
1825*b1cdbd2cSJim Jagielski 			if ( !bVisible )
1826*b1cdbd2cSJim Jagielski 				rBar.nResId = 0;
1827*b1cdbd2cSJim Jagielski 		}
1828*b1cdbd2cSJim Jagielski 
1829*b1cdbd2cSJim Jagielski 		for ( nNo=0; pIFace && nNo<pIFace->GetChildWindowCount(); nNo++ )
1830*b1cdbd2cSJim Jagielski 		{
1831*b1cdbd2cSJim Jagielski 			sal_uInt32 nId = pIFace->GetChildWindowId(nNo);
1832*b1cdbd2cSJim Jagielski             const SfxSlot *pSlot = pSlotPool->GetSlot( (sal_uInt16) nId );
1833*b1cdbd2cSJim Jagielski             DBG_ASSERT( pSlot, "Childwindow slot missing!");
1834*b1cdbd2cSJim Jagielski 			if ( bReadOnlyShell )
1835*b1cdbd2cSJim Jagielski 			{
1836*b1cdbd2cSJim Jagielski                 // only show ChildWindows if their slot is allowed for readonly documents
1837*b1cdbd2cSJim Jagielski                 if ( pSlot && !pSlot->IsMode( SFX_SLOT_READONLYDOC ) )
1838*b1cdbd2cSJim Jagielski 					continue;
1839*b1cdbd2cSJim Jagielski 			}
1840*b1cdbd2cSJim Jagielski 
1841*b1cdbd2cSJim Jagielski 			sal_uInt32 nFeature = pIFace->GetChildWindowFeature(nNo);
1842*b1cdbd2cSJim Jagielski 			if ( nFeature && !pShell->HasUIFeature( nFeature ) )
1843*b1cdbd2cSJim Jagielski 				continue;
1844*b1cdbd2cSJim Jagielski 
1845*b1cdbd2cSJim Jagielski             // slot decides wether a ChildWindow is shown when document is OLE server or OLE client
1846*b1cdbd2cSJim Jagielski             sal_uInt16 nMode = SFX_VISIBILITY_STANDARD;
1847*b1cdbd2cSJim Jagielski 			if( pSlot )
1848*b1cdbd2cSJim Jagielski 			{
1849*b1cdbd2cSJim Jagielski                 if ( pSlot->IsMode(SFX_SLOT_CONTAINER) )
1850*b1cdbd2cSJim Jagielski 				{
1851*b1cdbd2cSJim Jagielski                     if ( pWorkWin->IsVisible_Impl( SFX_VISIBILITY_CLIENT ) )
1852*b1cdbd2cSJim Jagielski                         nMode |= SFX_VISIBILITY_CLIENT;
1853*b1cdbd2cSJim Jagielski 				}
1854*b1cdbd2cSJim Jagielski 				else
1855*b1cdbd2cSJim Jagielski 				{
1856*b1cdbd2cSJim Jagielski                     if ( pWorkWin->IsVisible_Impl( SFX_VISIBILITY_SERVER ) )
1857*b1cdbd2cSJim Jagielski                         nMode |= SFX_VISIBILITY_SERVER;
1858*b1cdbd2cSJim Jagielski 				}
1859*b1cdbd2cSJim Jagielski 			}
1860*b1cdbd2cSJim Jagielski 
1861*b1cdbd2cSJim Jagielski 			if ( bUIActive || bIsActive )
1862*b1cdbd2cSJim Jagielski 				pWorkWin->SetChildWindowVisible_Impl( nId, sal_True, nMode );
1863*b1cdbd2cSJim Jagielski 			if ( bUIActive || bIsActive || !pWorkWin->IsFloating( (sal_uInt16) ( nId & 0xFFFF ) ) )
1864*b1cdbd2cSJim Jagielski 				pImp->aChildWins.Insert( nId, pImp->aChildWins.Count());
1865*b1cdbd2cSJim Jagielski 		}
1866*b1cdbd2cSJim Jagielski 
1867*b1cdbd2cSJim Jagielski 		if ( bIsMDIApp || bIsIPOwner )
1868*b1cdbd2cSJim Jagielski 		{
1869*b1cdbd2cSJim Jagielski 			sal_uInt32 nId = pIFace->GetStatusBarResId().GetId();
1870*b1cdbd2cSJim Jagielski 			if ( nId )
1871*b1cdbd2cSJim Jagielski 			{
1872*b1cdbd2cSJim Jagielski 				nStatBarId = nId;
1873*b1cdbd2cSJim Jagielski 				pStatusBarShell =  pShell;
1874*b1cdbd2cSJim Jagielski 			}
1875*b1cdbd2cSJim Jagielski 		}
1876*b1cdbd2cSJim Jagielski 	}
1877*b1cdbd2cSJim Jagielski 
1878*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 nPos=0; nPos<SFX_OBJECTBAR_MAX; nPos++ )
1879*b1cdbd2cSJim Jagielski 	{
1880*b1cdbd2cSJim Jagielski 		SfxObjectBars_Impl& rFixed = pImp->aFixedObjBars[nPos];
1881*b1cdbd2cSJim Jagielski 		if ( rFixed.nResId )
1882*b1cdbd2cSJim Jagielski 		{
1883*b1cdbd2cSJim Jagielski 			SfxObjectBars_Impl& rBar = pImp->aObjBars[nPos];
1884*b1cdbd2cSJim Jagielski 			rBar = rFixed;
1885*b1cdbd2cSJim Jagielski 			pWorkWin->SetObjectBar_Impl( rFixed.nMode,
1886*b1cdbd2cSJim Jagielski 				rFixed.nResId, rFixed.pIFace, &rFixed.aName );
1887*b1cdbd2cSJim Jagielski 		}
1888*b1cdbd2cSJim Jagielski 	}
1889*b1cdbd2cSJim Jagielski 
1890*b1cdbd2cSJim Jagielski 	if ( pTaskWin && ( bIsMDIApp || bIsIPOwner ) )
1891*b1cdbd2cSJim Jagielski 	{
1892*b1cdbd2cSJim Jagielski 		SfxDispatcher *pActDispatcher = pTaskWin->GetBindings().GetDispatcher_Impl();
1893*b1cdbd2cSJim Jagielski 		SfxDispatcher *pDispatcher = this;
1894*b1cdbd2cSJim Jagielski 		while ( pActDispatcher && !bIsTaskActive )
1895*b1cdbd2cSJim Jagielski 		{
1896*b1cdbd2cSJim Jagielski 			if ( pDispatcher == pActDispatcher )
1897*b1cdbd2cSJim Jagielski 				bIsTaskActive = sal_True;
1898*b1cdbd2cSJim Jagielski 			pActDispatcher = pActDispatcher->pImp->pParent;
1899*b1cdbd2cSJim Jagielski 		}
1900*b1cdbd2cSJim Jagielski 
1901*b1cdbd2cSJim Jagielski         if ( bIsTaskActive && nStatBarId && pImp->pFrame )
1902*b1cdbd2cSJim Jagielski 		{
1903*b1cdbd2cSJim Jagielski             // internal frames also may control statusbar
1904*b1cdbd2cSJim Jagielski             SfxBindings& rBindings = pImp->pFrame->GetBindings();
1905*b1cdbd2cSJim Jagielski             pImp->pFrame->GetFrame().GetWorkWindow_Impl()->SetStatusBar_Impl( nStatBarId, pStatusBarShell, rBindings );
1906*b1cdbd2cSJim Jagielski 		}
1907*b1cdbd2cSJim Jagielski 	}
1908*b1cdbd2cSJim Jagielski }
1909*b1cdbd2cSJim Jagielski 
1910*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
FlushImpl()1911*b1cdbd2cSJim Jagielski void SfxDispatcher::FlushImpl()
1912*b1cdbd2cSJim Jagielski 
1913*b1cdbd2cSJim Jagielski /*	[Beschreibung]
1914*b1cdbd2cSJim Jagielski 
1915*b1cdbd2cSJim Jagielski 	Hilfsmethode zum Ausf"uhren der ausstehenden Push- und Pop-Befehle.
1916*b1cdbd2cSJim Jagielski */
1917*b1cdbd2cSJim Jagielski 
1918*b1cdbd2cSJim Jagielski {
1919*b1cdbd2cSJim Jagielski 	DBG_PROFSTART(SfxDispatcherFlush);
1920*b1cdbd2cSJim Jagielski 	DBG_MEMTEST();
1921*b1cdbd2cSJim Jagielski 	SFX_STACK(SfxDispatcher::FlushImpl);
1922*b1cdbd2cSJim Jagielski 
1923*b1cdbd2cSJim Jagielski 	DBG_TRACE("Flushing dispatcher!");
1924*b1cdbd2cSJim Jagielski 
1925*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
1926*b1cdbd2cSJim Jagielski 	ByteString aMsg( "SfxDispatcher(" );
1927*b1cdbd2cSJim Jagielski 	aMsg += ByteString::CreateFromInt64( (sal_uIntPtr) this );
1928*b1cdbd2cSJim Jagielski 	aMsg += ")::Flush()";
1929*b1cdbd2cSJim Jagielski #endif
1930*b1cdbd2cSJim Jagielski 
1931*b1cdbd2cSJim Jagielski 	pImp->aTimer.Stop();
1932*b1cdbd2cSJim Jagielski 
1933*b1cdbd2cSJim Jagielski 	if ( pImp->pParent )
1934*b1cdbd2cSJim Jagielski 		pImp->pParent->Flush();
1935*b1cdbd2cSJim Jagielski 
1936*b1cdbd2cSJim Jagielski //	if ( pImp->bQuiet )
1937*b1cdbd2cSJim Jagielski //		return;
1938*b1cdbd2cSJim Jagielski 
1939*b1cdbd2cSJim Jagielski 	pImp->bFlushing = !pImp->bFlushing;
1940*b1cdbd2cSJim Jagielski 	if ( !pImp->bFlushing )
1941*b1cdbd2cSJim Jagielski 	{
1942*b1cdbd2cSJim Jagielski 		pImp->bFlushing = sal_True;
1943*b1cdbd2cSJim Jagielski 		DBG_PROFSTOP(SfxDispatcherFlush);
1944*b1cdbd2cSJim Jagielski //!
1945*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL_MESSEHACK_AUSKOMMENT
1946*b1cdbd2cSJim Jagielski 		DBG_ERROR( "reentering SfxDispatcher::Flush()" );
1947*b1cdbd2cSJim Jagielski 		aMsg += " reentering, aborted";
1948*b1cdbd2cSJim Jagielski 		DbgTrace( aMsg.GetBuffer() );
1949*b1cdbd2cSJim Jagielski #endif
1950*b1cdbd2cSJim Jagielski 		return;
1951*b1cdbd2cSJim Jagielski 	}
1952*b1cdbd2cSJim Jagielski 
1953*b1cdbd2cSJim Jagielski 	SfxApplication *pSfxApp = SFX_APP();
1954*b1cdbd2cSJim Jagielski 
1955*b1cdbd2cSJim Jagielski 	// in der 1. Runde den echten Stack 'um'bauen
1956*b1cdbd2cSJim Jagielski 	SfxToDoStack_Impl aToDoCopy;
1957*b1cdbd2cSJim Jagielski 	sal_Bool bModify = sal_False;
1958*b1cdbd2cSJim Jagielski 	short nToDo;
1959*b1cdbd2cSJim Jagielski 	for ( nToDo = pImp->aToDoStack.Count()-1; nToDo >= 0; --nToDo )
1960*b1cdbd2cSJim Jagielski 	{
1961*b1cdbd2cSJim Jagielski 		bModify = sal_True;
1962*b1cdbd2cSJim Jagielski 
1963*b1cdbd2cSJim Jagielski 		SfxToDo_Impl aToDo( pImp->aToDoStack.Top(nToDo) );
1964*b1cdbd2cSJim Jagielski 		if ( aToDo.bPush )
1965*b1cdbd2cSJim Jagielski 		{
1966*b1cdbd2cSJim Jagielski 			// tats"aechlich pushen
1967*b1cdbd2cSJim Jagielski 			DBG_ASSERT( !pImp->aStack.Contains( aToDo.pCluster ),
1968*b1cdbd2cSJim Jagielski 						"pushed SfxShell already on stack" );
1969*b1cdbd2cSJim Jagielski 			pImp->aStack.Push( aToDo.pCluster );
1970*b1cdbd2cSJim Jagielski 			aToDo.pCluster->SetDisableFlags( pImp->nDisableFlags );
1971*b1cdbd2cSJim Jagielski 
1972*b1cdbd2cSJim Jagielski 			// die bewegte Shell merken
1973*b1cdbd2cSJim Jagielski 			aToDoCopy.Push( aToDo );
1974*b1cdbd2cSJim Jagielski 		}
1975*b1cdbd2cSJim Jagielski 		else
1976*b1cdbd2cSJim Jagielski 		{
1977*b1cdbd2cSJim Jagielski 			// tats"aechlich poppen
1978*b1cdbd2cSJim Jagielski 			SfxShell* pPopped = 0;
1979*b1cdbd2cSJim Jagielski 			bool bFound = sal_False;
1980*b1cdbd2cSJim Jagielski 			do
1981*b1cdbd2cSJim Jagielski 			{
1982*b1cdbd2cSJim Jagielski 				DBG_ASSERT( pImp->aStack.Count(), "popping from empty stack" );
1983*b1cdbd2cSJim Jagielski 				pPopped = pImp->aStack.Pop();
1984*b1cdbd2cSJim Jagielski 				pPopped->SetDisableFlags( 0 );
1985*b1cdbd2cSJim Jagielski 				bFound = pPopped == aToDo.pCluster;
1986*b1cdbd2cSJim Jagielski 
1987*b1cdbd2cSJim Jagielski 				// die bewegte Shell merken
1988*b1cdbd2cSJim Jagielski 				aToDoCopy.Push( SfxToDo_Impl( sal_False, aToDo.bDelete, sal_False, *pPopped) );
1989*b1cdbd2cSJim Jagielski 			}
1990*b1cdbd2cSJim Jagielski 			while ( aToDo.bUntil && !bFound );
1991*b1cdbd2cSJim Jagielski 			DBG_ASSERT( bFound, "wrong SfxShell popped" );
1992*b1cdbd2cSJim Jagielski 		}
1993*b1cdbd2cSJim Jagielski 
1994*b1cdbd2cSJim Jagielski 		if ( nToDo == 0 )
1995*b1cdbd2cSJim Jagielski 			pImp->aToDoStack.Clear();
1996*b1cdbd2cSJim Jagielski 	}
1997*b1cdbd2cSJim Jagielski 
1998*b1cdbd2cSJim Jagielski 	// ggf. Bindings invalidieren
1999*b1cdbd2cSJim Jagielski 	if ( !pSfxApp->IsDowning() )
2000*b1cdbd2cSJim Jagielski 	{
2001*b1cdbd2cSJim Jagielski 		if ( bModify )
2002*b1cdbd2cSJim Jagielski 		{
2003*b1cdbd2cSJim Jagielski 			pImp->pCachedServ1 = 0;
2004*b1cdbd2cSJim Jagielski 			pImp->pCachedServ2 = 0;
2005*b1cdbd2cSJim Jagielski 		}
2006*b1cdbd2cSJim Jagielski 
2007*b1cdbd2cSJim Jagielski 		InvalidateBindings_Impl( bModify );
2008*b1cdbd2cSJim Jagielski 	}
2009*b1cdbd2cSJim Jagielski 
2010*b1cdbd2cSJim Jagielski 	pImp->bFlushing = sal_False;
2011*b1cdbd2cSJim Jagielski 	pImp->bUpdated = sal_False; // nicht nur bei bModify, falls Doc/Template-Config
2012*b1cdbd2cSJim Jagielski 	bFlushed = sal_True;
2013*b1cdbd2cSJim Jagielski 	DBG_TRACE("Successfully flushed dispatcher!");
2014*b1cdbd2cSJim Jagielski 
2015*b1cdbd2cSJim Jagielski 	// in der 2. Runde die Shells aktivieren und ggf. l"oschen
2016*b1cdbd2cSJim Jagielski 	for ( nToDo = aToDoCopy.Count()-1; nToDo >= 0; --nToDo )
2017*b1cdbd2cSJim Jagielski 	{
2018*b1cdbd2cSJim Jagielski 		SfxToDo_Impl aToDo( aToDoCopy.Top(nToDo) );
2019*b1cdbd2cSJim Jagielski 		if ( aToDo.bPush )
2020*b1cdbd2cSJim Jagielski 		{
2021*b1cdbd2cSJim Jagielski 			if ( pImp->bActive )
2022*b1cdbd2cSJim Jagielski 				aToDo.pCluster->DoActivate_Impl(pImp->pFrame, sal_True);
2023*b1cdbd2cSJim Jagielski 		}
2024*b1cdbd2cSJim Jagielski 		else
2025*b1cdbd2cSJim Jagielski 			if ( pImp->bActive )
2026*b1cdbd2cSJim Jagielski 				aToDo.pCluster->DoDeactivate_Impl(pImp->pFrame, sal_True);
2027*b1cdbd2cSJim Jagielski 	}
2028*b1cdbd2cSJim Jagielski 	for ( nToDo = aToDoCopy.Count()-1; nToDo >= 0; --nToDo )
2029*b1cdbd2cSJim Jagielski 	{
2030*b1cdbd2cSJim Jagielski 		SfxToDo_Impl aToDo( aToDoCopy.Top(nToDo) );
2031*b1cdbd2cSJim Jagielski 		if ( aToDo.bDelete ) delete aToDo.pCluster;
2032*b1cdbd2cSJim Jagielski 	}
2033*b1cdbd2cSJim Jagielski 	sal_Bool bAwakeBindings = aToDoCopy.Count() != 0;
2034*b1cdbd2cSJim Jagielski 	if( bAwakeBindings )
2035*b1cdbd2cSJim Jagielski 		aToDoCopy.Clear();
2036*b1cdbd2cSJim Jagielski 
2037*b1cdbd2cSJim Jagielski 	// Wenn bei Activate/Deactivate/Delete weitere Stackbewegungen erfolgt sind :
2038*b1cdbd2cSJim Jagielski 	if (!bFlushed)
2039*b1cdbd2cSJim Jagielski 		// falls jemand Push/Pop gerufen hat, wurde auch EnterReg gerufen!
2040*b1cdbd2cSJim Jagielski 		FlushImpl();
2041*b1cdbd2cSJim Jagielski 
2042*b1cdbd2cSJim Jagielski     if( bAwakeBindings && GetBindings() )
2043*b1cdbd2cSJim Jagielski 		GetBindings()->DLEAVEREGISTRATIONS();
2044*b1cdbd2cSJim Jagielski 	DBG_PROFSTOP(SfxDispatcherFlush);
2045*b1cdbd2cSJim Jagielski 
2046*b1cdbd2cSJim Jagielski 	for (sal_uInt16 n=0; n<SFX_OBJECTBAR_MAX; n++)
2047*b1cdbd2cSJim Jagielski 		pImp->aFixedObjBars[n].nResId = 0;
2048*b1cdbd2cSJim Jagielski 
2049*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
2050*b1cdbd2cSJim Jagielski 	aMsg += " done";
2051*b1cdbd2cSJim Jagielski 	DbgTrace( aMsg.GetBuffer() );
2052*b1cdbd2cSJim Jagielski #endif
2053*b1cdbd2cSJim Jagielski }
2054*b1cdbd2cSJim Jagielski 
2055*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
SetSlotFilter(HACK (hier muss mal ein enum rein)sal_Bool bEnable,sal_uInt16 nCount,const sal_uInt16 * pSIDs)2056*b1cdbd2cSJim Jagielski void SfxDispatcher::SetSlotFilter
2057*b1cdbd2cSJim Jagielski (
2058*b1cdbd2cSJim Jagielski 	HACK(hier muss mal ein enum rein)
2059*b1cdbd2cSJim Jagielski 	sal_Bool 			bEnable,	/*	sal_True:
2060*b1cdbd2cSJim Jagielski 									nur angegebene Slots enablen,
2061*b1cdbd2cSJim Jagielski 									alle anderen disablen
2062*b1cdbd2cSJim Jagielski 
2063*b1cdbd2cSJim Jagielski 									sal_False:
2064*b1cdbd2cSJim Jagielski 									die angegebenen Slots disablen,
2065*b1cdbd2cSJim Jagielski 									alle anderen zun"achst enablen
2066*b1cdbd2cSJim Jagielski 								*/
2067*b1cdbd2cSJim Jagielski 	sal_uInt16 			nCount, 	// 	Anzahl der SIDs im folgenden Array
2068*b1cdbd2cSJim Jagielski 	const sal_uInt16*	pSIDs		// 	sortiertes Array von 'nCount' SIDs
2069*b1cdbd2cSJim Jagielski )
2070*b1cdbd2cSJim Jagielski 
2071*b1cdbd2cSJim Jagielski /*	[Beschreibung]
2072*b1cdbd2cSJim Jagielski 
2073*b1cdbd2cSJim Jagielski 	Mit dieser Methode wird ein Filter gesetzt, mit dem gezielt Slots
2074*b1cdbd2cSJim Jagielski 	enabled bzw. disabled werden k"onnen. Das "ubergebene Array mu\s
2075*b1cdbd2cSJim Jagielski 	bis zum Dtor bzw. n"achsten <SetSlotFilter()> erhalten bleiben, es
2076*b1cdbd2cSJim Jagielski 	wird nicht vom Dispatcher gel"oscht, es kann daher static sein.
2077*b1cdbd2cSJim Jagielski 
2078*b1cdbd2cSJim Jagielski 	In ReadOnly-Dokumenten kann man mit 'bEnable==2' quasi das ReadOnlyDoc
2079*b1cdbd2cSJim Jagielski 	Flag von Slots "ubersteuern, dieser werden also wieder gefunden. Auf
2080*b1cdbd2cSJim Jagielski 	andere Slots hat das dann keine Auswirkung.
2081*b1cdbd2cSJim Jagielski 
2082*b1cdbd2cSJim Jagielski 
2083*b1cdbd2cSJim Jagielski 	[Beispiel]
2084*b1cdbd2cSJim Jagielski 
2085*b1cdbd2cSJim Jagielski 	gezieltes disablen der Slots 1, 2 und 3:
2086*b1cdbd2cSJim Jagielski 
2087*b1cdbd2cSJim Jagielski 		static sal_uInt16 __READONLY_DATA pSIDs[] = { 1, 2, 3 };
2088*b1cdbd2cSJim Jagielski 		pDisp->SetSlotFilter( sal_False, sizeof(pSIDs)/sizeof(sal_uInt16), pSIDs );
2089*b1cdbd2cSJim Jagielski 
2090*b1cdbd2cSJim Jagielski 	nur die Slots 5, 6 und 7 zulassen:
2091*b1cdbd2cSJim Jagielski 
2092*b1cdbd2cSJim Jagielski 		static sal_uInt16 __READONLY_DATA pSIDs[] = { 5, 6, 7 };
2093*b1cdbd2cSJim Jagielski 		pDisp->SetSlotFilter( sal_True, sizeof(pSIDs)/sizeof(sal_uInt16), pSIDs );
2094*b1cdbd2cSJim Jagielski 
2095*b1cdbd2cSJim Jagielski 	Filter ausschalten:
2096*b1cdbd2cSJim Jagielski 
2097*b1cdbd2cSJim Jagielski 		pDisp->SetSlotFilter();
2098*b1cdbd2cSJim Jagielski */
2099*b1cdbd2cSJim Jagielski 
2100*b1cdbd2cSJim Jagielski {
2101*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
2102*b1cdbd2cSJim Jagielski 	// Array "uberpr"ufen
2103*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 n = 1; n < nCount; ++n )
2104*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pSIDs[n] > pSIDs[n-1], "SetSlotFilter: SIDs not sortet" );
2105*b1cdbd2cSJim Jagielski #endif
2106*b1cdbd2cSJim Jagielski 
2107*b1cdbd2cSJim Jagielski 	if ( pImp->pFilterSIDs )
2108*b1cdbd2cSJim Jagielski 		pImp->pFilterSIDs = 0;
2109*b1cdbd2cSJim Jagielski 
2110*b1cdbd2cSJim Jagielski 	pImp->bFilterEnabling = bEnable;
2111*b1cdbd2cSJim Jagielski 	pImp->nFilterCount = nCount;
2112*b1cdbd2cSJim Jagielski 	pImp->pFilterSIDs = pSIDs;
2113*b1cdbd2cSJim Jagielski 
2114*b1cdbd2cSJim Jagielski 	GetBindings()->InvalidateAll(sal_True);
2115*b1cdbd2cSJim Jagielski }
2116*b1cdbd2cSJim Jagielski 
2117*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
2118*b1cdbd2cSJim Jagielski EXTERN_C
2119*b1cdbd2cSJim Jagielski #if defined( PM2 ) && (!defined( CSET ) && !defined ( MTW ) && !defined( WTC ))
2120*b1cdbd2cSJim Jagielski int _stdcall
2121*b1cdbd2cSJim Jagielski #else
2122*b1cdbd2cSJim Jagielski #ifdef WNT
2123*b1cdbd2cSJim Jagielski int _cdecl
2124*b1cdbd2cSJim Jagielski #else
2125*b1cdbd2cSJim Jagielski int
2126*b1cdbd2cSJim Jagielski #endif
2127*b1cdbd2cSJim Jagielski #endif
2128*b1cdbd2cSJim Jagielski 
SfxCompareSIDs_Impl(const void * pSmaller,const void * pBigger)2129*b1cdbd2cSJim Jagielski SfxCompareSIDs_Impl( const void* pSmaller, const void* pBigger )
2130*b1cdbd2cSJim Jagielski {
2131*b1cdbd2cSJim Jagielski 	DBG_MEMTEST();
2132*b1cdbd2cSJim Jagielski 	return ( (long) *((sal_uInt16*)pSmaller) ) - ( (long) *((sal_uInt16*)pBigger) );
2133*b1cdbd2cSJim Jagielski }
2134*b1cdbd2cSJim Jagielski 
2135*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
IsSlotEnabledByFilter_Impl(sal_uInt16 nSID) const2136*b1cdbd2cSJim Jagielski sal_Bool SfxDispatcher::IsSlotEnabledByFilter_Impl( sal_uInt16 nSID ) const
2137*b1cdbd2cSJim Jagielski 
2138*b1cdbd2cSJim Jagielski /*	[Beschreibung]
2139*b1cdbd2cSJim Jagielski 
2140*b1cdbd2cSJim Jagielski 	Sucht 'nSID' in dem mit <SetSlotFilter()> gesetzten Filter und
2141*b1cdbd2cSJim Jagielski 	liefert sal_True, falls die SID erlaubt ist, bzw. sal_False, falls sie
2142*b1cdbd2cSJim Jagielski 	durch den Filter disabled ist.
2143*b1cdbd2cSJim Jagielski 
2144*b1cdbd2cSJim Jagielski 	[R"uckgabewert]
2145*b1cdbd2cSJim Jagielski 	sal_Bool				0	=>	disabled
2146*b1cdbd2cSJim Jagielski 						1	=> 	enabled
2147*b1cdbd2cSJim Jagielski 						2	=>	enabled even if ReadOnlyDoc
2148*b1cdbd2cSJim Jagielski */
2149*b1cdbd2cSJim Jagielski 
2150*b1cdbd2cSJim Jagielski {
2151*b1cdbd2cSJim Jagielski 	// kein Filter?
2152*b1cdbd2cSJim Jagielski 	if ( 0 == pImp->nFilterCount )
2153*b1cdbd2cSJim Jagielski 		// => alle SIDs erlaubt
2154*b1cdbd2cSJim Jagielski 		return sal_True;
2155*b1cdbd2cSJim Jagielski 
2156*b1cdbd2cSJim Jagielski 	// suchen
2157*b1cdbd2cSJim Jagielski 	sal_Bool bFound = 0 != bsearch( &nSID, pImp->pFilterSIDs, pImp->nFilterCount,
2158*b1cdbd2cSJim Jagielski 								sizeof(sal_uInt16), SfxCompareSIDs_Impl );
2159*b1cdbd2cSJim Jagielski 
2160*b1cdbd2cSJim Jagielski 	// even if ReadOnlyDoc
2161*b1cdbd2cSJim Jagielski 	if ( 2 == pImp->bFilterEnabling )
2162*b1cdbd2cSJim Jagielski 		return bFound ? 2 : 1;
2163*b1cdbd2cSJim Jagielski 	// sonst je nach Negativ/Positiv Filter
2164*b1cdbd2cSJim Jagielski 	return pImp->bFilterEnabling ? bFound : !bFound;
2165*b1cdbd2cSJim Jagielski }
2166*b1cdbd2cSJim Jagielski 
2167*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
_TryIntercept_Impl(sal_uInt16 nSlot,SfxSlotServer & rServer,sal_Bool bSelf)2168*b1cdbd2cSJim Jagielski sal_Bool SfxDispatcher::_TryIntercept_Impl
2169*b1cdbd2cSJim Jagielski (
2170*b1cdbd2cSJim Jagielski 	sal_uInt16				nSlot,		// zu suchende Slot-Id
2171*b1cdbd2cSJim Jagielski 	SfxSlotServer&	 	rServer,	// zu f"uellende <SfxSlotServer>-Instanz
2172*b1cdbd2cSJim Jagielski 	sal_Bool				bSelf
2173*b1cdbd2cSJim Jagielski )
2174*b1cdbd2cSJim Jagielski {
2175*b1cdbd2cSJim Jagielski 	// Eventuell geh"ort der parent auch zu einer Komponente
2176*b1cdbd2cSJim Jagielski 	SfxDispatcher *pParent = pImp->pParent;
2177*b1cdbd2cSJim Jagielski 	sal_uInt16 nLevels = pImp->aStack.Count();
2178*b1cdbd2cSJim Jagielski 	while ( pParent && pParent->pImp->pFrame )
2179*b1cdbd2cSJim Jagielski 	{
2180*b1cdbd2cSJim Jagielski 		if ( pParent->pImp->pFrame->GetFrame().HasComponent() )
2181*b1cdbd2cSJim Jagielski 		{
2182*b1cdbd2cSJim Jagielski 			// Components d"urfen intercepten
2183*b1cdbd2cSJim Jagielski 			if ( pParent->_TryIntercept_Impl( nSlot, rServer, sal_True ) )
2184*b1cdbd2cSJim Jagielski 			{
2185*b1cdbd2cSJim Jagielski 				// Die eigenen Shells zum Shelllevel hinzuz"ahlen
2186*b1cdbd2cSJim Jagielski 				rServer.SetShellLevel( rServer.GetShellLevel() + nLevels );
2187*b1cdbd2cSJim Jagielski 				return sal_True;
2188*b1cdbd2cSJim Jagielski 			}
2189*b1cdbd2cSJim Jagielski 			else
2190*b1cdbd2cSJim Jagielski 				// Keine weitere Interception
2191*b1cdbd2cSJim Jagielski 				break;
2192*b1cdbd2cSJim Jagielski 		}
2193*b1cdbd2cSJim Jagielski 		else
2194*b1cdbd2cSJim Jagielski 			nLevels = nLevels + pParent->pImp->aStack.Count();
2195*b1cdbd2cSJim Jagielski 
2196*b1cdbd2cSJim Jagielski 		pParent = pParent->pImp->pParent;
2197*b1cdbd2cSJim Jagielski 	}
2198*b1cdbd2cSJim Jagielski 
2199*b1cdbd2cSJim Jagielski 	if ( bSelf )
2200*b1cdbd2cSJim Jagielski 	{
2201*b1cdbd2cSJim Jagielski 		// Die ComponentViewShell befragen
2202*b1cdbd2cSJim Jagielski 		Flush();
2203*b1cdbd2cSJim Jagielski 		SfxShell *pObjShell = GetShell(0);
2204*b1cdbd2cSJim Jagielski 		SfxInterface *pIFace = pObjShell->GetInterface();
2205*b1cdbd2cSJim Jagielski 		const SfxSlot *pSlot = pIFace->GetSlot(nSlot);
2206*b1cdbd2cSJim Jagielski 
2207*b1cdbd2cSJim Jagielski 		if ( pSlot )
2208*b1cdbd2cSJim Jagielski 		{
2209*b1cdbd2cSJim Jagielski 			rServer.SetSlot(pSlot);
2210*b1cdbd2cSJim Jagielski 			rServer.SetShellLevel(0);
2211*b1cdbd2cSJim Jagielski #ifdef DBG_UTILx
2212*b1cdbd2cSJim Jagielski 			String aMsg( nSlot );
2213*b1cdbd2cSJim Jagielski 			aMsg += " intercepted";
2214*b1cdbd2cSJim Jagielski 			DbgTrace( aMsg.GetBuffer() );
2215*b1cdbd2cSJim Jagielski #endif
2216*b1cdbd2cSJim Jagielski 			return sal_True;
2217*b1cdbd2cSJim Jagielski 		}
2218*b1cdbd2cSJim Jagielski 	}
2219*b1cdbd2cSJim Jagielski 
2220*b1cdbd2cSJim Jagielski 	return sal_False;
2221*b1cdbd2cSJim Jagielski }
2222*b1cdbd2cSJim Jagielski 
_FindServer(sal_uInt16 nSlot,SfxSlotServer & rServer,sal_Bool bModal)2223*b1cdbd2cSJim Jagielski sal_Bool SfxDispatcher::_FindServer
2224*b1cdbd2cSJim Jagielski (
2225*b1cdbd2cSJim Jagielski 	sal_uInt16				nSlot,		// zu suchende Slot-Id
2226*b1cdbd2cSJim Jagielski 	SfxSlotServer&	 rServer,	 // zu f"uellnde <SfxSlotServer>-Instanz
2227*b1cdbd2cSJim Jagielski 	sal_Bool				bModal		// trotz ModalMode
2228*b1cdbd2cSJim Jagielski )
2229*b1cdbd2cSJim Jagielski 
2230*b1cdbd2cSJim Jagielski /*	[Beschreibung]
2231*b1cdbd2cSJim Jagielski 
2232*b1cdbd2cSJim Jagielski 	Diese Hilfsmethode sucht den <Slot-Server>, der nSlot zur Zeit bedient.
2233*b1cdbd2cSJim Jagielski 	Als Ergebnis wird rServer entsprechend gef"ullt.
2234*b1cdbd2cSJim Jagielski 
2235*b1cdbd2cSJim Jagielski 	Falls bekannt, kann das SfxInterface mitgegeben werden, von welchem
2236*b1cdbd2cSJim Jagielski 	nSlot momentan bedient wird.
2237*b1cdbd2cSJim Jagielski 
2238*b1cdbd2cSJim Jagielski 	Vor der Suche nach nSlot wird der SfxDispatcher geflusht.
2239*b1cdbd2cSJim Jagielski 
2240*b1cdbd2cSJim Jagielski 
2241*b1cdbd2cSJim Jagielski 	[R"uckgabewert]
2242*b1cdbd2cSJim Jagielski 
2243*b1cdbd2cSJim Jagielski 	sal_Bool				sal_True
2244*b1cdbd2cSJim Jagielski 						Der Slot wurde gefunden, rServer ist g"ultig.
2245*b1cdbd2cSJim Jagielski 
2246*b1cdbd2cSJim Jagielski 						sal_False
2247*b1cdbd2cSJim Jagielski 						Der Slot wird momentan nicht bedient, rServer
2248*b1cdbd2cSJim Jagielski 						ist ung"ultig.
2249*b1cdbd2cSJim Jagielski */
2250*b1cdbd2cSJim Jagielski 
2251*b1cdbd2cSJim Jagielski {
2252*b1cdbd2cSJim Jagielski 	SFX_STACK(SfxDispatcher::_FindServer);
2253*b1cdbd2cSJim Jagielski 
2254*b1cdbd2cSJim Jagielski 	// Dispatcher gelockt? (SID_HELP_PI trotzdem durchlassen)
2255*b1cdbd2cSJim Jagielski 	if ( IsLocked(nSlot) )
2256*b1cdbd2cSJim Jagielski 	{
2257*b1cdbd2cSJim Jagielski 		pImp->bInvalidateOnUnlock = sal_True;
2258*b1cdbd2cSJim Jagielski 		return sal_False;
2259*b1cdbd2cSJim Jagielski 	}
2260*b1cdbd2cSJim Jagielski 
2261*b1cdbd2cSJim Jagielski 	// Anzahl der Shells auf den verkettenten Dispatchern z"ahlen
2262*b1cdbd2cSJim Jagielski 	Flush();
2263*b1cdbd2cSJim Jagielski 	sal_uInt16 nTotCount = pImp->aStack.Count();
2264*b1cdbd2cSJim Jagielski 	if ( pImp->pParent )
2265*b1cdbd2cSJim Jagielski 	{
2266*b1cdbd2cSJim Jagielski 		SfxDispatcher *pParent = pImp->pParent;
2267*b1cdbd2cSJim Jagielski 		while ( pParent )
2268*b1cdbd2cSJim Jagielski 		{
2269*b1cdbd2cSJim Jagielski 			nTotCount = nTotCount + pParent->pImp->aStack.Count();
2270*b1cdbd2cSJim Jagielski 			pParent = pParent->pImp->pParent;
2271*b1cdbd2cSJim Jagielski 		}
2272*b1cdbd2cSJim Jagielski 	}
2273*b1cdbd2cSJim Jagielski 
2274*b1cdbd2cSJim Jagielski 	// Verb-Slot?
2275*b1cdbd2cSJim Jagielski 	if (nSlot >= SID_VERB_START && nSlot <= SID_VERB_END)
2276*b1cdbd2cSJim Jagielski 	{
2277*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 nShell = 0;; ++nShell )
2278*b1cdbd2cSJim Jagielski 		{
2279*b1cdbd2cSJim Jagielski             SfxShell *pSh = GetShell(nShell);
2280*b1cdbd2cSJim Jagielski             if ( pSh == NULL )
2281*b1cdbd2cSJim Jagielski                 return false;
2282*b1cdbd2cSJim Jagielski 			if ( pSh->ISA(SfxViewShell) )
2283*b1cdbd2cSJim Jagielski 			{
2284*b1cdbd2cSJim Jagielski                 const SfxSlot* pSlot = pSh->GetVerbSlot_Impl(nSlot);
2285*b1cdbd2cSJim Jagielski                 if ( pSlot )
2286*b1cdbd2cSJim Jagielski                 {
2287*b1cdbd2cSJim Jagielski                     rServer.SetShellLevel(nShell);
2288*b1cdbd2cSJim Jagielski                     rServer.SetSlot( pSlot );
2289*b1cdbd2cSJim Jagielski                     return true;
2290*b1cdbd2cSJim Jagielski                 }
2291*b1cdbd2cSJim Jagielski 			}
2292*b1cdbd2cSJim Jagielski 		}
2293*b1cdbd2cSJim Jagielski 	}
2294*b1cdbd2cSJim Jagielski 
2295*b1cdbd2cSJim Jagielski 	// SID gegen gesetzten Filter pr"ufen
2296*b1cdbd2cSJim Jagielski 	sal_uInt16 nSlotEnableMode=0;
2297*b1cdbd2cSJim Jagielski 	if ( pImp->pFrame )
2298*b1cdbd2cSJim Jagielski 	{
2299*b1cdbd2cSJim Jagielski 		nSlotEnableMode = IsSlotEnabledByFilter_Impl( nSlot );
2300*b1cdbd2cSJim Jagielski 		if ( 0 == nSlotEnableMode )
2301*b1cdbd2cSJim Jagielski 			return sal_False;
2302*b1cdbd2cSJim Jagielski 	}
2303*b1cdbd2cSJim Jagielski 
2304*b1cdbd2cSJim Jagielski 	// im Quiet-Mode nur Parent-Dispatcher
2305*b1cdbd2cSJim Jagielski 	if ( pImp->bQuiet )
2306*b1cdbd2cSJim Jagielski 	{
2307*b1cdbd2cSJim Jagielski 		if ( pImp->pParent )
2308*b1cdbd2cSJim Jagielski 		{
2309*b1cdbd2cSJim Jagielski 			sal_Bool bRet = pImp->pParent->_FindServer( nSlot, rServer, bModal );
2310*b1cdbd2cSJim Jagielski 			rServer.SetShellLevel
2311*b1cdbd2cSJim Jagielski 				( rServer.GetShellLevel() + pImp->aStack.Count() );
2312*b1cdbd2cSJim Jagielski 			return bRet;
2313*b1cdbd2cSJim Jagielski 		}
2314*b1cdbd2cSJim Jagielski 		else
2315*b1cdbd2cSJim Jagielski 			return sal_False;
2316*b1cdbd2cSJim Jagielski 	}
2317*b1cdbd2cSJim Jagielski 
2318*b1cdbd2cSJim Jagielski 	sal_Bool bReadOnly = ( 2 != nSlotEnableMode && pImp->bReadOnly );
2319*b1cdbd2cSJim Jagielski //				( pImp->pFrame && pImp->pFrame->GetObjectShell() );
2320*b1cdbd2cSJim Jagielski //				  pImp->pFrame->GetObjectShell()->IsLoading() );
2321*b1cdbd2cSJim Jagielski 
2322*b1cdbd2cSJim Jagielski 	// durch alle Shells der verketteten Dispatchern von oben nach unten suchen
2323*b1cdbd2cSJim Jagielski #ifdef DBG_UTILx
2324*b1cdbd2cSJim Jagielski 	String aStack( "Stack:" );
2325*b1cdbd2cSJim Jagielski #endif
2326*b1cdbd2cSJim Jagielski 	sal_uInt16 nFirstShell = pImp->bModal && !bModal ? pImp->aStack.Count() : 0;
2327*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = nFirstShell; i < nTotCount; ++i )
2328*b1cdbd2cSJim Jagielski 	{
2329*b1cdbd2cSJim Jagielski 		SfxShell *pObjShell = GetShell(i);
2330*b1cdbd2cSJim Jagielski 		SfxInterface *pIFace = pObjShell->GetInterface();
2331*b1cdbd2cSJim Jagielski 		const SfxSlot *pSlot = pIFace->GetSlot(nSlot);
2332*b1cdbd2cSJim Jagielski 
2333*b1cdbd2cSJim Jagielski 		if ( pSlot && pSlot->nDisableFlags && ( pSlot->nDisableFlags & pObjShell->GetDisableFlags() ) != 0 )
2334*b1cdbd2cSJim Jagielski 			return sal_False;
2335*b1cdbd2cSJim Jagielski 
2336*b1cdbd2cSJim Jagielski 		if ( pSlot && !( pSlot->nFlags & SFX_SLOT_READONLYDOC ) && bReadOnly )
2337*b1cdbd2cSJim Jagielski 			return sal_False;
2338*b1cdbd2cSJim Jagielski 
2339*b1cdbd2cSJim Jagielski 		if ( pSlot )
2340*b1cdbd2cSJim Jagielski 		{
2341*b1cdbd2cSJim Jagielski 			// Slot geh"ort zum Container?
2342*b1cdbd2cSJim Jagielski 			bool bIsContainerSlot = pSlot->IsMode(SFX_SLOT_CONTAINER);
2343*b1cdbd2cSJim Jagielski             bool bIsInPlace = pImp->pFrame && pImp->pFrame->GetObjectShell()->IsInPlaceActive();
2344*b1cdbd2cSJim Jagielski 
2345*b1cdbd2cSJim Jagielski 			// Shell geh"ort zum Server?
2346*b1cdbd2cSJim Jagielski 			// AppDispatcher oder IPFrame-Dispatcher
2347*b1cdbd2cSJim Jagielski 			bool bIsServerShell = !pImp->pFrame || bIsInPlace;
2348*b1cdbd2cSJim Jagielski 
2349*b1cdbd2cSJim Jagielski 			// Nat"urlich sind ServerShell-Slots auch ausf"uhrbar, wenn sie auf
2350*b1cdbd2cSJim Jagielski 			// einem Container-Dispatcher ohne IPClient ausgef"uhrt werden sollen.
2351*b1cdbd2cSJim Jagielski 			if ( !bIsServerShell )
2352*b1cdbd2cSJim Jagielski 			{
2353*b1cdbd2cSJim Jagielski 				SfxViewShell *pViewSh = pImp->pFrame->GetViewShell();
2354*b1cdbd2cSJim Jagielski                 bIsServerShell = !pViewSh || !pViewSh->GetUIActiveClient();
2355*b1cdbd2cSJim Jagielski 			}
2356*b1cdbd2cSJim Jagielski 
2357*b1cdbd2cSJim Jagielski 			// Shell geh"ort zum Container?
2358*b1cdbd2cSJim Jagielski 			// AppDispatcher oder kein IPFrameDispatcher
2359*b1cdbd2cSJim Jagielski 			bool bIsContainerShell = !pImp->pFrame || !bIsInPlace;
2360*b1cdbd2cSJim Jagielski 			// Shell und Slot passen zusammen
2361*b1cdbd2cSJim Jagielski 			if ( !( ( bIsContainerSlot && bIsContainerShell ) ||
2362*b1cdbd2cSJim Jagielski 					( !bIsContainerSlot && bIsServerShell ) ) )
2363*b1cdbd2cSJim Jagielski 				pSlot = 0;
2364*b1cdbd2cSJim Jagielski 		}
2365*b1cdbd2cSJim Jagielski 
2366*b1cdbd2cSJim Jagielski #ifdef DBG_UTILx
2367*b1cdbd2cSJim Jagielski 		if ( pSlot )
2368*b1cdbd2cSJim Jagielski 		{
2369*b1cdbd2cSJim Jagielski 			String aMsg( nSlot );
2370*b1cdbd2cSJim Jagielski 			aMsg += " found in ";
2371*b1cdbd2cSJim Jagielski 			aMsg += pObjShell->GetInterface()->GetClassName();
2372*b1cdbd2cSJim Jagielski 			DbgTrace( aMsg.GetBuffer() );
2373*b1cdbd2cSJim Jagielski 		}
2374*b1cdbd2cSJim Jagielski 		else
2375*b1cdbd2cSJim Jagielski 		{
2376*b1cdbd2cSJim Jagielski 			aStack += " ";
2377*b1cdbd2cSJim Jagielski 			aStack += pObjShell->GetInterface()->GetClassName();
2378*b1cdbd2cSJim Jagielski 		}
2379*b1cdbd2cSJim Jagielski #endif
2380*b1cdbd2cSJim Jagielski 		if ( pSlot && !IsAllowed( nSlot ) )
2381*b1cdbd2cSJim Jagielski 		{
2382*b1cdbd2cSJim Jagielski 			pSlot = NULL;
2383*b1cdbd2cSJim Jagielski 		}
2384*b1cdbd2cSJim Jagielski 
2385*b1cdbd2cSJim Jagielski 		if ( pSlot )
2386*b1cdbd2cSJim Jagielski 		{
2387*b1cdbd2cSJim Jagielski 			rServer.SetSlot(pSlot);
2388*b1cdbd2cSJim Jagielski 			rServer.SetShellLevel(i);
2389*b1cdbd2cSJim Jagielski 			return sal_True;
2390*b1cdbd2cSJim Jagielski 		}
2391*b1cdbd2cSJim Jagielski 	}
2392*b1cdbd2cSJim Jagielski 
2393*b1cdbd2cSJim Jagielski #ifdef DBG_UTILx
2394*b1cdbd2cSJim Jagielski 	String aMsg( nSlot );
2395*b1cdbd2cSJim Jagielski 	aMsg += " not found in ";
2396*b1cdbd2cSJim Jagielski 	aMsg += aStack;
2397*b1cdbd2cSJim Jagielski 	DbgTrace( aMsg.GetBuffer() );
2398*b1cdbd2cSJim Jagielski #endif
2399*b1cdbd2cSJim Jagielski 	return sal_False;
2400*b1cdbd2cSJim Jagielski }
2401*b1cdbd2cSJim Jagielski 
HasSlot_Impl(sal_uInt16 nSlot)2402*b1cdbd2cSJim Jagielski sal_Bool SfxDispatcher::HasSlot_Impl( sal_uInt16 nSlot )
2403*b1cdbd2cSJim Jagielski {
2404*b1cdbd2cSJim Jagielski 	Flush();
2405*b1cdbd2cSJim Jagielski 	sal_uInt16 nTotCount = pImp->aStack.Count();
2406*b1cdbd2cSJim Jagielski 
2407*b1cdbd2cSJim Jagielski     if ( pImp->pParent && !pImp->pParent->pImp->pFrame )
2408*b1cdbd2cSJim Jagielski     {
2409*b1cdbd2cSJim Jagielski         // the last frame also uses the AppDispatcher
2410*b1cdbd2cSJim Jagielski         nTotCount = nTotCount + pImp->aStack.Count();
2411*b1cdbd2cSJim Jagielski     }
2412*b1cdbd2cSJim Jagielski 
2413*b1cdbd2cSJim Jagielski 	if (nSlot >= SID_VERB_START && nSlot <= SID_VERB_END)
2414*b1cdbd2cSJim Jagielski 	{
2415*b1cdbd2cSJim Jagielski         // Verb-Slot?
2416*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 nShell = 0;; ++nShell )
2417*b1cdbd2cSJim Jagielski 		{
2418*b1cdbd2cSJim Jagielski             SfxShell *pSh = GetShell(nShell);
2419*b1cdbd2cSJim Jagielski             if ( pSh == NULL )
2420*b1cdbd2cSJim Jagielski                 return false;
2421*b1cdbd2cSJim Jagielski 			if ( pSh->ISA(SfxViewShell) )
2422*b1cdbd2cSJim Jagielski 				return true;
2423*b1cdbd2cSJim Jagielski 		}
2424*b1cdbd2cSJim Jagielski 	}
2425*b1cdbd2cSJim Jagielski 
2426*b1cdbd2cSJim Jagielski 	// SID gegen gesetzten Filter pr"ufen
2427*b1cdbd2cSJim Jagielski 	sal_uInt16 nSlotEnableMode=0;
2428*b1cdbd2cSJim Jagielski 	if ( pImp->pFrame )
2429*b1cdbd2cSJim Jagielski 	{
2430*b1cdbd2cSJim Jagielski 		nSlotEnableMode = IsSlotEnabledByFilter_Impl( nSlot );
2431*b1cdbd2cSJim Jagielski 		if ( 0 == nSlotEnableMode )
2432*b1cdbd2cSJim Jagielski 			return sal_False;
2433*b1cdbd2cSJim Jagielski 	}
2434*b1cdbd2cSJim Jagielski 
2435*b1cdbd2cSJim Jagielski 	// im Quiet-Mode nur Parent-Dispatcher
2436*b1cdbd2cSJim Jagielski 	if ( pImp->bQuiet )
2437*b1cdbd2cSJim Jagielski 		return sal_False;
2438*b1cdbd2cSJim Jagielski 
2439*b1cdbd2cSJim Jagielski 	sal_Bool bReadOnly = ( 2 != nSlotEnableMode && pImp->bReadOnly );
2440*b1cdbd2cSJim Jagielski //				( pImp->pFrame && pImp->pFrame->GetObjectShell());
2441*b1cdbd2cSJim Jagielski //				  pImp->pFrame->GetObjectShell()->IsLoading() );
2442*b1cdbd2cSJim Jagielski 
2443*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i=0 ; i < nTotCount; ++i )
2444*b1cdbd2cSJim Jagielski 	{
2445*b1cdbd2cSJim Jagielski 		SfxShell *pObjShell = GetShell(i);
2446*b1cdbd2cSJim Jagielski 		SfxInterface *pIFace = pObjShell->GetInterface();
2447*b1cdbd2cSJim Jagielski 		const SfxSlot *pSlot = pIFace->GetSlot(nSlot);
2448*b1cdbd2cSJim Jagielski 		if ( pSlot && pSlot->nDisableFlags && ( pSlot->nDisableFlags & pObjShell->GetDisableFlags() ) != 0 )
2449*b1cdbd2cSJim Jagielski 			return sal_False;
2450*b1cdbd2cSJim Jagielski 
2451*b1cdbd2cSJim Jagielski 		if ( pSlot && !( pSlot->nFlags & SFX_SLOT_READONLYDOC ) && bReadOnly )
2452*b1cdbd2cSJim Jagielski 			return sal_False;
2453*b1cdbd2cSJim Jagielski 
2454*b1cdbd2cSJim Jagielski 		if ( pSlot )
2455*b1cdbd2cSJim Jagielski 		{
2456*b1cdbd2cSJim Jagielski 			// Slot geh"ort zum Container?
2457*b1cdbd2cSJim Jagielski 			bool bIsContainerSlot = pSlot->IsMode(SFX_SLOT_CONTAINER);
2458*b1cdbd2cSJim Jagielski             bool bIsInPlace = pImp->pFrame && pImp->pFrame->GetObjectShell()->IsInPlaceActive();
2459*b1cdbd2cSJim Jagielski 
2460*b1cdbd2cSJim Jagielski             // Shell geh"ort zum Server?
2461*b1cdbd2cSJim Jagielski 			// AppDispatcher oder IPFrame-Dispatcher
2462*b1cdbd2cSJim Jagielski 			bool bIsServerShell = !pImp->pFrame || bIsInPlace;
2463*b1cdbd2cSJim Jagielski 
2464*b1cdbd2cSJim Jagielski 			// Nat"urlich sind ServerShell-Slots auch ausf"uhrbar, wenn sie auf
2465*b1cdbd2cSJim Jagielski 			// einem Container-Dispatcher ohne IPClient ausgef"uhrt werden sollen.
2466*b1cdbd2cSJim Jagielski 			if ( !bIsServerShell )
2467*b1cdbd2cSJim Jagielski 			{
2468*b1cdbd2cSJim Jagielski 				SfxViewShell *pViewSh = pImp->pFrame->GetViewShell();
2469*b1cdbd2cSJim Jagielski                 bIsServerShell = !pViewSh || !pViewSh->GetUIActiveClient();
2470*b1cdbd2cSJim Jagielski 			}
2471*b1cdbd2cSJim Jagielski 
2472*b1cdbd2cSJim Jagielski 			// Shell geh"ort zum Container?
2473*b1cdbd2cSJim Jagielski 			// AppDispatcher oder kein IPFrameDispatcher
2474*b1cdbd2cSJim Jagielski 			bool bIsContainerShell = !pImp->pFrame || !bIsInPlace;
2475*b1cdbd2cSJim Jagielski 
2476*b1cdbd2cSJim Jagielski 			// Shell und Slot passen zusammen
2477*b1cdbd2cSJim Jagielski 			if ( !( ( bIsContainerSlot && bIsContainerShell ) ||
2478*b1cdbd2cSJim Jagielski 					( !bIsContainerSlot && bIsServerShell ) ) )
2479*b1cdbd2cSJim Jagielski 				pSlot = 0;
2480*b1cdbd2cSJim Jagielski 		}
2481*b1cdbd2cSJim Jagielski 
2482*b1cdbd2cSJim Jagielski 		if ( pSlot && !IsAllowed( nSlot ) )
2483*b1cdbd2cSJim Jagielski 			pSlot = NULL;
2484*b1cdbd2cSJim Jagielski 
2485*b1cdbd2cSJim Jagielski 		if ( pSlot )
2486*b1cdbd2cSJim Jagielski 			return sal_True;
2487*b1cdbd2cSJim Jagielski 	}
2488*b1cdbd2cSJim Jagielski 
2489*b1cdbd2cSJim Jagielski 	return sal_False;
2490*b1cdbd2cSJim Jagielski }
2491*b1cdbd2cSJim Jagielski 
2492*b1cdbd2cSJim Jagielski 
2493*b1cdbd2cSJim Jagielski 
2494*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
_FillState(const SfxSlotServer & rSvr,SfxItemSet & rState,const SfxSlot * pRealSlot)2495*b1cdbd2cSJim Jagielski sal_Bool SfxDispatcher::_FillState
2496*b1cdbd2cSJim Jagielski (
2497*b1cdbd2cSJim Jagielski 	const SfxSlotServer& rSvr,		 // abzufragende <Slot-Server>
2498*b1cdbd2cSJim Jagielski 	SfxItemSet& 			rState, 	// zu f"ullendes <SfxItemSet>
2499*b1cdbd2cSJim Jagielski 	const SfxSlot*			pRealSlot	// ggf. der tats"achliche Slot
2500*b1cdbd2cSJim Jagielski )
2501*b1cdbd2cSJim Jagielski 
2502*b1cdbd2cSJim Jagielski /*	[Beschreibung]
2503*b1cdbd2cSJim Jagielski 
2504*b1cdbd2cSJim Jagielski 	Hilfsmethode zum Abfragen des Status des <Slot-Server>s rSvr.
2505*b1cdbd2cSJim Jagielski 	In rState m"ussen die gew"unschten Slots-Ids (teilweise in Which-Ids
2506*b1cdbd2cSJim Jagielski 	des betreffenden Pools umgewandelt) vorhanden sein.
2507*b1cdbd2cSJim Jagielski 
2508*b1cdbd2cSJim Jagielski 	Der SfxDispatcher wird vor der Abfrage geflusht.
2509*b1cdbd2cSJim Jagielski */
2510*b1cdbd2cSJim Jagielski 
2511*b1cdbd2cSJim Jagielski {
2512*b1cdbd2cSJim Jagielski 	SFX_STACK(SfxDispatcher::_FillState);
2513*b1cdbd2cSJim Jagielski 
2514*b1cdbd2cSJim Jagielski 	DBG_PROFSTART(SfxDispatcherFillState);
2515*b1cdbd2cSJim Jagielski 
2516*b1cdbd2cSJim Jagielski 	const SfxSlot *pSlot = rSvr.GetSlot();
2517*b1cdbd2cSJim Jagielski 	if ( pSlot && IsLocked( pSlot->GetSlotId() ) )
2518*b1cdbd2cSJim Jagielski 	{
2519*b1cdbd2cSJim Jagielski 		pImp->bInvalidateOnUnlock = sal_True;
2520*b1cdbd2cSJim Jagielski 		DBG_PROFSTOP(SfxDispatcherFillState);
2521*b1cdbd2cSJim Jagielski 		return sal_False;
2522*b1cdbd2cSJim Jagielski 	}
2523*b1cdbd2cSJim Jagielski 
2524*b1cdbd2cSJim Jagielski 	if ( pSlot )
2525*b1cdbd2cSJim Jagielski 	{
2526*b1cdbd2cSJim Jagielski 		DBG_ASSERT(bFlushed, "Dispatcher not flushed after retrieving slot servers!");
2527*b1cdbd2cSJim Jagielski         if ( !bFlushed )
2528*b1cdbd2cSJim Jagielski             return sal_False;
2529*b1cdbd2cSJim Jagielski 		// Flush();
2530*b1cdbd2cSJim Jagielski 
2531*b1cdbd2cSJim Jagielski 		// Objekt ermitteln und Message an diesem Objekt aufrufen
2532*b1cdbd2cSJim Jagielski 		SfxShell *pSh = GetShell(rSvr.GetShellLevel());
2533*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pSh, "ObjektShell nicht gefunden");
2534*b1cdbd2cSJim Jagielski 
2535*b1cdbd2cSJim Jagielski 		SfxStateFunc pFunc;
2536*b1cdbd2cSJim Jagielski 
2537*b1cdbd2cSJim Jagielski 		if (pRealSlot)
2538*b1cdbd2cSJim Jagielski 			pFunc = pRealSlot->GetStateFnc();
2539*b1cdbd2cSJim Jagielski 		else
2540*b1cdbd2cSJim Jagielski 			pFunc = pSlot->GetStateFnc();
2541*b1cdbd2cSJim Jagielski 
2542*b1cdbd2cSJim Jagielski 		pSh->CallState( pFunc, rState );
2543*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
2544*b1cdbd2cSJim Jagielski 		// pr"ufen, ob IDL (SlotMap) und aktuelle Items "ubereinstimmen
2545*b1cdbd2cSJim Jagielski 		if ( DbgIsAssertWarning() && rState.Count() )
2546*b1cdbd2cSJim Jagielski 		{
2547*b1cdbd2cSJim Jagielski 			SfxInterface *pIF = pSh->GetInterface();
2548*b1cdbd2cSJim Jagielski 			SfxItemIter aIter( rState );
2549*b1cdbd2cSJim Jagielski 			for ( const SfxPoolItem *pItem = aIter.FirstItem();
2550*b1cdbd2cSJim Jagielski 				  pItem;
2551*b1cdbd2cSJim Jagielski 				  pItem = aIter.NextItem() )
2552*b1cdbd2cSJim Jagielski 				if ( !IsInvalidItem(pItem) && !pItem->ISA(SfxVoidItem) )
2553*b1cdbd2cSJim Jagielski 				{
2554*b1cdbd2cSJim Jagielski 					sal_uInt16 nSlotId = rState.GetPool()->GetSlotId(pItem->Which());
2555*b1cdbd2cSJim Jagielski 					if ( !pItem->IsA(pIF->GetSlot(nSlotId)->GetType()->Type()) )
2556*b1cdbd2cSJim Jagielski 					{
2557*b1cdbd2cSJim Jagielski 						ByteString aMsg( "item-type unequal to IDL (=> no BASIC)" );
2558*b1cdbd2cSJim Jagielski 						aMsg += "\nwith SID: ";
2559*b1cdbd2cSJim Jagielski 						aMsg += ByteString::CreateFromInt32( nSlotId );
2560*b1cdbd2cSJim Jagielski 						aMsg += "\nin ";
2561*b1cdbd2cSJim Jagielski 						aMsg += pIF->GetClassName();
2562*b1cdbd2cSJim Jagielski 						DbgOut( aMsg.GetBuffer(), DBG_OUT_ERROR, __FILE__, __LINE__);
2563*b1cdbd2cSJim Jagielski 					}
2564*b1cdbd2cSJim Jagielski 				}
2565*b1cdbd2cSJim Jagielski 		}
2566*b1cdbd2cSJim Jagielski #endif
2567*b1cdbd2cSJim Jagielski 
2568*b1cdbd2cSJim Jagielski 		DBG_PROFSTOP(SfxDispatcherFillState);
2569*b1cdbd2cSJim Jagielski 		return sal_True;
2570*b1cdbd2cSJim Jagielski 	}
2571*b1cdbd2cSJim Jagielski 
2572*b1cdbd2cSJim Jagielski 	DBG_PROFSTOP(SfxDispatcherFillState);
2573*b1cdbd2cSJim Jagielski 	return sal_False;
2574*b1cdbd2cSJim Jagielski }
2575*b1cdbd2cSJim Jagielski 
2576*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
_Execute(const SfxSlotServer & rSvr)2577*b1cdbd2cSJim Jagielski const SfxPoolItem* SfxDispatcher::_Execute( const SfxSlotServer &rSvr )
2578*b1cdbd2cSJim Jagielski 
2579*b1cdbd2cSJim Jagielski /*  [Beschreibung]
2580*b1cdbd2cSJim Jagielski 
2581*b1cdbd2cSJim Jagielski 	Diese Methode f"uhrt einen Request "uber einen gecachten <Slot-Server>
2582*b1cdbd2cSJim Jagielski 	aus.
2583*b1cdbd2cSJim Jagielski */
2584*b1cdbd2cSJim Jagielski 
2585*b1cdbd2cSJim Jagielski {
2586*b1cdbd2cSJim Jagielski 	const SfxSlot *pSlot = rSvr.GetSlot();
2587*b1cdbd2cSJim Jagielski 	if ( IsLocked( pSlot->GetSlotId() ) )
2588*b1cdbd2cSJim Jagielski 		return 0;
2589*b1cdbd2cSJim Jagielski 
2590*b1cdbd2cSJim Jagielski 	if ( pSlot )
2591*b1cdbd2cSJim Jagielski 	{
2592*b1cdbd2cSJim Jagielski 		Flush();
2593*b1cdbd2cSJim Jagielski 
2594*b1cdbd2cSJim Jagielski 		if ( pSlot->IsMode(SFX_SLOT_ASYNCHRON) )
2595*b1cdbd2cSJim Jagielski 			//! ignoriert rSvr
2596*b1cdbd2cSJim Jagielski 		{
2597*b1cdbd2cSJim Jagielski 			SfxShell *pShell = GetShell( rSvr.GetShellLevel() );
2598*b1cdbd2cSJim Jagielski 			SfxDispatcher *pDispat = this;
2599*b1cdbd2cSJim Jagielski 			while ( pDispat )
2600*b1cdbd2cSJim Jagielski 			{
2601*b1cdbd2cSJim Jagielski 				sal_uInt16 nShellCount = pDispat->pImp->aStack.Count();
2602*b1cdbd2cSJim Jagielski 				for ( sal_uInt16 n=0; n<nShellCount; n++ )
2603*b1cdbd2cSJim Jagielski 					if ( pShell == pDispat->pImp->aStack.Top(n) )
2604*b1cdbd2cSJim Jagielski 					{
2605*b1cdbd2cSJim Jagielski                         pDispat->pImp->xPoster->Post(
2606*b1cdbd2cSJim Jagielski                             new SfxRequest( pSlot->GetSlotId(),
2607*b1cdbd2cSJim Jagielski                                 SFX_CALLMODE_RECORD, pShell->GetPool() ) );
2608*b1cdbd2cSJim Jagielski //                        pDispat->pImp->xPoster->Post(new Executer(
2609*b1cdbd2cSJim Jagielski //                                new SfxRequest( pSlot->GetSlotId(),
2610*b1cdbd2cSJim Jagielski //                                    SFX_CALLMODE_RECORD, pShell->GetPool() ),
2611*b1cdbd2cSJim Jagielski //                                pSlot, n ));
2612*b1cdbd2cSJim Jagielski 						return 0;
2613*b1cdbd2cSJim Jagielski 					}
2614*b1cdbd2cSJim Jagielski 			}
2615*b1cdbd2cSJim Jagielski 		}
2616*b1cdbd2cSJim Jagielski 		else
2617*b1cdbd2cSJim Jagielski 		{
2618*b1cdbd2cSJim Jagielski 			// Objekt ermitteln und Message an diesem Objekt aufrufen
2619*b1cdbd2cSJim Jagielski 			SfxShell *pSh = GetShell(rSvr.GetShellLevel());
2620*b1cdbd2cSJim Jagielski 			SfxRequest aReq( pSlot->GetSlotId(), SFX_CALLMODE_RECORD, pSh->GetPool() );
2621*b1cdbd2cSJim Jagielski 			if ( Call_Impl( *pSh, *pSlot, aReq, sal_True ) ) // von Bindings immer recorden
2622*b1cdbd2cSJim Jagielski 				return aReq.GetReturnValue();
2623*b1cdbd2cSJim Jagielski 		}
2624*b1cdbd2cSJim Jagielski 	}
2625*b1cdbd2cSJim Jagielski 	return 0;
2626*b1cdbd2cSJim Jagielski }
2627*b1cdbd2cSJim Jagielski 
2628*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------
ExecutePopup(sal_uInt16 nConfigId,Window * pWin,const Point * pPos,const SfxPoolItem *,...)2629*b1cdbd2cSJim Jagielski void SfxDispatcher::ExecutePopup( sal_uInt16 nConfigId,
2630*b1cdbd2cSJim Jagielski 								  Window *pWin, const Point *pPos,
2631*b1cdbd2cSJim Jagielski 								  const SfxPoolItem *, ... )
2632*b1cdbd2cSJim Jagielski {
2633*b1cdbd2cSJim Jagielski     ExecutePopup( nConfigId, pWin, pPos );
2634*b1cdbd2cSJim Jagielski }
2635*b1cdbd2cSJim Jagielski 
Popup(sal_uInt16 nConfigId,Window * pWin,const Point * pPos)2636*b1cdbd2cSJim Jagielski SfxPopupMenuManager* SfxDispatcher::Popup( sal_uInt16 nConfigId,Window *pWin, const Point *pPos )
2637*b1cdbd2cSJim Jagielski {
2638*b1cdbd2cSJim Jagielski 	SfxDispatcher &rDisp = *SFX_APP()->GetDispatcher_Impl();
2639*b1cdbd2cSJim Jagielski 	sal_uInt16 nShLevel = 0;
2640*b1cdbd2cSJim Jagielski 	SfxShell *pSh;
2641*b1cdbd2cSJim Jagielski 	nShLevel=0;
2642*b1cdbd2cSJim Jagielski 
2643*b1cdbd2cSJim Jagielski 	if ( rDisp.pImp->bQuiet )
2644*b1cdbd2cSJim Jagielski 	{
2645*b1cdbd2cSJim Jagielski 		nConfigId = 0;
2646*b1cdbd2cSJim Jagielski 		nShLevel = rDisp.pImp->aStack.Count();
2647*b1cdbd2cSJim Jagielski 	}
2648*b1cdbd2cSJim Jagielski 
2649*b1cdbd2cSJim Jagielski 	Window *pWindow = pWin ? pWin : rDisp.pImp->pFrame->GetFrame().GetWorkWindow_Impl()->GetWindow();
2650*b1cdbd2cSJim Jagielski     for ( pSh = rDisp.GetShell(nShLevel); pSh; ++nShLevel, pSh = rDisp.GetShell(nShLevel) )
2651*b1cdbd2cSJim Jagielski 	{
2652*b1cdbd2cSJim Jagielski 		const ResId& rResId = pSh->GetInterface()->GetPopupMenuResId();
2653*b1cdbd2cSJim Jagielski         if ( ( nConfigId == 0 && rResId.GetId() ) || ( nConfigId != 0 && rResId.GetId() == nConfigId ) )
2654*b1cdbd2cSJim Jagielski 		{
2655*b1cdbd2cSJim Jagielski                 return SfxPopupMenuManager::Popup( rResId, rDisp.GetFrame(), pPos ? *pPos : pWindow->GetPointerPosPixel(), pWindow );
2656*b1cdbd2cSJim Jagielski 		}
2657*b1cdbd2cSJim Jagielski 	}
2658*b1cdbd2cSJim Jagielski 	return 0;
2659*b1cdbd2cSJim Jagielski }
2660*b1cdbd2cSJim Jagielski 
2661*b1cdbd2cSJim Jagielski 
2662*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------
ExecutePopup(sal_uInt16 nConfigId,Window * pWin,const Point * pPos)2663*b1cdbd2cSJim Jagielski void SfxDispatcher::ExecutePopup( sal_uInt16 nConfigId, Window *pWin, const Point *pPos )
2664*b1cdbd2cSJim Jagielski {
2665*b1cdbd2cSJim Jagielski     SfxDispatcher &rDisp = *SFX_APP()->GetDispatcher_Impl();
2666*b1cdbd2cSJim Jagielski 	sal_uInt16 nShLevel = 0;
2667*b1cdbd2cSJim Jagielski 	SfxShell *pSh;
2668*b1cdbd2cSJim Jagielski /*
2669*b1cdbd2cSJim Jagielski 	const SvVerbList *pVerbList = 0;
2670*b1cdbd2cSJim Jagielski 	sal_uInt16 nMaxShellLevel = rDisp.pImp->aStack.Count();
2671*b1cdbd2cSJim Jagielski 	for ( pSh = rDisp.GetShell(nShLevel);
2672*b1cdbd2cSJim Jagielski 		  pSh && nShLevel < nMaxShellLevel ;
2673*b1cdbd2cSJim Jagielski 		  ++nShLevel, pSh = rDisp.GetShell(nShLevel) )
2674*b1cdbd2cSJim Jagielski 	{
2675*b1cdbd2cSJim Jagielski         if ( pSh->GetVerbs() )
2676*b1cdbd2cSJim Jagielski 		{
2677*b1cdbd2cSJim Jagielski 			pVerbList = pSh->GetVerbs();
2678*b1cdbd2cSJim Jagielski 			break;
2679*b1cdbd2cSJim Jagielski 		}
2680*b1cdbd2cSJim Jagielski     }
2681*b1cdbd2cSJim Jagielski */
2682*b1cdbd2cSJim Jagielski 	nShLevel=0;
2683*b1cdbd2cSJim Jagielski 	if ( rDisp.pImp->bQuiet )
2684*b1cdbd2cSJim Jagielski 	{
2685*b1cdbd2cSJim Jagielski 		nConfigId = 0;
2686*b1cdbd2cSJim Jagielski 		nShLevel = rDisp.pImp->aStack.Count();
2687*b1cdbd2cSJim Jagielski 	}
2688*b1cdbd2cSJim Jagielski 
2689*b1cdbd2cSJim Jagielski     Window *pWindow = pWin ? pWin : rDisp.pImp->pFrame->GetFrame().GetWorkWindow_Impl()->GetWindow();
2690*b1cdbd2cSJim Jagielski     for ( pSh = rDisp.GetShell(nShLevel); pSh; ++nShLevel, pSh = rDisp.GetShell(nShLevel) )
2691*b1cdbd2cSJim Jagielski 	{
2692*b1cdbd2cSJim Jagielski 		const ResId& rResId = pSh->GetInterface()->GetPopupMenuResId();
2693*b1cdbd2cSJim Jagielski         if ( ( nConfigId == 0 && rResId.GetId() ) || ( nConfigId != 0 && rResId.GetId() == nConfigId ) )
2694*b1cdbd2cSJim Jagielski 		{
2695*b1cdbd2cSJim Jagielski             //SfxPopupMenuManager aPop( rResId.GetId(), *rDisp.GetBindings() );
2696*b1cdbd2cSJim Jagielski             //aPop.SetResMgr(rResId.GetResMgr());
2697*b1cdbd2cSJim Jagielski             //aPop.AddClipboardFunctions();
2698*b1cdbd2cSJim Jagielski             //aPop.Initialize();
2699*b1cdbd2cSJim Jagielski             //if ( pVerbList && pVerbList->Count() )
2700*b1cdbd2cSJim Jagielski             //    aPop.InsertVerbs(pVerbList);
2701*b1cdbd2cSJim Jagielski             //aPop.RemoveDisabledEntries();
2702*b1cdbd2cSJim Jagielski             //aPop.Execute( pPos ? *pPos : pWindow->GetPointerPosPixel(), pWindow );
2703*b1cdbd2cSJim Jagielski             SfxPopupMenuManager::ExecutePopup( rResId, rDisp.GetFrame(), pPos ? *pPos : pWindow->GetPointerPosPixel(), pWindow );
2704*b1cdbd2cSJim Jagielski 			return;
2705*b1cdbd2cSJim Jagielski 		}
2706*b1cdbd2cSJim Jagielski 	}
2707*b1cdbd2cSJim Jagielski }
2708*b1cdbd2cSJim Jagielski 
2709*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------
ExecutePopup(const ResId & rId,Window * pWin,const Point * pPos)2710*b1cdbd2cSJim Jagielski void SfxDispatcher::ExecutePopup( const ResId &rId, Window *pWin, const Point *pPos )
2711*b1cdbd2cSJim Jagielski {
2712*b1cdbd2cSJim Jagielski     Window *pWindow = pWin ? pWin : pImp->pFrame->GetFrame().GetWorkWindow_Impl()->GetWindow();
2713*b1cdbd2cSJim Jagielski /*
2714*b1cdbd2cSJim Jagielski 	SfxPopupMenuManager aPop( rId, *GetBindings() );
2715*b1cdbd2cSJim Jagielski 	aPop.AddClipboardFunctions();
2716*b1cdbd2cSJim Jagielski 	aPop.Initialize();
2717*b1cdbd2cSJim Jagielski 	aPop.RemoveDisabledEntries();
2718*b1cdbd2cSJim Jagielski     aPop.Execute( pPos ? *pPos : pWindow->GetPointerPosPixel(), pWindow );
2719*b1cdbd2cSJim Jagielski */
2720*b1cdbd2cSJim Jagielski     SfxPopupMenuManager::ExecutePopup( rId, GetFrame(), pPos ? *pPos : pWindow->GetPointerPosPixel(), pWindow );
2721*b1cdbd2cSJim Jagielski }
2722*b1cdbd2cSJim Jagielski 
2723*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
Lock(sal_Bool bLock)2724*b1cdbd2cSJim Jagielski void SfxDispatcher::Lock( sal_Bool bLock )
2725*b1cdbd2cSJim Jagielski 
2726*b1cdbd2cSJim Jagielski /*  [Beschreibung]
2727*b1cdbd2cSJim Jagielski 
2728*b1cdbd2cSJim Jagielski 	Mit dieser Methode kann der SfxDispatcher gesperrt und freigegeben
2729*b1cdbd2cSJim Jagielski 	werden. Ein gesperrter SfxDispatcher f"uhrt keine <SfxRequest>s mehr
2730*b1cdbd2cSJim Jagielski 	aus und liefert keine Status-Informationen mehr. Er verh"alt sich
2731*b1cdbd2cSJim Jagielski 	so als w"aren alle Slots disabled.
2732*b1cdbd2cSJim Jagielski */
2733*b1cdbd2cSJim Jagielski 
2734*b1cdbd2cSJim Jagielski {
2735*b1cdbd2cSJim Jagielski     SfxBindings* pBindings = GetBindings();
2736*b1cdbd2cSJim Jagielski 	if ( !bLock && pImp->bLocked && pImp->bInvalidateOnUnlock )
2737*b1cdbd2cSJim Jagielski 	{
2738*b1cdbd2cSJim Jagielski         if ( pBindings )
2739*b1cdbd2cSJim Jagielski             pBindings->InvalidateAll(sal_True);
2740*b1cdbd2cSJim Jagielski 		pImp->bInvalidateOnUnlock = sal_False;
2741*b1cdbd2cSJim Jagielski 	}
2742*b1cdbd2cSJim Jagielski     else if ( pBindings )
2743*b1cdbd2cSJim Jagielski         pBindings->InvalidateAll(sal_False);
2744*b1cdbd2cSJim Jagielski 	pImp->bLocked = bLock;
2745*b1cdbd2cSJim Jagielski     if ( !bLock )
2746*b1cdbd2cSJim Jagielski     {
2747*b1cdbd2cSJim Jagielski         sal_uInt16 nCount = pImp->aReqArr.Count();
2748*b1cdbd2cSJim Jagielski         for ( sal_uInt16 i=0; i<nCount; i++ )
2749*b1cdbd2cSJim Jagielski             pImp->xPoster->Post( pImp->aReqArr[i] );
2750*b1cdbd2cSJim Jagielski         pImp->aReqArr.Remove( 0, nCount );
2751*b1cdbd2cSJim Jagielski     }
2752*b1cdbd2cSJim Jagielski }
2753*b1cdbd2cSJim Jagielski 
GetObjectBarId(sal_uInt16 nPos) const2754*b1cdbd2cSJim Jagielski sal_uInt32 SfxDispatcher::GetObjectBarId( sal_uInt16 nPos ) const
2755*b1cdbd2cSJim Jagielski {
2756*b1cdbd2cSJim Jagielski 	return pImp->aObjBars[nPos].nResId;
2757*b1cdbd2cSJim Jagielski }
2758*b1cdbd2cSJim Jagielski 
2759*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
ResetObjectBars_Impl()2760*b1cdbd2cSJim Jagielski void SfxDispatcher::ResetObjectBars_Impl()
2761*b1cdbd2cSJim Jagielski 
2762*b1cdbd2cSJim Jagielski /*  [Beschreibung]
2763*b1cdbd2cSJim Jagielski 
2764*b1cdbd2cSJim Jagielski 	Mit dieser Methode werden alle Objectbar-Anforderungen, die dieser
2765*b1cdbd2cSJim Jagielski 	Dispatcher an das AppWindow hat, beseitigt.
2766*b1cdbd2cSJim Jagielski */
2767*b1cdbd2cSJim Jagielski {
2768*b1cdbd2cSJim Jagielski 	for (sal_uInt16 n=0; n<SFX_OBJECTBAR_MAX; n++)
2769*b1cdbd2cSJim Jagielski 		pImp->aObjBars[n].nResId = 0;
2770*b1cdbd2cSJim Jagielski 	pImp->aChildWins.Remove(0, pImp->aChildWins.Count());
2771*b1cdbd2cSJim Jagielski }
2772*b1cdbd2cSJim Jagielski 
2773*b1cdbd2cSJim Jagielski 
2774*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
DebugOutput_Impl() const2775*b1cdbd2cSJim Jagielski void SfxDispatcher::DebugOutput_Impl() const
2776*b1cdbd2cSJim Jagielski {
2777*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
2778*b1cdbd2cSJim Jagielski 
2779*b1cdbd2cSJim Jagielski 	sal_uInt16 nOld = (sal_uInt16) DbgGetData()->nTraceOut;
2780*b1cdbd2cSJim Jagielski 	DbgGetData()->nTraceOut = DBG_OUT_FILE;
2781*b1cdbd2cSJim Jagielski 
2782*b1cdbd2cSJim Jagielski 	if (bFlushed)
2783*b1cdbd2cSJim Jagielski 		DBG_TRACE("Flushed");
2784*b1cdbd2cSJim Jagielski 	if (pImp->bUpdated)
2785*b1cdbd2cSJim Jagielski 		DBG_TRACE("Updated");
2786*b1cdbd2cSJim Jagielski 
2787*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 nShell = pImp->aStack.Count(); nShell > 0; --nShell )
2788*b1cdbd2cSJim Jagielski 	{
2789*b1cdbd2cSJim Jagielski 		SfxShell *pShell = GetShell(nShell-1);
2790*b1cdbd2cSJim Jagielski 		const SfxInterface *pIFace = pShell->GetInterface();
2791*b1cdbd2cSJim Jagielski 		DBG_TRACE (pIFace->GetClassName());
2792*b1cdbd2cSJim Jagielski 	}
2793*b1cdbd2cSJim Jagielski 
2794*b1cdbd2cSJim Jagielski 	DbgGetData()->nTraceOut = nOld;
2795*b1cdbd2cSJim Jagielski 
2796*b1cdbd2cSJim Jagielski #endif
2797*b1cdbd2cSJim Jagielski }
2798*b1cdbd2cSJim Jagielski 
LockUI_Impl(sal_Bool bLock)2799*b1cdbd2cSJim Jagielski void SfxDispatcher::LockUI_Impl( sal_Bool bLock )
2800*b1cdbd2cSJim Jagielski {
2801*b1cdbd2cSJim Jagielski 	sal_Bool bWasLocked = pImp->bUILocked;
2802*b1cdbd2cSJim Jagielski 	pImp->bUILocked = bLock;
2803*b1cdbd2cSJim Jagielski 	if ( !bLock && bWasLocked )
2804*b1cdbd2cSJim Jagielski 		Update_Impl( sal_True );
2805*b1cdbd2cSJim Jagielski }
2806*b1cdbd2cSJim Jagielski 
2807*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
HideUI(sal_Bool bHide)2808*b1cdbd2cSJim Jagielski void SfxDispatcher::HideUI( sal_Bool bHide )
2809*b1cdbd2cSJim Jagielski {
2810*b1cdbd2cSJim Jagielski //	if ( !bHide && pImp->bReadOnly )
2811*b1cdbd2cSJim Jagielski //		bHide = sal_True;
2812*b1cdbd2cSJim Jagielski 	sal_Bool bWasHidden = pImp->bNoUI;
2813*b1cdbd2cSJim Jagielski 	pImp->bNoUI = bHide;
2814*b1cdbd2cSJim Jagielski 	if ( pImp->pFrame )
2815*b1cdbd2cSJim Jagielski 	{
2816*b1cdbd2cSJim Jagielski         SfxViewFrame* pTop = pImp->pFrame->GetTopViewFrame();
2817*b1cdbd2cSJim Jagielski         if ( pTop && pTop->GetBindings().GetDispatcher() == this )
2818*b1cdbd2cSJim Jagielski         {
2819*b1cdbd2cSJim Jagielski 			SfxFrame& rFrame = pTop->GetFrame();
2820*b1cdbd2cSJim Jagielski             if ( rFrame.IsMenuBarOn_Impl() )
2821*b1cdbd2cSJim Jagielski             {
2822*b1cdbd2cSJim Jagielski                 com::sun::star::uno::Reference < com::sun::star::beans::XPropertySet > xPropSet( rFrame.GetFrameInterface(), com::sun::star::uno::UNO_QUERY );
2823*b1cdbd2cSJim Jagielski                 if ( xPropSet.is() )
2824*b1cdbd2cSJim Jagielski                 {
2825*b1cdbd2cSJim Jagielski                     com::sun::star::uno::Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
2826*b1cdbd2cSJim Jagielski                     com::sun::star::uno::Any aValue = xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
2827*b1cdbd2cSJim Jagielski                     aValue >>= xLayoutManager;
2828*b1cdbd2cSJim Jagielski                     if ( xLayoutManager.is() )
2829*b1cdbd2cSJim Jagielski                         xLayoutManager->setVisible( !bHide );
2830*b1cdbd2cSJim Jagielski                 }
2831*b1cdbd2cSJim Jagielski             }
2832*b1cdbd2cSJim Jagielski         }
2833*b1cdbd2cSJim Jagielski     }
2834*b1cdbd2cSJim Jagielski 
2835*b1cdbd2cSJim Jagielski 	if ( bHide != bWasHidden )
2836*b1cdbd2cSJim Jagielski 		Update_Impl( sal_True );
2837*b1cdbd2cSJim Jagielski }
2838*b1cdbd2cSJim Jagielski 
SetReadOnly_Impl(sal_Bool bOn)2839*b1cdbd2cSJim Jagielski void SfxDispatcher::SetReadOnly_Impl( sal_Bool bOn )
2840*b1cdbd2cSJim Jagielski {
2841*b1cdbd2cSJim Jagielski 	pImp->bReadOnly = bOn;
2842*b1cdbd2cSJim Jagielski //	pImp->bNoUI = bOn;
2843*b1cdbd2cSJim Jagielski }
2844*b1cdbd2cSJim Jagielski 
GetReadOnly_Impl() const2845*b1cdbd2cSJim Jagielski sal_Bool SfxDispatcher::GetReadOnly_Impl() const
2846*b1cdbd2cSJim Jagielski {
2847*b1cdbd2cSJim Jagielski 	return pImp->bReadOnly;
2848*b1cdbd2cSJim Jagielski }
2849*b1cdbd2cSJim Jagielski 
2850*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
SetQuietMode_Impl(sal_Bool bOn)2851*b1cdbd2cSJim Jagielski void SfxDispatcher::SetQuietMode_Impl( sal_Bool bOn )
2852*b1cdbd2cSJim Jagielski 
2853*b1cdbd2cSJim Jagielski /*	[Beschreibung]
2854*b1cdbd2cSJim Jagielski 
2855*b1cdbd2cSJim Jagielski 	Bei 'bOn' stellt sich dieser Dispatcher quasi tot und leitet alles
2856*b1cdbd2cSJim Jagielski 	an den Parent-Dispatcher weiter.
2857*b1cdbd2cSJim Jagielski */
2858*b1cdbd2cSJim Jagielski 
2859*b1cdbd2cSJim Jagielski {
2860*b1cdbd2cSJim Jagielski 	pImp->bQuiet = bOn;
2861*b1cdbd2cSJim Jagielski     SfxBindings* pBindings = GetBindings();
2862*b1cdbd2cSJim Jagielski     if ( pBindings )
2863*b1cdbd2cSJim Jagielski         pBindings->InvalidateAll(sal_True);
2864*b1cdbd2cSJim Jagielski }
2865*b1cdbd2cSJim Jagielski 
2866*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
SetModalMode_Impl(sal_Bool bOn)2867*b1cdbd2cSJim Jagielski void SfxDispatcher::SetModalMode_Impl( sal_Bool bOn )
2868*b1cdbd2cSJim Jagielski 
2869*b1cdbd2cSJim Jagielski /*	[Beschreibung]
2870*b1cdbd2cSJim Jagielski 
2871*b1cdbd2cSJim Jagielski 	Bei 'bOn' werden nur noch Slots des Parent-Dispatchers gefunden.
2872*b1cdbd2cSJim Jagielski */
2873*b1cdbd2cSJim Jagielski 
2874*b1cdbd2cSJim Jagielski {
2875*b1cdbd2cSJim Jagielski 	pImp->bModal = bOn;
2876*b1cdbd2cSJim Jagielski     SfxBindings* pBindings = GetBindings();
2877*b1cdbd2cSJim Jagielski     if ( pBindings )
2878*b1cdbd2cSJim Jagielski         pBindings->InvalidateAll(sal_True);
2879*b1cdbd2cSJim Jagielski }
2880*b1cdbd2cSJim Jagielski 
SetExecuteMode(sal_uInt16 nMode)2881*b1cdbd2cSJim Jagielski void SfxDispatcher::SetExecuteMode( sal_uInt16 nMode )
2882*b1cdbd2cSJim Jagielski {
2883*b1cdbd2cSJim Jagielski 	pImp->nStandardMode = nMode;
2884*b1cdbd2cSJim Jagielski }
2885*b1cdbd2cSJim Jagielski 
QueryState(sal_uInt16 nSlot,const SfxPoolItem * & rpState)2886*b1cdbd2cSJim Jagielski SfxItemState SfxDispatcher::QueryState( sal_uInt16 nSlot, const SfxPoolItem* &rpState )
2887*b1cdbd2cSJim Jagielski {
2888*b1cdbd2cSJim Jagielski 	SfxShell *pShell = 0;
2889*b1cdbd2cSJim Jagielski 	const SfxSlot *pSlot = 0;
2890*b1cdbd2cSJim Jagielski 	if ( GetShellAndSlot_Impl( nSlot, &pShell, &pSlot, sal_False, sal_False ) )
2891*b1cdbd2cSJim Jagielski 	{
2892*b1cdbd2cSJim Jagielski 		rpState = pShell->GetSlotState(nSlot);
2893*b1cdbd2cSJim Jagielski 		if ( !rpState )
2894*b1cdbd2cSJim Jagielski 			return SFX_ITEM_DISABLED;
2895*b1cdbd2cSJim Jagielski 		else
2896*b1cdbd2cSJim Jagielski 			return SFX_ITEM_AVAILABLE;
2897*b1cdbd2cSJim Jagielski 	}
2898*b1cdbd2cSJim Jagielski 
2899*b1cdbd2cSJim Jagielski 	return SFX_ITEM_DISABLED;
2900*b1cdbd2cSJim Jagielski }
2901*b1cdbd2cSJim Jagielski 
QueryState(sal_uInt16 nSID,::com::sun::star::uno::Any & rAny)2902*b1cdbd2cSJim Jagielski SfxItemState SfxDispatcher::QueryState( sal_uInt16 nSID, ::com::sun::star::uno::Any& rAny )
2903*b1cdbd2cSJim Jagielski {
2904*b1cdbd2cSJim Jagielski 	SfxShell *pShell = 0;
2905*b1cdbd2cSJim Jagielski 	const SfxSlot *pSlot = 0;
2906*b1cdbd2cSJim Jagielski 	if ( GetShellAndSlot_Impl( nSID, &pShell, &pSlot, sal_False, sal_False ) )
2907*b1cdbd2cSJim Jagielski 	{
2908*b1cdbd2cSJim Jagielski         const SfxPoolItem* pItem( 0 );
2909*b1cdbd2cSJim Jagielski 
2910*b1cdbd2cSJim Jagielski         pItem = pShell->GetSlotState( nSID );
2911*b1cdbd2cSJim Jagielski 		if ( !pItem )
2912*b1cdbd2cSJim Jagielski 			return SFX_ITEM_DISABLED;
2913*b1cdbd2cSJim Jagielski         else
2914*b1cdbd2cSJim Jagielski         {
2915*b1cdbd2cSJim Jagielski             ::com::sun::star::uno::Any aState;
2916*b1cdbd2cSJim Jagielski             if ( !pItem->ISA(SfxVoidItem) )
2917*b1cdbd2cSJim Jagielski             {
2918*b1cdbd2cSJim Jagielski                 sal_uInt16 nSubId( 0 );
2919*b1cdbd2cSJim Jagielski                 SfxItemPool& rPool = pShell->GetPool();
2920*b1cdbd2cSJim Jagielski                 sal_uInt16 nWhich = rPool.GetWhich( nSID );
2921*b1cdbd2cSJim Jagielski                 if ( rPool.GetMetric( nWhich ) == SFX_MAPUNIT_TWIP )
2922*b1cdbd2cSJim Jagielski                     nSubId |= CONVERT_TWIPS;
2923*b1cdbd2cSJim Jagielski                 pItem->QueryValue( aState, (sal_uInt8)nSubId );
2924*b1cdbd2cSJim Jagielski             }
2925*b1cdbd2cSJim Jagielski             rAny = aState;
2926*b1cdbd2cSJim Jagielski 
2927*b1cdbd2cSJim Jagielski             return SFX_ITEM_AVAILABLE;
2928*b1cdbd2cSJim Jagielski         }
2929*b1cdbd2cSJim Jagielski 	}
2930*b1cdbd2cSJim Jagielski 
2931*b1cdbd2cSJim Jagielski 	return SFX_ITEM_DISABLED;
2932*b1cdbd2cSJim Jagielski }
2933*b1cdbd2cSJim Jagielski 
IsReadOnlyShell_Impl(sal_uInt16 nShell) const2934*b1cdbd2cSJim Jagielski sal_Bool SfxDispatcher::IsReadOnlyShell_Impl( sal_uInt16 nShell ) const
2935*b1cdbd2cSJim Jagielski {
2936*b1cdbd2cSJim Jagielski 	sal_uInt16 nShellCount = pImp->aStack.Count();
2937*b1cdbd2cSJim Jagielski 	if ( nShell < nShellCount )
2938*b1cdbd2cSJim Jagielski 	{
2939*b1cdbd2cSJim Jagielski         SfxShell* pShell = pImp->aStack.Top( nShell );
2940*b1cdbd2cSJim Jagielski         if( pShell->ISA( SfxModule ) || pShell->ISA( SfxApplication ) || pShell->ISA( SfxViewFrame ) )
2941*b1cdbd2cSJim Jagielski             return sal_False;
2942*b1cdbd2cSJim Jagielski         else
2943*b1cdbd2cSJim Jagielski             return pImp->bReadOnly;
2944*b1cdbd2cSJim Jagielski 	}
2945*b1cdbd2cSJim Jagielski 	else if ( pImp->pParent )
2946*b1cdbd2cSJim Jagielski 		return pImp->pParent->IsReadOnlyShell_Impl( nShell - nShellCount );
2947*b1cdbd2cSJim Jagielski 	return sal_True;
2948*b1cdbd2cSJim Jagielski }
2949*b1cdbd2cSJim Jagielski 
2950*b1cdbd2cSJim Jagielski // Ein dirty trick, um an die Methoden der private base class von
2951*b1cdbd2cSJim Jagielski // SfxShellStack_Impl heranzukommen
2952*b1cdbd2cSJim Jagielski class StackAccess_Impl : public SfxShellStack_Implarr_
2953*b1cdbd2cSJim Jagielski {};
2954*b1cdbd2cSJim Jagielski 
InsertShell_Impl(SfxShell & rShell,sal_uInt16 nPos)2955*b1cdbd2cSJim Jagielski void SfxDispatcher::InsertShell_Impl( SfxShell& rShell, sal_uInt16 nPos )
2956*b1cdbd2cSJim Jagielski {
2957*b1cdbd2cSJim Jagielski 	Flush();
2958*b1cdbd2cSJim Jagielski 
2959*b1cdbd2cSJim Jagielski 	// Der cast geht, weil SfxShellStack_Impl keine eigenen member hat
2960*b1cdbd2cSJim Jagielski 	((StackAccess_Impl*) (&pImp->aStack))->Insert( nPos, &rShell );
2961*b1cdbd2cSJim Jagielski 	rShell.SetDisableFlags( pImp->nDisableFlags );
2962*b1cdbd2cSJim Jagielski 	rShell.DoActivate_Impl(pImp->pFrame, sal_True);
2963*b1cdbd2cSJim Jagielski 
2964*b1cdbd2cSJim Jagielski 	if ( !SFX_APP()->IsDowning() )
2965*b1cdbd2cSJim Jagielski 	{
2966*b1cdbd2cSJim Jagielski 		pImp->bUpdated = sal_False;
2967*b1cdbd2cSJim Jagielski 		pImp->pCachedServ1 = 0;
2968*b1cdbd2cSJim Jagielski 		pImp->pCachedServ2 = 0;
2969*b1cdbd2cSJim Jagielski 		InvalidateBindings_Impl(sal_True);
2970*b1cdbd2cSJim Jagielski 	}
2971*b1cdbd2cSJim Jagielski }
2972*b1cdbd2cSJim Jagielski 
RemoveShell_Impl(SfxShell & rShell)2973*b1cdbd2cSJim Jagielski void SfxDispatcher::RemoveShell_Impl( SfxShell& rShell )
2974*b1cdbd2cSJim Jagielski {
2975*b1cdbd2cSJim Jagielski 	Flush();
2976*b1cdbd2cSJim Jagielski 
2977*b1cdbd2cSJim Jagielski 	// Der cast geht, weil SfxShellStack_Impl keine eigenen member hat
2978*b1cdbd2cSJim Jagielski 	StackAccess_Impl& rStack = *((StackAccess_Impl*) (&pImp->aStack));
2979*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = rStack.Count();
2980*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 n=0; n<nCount; ++n )
2981*b1cdbd2cSJim Jagielski 	{
2982*b1cdbd2cSJim Jagielski 		if ( rStack[n] == &rShell )
2983*b1cdbd2cSJim Jagielski 		{
2984*b1cdbd2cSJim Jagielski 			rStack.Remove( n );
2985*b1cdbd2cSJim Jagielski 			rShell.SetDisableFlags( 0 );
2986*b1cdbd2cSJim Jagielski 			rShell.DoDeactivate_Impl(pImp->pFrame, sal_True);
2987*b1cdbd2cSJim Jagielski 			break;
2988*b1cdbd2cSJim Jagielski 		}
2989*b1cdbd2cSJim Jagielski 	}
2990*b1cdbd2cSJim Jagielski 
2991*b1cdbd2cSJim Jagielski 	if ( !SFX_APP()->IsDowning() )
2992*b1cdbd2cSJim Jagielski 	{
2993*b1cdbd2cSJim Jagielski 		pImp->bUpdated = sal_False;
2994*b1cdbd2cSJim Jagielski 		pImp->pCachedServ1 = 0;
2995*b1cdbd2cSJim Jagielski 		pImp->pCachedServ2 = 0;
2996*b1cdbd2cSJim Jagielski 		InvalidateBindings_Impl(sal_True);
2997*b1cdbd2cSJim Jagielski 	}
2998*b1cdbd2cSJim Jagielski }
2999*b1cdbd2cSJim Jagielski 
IsAllowed(sal_uInt16 nSlot) const3000*b1cdbd2cSJim Jagielski sal_Bool SfxDispatcher::IsAllowed
3001*b1cdbd2cSJim Jagielski (
3002*b1cdbd2cSJim Jagielski 	sal_uInt16 nSlot
3003*b1cdbd2cSJim Jagielski ) const
3004*b1cdbd2cSJim Jagielski /*
3005*b1cdbd2cSJim Jagielski 	[Beschreibung]
3006*b1cdbd2cSJim Jagielski 	Die Methode prueft, ob der Zugriff auf diese Schnittstelle erlaubt ist.
3007*b1cdbd2cSJim Jagielski 	*/
3008*b1cdbd2cSJim Jagielski {
3009*b1cdbd2cSJim Jagielski 	if ( !pImp->pDisableList )
3010*b1cdbd2cSJim Jagielski 	{
3011*b1cdbd2cSJim Jagielski 		return sal_True;
3012*b1cdbd2cSJim Jagielski 	}
3013*b1cdbd2cSJim Jagielski 
3014*b1cdbd2cSJim Jagielski 	// BinSearch in der DisableListe
3015*b1cdbd2cSJim Jagielski 	SvUShorts& rList = *pImp->pDisableList;
3016*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = rList.Count();
3017*b1cdbd2cSJim Jagielski 	sal_uInt16 nLow = 0, nMid = 0, nHigh;
3018*b1cdbd2cSJim Jagielski 	sal_Bool bFound = sal_False;
3019*b1cdbd2cSJim Jagielski 	nHigh = nCount - 1;
3020*b1cdbd2cSJim Jagielski 
3021*b1cdbd2cSJim Jagielski 	while ( !bFound && nLow <= nHigh )
3022*b1cdbd2cSJim Jagielski 	{
3023*b1cdbd2cSJim Jagielski 		nMid = (nLow + nHigh) >> 1;
3024*b1cdbd2cSJim Jagielski 		DBG_ASSERT( nMid < nCount, "bsearch ist buggy" );
3025*b1cdbd2cSJim Jagielski 
3026*b1cdbd2cSJim Jagielski 		int nDiff = (int) nSlot - (int) rList[nMid];
3027*b1cdbd2cSJim Jagielski 		if ( nDiff < 0)
3028*b1cdbd2cSJim Jagielski 		{
3029*b1cdbd2cSJim Jagielski 			if ( nMid == 0 )
3030*b1cdbd2cSJim Jagielski 				break;
3031*b1cdbd2cSJim Jagielski 			nHigh = nMid - 1;
3032*b1cdbd2cSJim Jagielski 		}
3033*b1cdbd2cSJim Jagielski 		else if ( nDiff > 0 )
3034*b1cdbd2cSJim Jagielski 		{
3035*b1cdbd2cSJim Jagielski 			nLow = nMid + 1;
3036*b1cdbd2cSJim Jagielski 			if ( nLow == 0 )
3037*b1cdbd2cSJim Jagielski 				break;
3038*b1cdbd2cSJim Jagielski 		}
3039*b1cdbd2cSJim Jagielski 		else
3040*b1cdbd2cSJim Jagielski 			bFound = sal_True;
3041*b1cdbd2cSJim Jagielski 	}
3042*b1cdbd2cSJim Jagielski 
3043*b1cdbd2cSJim Jagielski #ifdef _DEBUG
3044*b1cdbd2cSJim Jagielski 	// Slot in der Liste gefunden ?
3045*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = bFound ? nMid : nLow;
3046*b1cdbd2cSJim Jagielski 
3047*b1cdbd2cSJim Jagielski 	DBG_ASSERT( nPos <= nCount, "" );
3048*b1cdbd2cSJim Jagielski 	DBG_ASSERT( nPos == nCount || nSlot <= rList[nPos], "" );
3049*b1cdbd2cSJim Jagielski 	DBG_ASSERT( nPos == 0 || nSlot > rList[nPos-1], "" );
3050*b1cdbd2cSJim Jagielski 	DBG_ASSERT( ( (nPos+1) >= nCount ) || nSlot < rList[nPos+1], "" );
3051*b1cdbd2cSJim Jagielski #endif
3052*b1cdbd2cSJim Jagielski 
3053*b1cdbd2cSJim Jagielski 	return !bFound;
3054*b1cdbd2cSJim Jagielski }
3055*b1cdbd2cSJim Jagielski 
InvalidateBindings_Impl(sal_Bool bModify)3056*b1cdbd2cSJim Jagielski void SfxDispatcher::InvalidateBindings_Impl( sal_Bool bModify )
3057*b1cdbd2cSJim Jagielski {
3058*b1cdbd2cSJim Jagielski 	// App-Dispatcher?
3059*b1cdbd2cSJim Jagielski 	if ( IsAppDispatcher() )
3060*b1cdbd2cSJim Jagielski 	{
3061*b1cdbd2cSJim Jagielski 		for ( SfxViewFrame *pFrame = SfxViewFrame::GetFirst();
3062*b1cdbd2cSJim Jagielski 				pFrame;
3063*b1cdbd2cSJim Jagielski 				pFrame = SfxViewFrame::GetNext( *pFrame ) )
3064*b1cdbd2cSJim Jagielski 			pFrame->GetBindings().InvalidateAll(bModify);
3065*b1cdbd2cSJim Jagielski 	}
3066*b1cdbd2cSJim Jagielski 	else
3067*b1cdbd2cSJim Jagielski 	{
3068*b1cdbd2cSJim Jagielski 		SfxDispatcher *pDisp = GetBindings()->GetDispatcher_Impl();
3069*b1cdbd2cSJim Jagielski 		while ( pDisp )
3070*b1cdbd2cSJim Jagielski 		{
3071*b1cdbd2cSJim Jagielski 			if ( pDisp == this )
3072*b1cdbd2cSJim Jagielski 			{
3073*b1cdbd2cSJim Jagielski 				GetBindings()->InvalidateAll( bModify );
3074*b1cdbd2cSJim Jagielski 				break;
3075*b1cdbd2cSJim Jagielski 			}
3076*b1cdbd2cSJim Jagielski 
3077*b1cdbd2cSJim Jagielski 			pDisp = pDisp->pImp->pParent;
3078*b1cdbd2cSJim Jagielski 		}
3079*b1cdbd2cSJim Jagielski 	}
3080*b1cdbd2cSJim Jagielski }
3081*b1cdbd2cSJim Jagielski 
IsUpdated_Impl() const3082*b1cdbd2cSJim Jagielski sal_Bool SfxDispatcher::IsUpdated_Impl() const
3083*b1cdbd2cSJim Jagielski {
3084*b1cdbd2cSJim Jagielski 	return pImp->bUpdated;
3085*b1cdbd2cSJim Jagielski }
3086*b1cdbd2cSJim Jagielski 
SetDisableFlags(sal_uInt32 nFlags)3087*b1cdbd2cSJim Jagielski void SfxDispatcher::SetDisableFlags( sal_uInt32 nFlags )
3088*b1cdbd2cSJim Jagielski {
3089*b1cdbd2cSJim Jagielski 	pImp->nDisableFlags = nFlags;
3090*b1cdbd2cSJim Jagielski 	for ( int i = int(pImp->aStack.Count()) - 1; i >= 0; --i )
3091*b1cdbd2cSJim Jagielski 		pImp->aStack.Top( (sal_uInt16) i )->SetDisableFlags( nFlags );
3092*b1cdbd2cSJim Jagielski }
3093*b1cdbd2cSJim Jagielski 
GetDisableFlags() const3094*b1cdbd2cSJim Jagielski sal_uInt32 SfxDispatcher::GetDisableFlags() const
3095*b1cdbd2cSJim Jagielski {
3096*b1cdbd2cSJim Jagielski 	return pImp->nDisableFlags;
3097*b1cdbd2cSJim Jagielski }
3098*b1cdbd2cSJim Jagielski 
GetModule() const3099*b1cdbd2cSJim Jagielski SfxModule* SfxDispatcher::GetModule() const
3100*b1cdbd2cSJim Jagielski {
3101*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 nShell = 0;; ++nShell )
3102*b1cdbd2cSJim Jagielski 	{
3103*b1cdbd2cSJim Jagielski         SfxShell *pSh = GetShell(nShell);
3104*b1cdbd2cSJim Jagielski         if ( pSh == NULL )
3105*b1cdbd2cSJim Jagielski             return 0;
3106*b1cdbd2cSJim Jagielski 		if ( pSh->ISA(SfxModule) )
3107*b1cdbd2cSJim Jagielski 			return (SfxModule*) pSh;
3108*b1cdbd2cSJim Jagielski 	}
3109*b1cdbd2cSJim Jagielski }
3110