1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Robert Roebling
6 // Copyright: (c) 1998 Robert Roebling, Julian Smart
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
12 #pragma implementation "window.h"
16 #include "wx/window.h"
20 #include "wx/layout.h"
22 #include "wx/dialog.h"
23 #include "wx/msgdlg.h"
24 #include "wx/dcclient.h"
27 #include "wx/statusbr.h"
29 #include "gdk/gdkprivate.h"
30 #include "gdk/gdkkeysyms.h"
34 //-----------------------------------------------------------------------------
35 // documentation on internals
36 //-----------------------------------------------------------------------------
39 I have been asked several times about writing some documentation about
40 the GTK port of wxWindows, especially its internal structures. Obviously,
41 you cannot understand wxGTK without knowing a little about the GTK, but
42 some more information about what the wxWindow, which is the base class
43 for all other window classes, does seems required as well.
45 What does wxWindow do? It contains the common interface for the following
46 jobs of its descentants:
48 1) Define the rudimentary behaviour common to all window classes, such as
49 resizing, intercepting user input so as to make it possible to use these
50 events for special purposes in a derived class, window names etc.
52 2) Provide the possibility to contain and manage children, if the derived
53 class is allowed to contain children, which holds true for those window
54 classes, which do not display a native GTK widget. To name them, these
55 classes are wxPanel, wxScrolledWindow, wxDialog, wxFrame. The MDI frame-
56 work classes are a special case and are handled a bit differently from
59 3) Provide the possibility to draw into a client area of a window. This,
60 too, only holds true for classes that do not display a native GTK widget
63 4) Provide the entire mechanism for scrolling widgets. This actaul inter-
64 face for this is usually in wxScrolledWidget, but the GTK implementation
67 5) A multitude of helper or extra methods for special purposes, such as
68 Drag'n'Drop, managing validators etc.
70 Normally one might expect, that one wxWindows class would always contain
71 one GTK widget. Under GTK, there is no such allround widget that has all
72 the functionality. Moreover, the GTK defines a client area as a different
73 widget from the actual widget you are handling. Last but not least some
74 special classes (e.g. wxFrame) handle different categories of widgets and
75 still have the possibility to draw something in the client area.
76 It was therefore required to write a special purpose GTK widget, that would
77 represent a client area in the sense of wxWindows capable to do the jobs
78 2), 3) and 4). I have written this class and it resides in win_gtk.c of
81 All windows must have a widget, with which they interact with other under-
82 lying GTK widget. It is this widget, e.g. that has to be resized etc and
83 thw wxWindow class has a member variable called m_widget which holds a
84 pointer to this widget. When the window class displays a GTK native widget,
85 this is the only GTK widget the class manages. When the class has a client
86 area for drawing into and for containing children it must have at least
87 one more GTK widget to handle (of the type GtkMyFixed, defined in win_gtk.c),
88 but there can be any number of widgets, handled by a class (e.g. the frame
89 class handles three). The common rule for all windows is only, that the
90 widget that interacts with the rest of GTK must be referenced in m_widget
91 and all other widgets must be children of this widget on the GTK level.
92 The top-most widget, which also represents the client area, must be in
93 the m_wxwindow field and must be of the type GtkMyFixed.
95 As I said, the window classes that display a GTK native widget only have
96 one widget, so in the case of e.g. the wxButton class m_widget holds a
97 pointer to a GtkButton widget. But windows with client areas (for drawing
98 and children) have a m_widget field that is a pointer to a GtkScrolled-
99 Window and a m_wxwindow field that is pointer to a GtkMyFixed and this
100 one is (in the GTK sense) a child of the GtkScrolledWindow.
102 If the m_wxwindow field is set, then all input to this widget is inter-
103 cepted and sent to the wxWindows class. If not, all input to the widget
104 that gets pointed to by m_widget gets intercepted and sent to the class.
108 //-----------------------------------------------------------------------------
110 //-----------------------------------------------------------------------------
112 extern wxList wxPendingDelete
;
113 extern wxList wxTopLevelWindows
;
114 extern bool g_blockEventsOnDrag
;
115 static bool g_capturing
= FALSE
;
117 // hack: we need something to pass to gtk_menu_popup, so we store the time of
118 // the last click here
119 static guint32 gs_timeLastClick
= 0;
121 //-----------------------------------------------------------------------------
122 // "expose_event" (of m_wxwindow, not of m_widget)
123 //-----------------------------------------------------------------------------
125 static void gtk_window_expose_callback( GtkWidget
*WXUNUSED(widget
), GdkEventExpose
*gdk_event
, wxWindow
*win
)
127 if (!win
->HasVMT()) return;
128 if (g_blockEventsOnDrag
) return;
130 win
->m_updateRegion
.Union( gdk_event
->area
.x
,
132 gdk_event
->area
.width
,
133 gdk_event
->area
.height
);
135 if (gdk_event
->count
> 0) return;
138 printf( "OnExpose from " );
139 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
140 printf( win->GetClassInfo()->GetClassName() );
144 wxPaintEvent
event( win
->GetId() );
145 event
.SetEventObject( win
);
146 win
->GetEventHandler()->ProcessEvent( event
);
148 win
->m_updateRegion
.Clear();
151 //-----------------------------------------------------------------------------
152 // "draw" (of m_wxwindow, not of m_widget)
153 //-----------------------------------------------------------------------------
155 static void gtk_window_draw_callback( GtkWidget
*WXUNUSED(widget
), GdkRectangle
*rect
, wxWindow
*win
)
157 if (!win
->HasVMT()) return;
158 if (g_blockEventsOnDrag
) return;
160 win
->m_updateRegion
.Union( rect
->x
, rect
->y
, rect
->width
, rect
->height
);
162 wxPaintEvent
event( win
->GetId() );
163 event
.SetEventObject( win
);
164 win
->GetEventHandler()->ProcessEvent( event
);
166 win
->m_updateRegion
.Clear();
169 //-----------------------------------------------------------------------------
171 //-----------------------------------------------------------------------------
173 static gint
gtk_window_key_press_callback( GtkWidget
*widget
, GdkEventKey
*gdk_event
, wxWindow
*win
)
175 if (!win
->HasVMT()) return FALSE
;
176 if (g_blockEventsOnDrag
) return FALSE
;
179 printf( "OnKeyPress from " );
180 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
181 printf( win->GetClassInfo()->GetClassName() );
186 switch (gdk_event
->keyval
)
188 case GDK_BackSpace
: key_code
= WXK_BACK
; break;
189 case GDK_Tab
: key_code
= WXK_TAB
; break;
190 case GDK_Linefeed
: key_code
= WXK_RETURN
; break;
191 case GDK_Clear
: key_code
= WXK_CLEAR
; break;
192 case GDK_Return
: key_code
= WXK_RETURN
; break;
193 case GDK_Pause
: key_code
= WXK_PAUSE
; break;
194 case GDK_Scroll_Lock
: key_code
= WXK_SCROLL
; break;
195 case GDK_Escape
: key_code
= WXK_ESCAPE
; break;
196 case GDK_Delete
: key_code
= WXK_DELETE
; break;
197 case GDK_Home
: key_code
= WXK_HOME
; break;
198 case GDK_Left
: key_code
= WXK_LEFT
; break;
199 case GDK_Up
: key_code
= WXK_UP
; break;
200 case GDK_Right
: key_code
= WXK_RIGHT
; break;
201 case GDK_Down
: key_code
= WXK_DOWN
; break;
202 case GDK_Prior
: key_code
= WXK_PRIOR
; break;
203 // case GDK_Page_Up: key_code = WXK_PAGEUP; break;
204 case GDK_Next
: key_code
= WXK_NEXT
; break;
205 // case GDK_Page_Down: key_code = WXK_PAGEDOWN; break;
206 case GDK_End
: key_code
= WXK_END
; break;
207 case GDK_Begin
: key_code
= WXK_HOME
; break;
208 case GDK_Select
: key_code
= WXK_SELECT
; break;
209 case GDK_Print
: key_code
= WXK_PRINT
; break;
210 case GDK_Execute
: key_code
= WXK_EXECUTE
; break;
211 case GDK_Insert
: key_code
= WXK_INSERT
; break;
212 case GDK_Num_Lock
: key_code
= WXK_NUMLOCK
; break;
213 case GDK_KP_Tab
: key_code
= WXK_TAB
; break;
214 case GDK_KP_Enter
: key_code
= WXK_RETURN
; break;
215 case GDK_KP_Home
: key_code
= WXK_HOME
; break;
216 case GDK_KP_Left
: key_code
= WXK_LEFT
; break;
217 case GDK_KP_Up
: key_code
= WXK_UP
; break;
218 case GDK_KP_Right
: key_code
= WXK_RIGHT
; break;
219 case GDK_KP_Down
: key_code
= WXK_DOWN
; break;
220 case GDK_KP_Prior
: key_code
= WXK_PRIOR
; break;
221 // case GDK_KP_Page_Up: key_code = WXK_PAGEUP; break;
222 case GDK_KP_Next
: key_code
= WXK_NEXT
; break;
223 // case GDK_KP_Page_Down: key_code = WXK_PAGEDOWN; break;
224 case GDK_KP_End
: key_code
= WXK_END
; break;
225 case GDK_KP_Begin
: key_code
= WXK_HOME
; break;
226 case GDK_KP_Insert
: key_code
= WXK_INSERT
; break;
227 case GDK_KP_Delete
: key_code
= WXK_DELETE
; break;
228 case GDK_KP_Multiply
: key_code
= WXK_MULTIPLY
; break;
229 case GDK_KP_Add
: key_code
= WXK_ADD
; break;
230 case GDK_KP_Separator
: key_code
= WXK_SEPARATOR
; break;
231 case GDK_KP_Subtract
: key_code
= WXK_SUBTRACT
; break;
232 case GDK_KP_Decimal
: key_code
= WXK_DECIMAL
; break;
233 case GDK_KP_Divide
: key_code
= WXK_DIVIDE
; break;
234 case GDK_KP_0
: key_code
= WXK_NUMPAD0
; break;
235 case GDK_KP_1
: key_code
= WXK_NUMPAD1
; break;
236 case GDK_KP_2
: key_code
= WXK_NUMPAD2
; break;
237 case GDK_KP_3
: key_code
= WXK_NUMPAD3
; break;
238 case GDK_KP_4
: key_code
= WXK_NUMPAD4
; break;
239 case GDK_KP_5
: key_code
= WXK_NUMPAD5
; break;
240 case GDK_KP_6
: key_code
= WXK_NUMPAD6
; break;
241 case GDK_KP_7
: key_code
= WXK_NUMPAD7
; break;
242 case GDK_KP_8
: key_code
= WXK_NUMPAD7
; break;
243 case GDK_KP_9
: key_code
= WXK_NUMPAD9
; break;
244 case GDK_F1
: key_code
= WXK_F1
; break;
245 case GDK_F2
: key_code
= WXK_F2
; break;
246 case GDK_F3
: key_code
= WXK_F3
; break;
247 case GDK_F4
: key_code
= WXK_F4
; break;
248 case GDK_F5
: key_code
= WXK_F5
; break;
249 case GDK_F6
: key_code
= WXK_F6
; break;
250 case GDK_F7
: key_code
= WXK_F7
; break;
251 case GDK_F8
: key_code
= WXK_F8
; break;
252 case GDK_F9
: key_code
= WXK_F9
; break;
253 case GDK_F10
: key_code
= WXK_F10
; break;
254 case GDK_F11
: key_code
= WXK_F11
; break;
255 case GDK_F12
: key_code
= WXK_F12
; break;
258 if ((gdk_event
->keyval
>= 0x20) && (gdk_event
->keyval
<= 0xFF))
259 key_code
= gdk_event
->keyval
;
263 if (!key_code
) return FALSE
;
265 wxKeyEvent
event( wxEVT_CHAR
);
266 event
.m_shiftDown
= (gdk_event
->state
& GDK_SHIFT_MASK
);
267 event
.m_controlDown
= (gdk_event
->state
& GDK_CONTROL_MASK
);
268 event
.m_altDown
= (gdk_event
->state
& GDK_MOD1_MASK
);
269 event
.m_metaDown
= (gdk_event
->state
& GDK_MOD2_MASK
);
270 event
.m_keyCode
= key_code
;
273 event
.SetEventObject( win
);
275 bool ret
= win
->GetEventHandler()->ProcessEvent( event
);
279 wxWindow
*ancestor
= win
;
282 int command
= ancestor
->GetAcceleratorTable()->GetCommand( event
);
285 wxCommandEvent
command_event( wxEVT_COMMAND_MENU_SELECTED
, command
);
286 ret
= ancestor
->GetEventHandler()->ProcessEvent( command_event
);
289 ancestor
= ancestor
->GetParent();
295 if ((gdk_event
->keyval
>= 0x20) && (gdk_event
->keyval
<= 0xFF))
296 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "key_press_event" );
302 //-----------------------------------------------------------------------------
303 // "button_press_event"
304 //-----------------------------------------------------------------------------
306 static gint
gtk_window_button_press_callback( GtkWidget
*widget
, GdkEventButton
*gdk_event
, wxWindow
*win
)
308 if (!win
->IsOwnGtkWindow( gdk_event
->window
)) return TRUE
;
310 if (g_blockEventsOnDrag
) return TRUE
;
314 if (GTK_WIDGET_CAN_FOCUS(win
->m_wxwindow
) && !GTK_WIDGET_HAS_FOCUS (win
->m_wxwindow
) )
316 gtk_widget_grab_focus (win
->m_wxwindow
);
319 printf( "GrabFocus from " );
320 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
321 printf( win->GetClassInfo()->GetClassName() );
328 if (!win
->HasVMT()) return TRUE
;
331 printf( "OnButtonPress from " );
332 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
333 printf( win->GetClassInfo()->GetClassName() );
337 wxEventType event_type
= wxEVT_LEFT_DOWN
;
339 if (gdk_event
->button
== 1)
341 switch (gdk_event
->type
)
343 case GDK_BUTTON_PRESS
: event_type
= wxEVT_LEFT_DOWN
; break;
344 case GDK_2BUTTON_PRESS
: event_type
= wxEVT_LEFT_DCLICK
; break;
348 else if (gdk_event
->button
== 2)
350 switch (gdk_event
->type
)
352 case GDK_BUTTON_PRESS
: event_type
= wxEVT_MIDDLE_DOWN
; break;
353 case GDK_2BUTTON_PRESS
: event_type
= wxEVT_MIDDLE_DCLICK
; break;
357 else if (gdk_event
->button
== 3)
359 switch (gdk_event
->type
)
361 case GDK_BUTTON_PRESS
: event_type
= wxEVT_RIGHT_DOWN
; break;
362 case GDK_2BUTTON_PRESS
: event_type
= wxEVT_RIGHT_DCLICK
; break;
367 wxMouseEvent
event( event_type
);
368 event
.m_shiftDown
= (gdk_event
->state
& GDK_SHIFT_MASK
);
369 event
.m_controlDown
= (gdk_event
->state
& GDK_CONTROL_MASK
);
370 event
.m_altDown
= (gdk_event
->state
& GDK_MOD1_MASK
);
371 event
.m_metaDown
= (gdk_event
->state
& GDK_MOD2_MASK
);
372 event
.m_leftDown
= (gdk_event
->state
& GDK_BUTTON1_MASK
);
373 event
.m_middleDown
= (gdk_event
->state
& GDK_BUTTON2_MASK
);
374 event
.m_rightDown
= (gdk_event
->state
& GDK_BUTTON3_MASK
);
376 event
.m_x
= (long)gdk_event
->x
;
377 event
.m_y
= (long)gdk_event
->y
;
379 // Some control don't have their own X window and thus cannot get
384 wxNode
*node
= win
->GetChildren()->First();
387 wxWindow
*child
= (wxWindow
*)node
->Data();
388 if ((child
->m_x
<= event
.m_x
) &&
389 (child
->m_y
<= event
.m_y
) &&
390 (child
->m_x
+child
->m_width
>= event
.m_x
) &&
391 (child
->m_y
+child
->m_height
>= event
.m_y
))
394 event
.m_x
-= child
->m_x
;
395 event
.m_y
-= child
->m_y
;
402 event
.SetEventObject( win
);
404 gs_timeLastClick
= gdk_event
->time
;
406 if (win
->GetEventHandler()->ProcessEvent( event
))
407 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "button_press_event" );
412 //-----------------------------------------------------------------------------
413 // "button_release_event"
414 //-----------------------------------------------------------------------------
416 static gint
gtk_window_button_release_callback( GtkWidget
*widget
, GdkEventButton
*gdk_event
, wxWindow
*win
)
418 if (!win
->IsOwnGtkWindow( gdk_event
->window
)) return TRUE
;
420 if (g_blockEventsOnDrag
) return TRUE
;
422 if (!win
->HasVMT()) return TRUE
;
425 printf( "OnButtonRelease from " );
426 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
427 printf( win->GetClassInfo()->GetClassName() );
431 wxEventType event_type
= wxEVT_NULL
;
433 switch (gdk_event
->button
)
435 case 1: event_type
= wxEVT_LEFT_UP
; break;
436 case 2: event_type
= wxEVT_MIDDLE_UP
; break;
437 case 3: event_type
= wxEVT_RIGHT_UP
; break;
440 wxMouseEvent
event( event_type
);
441 event
.m_shiftDown
= (gdk_event
->state
& GDK_SHIFT_MASK
);
442 event
.m_controlDown
= (gdk_event
->state
& GDK_CONTROL_MASK
);
443 event
.m_altDown
= (gdk_event
->state
& GDK_MOD1_MASK
);
444 event
.m_metaDown
= (gdk_event
->state
& GDK_MOD2_MASK
);
445 event
.m_leftDown
= (gdk_event
->state
& GDK_BUTTON1_MASK
);
446 event
.m_middleDown
= (gdk_event
->state
& GDK_BUTTON2_MASK
);
447 event
.m_rightDown
= (gdk_event
->state
& GDK_BUTTON3_MASK
);
448 event
.m_x
= (long)gdk_event
->x
;
449 event
.m_y
= (long)gdk_event
->y
;
451 // Some control don't have their own X window and thus cannot get
456 wxNode
*node
= win
->GetChildren()->First();
459 wxWindow
*child
= (wxWindow
*)node
->Data();
460 if ((child
->m_x
<= event
.m_x
) &&
461 (child
->m_y
<= event
.m_y
) &&
462 (child
->m_x
+child
->m_width
>= event
.m_x
) &&
463 (child
->m_y
+child
->m_height
>= event
.m_y
))
466 event
.m_x
-= child
->m_x
;
467 event
.m_y
-= child
->m_y
;
474 event
.SetEventObject( win
);
476 if (win
->GetEventHandler()->ProcessEvent( event
))
477 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "button_release_event" );
482 //-----------------------------------------------------------------------------
483 // "motion_notify_event"
484 //-----------------------------------------------------------------------------
486 static gint
gtk_window_motion_notify_callback( GtkWidget
*widget
, GdkEventMotion
*gdk_event
, wxWindow
*win
)
488 if (!win
->IsOwnGtkWindow( gdk_event
->window
)) return TRUE
;
490 if (g_blockEventsOnDrag
) return TRUE
;
492 if (!win
->HasVMT()) return TRUE
;
495 printf( "OnMotion from " );
496 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
497 printf( win->GetClassInfo()->GetClassName() );
501 wxMouseEvent
event( wxEVT_MOTION
);
502 event
.m_shiftDown
= (gdk_event
->state
& GDK_SHIFT_MASK
);
503 event
.m_controlDown
= (gdk_event
->state
& GDK_CONTROL_MASK
);
504 event
.m_altDown
= (gdk_event
->state
& GDK_MOD1_MASK
);
505 event
.m_metaDown
= (gdk_event
->state
& GDK_MOD2_MASK
);
506 event
.m_leftDown
= (gdk_event
->state
& GDK_BUTTON1_MASK
);
507 event
.m_middleDown
= (gdk_event
->state
& GDK_BUTTON2_MASK
);
508 event
.m_rightDown
= (gdk_event
->state
& GDK_BUTTON3_MASK
);
510 event
.m_x
= (long)gdk_event
->x
;
511 event
.m_y
= (long)gdk_event
->y
;
513 // Some control don't have their own X window and thus cannot get
518 wxNode
*node
= win
->GetChildren()->First();
521 wxWindow
*child
= (wxWindow
*)node
->Data();
522 if ((child
->m_x
<= event
.m_x
) &&
523 (child
->m_y
<= event
.m_y
) &&
524 (child
->m_x
+child
->m_width
>= event
.m_x
) &&
525 (child
->m_y
+child
->m_height
>= event
.m_y
))
528 event
.m_x
-= child
->m_x
;
529 event
.m_y
-= child
->m_y
;
536 event
.SetEventObject( win
);
538 if (win
->GetEventHandler()->ProcessEvent( event
))
539 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "motion_notify_event" );
544 //-----------------------------------------------------------------------------
546 //-----------------------------------------------------------------------------
548 static gint
gtk_window_focus_in_callback( GtkWidget
*widget
, GdkEvent
*WXUNUSED(event
), wxWindow
*win
)
550 if (g_blockEventsOnDrag
) return TRUE
;
553 if (GTK_WIDGET_CAN_FOCUS(win
->m_wxwindow
))
555 GTK_WIDGET_SET_FLAGS (win
->m_wxwindow
, GTK_HAS_FOCUS
);
557 printf( "SetFocus flag from " );
558 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
559 printf( win->GetClassInfo()->GetClassName() );
565 if (!win
->HasVMT()) return TRUE
;
568 printf( "OnSetFocus from " );
569 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
570 printf( win->GetClassInfo()->GetClassName() );
572 printf( WXSTRINGCAST win->GetLabel() );
576 wxFocusEvent
event( wxEVT_SET_FOCUS
, win
->GetId() );
577 event
.SetEventObject( win
);
579 if (win
->GetEventHandler()->ProcessEvent( event
))
580 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "focus_in_event" );
585 //-----------------------------------------------------------------------------
587 //-----------------------------------------------------------------------------
589 static gint
gtk_window_focus_out_callback( GtkWidget
*widget
, GdkEvent
*WXUNUSED(event
), wxWindow
*win
)
591 if (g_blockEventsOnDrag
) return TRUE
;
594 if (GTK_WIDGET_CAN_FOCUS(win
->m_wxwindow
))
595 GTK_WIDGET_UNSET_FLAGS (win
->m_wxwindow
, GTK_HAS_FOCUS
);
598 if (!win
->HasVMT()) return TRUE
;
601 printf( "OnKillFocus from " );
602 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
603 printf( win->GetClassInfo()->GetClassName() );
607 wxFocusEvent
event( wxEVT_KILL_FOCUS
, win
->GetId() );
608 event
.SetEventObject( win
);
610 if (win
->GetEventHandler()->ProcessEvent( event
))
611 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "focus_out_event" );
616 //-----------------------------------------------------------------------------
617 // "enter_notify_event"
618 //-----------------------------------------------------------------------------
620 static gint
gtk_window_enter_callback( GtkWidget
*widget
, GdkEventCrossing
*gdk_event
, wxWindow
*win
)
622 if (widget
->window
!= gdk_event
->window
) return TRUE
;
624 if (g_blockEventsOnDrag
) return TRUE
;
626 if (!win
->HasVMT()) return TRUE
;
629 printf( "OnEnter from " );
630 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
631 printf( win->GetClassInfo()->GetClassName() );
635 if ((widget
->window
) && (win
->m_cursor
))
636 gdk_window_set_cursor( widget
->window
, win
->m_cursor
->GetCursor() );
638 wxMouseEvent
event( wxEVT_ENTER_WINDOW
);
639 event
.SetEventObject( win
);
641 if (win
->GetEventHandler()->ProcessEvent( event
))
642 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "enter_notify_event" );
647 //-----------------------------------------------------------------------------
648 // "leave_notify_event"
649 //-----------------------------------------------------------------------------
651 static gint
gtk_window_leave_callback( GtkWidget
*widget
, GdkEventCrossing
*gdk_event
, wxWindow
*win
)
653 if (widget
->window
!= gdk_event
->window
) return TRUE
;
655 if (g_blockEventsOnDrag
) return TRUE
;
657 if (!win
->HasVMT()) return TRUE
;
660 printf( "OnLeave from " );
661 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
662 printf( win->GetClassInfo()->GetClassName() );
666 if ((widget
->window
) && (win
->m_cursor
))
667 gdk_window_set_cursor( widget
->window
, wxSTANDARD_CURSOR
->GetCursor() );
669 wxMouseEvent
event( wxEVT_LEAVE_WINDOW
);
670 event
.SetEventObject( win
);
672 if (win
->GetEventHandler()->ProcessEvent( event
))
673 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "leave_notify_event" );
678 //-----------------------------------------------------------------------------
679 // "value_changed" from m_vAdjust
680 //-----------------------------------------------------------------------------
682 static void gtk_window_vscroll_callback( GtkWidget
*WXUNUSED(widget
), wxWindow
*win
)
684 if (g_blockEventsOnDrag
) return;
687 printf( "OnVScroll from " );
688 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
689 printf( win->GetClassInfo()->GetClassName() );
693 if (!win
->HasVMT()) return;
695 float diff
= win
->m_vAdjust
->value
- win
->m_oldVerticalPos
;
696 if (fabs(diff
) < 0.2) return;
698 wxEventType command
= wxEVT_NULL
;
700 float line_step
= win
->m_vAdjust
->step_increment
;
701 float page_step
= win
->m_vAdjust
->page_increment
;
703 if (fabs(diff
-line_step
) < 0.2) command
= wxEVT_SCROLL_LINEDOWN
;
704 else if (fabs(diff
+line_step
) < 0.2) command
= wxEVT_SCROLL_LINEUP
;
705 else if (fabs(diff
-page_step
) < 0.2) command
= wxEVT_SCROLL_PAGEDOWN
;
706 else if (fabs(diff
+page_step
) < 0.2) command
= wxEVT_SCROLL_PAGEUP
;
707 else command
= wxEVT_SCROLL_THUMBTRACK
;
709 int value
= (int)(win
->m_vAdjust
->value
+0.5);
711 wxScrollEvent
event( command
, win
->GetId(), value
, wxVERTICAL
);
712 event
.SetEventObject( win
);
713 win
->GetEventHandler()->ProcessEvent( event
);
716 //-----------------------------------------------------------------------------
717 // "value_changed" from m_hAdjust
718 //-----------------------------------------------------------------------------
720 static void gtk_window_hscroll_callback( GtkWidget
*WXUNUSED(widget
), wxWindow
*win
)
722 if (g_blockEventsOnDrag
) return;
725 printf( "OnHScroll from " );
726 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
727 printf( win->GetClassInfo()->GetClassName() );
731 if (!win
->HasVMT()) return;
733 float diff
= win
->m_hAdjust
->value
- win
->m_oldHorizontalPos
;
734 if (fabs(diff
) < 0.2) return;
736 wxEventType command
= wxEVT_NULL
;
738 float line_step
= win
->m_hAdjust
->step_increment
;
739 float page_step
= win
->m_hAdjust
->page_increment
;
741 if (fabs(diff
-line_step
) < 0.2) command
= wxEVT_SCROLL_LINEDOWN
;
742 else if (fabs(diff
+line_step
) < 0.2) command
= wxEVT_SCROLL_LINEUP
;
743 else if (fabs(diff
-page_step
) < 0.2) command
= wxEVT_SCROLL_PAGEDOWN
;
744 else if (fabs(diff
+page_step
) < 0.2) command
= wxEVT_SCROLL_PAGEUP
;
745 else command
= wxEVT_SCROLL_THUMBTRACK
;
747 int value
= (int)(win
->m_hAdjust
->value
+0.5);
749 wxScrollEvent
event( command
, win
->GetId(), value
, wxHORIZONTAL
);
750 event
.SetEventObject( win
);
751 win
->GetEventHandler()->ProcessEvent( event
);
754 //-----------------------------------------------------------------------------
755 // "changed" from m_vAdjust
756 //-----------------------------------------------------------------------------
758 static void gtk_window_vscroll_change_callback( GtkWidget
*WXUNUSED(widget
), wxWindow
*win
)
760 if (g_blockEventsOnDrag
) return;
763 printf( "OnVScroll change from " );
764 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
765 printf( win->GetClassInfo()->GetClassName() );
769 if (!win
->HasVMT()) return;
771 wxEventType command
= wxEVT_SCROLL_THUMBTRACK
;
772 int value
= (int)(win
->m_vAdjust
->value
+0.5);
774 wxScrollEvent
event( command
, win
->GetId(), value
, wxVERTICAL
);
775 event
.SetEventObject( win
);
776 win
->GetEventHandler()->ProcessEvent( event
);
779 //-----------------------------------------------------------------------------
780 // "changed" from m_hAdjust
781 //-----------------------------------------------------------------------------
783 static void gtk_window_hscroll_change_callback( GtkWidget
*WXUNUSED(widget
), wxWindow
*win
)
785 if (g_blockEventsOnDrag
) return;
788 printf( "OnHScroll change from " );
789 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
790 printf( win->GetClassInfo()->GetClassName() );
794 if (!win
->HasVMT()) return;
796 wxEventType command
= wxEVT_SCROLL_THUMBTRACK
;
797 int value
= (int)(win
->m_hAdjust
->value
+0.5);
799 wxScrollEvent
event( command
, win
->GetId(), value
, wxHORIZONTAL
);
800 event
.SetEventObject( win
);
801 win
->GetEventHandler()->ProcessEvent( event
);
804 //-----------------------------------------------------------------------------
805 // "button_press_event" from scrollbar
806 //-----------------------------------------------------------------------------
808 static gint
gtk_scrollbar_button_press_callback( GtkRange
*widget
, GdkEventButton
*gdk_event
, wxWindow
*win
)
810 if (gdk_event
->window
!= widget
->slider
) return FALSE
;
812 win
->m_isScrolling
= TRUE
;
817 //-----------------------------------------------------------------------------
818 // "button_release_event" from scrollbar
819 //-----------------------------------------------------------------------------
821 static gint
gtk_scrollbar_button_release_callback( GtkRange
*widget
, GdkEventButton
*gdk_event
, wxWindow
*win
)
823 if (gdk_event
->window
!= widget
->slider
) return FALSE
;
825 GtkScrolledWindow
*s_window
= GTK_SCROLLED_WINDOW(win
->m_widget
);
827 if (widget
== GTK_RANGE(s_window
->vscrollbar
))
828 gtk_signal_emit_by_name( GTK_OBJECT(win
->m_hAdjust
), "value_changed" );
830 gtk_signal_emit_by_name( GTK_OBJECT(win
->m_vAdjust
), "value_changed" );
832 win
->m_isScrolling
= FALSE
;
837 //-----------------------------------------------------------------------------
838 // "drop_data_available_event"
839 //-----------------------------------------------------------------------------
841 static void gtk_window_drop_callback( GtkWidget
*widget
, GdkEventDropDataAvailable
*event
, wxWindow
*win
)
843 if (!win
->HasVMT()) return;
845 if (win
->GetDropTarget())
849 gdk_window_get_pointer( widget
->window
, &x
, &y
, (GdkModifierType
*) NULL
);
851 printf( "Drop data is of type %s.\n", event
->data_type
);
853 win
->GetDropTarget()->OnDrop( x
, y
, (const void*)event
->data
, (size_t)event
->data_numbytes
);
857 g_free (event->dropdataavailable.data);
858 g_free (event->dropdataavailable.data_type);
862 //-----------------------------------------------------------------------------
863 // InsertChild for wxWindow.
864 //-----------------------------------------------------------------------------
866 // Callback for wxWindow. This very strange beast has to be used because
867 // C++ has no virtual methods in a constructor. We have to emulate a
868 // virtual function here as wxNotebook requires a different way to insert
869 // a child in it. I had opted for creating a wxNotebookPage window class
870 // which would have made this superflouus (such in the MDI window system),
871 // but no-one is listening to me...
873 static void wxInsertChildInWindow( wxWindow
* parent
, wxWindow
* child
)
875 gtk_myfixed_put( GTK_MYFIXED(parent
->m_wxwindow
),
876 GTK_WIDGET(child
->m_widget
),
880 gtk_widget_set_usize( GTK_WIDGET(child
->m_widget
),
885 //-----------------------------------------------------------------------------
887 //-----------------------------------------------------------------------------
889 IMPLEMENT_DYNAMIC_CLASS(wxWindow
,wxEvtHandler
)
891 BEGIN_EVENT_TABLE(wxWindow
, wxEvtHandler
)
892 EVT_SIZE(wxWindow::OnSize
)
893 EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged
)
894 EVT_INIT_DIALOG(wxWindow::OnInitDialog
)
895 EVT_IDLE(wxWindow::OnIdle
)
900 m_widget
= (GtkWidget
*) NULL
;
901 m_wxwindow
= (GtkWidget
*) NULL
;
902 m_parent
= (wxWindow
*) NULL
;
903 m_children
.DeleteContents( FALSE
);
916 m_eventHandler
= this;
917 m_windowValidator
= (wxValidator
*) NULL
;
921 m_cursor
= (wxCursor
*) NULL
;
922 m_font
= *wxSWISS_FONT
;
924 m_windowName
= "noname";
926 m_constraints
= (wxLayoutConstraints
*) NULL
;
927 m_constraintsInvolvedIn
= (wxList
*) NULL
;
928 m_windowSizer
= (wxSizer
*) NULL
;
929 m_sizerParent
= (wxWindow
*) NULL
;
930 m_autoLayout
= FALSE
;
936 m_hasScrolling
= FALSE
;
937 m_isScrolling
= FALSE
;
938 m_hAdjust
= (GtkAdjustment
*) NULL
;
939 m_vAdjust
= (GtkAdjustment
*) NULL
;
940 m_oldHorizontalPos
= 0.0;
941 m_oldVerticalPos
= 0.0;
946 m_dropTarget
= (wxDropTarget
*) NULL
;
948 m_scrollGC
= (GdkGC
*) NULL
;
949 m_widgetStyle
= (GtkStyle
*) NULL
;
951 m_insertCallback
= wxInsertChildInWindow
;
953 m_clientObject
= (wxClientData
*) NULL
;
957 wxWindow::wxWindow( wxWindow
*parent
, wxWindowID id
,
958 const wxPoint
&pos
, const wxSize
&size
,
959 long style
, const wxString
&name
)
961 m_insertCallback
= wxInsertChildInWindow
;
962 Create( parent
, id
, pos
, size
, style
, name
);
965 bool wxWindow::Create( wxWindow
*parent
, wxWindowID id
,
966 const wxPoint
&pos
, const wxSize
&size
,
967 long style
, const wxString
&name
)
973 PreCreation( parent
, id
, pos
, size
, style
, name
);
975 m_widget
= gtk_scrolled_window_new( (GtkAdjustment
*) NULL
, (GtkAdjustment
*) NULL
);
976 m_hasScrolling
= TRUE
;
978 GtkScrolledWindow
*s_window
= GTK_SCROLLED_WINDOW(m_widget
);
980 gtk_signal_connect( GTK_OBJECT(s_window
->vscrollbar
), "button_press_event",
981 (GtkSignalFunc
)gtk_scrollbar_button_press_callback
, (gpointer
) this );
983 gtk_signal_connect( GTK_OBJECT(s_window
->hscrollbar
), "button_press_event",
984 (GtkSignalFunc
)gtk_scrollbar_button_press_callback
, (gpointer
) this );
986 gtk_signal_connect( GTK_OBJECT(s_window
->vscrollbar
), "button_release_event",
987 (GtkSignalFunc
)gtk_scrollbar_button_release_callback
, (gpointer
) this );
989 gtk_signal_connect( GTK_OBJECT(s_window
->hscrollbar
), "button_release_event",
990 (GtkSignalFunc
)gtk_scrollbar_button_release_callback
, (gpointer
) this );
992 GtkScrolledWindowClass
*scroll_class
= GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget
)->klass
);
993 scroll_class
->scrollbar_spacing
= 0;
995 gtk_scrolled_window_set_policy( s_window
, GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
997 m_oldHorizontalPos
= 0.0;
998 m_oldVerticalPos
= 0.0;
1000 m_hAdjust
= gtk_range_get_adjustment( GTK_RANGE(s_window
->hscrollbar
) );
1001 m_vAdjust
= gtk_range_get_adjustment( GTK_RANGE(s_window
->vscrollbar
) );
1003 gtk_signal_connect( GTK_OBJECT(m_hAdjust
), "value_changed",
1004 (GtkSignalFunc
) gtk_window_hscroll_callback
, (gpointer
) this );
1005 gtk_signal_connect( GTK_OBJECT(m_vAdjust
), "value_changed",
1006 (GtkSignalFunc
) gtk_window_vscroll_callback
, (gpointer
) this );
1008 gtk_signal_connect( GTK_OBJECT(m_hAdjust
), "changed",
1009 (GtkSignalFunc
) gtk_window_hscroll_change_callback
, (gpointer
) this );
1010 gtk_signal_connect(GTK_OBJECT(m_vAdjust
), "changed",
1011 (GtkSignalFunc
) gtk_window_vscroll_change_callback
, (gpointer
) this );
1013 GtkViewport
*viewport
= GTK_VIEWPORT(s_window
->viewport
);
1015 if (m_windowStyle
& wxRAISED_BORDER
)
1017 gtk_viewport_set_shadow_type( viewport
, GTK_SHADOW_OUT
);
1019 else if (m_windowStyle
& wxSUNKEN_BORDER
)
1021 gtk_viewport_set_shadow_type( viewport
, GTK_SHADOW_IN
);
1025 gtk_viewport_set_shadow_type( viewport
, GTK_SHADOW_NONE
);
1028 m_wxwindow
= gtk_myfixed_new();
1030 GTK_WIDGET_UNSET_FLAGS( m_widget
, GTK_CAN_FOCUS
);
1032 if (m_windowStyle
& wxTAB_TRAVERSAL
== wxTAB_TRAVERSAL
)
1033 GTK_WIDGET_UNSET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
1035 GTK_WIDGET_SET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
1037 gtk_container_add( GTK_CONTAINER(m_widget
), m_wxwindow
);
1039 // shut the viewport up
1040 gtk_viewport_set_hadjustment( viewport
, (GtkAdjustment
*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) );
1041 gtk_viewport_set_vadjustment( viewport
, (GtkAdjustment
*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) );
1043 // I _really_ don't want scrollbars in the beginning
1044 m_vAdjust
->lower
= 0.0;
1045 m_vAdjust
->upper
= 1.0;
1046 m_vAdjust
->value
= 0.0;
1047 m_vAdjust
->step_increment
= 1.0;
1048 m_vAdjust
->page_increment
= 1.0;
1049 m_vAdjust
->page_size
= 5.0;
1050 gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust
), "changed" );
1051 m_hAdjust
->lower
= 0.0;
1052 m_hAdjust
->upper
= 1.0;
1053 m_hAdjust
->value
= 0.0;
1054 m_hAdjust
->step_increment
= 1.0;
1055 m_hAdjust
->page_increment
= 1.0;
1056 m_hAdjust
->page_size
= 5.0;
1057 gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust
), "changed" );
1059 gtk_widget_show( m_wxwindow
);
1061 if (m_parent
) m_parent
->AddChild( this );
1063 (m_parent
->m_insertCallback
)( m_parent
, this );
1072 wxWindow::~wxWindow()
1076 if (m_dropTarget
) delete m_dropTarget
;
1078 if (m_parent
) m_parent
->RemoveChild( this );
1079 if (m_widget
) Show( FALSE
);
1083 if (m_widgetStyle
) gtk_style_unref( m_widgetStyle
);
1085 if (m_scrollGC
) gdk_gc_unref( m_scrollGC
);
1087 if (m_wxwindow
) gtk_widget_destroy( m_wxwindow
);
1089 if (m_widget
) gtk_widget_destroy( m_widget
);
1093 DeleteRelatedConstraints();
1096 // This removes any dangling pointers to this window
1097 // in other windows' constraintsInvolvedIn lists.
1098 UnsetConstraints(m_constraints
);
1099 delete m_constraints
;
1100 m_constraints
= (wxLayoutConstraints
*) NULL
;
1104 delete m_windowSizer
;
1105 m_windowSizer
= (wxSizer
*) NULL
;
1107 // If this is a child of a sizer, remove self from parent
1108 if (m_sizerParent
) m_sizerParent
->RemoveChild((wxWindow
*)this);
1110 // Just in case the window has been Closed, but
1111 // we're then deleting immediately: don't leave
1112 // dangling pointers.
1113 wxPendingDelete
.DeleteObject(this);
1115 // Just in case we've loaded a top-level window via
1116 // wxWindow::LoadNativeDialog but we weren't a dialog
1118 wxTopLevelWindows
.DeleteObject(this);
1120 if (m_windowValidator
) delete m_windowValidator
;
1122 if (m_clientObject
) delete m_clientObject
;
1125 void wxWindow::PreCreation( wxWindow
*parent
, wxWindowID id
,
1126 const wxPoint
&pos
, const wxSize
&size
,
1127 long style
, const wxString
&name
)
1129 if (m_needParent
&& (parent
== NULL
))
1130 wxFatalError( "Need complete parent.", name
);
1132 m_widget
= (GtkWidget
*) NULL
;
1133 m_wxwindow
= (GtkWidget
*) NULL
;
1136 m_children
.DeleteContents( FALSE
);
1139 if (m_width
== -1) m_width
= 20;
1141 if (m_height
== -1) m_height
= 20;
1146 if (!m_needParent
) // some reasonable defaults
1150 m_x
= (gdk_screen_width () - m_width
) / 2;
1151 if (m_x
< 10) m_x
= 10;
1155 m_y
= (gdk_screen_height () - m_height
) / 2;
1156 if (m_y
< 10) m_y
= 10;
1167 m_eventHandler
= this;
1173 m_cursor
= new wxCursor( wxCURSOR_ARROW
);
1174 m_font
= *wxSWISS_FONT
;
1175 // m_backgroundColour = wxWHITE;
1176 // m_foregroundColour = wxBLACK;
1177 m_windowStyle
= style
;
1178 m_windowName
= name
;
1180 m_constraints
= (wxLayoutConstraints
*) NULL
;
1181 m_constraintsInvolvedIn
= (wxList
*) NULL
;
1182 m_windowSizer
= (wxSizer
*) NULL
;
1183 m_sizerParent
= (wxWindow
*) NULL
;
1184 m_autoLayout
= FALSE
;
1186 m_hasScrolling
= FALSE
;
1187 m_isScrolling
= FALSE
;
1188 m_hAdjust
= (GtkAdjustment
*) NULL
;
1189 m_vAdjust
= (GtkAdjustment
*) NULL
;
1190 m_oldHorizontalPos
= 0.0;
1191 m_oldVerticalPos
= 0.0;
1196 m_dropTarget
= (wxDropTarget
*) NULL
;
1198 m_windowValidator
= (wxValidator
*) NULL
;
1199 m_scrollGC
= (GdkGC
*) NULL
;
1200 m_widgetStyle
= (GtkStyle
*) NULL
;
1202 m_clientObject
= (wxClientData
*)NULL
;
1203 m_clientData
= NULL
;
1206 void wxWindow::PostCreation()
1210 gtk_signal_connect( GTK_OBJECT(m_wxwindow
), "expose_event",
1211 GTK_SIGNAL_FUNC(gtk_window_expose_callback
), (gpointer
)this );
1213 gtk_signal_connect( GTK_OBJECT(m_wxwindow
), "draw",
1214 GTK_SIGNAL_FUNC(gtk_window_draw_callback
), (gpointer
)this );
1217 ConnectWidget( GetConnectWidget() );
1219 if (m_widget
&& m_parent
) gtk_widget_realize( m_widget
);
1221 if (m_wxwindow
) gtk_widget_realize( m_wxwindow
);
1223 SetCursor( *wxSTANDARD_CURSOR
);
1228 void wxWindow::ConnectWidget( GtkWidget
*widget
)
1230 gtk_signal_connect( GTK_OBJECT(widget
), "key_press_event",
1231 GTK_SIGNAL_FUNC(gtk_window_key_press_callback
), (gpointer
)this );
1233 gtk_signal_connect( GTK_OBJECT(widget
), "button_press_event",
1234 GTK_SIGNAL_FUNC(gtk_window_button_press_callback
), (gpointer
)this );
1236 gtk_signal_connect( GTK_OBJECT(widget
), "button_release_event",
1237 GTK_SIGNAL_FUNC(gtk_window_button_release_callback
), (gpointer
)this );
1239 gtk_signal_connect( GTK_OBJECT(widget
), "motion_notify_event",
1240 GTK_SIGNAL_FUNC(gtk_window_motion_notify_callback
), (gpointer
)this );
1242 gtk_signal_connect( GTK_OBJECT(widget
), "focus_in_event",
1243 GTK_SIGNAL_FUNC(gtk_window_focus_in_callback
), (gpointer
)this );
1245 gtk_signal_connect( GTK_OBJECT(widget
), "focus_out_event",
1246 GTK_SIGNAL_FUNC(gtk_window_focus_out_callback
), (gpointer
)this );
1248 gtk_signal_connect( GTK_OBJECT(widget
), "enter_notify_event",
1249 GTK_SIGNAL_FUNC(gtk_window_enter_callback
), (gpointer
)this );
1251 gtk_signal_connect( GTK_OBJECT(widget
), "leave_notify_event",
1252 GTK_SIGNAL_FUNC(gtk_window_leave_callback
), (gpointer
)this );
1255 bool wxWindow::HasVMT()
1260 bool wxWindow::Close( bool force
)
1262 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1264 wxCloseEvent
event(wxEVT_CLOSE_WINDOW
, m_windowId
);
1265 event
.SetEventObject(this);
1266 event
.SetForce(force
);
1268 return GetEventHandler()->ProcessEvent(event
);
1271 bool wxWindow::Destroy()
1273 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1280 bool wxWindow::DestroyChildren()
1285 while ((node
= GetChildren()->First()) != (wxNode
*)NULL
)
1288 if ((child
= (wxWindow
*)node
->Data()) != (wxWindow
*)NULL
)
1291 if (GetChildren()->Member(child
)) delete node
;
1298 void wxWindow::PrepareDC( wxDC
&WXUNUSED(dc
) )
1300 // are we to set fonts here ?
1303 wxPoint
wxWindow::GetClientAreaOrigin() const
1305 return wxPoint(0,0);
1308 void wxWindow::AdjustForParentClientOrigin( int& x
, int& y
, int sizeFlags
)
1310 if (((sizeFlags
& wxSIZE_NO_ADJUSTMENTS
) == 0) && GetParent())
1312 wxPoint
pt(GetParent()->GetClientAreaOrigin());
1318 void wxWindow::ImplementSetSize()
1320 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
1321 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
1322 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_minWidth
;
1323 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_minHeight
;
1324 gtk_widget_set_usize( m_widget
, m_width
, m_height
);
1327 void wxWindow::ImplementSetPosition()
1331 wxFAIL_MSG( "wxWindow::SetSize error.\n" );
1335 if ((m_parent
) && (m_parent
->m_wxwindow
))
1336 gtk_myfixed_move( GTK_MYFIXED(m_parent
->m_wxwindow
), m_widget
, m_x
, m_y
);
1338 // Don't do anything for children of wxNotebook and wxMDIChildFrame
1341 void wxWindow::SetSize( int x
, int y
, int width
, int height
, int sizeFlags
)
1343 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1345 if (m_resizing
) return; // I don't like recursions
1353 if ((sizeFlags
& wxSIZE_USE_EXISTING
) == wxSIZE_USE_EXISTING
)
1355 if (newX
== -1) newX
= m_x
;
1356 if (newY
== -1) newY
= m_y
;
1357 if (newW
== -1) newW
= m_width
;
1358 if (newH
== -1) newH
= m_height
;
1361 if ((sizeFlags
& wxSIZE_AUTO_WIDTH
) == wxSIZE_AUTO_WIDTH
)
1363 if (newW
== -1) newW
= 80;
1366 if ((sizeFlags
& wxSIZE_AUTO_HEIGHT
) == wxSIZE_AUTO_HEIGHT
)
1368 if (newH
== -1) newH
= 26;
1371 AdjustForParentClientOrigin( newX
, newY
, sizeFlags
);
1373 if ((m_x
!= newX
) || (m_y
!= newY
) || (!m_sizeSet
))
1377 ImplementSetPosition();
1380 if ((m_width
!= newW
) || (m_height
!= newH
) || (!m_sizeSet
))
1388 wxSizeEvent
event( wxSize(m_width
,m_height
), GetId() );
1389 event
.SetEventObject( this );
1390 ProcessEvent( event
);
1395 void wxWindow::SetSize( int width
, int height
)
1397 SetSize( -1, -1, width
, height
, wxSIZE_USE_EXISTING
);
1400 void wxWindow::Move( int x
, int y
)
1402 SetSize( x
, y
, -1, -1, wxSIZE_USE_EXISTING
);
1405 void wxWindow::GetSize( int *width
, int *height
) const
1407 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1409 if (width
) (*width
) = m_width
;
1410 if (height
) (*height
) = m_height
;
1413 void wxWindow::SetClientSize( int width
, int height
)
1415 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1419 SetSize( width
, height
);
1426 if (!m_hasScrolling
)
1429 do we have sunken dialogs ?
1431 GtkStyleClass *window_class = m_wxwindow->style->klass;
1433 dw += 2 * window_class->xthickness;
1434 dh += 2 * window_class->ythickness;
1439 GtkScrolledWindow
*scroll_window
= GTK_SCROLLED_WINDOW(m_widget
);
1440 GtkScrolledWindowClass
*scroll_class
= GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget
)->klass
);
1442 GtkWidget
*viewport
= scroll_window
->viewport
;
1443 GtkStyleClass
*viewport_class
= viewport
->style
->klass
;
1445 GtkWidget
*hscrollbar
= scroll_window
->hscrollbar
;
1446 GtkWidget
*vscrollbar
= scroll_window
->vscrollbar
;
1448 if ((m_windowStyle
& wxRAISED_BORDER
) ||
1449 (m_windowStyle
& wxSUNKEN_BORDER
))
1451 dw
+= 2 * viewport_class
->xthickness
;
1452 dh
+= 2 * viewport_class
->ythickness
;
1455 if (GTK_WIDGET_VISIBLE(vscrollbar
))
1457 dw
+= vscrollbar
->allocation
.width
;
1458 dw
+= scroll_class
->scrollbar_spacing
;
1461 if (GTK_WIDGET_VISIBLE(hscrollbar
))
1463 dh
+= hscrollbar
->allocation
.height
;
1464 dw
+= scroll_class
->scrollbar_spacing
;
1468 SetSize( width
+dw
, height
+dh
);
1472 void wxWindow::GetClientSize( int *width
, int *height
) const
1474 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1478 if (width
) (*width
) = m_width
;
1479 if (height
) (*height
) = m_height
;
1486 if (!m_hasScrolling
)
1489 do we have sunken dialogs ?
1491 GtkStyleClass *window_class = m_wxwindow->style->klass;
1493 dw += 2 * window_class->xthickness;
1494 dh += 2 * window_class->ythickness;
1499 GtkScrolledWindow
*scroll_window
= GTK_SCROLLED_WINDOW(m_widget
);
1500 GtkScrolledWindowClass
*scroll_class
= GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget
)->klass
);
1502 GtkWidget
*viewport
= scroll_window
->viewport
;
1503 GtkStyleClass
*viewport_class
= viewport
->style
->klass
;
1505 GtkWidget
*hscrollbar
= scroll_window
->hscrollbar
;
1506 GtkWidget
*vscrollbar
= scroll_window
->vscrollbar
;
1508 if ((m_windowStyle
& wxRAISED_BORDER
) ||
1509 (m_windowStyle
& wxSUNKEN_BORDER
))
1511 dw
+= 2 * viewport_class
->xthickness
;
1512 dh
+= 2 * viewport_class
->ythickness
;
1515 if (GTK_WIDGET_VISIBLE(vscrollbar
))
1517 // dw += vscrollbar->allocation.width;
1518 dw
+= 15; // range.slider_width = 11 + 2*2pts edge
1519 dw
+= scroll_class
->scrollbar_spacing
;
1522 if (GTK_WIDGET_VISIBLE(hscrollbar
))
1524 // dh += hscrollbar->allocation.height;
1526 dh
+= scroll_class
->scrollbar_spacing
;
1530 if (width
) (*width
) = m_width
- dw
;
1531 if (height
) (*height
) = m_height
- dh
;
1535 void wxWindow::GetPosition( int *x
, int *y
) const
1537 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1544 wxPoint
pt(GetParent()->GetClientAreaOrigin());
1553 void wxWindow::ClientToScreen( int *x
, int *y
)
1555 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1557 GdkWindow
*source
= (GdkWindow
*) NULL
;
1559 source
= m_wxwindow
->window
;
1561 source
= m_widget
->window
;
1565 gdk_window_get_origin( source
, &org_x
, &org_y
);
1569 if (GTK_WIDGET_NO_WINDOW (m_widget
))
1571 org_x
+= m_widget
->allocation
.x
;
1572 org_y
+= m_widget
->allocation
.y
;
1576 wxPoint
pt(GetClientAreaOrigin());
1584 void wxWindow::ScreenToClient( int *x
, int *y
)
1586 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1588 GdkWindow
*source
= (GdkWindow
*) NULL
;
1590 source
= m_wxwindow
->window
;
1592 source
= m_widget
->window
;
1596 gdk_window_get_origin( source
, &org_x
, &org_y
);
1600 if (GTK_WIDGET_NO_WINDOW (m_widget
))
1602 org_x
+= m_widget
->allocation
.x
;
1603 org_y
+= m_widget
->allocation
.y
;
1607 wxPoint
pt(GetClientAreaOrigin());
1615 void wxWindow::Centre( int direction
)
1617 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1619 if (IS_KIND_OF(this,wxDialog
) || IS_KIND_OF(this,wxFrame
))
1621 if (direction
& wxHORIZONTAL
== wxHORIZONTAL
) m_x
= (gdk_screen_width () - m_width
) / 2;
1622 if (direction
& wxVERTICAL
== wxVERTICAL
) m_y
= (gdk_screen_height () - m_height
) / 2;
1623 ImplementSetPosition();
1631 m_parent
->GetSize( &p_w
, &p_h
);
1632 if (direction
& wxHORIZONTAL
== wxHORIZONTAL
) m_x
= (p_w
- m_width
) / 2;
1633 if (direction
& wxVERTICAL
== wxVERTICAL
) m_y
= (p_h
- m_height
) / 2;
1634 ImplementSetPosition();
1639 void wxWindow::Fit()
1641 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1645 wxNode
*node
= GetChildren()->First();
1648 wxWindow
*win
= (wxWindow
*)node
->Data();
1650 win
->GetPosition(&wx
, &wy
);
1651 win
->GetSize(&ww
, &wh
);
1652 if ( wx
+ ww
> maxX
)
1654 if ( wy
+ wh
> maxY
)
1657 node
= node
->Next();
1659 SetClientSize(maxX
+ 5, maxY
+ 10);
1662 void wxWindow::SetSizeHints( int minW
, int minH
, int maxW
, int maxH
, int WXUNUSED(incW
), int WXUNUSED(incH
) )
1664 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1672 void wxWindow::OnSize( wxSizeEvent
&WXUNUSED(event
) )
1674 //if (GetAutoLayout()) Layout();
1677 bool wxWindow::Show( bool show
)
1679 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1682 gtk_widget_show( m_widget
);
1684 gtk_widget_hide( m_widget
);
1689 void wxWindow::Enable( bool enable
)
1691 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1693 m_isEnabled
= enable
;
1694 gtk_widget_set_sensitive( m_widget
, enable
);
1695 if (m_wxwindow
) gtk_widget_set_sensitive( m_wxwindow
, enable
);
1698 int wxWindow::GetCharHeight() const
1700 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1704 wxFAIL_MSG( "invalid font" );
1708 GdkFont
*font
= m_font
.GetInternalFont( 1.0 );
1709 return font
->ascent
+ font
->descent
;
1712 int wxWindow::GetCharWidth() const
1714 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1718 wxFAIL_MSG( "invalid font" );
1722 GdkFont
*font
= m_font
.GetInternalFont( 1.0 );
1723 return gdk_string_width( font
, "H" );
1726 void wxWindow::GetTextExtent( const wxString
& string
, int *x
, int *y
,
1727 int *descent
, int *externalLeading
, const wxFont
*theFont
, bool WXUNUSED(use16
) ) const
1729 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1731 wxFont fontToUse
= m_font
;
1732 if (theFont
) fontToUse
= *theFont
;
1734 if (!fontToUse
.Ok())
1736 wxFAIL_MSG( "invalid font" );
1739 wxASSERT_MSG( (m_font
.Ok()), "invalid font" );
1741 GdkFont
*font
= fontToUse
.GetInternalFont( 1.0 );
1742 if (x
) (*x
) = gdk_string_width( font
, string
);
1743 if (y
) (*y
) = font
->ascent
+ font
->descent
;
1744 if (descent
) (*descent
) = font
->descent
;
1745 if (externalLeading
) (*externalLeading
) = 0; // ??
1748 void wxWindow::MakeModal( bool modal
)
1751 // Disable all other windows
1752 if (this->IsKindOf(CLASSINFO(wxDialog
)) || this->IsKindOf(CLASSINFO(wxFrame
)))
1754 wxNode
*node
= wxTopLevelWindows
.First();
1757 wxWindow
*win
= (wxWindow
*)node
->Data();
1759 win
->Enable(!modal
);
1761 node
= node
->Next();
1766 void wxWindow::SetFocus()
1768 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1770 GtkWidget
*connect_widget
= GetConnectWidget();
1773 if (GTK_WIDGET_CAN_FOCUS(connect_widget
) && !GTK_WIDGET_HAS_FOCUS (connect_widget
) )
1775 gtk_widget_grab_focus (connect_widget
);
1780 bool wxWindow::OnClose()
1785 void wxWindow::AddChild( wxWindow
*child
)
1787 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1788 wxASSERT_MSG( (child
!= NULL
), "invalid child" );
1790 m_children
.Append( child
);
1793 wxList
*wxWindow::GetChildren()
1795 return (&m_children
);
1798 void wxWindow::RemoveChild( wxWindow
*child
)
1800 if (GetChildren()) GetChildren()->DeleteObject( child
);
1801 child
->m_parent
= (wxWindow
*) NULL
;
1804 void wxWindow::SetReturnCode( int retCode
)
1806 m_retCode
= retCode
;
1809 int wxWindow::GetReturnCode()
1814 void wxWindow::Raise()
1816 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1818 if (m_widget
) gdk_window_raise( m_widget
->window
);
1821 void wxWindow::Lower()
1823 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1825 if (m_widget
) gdk_window_lower( m_widget
->window
);
1828 wxEvtHandler
*wxWindow::GetEventHandler()
1830 return m_eventHandler
;
1833 void wxWindow::SetEventHandler( wxEvtHandler
*handler
)
1835 m_eventHandler
= handler
;
1838 void wxWindow::PushEventHandler(wxEvtHandler
*handler
)
1840 handler
->SetNextHandler(GetEventHandler());
1841 SetEventHandler(handler
);
1844 wxEvtHandler
*wxWindow::PopEventHandler(bool deleteHandler
)
1846 if (GetEventHandler())
1848 wxEvtHandler
*handlerA
= GetEventHandler();
1849 wxEvtHandler
*handlerB
= handlerA
->GetNextHandler();
1850 handlerA
->SetNextHandler((wxEvtHandler
*) NULL
);
1851 SetEventHandler(handlerB
);
1855 return (wxEvtHandler
*) NULL
;
1861 return (wxEvtHandler
*) NULL
;
1864 wxValidator
*wxWindow::GetValidator()
1866 return m_windowValidator
;
1869 void wxWindow::SetValidator( const wxValidator
& validator
)
1871 if (m_windowValidator
) delete m_windowValidator
;
1872 m_windowValidator
= validator
.Clone();
1873 if (m_windowValidator
) m_windowValidator
->SetWindow(this);
1876 void wxWindow::SetClientObject( wxClientData
*data
)
1878 if (m_clientObject
) delete m_clientObject
;
1879 m_clientObject
= data
;
1882 wxClientData
*wxWindow::GetClientObject()
1884 return m_clientObject
;
1887 void wxWindow::SetClientData( void *data
)
1889 m_clientData
= data
;
1892 void *wxWindow::GetClientData()
1894 return m_clientData
;
1897 bool wxWindow::IsBeingDeleted()
1902 void wxWindow::SetId( wxWindowID id
)
1907 wxWindowID
wxWindow::GetId()
1912 void wxWindow::SetCursor( const wxCursor
&cursor
)
1914 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1916 if (m_cursor
== NULL
)
1918 wxFAIL_MSG( "wxWindow::SetCursor m_cursor == NULL" );
1919 m_cursor
= new wxCursor( wxCURSOR_ARROW
);
1924 if (*((wxCursor
*)&cursor
) == m_cursor
) return;
1929 *m_cursor
= *wxSTANDARD_CURSOR
;
1932 if ((m_widget
) && (m_widget
->window
))
1933 gdk_window_set_cursor( m_widget
->window
, m_cursor
->GetCursor() );
1935 if ((m_wxwindow
) && (m_wxwindow
->window
))
1936 gdk_window_set_cursor( m_wxwindow
->window
, m_cursor
->GetCursor() );
1939 void wxWindow::Refresh( bool eraseBackground
, const wxRect
*rect
)
1941 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1943 if (eraseBackground
&& m_wxwindow
&& m_wxwindow
->window
)
1946 gdk_window_clear_area( m_wxwindow
->window
,
1960 GetClientSize( &w
, &h
);
1962 GdkRectangle gdk_rect
;
1966 gdk_rect
.height
= h
;
1967 gtk_widget_draw( m_wxwindow
, &gdk_rect
);
1972 GdkRectangle gdk_rect
;
1973 gdk_rect
.x
= rect
->x
;
1974 gdk_rect
.y
= rect
->y
;
1975 gdk_rect
.width
= rect
->width
;
1976 gdk_rect
.height
= rect
->height
;
1979 gtk_widget_draw( m_wxwindow
, &gdk_rect
);
1981 gtk_widget_draw( m_widget
, &gdk_rect
);
1985 wxRegion
wxWindow::GetUpdateRegion() const
1987 return m_updateRegion
;
1990 bool wxWindow::IsExposed( int x
, int y
) const
1992 return (m_updateRegion
.Contains( x
, y
) != wxOutRegion
);
1995 bool wxWindow::IsExposed( int x
, int y
, int w
, int h
) const
1997 return (m_updateRegion
.Contains( x
, y
, w
, h
) != wxOutRegion
);
2000 bool wxWindow::IsExposed( const wxPoint
& pt
) const
2002 return (m_updateRegion
.Contains( pt
.x
, pt
.y
) != wxOutRegion
);
2005 bool wxWindow::IsExposed( const wxRect
& rect
) const
2007 return (m_updateRegion
.Contains( rect
.x
, rect
.y
, rect
.width
, rect
.height
) != wxOutRegion
);
2010 void wxWindow::Clear()
2012 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2014 if (m_wxwindow
&& m_wxwindow
->window
) gdk_window_clear( m_wxwindow
->window
);
2017 wxColour
wxWindow::GetBackgroundColour() const
2019 return m_backgroundColour
;
2022 void wxWindow::SetBackgroundColour( const wxColour
&colour
)
2024 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2026 m_backgroundColour
= colour
;
2027 if (!m_backgroundColour
.Ok()) return;
2031 GdkWindow
*window
= m_wxwindow
->window
;
2032 m_backgroundColour
.CalcPixel( gdk_window_get_colormap( window
) );
2033 gdk_window_set_background( window
, m_backgroundColour
.GetColor() );
2034 gdk_window_clear( window
);
2040 wxColour
wxWindow::GetForegroundColour() const
2042 return m_foregroundColour
;
2045 void wxWindow::SetForegroundColour( const wxColour
&colour
)
2047 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2049 m_foregroundColour
= colour
;
2050 if (!m_foregroundColour
.Ok()) return;
2055 GtkStyle
*wxWindow::GetWidgetStyle()
2057 if (m_widgetStyle
) gtk_style_unref( m_widgetStyle
);
2061 gtk_widget_get_style( m_widget
) );
2063 return m_widgetStyle
;
2066 void wxWindow::SetWidgetStyle()
2068 GtkStyle
*style
= GetWidgetStyle();
2070 gdk_font_unref( style
->font
);
2071 style
->font
= gdk_font_ref( m_font
.GetInternalFont( 1.0 ) );
2073 if (m_foregroundColour
.Ok())
2075 m_foregroundColour
.CalcPixel( gdk_window_get_colormap( m_widget
->window
) );
2076 style
->fg
[GTK_STATE_NORMAL
] = *m_foregroundColour
.GetColor();
2077 style
->fg
[GTK_STATE_PRELIGHT
] = *m_foregroundColour
.GetColor();
2078 style
->fg
[GTK_STATE_ACTIVE
] = *m_foregroundColour
.GetColor();
2081 if (m_backgroundColour
.Ok())
2083 m_backgroundColour
.CalcPixel( gdk_window_get_colormap( m_widget
->window
) );
2084 style
->bg
[GTK_STATE_NORMAL
] = *m_backgroundColour
.GetColor();
2085 style
->base
[GTK_STATE_NORMAL
] = *m_backgroundColour
.GetColor();
2086 style
->bg
[GTK_STATE_PRELIGHT
] = *m_backgroundColour
.GetColor();
2087 style
->base
[GTK_STATE_PRELIGHT
] = *m_backgroundColour
.GetColor();
2088 style
->bg
[GTK_STATE_ACTIVE
] = *m_backgroundColour
.GetColor();
2089 style
->base
[GTK_STATE_ACTIVE
] = *m_backgroundColour
.GetColor();
2090 style
->bg
[GTK_STATE_INSENSITIVE
] = *m_backgroundColour
.GetColor();
2091 style
->base
[GTK_STATE_INSENSITIVE
] = *m_backgroundColour
.GetColor();
2095 void wxWindow::ApplyWidgetStyle()
2099 bool wxWindow::Validate()
2101 wxCHECK_MSG( m_widget
!= NULL
, FALSE
, "invalid window" );
2103 wxNode
*node
= GetChildren()->First();
2106 wxWindow
*child
= (wxWindow
*)node
->Data();
2107 if (child
->GetValidator() && /* child->GetValidator()->Ok() && */ !child
->GetValidator()->Validate(this))
2109 node
= node
->Next();
2114 bool wxWindow::TransferDataToWindow()
2116 wxCHECK_MSG( m_widget
!= NULL
, FALSE
, "invalid window" );
2118 wxNode
*node
= GetChildren()->First();
2121 wxWindow
*child
= (wxWindow
*)node
->Data();
2122 if (child
->GetValidator() && /* child->GetValidator()->Ok() && */
2123 !child
->GetValidator()->TransferToWindow() )
2125 wxMessageBox( _("Application Error"), _("Could not transfer data to window"), wxOK
|wxICON_EXCLAMATION
);
2128 node
= node
->Next();
2133 bool wxWindow::TransferDataFromWindow()
2135 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2137 wxNode
*node
= GetChildren()->First();
2140 wxWindow
*child
= (wxWindow
*)node
->Data();
2141 if ( child
->GetValidator() && /* child->GetValidator()->Ok() && */ !child
->GetValidator()->TransferFromWindow() )
2143 node
= node
->Next();
2148 void wxWindow::SetAcceleratorTable( const wxAcceleratorTable
& accel
)
2150 m_acceleratorTable
= accel
;
2153 void wxWindow::OnInitDialog( wxInitDialogEvent
&WXUNUSED(event
) )
2155 TransferDataToWindow();
2158 void wxWindow::InitDialog()
2160 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2162 wxInitDialogEvent
event(GetId());
2163 event
.SetEventObject( this );
2164 GetEventHandler()->ProcessEvent(event
);
2167 static void SetInvokingWindow( wxMenu
*menu
, wxWindow
*win
)
2169 menu
->SetInvokingWindow( win
);
2170 wxNode
*node
= menu
->m_items
.First();
2173 wxMenuItem
*menuitem
= (wxMenuItem
*)node
->Data();
2174 if (menuitem
->IsSubMenu())
2175 SetInvokingWindow( menuitem
->GetSubMenu(), win
);
2176 node
= node
->Next();
2180 bool wxWindow::PopupMenu( wxMenu
*menu
, int WXUNUSED(x
), int WXUNUSED(y
) )
2182 wxCHECK_MSG( m_widget
!= NULL
, FALSE
, "invalid window" );
2184 wxCHECK_MSG( menu
!= NULL
, FALSE
, "invalid popup-menu" );
2186 SetInvokingWindow( menu
, this );
2188 GTK_MENU(menu
->m_menu
),
2189 (GtkWidget
*)NULL
, // parent menu shell
2190 (GtkWidget
*)NULL
, // parent menu item
2191 (GtkMenuPositionFunc
)NULL
,
2192 NULL
, // client data
2193 0, // button used to activate it
2194 0//gs_timeLastClick // the time of activation
2199 void wxWindow::SetDropTarget( wxDropTarget
*dropTarget
)
2201 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2203 GtkWidget
*dnd_widget
= GetConnectWidget();
2205 DisconnectDnDWidget( dnd_widget
);
2207 if (m_dropTarget
) delete m_dropTarget
;
2208 m_dropTarget
= dropTarget
;
2210 ConnectDnDWidget( dnd_widget
);
2213 wxDropTarget
*wxWindow::GetDropTarget() const
2215 return m_dropTarget
;
2218 void wxWindow::ConnectDnDWidget( GtkWidget
*widget
)
2220 if (!m_dropTarget
) return;
2222 m_dropTarget
->RegisterWidget( widget
);
2224 gtk_signal_connect( GTK_OBJECT(widget
), "drop_data_available_event",
2225 GTK_SIGNAL_FUNC(gtk_window_drop_callback
), (gpointer
)this );
2228 void wxWindow::DisconnectDnDWidget( GtkWidget
*widget
)
2230 if (!m_dropTarget
) return;
2232 gtk_signal_disconnect_by_func( GTK_OBJECT(widget
),
2233 GTK_SIGNAL_FUNC(gtk_window_drop_callback
), (gpointer
)this );
2235 m_dropTarget
->UnregisterWidget( widget
);
2238 GtkWidget
* wxWindow::GetConnectWidget()
2240 GtkWidget
*connect_widget
= m_widget
;
2241 if (m_wxwindow
) connect_widget
= m_wxwindow
;
2243 return connect_widget
;
2246 bool wxWindow::IsOwnGtkWindow( GdkWindow
*window
)
2248 if (m_wxwindow
) return (window
== m_wxwindow
->window
);
2249 return (window
== m_widget
->window
);
2252 void wxWindow::SetFont( const wxFont
&font
)
2254 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2256 if (((wxFont
*)&font
)->Ok())
2259 m_font
= *wxSWISS_FONT
;
2264 wxFont
*wxWindow::GetFont()
2269 void wxWindow::SetWindowStyleFlag( long flag
)
2271 m_windowStyle
= flag
;
2274 long wxWindow::GetWindowStyleFlag() const
2276 return m_windowStyle
;
2279 void wxWindow::CaptureMouse()
2281 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2283 wxCHECK_RET( g_capturing
== FALSE
, "CaptureMouse called twice" );
2285 GtkWidget
*connect_widget
= GetConnectWidget();
2286 gtk_grab_add( connect_widget
);
2287 gdk_pointer_grab ( connect_widget
->window
, FALSE
,
2289 (GDK_BUTTON_PRESS_MASK
|
2290 GDK_BUTTON_RELEASE_MASK
|
2291 GDK_POINTER_MOTION_MASK
),
2292 (GdkWindow
*) NULL
, (GdkCursor
*) NULL
, GDK_CURRENT_TIME
);
2296 void wxWindow::ReleaseMouse()
2298 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2300 wxCHECK_RET( g_capturing
== TRUE
, "ReleaseMouse called twice" );
2302 GtkWidget
*connect_widget
= GetConnectWidget();
2303 gtk_grab_remove( connect_widget
);
2304 gdk_pointer_ungrab ( GDK_CURRENT_TIME
);
2305 g_capturing
= FALSE
;
2308 void wxWindow::SetTitle( const wxString
&WXUNUSED(title
) )
2312 wxString
wxWindow::GetTitle() const
2314 return (wxString
&)m_windowName
;
2317 wxString
wxWindow::GetLabel() const
2322 void wxWindow::SetName( const wxString
&name
)
2324 m_windowName
= name
;
2327 wxString
wxWindow::GetName() const
2329 return (wxString
&)m_windowName
;
2332 bool wxWindow::IsShown() const
2337 bool wxWindow::IsRetained()
2342 wxWindow
*wxWindow::FindWindow( long id
)
2344 if (id
== m_windowId
) return this;
2345 wxNode
*node
= m_children
.First();
2348 wxWindow
*child
= (wxWindow
*)node
->Data();
2349 wxWindow
*res
= child
->FindWindow( id
);
2350 if (res
) return res
;
2351 node
= node
->Next();
2353 return (wxWindow
*) NULL
;
2356 wxWindow
*wxWindow::FindWindow( const wxString
& name
)
2358 if (name
== m_windowName
) return this;
2359 wxNode
*node
= m_children
.First();
2362 wxWindow
*child
= (wxWindow
*)node
->Data();
2363 wxWindow
*res
= child
->FindWindow( name
);
2364 if (res
) return res
;
2365 node
= node
->Next();
2367 return (wxWindow
*) NULL
;
2370 void wxWindow::SetScrollbar( int orient
, int pos
, int thumbVisible
,
2371 int range
, bool refresh
)
2373 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2375 wxASSERT_MSG( (m_wxwindow
!= NULL
), "window needs client area" );
2377 if (!m_wxwindow
) return;
2379 if (orient
== wxHORIZONTAL
)
2381 float fpos
= (float)pos
;
2382 float frange
= (float)range
;
2383 float fthumb
= (float)thumbVisible
;
2385 if ((fabs(frange
-m_hAdjust
->upper
) < 0.2) &&
2386 (fabs(fthumb
-m_hAdjust
->page_size
) < 0.2))
2388 SetScrollPos( orient
, pos
, refresh
);
2392 m_oldHorizontalPos
= fpos
;
2394 m_hAdjust
->lower
= 0.0;
2395 m_hAdjust
->upper
= frange
;
2396 m_hAdjust
->value
= fpos
;
2397 m_hAdjust
->step_increment
= 1.0;
2398 m_hAdjust
->page_increment
= (float)(wxMax(fthumb
,0));
2399 m_hAdjust
->page_size
= fthumb
;
2403 float fpos
= (float)pos
;
2404 float frange
= (float)range
;
2405 float fthumb
= (float)thumbVisible
;
2407 if ((fabs(frange
-m_vAdjust
->upper
) < 0.2) &&
2408 (fabs(fthumb
-m_vAdjust
->page_size
) < 0.2))
2410 SetScrollPos( orient
, pos
, refresh
);
2414 m_oldVerticalPos
= fpos
;
2416 m_vAdjust
->lower
= 0.0;
2417 m_vAdjust
->upper
= frange
;
2418 m_vAdjust
->value
= fpos
;
2419 m_vAdjust
->step_increment
= 1.0;
2420 m_vAdjust
->page_increment
= (float)(wxMax(fthumb
,0));
2421 m_vAdjust
->page_size
= fthumb
;
2424 if (m_wxwindow
->window
)
2426 if (orient
== wxHORIZONTAL
)
2427 gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust
), "changed" );
2429 gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust
), "changed" );
2431 gtk_widget_set_usize( m_widget
, m_width
, m_height
);
2435 void wxWindow::SetScrollPos( int orient
, int pos
, bool WXUNUSED(refresh
) )
2437 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2439 wxASSERT_MSG( (m_wxwindow
!= NULL
), "window needs client area" );
2441 if (!m_wxwindow
) return;
2443 if (orient
== wxHORIZONTAL
)
2445 float fpos
= (float)pos
;
2446 m_oldHorizontalPos
= fpos
;
2448 if (fabs(fpos
-m_hAdjust
->value
) < 0.2) return;
2449 m_hAdjust
->value
= fpos
;
2453 float fpos
= (float)pos
;
2454 m_oldVerticalPos
= fpos
;
2455 if (fabs(fpos
-m_vAdjust
->value
) < 0.2) return;
2456 m_vAdjust
->value
= fpos
;
2461 if (m_wxwindow
->window
)
2463 if (orient
== wxHORIZONTAL
)
2464 gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust
), "value_changed" );
2466 gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust
), "value_changed" );
2471 int wxWindow::GetScrollThumb( int orient
) const
2473 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2475 wxASSERT_MSG( (m_wxwindow
!= NULL
), "window needs client area" );
2477 if (!m_wxwindow
) return 0;
2479 if (orient
== wxHORIZONTAL
)
2480 return (int)(m_hAdjust
->page_size
+0.5);
2482 return (int)(m_vAdjust
->page_size
+0.5);
2485 int wxWindow::GetScrollPos( int orient
) const
2487 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2489 wxASSERT_MSG( (m_wxwindow
!= NULL
), "window needs client area" );
2491 if (!m_wxwindow
) return 0;
2493 if (orient
== wxHORIZONTAL
)
2494 return (int)(m_hAdjust
->value
+0.5);
2496 return (int)(m_vAdjust
->value
+0.5);
2499 int wxWindow::GetScrollRange( int orient
) const
2501 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2503 wxASSERT_MSG( (m_wxwindow
!= NULL
), "window needs client area" );
2505 if (!m_wxwindow
) return 0;
2507 if (orient
== wxHORIZONTAL
)
2508 return (int)(m_hAdjust
->upper
+0.5);
2510 return (int)(m_vAdjust
->upper
+0.5);
2513 void wxWindow::ScrollWindow( int dx
, int dy
, const wxRect
* WXUNUSED(rect
) )
2515 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2517 wxASSERT_MSG( (m_wxwindow
!= NULL
), "window needs client area" );
2519 if (!m_wxwindow
) return;
2523 GetClientSize( &cw
, &ch
);
2525 int w
= cw
- abs(dx
);
2526 int h
= ch
- abs(dy
);
2527 if ((h
< 0) || (w
< 0))
2534 if (dx
< 0) s_x
= -dx
;
2535 if (dy
< 0) s_y
= -dy
;
2538 if (dx
> 0) d_x
= dx
;
2539 if (dy
> 0) d_y
= dy
;
2543 m_scrollGC
= gdk_gc_new( m_wxwindow
->window
);
2544 gdk_gc_set_exposures( m_scrollGC
, TRUE
);
2547 gdk_window_copy_area( m_wxwindow
->window
, m_scrollGC
, d_x
, d_y
,
2548 m_wxwindow
->window
, s_x
, s_y
, w
, h
);
2551 if (dx
< 0) rect
.x
= cw
+dx
; else rect
.x
= 0;
2552 if (dy
< 0) rect
.y
= ch
+dy
; else rect
.y
= 0;
2553 if (dy
!= 0) rect
.width
= cw
; else rect
.width
= abs(dx
);
2554 if (dx
!= 0) rect
.height
= ch
; else rect
.height
= abs(dy
);
2556 Refresh( TRUE
, &rect
);
2559 //-------------------------------------------------------------------------------------
2561 //-------------------------------------------------------------------------------------
2563 wxLayoutConstraints
*wxWindow::GetConstraints() const
2565 return m_constraints
;
2568 void wxWindow::SetConstraints( wxLayoutConstraints
*constraints
)
2572 UnsetConstraints(m_constraints
);
2573 delete m_constraints
;
2575 m_constraints
= constraints
;
2578 // Make sure other windows know they're part of a 'meaningful relationship'
2579 if (m_constraints
->left
.GetOtherWindow() && (m_constraints
->left
.GetOtherWindow() != this))
2580 m_constraints
->left
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2581 if (m_constraints
->top
.GetOtherWindow() && (m_constraints
->top
.GetOtherWindow() != this))
2582 m_constraints
->top
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2583 if (m_constraints
->right
.GetOtherWindow() && (m_constraints
->right
.GetOtherWindow() != this))
2584 m_constraints
->right
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2585 if (m_constraints
->bottom
.GetOtherWindow() && (m_constraints
->bottom
.GetOtherWindow() != this))
2586 m_constraints
->bottom
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2587 if (m_constraints
->width
.GetOtherWindow() && (m_constraints
->width
.GetOtherWindow() != this))
2588 m_constraints
->width
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2589 if (m_constraints
->height
.GetOtherWindow() && (m_constraints
->height
.GetOtherWindow() != this))
2590 m_constraints
->height
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2591 if (m_constraints
->centreX
.GetOtherWindow() && (m_constraints
->centreX
.GetOtherWindow() != this))
2592 m_constraints
->centreX
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2593 if (m_constraints
->centreY
.GetOtherWindow() && (m_constraints
->centreY
.GetOtherWindow() != this))
2594 m_constraints
->centreY
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2600 void wxWindow::SetAutoLayout( bool autoLayout
)
2602 m_autoLayout
= autoLayout
;
2605 bool wxWindow::GetAutoLayout() const
2607 return m_autoLayout
;
2610 wxSizer
*wxWindow::GetSizer() const
2612 return m_windowSizer
;
2615 void wxWindow::SetSizerParent( wxWindow
*win
)
2617 m_sizerParent
= win
;
2620 wxWindow
*wxWindow::GetSizerParent() const
2622 return m_sizerParent
;
2625 // This removes any dangling pointers to this window
2626 // in other windows' constraintsInvolvedIn lists.
2627 void wxWindow::UnsetConstraints(wxLayoutConstraints
*c
)
2631 if (c
->left
.GetOtherWindow() && (c
->top
.GetOtherWindow() != this))
2632 c
->left
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2633 if (c
->top
.GetOtherWindow() && (c
->top
.GetOtherWindow() != this))
2634 c
->top
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2635 if (c
->right
.GetOtherWindow() && (c
->right
.GetOtherWindow() != this))
2636 c
->right
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2637 if (c
->bottom
.GetOtherWindow() && (c
->bottom
.GetOtherWindow() != this))
2638 c
->bottom
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2639 if (c
->width
.GetOtherWindow() && (c
->width
.GetOtherWindow() != this))
2640 c
->width
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2641 if (c
->height
.GetOtherWindow() && (c
->height
.GetOtherWindow() != this))
2642 c
->height
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2643 if (c
->centreX
.GetOtherWindow() && (c
->centreX
.GetOtherWindow() != this))
2644 c
->centreX
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2645 if (c
->centreY
.GetOtherWindow() && (c
->centreY
.GetOtherWindow() != this))
2646 c
->centreY
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2650 // Back-pointer to other windows we're involved with, so if we delete
2651 // this window, we must delete any constraints we're involved with.
2652 void wxWindow::AddConstraintReference(wxWindow
*otherWin
)
2654 if (!m_constraintsInvolvedIn
)
2655 m_constraintsInvolvedIn
= new wxList
;
2656 if (!m_constraintsInvolvedIn
->Member(otherWin
))
2657 m_constraintsInvolvedIn
->Append(otherWin
);
2660 // REMOVE back-pointer to other windows we're involved with.
2661 void wxWindow::RemoveConstraintReference(wxWindow
*otherWin
)
2663 if (m_constraintsInvolvedIn
)
2664 m_constraintsInvolvedIn
->DeleteObject(otherWin
);
2667 // Reset any constraints that mention this window
2668 void wxWindow::DeleteRelatedConstraints()
2670 if (m_constraintsInvolvedIn
)
2672 wxNode
*node
= m_constraintsInvolvedIn
->First();
2675 wxWindow
*win
= (wxWindow
*)node
->Data();
2676 wxNode
*next
= node
->Next();
2677 wxLayoutConstraints
*constr
= win
->GetConstraints();
2679 // Reset any constraints involving this window
2682 constr
->left
.ResetIfWin((wxWindow
*)this);
2683 constr
->top
.ResetIfWin((wxWindow
*)this);
2684 constr
->right
.ResetIfWin((wxWindow
*)this);
2685 constr
->bottom
.ResetIfWin((wxWindow
*)this);
2686 constr
->width
.ResetIfWin((wxWindow
*)this);
2687 constr
->height
.ResetIfWin((wxWindow
*)this);
2688 constr
->centreX
.ResetIfWin((wxWindow
*)this);
2689 constr
->centreY
.ResetIfWin((wxWindow
*)this);
2694 delete m_constraintsInvolvedIn
;
2695 m_constraintsInvolvedIn
= (wxList
*) NULL
;
2699 void wxWindow::SetSizer(wxSizer
*sizer
)
2701 m_windowSizer
= sizer
;
2703 sizer
->SetSizerParent((wxWindow
*)this);
2710 bool wxWindow::Layout()
2712 if (GetConstraints())
2715 GetClientSize(&w
, &h
);
2716 GetConstraints()->width
.SetValue(w
);
2717 GetConstraints()->height
.SetValue(h
);
2720 // If top level (one sizer), evaluate the sizer's constraints.
2724 GetSizer()->ResetConstraints(); // Mark all constraints as unevaluated
2725 GetSizer()->LayoutPhase1(&noChanges
);
2726 GetSizer()->LayoutPhase2(&noChanges
);
2727 GetSizer()->SetConstraintSizes(); // Recursively set the real window sizes
2732 // Otherwise, evaluate child constraints
2733 ResetConstraints(); // Mark all constraints as unevaluated
2734 DoPhase(1); // Just one phase need if no sizers involved
2736 SetConstraintSizes(); // Recursively set the real window sizes
2742 // Do a phase of evaluating constraints:
2743 // the default behaviour. wxSizers may do a similar
2744 // thing, but also impose their own 'constraints'
2745 // and order the evaluation differently.
2746 bool wxWindow::LayoutPhase1(int *noChanges
)
2748 wxLayoutConstraints
*constr
= GetConstraints();
2751 return constr
->SatisfyConstraints((wxWindow
*)this, noChanges
);
2757 bool wxWindow::LayoutPhase2(int *noChanges
)
2767 // Do a phase of evaluating child constraints
2768 bool wxWindow::DoPhase(int phase
)
2770 int noIterations
= 0;
2771 int maxIterations
= 500;
2775 while ((noChanges
> 0) && (noIterations
< maxIterations
))
2779 wxNode
*node
= GetChildren()->First();
2782 wxWindow
*child
= (wxWindow
*)node
->Data();
2783 if (!child
->IsKindOf(CLASSINFO(wxFrame
)) && !child
->IsKindOf(CLASSINFO(wxDialog
)))
2785 wxLayoutConstraints
*constr
= child
->GetConstraints();
2788 if (succeeded
.Member(child
))
2793 int tempNoChanges
= 0;
2794 bool success
= ( (phase
== 1) ? child
->LayoutPhase1(&tempNoChanges
) : child
->LayoutPhase2(&tempNoChanges
) ) ;
2795 noChanges
+= tempNoChanges
;
2798 succeeded
.Append(child
);
2803 node
= node
->Next();
2810 void wxWindow::ResetConstraints()
2812 wxLayoutConstraints
*constr
= GetConstraints();
2815 constr
->left
.SetDone(FALSE
);
2816 constr
->top
.SetDone(FALSE
);
2817 constr
->right
.SetDone(FALSE
);
2818 constr
->bottom
.SetDone(FALSE
);
2819 constr
->width
.SetDone(FALSE
);
2820 constr
->height
.SetDone(FALSE
);
2821 constr
->centreX
.SetDone(FALSE
);
2822 constr
->centreY
.SetDone(FALSE
);
2824 wxNode
*node
= GetChildren()->First();
2827 wxWindow
*win
= (wxWindow
*)node
->Data();
2828 if (!win
->IsKindOf(CLASSINFO(wxFrame
)) && !win
->IsKindOf(CLASSINFO(wxDialog
)))
2829 win
->ResetConstraints();
2830 node
= node
->Next();
2834 // Need to distinguish between setting the 'fake' size for
2835 // windows and sizers, and setting the real values.
2836 void wxWindow::SetConstraintSizes(bool recurse
)
2838 wxLayoutConstraints
*constr
= GetConstraints();
2839 if (constr
&& constr
->left
.GetDone() && constr
->right
.GetDone() &&
2840 constr
->width
.GetDone() && constr
->height
.GetDone())
2842 int x
= constr
->left
.GetValue();
2843 int y
= constr
->top
.GetValue();
2844 int w
= constr
->width
.GetValue();
2845 int h
= constr
->height
.GetValue();
2847 // If we don't want to resize this window, just move it...
2848 if ((constr
->width
.GetRelationship() != wxAsIs
) ||
2849 (constr
->height
.GetRelationship() != wxAsIs
))
2851 // Calls Layout() recursively. AAAGH. How can we stop that.
2852 // Simply take Layout() out of non-top level OnSizes.
2853 SizerSetSize(x
, y
, w
, h
);
2862 char *windowClass
= this->GetClassInfo()->GetClassName();
2865 if (GetName() == "")
2866 winName
= _("unnamed");
2868 winName
= GetName();
2869 wxDebugMsg(_("Constraint(s) not satisfied for window of type %s, name %s:\n"), (const char *)windowClass
, (const char *)winName
);
2870 if (!constr
->left
.GetDone())
2871 wxDebugMsg(_(" unsatisfied 'left' constraint.\n"));
2872 if (!constr
->right
.GetDone())
2873 wxDebugMsg(_(" unsatisfied 'right' constraint.\n"));
2874 if (!constr
->width
.GetDone())
2875 wxDebugMsg(_(" unsatisfied 'width' constraint.\n"));
2876 if (!constr
->height
.GetDone())
2877 wxDebugMsg(_(" unsatisfied 'height' constraint.\n"));
2878 wxDebugMsg(_("Please check constraints: try adding AsIs() constraints.\n"));
2883 wxNode
*node
= GetChildren()->First();
2886 wxWindow
*win
= (wxWindow
*)node
->Data();
2887 if (!win
->IsKindOf(CLASSINFO(wxFrame
)) && !win
->IsKindOf(CLASSINFO(wxDialog
)))
2888 win
->SetConstraintSizes();
2889 node
= node
->Next();
2894 // This assumes that all sizers are 'on' the same
2895 // window, i.e. the parent of this window.
2896 void wxWindow::TransformSizerToActual(int *x
, int *y
) const
2898 if (!m_sizerParent
|| m_sizerParent
->IsKindOf(CLASSINFO(wxDialog
)) ||
2899 m_sizerParent
->IsKindOf(CLASSINFO(wxFrame
)) )
2903 m_sizerParent
->GetPosition(&xp
, &yp
);
2904 m_sizerParent
->TransformSizerToActual(&xp
, &yp
);
2909 void wxWindow::SizerSetSize(int x
, int y
, int w
, int h
)
2913 TransformSizerToActual(&xx
, &yy
);
2914 SetSize(xx
, yy
, w
, h
);
2917 void wxWindow::SizerMove(int x
, int y
)
2921 TransformSizerToActual(&xx
, &yy
);
2925 // Only set the size/position of the constraint (if any)
2926 void wxWindow::SetSizeConstraint(int x
, int y
, int w
, int h
)
2928 wxLayoutConstraints
*constr
= GetConstraints();
2933 constr
->left
.SetValue(x
);
2934 constr
->left
.SetDone(TRUE
);
2938 constr
->top
.SetValue(y
);
2939 constr
->top
.SetDone(TRUE
);
2943 constr
->width
.SetValue(w
);
2944 constr
->width
.SetDone(TRUE
);
2948 constr
->height
.SetValue(h
);
2949 constr
->height
.SetDone(TRUE
);
2954 void wxWindow::MoveConstraint(int x
, int y
)
2956 wxLayoutConstraints
*constr
= GetConstraints();
2961 constr
->left
.SetValue(x
);
2962 constr
->left
.SetDone(TRUE
);
2966 constr
->top
.SetValue(y
);
2967 constr
->top
.SetDone(TRUE
);
2972 void wxWindow::GetSizeConstraint(int *w
, int *h
) const
2974 wxLayoutConstraints
*constr
= GetConstraints();
2977 *w
= constr
->width
.GetValue();
2978 *h
= constr
->height
.GetValue();
2984 void wxWindow::GetClientSizeConstraint(int *w
, int *h
) const
2986 wxLayoutConstraints
*constr
= GetConstraints();
2989 *w
= constr
->width
.GetValue();
2990 *h
= constr
->height
.GetValue();
2993 GetClientSize(w
, h
);
2996 void wxWindow::GetPositionConstraint(int *x
, int *y
) const
2998 wxLayoutConstraints
*constr
= GetConstraints();
3001 *x
= constr
->left
.GetValue();
3002 *y
= constr
->top
.GetValue();
3008 bool wxWindow::AcceptsFocus() const
3010 return IsEnabled() && IsShown();
3013 void wxWindow::OnIdle(wxIdleEvent
& WXUNUSED(event
) )