X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c801d85f158c4cba50b588807daabdcbd0ed3853..c6cdf16c933251be1670f611ba28e48885610b23:/src/gtk1/mdi.cpp diff --git a/src/gtk1/mdi.cpp b/src/gtk1/mdi.cpp index 3ec3c31969..1d8c9ffb62 100644 --- a/src/gtk1/mdi.cpp +++ b/src/gtk1/mdi.cpp @@ -13,13 +13,59 @@ #endif #include "wx/mdi.h" +#include "wx/dialog.h" +#include "wx/menu.h" +#include "wx/gtk/win_gtk.h" + +//----------------------------------------------------------------------------- + +extern wxList wxPendingDelete; //----------------------------------------------------------------------------- // wxMDIParentFrame //----------------------------------------------------------------------------- +static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxWindow *win ) +{ + if ((win->m_x == alloc->x) && + (win->m_y == alloc->y) && + (win->m_width == alloc->width) && + (win->m_height == alloc->height)) + { + return; + }; + + win->SetSize( alloc->x, alloc->y, alloc->width, alloc->height ); +}; + +// page change callback +static void gtk_page_change_callback( GtkNotebook *WXUNUSED(widget), + GtkNotebookPage *page, + gint WXUNUSED(nPage), + wxMDIClientWindow *client_win ) +{ + wxNode *node = client_win->m_children.First(); + while (node) + { + wxMDIChildFrame *child_frame = (wxMDIChildFrame *)node->Data(); + if (child_frame->m_page == page) + { + wxMDIParentFrame *mdi_frame = (wxMDIParentFrame*)client_win->m_parent; + mdi_frame->m_currentChild = child_frame; + mdi_frame->SetMDIMenuBar( child_frame->m_menuBar ); + return; + }; + node = node->Next(); + } +} + +//----------------------------------------------------------------------------- + IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame,wxFrame) +BEGIN_EVENT_TABLE(wxMDIParentFrame, wxFrame) +END_EVENT_TABLE() + wxMDIParentFrame::wxMDIParentFrame(void) { m_clientWindow = NULL; @@ -28,9 +74,9 @@ wxMDIParentFrame::wxMDIParentFrame(void) }; wxMDIParentFrame::wxMDIParentFrame( wxWindow *parent, - const wxWindowID id, const wxString& title, + wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, - const long style, const wxString& name ) + long style, const wxString& name ) { m_clientWindow = NULL; m_currentChild = NULL; @@ -43,9 +89,9 @@ wxMDIParentFrame::~wxMDIParentFrame(void) }; bool wxMDIParentFrame::Create( wxWindow *parent, - const wxWindowID id, const wxString& title, + wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, - const long style, const wxString& name ) + long style, const wxString& name ) { wxFrame::Create( parent, id, title, pos, size, style, name ); @@ -54,18 +100,31 @@ bool wxMDIParentFrame::Create( wxWindow *parent, return TRUE; }; -void wxMDIParentFrame::OnSize( wxSizeEvent& event ) -{ - wxFrame::OnSize( event ); -}; - -void wxMDIParentFrame::OnActivate( wxActivateEvent& WXUNUSED(event) ) +void wxMDIParentFrame::GtkOnSize( int x, int y, int width, int height ) { + wxFrame::GtkOnSize( x, y, width, height ); + + if (m_mdiMenuBar) + { + int x = 0; + int y = 0; + GetClientSize( &x, &y ); + m_mdiMenuBar->SetSize( 1, 1, x-2, 26 ); + } }; -void wxMDIParentFrame::SetMenuBar( wxMenuBar *menu_bar ) +void wxMDIParentFrame::SetMDIMenuBar( wxMenuBar *menu_bar ) { - wxFrame::SetMenuBar( menu_bar ); + if (m_mdiMenuBar) m_mdiMenuBar->Show( FALSE ); + m_mdiMenuBar = menu_bar; + if (m_mdiMenuBar) + { + int x = 0; + int y = 0; + GetClientSize( &x, &y ); + m_mdiMenuBar->SetSize( 1, 1, x-2, 26 ); + m_mdiMenuBar->Show( TRUE ); + } }; void wxMDIParentFrame::GetClientSize(int *width, int *height ) const @@ -91,9 +150,17 @@ wxMDIClientWindow *wxMDIParentFrame::OnCreateClient(void) void wxMDIParentFrame::ActivateNext(void) { + if (m_clientWindow) + gtk_notebook_next_page( GTK_NOTEBOOK(m_clientWindow->m_widget) ); }; void wxMDIParentFrame::ActivatePrevious(void) +{ + if (m_clientWindow) + gtk_notebook_prev_page( GTK_NOTEBOOK(m_clientWindow->m_widget) ); +}; + +void wxMDIParentFrame::OnActivate( wxActivateEvent& WXUNUSED(event) ) { }; @@ -105,41 +172,114 @@ void wxMDIParentFrame::OnSysColourChanged( wxSysColourChangedEvent& WXUNUSED(eve // wxMDIChildFrame //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame,wxPanel) +IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame,wxFrame) +BEGIN_EVENT_TABLE(wxMDIChildFrame, wxFrame) + EVT_ACTIVATE(wxMDIChildFrame::OnActivate) +END_EVENT_TABLE() + wxMDIChildFrame::wxMDIChildFrame(void) { + m_menuBar = NULL; + m_page = NULL; }; wxMDIChildFrame::wxMDIChildFrame( wxMDIParentFrame *parent, - const wxWindowID id, const wxString& title, - const wxPoint& pos, const wxSize& size, - const long style, const wxString& name ) + wxWindowID id, const wxString& title, + const wxPoint& WXUNUSED(pos), const wxSize& size, + long style, const wxString& name ) { - Create( parent, id, title, pos, size, style, name ); + m_menuBar = NULL; + m_page = NULL; + Create( parent, id, title, wxDefaultPosition, size, style, name ); }; wxMDIChildFrame::~wxMDIChildFrame(void) { + if (m_menuBar) + { + wxMDIParentFrame *mdi_frame = (wxMDIParentFrame*)m_parent->m_parent; + if (mdi_frame->m_currentChild == this) + { + mdi_frame->SetMDIMenuBar( NULL ); + mdi_frame->m_currentChild = NULL; + }; + delete m_menuBar; + } }; bool wxMDIChildFrame::Create( wxMDIParentFrame *parent, - const wxWindowID id, const wxString& title, - const wxPoint& pos, const wxSize& size, - const long style, const wxString& name ) + wxWindowID id, const wxString& title, + const wxPoint& WXUNUSED(pos), const wxSize& size, + long style, const wxString& name ) { m_title = title; - return wxPanel::Create( parent->GetClientWindow(), id, pos, size, style, name ); + return wxWindow::Create( parent->GetClientWindow(), id, wxDefaultPosition, size, style, name ); }; -void wxMDIChildFrame::SetMenuBar( wxMenuBar *WXUNUSED(menu_bar) ) +void wxMDIChildFrame::GetClientSize( int *width, int *height ) const { + wxWindow::GetClientSize( width, height ); +} + +void wxMDIChildFrame::AddChild( wxWindow *child ) +{ + wxWindow::AddChild( child ); +} + +static void SetInvokingWindow( wxMenu *menu, wxWindow *win ) +{ + menu->SetInvokingWindow( win ); + wxNode *node = menu->m_items.First(); + while (node) + { + wxMenuItem *menuitem = (wxMenuItem*)node->Data(); + if (menuitem->IsSubMenu()) + SetInvokingWindow( menuitem->GetSubMenu(), win ); + node = node->Next(); + }; +}; + +void wxMDIChildFrame::SetMenuBar( wxMenuBar *menu_bar ) +{ + m_menuBar = menu_bar; + + if (m_menuBar) + { + wxMDIParentFrame *mdi_frame = (wxMDIParentFrame*)m_parent->m_parent; + + if (m_menuBar->m_parent != this) + { + wxNode *node = m_menuBar->m_menus.First(); + while (node) + { + wxMenu *menu = (wxMenu*)node->Data(); + SetInvokingWindow( menu, this ); + node = node->Next(); + }; + + m_menuBar->m_parent = mdi_frame; + } + mdi_frame->SetMDIMenuBar( m_menuBar ); + + gtk_myfixed_put( GTK_MYFIXED(mdi_frame->m_mainWindow), + m_menuBar->m_widget, m_menuBar->m_x, m_menuBar->m_y ); + } +}; + +wxMenuBar *wxMDIChildFrame::GetMenuBar() +{ + return m_menuBar; }; void wxMDIChildFrame::Activate(void) { }; +void wxMDIChildFrame::OnActivate( wxActivateEvent &WXUNUSED(event) ) +{ +}; + //----------------------------------------------------------------------------- // wxMDIClientWindow //----------------------------------------------------------------------------- @@ -150,7 +290,7 @@ wxMDIClientWindow::wxMDIClientWindow(void) { }; -wxMDIClientWindow::wxMDIClientWindow( wxMDIParentFrame *parent, const long style ) +wxMDIClientWindow::wxMDIClientWindow( wxMDIParentFrame *parent, long style ) { CreateClient( parent, style ); }; @@ -159,7 +299,7 @@ wxMDIClientWindow::~wxMDIClientWindow(void) { }; -bool wxMDIClientWindow::CreateClient( wxMDIParentFrame *parent, const long style ) +bool wxMDIClientWindow::CreateClient( wxMDIParentFrame *parent, long style ) { m_needParent = TRUE; @@ -167,6 +307,11 @@ bool wxMDIClientWindow::CreateClient( wxMDIParentFrame *parent, const long style m_widget = gtk_notebook_new(); + gtk_signal_connect( GTK_OBJECT(m_widget), "switch_page", + GTK_SIGNAL_FUNC(gtk_page_change_callback), (gpointer)this ); + + gtk_notebook_set_scrollable( GTK_NOTEBOOK(m_widget), 1 ); + PostCreation(); Show( TRUE ); @@ -176,23 +321,33 @@ bool wxMDIClientWindow::CreateClient( wxMDIParentFrame *parent, const long style void wxMDIClientWindow::AddChild( wxWindow *child ) { - m_children.Append( child ); - - wxString s; - - if (child->IsKindOf(CLASSINFO(wxMDIChildFrame))) + if (!child->IsKindOf(CLASSINFO(wxMDIChildFrame))) { - wxMDIChildFrame* mdi_child = (wxMDIChildFrame*) child; - s = mdi_child->m_title; + wxFAIL_MSG("wxNotebook::AddChild: Child has to be wxMDIChildFrame"); + return; }; + m_children.Append( child ); + + wxString s; + wxMDIChildFrame* mdi_child = (wxMDIChildFrame*) child; + s = mdi_child->m_title; if (s.IsNull()) s = "MDI child"; GtkWidget *label_widget; label_widget = gtk_label_new( s ); 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 ); + gtk_notebook_append_page( GTK_NOTEBOOK(m_widget), child->m_widget, label_widget ); + + mdi_child->m_page = (GtkNotebookPage*) (g_list_last(GTK_NOTEBOOK(m_widget)->children)->data); + + gtk_notebook_set_page( GTK_NOTEBOOK(m_widget), m_children.Number()-1 ); + + gtk_page_change_callback( NULL, mdi_child->m_page, 0, this ); };