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