1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Robert Roebling
6 // Copyright: (c) 1998 Robert Roebling
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
11 #pragma implementation "frame.h"
15 #include "wx/dialog.h"
16 #include "wx/control.h"
19 #include "wx/toolbar.h"
20 #include "wx/statusbr.h"
21 #include "wx/dcclient.h"
26 #include "wx/gtk/win_gtk.h"
28 //-----------------------------------------------------------------------------
30 //-----------------------------------------------------------------------------
32 const int wxMENU_HEIGHT
= 27;
33 const int wxSTATUS_HEIGHT
= 25;
35 //-----------------------------------------------------------------------------
37 //-----------------------------------------------------------------------------
39 extern wxList wxPendingDelete
;
41 //-----------------------------------------------------------------------------
43 //-----------------------------------------------------------------------------
45 static void gtk_frame_size_callback( GtkWidget
*WXUNUSED(widget
), GtkAllocation
* alloc
, wxFrame
*win
)
47 if (!win
->HasVMT()) return;
50 printf( "OnFrameResize from " );
51 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
52 printf( win->GetClassInfo()->GetClassName() );
56 if ((win
->m_width
!= alloc
->width
) || (win
->m_height
!= alloc
->height
))
58 win
->m_sizeSet
= FALSE
;
59 win
->m_width
= alloc
->width
;
60 win
->m_height
= alloc
->height
;
64 //-----------------------------------------------------------------------------
66 //-----------------------------------------------------------------------------
68 static gint
gtk_frame_delete_callback( GtkWidget
*WXUNUSED(widget
), GdkEvent
*WXUNUSED(event
), wxFrame
*win
)
71 printf( "OnDelete from " );
72 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
73 printf( win->GetClassInfo()->GetClassName() );
82 //-----------------------------------------------------------------------------
84 //-----------------------------------------------------------------------------
86 static gint
gtk_frame_configure_callback( GtkWidget
*WXUNUSED(widget
), GdkEventConfigure
*event
, wxFrame
*win
)
88 if (!win
->HasVMT()) return FALSE
;
93 wxMoveEvent
mevent( wxPoint(win
->m_x
,win
->m_y
), win
->GetId() );
94 mevent
.SetEventObject( win
);
95 win
->GetEventHandler()->ProcessEvent( mevent
);
100 //-----------------------------------------------------------------------------
101 // InsertChild for wxFrame
102 //-----------------------------------------------------------------------------
104 /* Callback for wxFrame. This very strange beast has to be used because
105 * C++ has no virtual methods in a constructor. We have to emulate a
106 * virtual function here as wxWindows requires different ways to insert
107 * a child in container classes. */
109 static void wxInsertChildInFrame( wxWindow
* parent
, wxWindow
* child
)
111 if (wxIS_KIND_OF(child
,wxToolBar
) || wxIS_KIND_OF(child
,wxMenuBar
))
113 /* these are outside the client area */
114 wxFrame
* frame
= (wxFrame
*) parent
;
115 gtk_myfixed_put( GTK_MYFIXED(frame
->m_mainWidget
),
116 GTK_WIDGET(child
->m_widget
),
122 /* these are inside the client area */
123 gtk_myfixed_put( GTK_MYFIXED(parent
->m_wxwindow
),
124 GTK_WIDGET(child
->m_widget
),
129 gtk_widget_set_usize( GTK_WIDGET(child
->m_widget
),
133 /* resize on OnInternalIdle */
134 parent
->m_sizeSet
= FALSE
;
136 if (parent
->m_windowStyle
& wxTAB_TRAVERSAL
)
138 /* we now allow a window to get the focus as long as it
139 doesn't have any children. */
140 GTK_WIDGET_UNSET_FLAGS( parent
->m_wxwindow
, GTK_CAN_FOCUS
);
144 //-----------------------------------------------------------------------------
146 //-----------------------------------------------------------------------------
148 BEGIN_EVENT_TABLE(wxFrame
, wxWindow
)
149 EVT_SIZE(wxFrame::OnSize
)
150 EVT_CLOSE(wxFrame::OnCloseWindow
)
151 EVT_MENU_HIGHLIGHT_ALL(wxFrame::OnMenuHighlight
)
154 IMPLEMENT_DYNAMIC_CLASS(wxFrame
,wxWindow
)
158 m_frameMenuBar
= (wxMenuBar
*) NULL
;
159 m_mdiMenuBar
= (wxMenuBar
*) NULL
;
160 m_frameStatusBar
= (wxStatusBar
*) NULL
;
161 m_frameToolBar
= (wxToolBar
*) NULL
;
165 m_mainWidget
= (GtkWidget
*) NULL
;
168 wxFrame::wxFrame( wxWindow
*parent
, wxWindowID id
, const wxString
&title
,
169 const wxPoint
&pos
, const wxSize
&size
,
170 long style
, const wxString
&name
)
172 m_frameMenuBar
= (wxMenuBar
*) NULL
;
173 m_mdiMenuBar
= (wxMenuBar
*) NULL
;
174 m_frameStatusBar
= (wxStatusBar
*) NULL
;
175 m_frameToolBar
= (wxToolBar
*) NULL
;
179 m_mainWidget
= (GtkWidget
*) NULL
;
180 Create( parent
, id
, title
, pos
, size
, style
, name
);
183 bool wxFrame::Create( wxWindow
*parent
, wxWindowID id
, const wxString
&title
,
184 const wxPoint
&pos
, const wxSize
&size
,
185 long style
, const wxString
&name
)
187 wxTopLevelWindows
.Append( this );
189 m_needParent
= FALSE
;
191 PreCreation( parent
, id
, pos
, size
, style
, name
);
195 m_insertCallback
= wxInsertChildInFrame
;
197 GtkWindowType win_type
= GTK_WINDOW_TOPLEVEL
;
198 if (style
& wxSIMPLE_BORDER
) win_type
= GTK_WINDOW_POPUP
;
200 m_widget
= gtk_window_new( win_type
);
202 gtk_window_set_title( GTK_WINDOW(m_widget
), title
);
203 GTK_WIDGET_UNSET_FLAGS( m_widget
, GTK_CAN_FOCUS
);
206 gtk_window_set_policy( GTK_WINDOW(m_widget
), 1, 1, 0 );
208 gtk_signal_connect( GTK_OBJECT(m_widget
), "delete_event",
209 GTK_SIGNAL_FUNC(gtk_frame_delete_callback
), (gpointer
)this );
211 /* m_mainWidget holds the toolbar, the menubar and the client area */
212 m_mainWidget
= gtk_myfixed_new();
213 gtk_widget_show( m_mainWidget
);
214 GTK_WIDGET_UNSET_FLAGS( m_mainWidget
, GTK_CAN_FOCUS
);
215 gtk_container_add( GTK_CONTAINER(m_widget
), m_mainWidget
);
216 gtk_widget_realize( m_mainWidget
);
218 /* m_wxwindow only represents the client area without toolbar and menubar */
219 m_wxwindow
= gtk_myfixed_new();
220 gtk_widget_show( m_wxwindow
);
221 GTK_WIDGET_UNSET_FLAGS( m_wxwindow
, GTK_CAN_FOCUS
);
222 gtk_container_add( GTK_CONTAINER(m_mainWidget
), m_wxwindow
);
224 if (m_parent
) m_parent
->AddChild( this );
228 gtk_widget_realize( m_widget
);
230 /* all this is for Motif Window Manager "hints" and is supposed to be
231 recognized by other WM as well. not tested. */
232 long decor
= (long) GDK_DECOR_ALL
;
233 long func
= (long) GDK_FUNC_ALL
;
234 if ((m_windowStyle
& wxCAPTION
) == 0)
235 decor
|= GDK_DECOR_TITLE
;
236 if ((m_windowStyle
& wxMINIMIZE
) == 0)
237 func
|= GDK_FUNC_MINIMIZE
;
238 if ((m_windowStyle
& wxMAXIMIZE
) == 0)
239 func
|= GDK_FUNC_MAXIMIZE
;
240 if ((m_windowStyle
& wxSYSTEM_MENU
) == 0)
241 decor
|= GDK_DECOR_MENU
;
242 if ((m_windowStyle
& wxMINIMIZE_BOX
) == 0)
243 decor
|= GDK_DECOR_MINIMIZE
;
244 if ((m_windowStyle
& wxMAXIMIZE_BOX
) == 0)
245 decor
|= GDK_DECOR_MAXIMIZE
;
246 if ((m_windowStyle
& wxRESIZE_BORDER
) == 0)
247 func
|= GDK_FUNC_RESIZE
;
248 gdk_window_set_decorations(m_widget
->window
, (GdkWMDecoration
)decor
);
249 gdk_window_set_functions(m_widget
->window
, (GdkWMFunction
)func
);
251 /* the user resized the frame by dragging etc. */
252 gtk_signal_connect( GTK_OBJECT(m_widget
), "size_allocate",
253 GTK_SIGNAL_FUNC(gtk_frame_size_callback
), (gpointer
)this );
255 /* the only way to get the window size is to connect to this event */
256 gtk_signal_connect( GTK_OBJECT(m_widget
), "configure_event",
257 GTK_SIGNAL_FUNC(gtk_frame_configure_callback
), (gpointer
)this );
264 if (m_frameMenuBar
) delete m_frameMenuBar
;
265 m_frameMenuBar
= (wxMenuBar
*) NULL
;
267 if (m_frameStatusBar
) delete m_frameStatusBar
;
268 m_frameStatusBar
= (wxStatusBar
*) NULL
;
270 if (m_frameToolBar
) delete m_frameToolBar
;
271 m_frameToolBar
= (wxToolBar
*) NULL
;
273 wxTopLevelWindows
.DeleteObject( this );
275 if (wxTheApp
->GetTopWindow() == this)
277 wxTheApp
->SetTopWindow( (wxWindow
*) NULL
);
280 if (wxTopLevelWindows
.Number() == 0)
282 wxTheApp
->ExitMainLoop();
286 bool wxFrame::Show( bool show
)
288 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
290 if (show
&& !m_sizeSet
)
292 /* by calling GtkOnSize here, we don't have to call
293 either after showing the frame, which would entail
294 much ugly flicker or from within the size_allocate
295 handler, because GTK 1.1.X forbids that. */
297 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
300 return wxWindow::Show( show
);
303 bool wxFrame::Destroy()
305 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
307 if (!wxPendingDelete
.Member(this)) wxPendingDelete
.Append(this);
312 void wxFrame::DoSetSize( int x
, int y
, int width
, int height
, int sizeFlags
)
314 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
316 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
317 wxASSERT_MSG( (m_wxwindow
!= NULL
), "invalid frame" );
319 /* avoid recursions */
320 if (m_resizing
) return;
325 int old_width
= m_width
;
326 int old_height
= m_height
;
328 if ((sizeFlags
& wxSIZE_USE_EXISTING
) == wxSIZE_USE_EXISTING
)
330 if (x
!= -1) m_x
= x
;
331 if (y
!= -1) m_y
= y
;
332 if (width
!= -1) m_width
= width
;
333 if (height
!= -1) m_height
= height
;
343 if ((sizeFlags
& wxSIZE_AUTO_WIDTH
) == wxSIZE_AUTO_WIDTH
)
345 if (width
== -1) m_width
= 80;
348 if ((sizeFlags
& wxSIZE_AUTO_HEIGHT
) == wxSIZE_AUTO_HEIGHT
)
350 if (height
== -1) m_height
= 26;
353 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
354 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
355 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_maxWidth
;
356 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_maxHeight
;
358 if ((m_x
!= -1) || (m_y
!= -1))
360 if ((m_x
!= old_x
) || (m_y
!= old_y
))
362 /* m_sizeSet = FALSE; */
363 gtk_widget_set_uposition( m_widget
, m_x
, m_y
);
367 if ((m_width
!= old_width
) || (m_height
!= old_height
))
369 /* we set the size in GtkOnSize, i.e. mostly the actual resizing is
370 done either directly before the frame is shown or in idle time
371 so that different calls to SetSize() don't lead to flicker. */
378 void wxFrame::Centre( int direction
)
380 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
385 if ((direction
& wxHORIZONTAL
) == wxHORIZONTAL
) x
= (gdk_screen_width () - m_width
) / 2;
386 if ((direction
& wxVERTICAL
) == wxVERTICAL
) y
= (gdk_screen_height () - m_height
) / 2;
391 void wxFrame::GetClientSize( int *width
, int *height
) const
393 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
395 wxWindow::GetClientSize( width
, height
);
398 if (m_frameMenuBar
) (*height
) -= wxMENU_HEIGHT
;
399 if (m_frameStatusBar
) (*height
) -= wxSTATUS_HEIGHT
;
403 m_frameToolBar
->GetSize( (int *) NULL
, &y
);
406 (*height
) -= m_miniEdge
*2 + m_miniTitle
;
410 (*width
) -= m_miniEdge
*2;
414 void wxFrame::DoSetClientSize( int width
, int height
)
416 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
419 if (m_frameMenuBar
) h
+= wxMENU_HEIGHT
;
420 if (m_frameStatusBar
) h
+= wxSTATUS_HEIGHT
;
424 m_frameToolBar
->GetSize( (int *) NULL
, &y
);
427 wxWindow::DoSetClientSize( width
+ m_miniEdge
*2, h
+ m_miniEdge
*2 + m_miniTitle
);
430 void wxFrame::GtkOnSize( int WXUNUSED(x
), int WXUNUSED(y
), int width
, int height
)
432 // due to a bug in gtk, x,y are always 0
436 /* avoid recursions */
437 if (m_resizing
) return;
440 /* this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow */
441 wxASSERT_MSG( (m_wxwindow
!= NULL
), "invalid frame" );
446 /* space occupied by m_frameToolBar and m_frameMenuBar */
447 int client_area_y_offset
= 0;
449 /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
450 wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
451 set in wxFrame::Create so it is used to check what kind of frame we
452 have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
453 skip the part which handles m_frameMenuBar, m_frameToolBar and (most
454 importantly) m_mainWidget */
458 /* check if size is in legal range */
459 if ((m_minWidth
!= -1) && (m_width
< m_minWidth
)) m_width
= m_minWidth
;
460 if ((m_minHeight
!= -1) && (m_height
< m_minHeight
)) m_height
= m_minHeight
;
461 if ((m_maxWidth
!= -1) && (m_width
> m_maxWidth
)) m_width
= m_maxWidth
;
462 if ((m_maxHeight
!= -1) && (m_height
> m_maxHeight
)) m_height
= m_maxHeight
;
464 /* I revert back to wxGTK's original behaviour. m_mainWidget holds the
465 * menubar, the toolbar and the client area, which is represented by
467 * this hurts in the eye, but I don't want to call SetSize()
468 * because I don't want to call any non-native functions here. */
473 int yy
= m_miniEdge
+ m_miniTitle
;
474 int ww
= m_width
- 2*m_miniEdge
;
475 int hh
= wxMENU_HEIGHT
;
476 m_frameMenuBar
->m_x
= xx
;
477 m_frameMenuBar
->m_y
= yy
;
478 m_frameMenuBar
->m_width
= ww
;
479 m_frameMenuBar
->m_height
= hh
;
481 gtk_myfixed_move( GTK_MYFIXED(m_mainWidget
), m_frameMenuBar
->m_widget
, xx
, yy
);
482 gtk_widget_set_usize( m_frameMenuBar
->m_widget
, ww
, hh
);
484 client_area_y_offset
+= hh
;
490 int yy
= m_miniEdge
+ m_miniTitle
;
491 if ((m_frameMenuBar
) || (m_mdiMenuBar
)) yy
+= wxMENU_HEIGHT
;
492 int ww
= m_width
- 2*m_miniEdge
;
493 int hh
= m_frameToolBar
->m_height
;
495 m_frameToolBar
->m_x
= xx
;
496 m_frameToolBar
->m_y
= yy
;
497 m_frameToolBar
->m_height
= hh
;
498 m_frameToolBar
->m_width
= ww
;
500 gtk_myfixed_move( GTK_MYFIXED(m_mainWidget
), m_frameToolBar
->m_widget
, xx
, yy
);
501 gtk_widget_set_usize( m_frameToolBar
->m_widget
, ww
, hh
);
503 client_area_y_offset
+= hh
;
506 gtk_myfixed_move( GTK_MYFIXED(m_mainWidget
), m_wxwindow
, 0, client_area_y_offset
);
509 gtk_widget_set_usize( m_wxwindow
, m_width
, m_height
-client_area_y_offset
);
511 if (m_frameStatusBar
)
513 int xx
= 0 + m_miniEdge
;
514 int yy
= m_height
- wxSTATUS_HEIGHT
- m_miniEdge
- client_area_y_offset
;
515 int ww
= m_width
- 2*m_miniEdge
;
516 int hh
= wxSTATUS_HEIGHT
;
518 m_frameStatusBar
->m_x
= xx
;
519 m_frameStatusBar
->m_y
= yy
;
520 m_frameStatusBar
->m_width
= ww
;
521 m_frameStatusBar
->m_height
= hh
;
523 gtk_myfixed_move( GTK_MYFIXED(m_wxwindow
), m_frameStatusBar
->m_widget
, xx
, yy
);
524 gtk_widget_set_usize( m_frameStatusBar
->m_widget
, ww
, hh
);
527 /* we actually set the size of a frame here and no-where else */
528 gtk_widget_set_usize( m_widget
, m_width
, m_height
);
532 /* send size event to frame */
533 wxSizeEvent
event( wxSize(m_width
,m_height
), GetId() );
534 event
.SetEventObject( this );
535 GetEventHandler()->ProcessEvent( event
);
537 /* send size event to status bar */
538 if (m_frameStatusBar
)
540 wxSizeEvent
event2( wxSize(m_frameStatusBar
->m_width
,m_frameStatusBar
->m_height
), m_frameStatusBar
->GetId() );
541 event2
.SetEventObject( m_frameStatusBar
);
542 m_frameStatusBar
->GetEventHandler()->ProcessEvent( event2
);
548 void wxFrame::OnInternalIdle()
551 GtkOnSize( m_x
, m_y
, m_width
, m_height
);
556 void wxFrame::OnCloseWindow( wxCloseEvent
& event
)
561 void wxFrame::OnSize( wxSizeEvent
&WXUNUSED(event
) )
563 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
571 // do we have exactly one child?
572 wxWindow
*child
= (wxWindow
*)NULL
;
573 for ( wxNode
*node
= GetChildren().First(); node
; node
= node
->Next() )
575 wxWindow
*win
= (wxWindow
*)node
->Data();
576 if ( !wxIS_KIND_OF(win
,wxFrame
) && !wxIS_KIND_OF(win
,wxDialog
) )
580 // it's the second one: do nothing
588 // no children at all?
591 // yes: set it's size to fill all the frame
592 int client_x
, client_y
;
593 GetClientSize( &client_x
, &client_y
);
594 child
->SetSize( 1, 1, client_x
-2, client_y
-2 );
599 static void SetInvokingWindow( wxMenu
*menu
, wxWindow
*win
)
601 menu
->SetInvokingWindow( win
);
602 wxNode
*node
= menu
->GetItems().First();
605 wxMenuItem
*menuitem
= (wxMenuItem
*)node
->Data();
606 if (menuitem
->IsSubMenu())
607 SetInvokingWindow( menuitem
->GetSubMenu(), win
);
612 void wxFrame::SetMenuBar( wxMenuBar
*menuBar
)
614 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
615 wxASSERT_MSG( (m_wxwindow
!= NULL
), "invalid frame" );
617 m_frameMenuBar
= menuBar
;
621 wxNode
*node
= m_frameMenuBar
->GetMenus().First();
624 wxMenu
*menu
= (wxMenu
*)node
->Data();
625 SetInvokingWindow( menu
, this );
629 if (m_frameMenuBar
->m_parent
!= this)
631 m_frameMenuBar
->m_parent
= this;
632 gtk_myfixed_put( GTK_MYFIXED(m_mainWidget
),
633 m_frameMenuBar
->m_widget
, m_frameMenuBar
->m_x
, m_frameMenuBar
->m_y
);
635 /* an mdi child menu bar might be underneath */
637 m_frameMenuBar
->Show( FALSE
);
644 wxMenuBar
*wxFrame::GetMenuBar() const
646 return m_frameMenuBar
;
649 void wxFrame::OnMenuHighlight(wxMenuEvent
& event
)
653 // if no help string found, we will clear the status bar text
656 int menuId
= event
.GetMenuId();
659 wxMenuBar
*menuBar
= GetMenuBar();
662 helpString
= menuBar
->GetHelpString(menuId
);
666 SetStatusText(helpString
);
670 wxToolBar
* wxFrame::CreateToolBar(long style
, wxWindowID id
, const wxString
& name
)
672 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
674 wxCHECK_MSG( m_frameToolBar
== NULL
, FALSE
, "recreating toolbar in wxFrame" );
676 m_frameToolBar
= OnCreateToolBar( style
, id
, name
);
678 GetChildren().DeleteObject( m_frameToolBar
);
682 return m_frameToolBar
;
685 wxToolBar
* wxFrame::OnCreateToolBar( long style
, wxWindowID id
, const wxString
& name
)
687 return new wxToolBar( this, id
, wxDefaultPosition
, wxDefaultSize
, style
, name
);
690 wxToolBar
*wxFrame::GetToolBar() const
692 return m_frameToolBar
;
695 wxStatusBar
* wxFrame::CreateStatusBar( int number
, long style
, wxWindowID id
, const wxString
& name
)
697 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
699 wxCHECK_MSG( m_frameStatusBar
== NULL
, FALSE
, "recreating status bar in wxFrame" );
701 m_frameStatusBar
= OnCreateStatusBar( number
, style
, id
, name
);
705 return m_frameStatusBar
;
708 wxStatusBar
*wxFrame::OnCreateStatusBar( int number
, long style
, wxWindowID id
, const wxString
& name
)
710 wxStatusBar
*statusBar
= (wxStatusBar
*) NULL
;
712 statusBar
= new wxStatusBar(this, id
, wxPoint(0, 0), wxSize(100, 20), style
, name
);
714 // Set the height according to the font and the border size
715 wxClientDC
dc(statusBar
);
716 dc
.SetFont( statusBar
->GetFont() );
719 dc
.GetTextExtent( "X", &x
, &y
);
721 int height
= (int)( (y
* 1.1) + 2* statusBar
->GetBorderY());
723 statusBar
->SetSize( -1, -1, 100, height
);
725 statusBar
->SetFieldsCount( number
);
729 void wxFrame::Command( int id
)
731 wxCommandEvent
commandEvent(wxEVT_COMMAND_MENU_SELECTED
, id
);
732 commandEvent
.SetInt( id
);
733 commandEvent
.SetEventObject( this );
735 wxMenuBar
*bar
= GetMenuBar();
738 wxMenuItem
*item
= bar
->FindItemForId(id
) ;
739 if (item
&& item
->IsCheckable())
741 bar
->Check(id
,!bar
->Checked(id
)) ;
744 wxEvtHandler
* evtHandler
= GetEventHandler();
746 evtHandler
->ProcessEvent(commandEvent
);
749 void wxFrame::SetStatusText(const wxString
& text
, int number
)
751 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
753 wxCHECK_RET( m_frameStatusBar
!= NULL
, "no statusbar to set text for" );
755 m_frameStatusBar
->SetStatusText(text
, number
);
758 void wxFrame::SetStatusWidths(int n
, const int widths_field
[] )
760 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
762 wxCHECK_RET( m_frameStatusBar
!= NULL
, "no statusbar to set widths for" );
764 m_frameStatusBar
->SetStatusWidths(n
, widths_field
);
767 wxStatusBar
*wxFrame::GetStatusBar() const
769 return m_frameStatusBar
;
772 void wxFrame::SetTitle( const wxString
&title
)
774 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
777 if (m_title
.IsNull()) m_title
= "";
778 gtk_window_set_title( GTK_WINDOW(m_widget
), title
);
781 void wxFrame::SetIcon( const wxIcon
&icon
)
783 wxASSERT_MSG( (m_widget
!= NULL
), "invalid frame" );
786 if (!icon
.Ok()) return;
788 wxMask
*mask
= icon
.GetMask();
789 GdkBitmap
*bm
= (GdkBitmap
*) NULL
;
790 if (mask
) bm
= mask
->GetBitmap();
792 gdk_window_set_icon( m_widget
->window
, (GdkWindow
*) NULL
, icon
.GetPixmap(), bm
);