X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c821db16e6e7675e00a2f87c0320ef75ed8a7ce1..37ed592f7106e4ba483baa6fba91a9c481048bbc:/src/gtk/mdi.cpp diff --git a/src/gtk/mdi.cpp b/src/gtk/mdi.cpp index 607dc314d7..4a7ddf7c9f 100644 --- a/src/gtk/mdi.cpp +++ b/src/gtk/mdi.cpp @@ -17,25 +17,10 @@ #ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/menu.h" - #include "wx/dialog.h" #endif -#include "wx/notebook.h" #include "wx/gtk/private.h" -#include -#include "wx/gtk/win_gtk.h" - -//----------------------------------------------------------------------------- -// constants -//----------------------------------------------------------------------------- - -const int wxMENU_HEIGHT = 27; - -//----------------------------------------------------------------------------- -// globals -//----------------------------------------------------------------------------- - //----------------------------------------------------------------------------- // "switch_page" //----------------------------------------------------------------------------- @@ -54,7 +39,7 @@ gtk_mdi_page_change_callback( GtkNotebook *WXUNUSED(widget), { wxActivateEvent event1( wxEVT_ACTIVATE, false, child->GetId() ); event1.SetEventObject( child); - child->GetEventHandler()->ProcessEvent( event1 ); + child->HandleWindowEvent( event1 ); } // send activate event to new child @@ -86,7 +71,7 @@ gtk_mdi_page_change_callback( GtkNotebook *WXUNUSED(widget), wxActivateEvent event2( wxEVT_ACTIVATE, true, child->GetId() ); event2.SetEventObject( child); - child->GetEventHandler()->ProcessEvent( event2 ); + child->HandleWindowEvent( event2 ); } } @@ -114,31 +99,12 @@ bool wxMDIParentFrame::Create(wxWindow *parent, long style, const wxString& name ) { - wxFrame::Create( parent, id, title, pos, size, style, name ); + if ( !wxFrame::Create( parent, id, title, pos, size, style, name ) ) + return false; - OnCreateClient(); + m_clientWindow = OnCreateClient(); - return true; -} - -void wxMDIParentFrame::GtkOnSize() -{ - wxFrame::GtkOnSize(); - - wxMDIChildFrame *child_frame = GetActiveChild(); - if (!child_frame) return; - - wxMenuBar *menu_bar = child_frame->m_menuBar; - if (!menu_bar) return; - if (!menu_bar->m_widget) return; - - menu_bar->m_x = 0; - menu_bar->m_y = 0; - menu_bar->m_width = m_width; - menu_bar->m_height = wxMENU_HEIGHT; - gtk_pizza_set_size( GTK_PIZZA(m_mainWidget), - menu_bar->m_widget, - 0, 0, m_width, wxMENU_HEIGHT ); + return m_clientWindow != NULL; } void wxMDIParentFrame::OnInternalIdle() @@ -160,11 +126,6 @@ void wxMDIParentFrame::OnInternalIdle() wxMenuBar *menu_bar = active_child_frame->m_menuBar; if (menu_bar) { - menu_bar->m_width = m_width; - menu_bar->m_height = wxMENU_HEIGHT; - gtk_pizza_set_size( GTK_PIZZA(m_mainWidget), - menu_bar->m_widget, - 0, 0, m_width, wxMENU_HEIGHT ); menu_bar->SetInvokingWindow(active_child_frame); } } @@ -191,11 +152,6 @@ void wxMDIParentFrame::OnInternalIdle() { if (menu_bar->Show(true)) { - menu_bar->m_width = m_width; - menu_bar->m_height = wxMENU_HEIGHT; - gtk_pizza_set_size( GTK_PIZZA(m_mainWidget), - menu_bar->m_widget, - 0, 0, m_width, wxMENU_HEIGHT ); menu_bar->SetInvokingWindow( child_frame ); } visible_child_menu = true; @@ -226,12 +182,27 @@ void wxMDIParentFrame::OnInternalIdle() { m_frameMenuBar->Show( true ); m_frameMenuBar->SetInvokingWindow( this ); + } + } +} + +void wxMDIParentFrame::DoGetClientSize(int* width, int* height) const +{ + wxFrame::DoGetClientSize(width, height); - m_frameMenuBar->m_width = m_width; - m_frameMenuBar->m_height = wxMENU_HEIGHT; - gtk_pizza_set_size( GTK_PIZZA(m_mainWidget), - m_frameMenuBar->m_widget, - 0, 0, m_width, wxMENU_HEIGHT ); + if (height) + { + wxMDIChildFrame* active_child_frame = GetActiveChild(); + if (active_child_frame) + { + wxMenuBar* menubar = active_child_frame->m_menuBar; + if (menubar && menubar->IsShown()) + { + GtkRequisition req; + gtk_widget_size_request(menubar->m_widget, &req); + *height -= req.height; + if (*height < 0) *height = 0; + } } } } @@ -276,8 +247,7 @@ wxMDIClientWindow *wxMDIParentFrame::GetClientWindow() const wxMDIClientWindow *wxMDIParentFrame::OnCreateClient() { - m_clientWindow = new wxMDIClientWindow( this ); - return m_clientWindow; + return new wxMDIClientWindow( this ); } void wxMDIParentFrame::ActivateNext() @@ -323,6 +293,10 @@ wxMDIChildFrame::~wxMDIChildFrame() { if (m_menuBar) delete m_menuBar; + + // wxMDIClientWindow does not get redrawn properly after last child is removed + if (m_parent && m_parent->GetChildren().size() <= 1) + gtk_widget_queue_draw(m_parent->m_widget); } bool wxMDIChildFrame::Create( wxMDIParentFrame *parent, @@ -371,9 +345,18 @@ void wxMDIChildFrame::SetMenuBar( wxMenuBar *menu_bar ) m_menuBar->SetParent( mdi_frame ); /* insert the invisible menu bar into the _parent_ mdi frame */ - gtk_pizza_put( GTK_PIZZA(mdi_frame->m_mainWidget), - m_menuBar->m_widget, - 0, 0, mdi_frame->m_width, wxMENU_HEIGHT ); + m_menuBar->Show(false); + gtk_box_pack_start(GTK_BOX(mdi_frame->m_mainWidget), m_menuBar->m_widget, false, false, 0); + gtk_box_reorder_child(GTK_BOX(mdi_frame->m_mainWidget), m_menuBar->m_widget, 0); + + gulong handler_id = g_signal_handler_find( + m_menuBar->m_widget, + GSignalMatchType(G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA), + g_signal_lookup("size_request", GTK_TYPE_WIDGET), + 0, NULL, NULL, m_menuBar); + if (handler_id != 0) + g_signal_handler_disconnect(m_menuBar->m_widget, handler_id); + gtk_widget_set_size_request(m_menuBar->m_widget, -1, -1); } } @@ -419,26 +402,6 @@ void wxMDIChildFrame::SetTitle( const wxString &title ) gtk_notebook_set_tab_label_text(notebook, m_widget, wxGTK_CONV( title ) ); } -//----------------------------------------------------------------------------- -// "size_allocate" -//----------------------------------------------------------------------------- - -extern "C" { -static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxMDIChildFrame *win ) -{ - if ((win->m_x == alloc->x) && - (win->m_y == alloc->y) && - (win->m_width == alloc->width) && - (win->m_height == alloc->height) && - (win->m_sizeSet)) - { - return; - } - - win->SetSize( alloc->x, alloc->y, alloc->width, alloc->height ); -} -} - //----------------------------------------------------------------------------- // InsertChild callback for wxMDIClientWindow //----------------------------------------------------------------------------- @@ -452,9 +415,6 @@ static void wxInsertChildInMDI(wxWindow* parent, wxWindow* child) GtkWidget *label_widget = gtk_label_new( s.mbc_str() ); gtk_misc_set_alignment( GTK_MISC(label_widget), 0.0, 0.5 ); - g_signal_connect (child->m_widget, "size_allocate", - G_CALLBACK (gtk_page_size_callback), child); - GtkNotebook *notebook = GTK_NOTEBOOK(parent->m_widget); gtk_notebook_append_page( notebook, child->m_widget, label_widget );