From 716b736420b6f9722f44c53931ceeeb23e8e54e4 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 22 Jul 1998 22:13:31 +0000 Subject: [PATCH] mdi private menus Chris's check menu additions frame fixes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@323 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/wxQt.html | 14 +-- include/wx/gtk/bitmap.h | 6 +- include/wx/gtk/frame.h | 8 +- include/wx/gtk/mdi.h | 59 ++++++++----- include/wx/gtk/menu.h | 22 +++-- include/wx/gtk/notebook.h | 10 +-- include/wx/gtk/tbargtk.h | 18 ++-- include/wx/gtk1/bitmap.h | 6 +- include/wx/gtk1/frame.h | 8 +- include/wx/gtk1/mdi.h | 59 ++++++++----- include/wx/gtk1/menu.h | 22 +++-- include/wx/gtk1/notebook.h | 10 +-- include/wx/gtk1/tbargtk.h | 18 ++-- include/wx/toolbar.h | 1 - samples/mdi/mdi.cpp | 9 +- src/gtk/frame.cpp | 39 +++++---- src/gtk/mdi.cpp | 171 +++++++++++++++++++++++++++++++++---- src/gtk/menu.cpp | 85 +++++++++++++++++- src/gtk/notebook.cpp | 3 + src/gtk/tbargtk.cpp | 46 +++++----- src/gtk1/frame.cpp | 39 +++++---- src/gtk1/mdi.cpp | 171 +++++++++++++++++++++++++++++++++---- src/gtk1/menu.cpp | 85 +++++++++++++++++- src/gtk1/notebook.cpp | 3 + src/gtk1/tbargtk.cpp | 46 +++++----- user/wxFile/wxFile.cpp | 2 +- user/wxFile/wxFile.h | 2 +- user/wxTest/wxTest.cpp | 2 +- user/wxTest/wxTest.h | 2 +- 29 files changed, 744 insertions(+), 222 deletions(-) diff --git a/docs/wxQt.html b/docs/wxQt.html index b271a816a1..9fd51dc7fd 100644 --- a/docs/wxQt.html +++ b/docs/wxQt.html @@ -1,9 +1,9 @@ $Id$
-

Proposal for a wxQt project

+

Proposal for a port of wxWindows to Qt - wxQt

Following the recent discussions - and flamewars about KDE vs Gnome, I got worried that we see a + and flamewars about KDE vs Gnome, we got worried that we'll see a repetition of the same damaging infighting from which Unix has suffered before. Competition is a good thing, but the current situation leaves application developers with a difficult decision to @@ -16,10 +16,10 @@ The people on the wxWindows developers team thought that we might have a solution for this problem, if we can get some outside help to get it - done. Let me explain: wxWindows is a cross-platform development + done. Let us explain: wxWindows is a cross-platform development toolkit, a library of C++ classes which provide GUI concepts as well as other cross-platform issues such as container classes, debug - features or configuration management. It has been around since 1992G + features or configuration management. It has been around since 1992 and started by supporting Motif, XView and MS-Windows, with a direct X11/Xt port added later. Last year, a major rewrite was started and we now have a much advanced library, available for MS Windows, with a @@ -37,10 +37,10 @@ operating systems (a MacOS port is under construction, too), it could easily bridge the gap between KDE and Gnome. The quick evolution of wxGTK has shown that a new port based on an existing widget set or - toolkit can easily be created by a small team within few + toolkit can easily be created by a small team within a few months. Therefore, we would like to start a project for a Qt/Harmony based wxWindow library, wxQt. It would then be possible for - application developers to write the same source and copile it either + application developers to write the same source and compile it either for KDE, Gnome or even any of the other supported systems.

@@ -50,7 +50,7 @@ code from the other ports. Please, join us in this effort and, if you feel that you could - contribute, join the wxWindows developers mainling list for further + contribute, join the wxWindows developers mailing list for further discussions. Just send a mail containing "subscribe" to wxwin-developers-request@x.dent.med.uni-muenchen.de

diff --git a/include/wx/gtk/bitmap.h b/include/wx/gtk/bitmap.h index 94795def8e..95db695c3b 100644 --- a/include/wx/gtk/bitmap.h +++ b/include/wx/gtk/bitmap.h @@ -28,7 +28,7 @@ class wxDC; class wxPaintDC; class wxMemoryDC; -class wxToolBarGTK; +class wxToolBar; class wxBitmapButton; class wxStaticBitmap; @@ -56,7 +56,7 @@ class wxMask: public wxObject friend wxBitmap; friend wxDC; friend wxPaintDC; - friend wxToolBarGTK; + friend wxToolBar; friend wxBitmapButton; friend wxStaticBitmap; @@ -116,7 +116,7 @@ class wxBitmap: public wxObject friend wxDC; friend wxPaintDC; friend wxMemoryDC; - friend wxToolBarGTK; + friend wxToolBar; friend wxBitmapButton; friend wxStaticBitmap; diff --git a/include/wx/gtk/frame.h b/include/wx/gtk/frame.h index 9e909a9b5e..07e4e586ff 100644 --- a/include/wx/gtk/frame.h +++ b/include/wx/gtk/frame.h @@ -26,7 +26,7 @@ // classes //----------------------------------------------------------------------------- -class wxRadioBox; +class wxMDIChildFrame; class wxFrame; @@ -73,16 +73,18 @@ class wxFrame: public wxWindow //private: - void GtkOnSize( int x, int y, int width, int height ); + virtual void GtkOnSize( int x, int y, int width, int height ); void DoMenuUpdates(void); void DoMenuUpdates(wxMenu* menu); + private: friend wxWindow; + friend wxMDIChildFrame; - GtkWidget *m_mainWindow; wxMenuBar *m_frameMenuBar; + GtkWidget *m_mainWindow; wxStatusBar *m_frameStatusBar; bool m_doingOnSize; wxString m_title; diff --git a/include/wx/gtk/mdi.h b/include/wx/gtk/mdi.h index 22fe70b2c4..94fe7216b0 100644 --- a/include/wx/gtk/mdi.h +++ b/include/wx/gtk/mdi.h @@ -22,6 +22,7 @@ #include "wx/control.h" #include "wx/panel.h" #include "wx/frame.h" +#include "wx/toolbar.h" //----------------------------------------------------------------------------- // classes @@ -63,30 +64,40 @@ class wxMDIParentFrame: public wxFrame long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, const wxString& name = wxFrameNameStr ); - void OnSize( wxSizeEvent& event ); - void OnActivate( wxActivateEvent& event ); - void SetMenuBar( wxMenuBar *menu_bar ); - void GetClientSize(int *width, int *height) const; - wxMDIChildFrame *GetActiveChild(void) const; + void GetClientSize(int *width, int *height) const; + wxMDIChildFrame *GetActiveChild(void) const; + + virtual void SetToolBar( wxToolBar *toolbar ); + virtual wxWindow *GetToolBar(void) const; - wxMDIClientWindow *GetClientWindow(void) const; - virtual wxMDIClientWindow *OnCreateClient(void); + wxMDIClientWindow *GetClientWindow(void) const; + virtual wxMDIClientWindow *OnCreateClient(void); - virtual void Cascade(void) {}; - virtual void Tile(void) {}; - virtual void ArrangeIcons(void) {}; - virtual void ActivateNext(void); - virtual void ActivatePrevious(void); - - void OnSysColourChanged(wxSysColourChangedEvent& event); + virtual void Cascade(void) {}; + virtual void Tile(void) {}; + virtual void ArrangeIcons(void) {}; + virtual void ActivateNext(void); + virtual void ActivatePrevious(void); + + void OnActivate( wxActivateEvent& event ); + void OnSysColourChanged( wxSysColourChangedEvent& event ); + + //private: + + wxMDIChildFrame *m_currentChild; + + void SetMDIMenuBar( wxMenuBar *menu_bar ); + virtual void GtkOnSize( int x, int y, int width, int height ); - protected: - wxMDIClientWindow * m_clientWindow; - wxMDIChildFrame * m_currentChild; + private: + + wxMDIClientWindow *m_clientWindow; bool m_parentFrameActive; + wxMenuBar *m_mdiMenuBar; + wxToolBar *m_toolBar; -// DECLARE_EVENT_TABLE() + DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- @@ -120,9 +131,19 @@ class wxMDIChildFrame: public wxPanel virtual void Restore(void) {}; virtual void Activate(void); + bool Destroy(void); + void OnCloseWindow( wxCloseEvent& event ); + public: - wxString m_title; + wxString m_title; + wxMenuBar *m_menuBar; + +// private: + + GtkNotebookPage *m_page; + + DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- diff --git a/include/wx/gtk/menu.h b/include/wx/gtk/menu.h index d4c48d4cd4..50ed50f32b 100644 --- a/include/wx/gtk/menu.h +++ b/include/wx/gtk/menu.h @@ -48,6 +48,9 @@ class wxMenuBar: public wxWindow wxMenuBar(void); void Append( wxMenu *menu, const wxString &title ); int FindMenuItem( const wxString &menuString, const wxString &itemString ) const; + wxMenuItem* FindMenuItemById( int id ) const; + bool IsChecked( int id ) const; + bool IsEnabled( int id ) const; wxList m_menus; GtkWidget *m_menubar; @@ -76,14 +79,16 @@ class wxMenuItem: public wxObject GtkWidget *m_menuItem; // GtkMenuItem - bool IsSeparator() const { return m_id == ID_SEPARATOR; } - bool IsEnabled() const { return m_isEnabled; } - bool IsChecked() const { return m_checked; } - - int GetId() const { return m_id; } - const wxString& GetHelp() const { return m_helpStr; } - wxMenu *GetSubMenu() const { return m_subMenu; } - + bool IsCheckable() const { return m_isCheckMenu; } + bool IsSeparator() const { return m_id == ID_SEPARATOR; } + bool IsEnabled() const { return m_isEnabled; } + int GetId() const { return m_id; } + const wxString& GetHelp() const { return m_helpStr; } + wxMenu *GetSubMenu() const { return m_subMenu; } + + void Check( bool check ); + bool IsChecked() const; + void Enable( bool enable ); }; class wxMenu: public wxEvtHandler @@ -99,6 +104,7 @@ class wxMenu: public wxEvtHandler void Append( int id, const wxString &item, wxMenu *subMenu, const wxString &helpStr = "" ); int FindItem( const wxString itemString ) const; + wxMenuItem* FindItemForId( int id ) const; void Break(void) {}; void Check(int id, bool Flag); void Enable( int id, bool enable ); diff --git a/include/wx/gtk/notebook.h b/include/wx/gtk/notebook.h index e423b69564..035520de8f 100644 --- a/include/wx/gtk/notebook.h +++ b/include/wx/gtk/notebook.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: tabctrl.h -// Purpose: wxTabCtrl class +// Name: notebook.h +// Purpose: wxNotebook class // Author: Robert Roebling // Modified by: // RCS-ID: $Id$ @@ -8,8 +8,8 @@ // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// -#ifndef __TABCTRLH__ -#define __TABCTRLH__ +#ifndef __NOTEBOOKH__ +#define __NOTEBOOKH__ #ifdef __GNUG__ #pragma interface "notebook.h" @@ -186,4 +186,4 @@ typedef void (wxEvtHandler::*wxNotebookEventFunction)(wxNotebookEvent&); }, #endif - // __TABCTRLH__ + // __NOTEBOOKH__ diff --git a/include/wx/gtk/tbargtk.h b/include/wx/gtk/tbargtk.h index 667f84ff47..8a952ec2da 100644 --- a/include/wx/gtk/tbargtk.h +++ b/include/wx/gtk/tbargtk.h @@ -24,7 +24,7 @@ //----------------------------------------------------------------------------- class wxToolBarTool; -class wxToolBarGTK; +class wxToolBar; //----------------------------------------------------------------------------- // constants @@ -50,7 +50,7 @@ class wxToolBarTool: public wxObject public: wxToolBarTool(void) {}; - wxToolBarTool( wxToolBarGTK *owner, int theIndex = 0, + wxToolBarTool( wxToolBar *owner, int theIndex = 0, const wxBitmap& bitmap1 = wxNullBitmap, const wxBitmap& bitmap2 = wxNullBitmap, bool toggle = FALSE, wxObject *clientData = NULL, const wxString& shortHelpString = "", const wxString& longHelpString = ""); @@ -70,24 +70,24 @@ class wxToolBarTool: public wxObject bool m_isMenuCommand; wxString m_shortHelpString; wxString m_longHelpString; - wxToolBarGTK *m_owner; + wxToolBar *m_owner; }; //----------------------------------------------------------------------------- -// wxToolBarGTK +// wxToolBar //----------------------------------------------------------------------------- -class wxToolBarGTK: public wxControl +class wxToolBar: public wxControl { - DECLARE_DYNAMIC_CLASS(wxToolBarGTK) + DECLARE_DYNAMIC_CLASS(wxToolBar) public: - wxToolBarGTK(void); - wxToolBarGTK( wxWindow *parent, wxWindowID id, + wxToolBar(void); + wxToolBar( wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = wxToolBarNameStr ); - ~wxToolBarGTK(void); + ~wxToolBar(void); bool Create( wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, diff --git a/include/wx/gtk1/bitmap.h b/include/wx/gtk1/bitmap.h index 94795def8e..95db695c3b 100644 --- a/include/wx/gtk1/bitmap.h +++ b/include/wx/gtk1/bitmap.h @@ -28,7 +28,7 @@ class wxDC; class wxPaintDC; class wxMemoryDC; -class wxToolBarGTK; +class wxToolBar; class wxBitmapButton; class wxStaticBitmap; @@ -56,7 +56,7 @@ class wxMask: public wxObject friend wxBitmap; friend wxDC; friend wxPaintDC; - friend wxToolBarGTK; + friend wxToolBar; friend wxBitmapButton; friend wxStaticBitmap; @@ -116,7 +116,7 @@ class wxBitmap: public wxObject friend wxDC; friend wxPaintDC; friend wxMemoryDC; - friend wxToolBarGTK; + friend wxToolBar; friend wxBitmapButton; friend wxStaticBitmap; diff --git a/include/wx/gtk1/frame.h b/include/wx/gtk1/frame.h index 9e909a9b5e..07e4e586ff 100644 --- a/include/wx/gtk1/frame.h +++ b/include/wx/gtk1/frame.h @@ -26,7 +26,7 @@ // classes //----------------------------------------------------------------------------- -class wxRadioBox; +class wxMDIChildFrame; class wxFrame; @@ -73,16 +73,18 @@ class wxFrame: public wxWindow //private: - void GtkOnSize( int x, int y, int width, int height ); + virtual void GtkOnSize( int x, int y, int width, int height ); void DoMenuUpdates(void); void DoMenuUpdates(wxMenu* menu); + private: friend wxWindow; + friend wxMDIChildFrame; - GtkWidget *m_mainWindow; wxMenuBar *m_frameMenuBar; + GtkWidget *m_mainWindow; wxStatusBar *m_frameStatusBar; bool m_doingOnSize; wxString m_title; diff --git a/include/wx/gtk1/mdi.h b/include/wx/gtk1/mdi.h index 22fe70b2c4..94fe7216b0 100644 --- a/include/wx/gtk1/mdi.h +++ b/include/wx/gtk1/mdi.h @@ -22,6 +22,7 @@ #include "wx/control.h" #include "wx/panel.h" #include "wx/frame.h" +#include "wx/toolbar.h" //----------------------------------------------------------------------------- // classes @@ -63,30 +64,40 @@ class wxMDIParentFrame: public wxFrame long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, const wxString& name = wxFrameNameStr ); - void OnSize( wxSizeEvent& event ); - void OnActivate( wxActivateEvent& event ); - void SetMenuBar( wxMenuBar *menu_bar ); - void GetClientSize(int *width, int *height) const; - wxMDIChildFrame *GetActiveChild(void) const; + void GetClientSize(int *width, int *height) const; + wxMDIChildFrame *GetActiveChild(void) const; + + virtual void SetToolBar( wxToolBar *toolbar ); + virtual wxWindow *GetToolBar(void) const; - wxMDIClientWindow *GetClientWindow(void) const; - virtual wxMDIClientWindow *OnCreateClient(void); + wxMDIClientWindow *GetClientWindow(void) const; + virtual wxMDIClientWindow *OnCreateClient(void); - virtual void Cascade(void) {}; - virtual void Tile(void) {}; - virtual void ArrangeIcons(void) {}; - virtual void ActivateNext(void); - virtual void ActivatePrevious(void); - - void OnSysColourChanged(wxSysColourChangedEvent& event); + virtual void Cascade(void) {}; + virtual void Tile(void) {}; + virtual void ArrangeIcons(void) {}; + virtual void ActivateNext(void); + virtual void ActivatePrevious(void); + + void OnActivate( wxActivateEvent& event ); + void OnSysColourChanged( wxSysColourChangedEvent& event ); + + //private: + + wxMDIChildFrame *m_currentChild; + + void SetMDIMenuBar( wxMenuBar *menu_bar ); + virtual void GtkOnSize( int x, int y, int width, int height ); - protected: - wxMDIClientWindow * m_clientWindow; - wxMDIChildFrame * m_currentChild; + private: + + wxMDIClientWindow *m_clientWindow; bool m_parentFrameActive; + wxMenuBar *m_mdiMenuBar; + wxToolBar *m_toolBar; -// DECLARE_EVENT_TABLE() + DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- @@ -120,9 +131,19 @@ class wxMDIChildFrame: public wxPanel virtual void Restore(void) {}; virtual void Activate(void); + bool Destroy(void); + void OnCloseWindow( wxCloseEvent& event ); + public: - wxString m_title; + wxString m_title; + wxMenuBar *m_menuBar; + +// private: + + GtkNotebookPage *m_page; + + DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- diff --git a/include/wx/gtk1/menu.h b/include/wx/gtk1/menu.h index d4c48d4cd4..50ed50f32b 100644 --- a/include/wx/gtk1/menu.h +++ b/include/wx/gtk1/menu.h @@ -48,6 +48,9 @@ class wxMenuBar: public wxWindow wxMenuBar(void); void Append( wxMenu *menu, const wxString &title ); int FindMenuItem( const wxString &menuString, const wxString &itemString ) const; + wxMenuItem* FindMenuItemById( int id ) const; + bool IsChecked( int id ) const; + bool IsEnabled( int id ) const; wxList m_menus; GtkWidget *m_menubar; @@ -76,14 +79,16 @@ class wxMenuItem: public wxObject GtkWidget *m_menuItem; // GtkMenuItem - bool IsSeparator() const { return m_id == ID_SEPARATOR; } - bool IsEnabled() const { return m_isEnabled; } - bool IsChecked() const { return m_checked; } - - int GetId() const { return m_id; } - const wxString& GetHelp() const { return m_helpStr; } - wxMenu *GetSubMenu() const { return m_subMenu; } - + bool IsCheckable() const { return m_isCheckMenu; } + bool IsSeparator() const { return m_id == ID_SEPARATOR; } + bool IsEnabled() const { return m_isEnabled; } + int GetId() const { return m_id; } + const wxString& GetHelp() const { return m_helpStr; } + wxMenu *GetSubMenu() const { return m_subMenu; } + + void Check( bool check ); + bool IsChecked() const; + void Enable( bool enable ); }; class wxMenu: public wxEvtHandler @@ -99,6 +104,7 @@ class wxMenu: public wxEvtHandler void Append( int id, const wxString &item, wxMenu *subMenu, const wxString &helpStr = "" ); int FindItem( const wxString itemString ) const; + wxMenuItem* FindItemForId( int id ) const; void Break(void) {}; void Check(int id, bool Flag); void Enable( int id, bool enable ); diff --git a/include/wx/gtk1/notebook.h b/include/wx/gtk1/notebook.h index e423b69564..035520de8f 100644 --- a/include/wx/gtk1/notebook.h +++ b/include/wx/gtk1/notebook.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: tabctrl.h -// Purpose: wxTabCtrl class +// Name: notebook.h +// Purpose: wxNotebook class // Author: Robert Roebling // Modified by: // RCS-ID: $Id$ @@ -8,8 +8,8 @@ // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// -#ifndef __TABCTRLH__ -#define __TABCTRLH__ +#ifndef __NOTEBOOKH__ +#define __NOTEBOOKH__ #ifdef __GNUG__ #pragma interface "notebook.h" @@ -186,4 +186,4 @@ typedef void (wxEvtHandler::*wxNotebookEventFunction)(wxNotebookEvent&); }, #endif - // __TABCTRLH__ + // __NOTEBOOKH__ diff --git a/include/wx/gtk1/tbargtk.h b/include/wx/gtk1/tbargtk.h index 667f84ff47..8a952ec2da 100644 --- a/include/wx/gtk1/tbargtk.h +++ b/include/wx/gtk1/tbargtk.h @@ -24,7 +24,7 @@ //----------------------------------------------------------------------------- class wxToolBarTool; -class wxToolBarGTK; +class wxToolBar; //----------------------------------------------------------------------------- // constants @@ -50,7 +50,7 @@ class wxToolBarTool: public wxObject public: wxToolBarTool(void) {}; - wxToolBarTool( wxToolBarGTK *owner, int theIndex = 0, + wxToolBarTool( wxToolBar *owner, int theIndex = 0, const wxBitmap& bitmap1 = wxNullBitmap, const wxBitmap& bitmap2 = wxNullBitmap, bool toggle = FALSE, wxObject *clientData = NULL, const wxString& shortHelpString = "", const wxString& longHelpString = ""); @@ -70,24 +70,24 @@ class wxToolBarTool: public wxObject bool m_isMenuCommand; wxString m_shortHelpString; wxString m_longHelpString; - wxToolBarGTK *m_owner; + wxToolBar *m_owner; }; //----------------------------------------------------------------------------- -// wxToolBarGTK +// wxToolBar //----------------------------------------------------------------------------- -class wxToolBarGTK: public wxControl +class wxToolBar: public wxControl { - DECLARE_DYNAMIC_CLASS(wxToolBarGTK) + DECLARE_DYNAMIC_CLASS(wxToolBar) public: - wxToolBarGTK(void); - wxToolBarGTK( wxWindow *parent, wxWindowID id, + wxToolBar(void); + wxToolBar( wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = wxToolBarNameStr ); - ~wxToolBarGTK(void); + ~wxToolBar(void); bool Create( wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, diff --git a/include/wx/toolbar.h b/include/wx/toolbar.h index 7d4111f2d5..d3c590d0a4 100644 --- a/include/wx/toolbar.h +++ b/include/wx/toolbar.h @@ -11,7 +11,6 @@ # define classwxToolBar classwxToolBarMSW #elif defined(__WXGTK__) # include "wx/gtk/tbargtk.h" -# define classwxToolBar wxToolBarGTK #endif #endif diff --git a/samples/mdi/mdi.cpp b/samples/mdi/mdi.cpp index 97b0a355ab..114eb4c78d 100644 --- a/samples/mdi/mdi.cpp +++ b/samples/mdi/mdi.cpp @@ -29,6 +29,11 @@ #endif #endif +#ifdef __WXGTK__ +//#include "list.xpm" +//#include "folder.xpm" +#endif + #include "mdi.h" MyFrame *frame = NULL; @@ -85,10 +90,10 @@ bool MyApp::OnInit(void) } BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame) - EVT_MENU(MDI_QUIT, MyFrame::OnQuit) EVT_MENU(MDI_ABOUT, MyFrame::OnAbout) EVT_MENU(MDI_NEW_WINDOW, MyFrame::OnNewWindow) EVT_SIZE(MyFrame::OnSize) + EVT_MENU(MDI_QUIT, MyFrame::OnQuit) END_EVENT_TABLE() // Define my frame constructor @@ -270,8 +275,8 @@ void MyFrame::OnSize(wxSizeEvent& event) // duplicate event handlers here. BEGIN_EVENT_TABLE(MyChild, wxMDIChildFrame) - EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit) EVT_SIZE( MyChild::OnSize) + EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit) END_EVENT_TABLE() MyChild::MyChild(wxMDIParentFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, diff --git a/src/gtk/frame.cpp b/src/gtk/frame.cpp index aecc4ffd00..2e05c91f08 100644 --- a/src/gtk/frame.cpp +++ b/src/gtk/frame.cpp @@ -65,8 +65,8 @@ bool gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED( //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE(wxFrame, wxWindow) - EVT_CLOSE(wxFrame::OnCloseWindow) EVT_SIZE(wxFrame::OnSize) + EVT_CLOSE(wxFrame::OnCloseWindow) EVT_IDLE(wxFrame::OnIdle) END_EVENT_TABLE() @@ -172,9 +172,12 @@ void wxFrame::Enable( bool enable ) gtk_widget_set_sensitive( m_mainWindow, enable ); }; -void wxFrame::OnCloseWindow( wxCloseEvent& WXUNUSED(event) ) +void wxFrame::OnCloseWindow( wxCloseEvent &event ) { - this->Destroy(); + if ( GetEventHandler()->OnClose() || event.GetForce()) + { + this->Destroy(); + } }; bool wxFrame::Destroy(void) @@ -290,7 +293,7 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) ) } }; -void SetInvokingWindow( wxMenu *menu, wxWindow *win ) +static void SetInvokingWindow( wxMenu *menu, wxWindow *win ) { menu->SetInvokingWindow( win ); wxNode *node = menu->m_items.First(); @@ -305,18 +308,24 @@ void SetInvokingWindow( wxMenu *menu, wxWindow *win ) void wxFrame::SetMenuBar( wxMenuBar *menuBar ) { m_frameMenuBar = menuBar; - - wxNode *node = m_frameMenuBar->m_menus.First(); - while (node) + + if (m_frameMenuBar) { - wxMenu *menu = (wxMenu*)node->Data(); - SetInvokingWindow( menu, this ); - node = node->Next(); - }; - - m_frameMenuBar->m_parent = this; - gtk_myfixed_put( GTK_MYFIXED(m_mainWindow), - m_frameMenuBar->m_widget, m_frameMenuBar->m_x, m_frameMenuBar->m_y ); + if (m_frameMenuBar->m_parent != this) + { + wxNode *node = m_frameMenuBar->m_menus.First(); + while (node) + { + wxMenu *menu = (wxMenu*)node->Data(); + SetInvokingWindow( menu, this ); + node = node->Next(); + }; + + m_frameMenuBar->m_parent = this; + gtk_myfixed_put( GTK_MYFIXED(m_mainWindow), + m_frameMenuBar->m_widget, m_frameMenuBar->m_x, m_frameMenuBar->m_y ); + } + } }; bool wxFrame::CreateStatusBar( int number ) diff --git a/src/gtk/mdi.cpp b/src/gtk/mdi.cpp index 160828e8cd..5726755278 100644 --- a/src/gtk/mdi.cpp +++ b/src/gtk/mdi.cpp @@ -13,6 +13,11 @@ #endif #include "wx/mdi.h" +#include "wx/gtk/win_gtk.h" + +//----------------------------------------------------------------------------- + +extern wxList wxPendingDelete; //----------------------------------------------------------------------------- // wxMDIParentFrame @@ -31,15 +36,40 @@ static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* 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; m_currentChild = NULL; m_parentFrameActive = TRUE; + m_toolBar = NULL; }; wxMDIParentFrame::wxMDIParentFrame( wxWindow *parent, @@ -50,6 +80,7 @@ wxMDIParentFrame::wxMDIParentFrame( wxWindow *parent, m_clientWindow = NULL; m_currentChild = NULL; m_parentFrameActive = TRUE; + m_toolBar = NULL; Create( parent, id, title, pos, size, style, name ); }; @@ -69,23 +100,46 @@ bool wxMDIParentFrame::Create( wxWindow *parent, return TRUE; }; -void wxMDIParentFrame::OnSize( wxSizeEvent& event ) +void wxMDIParentFrame::GtkOnSize( int x, int y, int width, int height ) { - wxFrame::OnSize( event ); + 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::OnActivate( wxActivateEvent& WXUNUSED(event) ) +void wxMDIParentFrame::SetMDIMenuBar( wxMenuBar *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 { + wxFrame::GetClientSize( width, height ); }; -void wxMDIParentFrame::SetMenuBar( wxMenuBar *menu_bar ) +void wxMDIParentFrame::SetToolBar( wxToolBar *toolbar ) { - wxFrame::SetMenuBar( menu_bar ); + m_toolBar = toolbar; }; -void wxMDIParentFrame::GetClientSize(int *width, int *height ) const +wxWindow *wxMDIParentFrame::GetToolBar(void) const { - wxFrame::GetClientSize( width, height ); + return m_toolBar; }; wxMDIChildFrame *wxMDIParentFrame::GetActiveChild(void) const @@ -106,9 +160,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) ) { }; @@ -122,8 +184,14 @@ void wxMDIParentFrame::OnSysColourChanged( wxSysColourChangedEvent& WXUNUSED(eve IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame,wxPanel) +BEGIN_EVENT_TABLE(wxMDIChildFrame, wxPanel) + EVT_CLOSE(wxMDIChildFrame::OnCloseWindow) +END_EVENT_TABLE() + wxMDIChildFrame::wxMDIChildFrame(void) { + m_menuBar = NULL; + m_page = NULL; }; wxMDIChildFrame::wxMDIChildFrame( wxMDIParentFrame *parent, @@ -131,11 +199,23 @@ wxMDIChildFrame::wxMDIChildFrame( wxMDIParentFrame *parent, const wxPoint& WXUNUSED(pos), const wxSize& size, long style, const wxString& 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, @@ -147,8 +227,59 @@ bool wxMDIChildFrame::Create( wxMDIParentFrame *parent, return wxPanel::Create( parent->GetClientWindow(), id, wxDefaultPosition, size, style, name ); }; -void wxMDIChildFrame::SetMenuBar( wxMenuBar *WXUNUSED(menu_bar) ) +void wxMDIChildFrame::OnCloseWindow( wxCloseEvent &event ) { + if ( GetEventHandler()->OnClose() || event.GetForce()) + { + this->Destroy(); + } +}; + +bool wxMDIChildFrame::Destroy(void) +{ + if (!wxPendingDelete.Member(this)) + wxPendingDelete.Append(this); + + return TRUE; +} + +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->m_isSubMenu) SetInvokingWindow( menuitem->m_subMenu, 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 ); + } }; void wxMDIChildFrame::Activate(void) @@ -182,6 +313,11 @@ bool wxMDIClientWindow::CreateClient( wxMDIParentFrame *parent, 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 ); @@ -191,16 +327,17 @@ bool wxMDIClientWindow::CreateClient( wxMDIParentFrame *parent, 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; @@ -211,6 +348,10 @@ void wxMDIClientWindow::AddChild( wxWindow *child ) 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 ); }; diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 3e3377f106..a6de9af6c7 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -61,7 +61,7 @@ void wxMenuBar::Append( wxMenu *menu, const wxString &title ) gtk_menu_bar_append( GTK_MENU_BAR(m_menubar), root_menu ); }; -int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString, const wxString &itemString ) +static int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString, const wxString &itemString ) { if (menu->m_title == menuString) { @@ -91,7 +91,48 @@ int wxMenuBar::FindMenuItem( const wxString &menuString, const wxString &itemStr return -1; }; - +// Find a wxMenuItem using its id. Recurses down into sub-menus +static wxMenuItem* FindMenuItemByIdRecursive( const wxMenu* menu, int id ) +{ + wxMenuItem* result = menu->FindItemForId( id ); + + wxNode *node = menu->m_items.First(); + while (node && result == 0) + { + wxMenuItem *item = (wxMenuItem*)node->Data(); + if (item->m_subMenu) result = FindMenuItemByIdRecursive( item->m_subMenu, id ); + node = node->Next(); + }; + return result; +}; + +wxMenuItem* wxMenuBar::FindMenuItemById( int id ) const +{ + wxMenuItem* result = 0; + wxNode *node = m_menus.First(); + while (node && result == 0) + { + wxMenu *menu = (wxMenu*)node->Data(); + result = FindMenuItemByIdRecursive( menu, id ); + node = node->Next(); + } + return result; +} + +bool wxMenuBar::IsChecked( int id ) const +{ + wxMenuItem* item = FindMenuItemById( id ); + if (item) return item->IsChecked(); + return FALSE; +} + +bool wxMenuBar::IsEnabled( int id ) const +{ + wxMenuItem* item = FindMenuItemById( id ); + if (item) return item->IsEnabled(); + return FALSE; +} + //----------------------------------------------------------------------------- // wxMenu //----------------------------------------------------------------------------- @@ -124,6 +165,29 @@ wxMenuItem::wxMenuItem(void) m_menuItem = NULL; }; +void wxMenuItem::Check( bool check ) +{ + if ( IsCheckable() ) + { + m_checked = check; + gtk_check_menu_item_set_state( (GtkCheckMenuItem*)m_menuItem, (gint)check ); + } +} + +bool wxMenuItem::IsChecked() const +{ + if ( IsCheckable() ) + { + return ((GtkCheckMenuItem*)m_menuItem)->active != 0; + } + return FALSE; +} + +void wxMenuItem::Enable( bool enable ) +{ + m_isEnabled = enable; +} + IMPLEMENT_DYNAMIC_CLASS(wxMenu,wxEvtHandler) wxMenu::wxMenu( const wxString &title ) @@ -219,9 +283,22 @@ int wxMenu::FindItem( const wxString itemString ) const return -1; }; -void wxMenu::Check( int WXUNUSED(id), bool WXUNUSED(Flag) ) +wxMenuItem* wxMenu::FindItemForId( int id ) const +{ + wxNode *node = m_items.First(); + while (node) + { + wxMenuItem *item = (wxMenuItem*)node->Data(); + if (item->m_id == id) return item; + node = node->Next(); + } + return NULL; +} + +void wxMenu::Check( int id, bool Flag ) { - // I'm just too lazy + wxMenuItem* item = FindItemForId( id ); + if (item) item->Check(Flag); }; void wxMenu::Enable( int id, bool enable ) diff --git a/src/gtk/notebook.cpp b/src/gtk/notebook.cpp index 9b6ec68ef5..e1e9b250b3 100644 --- a/src/gtk/notebook.cpp +++ b/src/gtk/notebook.cpp @@ -153,6 +153,9 @@ bool wxNotebook::Create(wxWindow *parent, wxWindowID id, PreCreation( parent, id, pos, size, style, name ); m_widget = gtk_notebook_new(); + + gtk_notebook_set_scrollable( GTK_NOTEBOOK(m_widget), 1 ); + m_idHandler = gtk_signal_connect ( GTK_OBJECT(m_widget), "switch_page", diff --git a/src/gtk/tbargtk.cpp b/src/gtk/tbargtk.cpp index 611995d467..ebf329df11 100644 --- a/src/gtk/tbargtk.cpp +++ b/src/gtk/tbargtk.cpp @@ -21,7 +21,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxToolBarTool,wxObject) -wxToolBarTool::wxToolBarTool( wxToolBarGTK *owner, int theIndex, +wxToolBarTool::wxToolBarTool( wxToolBar *owner, int theIndex, const wxBitmap& bitmap1, const wxBitmap& bitmap2, bool toggle, wxObject *clientData, const wxString& shortHelpString, const wxString& longHelpString ) @@ -45,7 +45,7 @@ wxToolBarTool::~wxToolBarTool(void) }; //----------------------------------------------------------------------------- -// wxToolBarGTK +// wxToolBar //----------------------------------------------------------------------------- static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), wxToolBarTool *tool ) @@ -59,27 +59,27 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), wxToolBarTool *to //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxToolBarGTK,wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxToolBar,wxControl) -BEGIN_EVENT_TABLE(wxToolBarGTK, wxControl) +BEGIN_EVENT_TABLE(wxToolBar, wxControl) END_EVENT_TABLE() -wxToolBarGTK::wxToolBarGTK(void) +wxToolBar::wxToolBar(void) { }; -wxToolBarGTK::wxToolBarGTK( wxWindow *parent, wxWindowID id, +wxToolBar::wxToolBar( wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) { Create( parent, id, pos, size, style, name ); }; -wxToolBarGTK::~wxToolBarGTK(void) +wxToolBar::~wxToolBar(void) { }; -bool wxToolBarGTK::Create( wxWindow *parent, wxWindowID id, +bool wxToolBar::Create( wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) { @@ -104,7 +104,7 @@ bool wxToolBarGTK::Create( wxWindow *parent, wxWindowID id, return TRUE; }; -bool wxToolBarGTK::OnLeftClick( int toolIndex, bool toggleDown ) +bool wxToolBar::OnLeftClick( int toolIndex, bool toggleDown ) { wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, toolIndex); event.SetEventObject(this); @@ -115,7 +115,7 @@ bool wxToolBarGTK::OnLeftClick( int toolIndex, bool toggleDown ) return TRUE; }; -void wxToolBarGTK::OnRightClick( int toolIndex, float WXUNUSED(x), float WXUNUSED(y) ) +void wxToolBar::OnRightClick( int toolIndex, float WXUNUSED(x), float WXUNUSED(y) ) { wxCommandEvent event(wxEVT_COMMAND_TOOL_RCLICKED, toolIndex); event.SetEventObject(this); @@ -123,7 +123,7 @@ void wxToolBarGTK::OnRightClick( int toolIndex, float WXUNUSED(x), float WXUNUSE GetEventHandler()->ProcessEvent(event); }; -void wxToolBarGTK::OnMouseEnter( int toolIndex ) +void wxToolBar::OnMouseEnter( int toolIndex ) { wxCommandEvent event(wxEVT_COMMAND_TOOL_ENTER, toolIndex); event.SetEventObject(this); @@ -131,7 +131,7 @@ void wxToolBarGTK::OnMouseEnter( int toolIndex ) GetEventHandler()->ProcessEvent(event); }; -wxToolBarTool *wxToolBarGTK::AddTool( int toolIndex, const wxBitmap& bitmap, +wxToolBarTool *wxToolBar::AddTool( int toolIndex, const wxBitmap& bitmap, const wxBitmap& pushedBitmap, bool toggle, float WXUNUSED(xPos), float WXUNUSED(yPos), wxObject *clientData, const wxString& helpString1, const wxString& helpString2 ) @@ -160,48 +160,48 @@ wxToolBarTool *wxToolBarGTK::AddTool( int toolIndex, const wxBitmap& bitmap, return tool; }; -void wxToolBarGTK::AddSeparator(void) +void wxToolBar::AddSeparator(void) { gtk_toolbar_append_space( m_toolbar ); }; -void wxToolBarGTK::ClearTools(void) +void wxToolBar::ClearTools(void) { }; -void wxToolBarGTK::EnableTool(int toolIndex, bool enable) +void wxToolBar::EnableTool(int toolIndex, bool enable) { }; -void wxToolBarGTK::ToggleTool(int toolIndex, bool toggle) +void wxToolBar::ToggleTool(int toolIndex, bool toggle) { }; -void wxToolBarGTK::SetToggle(int toolIndex, bool toggle) +void wxToolBar::SetToggle(int toolIndex, bool toggle) { }; -wxObject *wxToolBarGTK::GetToolClientData(int index) const +wxObject *wxToolBar::GetToolClientData(int index) const { }; -bool wxToolBarGTK::GetToolState(int toolIndex) const +bool wxToolBar::GetToolState(int toolIndex) const { }; -bool wxToolBarGTK::GetToolEnabled(int toolIndex) const +bool wxToolBar::GetToolEnabled(int toolIndex) const { }; -void wxToolBarGTK::SetMargins(int x, int y) +void wxToolBar::SetMargins(int x, int y) { }; -void wxToolBarGTK::SetToolPacking(int packing) +void wxToolBar::SetToolPacking(int packing) { }; -void wxToolBarGTK::SetToolSeparation(int separation) +void wxToolBar::SetToolSeparation(int separation) { }; diff --git a/src/gtk1/frame.cpp b/src/gtk1/frame.cpp index aecc4ffd00..2e05c91f08 100644 --- a/src/gtk1/frame.cpp +++ b/src/gtk1/frame.cpp @@ -65,8 +65,8 @@ bool gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED( //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE(wxFrame, wxWindow) - EVT_CLOSE(wxFrame::OnCloseWindow) EVT_SIZE(wxFrame::OnSize) + EVT_CLOSE(wxFrame::OnCloseWindow) EVT_IDLE(wxFrame::OnIdle) END_EVENT_TABLE() @@ -172,9 +172,12 @@ void wxFrame::Enable( bool enable ) gtk_widget_set_sensitive( m_mainWindow, enable ); }; -void wxFrame::OnCloseWindow( wxCloseEvent& WXUNUSED(event) ) +void wxFrame::OnCloseWindow( wxCloseEvent &event ) { - this->Destroy(); + if ( GetEventHandler()->OnClose() || event.GetForce()) + { + this->Destroy(); + } }; bool wxFrame::Destroy(void) @@ -290,7 +293,7 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) ) } }; -void SetInvokingWindow( wxMenu *menu, wxWindow *win ) +static void SetInvokingWindow( wxMenu *menu, wxWindow *win ) { menu->SetInvokingWindow( win ); wxNode *node = menu->m_items.First(); @@ -305,18 +308,24 @@ void SetInvokingWindow( wxMenu *menu, wxWindow *win ) void wxFrame::SetMenuBar( wxMenuBar *menuBar ) { m_frameMenuBar = menuBar; - - wxNode *node = m_frameMenuBar->m_menus.First(); - while (node) + + if (m_frameMenuBar) { - wxMenu *menu = (wxMenu*)node->Data(); - SetInvokingWindow( menu, this ); - node = node->Next(); - }; - - m_frameMenuBar->m_parent = this; - gtk_myfixed_put( GTK_MYFIXED(m_mainWindow), - m_frameMenuBar->m_widget, m_frameMenuBar->m_x, m_frameMenuBar->m_y ); + if (m_frameMenuBar->m_parent != this) + { + wxNode *node = m_frameMenuBar->m_menus.First(); + while (node) + { + wxMenu *menu = (wxMenu*)node->Data(); + SetInvokingWindow( menu, this ); + node = node->Next(); + }; + + m_frameMenuBar->m_parent = this; + gtk_myfixed_put( GTK_MYFIXED(m_mainWindow), + m_frameMenuBar->m_widget, m_frameMenuBar->m_x, m_frameMenuBar->m_y ); + } + } }; bool wxFrame::CreateStatusBar( int number ) diff --git a/src/gtk1/mdi.cpp b/src/gtk1/mdi.cpp index 160828e8cd..5726755278 100644 --- a/src/gtk1/mdi.cpp +++ b/src/gtk1/mdi.cpp @@ -13,6 +13,11 @@ #endif #include "wx/mdi.h" +#include "wx/gtk/win_gtk.h" + +//----------------------------------------------------------------------------- + +extern wxList wxPendingDelete; //----------------------------------------------------------------------------- // wxMDIParentFrame @@ -31,15 +36,40 @@ static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* 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; m_currentChild = NULL; m_parentFrameActive = TRUE; + m_toolBar = NULL; }; wxMDIParentFrame::wxMDIParentFrame( wxWindow *parent, @@ -50,6 +80,7 @@ wxMDIParentFrame::wxMDIParentFrame( wxWindow *parent, m_clientWindow = NULL; m_currentChild = NULL; m_parentFrameActive = TRUE; + m_toolBar = NULL; Create( parent, id, title, pos, size, style, name ); }; @@ -69,23 +100,46 @@ bool wxMDIParentFrame::Create( wxWindow *parent, return TRUE; }; -void wxMDIParentFrame::OnSize( wxSizeEvent& event ) +void wxMDIParentFrame::GtkOnSize( int x, int y, int width, int height ) { - wxFrame::OnSize( event ); + 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::OnActivate( wxActivateEvent& WXUNUSED(event) ) +void wxMDIParentFrame::SetMDIMenuBar( wxMenuBar *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 { + wxFrame::GetClientSize( width, height ); }; -void wxMDIParentFrame::SetMenuBar( wxMenuBar *menu_bar ) +void wxMDIParentFrame::SetToolBar( wxToolBar *toolbar ) { - wxFrame::SetMenuBar( menu_bar ); + m_toolBar = toolbar; }; -void wxMDIParentFrame::GetClientSize(int *width, int *height ) const +wxWindow *wxMDIParentFrame::GetToolBar(void) const { - wxFrame::GetClientSize( width, height ); + return m_toolBar; }; wxMDIChildFrame *wxMDIParentFrame::GetActiveChild(void) const @@ -106,9 +160,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) ) { }; @@ -122,8 +184,14 @@ void wxMDIParentFrame::OnSysColourChanged( wxSysColourChangedEvent& WXUNUSED(eve IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame,wxPanel) +BEGIN_EVENT_TABLE(wxMDIChildFrame, wxPanel) + EVT_CLOSE(wxMDIChildFrame::OnCloseWindow) +END_EVENT_TABLE() + wxMDIChildFrame::wxMDIChildFrame(void) { + m_menuBar = NULL; + m_page = NULL; }; wxMDIChildFrame::wxMDIChildFrame( wxMDIParentFrame *parent, @@ -131,11 +199,23 @@ wxMDIChildFrame::wxMDIChildFrame( wxMDIParentFrame *parent, const wxPoint& WXUNUSED(pos), const wxSize& size, long style, const wxString& 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, @@ -147,8 +227,59 @@ bool wxMDIChildFrame::Create( wxMDIParentFrame *parent, return wxPanel::Create( parent->GetClientWindow(), id, wxDefaultPosition, size, style, name ); }; -void wxMDIChildFrame::SetMenuBar( wxMenuBar *WXUNUSED(menu_bar) ) +void wxMDIChildFrame::OnCloseWindow( wxCloseEvent &event ) { + if ( GetEventHandler()->OnClose() || event.GetForce()) + { + this->Destroy(); + } +}; + +bool wxMDIChildFrame::Destroy(void) +{ + if (!wxPendingDelete.Member(this)) + wxPendingDelete.Append(this); + + return TRUE; +} + +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->m_isSubMenu) SetInvokingWindow( menuitem->m_subMenu, 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 ); + } }; void wxMDIChildFrame::Activate(void) @@ -182,6 +313,11 @@ bool wxMDIClientWindow::CreateClient( wxMDIParentFrame *parent, 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 ); @@ -191,16 +327,17 @@ bool wxMDIClientWindow::CreateClient( wxMDIParentFrame *parent, 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; @@ -211,6 +348,10 @@ void wxMDIClientWindow::AddChild( wxWindow *child ) 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 ); }; diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index 3e3377f106..a6de9af6c7 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -61,7 +61,7 @@ void wxMenuBar::Append( wxMenu *menu, const wxString &title ) gtk_menu_bar_append( GTK_MENU_BAR(m_menubar), root_menu ); }; -int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString, const wxString &itemString ) +static int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString, const wxString &itemString ) { if (menu->m_title == menuString) { @@ -91,7 +91,48 @@ int wxMenuBar::FindMenuItem( const wxString &menuString, const wxString &itemStr return -1; }; - +// Find a wxMenuItem using its id. Recurses down into sub-menus +static wxMenuItem* FindMenuItemByIdRecursive( const wxMenu* menu, int id ) +{ + wxMenuItem* result = menu->FindItemForId( id ); + + wxNode *node = menu->m_items.First(); + while (node && result == 0) + { + wxMenuItem *item = (wxMenuItem*)node->Data(); + if (item->m_subMenu) result = FindMenuItemByIdRecursive( item->m_subMenu, id ); + node = node->Next(); + }; + return result; +}; + +wxMenuItem* wxMenuBar::FindMenuItemById( int id ) const +{ + wxMenuItem* result = 0; + wxNode *node = m_menus.First(); + while (node && result == 0) + { + wxMenu *menu = (wxMenu*)node->Data(); + result = FindMenuItemByIdRecursive( menu, id ); + node = node->Next(); + } + return result; +} + +bool wxMenuBar::IsChecked( int id ) const +{ + wxMenuItem* item = FindMenuItemById( id ); + if (item) return item->IsChecked(); + return FALSE; +} + +bool wxMenuBar::IsEnabled( int id ) const +{ + wxMenuItem* item = FindMenuItemById( id ); + if (item) return item->IsEnabled(); + return FALSE; +} + //----------------------------------------------------------------------------- // wxMenu //----------------------------------------------------------------------------- @@ -124,6 +165,29 @@ wxMenuItem::wxMenuItem(void) m_menuItem = NULL; }; +void wxMenuItem::Check( bool check ) +{ + if ( IsCheckable() ) + { + m_checked = check; + gtk_check_menu_item_set_state( (GtkCheckMenuItem*)m_menuItem, (gint)check ); + } +} + +bool wxMenuItem::IsChecked() const +{ + if ( IsCheckable() ) + { + return ((GtkCheckMenuItem*)m_menuItem)->active != 0; + } + return FALSE; +} + +void wxMenuItem::Enable( bool enable ) +{ + m_isEnabled = enable; +} + IMPLEMENT_DYNAMIC_CLASS(wxMenu,wxEvtHandler) wxMenu::wxMenu( const wxString &title ) @@ -219,9 +283,22 @@ int wxMenu::FindItem( const wxString itemString ) const return -1; }; -void wxMenu::Check( int WXUNUSED(id), bool WXUNUSED(Flag) ) +wxMenuItem* wxMenu::FindItemForId( int id ) const +{ + wxNode *node = m_items.First(); + while (node) + { + wxMenuItem *item = (wxMenuItem*)node->Data(); + if (item->m_id == id) return item; + node = node->Next(); + } + return NULL; +} + +void wxMenu::Check( int id, bool Flag ) { - // I'm just too lazy + wxMenuItem* item = FindItemForId( id ); + if (item) item->Check(Flag); }; void wxMenu::Enable( int id, bool enable ) diff --git a/src/gtk1/notebook.cpp b/src/gtk1/notebook.cpp index 9b6ec68ef5..e1e9b250b3 100644 --- a/src/gtk1/notebook.cpp +++ b/src/gtk1/notebook.cpp @@ -153,6 +153,9 @@ bool wxNotebook::Create(wxWindow *parent, wxWindowID id, PreCreation( parent, id, pos, size, style, name ); m_widget = gtk_notebook_new(); + + gtk_notebook_set_scrollable( GTK_NOTEBOOK(m_widget), 1 ); + m_idHandler = gtk_signal_connect ( GTK_OBJECT(m_widget), "switch_page", diff --git a/src/gtk1/tbargtk.cpp b/src/gtk1/tbargtk.cpp index 611995d467..ebf329df11 100644 --- a/src/gtk1/tbargtk.cpp +++ b/src/gtk1/tbargtk.cpp @@ -21,7 +21,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxToolBarTool,wxObject) -wxToolBarTool::wxToolBarTool( wxToolBarGTK *owner, int theIndex, +wxToolBarTool::wxToolBarTool( wxToolBar *owner, int theIndex, const wxBitmap& bitmap1, const wxBitmap& bitmap2, bool toggle, wxObject *clientData, const wxString& shortHelpString, const wxString& longHelpString ) @@ -45,7 +45,7 @@ wxToolBarTool::~wxToolBarTool(void) }; //----------------------------------------------------------------------------- -// wxToolBarGTK +// wxToolBar //----------------------------------------------------------------------------- static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), wxToolBarTool *tool ) @@ -59,27 +59,27 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), wxToolBarTool *to //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxToolBarGTK,wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxToolBar,wxControl) -BEGIN_EVENT_TABLE(wxToolBarGTK, wxControl) +BEGIN_EVENT_TABLE(wxToolBar, wxControl) END_EVENT_TABLE() -wxToolBarGTK::wxToolBarGTK(void) +wxToolBar::wxToolBar(void) { }; -wxToolBarGTK::wxToolBarGTK( wxWindow *parent, wxWindowID id, +wxToolBar::wxToolBar( wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) { Create( parent, id, pos, size, style, name ); }; -wxToolBarGTK::~wxToolBarGTK(void) +wxToolBar::~wxToolBar(void) { }; -bool wxToolBarGTK::Create( wxWindow *parent, wxWindowID id, +bool wxToolBar::Create( wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) { @@ -104,7 +104,7 @@ bool wxToolBarGTK::Create( wxWindow *parent, wxWindowID id, return TRUE; }; -bool wxToolBarGTK::OnLeftClick( int toolIndex, bool toggleDown ) +bool wxToolBar::OnLeftClick( int toolIndex, bool toggleDown ) { wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, toolIndex); event.SetEventObject(this); @@ -115,7 +115,7 @@ bool wxToolBarGTK::OnLeftClick( int toolIndex, bool toggleDown ) return TRUE; }; -void wxToolBarGTK::OnRightClick( int toolIndex, float WXUNUSED(x), float WXUNUSED(y) ) +void wxToolBar::OnRightClick( int toolIndex, float WXUNUSED(x), float WXUNUSED(y) ) { wxCommandEvent event(wxEVT_COMMAND_TOOL_RCLICKED, toolIndex); event.SetEventObject(this); @@ -123,7 +123,7 @@ void wxToolBarGTK::OnRightClick( int toolIndex, float WXUNUSED(x), float WXUNUSE GetEventHandler()->ProcessEvent(event); }; -void wxToolBarGTK::OnMouseEnter( int toolIndex ) +void wxToolBar::OnMouseEnter( int toolIndex ) { wxCommandEvent event(wxEVT_COMMAND_TOOL_ENTER, toolIndex); event.SetEventObject(this); @@ -131,7 +131,7 @@ void wxToolBarGTK::OnMouseEnter( int toolIndex ) GetEventHandler()->ProcessEvent(event); }; -wxToolBarTool *wxToolBarGTK::AddTool( int toolIndex, const wxBitmap& bitmap, +wxToolBarTool *wxToolBar::AddTool( int toolIndex, const wxBitmap& bitmap, const wxBitmap& pushedBitmap, bool toggle, float WXUNUSED(xPos), float WXUNUSED(yPos), wxObject *clientData, const wxString& helpString1, const wxString& helpString2 ) @@ -160,48 +160,48 @@ wxToolBarTool *wxToolBarGTK::AddTool( int toolIndex, const wxBitmap& bitmap, return tool; }; -void wxToolBarGTK::AddSeparator(void) +void wxToolBar::AddSeparator(void) { gtk_toolbar_append_space( m_toolbar ); }; -void wxToolBarGTK::ClearTools(void) +void wxToolBar::ClearTools(void) { }; -void wxToolBarGTK::EnableTool(int toolIndex, bool enable) +void wxToolBar::EnableTool(int toolIndex, bool enable) { }; -void wxToolBarGTK::ToggleTool(int toolIndex, bool toggle) +void wxToolBar::ToggleTool(int toolIndex, bool toggle) { }; -void wxToolBarGTK::SetToggle(int toolIndex, bool toggle) +void wxToolBar::SetToggle(int toolIndex, bool toggle) { }; -wxObject *wxToolBarGTK::GetToolClientData(int index) const +wxObject *wxToolBar::GetToolClientData(int index) const { }; -bool wxToolBarGTK::GetToolState(int toolIndex) const +bool wxToolBar::GetToolState(int toolIndex) const { }; -bool wxToolBarGTK::GetToolEnabled(int toolIndex) const +bool wxToolBar::GetToolEnabled(int toolIndex) const { }; -void wxToolBarGTK::SetMargins(int x, int y) +void wxToolBar::SetMargins(int x, int y) { }; -void wxToolBarGTK::SetToolPacking(int packing) +void wxToolBar::SetToolPacking(int packing) { }; -void wxToolBarGTK::SetToolSeparation(int separation) +void wxToolBar::SetToolSeparation(int separation) { }; diff --git a/user/wxFile/wxFile.cpp b/user/wxFile/wxFile.cpp index d4030d7189..63703f2ae5 100644 --- a/user/wxFile/wxFile.cpp +++ b/user/wxFile/wxFile.cpp @@ -129,7 +129,7 @@ MyFrame::MyFrame(void) : SetStatusText( "Welcome", 0 ); SetStatusText( "wxFile v0.2 by Robert Roebling.", 1 ); - m_tb = new wxToolBarGTK( this, ID_TOOLBAR, wxPoint(2,60), wxSize(300-4,26) ); + m_tb = new wxToolBar( this, ID_TOOLBAR, wxPoint(2,60), wxSize(300-4,26) ); m_tb->SetMargins( 2, 2 ); wxBitmap *bm; diff --git a/user/wxFile/wxFile.h b/user/wxFile/wxFile.h index 3a86a15539..93b5ef3291 100644 --- a/user/wxFile/wxFile.h +++ b/user/wxFile/wxFile.h @@ -63,7 +63,7 @@ class MyFrame: public wxFrame void OnTreeSelected( wxTreeEvent &event ); void OnTreeKeyDown( wxTreeEvent &event ); - wxToolBarGTK *m_tb; + wxToolBar *m_tb; wxSplitterWindow *m_splitter; wxFileCtrl *m_rightFile; wxFileCtrl *m_leftFile; diff --git a/user/wxTest/wxTest.cpp b/user/wxTest/wxTest.cpp index c0f67e22c3..f035649154 100644 --- a/user/wxTest/wxTest.cpp +++ b/user/wxTest/wxTest.cpp @@ -470,7 +470,7 @@ MyFrame::MyFrame(void) : m_canvas = new MyCanvas( this, -1, wxPoint(2,62), wxSize(300-4,120-4) ); m_canvas->SetScrollbars( 10, 10, 50, 50 ); - m_tb = new wxToolBarGTK( this, -1, wxPoint(2,60), wxSize(300-4,26) ); + m_tb = new wxToolBar( this, -1, wxPoint(2,60), wxSize(300-4,26) ); m_tb->SetMargins( 2, 2 ); wxBitmap *bm = new wxBitmap( list_xpm ); diff --git a/user/wxTest/wxTest.h b/user/wxTest/wxTest.h index 125e2f8ecf..d439960a25 100644 --- a/user/wxTest/wxTest.h +++ b/user/wxTest/wxTest.h @@ -141,7 +141,7 @@ class MyFrame: public wxFrame void OnAbout( wxCommandEvent &event ); void OnQuit( wxCommandEvent &event ); - wxToolBarGTK *m_tb; + wxToolBar *m_tb; MyCanvas *m_canvas; MyTimer m_timer; -- 2.47.2