]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/mdi.cpp
setting correct 'default' for m_filterIndex, closes #11541
[wxWidgets.git] / src / gtk / mdi.cpp
index 064376b54c6a12a25c3692ab6a811bcf4a011cb8..9778056ad3ee2f618731026e425025176e88ca3f 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        mdi.cpp
+// Name:        src/gtk/mdi.cpp
 // Purpose:
 // Author:      Robert Roebling
 // Id:          $Id$
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "mdi.h"
-#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
 
-#include "wx/mdi.h"
-#include "wx/dialog.h"
-#include "wx/menu.h"
-#include <wx/intl.h>
+#if wxUSE_MDI
 
-#include "glib.h"
-#include "gdk/gdk.h"
-#include "gtk/gtk.h"
-#include "wx/gtk/win_gtk.h"
+#include "wx/mdi.h"
 
-//-----------------------------------------------------------------------------
-// constants
-//-----------------------------------------------------------------------------
+#ifndef WX_PRECOMP
+    #include "wx/intl.h"
+    #include "wx/menu.h"
+#endif
 
-const int wxMENU_HEIGHT = 27;
+#include "wx/gtk/private.h"
 
 //-----------------------------------------------------------------------------
-// idle system
+// "switch_page"
 //-----------------------------------------------------------------------------
 
-extern void wxapp_install_idle_handler();
-extern bool g_isIdle;
+extern "C" {
+static void
+gtk_mdi_page_change_callback( GtkNotebook *WXUNUSED(widget),
+                              GtkNotebookPage *page,
+                              gint WXUNUSED(page_num),
+                              wxMDIParentFrame *parent )
+{
+    // send deactivate event to old child
 
-//-----------------------------------------------------------------------------
-// globals
-//-----------------------------------------------------------------------------
+    wxMDIChildFrame *child = parent->GetActiveChild();
+    if (child)
+    {
+        wxActivateEvent event1( wxEVT_ACTIVATE, false, child->GetId() );
+        event1.SetEventObject( child);
+        child->HandleWindowEvent( event1 );
+    }
 
-extern wxList wxPendingDelete;
+    // send activate event to new child
 
-//-----------------------------------------------------------------------------
-// wxMDIParentFrame
-//-----------------------------------------------------------------------------
+    wxMDIClientWindowBase *client_window = parent->GetClientWindow();
+    if ( !client_window )
+        return;
 
-IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame,wxFrame)
+    child = NULL;
 
-BEGIN_EVENT_TABLE(wxMDIParentFrame, wxFrame)
-END_EVENT_TABLE()
+    wxWindowList::compatibility_iterator node = client_window->GetChildren().GetFirst();
+    while ( node )
+    {
+        wxMDIChildFrame *child_frame = wxDynamicCast( node->GetData(), wxMDIChildFrame );
 
-wxMDIParentFrame::wxMDIParentFrame()
-{
-    m_justInserted = FALSE;
-    m_clientWindow = (wxMDIClientWindow *) NULL;
-}
+        // child_frame can be NULL when this is called from dtor, probably
+        // because g_signal_connect (m_widget, "switch_page", (see below)
+        // isn't deleted early enough
+        if ( child_frame && child_frame->m_page == page )
+        {
+            child = child_frame;
+            break;
+        }
+        node = node->GetNext();
+    }
 
-wxMDIParentFrame::wxMDIParentFrame( wxWindow *parent,
-      wxWindowID id, const wxString& title,
-      const wxPoint& pos, const wxSize& size,
-      long style, const wxString& name )
-{
-    m_justInserted = FALSE;
-    m_clientWindow = (wxMDIClientWindow *) NULL;
-    Create( parent, id, title, pos, size, style, name );
-}
+    if (!child)
+         return;
 
-wxMDIParentFrame::~wxMDIParentFrame()
-{
+    wxActivateEvent event2( wxEVT_ACTIVATE, true, child->GetId() );
+    event2.SetEventObject( child);
+    child->HandleWindowEvent( event2 );
+}
 }
 
-bool wxMDIParentFrame::Create( wxWindow *parent,
-      wxWindowID id, const wxString& title,
-      const wxPoint& pos, const wxSize& size,
-      long style, const wxString& name )
-{
-    wxFrame::Create( parent, id, title, pos, size, style, name );
+//-----------------------------------------------------------------------------
+// wxMDIParentFrame
+//-----------------------------------------------------------------------------
 
-    OnCreateClient();
+IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame,wxFrame)
 
-    return TRUE;
+void wxMDIParentFrame::Init()
+{
+    m_justInserted = false;
 }
 
-void wxMDIParentFrame::GtkOnSize( int x, int y, int width, int height )
+bool wxMDIParentFrame::Create(wxWindow *parent,
+                              wxWindowID id,
+                              const wxString& title,
+                              const wxPoint& pos,
+                              const wxSize& size,
+                              long style,
+                              const wxString& name )
 {
-    wxFrame::GtkOnSize( x, y, width, height );
+    if ( !wxFrame::Create( parent, id, title, pos, size, style, name ) )
+        return false;
 
-    wxMDIChildFrame *child_frame = GetActiveChild();
-    if (!child_frame) return;
+    m_clientWindow = OnCreateClient();
+    if ( !m_clientWindow->CreateClient(this, GetWindowStyleFlag()) )
+        return false;
 
-    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_myfixed_move( GTK_MYFIXED(m_mainWidget), menu_bar->m_widget, 0, 0 );
-    gtk_widget_set_usize( menu_bar->m_widget, m_width, wxMENU_HEIGHT );
+    return true;
 }
 
 void wxMDIParentFrame::OnInternalIdle()
 {
-    /* if a an MDI child window has just been inserted
+    /* if a MDI child window has just been inserted
        it has to be brought to the top in idle time. we
        simply set the last notebook page active as new
        pages can only be appended at the end */
@@ -110,81 +114,127 @@ void wxMDIParentFrame::OnInternalIdle()
     if (m_justInserted)
     {
         GtkNotebook *notebook = GTK_NOTEBOOK(m_clientWindow->m_widget);
-        gtk_notebook_set_page( notebook, g_list_length( notebook->children ) - 1 );
+        gtk_notebook_set_current_page( notebook, g_list_length( notebook->children ) - 1 );
 
-        m_justInserted = FALSE;
+        /* need to set the menubar of the child */
+        wxMDIChildFrame *active_child_frame = GetActiveChild();
+        if (active_child_frame != NULL)
+        {
+            wxMenuBar *menu_bar = active_child_frame->m_menuBar;
+            if (menu_bar)
+            {
+                menu_bar->SetInvokingWindow(active_child_frame);
+            }
+        }
+        m_justInserted = false;
         return;
     }
 
     wxFrame::OnInternalIdle();
 
     wxMDIChildFrame *active_child_frame = GetActiveChild();
-    bool visible_child_menu = FALSE;
+    bool visible_child_menu = false;
 
-    wxNode *node = m_clientWindow->m_children.First();
+    wxWindowList::compatibility_iterator node = m_clientWindow->GetChildren().GetFirst();
     while (node)
     {
-        wxMDIChildFrame *child_frame = (wxMDIChildFrame *)node->Data();
-        if (child_frame->m_menuBar)
+        wxMDIChildFrame *child_frame = wxDynamicCast( node->GetData(), wxMDIChildFrame );
+
+        if ( child_frame )
         {
-            if (child_frame == active_child_frame)
-           {
-               gtk_widget_show( child_frame->m_menuBar->m_widget );
-              visible_child_menu = TRUE;
-           }
-            else
-               gtk_widget_hide( child_frame->m_menuBar->m_widget );
+            wxMenuBar *menu_bar = child_frame->m_menuBar;
+            if ( menu_bar )
+            {
+                if (child_frame == active_child_frame)
+                {
+                    if (menu_bar->Show(true))
+                    {
+                        menu_bar->SetInvokingWindow( child_frame );
+                    }
+                    visible_child_menu = true;
+                }
+                else
+                {
+                    if (menu_bar->Show(false))
+                    {
+                        menu_bar->UnsetInvokingWindow( child_frame );
+                    }
+                }
+            }
         }
-        node = node->Next();
+
+        node = node->GetNext();
     }
 
     /* show/hide parent menu bar as required */
-    if (m_frameMenuBar) m_frameMenuBar->Show( !visible_child_menu );
+    if ((m_frameMenuBar) &&
+        (m_frameMenuBar->IsShown() == visible_child_menu))
+    {
+        if (visible_child_menu)
+        {
+            m_frameMenuBar->Show( false );
+            m_frameMenuBar->UnsetInvokingWindow( this );
+        }
+        else
+        {
+            m_frameMenuBar->Show( true );
+            m_frameMenuBar->SetInvokingWindow( this );
+        }
+    }
 }
 
-void wxMDIParentFrame::GetClientSize(int *width, int *height ) const
+void wxMDIParentFrame::DoGetClientSize(int* width, int* height) const
 {
-    wxFrame::GetClientSize( width, height );
+    wxFrame::DoGetClientSize(width, 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;
+            }
+        }
+    }
 }
 
 wxMDIChildFrame *wxMDIParentFrame::GetActiveChild() const
 {
-    if (!m_clientWindow) return (wxMDIChildFrame*) NULL;
+    if (!m_clientWindow) return NULL;
 
     GtkNotebook *notebook = GTK_NOTEBOOK(m_clientWindow->m_widget);
-    if (!notebook) return (wxMDIChildFrame*) NULL;
+    if (!notebook) return NULL;
 
-#if (GTK_MINOR_VERSION > 0)
     gint i = gtk_notebook_get_current_page( notebook );
-#else
-    gint i = gtk_notebook_current_page( notebook );
-#endif
-    if (i < 0) return (wxMDIChildFrame*) NULL;
+    if (i < 0) return NULL;
 
     GtkNotebookPage* page = (GtkNotebookPage*) (g_list_nth(notebook->children,i)->data);
-    if (!page) return (wxMDIChildFrame*) NULL;
+    if (!page) return NULL;
 
-    wxNode *node = m_clientWindow->m_children.First();
+    wxWindowList::compatibility_iterator node = m_clientWindow->GetChildren().GetFirst();
     while (node)
     {
-        wxMDIChildFrame *child_frame = (wxMDIChildFrame *)node->Data();
+        if ( wxPendingDelete.Member(node->GetData()) )
+            return NULL;
+
+        wxMDIChildFrame *child_frame = wxDynamicCast( node->GetData(), wxMDIChildFrame );
+
+        if (!child_frame)
+            return NULL;
+
         if (child_frame->m_page == page)
             return child_frame;
-        node = node->Next();
-    }
-
-    return (wxMDIChildFrame*) NULL;
-}
 
-wxMDIClientWindow *wxMDIParentFrame::GetClientWindow() const
-{
-    return m_clientWindow;
-}
+        node = node->GetNext();
+    }
 
-wxMDIClientWindow *wxMDIParentFrame::OnCreateClient()
-{
-    m_clientWindow = new wxMDIClientWindow( this );
-    return m_clientWindow;
+    return NULL;
 }
 
 void wxMDIParentFrame::ActivateNext()
@@ -199,14 +249,6 @@ void wxMDIParentFrame::ActivatePrevious()
       gtk_notebook_prev_page( GTK_NOTEBOOK(m_clientWindow->m_widget) );
 }
 
-void wxMDIParentFrame::OnActivate( wxActivateEvent& WXUNUSED(event) )
-{
-}
-
-void wxMDIParentFrame::OnSysColourChanged( wxSysColourChangedEvent& WXUNUSED(event) )
-{
-}
-
 //-----------------------------------------------------------------------------
 // wxMDIChildFrame
 //-----------------------------------------------------------------------------
@@ -215,90 +257,65 @@ IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame,wxFrame)
 
 BEGIN_EVENT_TABLE(wxMDIChildFrame, wxFrame)
     EVT_ACTIVATE(wxMDIChildFrame::OnActivate)
+    EVT_MENU_HIGHLIGHT_ALL(wxMDIChildFrame::OnMenuHighlight)
 END_EVENT_TABLE()
 
-wxMDIChildFrame::wxMDIChildFrame()
-{
-    m_menuBar = (wxMenuBar *) NULL;
-    m_page = (GtkNotebookPage *) NULL;
-}
-
-wxMDIChildFrame::wxMDIChildFrame( wxMDIParentFrame *parent,
-      wxWindowID id, const wxString& title,
-      const wxPoint& WXUNUSED(pos), const wxSize& size,
-      long style, const wxString& name )
-{
-    m_menuBar = (wxMenuBar *) NULL;
-    m_page = (GtkNotebookPage *) NULL;
-    Create( parent, id, title, wxDefaultPosition, size, style, name );
-}
-
-wxMDIChildFrame::~wxMDIChildFrame()
+void wxMDIChildFrame::Init()
 {
-    if (m_menuBar)
-        delete m_menuBar;
+    m_menuBar = NULL;
+    m_page = NULL;
 }
 
-bool wxMDIChildFrame::Create( wxMDIParentFrame *parent,
-      wxWindowID id, const wxString& title,
-      const wxPoint& WXUNUSED(pos), const wxSize& size,
-      long style, const wxString& name )
+bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
+                             wxWindowID id,
+                             const wxString& title,
+                             const wxPoint& WXUNUSED(pos),
+                             const wxSize& size,
+                             long style,
+                             const wxString& name)
 {
+    m_mdiParent = parent;
     m_title = title;
 
-    return wxWindow::Create( parent->GetClientWindow(), id, wxDefaultPosition, size, style, name );
+    return wxWindow::Create(parent->GetClientWindow(), id,
+                            wxDefaultPosition, size,
+                            style, name);
 }
 
-void wxMDIChildFrame::GetClientSize( int *width, int *height ) const
+wxMDIChildFrame::~wxMDIChildFrame()
 {
-    wxWindow::GetClientSize( width, height );
-}
+    delete m_menuBar;
 
-void wxMDIChildFrame::AddChild( wxWindow *child )
-{
-    wxWindow::AddChild( child );
-}
-
-static void SetInvokingWindow( wxMenu *menu, wxWindow *win )
-{
-    menu->SetInvokingWindow( win );
-    wxNode *node = menu->GetItems().First();
-    while (node)
-    {
-        wxMenuItem *menuitem = (wxMenuItem*)node->Data();
-        if (menuitem->IsSubMenu())
-            SetInvokingWindow( menuitem->GetSubMenu(), win );
-        node = node->Next();
-    }
+    // 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);
 }
 
 void wxMDIChildFrame::SetMenuBar( wxMenuBar *menu_bar )
 {
+    wxASSERT_MSG( m_menuBar == NULL, "Only one menubar allowed" );
+
     m_menuBar = menu_bar;
 
     if (m_menuBar)
     {
-        wxMDIParentFrame *mdi_frame = (wxMDIParentFrame*)m_parent->m_parent;
+        wxMDIParentFrame *mdi_frame = (wxMDIParentFrame*)m_parent->GetParent();
 
-       if (m_menuBar->m_parent != this)
-       {
-            wxNode *node = m_menuBar->GetMenus().First();
-            while (node)
-            {
-                wxMenu *menu = (wxMenu*)node->Data();
-                SetInvokingWindow( menu, this );
-                node = node->Next();
-            }
-
-            m_menuBar->m_parent = mdi_frame;
-        }
-
-        /* the menu bar of the child window is shown in idle time as needed */
-        gtk_widget_hide( m_menuBar->m_widget );
+        m_menuBar->SetParent( mdi_frame );
 
         /* insert the invisible menu bar into the _parent_ mdi frame */
-        gtk_myfixed_put( GTK_MYFIXED(mdi_frame->m_mainWidget), m_menuBar->m_widget, 0, 0 );
-        gtk_widget_set_usize( menu_bar->m_widget, 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);
     }
 }
 
@@ -307,100 +324,117 @@ wxMenuBar *wxMDIChildFrame::GetMenuBar() const
     return m_menuBar;
 }
 
-void wxMDIChildFrame::Activate()
+GtkNotebook *wxMDIChildFrame::GTKGetNotebook() const
 {
+    wxMDIClientWindow * const
+        client = wxStaticCast(GetParent(), wxMDIClientWindow);
+    wxCHECK( client, NULL );
+
+    return GTK_NOTEBOOK(client->m_widget);
 }
 
-void wxMDIChildFrame::OnActivate( wxActivateEvent &WXUNUSED(event) )
+void wxMDIChildFrame::Activate()
 {
-}
+    GtkNotebook * const notebook = GTKGetNotebook();
+    wxCHECK_RET( notebook, "no parent notebook?" );
 
-//-----------------------------------------------------------------------------
-// "size_allocate"
-//-----------------------------------------------------------------------------
+    gint pageno = gtk_notebook_page_num( notebook, m_widget );
+    gtk_notebook_set_current_page( notebook, pageno );
+}
 
-static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxWindow *win )
+void wxMDIChildFrame::OnActivate( wxActivateEvent& WXUNUSED(event) )
 {
-    if (g_isIdle) wxapp_install_idle_handler();
+}
 
-    if ((win->m_x == alloc->x) &&
-        (win->m_y == alloc->y) &&
-        (win->m_width == alloc->width) &&
-        (win->m_height == alloc->height) &&
-        (win->m_sizeSet))
+void wxMDIChildFrame::OnMenuHighlight( wxMenuEvent& event )
+{
+#if wxUSE_STATUSBAR
+    wxMDIParentFrame *mdi_frame = (wxMDIParentFrame*)m_parent->GetParent();
+    if ( !ShowMenuHelp(event.GetMenuId()) )
     {
-        return;
+        // we don't have any help text for this item, but may be the MDI frame
+        // does?
+        mdi_frame->OnMenuHighlight(event);
     }
-
-    win->SetSize( alloc->x, alloc->y, alloc->width, alloc->height );
+#endif // wxUSE_STATUSBAR
 }
 
-//-----------------------------------------------------------------------------
-// InsertChild callback for wxMDIClientWindow
-//-----------------------------------------------------------------------------
-
-static void wxInsertChildInMDI( wxMDIClientWindow* parent, wxMDIChildFrame* child )
+void wxMDIChildFrame::SetTitle( const wxString &title )
 {
-    wxString s = child->m_title;
-    if (s.IsNull()) s = _("MDI child");
-
-    GtkWidget *label_widget = gtk_label_new( s.mbc_str() );
-    gtk_misc_set_alignment( GTK_MISC(label_widget), 0.0, 0.5 );
-
-    gtk_signal_connect( GTK_OBJECT(child->m_widget), "size_allocate",
-      GTK_SIGNAL_FUNC(gtk_page_size_callback), (gpointer)child );
-
-    GtkNotebook *notebook = GTK_NOTEBOOK(parent->m_widget);
-
-    gtk_notebook_append_page( notebook, child->m_widget, label_widget );
+    if ( title == m_title )
+        return;
 
-    child->m_page = (GtkNotebookPage*) (g_list_last(notebook->children)->data);
+    m_title = title;
 
-    wxMDIParentFrame *parent_frame = (wxMDIParentFrame*) parent->m_parent;
-    parent_frame->m_justInserted = TRUE;
+    GtkNotebook * const notebook = GTKGetNotebook();
+    wxCHECK_RET( notebook, "no parent notebook?" );
+    gtk_notebook_set_tab_label_text(notebook, m_widget, wxGTK_CONV( title ) );
 }
 
 //-----------------------------------------------------------------------------
 // wxMDIClientWindow
 //-----------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow,wxWindow)
-
-wxMDIClientWindow::wxMDIClientWindow()
-{
-}
-
-wxMDIClientWindow::wxMDIClientWindow( wxMDIParentFrame *parent, long style )
-{
-    CreateClient( parent, style );
-}
+IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow, wxWindow)
 
 wxMDIClientWindow::~wxMDIClientWindow()
 {
+    // disconnect our handler because our ~wxWindow (which is going to be called
+    // after this dtor) will call DestroyChildren(); in turns our children
+    // ~wxWindow dtors will call wxWindow::Show(false) and this will generate
+    // a call to gtk_mdi_page_change_callback with an invalid parent
+    // (because gtk_mdi_page_change_callback expects a wxMDIClientWindow but
+    //  at that point of the dtor chain we are a simple wxWindow!)
+    g_signal_handlers_disconnect_by_func(m_widget,
+                                         (gpointer)gtk_mdi_page_change_callback,
+                                         GetParent());
 }
 
-bool wxMDIClientWindow::CreateClient( wxMDIParentFrame *parent, long style )
+bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style)
 {
-    m_needParent = TRUE;
-
-    m_insertCallback = (wxInsertChildFunction)wxInsertChildInMDI;
-
-    PreCreation( parent, -1, wxPoint(10,10), wxSize(100,100), style, "wxMDIClientWindow" );
+    if ( !PreCreation( parent, wxDefaultPosition, wxDefaultSize ) ||
+         !CreateBase( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize,
+                       style, wxDefaultValidator, "wxMDIClientWindow" ))
+    {
+        wxFAIL_MSG( "wxMDIClientWindow creation failed" );
+        return false;
+    }
 
     m_widget = gtk_notebook_new();
+    g_object_ref(m_widget);
 
-    gtk_notebook_set_scrollable( GTK_NOTEBOOK(m_widget), 1 );
+    g_signal_connect (m_widget, "switch_page",
+                      G_CALLBACK (gtk_mdi_page_change_callback), parent);
 
-    m_parent->AddChild( this );
+    gtk_notebook_set_scrollable( GTK_NOTEBOOK(m_widget), 1 );
 
-    (m_parent->m_insertCallback)( m_parent, this );
+    m_parent->DoAddChild( this );
 
     PostCreation();
 
-    Show( TRUE );
+    Show( true );
 
-    return TRUE;
+    return true;
 }
 
+void wxMDIClientWindow::AddChildGTK(wxWindowGTK* child)
+{
+    wxMDIChildFrame* child_frame = static_cast<wxMDIChildFrame*>(child);
+    wxString s = child_frame->GetTitle();
+    if ( s.empty() )
+        s = _("MDI child");
 
+    GtkWidget *label_widget = gtk_label_new( s.mbc_str() );
+    gtk_misc_set_alignment( GTK_MISC(label_widget), 0.0, 0.5 );
+
+    GtkNotebook* notebook = GTK_NOTEBOOK(m_widget);
+
+    gtk_notebook_append_page( notebook, child->m_widget, label_widget );
+
+    child_frame->m_page = (GtkNotebookPage*) (g_list_last(notebook->children)->data);
+
+    wxMDIParentFrame* parent_frame = static_cast<wxMDIParentFrame*>(GetParent());
+    parent_frame->m_justInserted = true;
+}
 
+#endif // wxUSE_MDI