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