xref: /AOO41X/main/sfx2/inc/sfx2/childwin.hxx (revision 353d8f4d17010cd2d0ea815067cad67e477f2bee)
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_CHILDWIN_HXX
24 #define _SFX_CHILDWIN_HXX
25 
26 #include "sal/config.h"
27 #include "sfx2/dllapi.h"
28 #include "sal/types.h"
29 #include <vcl/window.hxx>
30 #include <com/sun/star/frame/XFrame.hpp>
31 
32 #ifdef ENABLE_INIMANAGER//MUSTINI
33 #include "inimgr.hxx"
34 #endif
35 #include <sfx2/shell.hxx>
36 #include <sfx2/chalign.hxx>
37 
38 class SfxWorkWindow;
39 class SfxModule;
40 class SfxBindings;
41 class SfxShell;
42 class SfxChildWindow;
43 class SfxChildWindowContext;
44 class SfxChildWinContextArr_Impl;
45 
46 //ASDBG #ifndef _XFRAME_REF
47 //ASDBG #define _XFRAME_REF
48 //ASDBG USR_DECLIMPL_REF( ::com::sun::star::frame::XFrame, ::com::sun::star::uno::XInterface );
49 //ASDBG #endif
50 
51 #define SFX_CHILDWIN_ZOOMIN       0x01      // ganz eingeklapptes Float
52 #define SFX_CHILDWIN_SMALL        0x02      // halb eingeklapptes Float
53 #define SFX_CHILDWIN_FORCEDOCK    0x04      // Float verboten
54 #define SFX_CHILDWIN_AUTOHIDE     0x08      // DockingWindow im AutoHide-Modus
55 #define SFX_CHILDWIN_TASK         0x10      // ChildWindow innerhalb der Task
56 #define SFX_CHILDWIN_CANTGETFOCUS 0x20      // ChildWindow kann keinen Focus bekommen
57 #define SFX_CHILDWIN_ALWAYSAVAILABLE 0x40   // ChildWindow is never disabled
58 #define SFX_CHILDWIN_NEVERHIDE    0x80      // ChildWindow is can always made visible/is visible
59 #define CHILDWIN_NOPOS            USHRT_MAX
60 
61 // Konfiguration eines ChildWindows
62 struct SfxChildWinInfo
63 {
64     sal_Bool                bVisible;
65     Point               aPos;
66     Size                aSize;
67     sal_uInt16              nFlags;
68     String              aExtraString;
69     ByteString          aWinState;
70 
SfxChildWinInfoSfxChildWinInfo71                         SfxChildWinInfo()
72                         {
73                             bVisible = sal_False;
74                             nFlags = 0;
75                         }
76 //#if 0 // _SOLAR__PRIVATE
77     sal_Bool                GetExtraData_Impl( SfxChildAlignment    *pAlign,
78                                            SfxChildAlignment    *pLastAlign = 0,
79                                            Size                 *pSize = 0,
80                                            sal_uInt16               *pLine = 0,
81                                            sal_uInt16               *pPos = 0 ) const;
82 //#endif
83 };
84 
85 // Factory-Methode eines ChildWindows
86 typedef SfxChildWindow* (*SfxChildWinCtor)( ::Window *pParentWindow,
87                                             sal_uInt16 nId,
88                                             SfxBindings *pBindings,
89                                             SfxChildWinInfo *pInfo);
90 
91 // Factory-Methode eines ChildWindowsContexts
92 typedef SfxChildWindowContext* (*SfxChildWinContextCtor)( ::Window *pParentWindow,
93                                             SfxBindings *pBindings,
94                                             SfxChildWinInfo *pInfo);
95 struct SfxChildWinContextFactory
96 {
97     SfxChildWinContextCtor  pCtor;      // Factory-Methode
98     sal_uInt16                  nContextId; // Identifier f"ur das SfxInterface
99     SfxChildWinInfo         aInfo;      // Konfiguration
100 
SfxChildWinContextFactorySfxChildWinContextFactory101     SfxChildWinContextFactory( SfxChildWinContextCtor pTheCtor, sal_uInt16 nID )
102         : pCtor(pTheCtor)
103         , nContextId(nID)
104     {}
105 };
106 
107 SV_DECL_PTRARR_DEL( SfxChildWinContextArr_Impl, SfxChildWinContextFactory*, 2, 2 )
108 
109 struct SfxChildWinFactory
110 {
111     SfxChildWinCtor     pCtor;          // Factory-Methode
112     sal_uInt16              nId;            // ChildWindow-Id ( SlotId )
113     SfxChildWinInfo     aInfo;          // Konfiguration
114     sal_uInt16              nPos;           // ggf. Position im UI
115     SfxChildWinContextArr_Impl *pArr;   // Array f"ur Contexte
116 
SfxChildWinFactorySfxChildWinFactory117     SfxChildWinFactory( SfxChildWinCtor pTheCtor, sal_uInt16 nID,
118             sal_uInt16 n )
119         : pCtor(pTheCtor)
120         , nId( nID )
121         , nPos(n)
122         , pArr( NULL )
123     {}
124 
125 //#if 0 // _SOLAR__PRIVATE
~SfxChildWinFactorySfxChildWinFactory126     ~SfxChildWinFactory()
127     {
128         delete pArr;
129     }
130 //#else
131     // Der WIN16-Compiler versucht dort zu "ubersetzen, wo dieser Header
132     // included wird, und kann dann nat"urlich nicht linken, wenn inline ...
133 //  ~SfxChildWinFactory();
134 //#endif
135 };
136 
137 class FloatingWindow;
138 struct SfxChildWindow_Impl;
139 class SFX2_DLLPUBLIC SfxChildWindowContext
140 {
141 friend class SfxChildWindow;
142     ::Window*           pWindow;
143     sal_uInt16          nContextId;
144 
145 protected:
146                         SfxChildWindowContext( sal_uInt16 nId );
147 
148 public:
149     virtual             ~SfxChildWindowContext();
150 
SetWindow(::Window * pWin)151     void                SetWindow( ::Window* pWin )
152                         { pWindow=pWin; }
GetWindow() const153     ::Window*           GetWindow() const
154                         { return pWindow; }
GetContextId() const155     sal_uInt16              GetContextId() const
156                         { return nContextId; }
157 
158     FloatingWindow*     GetFloatingWindow() const;
159     SfxChildAlignment   GetAlignment() const;
160 
161     virtual void        Resizing( Size& rSize );
162     virtual sal_Bool        Close();
163     static void         RegisterChildWindowContext(SfxModule*, sal_uInt16, SfxChildWinContextFactory*);
164 };
165 
166 class SFX2_DLLPUBLIC SfxChildWindow
167 {
168     ::Window*               pParent;        // parent window ( Topwindow )
169     sal_uInt16              nType;          // ChildWindow-Id
170 
171 protected:
172     SfxChildAlignment       eChildAlignment;// aktuelles ::com::sun::star::drawing::Alignment
173     ::Window*               pWindow;        // eigentlicher Inhalt
174     SfxChildWindow_Impl*    pImp;           // Imp-Daten
175 
176 private:
177     SfxChildWindowContext*  pContext;       // bei kontextsensitiven ChildWindows:
178                                             // weiteres window in pWindow
179     SAL_DLLPRIVATE SfxChildWindowContext*
GetContext() const180                         GetContext() const
181                         { return pContext; }
182 
183 protected:
184                         SfxChildWindow(::Window *pParentWindow, sal_uInt16 nId);
185 
186 public:
187     virtual             ~SfxChildWindow();
188     void                Destroy();
GetWindow() const189     ::Window*           GetWindow() const
190                         { return pWindow; }
GetParent() const191     ::Window*           GetParent() const
192                         { return pParent; }
GetAlignment() const193     SfxChildAlignment   GetAlignment() const
194                         { return eChildAlignment; }
195     void                SetAlignment(SfxChildAlignment eAlign);
GetSizePixel() const196     Size                GetSizePixel() const
197                         { return pWindow->GetSizePixel(); }
198     void                SetPosSizePixel(const Point& rPoint, Size& rSize);
GetPosPixel()199     Point               GetPosPixel()
200                         { return pWindow->GetPosPixel(); }
201 //<!--Modified by PengYunQuan for Validity Cell Range Picker
202     virtual void                Hide();
203     virtual void                Show( sal_uInt16 nFlags );
204 //-->Modified by PengYunQuan for Validity Cell Range Picker
GetFlags() const205     sal_uInt16          GetFlags() const
206                         { return GetInfo().nFlags; }
207     sal_Bool                CanGetFocus() const;
208     sal_uInt16              GetPosition();
GetType()209     sal_uInt16              GetType()
210                         { return nType; }
211 
212     void                CreateContext( sal_uInt16 nContextId, SfxBindings& );
GetContextId() const213     sal_uInt16              GetContextId() const
214                         { return pContext ? pContext->GetContextId(): 0; }
215 
GetContextWindow() const216     ::Window*           GetContextWindow() const
217                         { return pContext ? pContext->GetWindow(): 0; }
218 
219     ::Window*           GetContextWindow( SfxModule *pModule ) const;
220 
221     virtual SfxChildWinInfo GetInfo() const;
222     void                SaveStatus(const SfxChildWinInfo& rInfo);
223 
224     static void         RegisterChildWindow(SfxModule*, SfxChildWinFactory*);
225 
226     static SfxChildWindow* CreateChildWindow( sal_uInt16, ::Window*, SfxBindings*, SfxChildWinInfo&);
227     void                SetHideNotDelete( sal_Bool bOn );
228     sal_Bool                IsHideNotDelete() const;
229     void                SetHideAtToggle( sal_Bool bOn );
230     sal_Bool                IsHideAtToggle() const;
231     sal_Bool                IsVisible() const;
232     void                SetWantsFocus( sal_Bool );
233     sal_Bool            WantsFocus() const;
234 
235     virtual sal_Bool    QueryClose();
236     virtual com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >           GetFrame();
237     void                SetFrame( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > & );
238 
239 //#if 0 // _SOLAR__PRIVATE
240     SAL_DLLPRIVATE static void InitializeChildWinFactory_Impl(sal_uInt16, SfxChildWinInfo&);
241     SAL_DLLPRIVATE void SetVisible_Impl( sal_Bool bVis );
242     SAL_DLLPRIVATE void SetWorkWindow_Impl( SfxWorkWindow* );
243     //SfxWorkWindow*        GetWorkWindow_Impl() const;
244     SAL_DLLPRIVATE void Activate_Impl();
245     SAL_DLLPRIVATE void Deactivate_Impl();
246 
247     SAL_DLLPRIVATE SfxChildWindowContext*
GetContext_Impl() const248                         GetContext_Impl() const
249                         { return pContext; }
250     SAL_DLLPRIVATE void SetFactory_Impl( SfxChildWinFactory* );
251 //#endif
252 };
253 
254 //------------------------------------------------------------------
255 //! demn"achst hinf"allig !
256 #define SFX_DECL_CHILDWINDOW_CONTEXT(Class) \
257         static  SfxChildWindowContext* CreateImpl(::Window *pParent, \
258                     SfxBindings *pBindings, SfxChildWinInfo* pInfo ); \
259         static  void RegisterChildWindowContext(SfxModule *pMod=0); \
260 
261 //! Das Macro der Zukunft ...
262 #define SFX_DECL_CHILDWINDOWCONTEXT(Class) \
263         static  SfxChildWindowContext* CreateImpl(::Window *pParent, \
264                     SfxBindings *pBindings, SfxChildWinInfo* pInfo ); \
265         static  void RegisterChildWindowContext(sal_uInt16, SfxModule *pMod=0); \
266 
267 //! demn"achst hinf"allig !
268 #define SFX_IMPL_CHILDWINDOW_CONTEXT(Class, MyID, ShellClass) \
269         SfxChildWindowContext* __EXPORT Class::CreateImpl( ::Window *pParent, \
270                 SfxBindings *pBindings, SfxChildWinInfo* pInfo ) \
271         {   \
272             SfxChildWindowContext *pContext = new Class(pParent, \
273                     /* cast is safe here! */static_cast< sal_uInt16 >(ShellClass::GetInterfaceId()), \
274                     pBindings,pInfo); \
275             return pContext; \
276         } \
277         void    Class::RegisterChildWindowContext(SfxModule* pMod)   \
278         {   \
279             SfxChildWinContextFactory *pFact = new SfxChildWinContextFactory( \
280                 Class::CreateImpl, \
281                 /* cast is safe here! */static_cast< sal_uInt16 >(ShellClass::GetInterfaceId()) );   \
282             SfxChildWindowContext::RegisterChildWindowContext(pMod, MyID, pFact); \
283         }
284 
285 //! Das Macro der Zukunft ...
286 // CreateImpl mu\s noch als Parameter die Factory mitbekommen wg. ContextId
287 // Solange wird diese Id auf 0 gesetzt und in SfxChildWindow::CreateContext gepatched
288 #define SFX_IMPL_CHILDWINDOWCONTEXT(Class, MyID) \
289         SfxChildWindowContext* __EXPORT Class::CreateImpl( ::Window *pParent, \
290                 SfxBindings *pBindings, SfxChildWinInfo* pInfo ) \
291         {   \
292             SfxChildWindowContext *pContext = new Class(pParent,0,pBindings,pInfo);\
293             return pContext; \
294         } \
295         void    Class::RegisterChildWindowContext(sal_uInt16 nId, SfxModule* pMod)   \
296         {   \
297             SfxChildWinContextFactory *pFact = new SfxChildWinContextFactory( \
298                 Class::CreateImpl, nId );   \
299             SfxChildWindowContext::RegisterChildWindowContext(pMod, MyID, pFact); \
300         }
301 
302 #define SFX_DECL_CHILDWINDOW(Class) \
303     public  :   \
304         static  SfxChildWindow* CreateImpl(::Window *pParent, sal_uInt16 nId, \
305                     SfxBindings *pBindings, SfxChildWinInfo* pInfo ); \
306         static  void RegisterChildWindow (sal_Bool bVisible=sal_False, SfxModule *pMod=NULL, sal_uInt16 nFlags=0); \
307         static  sal_uInt16 GetChildWindowId ();\
308         virtual SfxChildWinInfo GetInfo() const
309 
310 #define SFX_IMPL_CHILDWINDOW(Class, MyID) \
311         SFX_IMPL_POS_CHILDWINDOW(Class, MyID, CHILDWIN_NOPOS)
312 
313 #define SFX_IMPL_POS_CHILDWINDOW(Class, MyID, Pos) \
314         SfxChildWindow* __EXPORT Class::CreateImpl( ::Window *pParent, \
315                 sal_uInt16 nId, SfxBindings *pBindings, SfxChildWinInfo* pInfo ) \
316                 {   \
317                     SfxChildWindow *pWin = new Class(pParent, nId, pBindings, pInfo);\
318                     return pWin; \
319                 } \
320         sal_uInt16  __EXPORT Class::GetChildWindowId () \
321                 { return MyID; } \
322         void    Class::RegisterChildWindow (sal_Bool bVis, SfxModule *pMod, sal_uInt16 nFlags)   \
323                 {   \
324                     SfxChildWinFactory *pFact = new SfxChildWinFactory( \
325                         Class::CreateImpl, MyID, Pos );   \
326                     pFact->aInfo.nFlags |= nFlags;  \
327                     pFact->aInfo.bVisible = bVis;         \
328                     SfxChildWindow::RegisterChildWindow(pMod, pFact); \
329                 }
330 
331 #define SFX_IMPL_FLOATINGWINDOW(Class, MyID)    \
332         SFX_IMPL_CHILDWINDOW(Class, MyID)       \
333         SfxChildWinInfo __EXPORT Class::GetInfo() const \
334         {                                       \
335             SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();     \
336             ((SfxFloatingWindow*)GetWindow())->FillInfo( aInfo );  \
337             return aInfo; }
338 
339 #define SFX_IMPL_MODELESSDIALOG(Class, MyID)    \
340         SFX_IMPL_CHILDWINDOW(Class, MyID)       \
341         SfxChildWinInfo __EXPORT Class::GetInfo() const \
342         {                                       \
343             SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();     \
344             ((SfxModelessDialog*)GetWindow())->FillInfo( aInfo );  \
345             return aInfo; }
346 
347 #define SFX_IMPL_DOCKINGWINDOW(Class, MyID) \
348         SFX_IMPL_CHILDWINDOW(Class, MyID)       \
349         SfxChildWinInfo __EXPORT Class::GetInfo() const \
350         {                                       \
351             SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();     \
352             ((SfxDockingWindow*)GetWindow())->FillInfo( aInfo );  \
353             return aInfo; }
354 
355 #define SFX_IMPL_TOOLBOX(Class, MyID)   \
356         SFX_IMPL_CHILDWINDOW(Class, MyID)       \
357         SfxChildWinInfo __EXPORT Class::GetInfo() const \
358         {                                       \
359             SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();     \
360             ((SfxToolbox*)GetWindow())->FillInfo( aInfo );  \
361             return aInfo; }
362 
363 //------------------------------------------------------------------
364 
365 #endif
366