]> git.saurik.com Git - wxWidgets.git/blame - src/gtk/frame.cpp
Minor corrections to new theme code.
[wxWidgets.git] / src / gtk / frame.cpp
CommitLineData
c801d85f
KB
1/////////////////////////////////////////////////////////////////////////////
2// Name: frame.cpp
3// Purpose:
4// Author: Robert Roebling
a81258be 5// Id: $Id$
01111366 6// Copyright: (c) 1998 Robert Roebling
19717c50 7// Licence: wxWindows licence
c801d85f
KB
8/////////////////////////////////////////////////////////////////////////////
9
7c0ea335
VZ
10// ============================================================================
11// declarations
12// ============================================================================
13
14// ----------------------------------------------------------------------------
15// headers
16// ----------------------------------------------------------------------------
17
c801d85f 18#ifdef __GNUG__
fe4e9e6c 19 #pragma implementation "frame.h"
c801d85f
KB
20#endif
21
d02af7bb
JJ
22#ifdef __VMS
23#define XIconifyWindow XICONIFYWINDOW
24#endif
25
c801d85f
KB
26#include "wx/frame.h"
27#include "wx/dialog.h"
28#include "wx/control.h"
29#include "wx/app.h"
cf4219e7 30#include "wx/menu.h"
dcf924a3 31#if wxUSE_TOOLBAR
7c0ea335 32 #include "wx/toolbar.h"
dcf924a3
RR
33#endif
34#if wxUSE_STATUSBAR
7c0ea335 35 #include "wx/statusbr.h"
dcf924a3 36#endif
362c6693 37#include "wx/dcclient.h"
83624f79 38
55703c91
RR
39#include <glib.h>
40#include <gdk/gdk.h>
41#include <gtk/gtk.h>
42#include <gdk/gdkkeysyms.h>
43#include <gdk/gdkx.h>
44
c801d85f
KB
45#include "wx/gtk/win_gtk.h"
46
7c0ea335 47// ----------------------------------------------------------------------------
2f2aa628 48// constants
7c0ea335 49// ----------------------------------------------------------------------------
2f2aa628 50
907789a0 51const int wxMENU_HEIGHT = 27;
c67daf87 52const int wxSTATUS_HEIGHT = 25;
41ca191f 53const int wxPLACE_HOLDER = 0;
c801d85f 54
7c0ea335 55// ----------------------------------------------------------------------------
acfd422a 56// idle system
7c0ea335 57// ----------------------------------------------------------------------------
acfd422a
RR
58
59extern void wxapp_install_idle_handler();
60extern bool g_isIdle;
2d68e1b4 61extern int g_openDialogs;
acfd422a 62
7c0ea335
VZ
63// ----------------------------------------------------------------------------
64// event tables
65// ----------------------------------------------------------------------------
66
67IMPLEMENT_DYNAMIC_CLASS(wxFrame,wxWindow)
68
69// ----------------------------------------------------------------------------
2f2aa628 70// data
7c0ea335 71// ----------------------------------------------------------------------------
2f2aa628 72
c801d85f
KB
73extern wxList wxPendingDelete;
74
7c0ea335 75// ----------------------------------------------------------------------------
2e563988 76// debug
7c0ea335 77// ----------------------------------------------------------------------------
2e563988
RR
78
79#ifdef __WXDEBUG__
80
81extern void debug_focus_in( GtkWidget* widget, const wxChar* name, const wxChar *window );
82
83#endif
84
7c0ea335
VZ
85// ============================================================================
86// implementation
87// ============================================================================
88
89// ----------------------------------------------------------------------------
90// GTK callbacks
91// ----------------------------------------------------------------------------
92
69ffe1d2
RR
93//-----------------------------------------------------------------------------
94// "focus" from m_window
95//-----------------------------------------------------------------------------
96
97static gint gtk_frame_focus_callback( GtkWidget *widget, GtkDirectionType WXUNUSED(d), wxWindow *WXUNUSED(win) )
98{
99 if (g_isIdle)
100 wxapp_install_idle_handler();
101
102 // This disables GTK's tab traversal
103 gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus" );
104 return TRUE;
105}
106
c801d85f 107//-----------------------------------------------------------------------------
2f2aa628 108// "size_allocate"
c801d85f 109//-----------------------------------------------------------------------------
c801d85f 110
2f2aa628 111static void gtk_frame_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxFrame *win )
ed7a557b 112{
88ac883a 113 if (g_isIdle)
121a3581 114 wxapp_install_idle_handler();
acfd422a 115
54517652
RR
116 if (!win->m_hasVMT)
117 return;
8bbe427f 118
121a3581
RR
119 if ((win->m_width != alloc->width) || (win->m_height != alloc->height))
120 {
54517652
RR
121/*
122 wxPrintf( "OnSize from " );
123 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
124 wxPrintf( win->GetClassInfo()->GetClassName() );
125 wxPrintf( " %d %d %d %d\n", (int)alloc->x,
126 (int)alloc->y,
127 (int)alloc->width,
128 (int)alloc->height );
129*/
7beba2fc 130
121a3581
RR
131 win->m_width = alloc->width;
132 win->m_height = alloc->height;
8cb9f0d0 133 win->m_queuedFullRedraw = TRUE;
5b8a521e 134 win->GtkUpdateSize();
121a3581 135 }
362c6693 136}
c801d85f
KB
137
138//-----------------------------------------------------------------------------
2f2aa628
RR
139// "delete_event"
140//-----------------------------------------------------------------------------
c801d85f 141
2f2aa628 142static gint gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxFrame *win )
ed7a557b 143{
88ac883a 144 if (g_isIdle)
121a3581 145 wxapp_install_idle_handler();
ed7a557b 146
a56fcaaf 147 if ((g_openDialogs == 0) && (win->IsEnabled()))
2d68e1b4 148 win->Close();
c801d85f 149
fb1585ae 150 return TRUE;
362c6693 151}
c801d85f 152
16bcc879
RR
153//-----------------------------------------------------------------------------
154// "child_attached" of menu bar
155//-----------------------------------------------------------------------------
156
157static void gtk_menu_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
158{
a2053b27 159 if (!win->m_hasVMT) return;
88ac883a 160
16bcc879 161 win->m_menuBarDetached = FALSE;
5b8a521e 162 win->GtkUpdateSize();
16bcc879
RR
163}
164
165//-----------------------------------------------------------------------------
166// "child_detached" of menu bar
167//-----------------------------------------------------------------------------
168
169static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
170{
a2053b27 171 if (!win->m_hasVMT) return;
88ac883a 172
16bcc879 173 win->m_menuBarDetached = TRUE;
5b8a521e 174 win->GtkUpdateSize();
16bcc879
RR
175}
176
88ac883a 177#if wxUSE_TOOLBAR
16bcc879
RR
178//-----------------------------------------------------------------------------
179// "child_attached" of tool bar
180//-----------------------------------------------------------------------------
181
182static void gtk_toolbar_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
183{
a2053b27 184 if (!win->m_hasVMT) return;
88ac883a 185
16bcc879 186 win->m_toolBarDetached = FALSE;
88ac883a 187
5b8a521e 188 win->GtkUpdateSize();
16bcc879
RR
189}
190
191//-----------------------------------------------------------------------------
192// "child_detached" of tool bar
193//-----------------------------------------------------------------------------
194
5e0201ea 195static void gtk_toolbar_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
16bcc879 196{
88ac883a 197 if (g_isIdle)
801aa178 198 wxapp_install_idle_handler();
acfd422a 199
a2053b27 200 if (!win->m_hasVMT) return;
88ac883a 201
16bcc879 202 win->m_toolBarDetached = TRUE;
5b8a521e 203 win->GtkUpdateSize();
16bcc879 204}
88ac883a 205#endif // wxUSE_TOOLBAR
16bcc879 206
47908e25 207//-----------------------------------------------------------------------------
2f2aa628
RR
208// "configure_event"
209//-----------------------------------------------------------------------------
47908e25 210
7beba2fc 211static gint
2d68e1b4 212#if (GTK_MINOR_VERSION > 0)
c693edf3
RR
213gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WXUNUSED(event), wxFrame *win )
214#else
215gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxFrame *win )
216#endif
47908e25 217{
7beba2fc 218 if (g_isIdle)
121a3581 219 wxapp_install_idle_handler();
acfd422a 220
7c0ea335 221 if (!win->m_hasVMT)
2d68e1b4 222 return FALSE;
f6bcfd97 223
2d68e1b4 224#if (GTK_MINOR_VERSION > 0)
dfc3d7e0
RR
225 int x = 0;
226 int y = 0;
227 gdk_window_get_root_origin( win->m_widget->window, &x, &y );
dfc3d7e0
RR
228 win->m_x = x;
229 win->m_y = y;
c693edf3
RR
230#else
231 win->m_x = event->x;
232 win->m_y = event->y;
233#endif
8bbe427f 234
a2053b27 235 wxMoveEvent mevent( wxPoint(win->m_x,win->m_y), win->GetId() );
36b3b54a
RR
236 mevent.SetEventObject( win );
237 win->GetEventHandler()->ProcessEvent( mevent );
238
fb1585ae 239 return FALSE;
362c6693 240}
47908e25 241
2b07d713
RR
242//-----------------------------------------------------------------------------
243// "realize" from m_widget
244//-----------------------------------------------------------------------------
245
88ac883a 246/* we cannot MWM hints and icons before the widget has been realized,
2b07d713
RR
247 so we do this directly after realization */
248
43f5c493 249static void
f6bcfd97 250gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxFrame *win )
2b07d713 251{
88ac883a 252 if (g_isIdle)
121a3581 253 wxapp_install_idle_handler();
acfd422a 254
84eacd30 255 if ((win->m_miniEdge > 0) || (win->HasFlag(wxSIMPLE_BORDER)) || (win->HasFlag(wxNO_BORDER)))
15b24b14 256 {
80629c8b 257 /* This is a mini-frame or a borderless frame. */
81855216
RR
258 gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)0 );
259 gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)0 );
15b24b14 260 }
81855216 261 else
aa64626e 262 {
81855216
RR
263 /* All this is for Motif Window Manager "hints" and is supposed to be
264 recognized by other WM as well. Not tested. */
265 long decor = (long) GDK_DECOR_BORDER;
266 long func = (long) GDK_FUNC_MOVE;
267
268 if ((win->GetWindowStyle() & wxCAPTION) != 0)
269 decor |= GDK_DECOR_TITLE;
270 if ((win->GetWindowStyle() & wxSYSTEM_MENU) != 0)
271 {
272 decor |= GDK_DECOR_MENU;
273 func |= GDK_FUNC_CLOSE;
274 }
275 if ((win->GetWindowStyle() & wxMINIMIZE_BOX) != 0)
276 {
277 func |= GDK_FUNC_MINIMIZE;
278 decor |= GDK_DECOR_MINIMIZE;
279 }
280 if ((win->GetWindowStyle() & wxMAXIMIZE_BOX) != 0)
281 {
282 func |= GDK_FUNC_MAXIMIZE;
283 decor |= GDK_DECOR_MAXIMIZE;
284 }
285 if ((win->GetWindowStyle() & wxRESIZE_BORDER) != 0)
286 {
287 func |= GDK_FUNC_RESIZE;
288 decor |= GDK_DECOR_RESIZEH;
289 }
f6bcfd97 290
81855216
RR
291 gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)decor);
292 gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)func);
aa64626e
KB
293 }
294
2b07d713 295 /* GTK's shrinking/growing policy */
f03fc89f 296 if ((win->GetWindowStyle() & wxRESIZE_BORDER) == 0)
a2053b27 297 gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1);
2b07d713 298 else
a2053b27 299 gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
88ac883a 300
58dea4b0 301 /* reset the icon */
7c0ea335
VZ
302 wxIcon iconOld = win->GetIcon();
303 if ( iconOld != wxNullIcon )
58dea4b0 304 {
7c0ea335
VZ
305 wxIcon icon( iconOld );
306 win->SetIcon( wxNullIcon );
f03fc89f 307 win->SetIcon( icon );
58dea4b0 308 }
88ac883a 309
2e563988
RR
310 /* we set the focus to the child that accepts the focus. this
311 doesn't really have to be done in "realize" but why not? */
f03fc89f 312 wxWindowList::Node *node = win->GetChildren().GetFirst();
2e563988
RR
313 while (node)
314 {
f03fc89f
VZ
315 wxWindow *child = node->GetData();
316 if (child->AcceptsFocus())
317 {
318 child->SetFocus();
319 break;
320 }
88ac883a 321
f03fc89f 322 node = node->GetNext();
2e563988 323 }
43f5c493 324}
88ac883a 325
43f5c493
RR
326//-----------------------------------------------------------------------------
327// "map_event" from m_widget
328//-----------------------------------------------------------------------------
329
330static void
c0f09a2e
VZ
331gtk_frame_map_callback( GtkWidget * WXUNUSED(widget),
332 GdkEvent * WXUNUSED(event),
333 wxFrame *win )
43f5c493
RR
334{
335 win->m_isIconized = FALSE;
336}
337
338//-----------------------------------------------------------------------------
339// "unmap_event" from m_widget
340//-----------------------------------------------------------------------------
341
342static void
c0f09a2e
VZ
343gtk_frame_unmap_callback( GtkWidget * WXUNUSED(widget),
344 GdkEvent * WXUNUSED(event),
345 wxFrame *win )
43f5c493
RR
346{
347 win->m_isIconized = TRUE;
227e5e99 348}
88ac883a 349
117247fd
RR
350//-----------------------------------------------------------------------------
351// "expose_event" of m_client
352//-----------------------------------------------------------------------------
353
354static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxWindow *win )
355{
356 GtkPizza *pizza = GTK_PIZZA(widget);
357
358 gtk_paint_flat_box (win->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL,
359 GTK_SHADOW_NONE, &gdk_event->area, win->m_widget, "base", 0, 0, -1, -1);
360
361 return TRUE;
362}
363
364//-----------------------------------------------------------------------------
365// "draw" of m_client
366//-----------------------------------------------------------------------------
367
368
369static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxWindow *win )
370{
371 GtkPizza *pizza = GTK_PIZZA(widget);
372
373 gtk_paint_flat_box (win->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL,
374 GTK_SHADOW_NONE, rect, win->m_widget, "base", 0, 0, -1, -1);
375}
376
7c0ea335
VZ
377// ----------------------------------------------------------------------------
378// wxFrame itself
379// ----------------------------------------------------------------------------
380
f362b96d
RR
381//-----------------------------------------------------------------------------
382// InsertChild for wxFrame
383//-----------------------------------------------------------------------------
384
385/* Callback for wxFrame. This very strange beast has to be used because
386 * C++ has no virtual methods in a constructor. We have to emulate a
387 * virtual function here as wxWindows requires different ways to insert
388 * a child in container classes. */
389
6bc8a1c8 390static void wxInsertChildInFrame( wxFrame* parent, wxWindow* child )
f362b96d 391{
5fd11f09 392 wxASSERT( GTK_IS_WIDGET(child->m_widget) );
7beba2fc 393
6bc8a1c8 394 if (!parent->m_insertInClientArea)
f362b96d
RR
395 {
396 /* these are outside the client area */
f03fc89f 397 wxFrame* frame = (wxFrame*) parent;
da048e3d 398 gtk_pizza_put( GTK_PIZZA(frame->m_mainWidget),
a2053b27
RR
399 GTK_WIDGET(child->m_widget),
400 child->m_x,
401 child->m_y,
402 child->m_width,
403 child->m_height );
88ac883a 404
caf51f95 405#if wxUSE_TOOLBAR_NATIVE
f03fc89f
VZ
406 /* we connect to these events for recalculating the client area
407 space when the toolbar is floating */
408 if (wxIS_KIND_OF(child,wxToolBar))
409 {
410 wxToolBar *toolBar = (wxToolBar*) child;
411 if (toolBar->GetWindowStyle() & wxTB_DOCKABLE)
412 {
a2053b27 413 gtk_signal_connect( GTK_OBJECT(toolBar->m_widget), "child_attached",
41ca191f 414 GTK_SIGNAL_FUNC(gtk_toolbar_attached_callback), (gpointer)parent );
88ac883a 415
a2053b27 416 gtk_signal_connect( GTK_OBJECT(toolBar->m_widget), "child_detached",
41ca191f 417 GTK_SIGNAL_FUNC(gtk_toolbar_detached_callback), (gpointer)parent );
f03fc89f
VZ
418 }
419 }
88ac883a 420#endif // wxUSE_TOOLBAR
f362b96d
RR
421 }
422 else
423 {
424 /* these are inside the client area */
da048e3d 425 gtk_pizza_put( GTK_PIZZA(parent->m_wxwindow),
a2053b27
RR
426 GTK_WIDGET(child->m_widget),
427 child->m_x,
428 child->m_y,
429 child->m_width,
430 child->m_height );
f362b96d
RR
431 }
432
f362b96d 433 /* resize on OnInternalIdle */
5b8a521e 434 parent->GtkUpdateSize();
f362b96d
RR
435}
436
7c0ea335
VZ
437// ----------------------------------------------------------------------------
438// wxFrame creation
439// ----------------------------------------------------------------------------
c801d85f 440
ddb6bc71 441void wxFrame::Init()
c801d85f 442{
fb1585ae 443 m_sizeSet = FALSE;
b2b3ccc5
RR
444 m_miniEdge = 0;
445 m_miniTitle = 0;
ab2b3dd4 446 m_mainWidget = (GtkWidget*) NULL;
16bcc879
RR
447 m_menuBarDetached = FALSE;
448 m_toolBarDetached = FALSE;
6bc8a1c8 449 m_insertInClientArea = TRUE;
43f5c493
RR
450 m_isIconized = FALSE;
451 m_fsIsShowing = FALSE;
a2d93e73 452 m_themeEnabled = TRUE;
362c6693 453}
c801d85f 454
7c0ea335
VZ
455bool wxFrame::Create( wxWindow *parent,
456 wxWindowID id,
457 const wxString &title,
458 const wxPoint &pos,
459 const wxSize &size,
460 long style,
461 const wxString &name )
c801d85f 462{
a802c3a1 463 wxTopLevelWindows.Append( this );
8bbe427f 464
fb1585ae 465 m_needParent = FALSE;
ed7a557b 466
4dcaf11a
RR
467 if (!PreCreation( parent, pos, size ) ||
468 !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
469 {
223d09f6 470 wxFAIL_MSG( wxT("wxFrame creation failed") );
7beba2fc 471 return FALSE;
4dcaf11a 472 }
c801d85f 473
fb1585ae 474 m_title = title;
88ac883a 475
6bc8a1c8 476 m_insertCallback = (wxInsertChildFunction) wxInsertChildInFrame;
ed7a557b 477
faecf4cb 478 GtkWindowType win_type = GTK_WINDOW_TOPLEVEL;
343e14b3
RR
479
480 if (style & wxFRAME_TOOL_WINDOW)
481 win_type = GTK_WINDOW_POPUP;
8bbe427f 482
fb1585ae 483 m_widget = gtk_window_new( win_type );
88ac883a 484
80629c8b
RR
485 if ((m_parent) && (HasFlag(wxFRAME_FLOAT_ON_PARENT)) && (GTK_IS_WINDOW(m_parent->m_widget)))
486 gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(m_parent->m_widget) );
487
de1c750f
RR
488 if (!name.IsEmpty())
489 gtk_window_set_wmclass( GTK_WINDOW(m_widget), name.mb_str(), name.mb_str() );
8bbe427f 490
2e563988 491#ifdef __WXDEBUG__
223d09f6 492 debug_focus_in( m_widget, wxT("wxFrame::m_widget"), name );
2e563988
RR
493#endif
494
ed9b9841 495 gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() );
fb1585ae 496 GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
ed7a557b 497
fb1585ae
RR
498 gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
499 GTK_SIGNAL_FUNC(gtk_frame_delete_callback), (gpointer)this );
ed7a557b 500
f362b96d 501 /* m_mainWidget holds the toolbar, the menubar and the client area */
da048e3d 502 m_mainWidget = gtk_pizza_new();
f362b96d
RR
503 gtk_widget_show( m_mainWidget );
504 GTK_WIDGET_UNSET_FLAGS( m_mainWidget, GTK_CAN_FOCUS );
505 gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget );
88ac883a 506
117247fd
RR
507 /* for m_mainWidget themes */
508 gtk_signal_connect( GTK_OBJECT(m_mainWidget), "expose_event",
509 GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
510 gtk_signal_connect( GTK_OBJECT(m_mainWidget), "draw",
511 GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
512
2e563988 513#ifdef __WXDEBUG__
223d09f6 514 debug_focus_in( m_mainWidget, wxT("wxFrame::m_mainWidget"), name );
2e563988
RR
515#endif
516
f362b96d 517 /* m_wxwindow only represents the client area without toolbar and menubar */
da048e3d 518 m_wxwindow = gtk_pizza_new();
fb1585ae 519 gtk_widget_show( m_wxwindow );
f362b96d 520 gtk_container_add( GTK_CONTAINER(m_mainWidget), m_wxwindow );
88ac883a 521
2e563988 522#ifdef __WXDEBUG__
223d09f6 523 debug_focus_in( m_wxwindow, wxT("wxFrame::m_wxwindow"), name );
2e563988
RR
524#endif
525
526 /* we donm't allow the frame to get the focus as otherwise
527 the frame will grabit at arbitrary fcous changes. */
528 GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
ed7a557b 529
de8113d9
RR
530 if (m_parent) m_parent->AddChild( this );
531
54517652
RR
532 /* the user resized the frame by dragging etc. */
533 gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
534 GTK_SIGNAL_FUNC(gtk_frame_size_callback), (gpointer)this );
535
de8113d9
RR
536 PostCreation();
537
15909a16
RR
538 if ((m_x != -1) || (m_y != -1))
539 gtk_widget_set_uposition( m_widget, m_x, m_y );
540 gtk_widget_set_usize( m_widget, m_width, m_height );
f6bcfd97 541
58dea4b0 542 /* we cannot set MWM hints and icons before the widget has
2b07d713
RR
543 been realized, so we do this directly after realization */
544 gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
f03fc89f 545 GTK_SIGNAL_FUNC(gtk_frame_realized_callback), (gpointer) this );
88ac883a 546
ab2b3dd4 547 /* the only way to get the window size is to connect to this event */
fb1585ae
RR
548 gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event",
549 GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this );
8bbe427f 550
43f5c493
RR
551 /* map and unmap for iconized state */
552 gtk_signal_connect( GTK_OBJECT(m_widget), "map_event",
553 GTK_SIGNAL_FUNC(gtk_frame_map_callback), (gpointer)this );
554 gtk_signal_connect( GTK_OBJECT(m_widget), "unmap_event",
555 GTK_SIGNAL_FUNC(gtk_frame_unmap_callback), (gpointer)this );
556
557 /* the only way to get the window size is to connect to this event */
558 gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event",
559 GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this );
560
69ffe1d2
RR
561 /* disable native tab traversal */
562 gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
563 GTK_SIGNAL_FUNC(gtk_frame_focus_callback), (gpointer)this );
564
fb1585ae 565 return TRUE;
362c6693 566}
c801d85f 567
19717c50 568wxFrame::~wxFrame()
c801d85f 569{
31c6b4fc 570 m_isBeingDeleted = TRUE;
88ac883a 571
7c0ea335 572 DeleteAllBars();
ed7a557b 573
fb1585ae 574 wxTopLevelWindows.DeleteObject( this );
2b854a32 575
0d2a2b60 576 if (wxTheApp->GetTopWindow() == this)
0d2a2b60 577 wxTheApp->SetTopWindow( (wxWindow*) NULL );
2b854a32 578
f59d80ca
RR
579 if ((wxTopLevelWindows.Number() == 0) &&
580 (wxTheApp->GetExitOnFrameDelete()))
581 {
0d2a2b60 582 wxTheApp->ExitMainLoop();
f59d80ca 583 }
362c6693 584}
ed7a557b 585
3d0c4d2e
RR
586bool wxFrame::ShowFullScreen(bool show, long style )
587{
588 if (show == m_fsIsShowing) return FALSE; // return what?
589
590 m_fsIsShowing = show;
591
592 if (show)
593 {
594 m_fsSaveStyle = m_windowStyle;
595 m_fsSaveFlag = style;
596 GetPosition( &m_fsSaveFrame.x, &m_fsSaveFrame.y );
597 GetSize( &m_fsSaveFrame.width, &m_fsSaveFrame.height );
598
599 gtk_widget_hide( m_widget );
600 gtk_widget_unrealize( m_widget );
601
602 m_windowStyle = wxSIMPLE_BORDER;
603
604 int x;
605 int y;
606 wxDisplaySize( &x, &y );
607 SetSize( 0, 0, x, y );
608
609 gtk_widget_realize( m_widget );
610 gtk_widget_show( m_widget );
611 }
612 else
613 {
614 gtk_widget_hide( m_widget );
615 gtk_widget_unrealize( m_widget );
616
617 m_windowStyle = m_fsSaveStyle;
618
619 SetSize( m_fsSaveFrame.x, m_fsSaveFrame.y, m_fsSaveFrame.width, m_fsSaveFrame.height );
620
621 gtk_widget_realize( m_widget );
622 gtk_widget_show( m_widget );
623 }
624
625 return TRUE;
626}
627
7c0ea335
VZ
628// ----------------------------------------------------------------------------
629// overridden wxWindow methods
630// ----------------------------------------------------------------------------
631
debe6624 632bool wxFrame::Show( bool show )
c801d85f 633{
223d09f6 634 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 635
35178437 636 if (show && !m_sizeSet)
fb1585ae 637 {
e27ce4e9
RR
638 /* by calling GtkOnSize here, we don't have to call
639 either after showing the frame, which would entail
f362b96d 640 much ugly flicker or from within the size_allocate
e27ce4e9 641 handler, because GTK 1.1.X forbids that. */
8bbe427f 642
35178437 643 GtkOnSize( m_x, m_y, m_width, m_height );
fb1585ae 644 }
8bbe427f 645
fb1585ae 646 return wxWindow::Show( show );
362c6693 647}
c801d85f 648
23efdd02
RR
649void wxFrame::DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(width), int WXUNUSED(height) )
650{
651 wxFAIL_MSG( wxT("DoMoveWindow called for wxFrame") );
652}
f6bcfd97 653
bfc6fde4 654void wxFrame::DoSetSize( int x, int y, int width, int height, int sizeFlags )
903f689b 655{
223d09f6 656 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 657
ab2b3dd4 658 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
223d09f6 659 wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid frame") );
88ac883a 660
ab2b3dd4 661 /* avoid recursions */
7c0ea335
VZ
662 if (m_resizing)
663 return;
fb1585ae
RR
664 m_resizing = TRUE;
665
666 int old_x = m_x;
667 int old_y = m_y;
7beba2fc 668
fb1585ae
RR
669 int old_width = m_width;
670 int old_height = m_height;
8bbe427f 671
85ad5eb5 672 if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)
fb1585ae
RR
673 {
674 if (x != -1) m_x = x;
675 if (y != -1) m_y = y;
676 if (width != -1) m_width = width;
677 if (height != -1) m_height = height;
678 }
679 else
680 {
681 m_x = x;
682 m_y = y;
683 m_width = width;
684 m_height = height;
685 }
686
11e1c70d 687/*
fb1585ae
RR
688 if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
689 {
690 if (width == -1) m_width = 80;
691 }
692
693 if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
694 {
695 if (height == -1) m_height = 26;
696 }
11e1c70d 697*/
8bbe427f 698
fb1585ae
RR
699 if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
700 if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
0c77152e
RR
701 if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
702 if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
fb1585ae
RR
703
704 if ((m_x != -1) || (m_y != -1))
705 {
8bbe427f 706 if ((m_x != old_x) || (m_y != old_y))
0138c2de 707 {
8487f887 708 gtk_widget_set_uposition( m_widget, m_x, m_y );
0138c2de 709 }
fb1585ae 710 }
8bbe427f 711
fb1585ae
RR
712 if ((m_width != old_width) || (m_height != old_height))
713 {
15909a16
RR
714 gtk_widget_set_usize( m_widget, m_width, m_height );
715
ab2b3dd4 716 /* we set the size in GtkOnSize, i.e. mostly the actual resizing is
f03fc89f
VZ
717 done either directly before the frame is shown or in idle time
718 so that different calls to SetSize() don't lead to flicker. */
de8113d9 719 m_sizeSet = FALSE;
fb1585ae 720 }
8bbe427f 721
fb1585ae 722 m_resizing = FALSE;
903f689b
RR
723}
724
f9241296 725void wxFrame::DoGetClientSize( int *width, int *height ) const
c801d85f 726{
223d09f6 727 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 728
f9241296 729 wxWindow::DoGetClientSize( width, height );
fb1585ae 730 if (height)
46dc76ba 731 {
41ca191f
RR
732 /* menu bar */
733 if (m_frameMenuBar)
f03fc89f 734 {
88ac883a 735 if (!m_menuBarDetached)
f03fc89f
VZ
736 (*height) -= wxMENU_HEIGHT;
737 else
738 (*height) -= wxPLACE_HOLDER;
739 }
88ac883a 740
dcf924a3 741#if wxUSE_STATUSBAR
f03fc89f 742 /* status bar */
fa755cf1 743 if (m_frameStatusBar && m_frameStatusBar->IsShown()) (*height) -= wxSTATUS_HEIGHT;
93fa69f8 744#endif // wxUSE_STATUSBAR
88ac883a 745
dcf924a3 746#if wxUSE_TOOLBAR
f03fc89f 747 /* tool bar */
fa755cf1 748 if (m_frameToolBar && m_frameToolBar->IsShown())
fb1585ae 749 {
93fa69f8 750 if (m_toolBarDetached)
f03fc89f 751 {
93fa69f8 752 *height -= wxPLACE_HOLDER;
f03fc89f
VZ
753 }
754 else
93fa69f8
VZ
755 {
756 int x, y;
757 m_frameToolBar->GetSize( &x, &y );
758 if ( m_frameToolBar->GetWindowStyle() & wxTB_VERTICAL )
759 {
760 *width -= x;
761 }
762 else
763 {
764 *height -= y;
765 }
766 }
fb1585ae 767 }
93fa69f8 768#endif // wxUSE_TOOLBAR
88ac883a 769
f03fc89f 770 /* mini edge */
93fa69f8 771 *height -= m_miniEdge*2 + m_miniTitle;
b2b3ccc5
RR
772 }
773 if (width)
774 {
93fa69f8 775 *width -= m_miniEdge*2;
46dc76ba 776 }
362c6693 777}
c801d85f 778
bfc6fde4 779void wxFrame::DoSetClientSize( int width, int height )
b593568e 780{
223d09f6 781 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 782
41ca191f
RR
783 /* menu bar */
784 if (m_frameMenuBar)
f03fc89f 785 {
88ac883a 786 if (!m_menuBarDetached)
f03fc89f
VZ
787 height += wxMENU_HEIGHT;
788 else
789 height += wxPLACE_HOLDER;
790 }
88ac883a 791
dcf924a3 792#if wxUSE_STATUSBAR
f03fc89f 793 /* status bar */
fa755cf1 794 if (m_frameStatusBar && m_frameStatusBar->IsShown()) height += wxSTATUS_HEIGHT;
dcf924a3 795#endif
88ac883a 796
dcf924a3 797#if wxUSE_TOOLBAR
f03fc89f 798 /* tool bar */
fa755cf1 799 if (m_frameToolBar && m_frameToolBar->IsShown())
41ca191f 800 {
93fa69f8 801 if (m_toolBarDetached)
f03fc89f 802 {
93fa69f8 803 height += wxPLACE_HOLDER;
f03fc89f
VZ
804 }
805 else
93fa69f8
VZ
806 {
807 int x, y;
808 m_frameToolBar->GetSize( &x, &y );
809 if ( m_frameToolBar->GetWindowStyle() & wxTB_VERTICAL )
810 {
811 width += x;
812 }
813 else
814 {
815 height += y;
816 }
817 }
41ca191f 818 }
dcf924a3 819#endif
88ac883a 820
3017f78d 821 DoSetSize( -1, -1, width + m_miniEdge*2, height + m_miniEdge*2 + m_miniTitle, 0 );
362c6693 822}
b593568e 823
7c0ea335
VZ
824void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y),
825 int width, int height )
c801d85f 826{
f5368809
RR
827 // due to a bug in gtk, x,y are always 0
828 // m_x = x;
829 // m_y = y;
830
ab2b3dd4 831 /* avoid recursions */
e52f60e6
RR
832 if (m_resizing) return;
833 m_resizing = TRUE;
8bbe427f 834
ab2b3dd4 835 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
223d09f6 836 wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid frame") );
88ac883a 837
f5368809
RR
838 m_width = width;
839 m_height = height;
7beba2fc 840
ab2b3dd4 841 /* space occupied by m_frameToolBar and m_frameMenuBar */
93fa69f8
VZ
842 int client_area_x_offset = 0,
843 client_area_y_offset = 0;
8bbe427f 844
ab2b3dd4
RR
845 /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
846 wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
847 set in wxFrame::Create so it is used to check what kind of frame we
848 have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
849 skip the part which handles m_frameMenuBar, m_frameToolBar and (most
850 importantly) m_mainWidget */
88ac883a 851
1f3c610d
RR
852 if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
853 if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
854 if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
855 if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
1f3c610d 856
ab2b3dd4 857 if (m_mainWidget)
f5368809 858 {
f6bcfd97
BP
859 /* set size hints */
860 gint flag = 0; // GDK_HINT_POS;
861 if ((m_minWidth != -1) || (m_minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
862 if ((m_maxWidth != -1) || (m_maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
863 GdkGeometry geom;
864 geom.min_width = m_minWidth;
865 geom.min_height = m_minHeight;
866 geom.max_width = m_maxWidth;
867 geom.max_height = m_maxHeight;
868 gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
869 (GtkWidget*) NULL,
870 &geom,
871 (GdkWindowHints) flag );
ab2b3dd4
RR
872
873 /* I revert back to wxGTK's original behaviour. m_mainWidget holds the
874 * menubar, the toolbar and the client area, which is represented by
875 * m_wxwindow.
876 * this hurts in the eye, but I don't want to call SetSize()
877 * because I don't want to call any non-native functions here. */
88ac883a 878
ab2b3dd4
RR
879 if (m_frameMenuBar)
880 {
881 int xx = m_miniEdge;
882 int yy = m_miniEdge + m_miniTitle;
883 int ww = m_width - 2*m_miniEdge;
41ca191f 884 int hh = wxMENU_HEIGHT;
f03fc89f 885 if (m_menuBarDetached) hh = wxPLACE_HOLDER;
121a3581
RR
886 m_frameMenuBar->m_x = xx;
887 m_frameMenuBar->m_y = yy;
888 m_frameMenuBar->m_width = ww;
889 m_frameMenuBar->m_height = hh;
da048e3d 890 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
88ac883a 891 m_frameMenuBar->m_widget,
f03fc89f
VZ
892 xx, yy, ww, hh );
893 client_area_y_offset += hh;
ab2b3dd4 894 }
88ac883a 895
dcf924a3 896#if wxUSE_TOOLBAR
fa755cf1 897 if ((m_frameToolBar) && m_frameToolBar->IsShown() &&
7beba2fc 898 (m_frameToolBar->m_widget->parent == m_mainWidget))
ab2b3dd4
RR
899 {
900 int xx = m_miniEdge;
901 int yy = m_miniEdge + m_miniTitle;
41ca191f 902 if (m_frameMenuBar)
f03fc89f 903 {
88ac883a
VZ
904 if (!m_menuBarDetached)
905 yy += wxMENU_HEIGHT;
906 else
f03fc89f
VZ
907 yy += wxPLACE_HOLDER;
908 }
93fa69f8 909
121a3581
RR
910 m_frameToolBar->m_x = xx;
911 m_frameToolBar->m_y = yy;
93fa69f8
VZ
912
913 /* don't change the toolbar's reported height/width */
914 int ww, hh;
915 if ( m_frameToolBar->GetWindowStyle() & wxTB_VERTICAL )
916 {
917 ww = m_toolBarDetached ? wxPLACE_HOLDER
918 : m_frameToolBar->m_width;
919 hh = m_height - 2*m_miniEdge;
920
921 client_area_x_offset += ww;
922 }
923 else
924 {
925 ww = m_width - 2*m_miniEdge;
926 hh = m_toolBarDetached ? wxPLACE_HOLDER
927 : m_frameToolBar->m_height;
928
929 client_area_y_offset += hh;
930 }
931
da048e3d 932 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
88ac883a 933 m_frameToolBar->m_widget,
f03fc89f 934 xx, yy, ww, hh );
ab2b3dd4 935 }
93fa69f8 936#endif // wxUSE_TOOLBAR
88ac883a 937
93fa69f8 938 int client_x = client_area_x_offset + m_miniEdge;
f03fc89f 939 int client_y = client_area_y_offset + m_miniEdge + m_miniTitle;
93fa69f8 940 int client_w = m_width - client_area_x_offset - 2*m_miniEdge;
f03fc89f 941 int client_h = m_height - client_area_y_offset- 2*m_miniEdge - m_miniTitle;
da048e3d 942 gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
88ac883a 943 m_wxwindow,
f03fc89f 944 client_x, client_y, client_w, client_h );
32a95f9f
RR
945 }
946 else
947 {
948 /* if there is no m_mainWidget between m_widget and m_wxwindow there
f03fc89f 949 is no need to set the size or position of m_wxwindow. */
f5368809 950 }
88ac883a 951
dcf924a3 952#if wxUSE_STATUSBAR
fa755cf1 953 if (m_frameStatusBar && m_frameStatusBar->IsShown())
f5368809 954 {
b2b3ccc5 955 int xx = 0 + m_miniEdge;
f362b96d 956 int yy = m_height - wxSTATUS_HEIGHT - m_miniEdge - client_area_y_offset;
ac57418f
RR
957 int ww = m_width - 2*m_miniEdge;
958 int hh = wxSTATUS_HEIGHT;
121a3581
RR
959 m_frameStatusBar->m_x = xx;
960 m_frameStatusBar->m_y = yy;
961 m_frameStatusBar->m_width = ww;
962 m_frameStatusBar->m_height = hh;
da048e3d 963 gtk_pizza_set_size( GTK_PIZZA(m_wxwindow),
7c0ea335
VZ
964 m_frameStatusBar->m_widget,
965 xx, yy, ww, hh );
b6fa52db 966 gtk_widget_draw( m_frameStatusBar->m_widget, (GdkRectangle*) NULL );
f5368809 967 }
dcf924a3 968#endif
8bbe427f 969
54517652 970 m_sizeSet = TRUE;
7beba2fc 971
54517652 972 // send size event to frame
43a18898
RR
973 wxSizeEvent event( wxSize(m_width,m_height), GetId() );
974 event.SetEventObject( this );
e52f60e6 975 GetEventHandler()->ProcessEvent( event );
8bbe427f 976
54517652 977 // send size event to status bar
5aa5e35a
RR
978 if (m_frameStatusBar)
979 {
a2053b27 980 wxSizeEvent event2( wxSize(m_frameStatusBar->m_width,m_frameStatusBar->m_height), m_frameStatusBar->GetId() );
5aa5e35a
RR
981 event2.SetEventObject( m_frameStatusBar );
982 m_frameStatusBar->GetEventHandler()->ProcessEvent( event2 );
983 }
884470b1 984
e52f60e6
RR
985 m_resizing = FALSE;
986}
987
ca26177c
RR
988void wxFrame::MakeModal( bool modal )
989{
990 if (modal)
ca26177c 991 gtk_grab_add( m_widget );
ca26177c 992 else
c25ccf85 993 gtk_grab_remove( m_widget );
ca26177c
RR
994}
995
9390a202 996void wxFrame::OnInternalIdle()
e52f60e6 997{
1b3667ab 998 if (!m_sizeSet && GTK_WIDGET_REALIZED(m_wxwindow))
54517652 999 {
e52f60e6 1000 GtkOnSize( m_x, m_y, m_width, m_height );
7beba2fc
VZ
1001
1002 // we'll come back later
54517652
RR
1003 if (g_isIdle)
1004 wxapp_install_idle_handler();
7beba2fc 1005 return;
54517652 1006 }
88ac883a 1007
082b2798 1008 if (m_frameMenuBar) m_frameMenuBar->OnInternalIdle();
dcf924a3 1009#if wxUSE_TOOLBAR
082b2798 1010 if (m_frameToolBar) m_frameToolBar->OnInternalIdle();
dcf924a3
RR
1011#endif
1012#if wxUSE_STATUSBAR
082b2798 1013 if (m_frameStatusBar) m_frameStatusBar->OnInternalIdle();
dcf924a3 1014#endif
5e014a0c
RR
1015
1016 wxWindow::OnInternalIdle();
362c6693 1017}
c801d85f 1018
7c0ea335
VZ
1019// ----------------------------------------------------------------------------
1020// menu/tool/status bar stuff
1021// ----------------------------------------------------------------------------
c801d85f 1022
c801d85f
KB
1023void wxFrame::SetMenuBar( wxMenuBar *menuBar )
1024{
223d09f6
KB
1025 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
1026 wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid frame") );
8bbe427f 1027
186baeb2
RR
1028 if (menuBar == m_frameMenuBar)
1029 return;
1030
1031 if (m_frameMenuBar)
1032 {
1033 m_frameMenuBar->UnsetInvokingWindow( this );
1034
1035 if (m_frameMenuBar->GetWindowStyle() & wxMB_DOCKABLE)
1036 {
1037 gtk_signal_disconnect_by_func( GTK_OBJECT(m_frameMenuBar->m_widget),
1038 GTK_SIGNAL_FUNC(gtk_menu_attached_callback), (gpointer)this );
1039
1040 gtk_signal_disconnect_by_func( GTK_OBJECT(m_frameMenuBar->m_widget),
1041 GTK_SIGNAL_FUNC(gtk_menu_detached_callback), (gpointer)this );
1042 }
f6bcfd97 1043
186baeb2
RR
1044 gtk_container_remove( GTK_CONTAINER(m_mainWidget), m_frameMenuBar->m_widget );
1045 gtk_widget_ref( m_frameMenuBar->m_widget );
1046 gtk_widget_unparent( m_frameMenuBar->m_widget );
1047 }
1048
f5368809 1049 m_frameMenuBar = menuBar;
8bbe427f 1050
f5368809 1051 if (m_frameMenuBar)
30dea054 1052 {
5bd9e519 1053 m_frameMenuBar->SetInvokingWindow( this );
8bbe427f 1054
186baeb2
RR
1055 m_frameMenuBar->SetParent(this);
1056 gtk_pizza_put( GTK_PIZZA(m_mainWidget),
88ac883a
VZ
1057 m_frameMenuBar->m_widget,
1058 m_frameMenuBar->m_x,
a2053b27
RR
1059 m_frameMenuBar->m_y,
1060 m_frameMenuBar->m_width,
1061 m_frameMenuBar->m_height );
88ac883a 1062
186baeb2
RR
1063 if (menuBar->GetWindowStyle() & wxMB_DOCKABLE)
1064 {
1065 gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_attached",
1066 GTK_SIGNAL_FUNC(gtk_menu_attached_callback), (gpointer)this );
7beba2fc 1067
186baeb2
RR
1068 gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_detached",
1069 GTK_SIGNAL_FUNC(gtk_menu_detached_callback), (gpointer)this );
f5368809 1070 }
186baeb2
RR
1071
1072 m_frameMenuBar->Show( TRUE );
716b7364 1073 }
8bbe427f 1074
1e133b7d 1075 /* resize window in OnInternalIdle */
5b077d48 1076 m_sizeSet = FALSE;
362c6693 1077}
c801d85f 1078
88ac883a 1079#if wxUSE_TOOLBAR
6bc8a1c8 1080wxToolBar* wxFrame::CreateToolBar( long style, wxWindowID id, const wxString& name )
46dc76ba 1081{
223d09f6 1082 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 1083
6bc8a1c8 1084 m_insertInClientArea = FALSE;
88ac883a 1085
7c0ea335 1086 m_frameToolBar = wxFrameBase::CreateToolBar( style, id, name );
8bbe427f 1087
6bc8a1c8 1088 m_insertInClientArea = TRUE;
8bbe427f 1089
5b077d48 1090 m_sizeSet = FALSE;
8bbe427f 1091
f5368809 1092 return m_frameToolBar;
362c6693 1093}
46dc76ba 1094
7beba2fc
VZ
1095void wxFrame::SetToolBar(wxToolBar *toolbar)
1096{
7c0ea335
VZ
1097 wxFrameBase::SetToolBar(toolbar);
1098
307f16e8
RR
1099 if (m_frameToolBar)
1100 {
1101 /* insert into toolbar area if not already there */
3017f78d
RR
1102 if ((m_frameToolBar->m_widget->parent) &&
1103 (m_frameToolBar->m_widget->parent != m_mainWidget))
307f16e8 1104 {
3017f78d 1105 GetChildren().DeleteObject( m_frameToolBar );
7beba2fc
VZ
1106
1107 gtk_widget_reparent( m_frameToolBar->m_widget, m_mainWidget );
5b8a521e 1108 GtkUpdateSize();
7beba2fc 1109 }
307f16e8
RR
1110 }
1111}
1112
88ac883a 1113#endif // wxUSE_TOOLBAR
46dc76ba 1114
88ac883a 1115#if wxUSE_STATUSBAR
8bbe427f 1116
7c0ea335
VZ
1117wxStatusBar* wxFrame::CreateStatusBar(int number,
1118 long style,
1119 wxWindowID id,
1120 const wxString& name)
c801d85f 1121{
223d09f6 1122 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 1123
7c0ea335
VZ
1124 // because it will change when toolbar is added
1125 m_sizeSet = FALSE;
c801d85f 1126
7c0ea335 1127 return wxFrameBase::CreateStatusBar( number, style, id, name );
362c6693
RR
1128}
1129
8febdd39
RR
1130void wxFrame::PositionStatusBar()
1131{
1132 if ( !m_frameStatusBar )
1133 return;
1134
1135 m_sizeSet = FALSE;
1136}
88ac883a 1137#endif // wxUSE_STATUSBAR
c801d85f 1138
7c0ea335
VZ
1139// ----------------------------------------------------------------------------
1140// frame title/icon
1141// ----------------------------------------------------------------------------
c801d85f 1142
c801d85f
KB
1143void wxFrame::SetTitle( const wxString &title )
1144{
223d09f6 1145 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 1146
f5368809 1147 m_title = title;
ed9b9841 1148 gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() );
362c6693 1149}
c801d85f 1150
d355d3fe
RR
1151void wxFrame::SetIcon( const wxIcon &icon )
1152{
223d09f6 1153 wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
8bbe427f 1154
7c0ea335 1155 wxFrameBase::SetIcon(icon);
8bbe427f 1156
7c0ea335
VZ
1157 if ( !m_icon.Ok() )
1158 return;
1159
1160 if (!m_widget->window)
1161 return;
58dea4b0 1162
f5368809
RR
1163 wxMask *mask = icon.GetMask();
1164 GdkBitmap *bm = (GdkBitmap *) NULL;
1165 if (mask) bm = mask->GetBitmap();
8bbe427f 1166
f5368809 1167 gdk_window_set_icon( m_widget->window, (GdkWindow *) NULL, icon.GetPixmap(), bm );
d355d3fe 1168}
b2b3ccc5 1169
7c0ea335 1170// ----------------------------------------------------------------------------
c0f09a2e 1171// frame state: maximized/iconized/normal
7c0ea335
VZ
1172// ----------------------------------------------------------------------------
1173
7beba2fc 1174void wxFrame::Maximize(bool WXUNUSED(maximize))
cd25b18c 1175{
c0f09a2e 1176 wxFAIL_MSG( _T("not implemented") );
cd25b18c
RR
1177}
1178
7c0ea335
VZ
1179bool wxFrame::IsMaximized() const
1180{
a2d93e73 1181 // wxFAIL_MSG( _T("not implemented") );
c0f09a2e 1182
a2d93e73 1183 // This is an approximation
7c0ea335
VZ
1184 return FALSE;
1185}
1186
7beba2fc 1187void wxFrame::Restore()
cd25b18c 1188{
c0f09a2e 1189 wxFAIL_MSG( _T("not implemented") );
cd25b18c
RR
1190}
1191
7beba2fc
VZ
1192void wxFrame::Iconize( bool iconize )
1193{
cd25b18c
RR
1194 if (iconize)
1195 {
1196 XIconifyWindow( GDK_WINDOW_XDISPLAY( m_widget->window ),
7beba2fc
VZ
1197 GDK_WINDOW_XWINDOW( m_widget->window ),
1198 DefaultScreen( GDK_DISPLAY() ) );
cd25b18c
RR
1199 }
1200}
1201
7beba2fc
VZ
1202bool wxFrame::IsIconized() const
1203{
43f5c493 1204 return m_isIconized;
cd25b18c 1205}