xref: /trunk/main/vcl/inc/window.h (revision 95a18594)
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 
24 #ifndef _SV_WINDOW_H
25 #define _SV_WINDOW_H
26 
27 #include <vector>
28 #include <vcl/sv.h>
29 #include <vcl/outdev.hxx>
30 #include <vcl/timer.hxx>
31 #ifndef _SV_INPUTCTX_HXX
32 #include <vcl/inputctx.hxx>
33 #endif
34 #ifndef _SV_POINTR_HXX
35 #include <vcl/pointr.hxx>
36 #endif
37 #include <tools/wintypes.hxx>
38 #include <vcl/vclevent.hxx>
39 #include <com/sun/star/uno/Reference.hxx>
40 #include <cppuhelper/weakref.hxx>
41 
42 #include <vcl/salnativewidgets.hxx>
43 
44 #include <list>
45 
46 struct SalPaintEvent;
47 struct ImplDelData;
48 struct ImplAccessibleInfos;
49 
50 class Window;
51 class VirtualDevice;
52 class Cursor;
53 class ImplDevFontList;
54 class ImplFontCache;
55 class VCLXWindow;
56 class SalFrame;
57 class SalObject;
58 
59 
60 namespace com {
61 namespace sun {
62 namespace star {
63 namespace accessibility {
64     class XAccessible;
65 }}}}
66 
67 namespace com {
68 namespace sun {
69 namespace star {
70 namespace rendering {
71     class XCanvas;
72 }}}}
73 
74 namespace com {
75 namespace sun {
76 namespace star {
77 namespace awt {
78     class XWindowPeer;
79     class XWindow;
80 }
81 namespace uno {
82     class Any;
83     class XInterface;
84 }
85 namespace datatransfer {
86 namespace clipboard {
87     class XClipboard;
88 }
89 
90 namespace dnd {
91     class XDropTargetListener;
92     class XDragGestureRecognizer;
93     class XDragSource;
94     class XDropTarget;
95 } } } } }
96 
97 namespace vcl {
98     struct ControlLayoutData;
99     struct ExtWindowImpl;
100 }
101 
102 
103 // --------------
104 // - Prototypes -
105 // --------------
106 
107 long ImplWindowFrameProc( Window* pInst, SalFrame* pFrame, sal_uInt16 nEvent, const void* pEvent );
108 
109 // -----------
110 // - HitTest -
111 // -----------
112 
113 #define WINDOW_HITTEST_INSIDE           ((sal_uInt16)0x0001)
114 #define WINDOW_HITTEST_TRANSPARENT      ((sal_uInt16)0x0002)
115 
116 // ---------------
117 // - ImplWinData -
118 // ---------------
119 
120 struct ImplWinData
121 {
122     UniString*          mpExtOldText;
123     sal_uInt16*             mpExtOldAttrAry;
124     Rectangle*          mpCursorRect;
125     long                mnCursorExtWidth;
126     Rectangle*          mpFocusRect;
127     Rectangle*          mpTrackRect;
128     sal_uInt16              mnTrackFlags;
129     sal_uInt16				mnIsTopWindow;
130     sal_Bool                mbMouseOver;          // tracks mouse over for native widget paint effect
131     sal_Bool                mbEnableNativeWidget; // toggle native widget rendering
132     ::std::list< Window* >
133                         maTopWindowChildren;
134 };
135 
136 // -------------------
137 // - ImplOverlapData -
138 // -------------------
139 
140 struct ImplOverlapData
141 {
142     VirtualDevice*      mpSaveBackDev;      // Gesicherte Hintergrund-Bitmap
143     Region*             mpSaveBackRgn;      // Gesicherte Region, was invalidiert werden muss
144     Window*             mpNextBackWin;      // Naechstes Fenster mit Hintergrund-Sicherung
145     sal_uIntPtr               mnSaveBackSize;     // Groesse Bitmap fuer Hintergrund-Sicherung
146     sal_Bool                mbSaveBack;         // sal_True: Background sichern
147     sal_uInt8                mnTopLevel;         // Level for Overlap-Window
148 };
149 
150 // -----------------
151 // - ImplFrameData -
152 // -----------------
153 
154 struct ImplFrameData
155 {
156     Timer               maPaintTimer;       // paint timer
157     Timer				maResizeTimer;		// resize timer
158     InputContext        maOldInputContext;  // Last set Input Context
159     Window*             mpNextFrame;        // next frame window
160     Window*             mpFirstOverlap;     // first overlap window
161     Window*             mpFocusWin;         // focus window (is also set, when frame doesn't have the focous)
162     Window*             mpMouseMoveWin;     // last window, where MouseMove() called
163     Window*             mpMouseDownWin;     // last window, where MouseButtonDown() called
164     Window*             mpFirstBackWin;     // Erstes Overlap-Window mit Hintergrund-Sicherung
165 	::std::vector<Window *> maOwnerDrawList; // List of system windows with owner draw decoration
166     ImplDevFontList*    mpFontList;         // Font-List for this frame
167     ImplFontCache*      mpFontCache;        // Font-Cache for this frame
168     sal_Int32           mnDPIX;             // Original Screen Resolution
169     sal_Int32           mnDPIY;             // Original Screen Resolution
170     ImplMapRes          maMapUnitRes;       // for LogicUnitToPixel
171     sal_uIntPtr               mnAllSaveBackSize;  // Groesse aller Bitmaps fuer Hintergrund-Sicherung
172     sal_uIntPtr               mnFocusId;          // FocusId for PostUserLink
173     sal_uIntPtr               mnMouseMoveId;      // MoveId for PostUserLink
174     long                mnLastMouseX;       // last x mouse position
175     long                mnLastMouseY;       // last y mouse position
176     long                mnBeforeLastMouseX; // last but one x mouse position
177     long                mnBeforeLastMouseY; // last but one y mouse position
178     long                mnFirstMouseX;      // first x mouse position by mousebuttondown
179     long                mnFirstMouseY;      // first y mouse position by mousebuttondown
180     long                mnLastMouseWinX;    // last x mouse position, rel. to pMouseMoveWin
181     long                mnLastMouseWinY;    // last y mouse position, rel. to pMouseMoveWin
182     sal_uInt16              mnModalMode;        // frame based modal count (app based makes no sense anymore)
183     sal_uIntPtr               mnMouseDownTime;    // mouse button down time for double click
184     sal_uInt16              mnClickCount;       // mouse click count
185     sal_uInt16              mnFirstMouseCode;   // mouse code by mousebuttondown
186     sal_uInt16              mnMouseCode;        // mouse code
187     sal_uInt16              mnMouseMode;        // mouse mode
188     MapUnit             meMapUnit;          // last MapUnit for LogicUnitToPixel
189     sal_Bool                mbHasFocus;         // focus
190     sal_Bool                mbInMouseMove;      // is MouseMove on stack
191     sal_Bool                mbMouseIn;          // is Mouse inside the frame
192     sal_Bool                mbStartDragCalled;  // is command startdrag called
193     sal_Bool                mbNeedSysWindow;    // set, when FrameSize <= IMPL_MIN_NEEDSYSWIN
194     sal_Bool                mbMinimized;        // set, when FrameSize <= 0
195     sal_Bool                mbStartFocusState;  // FocusState, beim abschicken des Events
196     sal_Bool                mbInSysObjFocusHdl; // Innerhalb vom GetFocus-Handler eines SysChilds
197     sal_Bool                mbInSysObjToTopHdl; // Innerhalb vom ToTop-Handler eines SysChilds
198     sal_Bool                mbSysObjFocus;      // Hat ein SysChild den Focus
199 
200     ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragSource > mxDragSource;
201     ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDropTarget > mxDropTarget;
202     ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener > mxDropTargetListener;
203     ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboard > mxClipboard;
204     ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboard > mxSelection;
205 
206     sal_Bool                mbInternalDragGestureRecognizer;
207 };
208 
209 // -----------------------
210 // - ImplAccessibleInfos -
211 // -----------------------
212 
213 struct ImplAccessibleInfos
214 {
215     sal_uInt16 nAccessibleRole;
216     String* pAccessibleName;
217     String* pAccessibleDescription;
218     Window* pLabeledByWindow;
219     Window* pLabelForWindow;
220     Window* pMemberOfWindow;
221 
222     ImplAccessibleInfos();
223     ~ImplAccessibleInfos();
224 };
225 
226 
227 // ---------------
228 // - WindowImpl -
229 // ---------------
230 
231 enum AlwaysInputMode { AlwaysInputNone = 0, AlwaysInputEnabled = 1, AlwaysInputDisabled =2 };
232 
233 class WindowImpl
234 {
235 public:
236     WindowImpl( WindowType );
237     ~WindowImpl();
238 
239     ImplWinData*        mpWinData;
240     ImplOverlapData*    mpOverlapData;
241     ImplFrameData*      mpFrameData;
242     SalFrame*           mpFrame;
243     SalObject*          mpSysObj;
244     Window*             mpFrameWindow;
245     Window*             mpOverlapWindow;
246     Window*             mpBorderWindow;
247     Window*             mpClientWindow;
248     Window*             mpParent;
249     Window*             mpRealParent;
250     Window*             mpFirstChild;
251     Window*             mpLastChild;
252     Window*             mpFirstOverlap;
253     Window*             mpLastOverlap;
254     Window*             mpPrev;
255     Window*             mpNext;
256     Window*             mpNextOverlap;
257     Window*             mpLastFocusWindow;
258     Window*             mpDlgCtrlDownWindow;
259     VclEventListeners   maEventListeners;
260     VclEventListeners   maChildEventListeners;
261 
262     // The canvas interface for this VCL window. Is persistent after the first GetCanvas() call
263     ::com::sun::star::uno::WeakReference< ::com::sun::star::rendering::XCanvas > 	mxCanvas;
264 
265     ImplDelData*        mpFirstDel;
266     void*               mpUserData;
267     vcl::ExtWindowImpl* mpExtImpl;
268     Cursor*             mpCursor;
269     Pointer             maPointer;
270     Fraction            maZoom;
271     XubString           maText;
272     Font*               mpControlFont;
273     Color               maControlForeground;
274     Color               maControlBackground;
275     sal_Int32           mnLeftBorder;
276     sal_Int32           mnTopBorder;
277     sal_Int32           mnRightBorder;
278     sal_Int32           mnBottomBorder;
279     long                mnX;
280     long                mnY;
281     long                mnAbsScreenX;
282     Point               maPos;
283     rtl::OString        maHelpId;
284     rtl::OString        maUniqId;
285     XubString           maHelpText;
286     XubString           maQuickHelpText;
287     InputContext        maInputContext;
288     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > mxWindowPeer;
289     ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > mxAccessible;
290     ImplAccessibleInfos* mpAccessibleInfos;
291     VCLXWindow*         mpVCLXWindow;
292     Region              maWinRegion;        // region to 'shape' the VCL window (frame coordinates)
293     Region              maWinClipRegion;    // the (clipping) region that finally corresponds to the VCL window (frame coordinates)
294     Region              maInvalidateRegion; // region that has to be redrawn (frame coordinates)
295     Region*             mpChildClipRegion;  // child clip region if CLIPCHILDREN is set (frame coordinates)
296     Region*             mpPaintRegion;      // only set during Paint() method call (window coordinates)
297     WinBits             mnStyle;
298     WinBits             mnPrevStyle;
299     WinBits             mnExtendedStyle;
300     WinBits             mnPrevExtendedStyle;
301     WindowType          mnType;
302     ControlPart         mnNativeBackground;
303     sal_uInt16              mnWaitCount;
304     sal_uInt16              mnPaintFlags;
305     sal_uInt16              mnGetFocusFlags;
306     sal_uInt16              mnParentClipMode;
307     sal_uInt16              mnActivateMode;
308     sal_uInt16              mnDlgCtrlFlags;
309     sal_uInt16              mnLockCount;
310     AlwaysInputMode     meAlwaysInputMode;
311     sal_Bool                mbFrame:1,
312                         mbBorderWin:1,
313                         mbOverlapWin:1,
314                         mbSysWin:1,
315                         mbDialog:1,
316                         mbDockWin:1,
317                         mbFloatWin:1,
318                         mbPushButton:1,
319                         mbVisible:1,
320                         mbDisabled:1,
321                         mbInputDisabled:1,
322                         mbDropDisabled:1,
323                         mbNoUpdate:1,
324                         mbNoParentUpdate:1,
325                         mbActive:1,
326                         mbParentActive:1,
327                         mbReallyVisible:1,
328                         mbReallyShown:1,
329                         mbInInitShow:1,
330                         mbChildNotify:1,
331                         mbChildPtrOverwrite:1,
332                         mbNoPtrVisible:1,
333                         mbPaintFrame:1,
334                         mbInPaint:1,
335                         mbMouseMove:1,
336                         mbMouseButtonDown:1,
337                         mbMouseButtonUp:1,
338                         mbKeyInput:1,
339                         mbKeyUp:1,
340                         mbCommand:1,
341                         mbDefPos:1,
342                         mbDefSize:1,
343                         mbCallMove:1,
344                         mbCallResize:1,
345                         mbWaitSystemResize:1,
346                         mbInitWinClipRegion:1,
347                         mbInitChildRegion:1,
348                         mbWinRegion:1,
349                         mbClipChildren:1,
350                         mbClipSiblings:1,
351                         mbChildTransparent:1,
352                         mbPaintTransparent:1,
353                         mbMouseTransparent:1,
354                         mbDlgCtrlStart:1,
355                         mbFocusVisible:1,
356                         mbTrackVisible:1,
357                         mbUseNativeFocus:1,
358                         mbNativeFocusVisible:1,
359                         mbInShowFocus:1,
360                         mbInHideFocus:1,
361                         mbControlForeground:1,
362                         mbControlBackground:1,
363                         mbAlwaysOnTop:1,
364                         mbCompoundControl:1,
365                         mbCompoundControlHasFocus:1,
366                         mbPaintDisabled:1,
367                         mbAllResize:1,
368                         mbInDtor:1,
369                         mbExtTextInput:1,
370                         mbInFocusHdl:1,
371                         mbOverlapVisible:1,
372                         mbCreatedWithToolkit:1,
373                         mbToolBox:1,
374                         mbSplitter:1,
375                         mbSuppressAccessibilityEvents:1,
376                         mbMenuFloatingWindow:1,
377                         mbDrawSelectionBackground:1,
378                         mbIsInTaskPaneList:1,
379                         mbToolbarFloatingWindow:1,
380                         mbCallHandlersDuringInputDisabled:1,
381                         mbDisableAccessibleLabelForRelation:1,
382                         mbDisableAccessibleLabeledByRelation:1,
383                         mbHelpTextDynamic:1,
384                         mbFakeFocusSet:1,
385                         mbInterceptChildWindowKeyDown:1,
386                         mbIsThemingEnabled;
387 
388     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > mxDNDListenerContainer;
389 };
390 
391 // -----------------
392 // - Hilfsmethoden -
393 // -----------------
394 
395 long ImplHandleMouseEvent( Window* pWindow, sal_uInt16 nSVEvent, sal_Bool bMouseLeave,
396                            long nX, long nY, sal_uIntPtr nMsgTime,
397                            sal_uInt16 nCode, sal_uInt16 nMode );
398 void ImplHandleResize( Window* pWindow, long nNewWidth, long nNewHeight );
399 
400 #endif // _SV_WINDOW_H
401