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 "wx/settings.h"
30 #include "gdk/gdkprivate.h"
31 #include "gdk/gdkkeysyms.h"
35 //-----------------------------------------------------------------------------
36 // documentation on internals
37 //-----------------------------------------------------------------------------
40 I have been asked several times about writing some documentation about
41 the GTK port of wxWindows, especially its internal structures. Obviously,
42 you cannot understand wxGTK without knowing a little about the GTK, but
43 some more information about what the wxWindow, which is the base class
44 for all other window classes, does seems required as well.
46 What does wxWindow do? It contains the common interface for the following
47 jobs of its descendants:
49 1) Define the rudimentary behaviour common to all window classes, such as
50 resizing, intercepting user input (so as to make it possible to use these
51 events for special purposes in a derived class), window names etc.
53 2) Provide the possibility to contain and manage children, if the derived
54 class is allowed to contain children, which holds true for those window
55 classes which do not display a native GTK widget. To name them, these
56 classes are wxPanel, wxScrolledWindow, wxDialog, wxFrame. The MDI frame-
57 work classes are a special case and are handled a bit differently from
58 the rest. The same holds true for the wxNotebook class.
60 3) Provide the possibility to draw into a client area of a window. This,
61 too, only holds true for classes that do not display a native GTK widget
64 4) Provide the entire mechanism for scrolling widgets. This actual inter-
65 face for this is usually in wxScrolledWindow, but the GTK implementation
68 5) A multitude of helper or extra methods for special purposes, such as
69 Drag'n'Drop, managing validators etc.
71 Normally one might expect, that one wxWindows window would always correspond
72 to one GTK widget. Under GTK, there is no such allround widget that has all
73 the functionality. Moreover, the GTK defines a client area as a different
74 widget from the actual widget you are handling. Last but not least some
75 special classes (e.g. wxFrame) handle different categories of widgets and
76 still have the possibility to draw something in the client area.
77 It was therefore required to write a special purpose GTK widget, that would
78 represent a client area in the sense of wxWindows capable to do the jobs
79 2), 3) and 4). I have written this class and it resides in win_gtk.c of
82 All windows must have a widget, with which they interact with other under-
83 lying GTK widgets. It is this widget, e.g. that has to be resized etc and
84 thw wxWindow class has a member variable called m_widget which holds a
85 pointer to this widget. When the window class represents a GTK native widget,
86 this is (in most cases) the only GTK widget the class manages. E.g. the
87 wxStatitText class handles only a GtkLabel widget a pointer to which you
88 can find in m_widget (defined in wxWindow)
90 When the class has a client area for drawing into and for containing children
91 it has to handle the client area widget (of the type GtkMyFixed, defined in
92 win_gtk.c), but there could be any number of widgets, handled by a class
93 The common rule for all windows is only, that the widget that interacts with
94 the rest of GTK must be referenced in m_widget and all other widgets must be
95 children of this widget on the GTK level. The top-most widget, which also
96 represents the client area, must be in the m_wxwindow field and must be of
99 As I said, the window classes that display a GTK native widget only have
100 one widget, so in the case of e.g. the wxButton class m_widget holds a
101 pointer to a GtkButton widget. But windows with client areas (for drawing
102 and children) have a m_widget field that is a pointer to a GtkScrolled-
103 Window and a m_wxwindow field that is pointer to a GtkMyFixed and this
104 one is (in the GTK sense) a child of the GtkScrolledWindow.
106 If the m_wxwindow field is set, then all input to this widget is inter-
107 cepted and sent to the wxWindows class. If not, all input to the widget
108 that gets pointed to by m_widget gets intercepted and sent to the class.
112 //-----------------------------------------------------------------------------
114 //-----------------------------------------------------------------------------
116 #if (GTK_MINOR_VERSION == 1)
117 #if (GTK_MICRO_VERSION >= 3)
118 #define NEW_GTK_DND_CODE
122 //-----------------------------------------------------------------------------
124 //-----------------------------------------------------------------------------
126 extern wxList wxPendingDelete
;
127 extern wxList wxTopLevelWindows
;
128 extern bool g_blockEventsOnDrag
;
129 static bool g_capturing
= FALSE
;
131 // hack: we need something to pass to gtk_menu_popup, so we store the time of
132 // the last click here
133 static guint32 gs_timeLastClick
= 0;
135 //-----------------------------------------------------------------------------
136 // "expose_event" (of m_wxwindow, not of m_widget)
137 //-----------------------------------------------------------------------------
139 static void gtk_window_expose_callback( GtkWidget
*WXUNUSED(widget
), GdkEventExpose
*gdk_event
, wxWindow
*win
)
141 if (!win
->HasVMT()) return;
142 if (g_blockEventsOnDrag
) return;
144 win
->m_updateRegion
.Union( gdk_event
->area
.x
,
146 gdk_event
->area
.width
,
147 gdk_event
->area
.height
);
149 if (gdk_event
->count
> 0) return;
152 printf( "OnExpose from " );
153 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
154 printf( win->GetClassInfo()->GetClassName() );
158 wxPaintEvent
event( win
->GetId() );
159 event
.SetEventObject( win
);
160 win
->GetEventHandler()->ProcessEvent( event
);
162 win
->m_updateRegion
.Clear();
165 //-----------------------------------------------------------------------------
166 // "draw" (of m_wxwindow, not of m_widget)
167 //-----------------------------------------------------------------------------
169 static void gtk_window_draw_callback( GtkWidget
*WXUNUSED(widget
), GdkRectangle
*rect
, wxWindow
*win
)
171 if (!win
->HasVMT()) return;
172 if (g_blockEventsOnDrag
) return;
174 win
->m_updateRegion
.Union( rect
->x
, rect
->y
, rect
->width
, rect
->height
);
176 wxPaintEvent
event( win
->GetId() );
177 event
.SetEventObject( win
);
178 win
->GetEventHandler()->ProcessEvent( event
);
180 win
->m_updateRegion
.Clear();
183 //-----------------------------------------------------------------------------
185 //-----------------------------------------------------------------------------
187 static gint
gtk_window_key_press_callback( GtkWidget
*widget
, GdkEventKey
*gdk_event
, wxWindow
*win
)
189 if (!win
->HasVMT()) return FALSE
;
190 if (g_blockEventsOnDrag
) return FALSE
;
193 printf( "OnKeyPress from " );
194 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
195 printf( win->GetClassInfo()->GetClassName() );
200 switch (gdk_event
->keyval
)
202 case GDK_BackSpace
: key_code
= WXK_BACK
; break;
203 case GDK_Tab
: key_code
= WXK_TAB
; break;
204 case GDK_Linefeed
: key_code
= WXK_RETURN
; break;
205 case GDK_Clear
: key_code
= WXK_CLEAR
; break;
206 case GDK_Return
: key_code
= WXK_RETURN
; break;
207 case GDK_Pause
: key_code
= WXK_PAUSE
; break;
208 case GDK_Scroll_Lock
: key_code
= WXK_SCROLL
; break;
209 case GDK_Escape
: key_code
= WXK_ESCAPE
; break;
210 case GDK_Delete
: key_code
= WXK_DELETE
; break;
211 case GDK_Home
: key_code
= WXK_HOME
; break;
212 case GDK_Left
: key_code
= WXK_LEFT
; break;
213 case GDK_Up
: key_code
= WXK_UP
; break;
214 case GDK_Right
: key_code
= WXK_RIGHT
; break;
215 case GDK_Down
: key_code
= WXK_DOWN
; break;
216 case GDK_Prior
: key_code
= WXK_PRIOR
; break;
217 // case GDK_Page_Up: key_code = WXK_PAGEUP; break;
218 case GDK_Next
: key_code
= WXK_NEXT
; break;
219 // case GDK_Page_Down: key_code = WXK_PAGEDOWN; break;
220 case GDK_End
: key_code
= WXK_END
; break;
221 case GDK_Begin
: key_code
= WXK_HOME
; break;
222 case GDK_Select
: key_code
= WXK_SELECT
; break;
223 case GDK_Print
: key_code
= WXK_PRINT
; break;
224 case GDK_Execute
: key_code
= WXK_EXECUTE
; break;
225 case GDK_Insert
: key_code
= WXK_INSERT
; break;
226 case GDK_Num_Lock
: key_code
= WXK_NUMLOCK
; break;
227 case GDK_KP_Tab
: key_code
= WXK_TAB
; break;
228 case GDK_KP_Enter
: key_code
= WXK_RETURN
; break;
229 case GDK_KP_Home
: key_code
= WXK_HOME
; break;
230 case GDK_KP_Left
: key_code
= WXK_LEFT
; break;
231 case GDK_KP_Up
: key_code
= WXK_UP
; break;
232 case GDK_KP_Right
: key_code
= WXK_RIGHT
; break;
233 case GDK_KP_Down
: key_code
= WXK_DOWN
; break;
234 case GDK_KP_Prior
: key_code
= WXK_PRIOR
; break;
235 // case GDK_KP_Page_Up: key_code = WXK_PAGEUP; break;
236 case GDK_KP_Next
: key_code
= WXK_NEXT
; break;
237 // case GDK_KP_Page_Down: key_code = WXK_PAGEDOWN; break;
238 case GDK_KP_End
: key_code
= WXK_END
; break;
239 case GDK_KP_Begin
: key_code
= WXK_HOME
; break;
240 case GDK_KP_Insert
: key_code
= WXK_INSERT
; break;
241 case GDK_KP_Delete
: key_code
= WXK_DELETE
; break;
242 case GDK_KP_Multiply
: key_code
= WXK_MULTIPLY
; break;
243 case GDK_KP_Add
: key_code
= WXK_ADD
; break;
244 case GDK_KP_Separator
: key_code
= WXK_SEPARATOR
; break;
245 case GDK_KP_Subtract
: key_code
= WXK_SUBTRACT
; break;
246 case GDK_KP_Decimal
: key_code
= WXK_DECIMAL
; break;
247 case GDK_KP_Divide
: key_code
= WXK_DIVIDE
; break;
248 case GDK_KP_0
: key_code
= WXK_NUMPAD0
; break;
249 case GDK_KP_1
: key_code
= WXK_NUMPAD1
; break;
250 case GDK_KP_2
: key_code
= WXK_NUMPAD2
; break;
251 case GDK_KP_3
: key_code
= WXK_NUMPAD3
; break;
252 case GDK_KP_4
: key_code
= WXK_NUMPAD4
; break;
253 case GDK_KP_5
: key_code
= WXK_NUMPAD5
; break;
254 case GDK_KP_6
: key_code
= WXK_NUMPAD6
; break;
255 case GDK_KP_7
: key_code
= WXK_NUMPAD7
; break;
256 case GDK_KP_8
: key_code
= WXK_NUMPAD7
; break;
257 case GDK_KP_9
: key_code
= WXK_NUMPAD9
; break;
258 case GDK_F1
: key_code
= WXK_F1
; break;
259 case GDK_F2
: key_code
= WXK_F2
; break;
260 case GDK_F3
: key_code
= WXK_F3
; break;
261 case GDK_F4
: key_code
= WXK_F4
; break;
262 case GDK_F5
: key_code
= WXK_F5
; break;
263 case GDK_F6
: key_code
= WXK_F6
; break;
264 case GDK_F7
: key_code
= WXK_F7
; break;
265 case GDK_F8
: key_code
= WXK_F8
; break;
266 case GDK_F9
: key_code
= WXK_F9
; break;
267 case GDK_F10
: key_code
= WXK_F10
; break;
268 case GDK_F11
: key_code
= WXK_F11
; break;
269 case GDK_F12
: key_code
= WXK_F12
; break;
272 if ((gdk_event
->keyval
>= 0x20) && (gdk_event
->keyval
<= 0xFF))
273 key_code
= gdk_event
->keyval
;
277 if (!key_code
) return FALSE
;
279 wxKeyEvent
event( wxEVT_CHAR
);
280 event
.m_shiftDown
= (gdk_event
->state
& GDK_SHIFT_MASK
);
281 event
.m_controlDown
= (gdk_event
->state
& GDK_CONTROL_MASK
);
282 event
.m_altDown
= (gdk_event
->state
& GDK_MOD1_MASK
);
283 event
.m_metaDown
= (gdk_event
->state
& GDK_MOD2_MASK
);
284 event
.m_keyCode
= key_code
;
287 event
.SetEventObject( win
);
289 bool ret
= win
->GetEventHandler()->ProcessEvent( event
);
293 wxWindow
*ancestor
= win
;
296 int command
= ancestor
->GetAcceleratorTable()->GetCommand( event
);
299 wxCommandEvent
command_event( wxEVT_COMMAND_MENU_SELECTED
, command
);
300 ret
= ancestor
->GetEventHandler()->ProcessEvent( command_event
);
303 ancestor
= ancestor
->GetParent();
309 if ((gdk_event
->keyval
>= 0x20) && (gdk_event
->keyval
<= 0xFF))
310 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "key_press_event" );
316 //-----------------------------------------------------------------------------
317 // "button_press_event"
318 //-----------------------------------------------------------------------------
320 static gint
gtk_window_button_press_callback( GtkWidget
*widget
, GdkEventButton
*gdk_event
, wxWindow
*win
)
322 if (!win
->IsOwnGtkWindow( gdk_event
->window
)) return TRUE
;
324 if (g_blockEventsOnDrag
) return TRUE
;
328 if (GTK_WIDGET_CAN_FOCUS(win
->m_wxwindow
) && !GTK_WIDGET_HAS_FOCUS (win
->m_wxwindow
) )
330 gtk_widget_grab_focus (win
->m_wxwindow
);
333 printf( "GrabFocus from " );
334 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
335 printf( win->GetClassInfo()->GetClassName() );
342 if (!win
->HasVMT()) return TRUE
;
345 printf( "OnButtonPress from " );
346 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
347 printf( win->GetClassInfo()->GetClassName() );
351 wxEventType event_type
= wxEVT_LEFT_DOWN
;
353 if (gdk_event
->button
== 1)
355 switch (gdk_event
->type
)
357 case GDK_BUTTON_PRESS
: event_type
= wxEVT_LEFT_DOWN
; break;
358 case GDK_2BUTTON_PRESS
: event_type
= wxEVT_LEFT_DCLICK
; break;
362 else if (gdk_event
->button
== 2)
364 switch (gdk_event
->type
)
366 case GDK_BUTTON_PRESS
: event_type
= wxEVT_MIDDLE_DOWN
; break;
367 case GDK_2BUTTON_PRESS
: event_type
= wxEVT_MIDDLE_DCLICK
; break;
371 else if (gdk_event
->button
== 3)
373 switch (gdk_event
->type
)
375 case GDK_BUTTON_PRESS
: event_type
= wxEVT_RIGHT_DOWN
; break;
376 case GDK_2BUTTON_PRESS
: event_type
= wxEVT_RIGHT_DCLICK
; break;
381 wxMouseEvent
event( event_type
);
382 event
.m_shiftDown
= (gdk_event
->state
& GDK_SHIFT_MASK
);
383 event
.m_controlDown
= (gdk_event
->state
& GDK_CONTROL_MASK
);
384 event
.m_altDown
= (gdk_event
->state
& GDK_MOD1_MASK
);
385 event
.m_metaDown
= (gdk_event
->state
& GDK_MOD2_MASK
);
386 event
.m_leftDown
= (gdk_event
->state
& GDK_BUTTON1_MASK
);
387 event
.m_middleDown
= (gdk_event
->state
& GDK_BUTTON2_MASK
);
388 event
.m_rightDown
= (gdk_event
->state
& GDK_BUTTON3_MASK
);
390 event
.m_x
= (long)gdk_event
->x
;
391 event
.m_y
= (long)gdk_event
->y
;
393 // Some control don't have their own X window and thus cannot get
398 wxNode
*node
= win
->GetChildren()->First();
401 wxWindow
*child
= (wxWindow
*)node
->Data();
402 if ((child
->m_x
<= event
.m_x
) &&
403 (child
->m_y
<= event
.m_y
) &&
404 (child
->m_x
+child
->m_width
>= event
.m_x
) &&
405 (child
->m_y
+child
->m_height
>= event
.m_y
))
408 event
.m_x
-= child
->m_x
;
409 event
.m_y
-= child
->m_y
;
416 event
.SetEventObject( win
);
418 gs_timeLastClick
= gdk_event
->time
;
420 if (win
->GetEventHandler()->ProcessEvent( event
))
421 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "button_press_event" );
426 //-----------------------------------------------------------------------------
427 // "button_release_event"
428 //-----------------------------------------------------------------------------
430 static gint
gtk_window_button_release_callback( GtkWidget
*widget
, GdkEventButton
*gdk_event
, wxWindow
*win
)
432 if (!win
->IsOwnGtkWindow( gdk_event
->window
)) return TRUE
;
434 if (g_blockEventsOnDrag
) return TRUE
;
436 if (!win
->HasVMT()) return TRUE
;
439 printf( "OnButtonRelease from " );
440 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
441 printf( win->GetClassInfo()->GetClassName() );
445 wxEventType event_type
= wxEVT_NULL
;
447 switch (gdk_event
->button
)
449 case 1: event_type
= wxEVT_LEFT_UP
; break;
450 case 2: event_type
= wxEVT_MIDDLE_UP
; break;
451 case 3: event_type
= wxEVT_RIGHT_UP
; break;
454 wxMouseEvent
event( event_type
);
455 event
.m_shiftDown
= (gdk_event
->state
& GDK_SHIFT_MASK
);
456 event
.m_controlDown
= (gdk_event
->state
& GDK_CONTROL_MASK
);
457 event
.m_altDown
= (gdk_event
->state
& GDK_MOD1_MASK
);
458 event
.m_metaDown
= (gdk_event
->state
& GDK_MOD2_MASK
);
459 event
.m_leftDown
= (gdk_event
->state
& GDK_BUTTON1_MASK
);
460 event
.m_middleDown
= (gdk_event
->state
& GDK_BUTTON2_MASK
);
461 event
.m_rightDown
= (gdk_event
->state
& GDK_BUTTON3_MASK
);
462 event
.m_x
= (long)gdk_event
->x
;
463 event
.m_y
= (long)gdk_event
->y
;
465 // Some control don't have their own X window and thus cannot get
470 wxNode
*node
= win
->GetChildren()->First();
473 wxWindow
*child
= (wxWindow
*)node
->Data();
474 if ((child
->m_x
<= event
.m_x
) &&
475 (child
->m_y
<= event
.m_y
) &&
476 (child
->m_x
+child
->m_width
>= event
.m_x
) &&
477 (child
->m_y
+child
->m_height
>= event
.m_y
))
480 event
.m_x
-= child
->m_x
;
481 event
.m_y
-= child
->m_y
;
488 event
.SetEventObject( win
);
490 if (win
->GetEventHandler()->ProcessEvent( event
))
491 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "button_release_event" );
496 //-----------------------------------------------------------------------------
497 // "motion_notify_event"
498 //-----------------------------------------------------------------------------
500 static gint
gtk_window_motion_notify_callback( GtkWidget
*widget
, GdkEventMotion
*gdk_event
, wxWindow
*win
)
502 if (!win
->IsOwnGtkWindow( gdk_event
->window
)) return TRUE
;
504 if (g_blockEventsOnDrag
) return TRUE
;
506 if (!win
->HasVMT()) return TRUE
;
509 printf( "OnMotion from " );
510 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
511 printf( win->GetClassInfo()->GetClassName() );
515 wxMouseEvent
event( wxEVT_MOTION
);
516 event
.m_shiftDown
= (gdk_event
->state
& GDK_SHIFT_MASK
);
517 event
.m_controlDown
= (gdk_event
->state
& GDK_CONTROL_MASK
);
518 event
.m_altDown
= (gdk_event
->state
& GDK_MOD1_MASK
);
519 event
.m_metaDown
= (gdk_event
->state
& GDK_MOD2_MASK
);
520 event
.m_leftDown
= (gdk_event
->state
& GDK_BUTTON1_MASK
);
521 event
.m_middleDown
= (gdk_event
->state
& GDK_BUTTON2_MASK
);
522 event
.m_rightDown
= (gdk_event
->state
& GDK_BUTTON3_MASK
);
524 event
.m_x
= (long)gdk_event
->x
;
525 event
.m_y
= (long)gdk_event
->y
;
527 // Some control don't have their own X window and thus cannot get
532 wxNode
*node
= win
->GetChildren()->First();
535 wxWindow
*child
= (wxWindow
*)node
->Data();
536 if ((child
->m_x
<= event
.m_x
) &&
537 (child
->m_y
<= event
.m_y
) &&
538 (child
->m_x
+child
->m_width
>= event
.m_x
) &&
539 (child
->m_y
+child
->m_height
>= event
.m_y
))
542 event
.m_x
-= child
->m_x
;
543 event
.m_y
-= child
->m_y
;
550 event
.SetEventObject( win
);
552 if (win
->GetEventHandler()->ProcessEvent( event
))
553 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "motion_notify_event" );
558 //-----------------------------------------------------------------------------
560 //-----------------------------------------------------------------------------
562 static gint
gtk_window_focus_in_callback( GtkWidget
*widget
, GdkEvent
*WXUNUSED(event
), wxWindow
*win
)
564 if (g_blockEventsOnDrag
) return TRUE
;
567 if (GTK_WIDGET_CAN_FOCUS(win
->m_wxwindow
))
569 GTK_WIDGET_SET_FLAGS (win
->m_wxwindow
, GTK_HAS_FOCUS
);
571 printf( "SetFocus flag from " );
572 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
573 printf( win->GetClassInfo()->GetClassName() );
579 if (!win
->HasVMT()) return TRUE
;
582 printf( "OnSetFocus from " );
583 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
584 printf( win->GetClassInfo()->GetClassName() );
586 printf( WXSTRINGCAST win->GetLabel() );
590 wxFocusEvent
event( wxEVT_SET_FOCUS
, win
->GetId() );
591 event
.SetEventObject( win
);
593 if (win
->GetEventHandler()->ProcessEvent( event
))
594 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "focus_in_event" );
599 //-----------------------------------------------------------------------------
601 //-----------------------------------------------------------------------------
603 static gint
gtk_window_focus_out_callback( GtkWidget
*widget
, GdkEvent
*WXUNUSED(event
), wxWindow
*win
)
605 if (g_blockEventsOnDrag
) return TRUE
;
608 if (GTK_WIDGET_CAN_FOCUS(win
->m_wxwindow
))
609 GTK_WIDGET_UNSET_FLAGS (win
->m_wxwindow
, GTK_HAS_FOCUS
);
612 if (!win
->HasVMT()) return TRUE
;
615 printf( "OnKillFocus from " );
616 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
617 printf( win->GetClassInfo()->GetClassName() );
621 wxFocusEvent
event( wxEVT_KILL_FOCUS
, win
->GetId() );
622 event
.SetEventObject( win
);
624 if (win
->GetEventHandler()->ProcessEvent( event
))
625 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "focus_out_event" );
630 //-----------------------------------------------------------------------------
631 // "enter_notify_event"
632 //-----------------------------------------------------------------------------
634 static gint
gtk_window_enter_callback( GtkWidget
*widget
, GdkEventCrossing
*gdk_event
, wxWindow
*win
)
636 if (widget
->window
!= gdk_event
->window
) return TRUE
;
638 if (g_blockEventsOnDrag
) return TRUE
;
640 if (!win
->HasVMT()) return TRUE
;
643 printf( "OnEnter from " );
644 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
645 printf( win->GetClassInfo()->GetClassName() );
649 if ((widget
->window
) && (win
->m_cursor
))
650 gdk_window_set_cursor( widget
->window
, win
->m_cursor
->GetCursor() );
652 wxMouseEvent
event( wxEVT_ENTER_WINDOW
);
653 event
.SetEventObject( win
);
655 if (win
->GetEventHandler()->ProcessEvent( event
))
656 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "enter_notify_event" );
661 //-----------------------------------------------------------------------------
662 // "leave_notify_event"
663 //-----------------------------------------------------------------------------
665 static gint
gtk_window_leave_callback( GtkWidget
*widget
, GdkEventCrossing
*gdk_event
, wxWindow
*win
)
667 if (widget
->window
!= gdk_event
->window
) return TRUE
;
669 if (g_blockEventsOnDrag
) return TRUE
;
671 if (!win
->HasVMT()) return TRUE
;
674 printf( "OnLeave from " );
675 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
676 printf( win->GetClassInfo()->GetClassName() );
680 if ((widget
->window
) && (win
->m_cursor
))
681 gdk_window_set_cursor( widget
->window
, wxSTANDARD_CURSOR
->GetCursor() );
683 wxMouseEvent
event( wxEVT_LEAVE_WINDOW
);
684 event
.SetEventObject( win
);
686 if (win
->GetEventHandler()->ProcessEvent( event
))
687 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget
), "leave_notify_event" );
692 //-----------------------------------------------------------------------------
693 // "value_changed" from m_vAdjust
694 //-----------------------------------------------------------------------------
696 static void gtk_window_vscroll_callback( GtkWidget
*WXUNUSED(widget
), wxWindow
*win
)
698 if (g_blockEventsOnDrag
) return;
701 printf( "OnVScroll from " );
702 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
703 printf( win->GetClassInfo()->GetClassName() );
707 if (!win
->HasVMT()) return;
709 float diff
= win
->m_vAdjust
->value
- win
->m_oldVerticalPos
;
710 if (fabs(diff
) < 0.2) return;
712 wxEventType command
= wxEVT_NULL
;
714 float line_step
= win
->m_vAdjust
->step_increment
;
715 float page_step
= win
->m_vAdjust
->page_increment
;
717 if (fabs(win
->m_vAdjust
->value
-win
->m_vAdjust
->lower
) < 0.2) command
= wxEVT_SCROLL_BOTTOM
;
718 else if (fabs(win
->m_vAdjust
->value
-win
->m_vAdjust
->upper
) < 0.2) command
= wxEVT_SCROLL_TOP
;
719 else if (fabs(diff
-line_step
) < 0.2) command
= wxEVT_SCROLL_LINEDOWN
;
720 else if (fabs(diff
+line_step
) < 0.2) command
= wxEVT_SCROLL_LINEUP
;
721 else if (fabs(diff
-page_step
) < 0.2) command
= wxEVT_SCROLL_PAGEDOWN
;
722 else if (fabs(diff
+page_step
) < 0.2) command
= wxEVT_SCROLL_PAGEUP
;
723 else command
= wxEVT_SCROLL_THUMBTRACK
;
725 int value
= (int)(win
->m_vAdjust
->value
+0.5);
727 wxScrollEvent
event( command
, win
->GetId(), value
, wxVERTICAL
);
728 event
.SetEventObject( win
);
729 win
->GetEventHandler()->ProcessEvent( event
);
732 //-----------------------------------------------------------------------------
733 // "value_changed" from m_hAdjust
734 //-----------------------------------------------------------------------------
736 static void gtk_window_hscroll_callback( GtkWidget
*WXUNUSED(widget
), wxWindow
*win
)
738 if (g_blockEventsOnDrag
) return;
741 printf( "OnHScroll from " );
742 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
743 printf( win->GetClassInfo()->GetClassName() );
747 if (!win
->HasVMT()) return;
749 float diff
= win
->m_hAdjust
->value
- win
->m_oldHorizontalPos
;
750 if (fabs(diff
) < 0.2) return;
752 wxEventType command
= wxEVT_NULL
;
754 float line_step
= win
->m_hAdjust
->step_increment
;
755 float page_step
= win
->m_hAdjust
->page_increment
;
757 if (fabs(win
->m_hAdjust
->value
-win
->m_hAdjust
->lower
) < 0.2) command
= wxEVT_SCROLL_BOTTOM
;
758 else if (fabs(win
->m_hAdjust
->value
-win
->m_hAdjust
->upper
) < 0.2) command
= wxEVT_SCROLL_TOP
;
759 else if (fabs(diff
-line_step
) < 0.2) command
= wxEVT_SCROLL_LINEDOWN
;
760 else if (fabs(diff
+line_step
) < 0.2) command
= wxEVT_SCROLL_LINEUP
;
761 else if (fabs(diff
-page_step
) < 0.2) command
= wxEVT_SCROLL_PAGEDOWN
;
762 else if (fabs(diff
+page_step
) < 0.2) command
= wxEVT_SCROLL_PAGEUP
;
763 else command
= wxEVT_SCROLL_THUMBTRACK
;
765 int value
= (int)(win
->m_hAdjust
->value
+0.5);
767 wxScrollEvent
event( command
, win
->GetId(), value
, wxHORIZONTAL
);
768 event
.SetEventObject( win
);
769 win
->GetEventHandler()->ProcessEvent( event
);
772 //-----------------------------------------------------------------------------
773 // "changed" from m_vAdjust
774 //-----------------------------------------------------------------------------
776 static void gtk_window_vscroll_change_callback( GtkWidget
*WXUNUSED(widget
), wxWindow
*win
)
778 if (g_blockEventsOnDrag
) return;
781 printf( "OnVScroll change from " );
782 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
783 printf( win->GetClassInfo()->GetClassName() );
787 if (!win
->HasVMT()) return;
789 wxEventType command
= wxEVT_SCROLL_THUMBTRACK
;
790 int value
= (int)(win
->m_vAdjust
->value
+0.5);
792 wxScrollEvent
event( command
, win
->GetId(), value
, wxVERTICAL
);
793 event
.SetEventObject( win
);
794 win
->GetEventHandler()->ProcessEvent( event
);
797 //-----------------------------------------------------------------------------
798 // "changed" from m_hAdjust
799 //-----------------------------------------------------------------------------
801 static void gtk_window_hscroll_change_callback( GtkWidget
*WXUNUSED(widget
), wxWindow
*win
)
803 if (g_blockEventsOnDrag
) return;
806 printf( "OnHScroll change from " );
807 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
808 printf( win->GetClassInfo()->GetClassName() );
812 if (!win
->HasVMT()) return;
814 wxEventType command
= wxEVT_SCROLL_THUMBTRACK
;
815 int value
= (int)(win
->m_hAdjust
->value
+0.5);
817 wxScrollEvent
event( command
, win
->GetId(), value
, wxHORIZONTAL
);
818 event
.SetEventObject( win
);
819 win
->GetEventHandler()->ProcessEvent( event
);
822 //-----------------------------------------------------------------------------
823 // "button_press_event" from scrollbar
824 //-----------------------------------------------------------------------------
826 static gint
gtk_scrollbar_button_press_callback( GtkRange
*widget
, GdkEventButton
*gdk_event
, wxWindow
*win
)
828 if (gdk_event
->window
!= widget
->slider
) return FALSE
;
830 win
->m_isScrolling
= TRUE
;
835 //-----------------------------------------------------------------------------
836 // "button_release_event" from scrollbar
837 //-----------------------------------------------------------------------------
839 static gint
gtk_scrollbar_button_release_callback( GtkRange
*widget
, GdkEventButton
*gdk_event
, wxWindow
*win
)
841 if (gdk_event
->window
!= widget
->slider
) return FALSE
;
843 GtkScrolledWindow
*s_window
= GTK_SCROLLED_WINDOW(win
->m_widget
);
845 if (widget
== GTK_RANGE(s_window
->vscrollbar
))
846 gtk_signal_emit_by_name( GTK_OBJECT(win
->m_hAdjust
), "value_changed" );
848 gtk_signal_emit_by_name( GTK_OBJECT(win
->m_vAdjust
), "value_changed" );
850 win
->m_isScrolling
= FALSE
;
856 #ifdef NEW_GTK_DND_CODE
860 //-----------------------------------------------------------------------------
861 // "drop_data_available_event"
862 //-----------------------------------------------------------------------------
864 static void gtk_window_drop_callback( GtkWidget
*widget
, GdkEventDropDataAvailable
*event
, wxWindow
*win
)
866 if (!win
->HasVMT()) return;
868 if (win
->GetDropTarget())
872 gdk_window_get_pointer( widget
->window
, &x
, &y
, (GdkModifierType
*) NULL
);
874 printf( "Drop data is of type %s.\n", event
->data_type
);
876 win
->GetDropTarget()->OnDrop( x
, y
, (const void*)event
->data
, (size_t)event
->data_numbytes
);
880 g_free (event->dropdataavailable.data);
881 g_free (event->dropdataavailable.data_type);
888 //-----------------------------------------------------------------------------
889 // InsertChild for wxWindow.
890 //-----------------------------------------------------------------------------
892 // Callback for wxWindow. This very strange beast has to be used because
893 // C++ has no virtual methods in a constructor. We have to emulate a
894 // virtual function here as wxNotebook requires a different way to insert
895 // a child in it. I had opted for creating a wxNotebookPage window class
896 // which would have made this superflouus (such in the MDI window system),
897 // but no-one is listening to me...
899 static void wxInsertChildInWindow( wxWindow
* parent
, wxWindow
* child
)
901 gtk_myfixed_put( GTK_MYFIXED(parent
->m_wxwindow
),
902 GTK_WIDGET(child
->m_widget
),
906 gtk_widget_set_usize( GTK_WIDGET(child
->m_widget
),
911 //-----------------------------------------------------------------------------
913 //-----------------------------------------------------------------------------
915 IMPLEMENT_DYNAMIC_CLASS(wxWindow
,wxEvtHandler
)
917 BEGIN_EVENT_TABLE(wxWindow
, wxEvtHandler
)
918 EVT_SIZE(wxWindow::OnSize
)
919 EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged
)
920 EVT_INIT_DIALOG(wxWindow::OnInitDialog
)
921 EVT_IDLE(wxWindow::OnIdle
)
926 m_widget
= (GtkWidget
*) NULL
;
927 m_wxwindow
= (GtkWidget
*) NULL
;
928 m_parent
= (wxWindow
*) NULL
;
929 m_children
.DeleteContents( FALSE
);
942 m_eventHandler
= this;
943 m_windowValidator
= (wxValidator
*) NULL
;
947 m_cursor
= (wxCursor
*) NULL
;
948 m_font
= *wxSWISS_FONT
;
950 m_windowName
= "noname";
952 m_constraints
= (wxLayoutConstraints
*) NULL
;
953 m_constraintsInvolvedIn
= (wxList
*) NULL
;
954 m_windowSizer
= (wxSizer
*) NULL
;
955 m_sizerParent
= (wxWindow
*) NULL
;
956 m_autoLayout
= FALSE
;
962 m_hasScrolling
= FALSE
;
963 m_isScrolling
= FALSE
;
964 m_hAdjust
= (GtkAdjustment
*) NULL
;
965 m_vAdjust
= (GtkAdjustment
*) NULL
;
966 m_oldHorizontalPos
= 0.0;
967 m_oldVerticalPos
= 0.0;
972 m_dropTarget
= (wxDropTarget
*) NULL
;
974 m_scrollGC
= (GdkGC
*) NULL
;
975 m_widgetStyle
= (GtkStyle
*) NULL
;
977 m_insertCallback
= wxInsertChildInWindow
;
979 m_clientObject
= (wxClientData
*) NULL
;
983 wxWindow::wxWindow( wxWindow
*parent
, wxWindowID id
,
984 const wxPoint
&pos
, const wxSize
&size
,
985 long style
, const wxString
&name
)
987 m_insertCallback
= wxInsertChildInWindow
;
988 Create( parent
, id
, pos
, size
, style
, name
);
991 bool wxWindow::Create( wxWindow
*parent
, wxWindowID id
,
992 const wxPoint
&pos
, const wxSize
&size
,
993 long style
, const wxString
&name
)
999 PreCreation( parent
, id
, pos
, size
, style
, name
);
1001 m_widget
= gtk_scrolled_window_new( (GtkAdjustment
*) NULL
, (GtkAdjustment
*) NULL
);
1002 m_hasScrolling
= TRUE
;
1004 GtkScrolledWindow
*s_window
= GTK_SCROLLED_WINDOW(m_widget
);
1006 gtk_signal_connect( GTK_OBJECT(s_window
->vscrollbar
), "button_press_event",
1007 (GtkSignalFunc
)gtk_scrollbar_button_press_callback
, (gpointer
) this );
1009 gtk_signal_connect( GTK_OBJECT(s_window
->hscrollbar
), "button_press_event",
1010 (GtkSignalFunc
)gtk_scrollbar_button_press_callback
, (gpointer
) this );
1012 gtk_signal_connect( GTK_OBJECT(s_window
->vscrollbar
), "button_release_event",
1013 (GtkSignalFunc
)gtk_scrollbar_button_release_callback
, (gpointer
) this );
1015 gtk_signal_connect( GTK_OBJECT(s_window
->hscrollbar
), "button_release_event",
1016 (GtkSignalFunc
)gtk_scrollbar_button_release_callback
, (gpointer
) this );
1018 GtkScrolledWindowClass
*scroll_class
= GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget
)->klass
);
1019 scroll_class
->scrollbar_spacing
= 0;
1021 gtk_scrolled_window_set_policy( s_window
, GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
1023 m_oldHorizontalPos
= 0.0;
1024 m_oldVerticalPos
= 0.0;
1026 m_hAdjust
= gtk_range_get_adjustment( GTK_RANGE(s_window
->hscrollbar
) );
1027 m_vAdjust
= gtk_range_get_adjustment( GTK_RANGE(s_window
->vscrollbar
) );
1029 gtk_signal_connect( GTK_OBJECT(m_hAdjust
), "value_changed",
1030 (GtkSignalFunc
) gtk_window_hscroll_callback
, (gpointer
) this );
1031 gtk_signal_connect( GTK_OBJECT(m_vAdjust
), "value_changed",
1032 (GtkSignalFunc
) gtk_window_vscroll_callback
, (gpointer
) this );
1034 gtk_signal_connect( GTK_OBJECT(m_hAdjust
), "changed",
1035 (GtkSignalFunc
) gtk_window_hscroll_change_callback
, (gpointer
) this );
1036 gtk_signal_connect(GTK_OBJECT(m_vAdjust
), "changed",
1037 (GtkSignalFunc
) gtk_window_vscroll_change_callback
, (gpointer
) this );
1039 GtkViewport
*viewport
= GTK_VIEWPORT(s_window
->viewport
);
1041 if (m_windowStyle
& wxRAISED_BORDER
)
1043 gtk_viewport_set_shadow_type( viewport
, GTK_SHADOW_OUT
);
1045 else if (m_windowStyle
& wxSUNKEN_BORDER
)
1047 gtk_viewport_set_shadow_type( viewport
, GTK_SHADOW_IN
);
1051 gtk_viewport_set_shadow_type( viewport
, GTK_SHADOW_NONE
);
1054 m_wxwindow
= gtk_myfixed_new();
1056 GTK_WIDGET_UNSET_FLAGS( m_widget
, GTK_CAN_FOCUS
);
1058 if (m_windowStyle
& wxTAB_TRAVERSAL
== wxTAB_TRAVERSAL
)
1059 GTK_WIDGET_UNSET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
1061 GTK_WIDGET_SET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
1063 gtk_container_add( GTK_CONTAINER(m_widget
), m_wxwindow
);
1065 // shut the viewport up
1066 gtk_viewport_set_hadjustment( viewport
, (GtkAdjustment
*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) );
1067 gtk_viewport_set_vadjustment( viewport
, (GtkAdjustment
*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) );
1069 // I _really_ don't want scrollbars in the beginning
1070 m_vAdjust
->lower
= 0.0;
1071 m_vAdjust
->upper
= 1.0;
1072 m_vAdjust
->value
= 0.0;
1073 m_vAdjust
->step_increment
= 1.0;
1074 m_vAdjust
->page_increment
= 1.0;
1075 m_vAdjust
->page_size
= 5.0;
1076 gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust
), "changed" );
1077 m_hAdjust
->lower
= 0.0;
1078 m_hAdjust
->upper
= 1.0;
1079 m_hAdjust
->value
= 0.0;
1080 m_hAdjust
->step_increment
= 1.0;
1081 m_hAdjust
->page_increment
= 1.0;
1082 m_hAdjust
->page_size
= 5.0;
1083 gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust
), "changed" );
1085 gtk_widget_show( m_wxwindow
);
1087 if (m_parent
) m_parent
->AddChild( this );
1089 (m_parent
->m_insertCallback
)( m_parent
, this );
1098 wxWindow::~wxWindow()
1102 if (m_dropTarget
) delete m_dropTarget
;
1104 if (m_parent
) m_parent
->RemoveChild( this );
1105 if (m_widget
) Show( FALSE
);
1109 if (m_widgetStyle
) gtk_style_unref( m_widgetStyle
);
1111 if (m_scrollGC
) gdk_gc_unref( m_scrollGC
);
1113 if (m_wxwindow
) gtk_widget_destroy( m_wxwindow
);
1115 if (m_widget
) gtk_widget_destroy( m_widget
);
1117 if (m_cursor
) delete m_cursor
;
1119 DeleteRelatedConstraints();
1122 // This removes any dangling pointers to this window
1123 // in other windows' constraintsInvolvedIn lists.
1124 UnsetConstraints(m_constraints
);
1125 delete m_constraints
;
1126 m_constraints
= (wxLayoutConstraints
*) NULL
;
1130 delete m_windowSizer
;
1131 m_windowSizer
= (wxSizer
*) NULL
;
1133 // If this is a child of a sizer, remove self from parent
1134 if (m_sizerParent
) m_sizerParent
->RemoveChild((wxWindow
*)this);
1136 // Just in case the window has been Closed, but
1137 // we're then deleting immediately: don't leave
1138 // dangling pointers.
1139 wxPendingDelete
.DeleteObject(this);
1141 // Just in case we've loaded a top-level window via
1142 // wxWindow::LoadNativeDialog but we weren't a dialog
1144 wxTopLevelWindows
.DeleteObject(this);
1146 if (m_windowValidator
) delete m_windowValidator
;
1148 if (m_clientObject
) delete m_clientObject
;
1151 void wxWindow::PreCreation( wxWindow
*parent
, wxWindowID id
,
1152 const wxPoint
&pos
, const wxSize
&size
,
1153 long style
, const wxString
&name
)
1155 if (m_needParent
&& (parent
== NULL
))
1156 wxFatalError( "Need complete parent.", name
);
1158 m_widget
= (GtkWidget
*) NULL
;
1159 m_wxwindow
= (GtkWidget
*) NULL
;
1162 m_children
.DeleteContents( FALSE
);
1165 if (m_width
== -1) m_width
= 20;
1167 if (m_height
== -1) m_height
= 20;
1172 if (!m_needParent
) // some reasonable defaults
1176 m_x
= (gdk_screen_width () - m_width
) / 2;
1177 if (m_x
< 10) m_x
= 10;
1181 m_y
= (gdk_screen_height () - m_height
) / 2;
1182 if (m_y
< 10) m_y
= 10;
1193 m_eventHandler
= this;
1199 m_cursor
= new wxCursor( wxCURSOR_ARROW
);
1200 m_font
= *wxSWISS_FONT
;
1201 // m_backgroundColour = wxWHITE;
1202 // m_foregroundColour = wxBLACK;
1203 m_windowStyle
= style
;
1204 m_windowName
= name
;
1206 m_constraints
= (wxLayoutConstraints
*) NULL
;
1207 m_constraintsInvolvedIn
= (wxList
*) NULL
;
1208 m_windowSizer
= (wxSizer
*) NULL
;
1209 m_sizerParent
= (wxWindow
*) NULL
;
1210 m_autoLayout
= FALSE
;
1212 m_hasScrolling
= FALSE
;
1213 m_isScrolling
= FALSE
;
1214 m_hAdjust
= (GtkAdjustment
*) NULL
;
1215 m_vAdjust
= (GtkAdjustment
*) NULL
;
1216 m_oldHorizontalPos
= 0.0;
1217 m_oldVerticalPos
= 0.0;
1222 m_dropTarget
= (wxDropTarget
*) NULL
;
1224 m_windowValidator
= (wxValidator
*) NULL
;
1225 m_scrollGC
= (GdkGC
*) NULL
;
1226 m_widgetStyle
= (GtkStyle
*) NULL
;
1228 m_clientObject
= (wxClientData
*)NULL
;
1229 m_clientData
= NULL
;
1232 void wxWindow::PostCreation()
1236 gtk_signal_connect( GTK_OBJECT(m_wxwindow
), "expose_event",
1237 GTK_SIGNAL_FUNC(gtk_window_expose_callback
), (gpointer
)this );
1239 gtk_signal_connect( GTK_OBJECT(m_wxwindow
), "draw",
1240 GTK_SIGNAL_FUNC(gtk_window_draw_callback
), (gpointer
)this );
1243 ConnectWidget( GetConnectWidget() );
1245 if (m_widget
&& m_parent
) gtk_widget_realize( m_widget
);
1247 if (m_wxwindow
) gtk_widget_realize( m_wxwindow
);
1249 SetCursor( *wxSTANDARD_CURSOR
);
1254 void wxWindow::ConnectWidget( GtkWidget
*widget
)
1256 gtk_signal_connect( GTK_OBJECT(widget
), "key_press_event",
1257 GTK_SIGNAL_FUNC(gtk_window_key_press_callback
), (gpointer
)this );
1259 gtk_signal_connect( GTK_OBJECT(widget
), "button_press_event",
1260 GTK_SIGNAL_FUNC(gtk_window_button_press_callback
), (gpointer
)this );
1262 gtk_signal_connect( GTK_OBJECT(widget
), "button_release_event",
1263 GTK_SIGNAL_FUNC(gtk_window_button_release_callback
), (gpointer
)this );
1265 gtk_signal_connect( GTK_OBJECT(widget
), "motion_notify_event",
1266 GTK_SIGNAL_FUNC(gtk_window_motion_notify_callback
), (gpointer
)this );
1268 gtk_signal_connect( GTK_OBJECT(widget
), "focus_in_event",
1269 GTK_SIGNAL_FUNC(gtk_window_focus_in_callback
), (gpointer
)this );
1271 gtk_signal_connect( GTK_OBJECT(widget
), "focus_out_event",
1272 GTK_SIGNAL_FUNC(gtk_window_focus_out_callback
), (gpointer
)this );
1274 gtk_signal_connect( GTK_OBJECT(widget
), "enter_notify_event",
1275 GTK_SIGNAL_FUNC(gtk_window_enter_callback
), (gpointer
)this );
1277 gtk_signal_connect( GTK_OBJECT(widget
), "leave_notify_event",
1278 GTK_SIGNAL_FUNC(gtk_window_leave_callback
), (gpointer
)this );
1281 bool wxWindow::HasVMT()
1286 bool wxWindow::Close( bool force
)
1288 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1290 wxCloseEvent
event(wxEVT_CLOSE_WINDOW
, m_windowId
);
1291 event
.SetEventObject(this);
1292 event
.SetForce(force
);
1294 return GetEventHandler()->ProcessEvent(event
);
1297 bool wxWindow::Destroy()
1299 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1306 bool wxWindow::DestroyChildren()
1311 while ((node
= GetChildren()->First()) != (wxNode
*)NULL
)
1314 if ((child
= (wxWindow
*)node
->Data()) != (wxWindow
*)NULL
)
1317 if (GetChildren()->Member(child
)) delete node
;
1324 void wxWindow::PrepareDC( wxDC
&WXUNUSED(dc
) )
1326 // are we to set fonts here ?
1329 wxPoint
wxWindow::GetClientAreaOrigin() const
1331 return wxPoint(0,0);
1334 void wxWindow::AdjustForParentClientOrigin( int& x
, int& y
, int sizeFlags
)
1336 if (((sizeFlags
& wxSIZE_NO_ADJUSTMENTS
) == 0) && GetParent())
1338 wxPoint
pt(GetParent()->GetClientAreaOrigin());
1344 void wxWindow::SetSize( int x
, int y
, int width
, int height
, int sizeFlags
)
1346 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1347 wxASSERT_MSG( (m_parent
!= NULL
), "wxWindow::SetSize requires parent.\n" );
1349 // Don't do anything for children of wxNotebook
1350 if (m_parent
->m_wxwindow
== NULL
) return;
1352 if (m_resizing
) return; // I don't like recursions
1355 int old_width
= m_width
;
1356 int old_height
= m_height
;
1358 if ((sizeFlags
& wxSIZE_USE_EXISTING
) == wxSIZE_USE_EXISTING
)
1360 if (x
!= -1) m_x
= x
;
1361 if (y
!= -1) m_y
= y
;
1362 if (width
!= -1) m_width
= width
;
1363 if (height
!= -1) m_height
= height
;
1373 if ((sizeFlags
& wxSIZE_AUTO_WIDTH
) == wxSIZE_AUTO_WIDTH
)
1375 if (width
== -1) m_width
= 80;
1378 if ((sizeFlags
& wxSIZE_AUTO_HEIGHT
) == wxSIZE_AUTO_HEIGHT
)
1380 if (height
== -1) m_height
= 26;
1383 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
1384 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
1385 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_minWidth
;
1386 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_minHeight
;
1388 wxPoint
pt( m_parent
->GetClientAreaOrigin() );
1389 gtk_myfixed_move( GTK_MYFIXED(m_parent
->m_wxwindow
), m_widget
, m_x
+pt
.x
, m_y
+pt
.y
);
1391 if ((old_width
!= m_width
) || (old_height
!= m_height
))
1392 gtk_widget_set_usize( m_widget
, m_width
, m_height
);
1396 wxSizeEvent
event( wxSize(m_width
,m_height
), GetId() );
1397 event
.SetEventObject( this );
1398 ProcessEvent( event
);
1403 void wxWindow::SetSize( int width
, int height
)
1405 SetSize( -1, -1, width
, height
, wxSIZE_USE_EXISTING
);
1408 void wxWindow::Move( int x
, int y
)
1410 SetSize( x
, y
, -1, -1, wxSIZE_USE_EXISTING
);
1413 void wxWindow::GetSize( int *width
, int *height
) const
1415 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1417 if (width
) (*width
) = m_width
;
1418 if (height
) (*height
) = m_height
;
1421 void wxWindow::SetClientSize( int width
, int height
)
1423 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1427 SetSize( width
, height
);
1434 if (!m_hasScrolling
)
1437 do we have sunken dialogs ?
1439 GtkStyleClass *window_class = m_wxwindow->style->klass;
1441 dw += 2 * window_class->xthickness;
1442 dh += 2 * window_class->ythickness;
1447 GtkScrolledWindow
*scroll_window
= GTK_SCROLLED_WINDOW(m_widget
);
1448 GtkScrolledWindowClass
*scroll_class
= GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget
)->klass
);
1450 GtkWidget
*viewport
= scroll_window
->viewport
;
1451 GtkStyleClass
*viewport_class
= viewport
->style
->klass
;
1453 GtkWidget
*hscrollbar
= scroll_window
->hscrollbar
;
1454 GtkWidget
*vscrollbar
= scroll_window
->vscrollbar
;
1456 if ((m_windowStyle
& wxRAISED_BORDER
) ||
1457 (m_windowStyle
& wxSUNKEN_BORDER
))
1459 dw
+= 2 * viewport_class
->xthickness
;
1460 dh
+= 2 * viewport_class
->ythickness
;
1463 if (GTK_WIDGET_VISIBLE(vscrollbar
))
1465 dw
+= vscrollbar
->allocation
.width
;
1466 dw
+= scroll_class
->scrollbar_spacing
;
1469 if (GTK_WIDGET_VISIBLE(hscrollbar
))
1471 dh
+= hscrollbar
->allocation
.height
;
1472 dw
+= scroll_class
->scrollbar_spacing
;
1476 SetSize( width
+dw
, height
+dh
);
1480 void wxWindow::GetClientSize( int *width
, int *height
) const
1482 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1486 if (width
) (*width
) = m_width
;
1487 if (height
) (*height
) = m_height
;
1494 if (!m_hasScrolling
)
1497 do we have sunken dialogs ?
1499 GtkStyleClass *window_class = m_wxwindow->style->klass;
1501 dw += 2 * window_class->xthickness;
1502 dh += 2 * window_class->ythickness;
1507 GtkScrolledWindow
*scroll_window
= GTK_SCROLLED_WINDOW(m_widget
);
1508 GtkScrolledWindowClass
*scroll_class
= GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget
)->klass
);
1510 GtkWidget
*viewport
= scroll_window
->viewport
;
1511 GtkStyleClass
*viewport_class
= viewport
->style
->klass
;
1513 GtkWidget
*hscrollbar
= scroll_window
->hscrollbar
;
1514 GtkWidget
*vscrollbar
= scroll_window
->vscrollbar
;
1516 if ((m_windowStyle
& wxRAISED_BORDER
) ||
1517 (m_windowStyle
& wxSUNKEN_BORDER
))
1519 dw
+= 2 * viewport_class
->xthickness
;
1520 dh
+= 2 * viewport_class
->ythickness
;
1523 if (GTK_WIDGET_VISIBLE(vscrollbar
))
1525 // dw += vscrollbar->allocation.width;
1526 dw
+= 15; // range.slider_width = 11 + 2*2pts edge
1527 dw
+= scroll_class
->scrollbar_spacing
;
1530 if (GTK_WIDGET_VISIBLE(hscrollbar
))
1532 // dh += hscrollbar->allocation.height;
1534 dh
+= scroll_class
->scrollbar_spacing
;
1538 if (width
) (*width
) = m_width
- dw
;
1539 if (height
) (*height
) = m_height
- dh
;
1543 void wxWindow::GetPosition( int *x
, int *y
) const
1545 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1551 void wxWindow::ClientToScreen( int *x
, int *y
)
1553 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1555 GdkWindow
*source
= (GdkWindow
*) NULL
;
1557 source
= m_wxwindow
->window
;
1559 source
= m_widget
->window
;
1563 gdk_window_get_origin( source
, &org_x
, &org_y
);
1567 if (GTK_WIDGET_NO_WINDOW (m_widget
))
1569 org_x
+= m_widget
->allocation
.x
;
1570 org_y
+= m_widget
->allocation
.y
;
1574 wxPoint
pt(GetClientAreaOrigin());
1582 void wxWindow::ScreenToClient( int *x
, int *y
)
1584 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1586 GdkWindow
*source
= (GdkWindow
*) NULL
;
1588 source
= m_wxwindow
->window
;
1590 source
= m_widget
->window
;
1594 gdk_window_get_origin( source
, &org_x
, &org_y
);
1598 if (GTK_WIDGET_NO_WINDOW (m_widget
))
1600 org_x
+= m_widget
->allocation
.x
;
1601 org_y
+= m_widget
->allocation
.y
;
1605 wxPoint
pt(GetClientAreaOrigin());
1613 void wxWindow::Centre( int direction
)
1615 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1624 m_parent
->GetSize( &p_w
, &p_h
);
1625 if (direction
& wxHORIZONTAL
== wxHORIZONTAL
) x
= (p_w
- m_width
) / 2;
1626 if (direction
& wxVERTICAL
== wxVERTICAL
) y
= (p_h
- m_height
) / 2;
1630 if (direction
& wxHORIZONTAL
== wxHORIZONTAL
) x
= (gdk_screen_width () - m_width
) / 2;
1631 if (direction
& wxVERTICAL
== wxVERTICAL
) y
= (gdk_screen_height () - m_height
) / 2;
1637 void wxWindow::Fit()
1639 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1643 wxNode
*node
= GetChildren()->First();
1646 wxWindow
*win
= (wxWindow
*)node
->Data();
1648 win
->GetPosition(&wx
, &wy
);
1649 win
->GetSize(&ww
, &wh
);
1650 if ( wx
+ ww
> maxX
)
1652 if ( wy
+ wh
> maxY
)
1655 node
= node
->Next();
1657 SetClientSize(maxX
+ 5, maxY
+ 10);
1660 void wxWindow::SetSizeHints( int minW
, int minH
, int maxW
, int maxH
, int WXUNUSED(incW
), int WXUNUSED(incH
) )
1662 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1670 void wxWindow::OnSize( wxSizeEvent
&WXUNUSED(event
) )
1672 //if (GetAutoLayout()) Layout();
1675 bool wxWindow::Show( bool show
)
1677 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1680 gtk_widget_show( m_widget
);
1682 gtk_widget_hide( m_widget
);
1687 void wxWindow::Enable( bool enable
)
1689 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1691 m_isEnabled
= enable
;
1692 gtk_widget_set_sensitive( m_widget
, enable
);
1693 if (m_wxwindow
) gtk_widget_set_sensitive( m_wxwindow
, enable
);
1696 int wxWindow::GetCharHeight() const
1698 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1702 wxFAIL_MSG( "invalid font" );
1706 GdkFont
*font
= m_font
.GetInternalFont( 1.0 );
1707 return font
->ascent
+ font
->descent
;
1710 int wxWindow::GetCharWidth() const
1712 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1716 wxFAIL_MSG( "invalid font" );
1720 GdkFont
*font
= m_font
.GetInternalFont( 1.0 );
1721 return gdk_string_width( font
, "H" );
1724 void wxWindow::GetTextExtent( const wxString
& string
, int *x
, int *y
,
1725 int *descent
, int *externalLeading
, const wxFont
*theFont
, bool WXUNUSED(use16
) ) const
1727 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1729 wxFont fontToUse
= m_font
;
1730 if (theFont
) fontToUse
= *theFont
;
1732 if (!fontToUse
.Ok())
1734 wxFAIL_MSG( "invalid font" );
1737 wxASSERT_MSG( (m_font
.Ok()), "invalid font" );
1739 GdkFont
*font
= fontToUse
.GetInternalFont( 1.0 );
1740 if (x
) (*x
) = gdk_string_width( font
, string
);
1741 if (y
) (*y
) = font
->ascent
+ font
->descent
;
1742 if (descent
) (*descent
) = font
->descent
;
1743 if (externalLeading
) (*externalLeading
) = 0; // ??
1746 void wxWindow::MakeModal( bool modal
)
1749 // Disable all other windows
1750 if (this->IsKindOf(CLASSINFO(wxDialog
)) || this->IsKindOf(CLASSINFO(wxFrame
)))
1752 wxNode
*node
= wxTopLevelWindows
.First();
1755 wxWindow
*win
= (wxWindow
*)node
->Data();
1757 win
->Enable(!modal
);
1759 node
= node
->Next();
1764 void wxWindow::SetFocus()
1766 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1768 GtkWidget
*connect_widget
= GetConnectWidget();
1771 if (GTK_WIDGET_CAN_FOCUS(connect_widget
) && !GTK_WIDGET_HAS_FOCUS (connect_widget
) )
1773 gtk_widget_grab_focus (connect_widget
);
1778 bool wxWindow::OnClose()
1783 void wxWindow::AddChild( wxWindow
*child
)
1785 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1786 wxASSERT_MSG( (child
!= NULL
), "invalid child" );
1788 m_children
.Append( child
);
1791 wxList
*wxWindow::GetChildren()
1793 return (&m_children
);
1796 void wxWindow::RemoveChild( wxWindow
*child
)
1798 if (GetChildren()) GetChildren()->DeleteObject( child
);
1799 child
->m_parent
= (wxWindow
*) NULL
;
1802 void wxWindow::SetReturnCode( int retCode
)
1804 m_retCode
= retCode
;
1807 int wxWindow::GetReturnCode()
1812 void wxWindow::Raise()
1814 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1816 if (m_widget
) gdk_window_raise( m_widget
->window
);
1819 void wxWindow::Lower()
1821 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1823 if (m_widget
) gdk_window_lower( m_widget
->window
);
1826 wxEvtHandler
*wxWindow::GetEventHandler()
1828 return m_eventHandler
;
1831 void wxWindow::SetEventHandler( wxEvtHandler
*handler
)
1833 m_eventHandler
= handler
;
1836 void wxWindow::PushEventHandler(wxEvtHandler
*handler
)
1838 handler
->SetNextHandler(GetEventHandler());
1839 SetEventHandler(handler
);
1842 wxEvtHandler
*wxWindow::PopEventHandler(bool deleteHandler
)
1844 if (GetEventHandler())
1846 wxEvtHandler
*handlerA
= GetEventHandler();
1847 wxEvtHandler
*handlerB
= handlerA
->GetNextHandler();
1848 handlerA
->SetNextHandler((wxEvtHandler
*) NULL
);
1849 SetEventHandler(handlerB
);
1853 return (wxEvtHandler
*) NULL
;
1859 return (wxEvtHandler
*) NULL
;
1862 wxValidator
*wxWindow::GetValidator()
1864 return m_windowValidator
;
1867 void wxWindow::SetValidator( const wxValidator
& validator
)
1869 if (m_windowValidator
) delete m_windowValidator
;
1870 m_windowValidator
= validator
.Clone();
1871 if (m_windowValidator
) m_windowValidator
->SetWindow(this);
1874 void wxWindow::SetClientObject( wxClientData
*data
)
1876 if (m_clientObject
) delete m_clientObject
;
1877 m_clientObject
= data
;
1880 wxClientData
*wxWindow::GetClientObject()
1882 return m_clientObject
;
1885 void wxWindow::SetClientData( void *data
)
1887 m_clientData
= data
;
1890 void *wxWindow::GetClientData()
1892 return m_clientData
;
1895 bool wxWindow::IsBeingDeleted()
1900 void wxWindow::SetId( wxWindowID id
)
1905 wxWindowID
wxWindow::GetId()
1910 void wxWindow::SetCursor( const wxCursor
&cursor
)
1912 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1914 if (m_cursor
== NULL
)
1916 wxFAIL_MSG( "wxWindow::SetCursor m_cursor == NULL" );
1917 m_cursor
= new wxCursor( wxCURSOR_ARROW
);
1922 if (*((wxCursor
*)&cursor
) == m_cursor
) return;
1927 *m_cursor
= *wxSTANDARD_CURSOR
;
1930 if ((m_widget
) && (m_widget
->window
))
1931 gdk_window_set_cursor( m_widget
->window
, m_cursor
->GetCursor() );
1933 if ((m_wxwindow
) && (m_wxwindow
->window
))
1934 gdk_window_set_cursor( m_wxwindow
->window
, m_cursor
->GetCursor() );
1937 void wxWindow::Refresh( bool eraseBackground
, const wxRect
*rect
)
1939 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
1941 if (eraseBackground
&& m_wxwindow
&& m_wxwindow
->window
)
1944 gdk_window_clear_area( m_wxwindow
->window
,
1958 GetClientSize( &w
, &h
);
1960 GdkRectangle gdk_rect
;
1964 gdk_rect
.height
= h
;
1965 gtk_widget_draw( m_wxwindow
, &gdk_rect
);
1970 GdkRectangle gdk_rect
;
1971 gdk_rect
.x
= rect
->x
;
1972 gdk_rect
.y
= rect
->y
;
1973 gdk_rect
.width
= rect
->width
;
1974 gdk_rect
.height
= rect
->height
;
1977 gtk_widget_draw( m_wxwindow
, &gdk_rect
);
1979 gtk_widget_draw( m_widget
, &gdk_rect
);
1983 wxRegion
wxWindow::GetUpdateRegion() const
1985 return m_updateRegion
;
1988 bool wxWindow::IsExposed( int x
, int y
) const
1990 return (m_updateRegion
.Contains( x
, y
) != wxOutRegion
);
1993 bool wxWindow::IsExposed( int x
, int y
, int w
, int h
) const
1995 return (m_updateRegion
.Contains( x
, y
, w
, h
) != wxOutRegion
);
1998 bool wxWindow::IsExposed( const wxPoint
& pt
) const
2000 return (m_updateRegion
.Contains( pt
.x
, pt
.y
) != wxOutRegion
);
2003 bool wxWindow::IsExposed( const wxRect
& rect
) const
2005 return (m_updateRegion
.Contains( rect
.x
, rect
.y
, rect
.width
, rect
.height
) != wxOutRegion
);
2008 void wxWindow::Clear()
2010 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2012 if (m_wxwindow
&& m_wxwindow
->window
) gdk_window_clear( m_wxwindow
->window
);
2015 wxColour
wxWindow::GetBackgroundColour() const
2017 return m_backgroundColour
;
2020 void wxWindow::SetBackgroundColour( const wxColour
&colour
)
2022 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2024 if (m_backgroundColour
== colour
) return;
2026 if (!m_backgroundColour
.Ok())
2027 if (wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE
) == colour
) return;
2029 m_backgroundColour
= colour
;
2030 if (!m_backgroundColour
.Ok()) return;
2034 GdkWindow
*window
= m_wxwindow
->window
;
2035 m_backgroundColour
.CalcPixel( gdk_window_get_colormap( window
) );
2036 gdk_window_set_background( window
, m_backgroundColour
.GetColor() );
2037 gdk_window_clear( window
);
2043 wxColour
wxWindow::GetForegroundColour() const
2045 return m_foregroundColour
;
2048 void wxWindow::SetForegroundColour( const wxColour
&colour
)
2050 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2052 if (m_foregroundColour
== colour
) return;
2054 m_foregroundColour
= colour
;
2055 if (!m_foregroundColour
.Ok()) return;
2060 GtkStyle
*wxWindow::GetWidgetStyle()
2062 if (m_widgetStyle
) gtk_style_unref( m_widgetStyle
);
2066 gtk_widget_get_style( m_widget
) );
2068 return m_widgetStyle
;
2071 void wxWindow::SetWidgetStyle()
2073 GtkStyle
*style
= GetWidgetStyle();
2075 gdk_font_unref( style
->font
);
2076 style
->font
= gdk_font_ref( m_font
.GetInternalFont( 1.0 ) );
2078 if (m_foregroundColour
.Ok())
2080 m_foregroundColour
.CalcPixel( gdk_window_get_colormap( m_widget
->window
) );
2081 style
->fg
[GTK_STATE_NORMAL
] = *m_foregroundColour
.GetColor();
2082 style
->fg
[GTK_STATE_PRELIGHT
] = *m_foregroundColour
.GetColor();
2083 style
->fg
[GTK_STATE_ACTIVE
] = *m_foregroundColour
.GetColor();
2086 if (m_backgroundColour
.Ok())
2088 m_backgroundColour
.CalcPixel( gdk_window_get_colormap( m_widget
->window
) );
2089 style
->bg
[GTK_STATE_NORMAL
] = *m_backgroundColour
.GetColor();
2090 style
->base
[GTK_STATE_NORMAL
] = *m_backgroundColour
.GetColor();
2091 style
->bg
[GTK_STATE_PRELIGHT
] = *m_backgroundColour
.GetColor();
2092 style
->base
[GTK_STATE_PRELIGHT
] = *m_backgroundColour
.GetColor();
2093 style
->bg
[GTK_STATE_ACTIVE
] = *m_backgroundColour
.GetColor();
2094 style
->base
[GTK_STATE_ACTIVE
] = *m_backgroundColour
.GetColor();
2095 style
->bg
[GTK_STATE_INSENSITIVE
] = *m_backgroundColour
.GetColor();
2096 style
->base
[GTK_STATE_INSENSITIVE
] = *m_backgroundColour
.GetColor();
2100 void wxWindow::ApplyWidgetStyle()
2104 bool wxWindow::Validate()
2106 wxCHECK_MSG( m_widget
!= NULL
, FALSE
, "invalid window" );
2108 wxNode
*node
= GetChildren()->First();
2111 wxWindow
*child
= (wxWindow
*)node
->Data();
2112 if (child
->GetValidator() && /* child->GetValidator()->Ok() && */ !child
->GetValidator()->Validate(this))
2114 node
= node
->Next();
2119 bool wxWindow::TransferDataToWindow()
2121 wxCHECK_MSG( m_widget
!= NULL
, FALSE
, "invalid window" );
2123 wxNode
*node
= GetChildren()->First();
2126 wxWindow
*child
= (wxWindow
*)node
->Data();
2127 if (child
->GetValidator() && /* child->GetValidator()->Ok() && */
2128 !child
->GetValidator()->TransferToWindow() )
2130 wxMessageBox( _("Application Error"), _("Could not transfer data to window"), wxOK
|wxICON_EXCLAMATION
);
2133 node
= node
->Next();
2138 bool wxWindow::TransferDataFromWindow()
2140 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2142 wxNode
*node
= GetChildren()->First();
2145 wxWindow
*child
= (wxWindow
*)node
->Data();
2146 if ( child
->GetValidator() && /* child->GetValidator()->Ok() && */ !child
->GetValidator()->TransferFromWindow() )
2148 node
= node
->Next();
2153 void wxWindow::SetAcceleratorTable( const wxAcceleratorTable
& accel
)
2155 m_acceleratorTable
= accel
;
2158 void wxWindow::OnInitDialog( wxInitDialogEvent
&WXUNUSED(event
) )
2160 TransferDataToWindow();
2163 void wxWindow::InitDialog()
2165 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2167 wxInitDialogEvent
event(GetId());
2168 event
.SetEventObject( this );
2169 GetEventHandler()->ProcessEvent(event
);
2172 static void SetInvokingWindow( wxMenu
*menu
, wxWindow
*win
)
2174 menu
->SetInvokingWindow( win
);
2175 wxNode
*node
= menu
->m_items
.First();
2178 wxMenuItem
*menuitem
= (wxMenuItem
*)node
->Data();
2179 if (menuitem
->IsSubMenu())
2180 SetInvokingWindow( menuitem
->GetSubMenu(), win
);
2181 node
= node
->Next();
2185 bool wxWindow::PopupMenu( wxMenu
*menu
, int WXUNUSED(x
), int WXUNUSED(y
) )
2187 wxCHECK_MSG( m_widget
!= NULL
, FALSE
, "invalid window" );
2189 wxCHECK_MSG( menu
!= NULL
, FALSE
, "invalid popup-menu" );
2191 SetInvokingWindow( menu
, this );
2193 GTK_MENU(menu
->m_menu
),
2194 (GtkWidget
*)NULL
, // parent menu shell
2195 (GtkWidget
*)NULL
, // parent menu item
2196 (GtkMenuPositionFunc
)NULL
,
2197 NULL
, // client data
2198 0, // button used to activate it
2199 0//gs_timeLastClick // the time of activation
2204 void wxWindow::SetDropTarget( wxDropTarget
*dropTarget
)
2206 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2208 GtkWidget
*dnd_widget
= GetConnectWidget();
2210 DisconnectDnDWidget( dnd_widget
);
2212 if (m_dropTarget
) delete m_dropTarget
;
2213 m_dropTarget
= dropTarget
;
2215 ConnectDnDWidget( dnd_widget
);
2218 wxDropTarget
*wxWindow::GetDropTarget() const
2220 return m_dropTarget
;
2223 void wxWindow::ConnectDnDWidget( GtkWidget
*widget
)
2225 if (!m_dropTarget
) return;
2227 m_dropTarget
->RegisterWidget( widget
);
2229 #ifdef NEW_GTK_DND_CODE
2233 gtk_signal_connect( GTK_OBJECT(widget
), "drop_data_available_event",
2234 GTK_SIGNAL_FUNC(gtk_window_drop_callback
), (gpointer
)this );
2240 void wxWindow::DisconnectDnDWidget( GtkWidget
*widget
)
2242 if (!m_dropTarget
) return;
2244 #ifdef NEW_GTK_DND_CODE
2248 gtk_signal_disconnect_by_func( GTK_OBJECT(widget
),
2249 GTK_SIGNAL_FUNC(gtk_window_drop_callback
), (gpointer
)this );
2251 m_dropTarget
->UnregisterWidget( widget
);
2257 GtkWidget
* wxWindow::GetConnectWidget()
2259 GtkWidget
*connect_widget
= m_widget
;
2260 if (m_wxwindow
) connect_widget
= m_wxwindow
;
2262 return connect_widget
;
2265 bool wxWindow::IsOwnGtkWindow( GdkWindow
*window
)
2267 if (m_wxwindow
) return (window
== m_wxwindow
->window
);
2268 return (window
== m_widget
->window
);
2271 void wxWindow::SetFont( const wxFont
&font
)
2273 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2275 if (((wxFont
*)&font
)->Ok())
2278 m_font
= *wxSWISS_FONT
;
2283 wxFont
*wxWindow::GetFont()
2288 void wxWindow::SetWindowStyleFlag( long flag
)
2290 m_windowStyle
= flag
;
2293 long wxWindow::GetWindowStyleFlag() const
2295 return m_windowStyle
;
2298 void wxWindow::CaptureMouse()
2300 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2302 wxCHECK_RET( g_capturing
== FALSE
, "CaptureMouse called twice" );
2304 GtkWidget
*connect_widget
= GetConnectWidget();
2305 gtk_grab_add( connect_widget
);
2306 gdk_pointer_grab ( connect_widget
->window
, FALSE
,
2308 (GDK_BUTTON_PRESS_MASK
|
2309 GDK_BUTTON_RELEASE_MASK
|
2310 GDK_POINTER_MOTION_MASK
),
2311 (GdkWindow
*) NULL
, (GdkCursor
*) NULL
, GDK_CURRENT_TIME
);
2315 void wxWindow::ReleaseMouse()
2317 wxCHECK_RET( m_widget
!= NULL
, "invalid window" );
2319 wxCHECK_RET( g_capturing
== TRUE
, "ReleaseMouse called twice" );
2321 GtkWidget
*connect_widget
= GetConnectWidget();
2322 gtk_grab_remove( connect_widget
);
2323 gdk_pointer_ungrab ( GDK_CURRENT_TIME
);
2324 g_capturing
= FALSE
;
2327 void wxWindow::SetTitle( const wxString
&WXUNUSED(title
) )
2331 wxString
wxWindow::GetTitle() const
2333 return (wxString
&)m_windowName
;
2336 wxString
wxWindow::GetLabel() const
2341 void wxWindow::SetName( const wxString
&name
)
2343 m_windowName
= name
;
2346 wxString
wxWindow::GetName() const
2348 return (wxString
&)m_windowName
;
2351 bool wxWindow::IsShown() const
2356 bool wxWindow::IsRetained()
2361 wxWindow
*wxWindow::FindWindow( long id
)
2363 if (id
== m_windowId
) return this;
2364 wxNode
*node
= m_children
.First();
2367 wxWindow
*child
= (wxWindow
*)node
->Data();
2368 wxWindow
*res
= child
->FindWindow( id
);
2369 if (res
) return res
;
2370 node
= node
->Next();
2372 return (wxWindow
*) NULL
;
2375 wxWindow
*wxWindow::FindWindow( const wxString
& name
)
2377 if (name
== m_windowName
) return this;
2378 wxNode
*node
= m_children
.First();
2381 wxWindow
*child
= (wxWindow
*)node
->Data();
2382 wxWindow
*res
= child
->FindWindow( name
);
2383 if (res
) return res
;
2384 node
= node
->Next();
2386 return (wxWindow
*) NULL
;
2389 void wxWindow::SetScrollbar( int orient
, int pos
, int thumbVisible
,
2390 int range
, bool refresh
)
2392 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2394 wxASSERT_MSG( (m_wxwindow
!= NULL
), "window needs client area" );
2396 if (!m_wxwindow
) return;
2398 if (orient
== wxHORIZONTAL
)
2400 float fpos
= (float)pos
;
2401 float frange
= (float)range
;
2402 float fthumb
= (float)thumbVisible
;
2404 if ((fabs(frange
-m_hAdjust
->upper
) < 0.2) &&
2405 (fabs(fthumb
-m_hAdjust
->page_size
) < 0.2))
2407 SetScrollPos( orient
, pos
, refresh
);
2411 m_oldHorizontalPos
= fpos
;
2413 m_hAdjust
->lower
= 0.0;
2414 m_hAdjust
->upper
= frange
;
2415 m_hAdjust
->value
= fpos
;
2416 m_hAdjust
->step_increment
= 1.0;
2417 m_hAdjust
->page_increment
= (float)(wxMax(fthumb
,0));
2418 m_hAdjust
->page_size
= fthumb
;
2422 float fpos
= (float)pos
;
2423 float frange
= (float)range
;
2424 float fthumb
= (float)thumbVisible
;
2426 if ((fabs(frange
-m_vAdjust
->upper
) < 0.2) &&
2427 (fabs(fthumb
-m_vAdjust
->page_size
) < 0.2))
2429 SetScrollPos( orient
, pos
, refresh
);
2433 m_oldVerticalPos
= fpos
;
2435 m_vAdjust
->lower
= 0.0;
2436 m_vAdjust
->upper
= frange
;
2437 m_vAdjust
->value
= fpos
;
2438 m_vAdjust
->step_increment
= 1.0;
2439 m_vAdjust
->page_increment
= (float)(wxMax(fthumb
,0));
2440 m_vAdjust
->page_size
= fthumb
;
2443 if (m_wxwindow
->window
)
2445 if (orient
== wxHORIZONTAL
)
2446 gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust
), "changed" );
2448 gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust
), "changed" );
2450 gtk_widget_set_usize( m_widget
, m_width
, m_height
);
2454 void wxWindow::SetScrollPos( int orient
, int pos
, bool WXUNUSED(refresh
) )
2456 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2458 wxASSERT_MSG( (m_wxwindow
!= NULL
), "window needs client area" );
2460 if (!m_wxwindow
) return;
2462 if (orient
== wxHORIZONTAL
)
2464 float fpos
= (float)pos
;
2465 m_oldHorizontalPos
= fpos
;
2467 if (fabs(fpos
-m_hAdjust
->value
) < 0.2) return;
2468 m_hAdjust
->value
= fpos
;
2472 float fpos
= (float)pos
;
2473 m_oldVerticalPos
= fpos
;
2474 if (fabs(fpos
-m_vAdjust
->value
) < 0.2) return;
2475 m_vAdjust
->value
= fpos
;
2480 if (m_wxwindow
->window
)
2482 if (orient
== wxHORIZONTAL
)
2483 gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust
), "value_changed" );
2485 gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust
), "value_changed" );
2490 int wxWindow::GetScrollThumb( int orient
) const
2492 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2494 wxASSERT_MSG( (m_wxwindow
!= NULL
), "window needs client area" );
2496 if (!m_wxwindow
) return 0;
2498 if (orient
== wxHORIZONTAL
)
2499 return (int)(m_hAdjust
->page_size
+0.5);
2501 return (int)(m_vAdjust
->page_size
+0.5);
2504 int wxWindow::GetScrollPos( int orient
) const
2506 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2508 wxASSERT_MSG( (m_wxwindow
!= NULL
), "window needs client area" );
2510 if (!m_wxwindow
) return 0;
2512 if (orient
== wxHORIZONTAL
)
2513 return (int)(m_hAdjust
->value
+0.5);
2515 return (int)(m_vAdjust
->value
+0.5);
2518 int wxWindow::GetScrollRange( int orient
) const
2520 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2522 wxASSERT_MSG( (m_wxwindow
!= NULL
), "window needs client area" );
2524 if (!m_wxwindow
) return 0;
2526 if (orient
== wxHORIZONTAL
)
2527 return (int)(m_hAdjust
->upper
+0.5);
2529 return (int)(m_vAdjust
->upper
+0.5);
2532 void wxWindow::ScrollWindow( int dx
, int dy
, const wxRect
* WXUNUSED(rect
) )
2534 wxASSERT_MSG( (m_widget
!= NULL
), "invalid window" );
2536 wxASSERT_MSG( (m_wxwindow
!= NULL
), "window needs client area" );
2538 if (!m_wxwindow
) return;
2542 GetClientSize( &cw
, &ch
);
2544 int w
= cw
- abs(dx
);
2545 int h
= ch
- abs(dy
);
2546 if ((h
< 0) || (w
< 0))
2553 if (dx
< 0) s_x
= -dx
;
2554 if (dy
< 0) s_y
= -dy
;
2557 if (dx
> 0) d_x
= dx
;
2558 if (dy
> 0) d_y
= dy
;
2562 m_scrollGC
= gdk_gc_new( m_wxwindow
->window
);
2563 gdk_gc_set_exposures( m_scrollGC
, TRUE
);
2566 gdk_window_copy_area( m_wxwindow
->window
, m_scrollGC
, d_x
, d_y
,
2567 m_wxwindow
->window
, s_x
, s_y
, w
, h
);
2570 if (dx
< 0) rect
.x
= cw
+dx
; else rect
.x
= 0;
2571 if (dy
< 0) rect
.y
= ch
+dy
; else rect
.y
= 0;
2572 if (dy
!= 0) rect
.width
= cw
; else rect
.width
= abs(dx
);
2573 if (dx
!= 0) rect
.height
= ch
; else rect
.height
= abs(dy
);
2575 Refresh( TRUE
, &rect
);
2578 //-------------------------------------------------------------------------------------
2580 //-------------------------------------------------------------------------------------
2582 wxLayoutConstraints
*wxWindow::GetConstraints() const
2584 return m_constraints
;
2587 void wxWindow::SetConstraints( wxLayoutConstraints
*constraints
)
2591 UnsetConstraints(m_constraints
);
2592 delete m_constraints
;
2594 m_constraints
= constraints
;
2597 // Make sure other windows know they're part of a 'meaningful relationship'
2598 if (m_constraints
->left
.GetOtherWindow() && (m_constraints
->left
.GetOtherWindow() != this))
2599 m_constraints
->left
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2600 if (m_constraints
->top
.GetOtherWindow() && (m_constraints
->top
.GetOtherWindow() != this))
2601 m_constraints
->top
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2602 if (m_constraints
->right
.GetOtherWindow() && (m_constraints
->right
.GetOtherWindow() != this))
2603 m_constraints
->right
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2604 if (m_constraints
->bottom
.GetOtherWindow() && (m_constraints
->bottom
.GetOtherWindow() != this))
2605 m_constraints
->bottom
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2606 if (m_constraints
->width
.GetOtherWindow() && (m_constraints
->width
.GetOtherWindow() != this))
2607 m_constraints
->width
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2608 if (m_constraints
->height
.GetOtherWindow() && (m_constraints
->height
.GetOtherWindow() != this))
2609 m_constraints
->height
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2610 if (m_constraints
->centreX
.GetOtherWindow() && (m_constraints
->centreX
.GetOtherWindow() != this))
2611 m_constraints
->centreX
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2612 if (m_constraints
->centreY
.GetOtherWindow() && (m_constraints
->centreY
.GetOtherWindow() != this))
2613 m_constraints
->centreY
.GetOtherWindow()->AddConstraintReference((wxWindow
*)this);
2619 void wxWindow::SetAutoLayout( bool autoLayout
)
2621 m_autoLayout
= autoLayout
;
2624 bool wxWindow::GetAutoLayout() const
2626 return m_autoLayout
;
2629 wxSizer
*wxWindow::GetSizer() const
2631 return m_windowSizer
;
2634 void wxWindow::SetSizerParent( wxWindow
*win
)
2636 m_sizerParent
= win
;
2639 wxWindow
*wxWindow::GetSizerParent() const
2641 return m_sizerParent
;
2644 // This removes any dangling pointers to this window
2645 // in other windows' constraintsInvolvedIn lists.
2646 void wxWindow::UnsetConstraints(wxLayoutConstraints
*c
)
2650 if (c
->left
.GetOtherWindow() && (c
->top
.GetOtherWindow() != this))
2651 c
->left
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2652 if (c
->top
.GetOtherWindow() && (c
->top
.GetOtherWindow() != this))
2653 c
->top
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2654 if (c
->right
.GetOtherWindow() && (c
->right
.GetOtherWindow() != this))
2655 c
->right
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2656 if (c
->bottom
.GetOtherWindow() && (c
->bottom
.GetOtherWindow() != this))
2657 c
->bottom
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2658 if (c
->width
.GetOtherWindow() && (c
->width
.GetOtherWindow() != this))
2659 c
->width
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2660 if (c
->height
.GetOtherWindow() && (c
->height
.GetOtherWindow() != this))
2661 c
->height
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2662 if (c
->centreX
.GetOtherWindow() && (c
->centreX
.GetOtherWindow() != this))
2663 c
->centreX
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2664 if (c
->centreY
.GetOtherWindow() && (c
->centreY
.GetOtherWindow() != this))
2665 c
->centreY
.GetOtherWindow()->RemoveConstraintReference((wxWindow
*)this);
2669 // Back-pointer to other windows we're involved with, so if we delete
2670 // this window, we must delete any constraints we're involved with.
2671 void wxWindow::AddConstraintReference(wxWindow
*otherWin
)
2673 if (!m_constraintsInvolvedIn
)
2674 m_constraintsInvolvedIn
= new wxList
;
2675 if (!m_constraintsInvolvedIn
->Member(otherWin
))
2676 m_constraintsInvolvedIn
->Append(otherWin
);
2679 // REMOVE back-pointer to other windows we're involved with.
2680 void wxWindow::RemoveConstraintReference(wxWindow
*otherWin
)
2682 if (m_constraintsInvolvedIn
)
2683 m_constraintsInvolvedIn
->DeleteObject(otherWin
);
2686 // Reset any constraints that mention this window
2687 void wxWindow::DeleteRelatedConstraints()
2689 if (m_constraintsInvolvedIn
)
2691 wxNode
*node
= m_constraintsInvolvedIn
->First();
2694 wxWindow
*win
= (wxWindow
*)node
->Data();
2695 wxNode
*next
= node
->Next();
2696 wxLayoutConstraints
*constr
= win
->GetConstraints();
2698 // Reset any constraints involving this window
2701 constr
->left
.ResetIfWin((wxWindow
*)this);
2702 constr
->top
.ResetIfWin((wxWindow
*)this);
2703 constr
->right
.ResetIfWin((wxWindow
*)this);
2704 constr
->bottom
.ResetIfWin((wxWindow
*)this);
2705 constr
->width
.ResetIfWin((wxWindow
*)this);
2706 constr
->height
.ResetIfWin((wxWindow
*)this);
2707 constr
->centreX
.ResetIfWin((wxWindow
*)this);
2708 constr
->centreY
.ResetIfWin((wxWindow
*)this);
2713 delete m_constraintsInvolvedIn
;
2714 m_constraintsInvolvedIn
= (wxList
*) NULL
;
2718 void wxWindow::SetSizer(wxSizer
*sizer
)
2720 m_windowSizer
= sizer
;
2722 sizer
->SetSizerParent((wxWindow
*)this);
2729 bool wxWindow::Layout()
2731 if (GetConstraints())
2734 GetClientSize(&w
, &h
);
2735 GetConstraints()->width
.SetValue(w
);
2736 GetConstraints()->height
.SetValue(h
);
2739 // If top level (one sizer), evaluate the sizer's constraints.
2743 GetSizer()->ResetConstraints(); // Mark all constraints as unevaluated
2744 GetSizer()->LayoutPhase1(&noChanges
);
2745 GetSizer()->LayoutPhase2(&noChanges
);
2746 GetSizer()->SetConstraintSizes(); // Recursively set the real window sizes
2751 // Otherwise, evaluate child constraints
2752 ResetConstraints(); // Mark all constraints as unevaluated
2753 DoPhase(1); // Just one phase need if no sizers involved
2755 SetConstraintSizes(); // Recursively set the real window sizes
2761 // Do a phase of evaluating constraints:
2762 // the default behaviour. wxSizers may do a similar
2763 // thing, but also impose their own 'constraints'
2764 // and order the evaluation differently.
2765 bool wxWindow::LayoutPhase1(int *noChanges
)
2767 wxLayoutConstraints
*constr
= GetConstraints();
2770 return constr
->SatisfyConstraints((wxWindow
*)this, noChanges
);
2776 bool wxWindow::LayoutPhase2(int *noChanges
)
2786 // Do a phase of evaluating child constraints
2787 bool wxWindow::DoPhase(int phase
)
2789 int noIterations
= 0;
2790 int maxIterations
= 500;
2794 while ((noChanges
> 0) && (noIterations
< maxIterations
))
2798 wxNode
*node
= GetChildren()->First();
2801 wxWindow
*child
= (wxWindow
*)node
->Data();
2802 if (!child
->IsKindOf(CLASSINFO(wxFrame
)) && !child
->IsKindOf(CLASSINFO(wxDialog
)))
2804 wxLayoutConstraints
*constr
= child
->GetConstraints();
2807 if (succeeded
.Member(child
))
2812 int tempNoChanges
= 0;
2813 bool success
= ( (phase
== 1) ? child
->LayoutPhase1(&tempNoChanges
) : child
->LayoutPhase2(&tempNoChanges
) ) ;
2814 noChanges
+= tempNoChanges
;
2817 succeeded
.Append(child
);
2822 node
= node
->Next();
2829 void wxWindow::ResetConstraints()
2831 wxLayoutConstraints
*constr
= GetConstraints();
2834 constr
->left
.SetDone(FALSE
);
2835 constr
->top
.SetDone(FALSE
);
2836 constr
->right
.SetDone(FALSE
);
2837 constr
->bottom
.SetDone(FALSE
);
2838 constr
->width
.SetDone(FALSE
);
2839 constr
->height
.SetDone(FALSE
);
2840 constr
->centreX
.SetDone(FALSE
);
2841 constr
->centreY
.SetDone(FALSE
);
2843 wxNode
*node
= GetChildren()->First();
2846 wxWindow
*win
= (wxWindow
*)node
->Data();
2847 if (!win
->IsKindOf(CLASSINFO(wxFrame
)) && !win
->IsKindOf(CLASSINFO(wxDialog
)))
2848 win
->ResetConstraints();
2849 node
= node
->Next();
2853 // Need to distinguish between setting the 'fake' size for
2854 // windows and sizers, and setting the real values.
2855 void wxWindow::SetConstraintSizes(bool recurse
)
2857 wxLayoutConstraints
*constr
= GetConstraints();
2858 if (constr
&& constr
->left
.GetDone() && constr
->right
.GetDone() &&
2859 constr
->width
.GetDone() && constr
->height
.GetDone())
2861 int x
= constr
->left
.GetValue();
2862 int y
= constr
->top
.GetValue();
2863 int w
= constr
->width
.GetValue();
2864 int h
= constr
->height
.GetValue();
2866 // If we don't want to resize this window, just move it...
2867 if ((constr
->width
.GetRelationship() != wxAsIs
) ||
2868 (constr
->height
.GetRelationship() != wxAsIs
))
2870 // Calls Layout() recursively. AAAGH. How can we stop that.
2871 // Simply take Layout() out of non-top level OnSizes.
2872 SizerSetSize(x
, y
, w
, h
);
2881 char *windowClass
= this->GetClassInfo()->GetClassName();
2884 if (GetName() == "")
2885 winName
= _("unnamed");
2887 winName
= GetName();
2888 wxDebugMsg(_("Constraint(s) not satisfied for window of type %s, name %s:\n"), (const char *)windowClass
, (const char *)winName
);
2889 if (!constr
->left
.GetDone())
2890 wxDebugMsg(_(" unsatisfied 'left' constraint.\n"));
2891 if (!constr
->right
.GetDone())
2892 wxDebugMsg(_(" unsatisfied 'right' constraint.\n"));
2893 if (!constr
->width
.GetDone())
2894 wxDebugMsg(_(" unsatisfied 'width' constraint.\n"));
2895 if (!constr
->height
.GetDone())
2896 wxDebugMsg(_(" unsatisfied 'height' constraint.\n"));
2897 wxDebugMsg(_("Please check constraints: try adding AsIs() constraints.\n"));
2902 wxNode
*node
= GetChildren()->First();
2905 wxWindow
*win
= (wxWindow
*)node
->Data();
2906 if (!win
->IsKindOf(CLASSINFO(wxFrame
)) && !win
->IsKindOf(CLASSINFO(wxDialog
)))
2907 win
->SetConstraintSizes();
2908 node
= node
->Next();
2913 // This assumes that all sizers are 'on' the same
2914 // window, i.e. the parent of this window.
2915 void wxWindow::TransformSizerToActual(int *x
, int *y
) const
2917 if (!m_sizerParent
|| m_sizerParent
->IsKindOf(CLASSINFO(wxDialog
)) ||
2918 m_sizerParent
->IsKindOf(CLASSINFO(wxFrame
)) )
2922 m_sizerParent
->GetPosition(&xp
, &yp
);
2923 m_sizerParent
->TransformSizerToActual(&xp
, &yp
);
2928 void wxWindow::SizerSetSize(int x
, int y
, int w
, int h
)
2932 TransformSizerToActual(&xx
, &yy
);
2933 SetSize(xx
, yy
, w
, h
);
2936 void wxWindow::SizerMove(int x
, int y
)
2940 TransformSizerToActual(&xx
, &yy
);
2944 // Only set the size/position of the constraint (if any)
2945 void wxWindow::SetSizeConstraint(int x
, int y
, int w
, int h
)
2947 wxLayoutConstraints
*constr
= GetConstraints();
2952 constr
->left
.SetValue(x
);
2953 constr
->left
.SetDone(TRUE
);
2957 constr
->top
.SetValue(y
);
2958 constr
->top
.SetDone(TRUE
);
2962 constr
->width
.SetValue(w
);
2963 constr
->width
.SetDone(TRUE
);
2967 constr
->height
.SetValue(h
);
2968 constr
->height
.SetDone(TRUE
);
2973 void wxWindow::MoveConstraint(int x
, int y
)
2975 wxLayoutConstraints
*constr
= GetConstraints();
2980 constr
->left
.SetValue(x
);
2981 constr
->left
.SetDone(TRUE
);
2985 constr
->top
.SetValue(y
);
2986 constr
->top
.SetDone(TRUE
);
2991 void wxWindow::GetSizeConstraint(int *w
, int *h
) const
2993 wxLayoutConstraints
*constr
= GetConstraints();
2996 *w
= constr
->width
.GetValue();
2997 *h
= constr
->height
.GetValue();
3003 void wxWindow::GetClientSizeConstraint(int *w
, int *h
) const
3005 wxLayoutConstraints
*constr
= GetConstraints();
3008 *w
= constr
->width
.GetValue();
3009 *h
= constr
->height
.GetValue();
3012 GetClientSize(w
, h
);
3015 void wxWindow::GetPositionConstraint(int *x
, int *y
) const
3017 wxLayoutConstraints
*constr
= GetConstraints();
3020 *x
= constr
->left
.GetValue();
3021 *y
= constr
->top
.GetValue();
3027 bool wxWindow::AcceptsFocus() const
3029 return IsEnabled() && IsShown();
3032 void wxWindow::OnIdle(wxIdleEvent
& WXUNUSED(event
) )