/////////////////////////////////////////////////////////////////////////////
-// Name: mdi.cpp
+// Name: src/gtk1/mdi.cpp
// Purpose:
// Author: Robert Roebling
// Id: $Id$
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "mdi.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
+#if wxUSE_MDI
+
#include "wx/mdi.h"
-#if wxUSE_MDI
+#ifndef WX_PRECOMP
+ #include "wx/intl.h"
+ #include "wx/menu.h"
+ #include "wx/dialog.h"
+#endif
-#include "wx/dialog.h"
-#include "wx/menu.h"
-#include "wx/intl.h"
-#include "wx/gtk/private.h"
+#include "wx/notebook.h"
+#include "wx/gtk1/private.h"
#include <glib.h>
#include <gdk/gdk.h>
#include <gtk/gtk.h>
-#include "wx/gtk/win_gtk.h"
+#include "wx/gtk1/win_gtk.h"
//-----------------------------------------------------------------------------
// constants
// globals
//-----------------------------------------------------------------------------
-extern wxList wxPendingDelete;
-
//-----------------------------------------------------------------------------
// "switch_page"
//-----------------------------------------------------------------------------
+extern "C" {
static void
gtk_mdi_page_change_callback( GtkNotebook *WXUNUSED(widget),
GtkNotebookPage *page,
{
wxActivateEvent event1( wxEVT_ACTIVATE, false, child->GetId() );
event1.SetEventObject( child);
- child->GetEventHandler()->ProcessEvent( event1 );
+ child->HandleWindowEvent( event1 );
}
// send activate event to new child
while (node)
{
wxMDIChildFrame *child_frame = wxDynamicCast( node->GetData(), wxMDIChildFrame );
-
- wxASSERT_MSG( child_frame, _T("child is not a wxMDIChildFrame") );
+ // CE: we come here in the destructor with a null child_frame - I think because
+ // gtk_signal_connect( GTK_OBJECT(m_widget), "switch_page", (see below)
+ // isn't deleted early enough
+ if (!child_frame)
+ return ;
if (child_frame->m_page == page)
{
wxActivateEvent event2( wxEVT_ACTIVATE, true, child->GetId() );
event2.SetEventObject( child);
- child->GetEventHandler()->ProcessEvent( event2 );
+ child->HandleWindowEvent( event2 );
+}
}
//-----------------------------------------------------------------------------
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;
+ return m_clientWindow != NULL;
}
void wxMDIParentFrame::GtkOnSize( int x, int y, int width, int height )
GtkNotebook *notebook = GTK_NOTEBOOK(m_clientWindow->m_widget);
gtk_notebook_set_page( notebook, g_list_length( notebook->children ) - 1 );
- /* need to set the menubar of the child */
+ /* need to set the menubar of the child */
wxMDIChildFrame *active_child_frame = GetActiveChild();
- wxMenuBar *menu_bar = active_child_frame->m_menuBar;
- 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);
-
+ if (active_child_frame != NULL)
+ {
+ 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);
+ }
+ }
m_justInserted = false;
return;
}
wxMDIClientWindow *wxMDIParentFrame::OnCreateClient()
{
- m_clientWindow = new wxMDIClientWindow( this );
- return m_clientWindow;
+ return new wxMDIClientWindow( this );
}
void wxMDIParentFrame::ActivateNext()
{
#if wxUSE_STATUSBAR
wxMDIParentFrame *mdi_frame = (wxMDIParentFrame*)m_parent->GetParent();
- if ( !ShowMenuHelp(mdi_frame->GetStatusBar(), event.GetMenuId()) )
+ if ( !ShowMenuHelp(event.GetMenuId()) )
{
// we don't have any help text for this item, but may be the MDI frame
// does?
// "size_allocate"
//-----------------------------------------------------------------------------
+extern "C" {
static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxWindow *win )
{
if (g_isIdle) wxapp_install_idle_handler();
win->SetSize( alloc->x, alloc->y, alloc->width, alloc->height );
}
+}
//-----------------------------------------------------------------------------
// InsertChild callback for wxMDIClientWindow
static void wxInsertChildInMDI( wxMDIClientWindow* parent, wxMDIChildFrame* child )
{
- wxString s = child->m_title;
+ wxString s = child->GetTitle();
if (s.IsNull()) s = _("MDI child");
GtkWidget *label_widget = gtk_label_new( s.mbc_str() );
wxMDIClientWindow::~wxMDIClientWindow()
{
+
}
bool wxMDIClientWindow::CreateClient( wxMDIParentFrame *parent, long style )
m_insertCallback = (wxInsertChildFunction)wxInsertChildInMDI;
if (!PreCreation( parent, wxDefaultPosition, wxDefaultSize ) ||
- !CreateBase( parent, -1, wxDefaultPosition, wxDefaultSize, style, wxDefaultValidator, wxT("wxMDIClientWindow") ))
+ !CreateBase( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, style, wxDefaultValidator, wxT("wxMDIClientWindow") ))
{
wxFAIL_MSG( wxT("wxMDIClientWindow creation failed") );
return false;