xref: /AOO41X/main/sfx2/inc/sfx2/shell.hxx (revision fe22d2cfc602815794415026f1317bd625db6f83)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _SFX_SHELL_HXX
24 #define _SFX_SHELL_HXX
25 
26 #include "sal/config.h"
27 #include "sfx2/dllapi.h"
28 #include "sal/types.h"
29 #include <com/sun/star/embed/VerbDescriptor.hpp>
30 #include <tools/debug.hxx>
31 #include <tools/rtti.hxx>
32 #include <svl/brdcst.hxx>
33 
34 #include <tools/ownlist.hxx>
35 #include <tools/unqid.hxx>
36 #include <tools/string.hxx>
37 
38 #include <sfx2/sfxuno.hxx>
39 
40 class ResMgr;
41 class Window;
42 class ToolBox;
43 class SfxItemPool;
44 class SfxPoolItem;
45 class SfxRequest;
46 class SfxItemSet;
47 struct SfxFormalArgument;
48 class StatusBar;
49 class SfxInterface;
50 class SfxViewShell;
51 class SfxObjectShell;
52 class SfxSlotPool;
53 class SvGlobalName;
54 
55 class SfxShellObject;
56 class SfxShell;
57 struct SfxShell_Impl;
58 struct SfxTypeLibImpl;
59 class SfxShellObject;
60 class SfxShellSubObject;
61 class SfxDispatcher;
62 class SfxViewFrame;
63 class SfxSlot;
64 class SfxRepeatTarget;
65 class SbxVariable;
66 class SbxBase;
67 class SfxBindings;
68 
69 namespace svl
70 {
71     class IUndoManager;
72 }
73 
74 //====================================================================
75 
76 enum SfxInterfaceId
77 
78 /*  [Beschreibung]
79 
80     Id f"ur die <SfxInterface>s, damit wird "uber ein Array an der
81     <SfxApplication> ein quasi-statischer Zugriff auf die Interfaces
82     erlaubt.
83 */
84 
85 {
86     SFX_INTERFACE_NONE,
87     SFX_INTERFACE_SFXAPP,
88     SFX_INTERFACE_SFXDOCSH,
89     SFX_INTERFACE_SFXIPFRM,
90     SFX_INTERFACE_SFXVIEWSH,
91     SFX_INTERFACE_SFXVIEWFRM,
92     SFX_INTERFACE_SFXPLUGINFRM,
93     SFX_INTERFACE_SFXPLUGINOBJ,
94     SFX_INTERFACE_SFXPLUGINVIEWSH,
95     SFX_INTERFACE_SFXFRAMESETOBJ,
96     SFX_INTERFACE_SFXFRAMESETVIEWSH,
97     SFX_INTERFACE_SFXINTERNALFRM,
98     SFX_INTERFACE_SFXCOMPONENTDOCSH,
99     SFX_INTERFACE_SFXGENERICOBJ,
100     SFX_INTERFACE_SFXGENERICVIEWSH,
101     SFX_INTERFACE_SFXEXPLOBJ,
102     SFX_INTERFACE_SFXEXPLVIEWSH,
103     SFX_INTERFACE_SFXPLUGINVIEWSHDYNAMIC,
104     SFX_INTERFACE_SFXEXTERNALVIEWFRM,
105     SFX_INTERFACE_SFXMODULE,
106     SFX_INTERFACE_SFXFRAMESETVIEW,
107     SFX_INTERFACE_SFXFRAMESETSOURCEVIEW,
108     SFX_INTERFACE_SFXHELP_DOCSH,
109     SFX_INTERFACE_SFXHELP_VIEWSH,
110     SFX_INTERFACE_SFXTASK,
111     SFX_INTERFACE_OFA_START         =  100,
112     SFX_INTERFACE_OFA_END           =  100,
113     SFX_INTERFACE_SC_START          =  150,
114     SFX_INTERFACE_SC_END            =  199,
115     SFX_INTERFACE_SD_START          =  200,
116     SFX_INTERFACE_SD_END            =  249,
117     SFX_INTERFACE_SW_START          =  250,
118     SFX_INTERFACE_SW_END            =  299,
119     SFX_INTERFACE_SIM_START         =  300,
120     SFX_INTERFACE_SIM_END           =  319,
121     SFX_INTERFACE_SCH_START         =  320,
122     SFX_INTERFACE_SCH_END           =  339,
123     SFX_INTERFACE_SMA_START         =  340,
124     SFX_INTERFACE_SMA_END           =  359,
125     SFX_INTERFACE_SBA_START         =  360,
126     SFX_INTERFACE_SBA_END           =  399,
127     SFX_INTERFACE_IDE_START         =  400,
128     SFX_INTERFACE_IDE_END           =  409,
129     //-falls die noch einer braucht
130     SFX_INTERFACE_APP               =  SFX_INTERFACE_SW_START,
131     SFX_INTERFACE_LIB               =  450
132 };
133 
134 //TODO/CLEANUP: replace by UNO constant
135 #define SVVERB_SHOW -1
136 
137 //====================================================================
138 
139 typedef void (*SfxExecFunc)(SfxShell *, SfxRequest &rReq);
140 typedef void (*SfxStateFunc)(SfxShell *, SfxItemSet &rSet);
141 
142 class SFX2_DLLPUBLIC SfxShell: public SfxBroadcaster
143 
144 /*  [Beschreibung]
145 
146     Die Klasse SfxShell ist Basisklasse f"ur alle Schichten, die
147     Funktionalit"at Form von <Slot>s bereitstellen wollen.
148 
149     Jede Instanz hat einen Verweis auf eine Interface-Beschreibung, der
150     mit <SfxShell::GetInterface()const> erh"altlich ist. Dieses Interface
151     stellt die Verbindung zu konkreten Methoden her und enth"alt einige
152     weitere beschreibende Daten f"ur Controller wie Menus und Toolboxen, aber
153     auch f"ur die diversen APIs. Der Hautpteil der Interface-Beschreibung
154     liegt in Form einer <Type-Library> vor, die mit dem <SVIDL-Compiler>
155     aus einem IDL-File generiert wird. F"ur jede SfxShell-Subclass ist ein
156     solches IDL-File zu schreiben.
157 
158 */
159 
160 {
161     friend class SfxObjectItem;
162 
163     SfxShell_Impl*              pImp;
164     SfxItemPool*                pPool;
165     ::svl::IUndoManager*        pUndoMgr;
166 
167 private:
168                                 SfxShell( const SfxShell & ); // n.i.
169     SfxShell&                   operator = ( const SfxShell & ); // n.i.
170 
171 protected:
172                                 SfxShell();
173                                 SfxShell( SfxViewShell *pViewSh );
174 
175 #ifndef _SFXSH_HXX
176     SAL_DLLPRIVATE void SetViewShell_Impl( SfxViewShell* pView );
177     SAL_DLLPRIVATE void Invalidate_Impl( SfxBindings& rBindings, sal_uInt16 nId );
178     SAL_DLLPRIVATE SfxShellObject* GetShellObj_Impl() const;
179     SAL_DLLPRIVATE void SetShellObj_Impl( SfxShellObject* pObj );
180 #endif
181 
182 public:
183                                 TYPEINFO();
184     virtual                     ~SfxShell();
185 
186     SfxBroadcaster*             GetBroadcaster();
187 
188     // TODO/CLEANUP: still needed?!
189     virtual SvGlobalName        GetGlobalName() const;
190 
191     virtual SfxInterface*       GetInterface() const;
GetStaticInterface()192     static SfxInterface*        GetStaticInterface() { return 0; }
193 
194     void                        SetName( const String &rName );
195     const String&               GetName() const;
196 
197     SfxViewShell*               GetViewShell() const;
198 
CallExec(SfxExecFunc pFunc,SfxRequest & rReq)199     void                        CallExec( SfxExecFunc pFunc, SfxRequest &rReq )
200                                 { (*pFunc)(this, rReq); }
CallState(SfxStateFunc pFunc,SfxItemSet & rSet)201     void                        CallState( SfxStateFunc pFunc, SfxItemSet &rSet )
202                                 { (*pFunc)(this, rSet); }
203 
204     static void                 EmptyExecStub(SfxShell *pShell, SfxRequest &);
205     static void                 EmptyStateStub(SfxShell *pShell, SfxItemSet &);
206 
207     const SfxPoolItem*          GetSlotState( sal_uInt16 nSlotId, const SfxInterface *pIF = 0, SfxItemSet *pStateSet = 0 );
208     const SfxPoolItem*          ExecuteSlot( SfxRequest &rReq, const SfxInterface *pIF = 0 );
209     const SfxPoolItem*          ExecuteSlot( SfxRequest &rReq, sal_Bool bAsync );
210     sal_uIntPtr                       ExecuteSlot( sal_uInt16 nSlot, sal_uInt16 nMemberId, SbxVariable& rRet, SbxBase* pArgs = 0 );
211 
212     inline SfxItemPool&         GetPool() const;
213     inline void                 SetPool( SfxItemPool *pNewPool ) ;
214 
215     virtual ::svl::IUndoManager*
216                                 GetUndoManager();
217     void                        SetUndoManager( ::svl::IUndoManager *pNewUndoMgr );
218 
219     SfxRepeatTarget*            GetRepeatTarget() const;
220     void                        SetRepeatTarget( SfxRepeatTarget *pTarget );
221 
222     virtual void                Invalidate(sal_uInt16 nId = 0);
223 
224     sal_Bool                        IsActive() const;
225     virtual void                Activate(sal_Bool bMDI);
226     virtual void                Deactivate(sal_Bool bMDI);
227     virtual void                ParentActivate();
228     virtual void                ParentDeactivate();
229 
230     SfxDispatcher*              GetDispatcher() const;
231     SfxViewFrame*               GetFrame() const;
232     ResMgr*                     GetResMgr() const;
233     virtual sal_Bool            HasUIFeature( sal_uInt32 nFeature );
234     void                        UIFeatureChanged();
235 
236     // Items
237     const SfxPoolItem*          GetItem( sal_uInt16 nSlotId ) const;
238     void                        PutItem( const SfxPoolItem& rItem );
239     void                        RemoveItem( sal_uInt16 nSlotId );
240 
241     // TODO/CLEANUP: still needed?!
242     void SetVerbs(const com::sun::star::uno::Sequence < com::sun::star::embed::VerbDescriptor >& aVerbs);
243     const com::sun::star::uno::Sequence < com::sun::star::embed::VerbDescriptor >& GetVerbs() const;
244     void                        VerbExec (SfxRequest&);
245     void                        VerbState (SfxItemSet&);
246     SAL_DLLPRIVATE const SfxSlot* GetVerbSlot_Impl(sal_uInt16 nId) const;
247 
248     void                        SetHelpId(sal_uIntPtr nId);
249     sal_uIntPtr                     GetHelpId() const;
250     virtual SfxObjectShell*     GetObjectShell();
251     void                        SetDisableFlags( sal_uIntPtr nFlags );
252     sal_uIntPtr                     GetDisableFlags() const;
253 
254     virtual SfxItemSet*         CreateItemSet( sal_uInt16 nId );
255     virtual void                ApplyItemSet( sal_uInt16 nId, const SfxItemSet& rSet );
256 
257     /** Set the name of the sidebar context that is broadcast on calls
258         to Activation().
259     */
260     void SetContextName (const ::rtl::OUString& rsContextName);
261 
262     /** Broadcast a sidebar context change.
263         This method is typically called from Activate() or
264         Deactivate().
265         @param bIsActivated
266             When <TRUE/> then broadcast the context name that was
267             defined with an earlier call to SetContextName().
268             When <FALSE/> then broadcast the 'default' context.
269     */
270     void BroadcastContextForActivation (const bool bIsActivated);
271 
272     /** Enabled or disable the context broadcaster.  Returns the old state.
273     */
274     bool SetContextBroadcasterEnabled (const bool bIsEnabled);
275 
276 #ifndef _SFXSH_HXX
277     SAL_DLLPRIVATE bool     CanExecuteSlot_Impl( const SfxSlot &rSlot );
278     SAL_DLLPRIVATE void DoActivate_Impl( SfxViewFrame *pFrame, sal_Bool bMDI);
279     SAL_DLLPRIVATE void DoDeactivate_Impl( SfxViewFrame *pFrame, sal_Bool bMDI);
280 #endif
281 };
282 
283 //--------------------------------------------------------------------
GetPool() const284 SfxItemPool& SfxShell::GetPool() const
285 /*
286   [Beschreibung]
287 
288     Jede Subclass von SfxShell mu"s einen Pool referenzieren. Dieser
289     wird teilweise von SFx-eigenen Subklassen gesetzt (z.B. <SfxViewShell>),
290     mu"s aber insbesondere bei direkt von SfxShell abgeleiteten Klassen
291     und bei Ableitungen von SfxObjectShell selbst gesetzt werden.
292 
293     Die Klasse SfxShell selbst hat noch keinen SfxItemPool, es wird
294     daher ein 0-Pointer zur"uckgeliefert.
295 */
296 
297 {
298     DBG_ASSERT( pPool, "no pool" );
299     return *pPool;
300 }
301 //-------------------------------------------------------------------
SetPool(SfxItemPool * pNewPool)302 inline void SfxShell::SetPool
303 (
304     SfxItemPool*    pNewPool    // Pointer auf den neuen Pool oder 0
305 )
306 
307 /*  [Beschreibung]
308 
309     Mit dieser Methode melden die Subklassen ihren speziellen <SfxItemPool>
310     an der SfxShell an. Jede SfxShell Instanz mu\s Zugriff auf einen
311     SfxItemPool haben. In der Regel ist dies der SfxItemPool der
312     SfxDocumentShell. Die SfxShell Subklasse "ubernimmt nicht die
313     Eigent"umerschaft "uber den "ubergebenen Pool. Bevor er gel"oscht
314     wirde, mu\s er mit SetPool(0) abgemeldet werden.
315 */
316 
317 {
318     pPool = pNewPool;
319 }
320 
321 //=====================================================================
322 
323 #define SFX_ARGUMENTMAP(ShellClass) static SfxFormalArgument __FAR_DATA a##ShellClass##Args_Impl[] =
324 
325 #define SFX_SLOTMAP(ShellClass) static SfxFormalArgument __FAR_DATA a##ShellClass##Args_Impl[1]; \
326                                 static SfxSlot __FAR_DATA a##ShellClass##Slots_Impl[] =
327 
328 #define SFX_SLOTMAP_ARG(ShellClass) static SfxSlot __FAR_DATA a##ShellClass##Slots_Impl[] =
329 
330 #define SFX_DECL_INTERFACE(nId)                                             \
331             static SfxInterface*                pInterface;                 \
332         private:                                                            \
333             static void                         InitInterface_Impl();       \
334         public:                                                             \
335             static const SfxFormalArgument*     pSfxFormalArgs_Impl;        \
336             static SfxInterface*                GetStaticInterface();       \
337             static SfxInterfaceId               GetInterfaceId() {return SfxInterfaceId(nId);} \
338             static void                         RegisterInterface(SfxModule* pMod=NULL); \
339             virtual SfxInterface*       GetInterface() const;
340 
341 #define SFX_IMPL_INTERFACE(Class,SuperClass,NameResId)                      \
342                                                                             \
343     SfxInterface* Class::pInterface = 0;                                    \
344     const SfxFormalArgument* Class::pSfxFormalArgs_Impl = a##Class##Args_Impl;\
345     SfxInterface* __EXPORT Class::GetStaticInterface()                      \
346     {                                                                       \
347         if ( !pInterface )                                                  \
348         {                                                                   \
349             pInterface =                                                    \
350                 new SfxInterface(                                           \
351             #Class, NameResId, GetInterfaceId(),                            \
352             SuperClass::GetStaticInterface(),                               \
353             a##Class##Slots_Impl[0],                                        \
354             (sal_uInt16) (sizeof(a##Class##Slots_Impl) / sizeof(SfxSlot) ) );   \
355             InitInterface_Impl();                                           \
356         }                                                                   \
357         return pInterface;                                                  \
358     }                                                                       \
359                                                                             \
360     SfxInterface* Class::GetInterface() const                               \
361     {                                                                       \
362         return GetStaticInterface();                                        \
363     }                                                                       \
364                                                                             \
365     void Class::RegisterInterface(SfxModule* pMod)                          \
366     {                                                                       \
367         GetStaticInterface()->Register(pMod);                               \
368     }                                                                       \
369                                                                             \
370     void Class::InitInterface_Impl()
371 
372 #define SFX_POSITION_MASK               0x000F
373 #define SFX_VISIBILITY_MASK             0xFFF0
374 #define SFX_VISIBILITY_UNVISIBLE        0x0000  // nie sichtbar
375 #define SFX_VISIBILITY_PLUGSERVER       0x0010
376 #define SFX_VISIBILITY_PLUGCLIENT       0x0020
377 #define SFX_VISIBILITY_VIEWER           0x0040
378                                                 // noch 1 sind frei!
379 #define SFX_VISIBILITY_RECORDING        0x0200
380 #define SFX_VISIBILITY_READONLYDOC      0x0400
381 #define SFX_VISIBILITY_DESKTOP          0x0800
382 #define SFX_VISIBILITY_STANDARD         0x1000
383 #define SFX_VISIBILITY_FULLSCREEN       0x2000
384 #define SFX_VISIBILITY_CLIENT           0x4000
385 #define SFX_VISIBILITY_SERVER           0x8000
386 #define SFX_VISIBILITY_NOCONTEXT        0xFFFF  // immer sichtbar
387 
388 #define SFX_OBJECTBAR_REGISTRATION(nPos,rResId) \
389         GetStaticInterface()->RegisterObjectBar( nPos, rResId )
390 
391 #define SFX_FEATURED_OBJECTBAR_REGISTRATION(nPos,rResId,nFeature) \
392         GetStaticInterface()->RegisterObjectBar( nPos, rResId, nFeature )
393 
394 #define SFX_CHILDWINDOW_REGISTRATION(nId) \
395         GetStaticInterface()->RegisterChildWindow( nId, (sal_Bool) sal_False )
396 
397 #define SFX_FEATURED_CHILDWINDOW_REGISTRATION(nId,nFeature) \
398         GetStaticInterface()->RegisterChildWindow( nId, (sal_Bool) sal_False, nFeature )
399 
400 #define SFX_CHILDWINDOW_CONTEXT_REGISTRATION(nId) \
401         GetStaticInterface()->RegisterChildWindow( nId, (sal_Bool) sal_True )
402 
403 #define SFX_POPUPMENU_REGISTRATION(rResId) \
404         GetStaticInterface()->RegisterPopupMenu( rResId )
405 
406 #define SFX_OBJECTMENU_REGISTRATION(nPos,rResId) \
407         GetStaticInterface()->RegisterObjectMenu( nPos, rResId )
408 
409 #define SFX_STATUSBAR_REGISTRATION(rResId) \
410         GetStaticInterface()->RegisterStatusBar( rResId )
411 
412 #endif
413 
414