From 868a28262c40a7428d3991ca8a034674814bdb0a Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sun, 6 Sep 1998 13:46:50 +0000 Subject: [PATCH] Added SetFont to most controls and controls sample (recompile) Added tiny bit of documentation to window.cpp git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@676 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/button.h | 1 + include/wx/gtk/checkbox.h | 1 + include/wx/gtk/choice.h | 1 + include/wx/gtk/combobox.h | 12 ++--- include/wx/gtk/font.h | 8 +-- include/wx/gtk/listbox.h | 1 + include/wx/gtk/radiobox.h | 8 +-- include/wx/gtk/radiobut.h | 1 + include/wx/gtk/textctrl.h | 4 ++ include/wx/gtk/window.h | 1 + include/wx/gtk1/button.h | 1 + include/wx/gtk1/checkbox.h | 1 + include/wx/gtk1/choice.h | 1 + include/wx/gtk1/combobox.h | 12 ++--- include/wx/gtk1/font.h | 8 +-- include/wx/gtk1/listbox.h | 1 + include/wx/gtk1/radiobox.h | 8 +-- include/wx/gtk1/radiobut.h | 1 + include/wx/gtk1/textctrl.h | 4 ++ include/wx/gtk1/window.h | 1 + samples/controls/controls.cpp | 52 ++++++++++++++++++- src/gtk/button.cpp | 23 ++++++++ src/gtk/checkbox.cpp | 23 ++++++++ src/gtk/choice.cpp | 34 +++++++++++- src/gtk/combobox.cpp | 34 +++++++++++- src/gtk/listbox.cpp | 31 +++++++++-- src/gtk/radiobox.cpp | 16 ++++++ src/gtk/radiobut.cpp | 23 ++++++++ src/gtk/textctrl.cpp | 20 +++++++ src/gtk/window.cpp | 98 ++++++++++++++++++++++++++++++++--- src/gtk1/button.cpp | 23 ++++++++ src/gtk1/checkbox.cpp | 23 ++++++++ src/gtk1/choice.cpp | 34 +++++++++++- src/gtk1/combobox.cpp | 34 +++++++++++- src/gtk1/listbox.cpp | 31 +++++++++-- src/gtk1/radiobox.cpp | 16 ++++++ src/gtk1/radiobut.cpp | 23 ++++++++ src/gtk1/textctrl.cpp | 20 +++++++ src/gtk1/window.cpp | 98 ++++++++++++++++++++++++++++++++--- 39 files changed, 669 insertions(+), 63 deletions(-) diff --git a/include/wx/gtk/button.h b/include/wx/gtk/button.h index 0d5bf16b5c..bbc5f130e2 100644 --- a/include/wx/gtk/button.h +++ b/include/wx/gtk/button.h @@ -60,6 +60,7 @@ class wxButton: public wxControl void SetDefault(void); void SetLabel( const wxString &label ); void Enable( bool enable ); + void SetFont( const wxFont &font ); }; #endif // __GTKBUTTONH__ diff --git a/include/wx/gtk/checkbox.h b/include/wx/gtk/checkbox.h index d949234568..43327e3f26 100644 --- a/include/wx/gtk/checkbox.h +++ b/include/wx/gtk/checkbox.h @@ -59,6 +59,7 @@ class wxCheckBox: public wxControl const wxString& name = wxCheckBoxNameStr ); void SetValue( bool state ); bool GetValue(void) const; + void SetFont( const wxFont &font ); }; #endif // __GTKCHECKBOXH__ diff --git a/include/wx/gtk/choice.h b/include/wx/gtk/choice.h index 36f403bb74..6849cec905 100644 --- a/include/wx/gtk/choice.h +++ b/include/wx/gtk/choice.h @@ -73,6 +73,7 @@ class wxChoice: public wxControl void SetColumns( int n = 1 ); void SetSelection( int n ); void SetStringSelection( const wxString &string ); + void SetFont( const wxFont &font ); }; #endif // __GTKCHOICEH__ diff --git a/include/wx/gtk/combobox.h b/include/wx/gtk/combobox.h index a0d3c36083..654ae70bfe 100644 --- a/include/wx/gtk/combobox.h +++ b/include/wx/gtk/combobox.h @@ -64,7 +64,6 @@ class wxComboBox: public wxControl const wxValidator& validator = wxDefaultValidator, const wxString& name = wxComboBoxNameStr); - // List functions void Clear(void); void Append( const wxString &item ); void Append( const wxString &item, char* clientData ); @@ -79,11 +78,9 @@ class wxComboBox: public wxControl void SetSelection( int n ); void SetStringSelection( const wxString &string ); - // Text field functions wxString GetValue(void) const ; void SetValue(const wxString& value); - // Clipboard operations void Copy(void); void Cut(void); void Paste(void); @@ -95,14 +92,17 @@ class wxComboBox: public wxControl void Remove(long from, long to); void SetSelection(long from, long to); void SetEditable(bool editable); + + void SetFont( const wxFont &font ); + + // implementation + bool m_alreadySent; + private: wxList m_clientData; - public: - - bool m_alreadySent; }; #endif // __GTKCOMBOBOXH__ diff --git a/include/wx/gtk/font.h b/include/wx/gtk/font.h index a1ce86dfe0..4e9a085d73 100644 --- a/include/wx/gtk/font.h +++ b/include/wx/gtk/font.h @@ -74,12 +74,8 @@ class wxFont: public wxGDIObject bool GetUnderlined(void) const; wxFont( char *xFontName ); - - private: - - friend wxDC; - friend wxPaintDC; - friend wxWindow; + + // implementation GdkFont* GetInternalFont(float scale = 1.0) const; diff --git a/include/wx/gtk/listbox.h b/include/wx/gtk/listbox.h index 22cbe344a9..44f4d5aa19 100644 --- a/include/wx/gtk/listbox.h +++ b/include/wx/gtk/listbox.h @@ -82,6 +82,7 @@ class wxListBox: public wxControl void SetSelection( int n, bool select = TRUE ); void SetString( int n, const wxString &string ); void SetStringSelection( const wxString &string, bool select = TRUE ); + void SetFont( const wxFont &font ); virtual GtkWidget *GetConnectWidget(void); diff --git a/include/wx/gtk/radiobox.h b/include/wx/gtk/radiobox.h index 04d5ea8879..443ea706ec 100644 --- a/include/wx/gtk/radiobox.h +++ b/include/wx/gtk/radiobox.h @@ -79,14 +79,16 @@ class wxRadioBox: public wxControl virtual int Number(void) const; int GetNumberOfRowsOrCols(void) const; void SetNumberOfRowsOrCols( int n ); + void SetFont( const wxFont &font ); + // implementation + + bool m_alreadySent; + private: GtkRadioButton *m_radio; - public: - - bool m_alreadySent; }; #endif // __GTKRADIOBOXH__ diff --git a/include/wx/gtk/radiobut.h b/include/wx/gtk/radiobut.h index 61e7130035..3e0705a7a8 100644 --- a/include/wx/gtk/radiobut.h +++ b/include/wx/gtk/radiobut.h @@ -61,6 +61,7 @@ class wxRadioButton: public wxControl virtual void SetLabel(const wxString& label); virtual void SetValue(bool val); virtual bool GetValue(void) const; + void SetFont( const wxFont &font ); }; #endif // __GTKRADIOBUTTONH__ diff --git a/include/wx/gtk/textctrl.h b/include/wx/gtk/textctrl.h index 034f218b7b..e477a54675 100644 --- a/include/wx/gtk/textctrl.h +++ b/include/wx/gtk/textctrl.h @@ -101,6 +101,10 @@ class wxTextCtrl: public wxControl, public streambuf wxTextCtrl& operator<<(double d); wxTextCtrl& operator<<(const char c); + void SetFont( const wxFont &font ); + + // implementation + virtual GtkWidget* GetConnectWidget(void); virtual bool IsOwnGtkWindow( GdkWindow *window ); diff --git a/include/wx/gtk/window.h b/include/wx/gtk/window.h index 665c3ee0c7..a029a5dc16 100644 --- a/include/wx/gtk/window.h +++ b/include/wx/gtk/window.h @@ -271,6 +271,7 @@ public: // cannot get private going yet float m_oldVerticalPos; bool m_needParent; bool m_hasScrolling; + bool m_hasOwnStyle; bool m_hasVMT; bool m_sizeSet; bool m_resizing; diff --git a/include/wx/gtk1/button.h b/include/wx/gtk1/button.h index 0d5bf16b5c..bbc5f130e2 100644 --- a/include/wx/gtk1/button.h +++ b/include/wx/gtk1/button.h @@ -60,6 +60,7 @@ class wxButton: public wxControl void SetDefault(void); void SetLabel( const wxString &label ); void Enable( bool enable ); + void SetFont( const wxFont &font ); }; #endif // __GTKBUTTONH__ diff --git a/include/wx/gtk1/checkbox.h b/include/wx/gtk1/checkbox.h index d949234568..43327e3f26 100644 --- a/include/wx/gtk1/checkbox.h +++ b/include/wx/gtk1/checkbox.h @@ -59,6 +59,7 @@ class wxCheckBox: public wxControl const wxString& name = wxCheckBoxNameStr ); void SetValue( bool state ); bool GetValue(void) const; + void SetFont( const wxFont &font ); }; #endif // __GTKCHECKBOXH__ diff --git a/include/wx/gtk1/choice.h b/include/wx/gtk1/choice.h index 36f403bb74..6849cec905 100644 --- a/include/wx/gtk1/choice.h +++ b/include/wx/gtk1/choice.h @@ -73,6 +73,7 @@ class wxChoice: public wxControl void SetColumns( int n = 1 ); void SetSelection( int n ); void SetStringSelection( const wxString &string ); + void SetFont( const wxFont &font ); }; #endif // __GTKCHOICEH__ diff --git a/include/wx/gtk1/combobox.h b/include/wx/gtk1/combobox.h index a0d3c36083..654ae70bfe 100644 --- a/include/wx/gtk1/combobox.h +++ b/include/wx/gtk1/combobox.h @@ -64,7 +64,6 @@ class wxComboBox: public wxControl const wxValidator& validator = wxDefaultValidator, const wxString& name = wxComboBoxNameStr); - // List functions void Clear(void); void Append( const wxString &item ); void Append( const wxString &item, char* clientData ); @@ -79,11 +78,9 @@ class wxComboBox: public wxControl void SetSelection( int n ); void SetStringSelection( const wxString &string ); - // Text field functions wxString GetValue(void) const ; void SetValue(const wxString& value); - // Clipboard operations void Copy(void); void Cut(void); void Paste(void); @@ -95,14 +92,17 @@ class wxComboBox: public wxControl void Remove(long from, long to); void SetSelection(long from, long to); void SetEditable(bool editable); + + void SetFont( const wxFont &font ); + + // implementation + bool m_alreadySent; + private: wxList m_clientData; - public: - - bool m_alreadySent; }; #endif // __GTKCOMBOBOXH__ diff --git a/include/wx/gtk1/font.h b/include/wx/gtk1/font.h index a1ce86dfe0..4e9a085d73 100644 --- a/include/wx/gtk1/font.h +++ b/include/wx/gtk1/font.h @@ -74,12 +74,8 @@ class wxFont: public wxGDIObject bool GetUnderlined(void) const; wxFont( char *xFontName ); - - private: - - friend wxDC; - friend wxPaintDC; - friend wxWindow; + + // implementation GdkFont* GetInternalFont(float scale = 1.0) const; diff --git a/include/wx/gtk1/listbox.h b/include/wx/gtk1/listbox.h index 22cbe344a9..44f4d5aa19 100644 --- a/include/wx/gtk1/listbox.h +++ b/include/wx/gtk1/listbox.h @@ -82,6 +82,7 @@ class wxListBox: public wxControl void SetSelection( int n, bool select = TRUE ); void SetString( int n, const wxString &string ); void SetStringSelection( const wxString &string, bool select = TRUE ); + void SetFont( const wxFont &font ); virtual GtkWidget *GetConnectWidget(void); diff --git a/include/wx/gtk1/radiobox.h b/include/wx/gtk1/radiobox.h index 04d5ea8879..443ea706ec 100644 --- a/include/wx/gtk1/radiobox.h +++ b/include/wx/gtk1/radiobox.h @@ -79,14 +79,16 @@ class wxRadioBox: public wxControl virtual int Number(void) const; int GetNumberOfRowsOrCols(void) const; void SetNumberOfRowsOrCols( int n ); + void SetFont( const wxFont &font ); + // implementation + + bool m_alreadySent; + private: GtkRadioButton *m_radio; - public: - - bool m_alreadySent; }; #endif // __GTKRADIOBOXH__ diff --git a/include/wx/gtk1/radiobut.h b/include/wx/gtk1/radiobut.h index 61e7130035..3e0705a7a8 100644 --- a/include/wx/gtk1/radiobut.h +++ b/include/wx/gtk1/radiobut.h @@ -61,6 +61,7 @@ class wxRadioButton: public wxControl virtual void SetLabel(const wxString& label); virtual void SetValue(bool val); virtual bool GetValue(void) const; + void SetFont( const wxFont &font ); }; #endif // __GTKRADIOBUTTONH__ diff --git a/include/wx/gtk1/textctrl.h b/include/wx/gtk1/textctrl.h index 034f218b7b..e477a54675 100644 --- a/include/wx/gtk1/textctrl.h +++ b/include/wx/gtk1/textctrl.h @@ -101,6 +101,10 @@ class wxTextCtrl: public wxControl, public streambuf wxTextCtrl& operator<<(double d); wxTextCtrl& operator<<(const char c); + void SetFont( const wxFont &font ); + + // implementation + virtual GtkWidget* GetConnectWidget(void); virtual bool IsOwnGtkWindow( GdkWindow *window ); diff --git a/include/wx/gtk1/window.h b/include/wx/gtk1/window.h index 665c3ee0c7..a029a5dc16 100644 --- a/include/wx/gtk1/window.h +++ b/include/wx/gtk1/window.h @@ -271,6 +271,7 @@ public: // cannot get private going yet float m_oldVerticalPos; bool m_needParent; bool m_hasScrolling; + bool m_hasOwnStyle; bool m_hasVMT; bool m_sizeSet; bool m_resizing; diff --git a/samples/controls/controls.cpp b/samples/controls/controls.cpp index 6bb423f803..385a294f95 100644 --- a/samples/controls/controls.cpp +++ b/samples/controls/controls.cpp @@ -57,11 +57,13 @@ class MyPanel: public wxPanel void OnComboButtons( wxCommandEvent &event ); void OnRadio( wxCommandEvent &event ); void OnRadioButtons( wxCommandEvent &event ); + void OnSetFont( wxCommandEvent &event ); wxListBox *m_listbox; wxChoice *m_choice; wxComboBox *m_combo; wxRadioBox *m_radio; + wxButton *m_fontButton; wxTextCtrl *m_text; wxNotebook *m_notebook; @@ -137,6 +139,7 @@ const ID_LISTBOX_SEL_STR = 132; const ID_LISTBOX_CLEAR = 133; const ID_LISTBOX_APPEND = 134; const ID_LISTBOX_DELETE = 135; +const ID_LISTBOX_FONT = 136; const ID_CHOICE = 120; const ID_CHOICE_SEL_NUM = 121; @@ -144,6 +147,7 @@ const ID_CHOICE_SEL_STR = 122; const ID_CHOICE_CLEAR = 123; const ID_CHOICE_APPEND = 124; const ID_CHOICE_DELETE = 125; +const ID_CHOICE_FONT = 126; const ID_COMBO = 140; const ID_COMBO_SEL_NUM = 141; @@ -151,12 +155,16 @@ const ID_COMBO_SEL_STR = 142; const ID_COMBO_CLEAR = 143; const ID_COMBO_APPEND = 144; const ID_COMBO_DELETE = 145; +const ID_COMBO_FONT = 146; const ID_TEXT = 150; const ID_RADIOBOX = 160; const ID_RADIOBOX_SEL_NUM = 161; const ID_RADIOBOX_SEL_STR = 162; +const ID_RADIOBOX_FONT = 163; + +const ID_SET_FONT = 170; BEGIN_EVENT_TABLE(MyPanel, wxPanel) EVT_SIZE ( MyPanel::OnSize) @@ -166,21 +174,26 @@ BEGIN_EVENT_TABLE(MyPanel, wxPanel) EVT_BUTTON (ID_LISTBOX_CLEAR, MyPanel::OnListBoxButtons) EVT_BUTTON (ID_LISTBOX_APPEND, MyPanel::OnListBoxButtons) EVT_BUTTON (ID_LISTBOX_DELETE, MyPanel::OnListBoxButtons) + EVT_BUTTON (ID_LISTBOX_FONT, MyPanel::OnListBoxButtons) EVT_CHOICE (ID_CHOICE, MyPanel::OnChoice) EVT_BUTTON (ID_CHOICE_SEL_NUM, MyPanel::OnChoiceButtons) EVT_BUTTON (ID_CHOICE_SEL_STR, MyPanel::OnChoiceButtons) EVT_BUTTON (ID_CHOICE_CLEAR, MyPanel::OnChoiceButtons) EVT_BUTTON (ID_CHOICE_APPEND, MyPanel::OnChoiceButtons) EVT_BUTTON (ID_CHOICE_DELETE, MyPanel::OnChoiceButtons) + EVT_BUTTON (ID_CHOICE_FONT, MyPanel::OnChoiceButtons) EVT_CHOICE (ID_COMBO, MyPanel::OnCombo) EVT_BUTTON (ID_COMBO_SEL_NUM, MyPanel::OnComboButtons) EVT_BUTTON (ID_COMBO_SEL_STR, MyPanel::OnComboButtons) EVT_BUTTON (ID_COMBO_CLEAR, MyPanel::OnComboButtons) EVT_BUTTON (ID_COMBO_APPEND, MyPanel::OnComboButtons) EVT_BUTTON (ID_COMBO_DELETE, MyPanel::OnComboButtons) + EVT_BUTTON (ID_COMBO_FONT, MyPanel::OnComboButtons) EVT_RADIOBOX (ID_RADIOBOX, MyPanel::OnRadio) EVT_BUTTON (ID_RADIOBOX_SEL_NUM, MyPanel::OnRadioButtons) EVT_BUTTON (ID_RADIOBOX_SEL_STR, MyPanel::OnRadioButtons) + EVT_BUTTON (ID_RADIOBOX_FONT, MyPanel::OnRadioButtons) + EVT_BUTTON (ID_SET_FONT, MyPanel::OnSetFont) END_EVENT_TABLE() MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) : @@ -212,9 +225,15 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) : wxASSERT( WXSIZEOF(aIconNames) == Image_Max ); // keep in sync // fill the image list +#ifdef __WXMSW__ wxString strIconDir = "icons/"; +#else + wxString strIconDir = "../icons/"; +#endif + wxImageList *imagelist = new wxImageList(32, 32); - for ( size_t n = 0; n < Image_Max; n++ ) { + for ( size_t n = 0; n < Image_Max; n++ ) + { imagelist->Add(wxBitmap(strIconDir + aIconNames[n])); } @@ -227,6 +246,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) : (void)new wxButton( panel, ID_LISTBOX_CLEAR, "Clear", wxPoint(180,80), wxSize(100,30) ); (void)new wxButton( panel, ID_LISTBOX_APPEND, "Append 'Hi!'", wxPoint(300,80), wxSize(100,30) ); (void)new wxButton( panel, ID_LISTBOX_DELETE, "Delete selected item", wxPoint(180,130), wxSize(140,30) ); + (void)new wxButton( panel, ID_LISTBOX_FONT, "Set Italic font", wxPoint(180,180), wxSize(140,30) ); m_notebook->AddPage(panel, "wxList", FALSE, Image_List); panel = new wxPanel(m_notebook); @@ -236,6 +256,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) : (void)new wxButton( panel, ID_CHOICE_CLEAR, "Clear", wxPoint(180,80), wxSize(100,30) ); (void)new wxButton( panel, ID_CHOICE_APPEND, "Append 'Hi!'", wxPoint(300,80), wxSize(100,30) ); (void)new wxButton( panel, ID_CHOICE_DELETE, "Delete selected item", wxPoint(180,130), wxSize(140,30) ); + (void)new wxButton( panel, ID_CHOICE_FONT, "Set Italic font", wxPoint(180,180), wxSize(140,30) ); m_notebook->AddPage(panel, "wxChoice", FALSE, Image_Choice); panel = new wxPanel(m_notebook); @@ -245,6 +266,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) : (void)new wxButton( panel, ID_COMBO_CLEAR, "Clear", wxPoint(180,80), wxSize(100,30) ); (void)new wxButton( panel, ID_COMBO_APPEND, "Append 'Hi!'", wxPoint(300,80), wxSize(100,30) ); (void)new wxButton( panel, ID_COMBO_DELETE, "Delete selected item", wxPoint(180,130), wxSize(140,30) ); + (void)new wxButton( panel, ID_COMBO_FONT, "Set Italic font", wxPoint(180,180), wxSize(140,30) ); m_notebook->AddPage(panel, "wxComboBox", FALSE, Image_Combo); wxTextCtrl *text = new wxTextCtrl( m_notebook, ID_TEXT, "Write text here.", wxPoint(10,10), wxSize(120,100), wxTE_MULTILINE ); @@ -254,6 +276,8 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) : m_radio = new wxRadioBox( panel, ID_RADIOBOX, "This", wxPoint(10,10), wxSize(-1,-1), 4, choices ); (void)new wxButton( panel, ID_RADIOBOX_SEL_NUM, "Select #2", wxPoint(200,30), wxSize(100,30) ); (void)new wxButton( panel, ID_RADIOBOX_SEL_STR, "Select 'This'", wxPoint(200,80), wxSize(100,30) ); + (void)new wxButton( panel, ID_RADIOBOX_FONT, "Set Italic font", wxPoint(200,130), wxSize(160,30) ); + m_fontButton = new wxButton( panel, ID_SET_FONT, "Set more Italic font", wxPoint(200,180), wxSize(160,30) ); m_notebook->AddPage(panel, "wxRadioBox", FALSE, Image_Radio); } @@ -304,6 +328,11 @@ void MyPanel::OnListBoxButtons( wxCommandEvent &event ) m_listbox->Delete( idx ); break; } + case ID_LISTBOX_FONT: + { + m_listbox->SetFont( *wxITALIC_FONT ); + break; + } } } @@ -344,6 +373,11 @@ void MyPanel::OnChoiceButtons( wxCommandEvent &event ) m_choice->Delete( idx ); break; } + case ID_CHOICE_FONT: + { + m_choice->SetFont( *wxITALIC_FONT ); + break; + } } } @@ -384,6 +418,11 @@ void MyPanel::OnComboButtons( wxCommandEvent &event ) m_combo->Delete( idx ); break; } + case ID_COMBO_FONT: + { + m_combo->SetFont( *wxITALIC_FONT ); + break; + } } } @@ -408,9 +447,20 @@ void MyPanel::OnRadioButtons( wxCommandEvent &event ) m_radio->SetStringSelection( "This" ); break; } + case ID_RADIOBOX_FONT: + { + m_radio->SetFont( *wxITALIC_FONT ); + break; + } } } +void MyPanel::OnSetFont( wxCommandEvent &WXUNUSED(event) ) +{ + m_fontButton->SetFont( *wxITALIC_FONT ); + m_text->SetFont( *wxITALIC_FONT ); +} + MyPanel::~MyPanel() { delete m_notebook->GetImageList(); diff --git a/src/gtk/button.cpp b/src/gtk/button.cpp index 1bd096b084..f10b170bef 100644 --- a/src/gtk/button.cpp +++ b/src/gtk/button.cpp @@ -103,3 +103,26 @@ void wxButton::Enable( bool enable ) gtk_widget_set_sensitive( label, enable ); } +void wxButton::SetFont( const wxFont &font ) +{ + m_font = font; + + GtkButton *bin = GTK_BUTTON( m_widget ); + GtkWidget *label = bin->child; + + GtkStyle *style = (GtkStyle*) NULL; + if (!m_hasOwnStyle) + { + m_hasOwnStyle = TRUE; + style = gtk_style_copy( gtk_widget_get_style( label ) ); + } + else + { + style = gtk_widget_get_style( label ); + } + + gdk_font_unref( style->font ); + style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) ); + + gtk_widget_set_style( label, style ); +} diff --git a/src/gtk/checkbox.cpp b/src/gtk/checkbox.cpp index 43e7b354b0..2604d6d360 100644 --- a/src/gtk/checkbox.cpp +++ b/src/gtk/checkbox.cpp @@ -89,3 +89,26 @@ bool wxCheckBox::GetValue(void) const return tb->active; } +void wxCheckBox::SetFont( const wxFont &font ) +{ + m_font = font; + + GtkButton *bin = GTK_BUTTON( m_widget ); + GtkWidget *label = bin->child; + + GtkStyle *style = (GtkStyle*) NULL; + if (!m_hasOwnStyle) + { + m_hasOwnStyle = TRUE; + style = gtk_style_copy( gtk_widget_get_style( label ) ); + } + else + { + style = gtk_widget_get_style( label ); + } + + gdk_font_unref( style->font ); + style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) ); + + gtk_widget_set_style( label, style ); +} diff --git a/src/gtk/choice.cpp b/src/gtk/choice.cpp index c449debef2..edcf64f3e9 100644 --- a/src/gtk/choice.cpp +++ b/src/gtk/choice.cpp @@ -92,8 +92,18 @@ void wxChoice::Append( const wxString &item ) GtkWidget *menu = gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) ); GtkWidget *menu_item; menu_item = gtk_menu_item_new_with_label( item ); + + if (m_hasOwnStyle) + { + GtkBin *bin = GTK_BIN( menu_item ); + gtk_widget_set_style( bin->child, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + } + gtk_signal_connect( GTK_OBJECT( menu_item ), "activate", GTK_SIGNAL_FUNC(gtk_choice_clicked_callback), (gpointer*)this ); + gtk_menu_append( GTK_MENU(menu), menu_item ); gtk_widget_show( menu_item ); } @@ -123,10 +133,10 @@ int wxChoice::FindString( const wxString &string ) const GtkBin *bin = GTK_BIN( child->data ); GtkLabel *label = (GtkLabel *) NULL; if (bin->child) label = GTK_LABEL(bin->child); + if (!label) label = GTK_LABEL( GTK_BUTTON(m_widget)->child ); wxASSERT_MSG( label != NULL , "wxChoice: invalid label" ); - if (!label) label = GTK_LABEL( GTK_BUTTON(m_widget)->child ); if (string == label->label) return count; child = child->next; count++; @@ -172,10 +182,10 @@ wxString wxChoice::GetString( int n ) const { GtkLabel *label = (GtkLabel *) NULL; if (bin->child) label = GTK_LABEL(bin->child); + if (!label) label = GTK_LABEL( GTK_BUTTON(m_widget)->child ); wxASSERT_MSG( label != NULL , "wxChoice: invalid label" ); - if (!label) label = GTK_LABEL( GTK_BUTTON(m_widget)->child ); return label->label; } child = child->next; @@ -227,3 +237,23 @@ void wxChoice::SetStringSelection( const wxString &string ) if (n != -1) SetSelection( n ); } +void wxChoice::SetFont( const wxFont &font ) +{ + wxWindow::SetFont( font ); + + GtkMenuShell *menu_shell = GTK_MENU_SHELL( gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) ) ); + GList *child = menu_shell->children; + while (child) + { + GtkBin *bin = GTK_BIN( child->data ); + GtkWidget *label = (GtkWidget *) NULL; + if (bin->child) label = bin->child; + if (!label) label = GTK_BUTTON(m_widget)->child; + + gtk_widget_set_style( label, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + + child = child->next; + } +} diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp index 196b32a371..b6c401e8e1 100644 --- a/src/gtk/combobox.cpp +++ b/src/gtk/combobox.cpp @@ -136,8 +136,15 @@ void wxComboBox::Append( const wxString &item, char *clientData ) { GtkWidget *list = GTK_COMBO(m_widget)->list; - GtkWidget *list_item; - list_item = gtk_list_item_new_with_label( item ); + GtkWidget *list_item = gtk_list_item_new_with_label( item ); + + if (m_hasOwnStyle) + { + GtkBin *bin = GTK_BIN( list_item ); + gtk_widget_set_style( bin->child, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + } gtk_signal_connect( GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); @@ -374,4 +381,27 @@ void wxComboBox::SetEditable( bool WXUNUSED(editable) ) { } +void wxComboBox::SetFont( const wxFont &font ) +{ + wxWindow::SetFont( font ); + + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + + gtk_widget_set_style( entry, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GList *child = GTK_LIST(list)->children; + while (child) + { + GtkBin *bin = (GtkBin*) child->data; + gtk_widget_set_style( bin->child, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + + child = child->next; + } +} diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index 916d8490ad..b00f00aae1 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -130,8 +130,15 @@ void wxListBox::Append( const wxString &item ) void wxListBox::Append( const wxString &item, char *clientData ) { - GtkWidget *list_item; - list_item = gtk_list_item_new_with_label( item ); + GtkWidget *list_item = gtk_list_item_new_with_label( item ); + + if (m_hasOwnStyle) + { + GtkBin *bin = GTK_BIN( list_item ); + gtk_widget_set_style( bin->child, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + } gtk_signal_connect( GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); @@ -230,7 +237,8 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const // get the number of selected items first GList *child = m_list->children; int count = 0; - for ( child = m_list->children; child != NULL; child = child->next ) { + for ( child = m_list->children; child != NULL; child = child->next ) + { if ( GTK_WIDGET(child->data)->state == GTK_STATE_SELECTED ) count++; } @@ -241,7 +249,8 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const // now fill the list aSelections.Alloc(count); // optimization attempt int i = 0; - for ( child = m_list->children; child != NULL; child = child->next, i++ ) { + for ( child = m_list->children; child != NULL; child = child->next, i++ ) + { if ( GTK_WIDGET(child->data)->state == GTK_STATE_SELECTED ) aSelections.Add(i); } @@ -377,5 +386,19 @@ GtkWidget *wxListBox::GetConnectWidget(void) return GTK_WIDGET(m_list); } +void wxListBox::SetFont( const wxFont &font ) +{ + wxWindow::SetFont( font ); + + GList *child = m_list->children; + while (child) + { + GtkBin *bin = (GtkBin*) child->data; + gtk_widget_set_style( bin->child, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + child = child->next; + } +} diff --git a/src/gtk/radiobox.cpp b/src/gtk/radiobox.cpp index c8120af624..b42b2e82e0 100644 --- a/src/gtk/radiobox.cpp +++ b/src/gtk/radiobox.cpp @@ -279,3 +279,19 @@ void wxRadioBox::SetNumberOfRowsOrCols( int WXUNUSED(n) ) wxFAIL_MSG("wxRadioBox::SetNumberOfRowsOrCols not implemented."); } +void wxRadioBox::SetFont( const wxFont &font ) +{ + wxWindow::SetFont( font ); + + GSList *item = gtk_radio_button_group( m_radio ); + while (item) + { + GtkButton *button = GTK_BUTTON( item->data ); + + gtk_widget_set_style( button->child, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + + item = item->next; + } +} diff --git a/src/gtk/radiobut.cpp b/src/gtk/radiobut.cpp index 321210ec3d..a0e789bcbd 100644 --- a/src/gtk/radiobut.cpp +++ b/src/gtk/radiobut.cpp @@ -86,4 +86,27 @@ bool wxRadioButton::GetValue(void) const return GTK_TOGGLE_BUTTON(m_widget)->active; } +void wxRadioButton::SetFont( const wxFont &font ) +{ + m_font = font; + + GtkButton *bin = GTK_BUTTON( m_widget ); + GtkWidget *label = bin->child; + + GtkStyle *style = (GtkStyle*) NULL; + if (!m_hasOwnStyle) + { + m_hasOwnStyle = TRUE; + style = gtk_style_copy( gtk_widget_get_style( label ) ); + } + else + { + style = gtk_widget_get_style( label ); + } + + gdk_font_unref( style->font ); + style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) ); + + gtk_widget_set_style( label, style ); +} diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 5d5b5056b3..f5e2643287 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -429,5 +429,25 @@ bool wxTextCtrl::IsOwnGtkWindow( GdkWindow *window ) return (window == GTK_ENTRY(m_text)->text_area); } +void wxTextCtrl::SetFont( const wxFont &font ) +{ + m_font = font; + + GtkStyle *style = (GtkStyle*) NULL; + if (!m_hasOwnStyle) + { + m_hasOwnStyle = TRUE; + style = gtk_style_copy( gtk_widget_get_style( m_text ) ); + } + else + { + style = gtk_widget_get_style( m_text ); + } + + gdk_font_unref( style->font ); + style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) ); + + gtk_widget_set_style( m_text, style ); +} diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 2ca9ce464e..4a17f081c1 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -34,6 +34,80 @@ #include "wx/gtk/win_gtk.h" #include "gdk/gdkprivate.h" +//----------------------------------------------------------------------------- +// documentation on internals +//----------------------------------------------------------------------------- + +/* + I have been asked several times about writing some documentation about + the GTK port of wxWindows, especially its internal structures. Obviously, + you cannot understand wxGTK without knowing a little about the GTK, but + some more information about what the wxWindow, which is the base class + for all other window classes, does seems required as well. + + What does wxWindow do? It contains the common interface for the following + jobs of its descentants: + + 1) Define the rudimentary behaviour common to all window classes, such as + resizing, intercepting user input so as to make it possible to use these + events for special purposes in a derived class, window names etc. + + 2) Provide the possibility to contain and manage children, if the derived + class is allowed to contain children, which holds true for those window + classes, which do not display a native GTK widget. To name them, these + classes are wxPanel, wxScrolledWindow, wxDialog, wxFrame. The MDI frame- + work classes are a special case and are handled a bit differently from + the rest. + + 3) Provide the possibility to draw into a client area of a window. This, + too, only holds true for classes that do not display a native GTK widget + as above. + + 4) Provide the entire mechanism for scrolling widgets. This actaul inter- + face for this is usually in wxScrolledWidget, but the GTK implementation + is in this class. + + 5) A multitude of helper or extra methods for special purposes, such as + Drag'n'Drop, managing validators etc. + + Normally one might expect, that one wxWindows class would always contain + one GTK widget. Under GTK, there is no such allround widget that has all + the functionality. Moreover, the GTK defines a client area as a different + widget from the actual widget you are handling. Last but not least some + special classes (e.g. wxFrame) handle different categories of widgets and + still have the possibility to draw something in the client area. + It was therefore required to write a special purpose GTK widget, that would + represent a client area in the sense of wxWindows capable to do the jobs + 2), 3) and 4). I have written this class and it resides in win_gtk.c of + this directory. + + All windows must have a widget, with which they interact with other under- + lying GTK widget. It is this widget, e.g. that has to be resized etc and + thw wxWindow class has a member variable called m_widget which holds a + pointer to this widget. When the window class displays a GTK native widget, + this is the only GTK widget the class manages. When the class has a client + area for drawing into and for containing children it must have at least + one more GTK widget to handle (of the type GtkMyFixed, defined in win_gtk.c), + but there can be any number of widgets, handled by a class (e.g. the frame + class handles three). The common rule for all windows is only, that the + widget that interacts with the rest of GTK must be referenced in m_widget + and all other widgets must be children of this widget on the GTK level. + The top-most widget, which also represents the client area, must be in + the m_wxwindow field and must be of the type GtkMyFixed. + + As I said, the window classes that display a GTK native widget only have + one widget, so in the case of e.g. the wxButton class m_widget holds a + pointer to a GtkButton widget. But windows with client areas (for drawing + and children) have a m_widget field that is a pointer to a GtkScrolled- + Window and a m_wxwindow field that is pointer to a GtkMyFixed and this + one is (in the GTK sense) a child of the GtkScrolledWindow. + + If the m_wxwindow field is set, then all input to this widget is inter- + cepted and sent to the wxWindows class. If not, all input to the widget + that gets pointed to by m_widget gets intercepted and sent to the class. + +*/ + //----------------------------------------------------------------------------- // data //----------------------------------------------------------------------------- @@ -753,6 +827,7 @@ wxWindow::wxWindow() m_isEnabled = TRUE; m_pDropTarget = (wxDropTarget *) NULL; m_resizing = FALSE; + m_hasOwnStyle = FALSE; } bool wxWindow::Create( wxWindow *parent, wxWindowID id, @@ -937,6 +1012,7 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id, m_pDropTarget = (wxDropTarget *) NULL; m_resizing = FALSE; m_windowValidator = (wxValidator *) NULL; + m_hasOwnStyle = FALSE; } void wxWindow::PostCreation(void) @@ -1851,15 +1927,21 @@ bool wxWindow::IsOwnGtkWindow( GdkWindow *window ) void wxWindow::SetFont( const wxFont &font ) { m_font = font; -/* - create new style - copy old style values to new one - set font in new style - -> takes to many resources + GtkStyle *style = (GtkStyle*) NULL; + if (!m_hasOwnStyle) + { + m_hasOwnStyle = TRUE; + style = gtk_style_copy( gtk_widget_get_style( m_widget ) ); + } + else + { + style = gtk_widget_get_style( m_widget ); + } - GtkStyle *style = gtk_style_new(); - ... -*/ + gdk_font_unref( style->font ); + style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) ); + + gtk_widget_set_style( m_widget, style ); } wxFont *wxWindow::GetFont(void) diff --git a/src/gtk1/button.cpp b/src/gtk1/button.cpp index 1bd096b084..f10b170bef 100644 --- a/src/gtk1/button.cpp +++ b/src/gtk1/button.cpp @@ -103,3 +103,26 @@ void wxButton::Enable( bool enable ) gtk_widget_set_sensitive( label, enable ); } +void wxButton::SetFont( const wxFont &font ) +{ + m_font = font; + + GtkButton *bin = GTK_BUTTON( m_widget ); + GtkWidget *label = bin->child; + + GtkStyle *style = (GtkStyle*) NULL; + if (!m_hasOwnStyle) + { + m_hasOwnStyle = TRUE; + style = gtk_style_copy( gtk_widget_get_style( label ) ); + } + else + { + style = gtk_widget_get_style( label ); + } + + gdk_font_unref( style->font ); + style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) ); + + gtk_widget_set_style( label, style ); +} diff --git a/src/gtk1/checkbox.cpp b/src/gtk1/checkbox.cpp index 43e7b354b0..2604d6d360 100644 --- a/src/gtk1/checkbox.cpp +++ b/src/gtk1/checkbox.cpp @@ -89,3 +89,26 @@ bool wxCheckBox::GetValue(void) const return tb->active; } +void wxCheckBox::SetFont( const wxFont &font ) +{ + m_font = font; + + GtkButton *bin = GTK_BUTTON( m_widget ); + GtkWidget *label = bin->child; + + GtkStyle *style = (GtkStyle*) NULL; + if (!m_hasOwnStyle) + { + m_hasOwnStyle = TRUE; + style = gtk_style_copy( gtk_widget_get_style( label ) ); + } + else + { + style = gtk_widget_get_style( label ); + } + + gdk_font_unref( style->font ); + style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) ); + + gtk_widget_set_style( label, style ); +} diff --git a/src/gtk1/choice.cpp b/src/gtk1/choice.cpp index c449debef2..edcf64f3e9 100644 --- a/src/gtk1/choice.cpp +++ b/src/gtk1/choice.cpp @@ -92,8 +92,18 @@ void wxChoice::Append( const wxString &item ) GtkWidget *menu = gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) ); GtkWidget *menu_item; menu_item = gtk_menu_item_new_with_label( item ); + + if (m_hasOwnStyle) + { + GtkBin *bin = GTK_BIN( menu_item ); + gtk_widget_set_style( bin->child, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + } + gtk_signal_connect( GTK_OBJECT( menu_item ), "activate", GTK_SIGNAL_FUNC(gtk_choice_clicked_callback), (gpointer*)this ); + gtk_menu_append( GTK_MENU(menu), menu_item ); gtk_widget_show( menu_item ); } @@ -123,10 +133,10 @@ int wxChoice::FindString( const wxString &string ) const GtkBin *bin = GTK_BIN( child->data ); GtkLabel *label = (GtkLabel *) NULL; if (bin->child) label = GTK_LABEL(bin->child); + if (!label) label = GTK_LABEL( GTK_BUTTON(m_widget)->child ); wxASSERT_MSG( label != NULL , "wxChoice: invalid label" ); - if (!label) label = GTK_LABEL( GTK_BUTTON(m_widget)->child ); if (string == label->label) return count; child = child->next; count++; @@ -172,10 +182,10 @@ wxString wxChoice::GetString( int n ) const { GtkLabel *label = (GtkLabel *) NULL; if (bin->child) label = GTK_LABEL(bin->child); + if (!label) label = GTK_LABEL( GTK_BUTTON(m_widget)->child ); wxASSERT_MSG( label != NULL , "wxChoice: invalid label" ); - if (!label) label = GTK_LABEL( GTK_BUTTON(m_widget)->child ); return label->label; } child = child->next; @@ -227,3 +237,23 @@ void wxChoice::SetStringSelection( const wxString &string ) if (n != -1) SetSelection( n ); } +void wxChoice::SetFont( const wxFont &font ) +{ + wxWindow::SetFont( font ); + + GtkMenuShell *menu_shell = GTK_MENU_SHELL( gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) ) ); + GList *child = menu_shell->children; + while (child) + { + GtkBin *bin = GTK_BIN( child->data ); + GtkWidget *label = (GtkWidget *) NULL; + if (bin->child) label = bin->child; + if (!label) label = GTK_BUTTON(m_widget)->child; + + gtk_widget_set_style( label, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + + child = child->next; + } +} diff --git a/src/gtk1/combobox.cpp b/src/gtk1/combobox.cpp index 196b32a371..b6c401e8e1 100644 --- a/src/gtk1/combobox.cpp +++ b/src/gtk1/combobox.cpp @@ -136,8 +136,15 @@ void wxComboBox::Append( const wxString &item, char *clientData ) { GtkWidget *list = GTK_COMBO(m_widget)->list; - GtkWidget *list_item; - list_item = gtk_list_item_new_with_label( item ); + GtkWidget *list_item = gtk_list_item_new_with_label( item ); + + if (m_hasOwnStyle) + { + GtkBin *bin = GTK_BIN( list_item ); + gtk_widget_set_style( bin->child, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + } gtk_signal_connect( GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); @@ -374,4 +381,27 @@ void wxComboBox::SetEditable( bool WXUNUSED(editable) ) { } +void wxComboBox::SetFont( const wxFont &font ) +{ + wxWindow::SetFont( font ); + + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + + gtk_widget_set_style( entry, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GList *child = GTK_LIST(list)->children; + while (child) + { + GtkBin *bin = (GtkBin*) child->data; + gtk_widget_set_style( bin->child, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + + child = child->next; + } +} diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index 916d8490ad..b00f00aae1 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -130,8 +130,15 @@ void wxListBox::Append( const wxString &item ) void wxListBox::Append( const wxString &item, char *clientData ) { - GtkWidget *list_item; - list_item = gtk_list_item_new_with_label( item ); + GtkWidget *list_item = gtk_list_item_new_with_label( item ); + + if (m_hasOwnStyle) + { + GtkBin *bin = GTK_BIN( list_item ); + gtk_widget_set_style( bin->child, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + } gtk_signal_connect( GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); @@ -230,7 +237,8 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const // get the number of selected items first GList *child = m_list->children; int count = 0; - for ( child = m_list->children; child != NULL; child = child->next ) { + for ( child = m_list->children; child != NULL; child = child->next ) + { if ( GTK_WIDGET(child->data)->state == GTK_STATE_SELECTED ) count++; } @@ -241,7 +249,8 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const // now fill the list aSelections.Alloc(count); // optimization attempt int i = 0; - for ( child = m_list->children; child != NULL; child = child->next, i++ ) { + for ( child = m_list->children; child != NULL; child = child->next, i++ ) + { if ( GTK_WIDGET(child->data)->state == GTK_STATE_SELECTED ) aSelections.Add(i); } @@ -377,5 +386,19 @@ GtkWidget *wxListBox::GetConnectWidget(void) return GTK_WIDGET(m_list); } +void wxListBox::SetFont( const wxFont &font ) +{ + wxWindow::SetFont( font ); + + GList *child = m_list->children; + while (child) + { + GtkBin *bin = (GtkBin*) child->data; + gtk_widget_set_style( bin->child, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + child = child->next; + } +} diff --git a/src/gtk1/radiobox.cpp b/src/gtk1/radiobox.cpp index c8120af624..b42b2e82e0 100644 --- a/src/gtk1/radiobox.cpp +++ b/src/gtk1/radiobox.cpp @@ -279,3 +279,19 @@ void wxRadioBox::SetNumberOfRowsOrCols( int WXUNUSED(n) ) wxFAIL_MSG("wxRadioBox::SetNumberOfRowsOrCols not implemented."); } +void wxRadioBox::SetFont( const wxFont &font ) +{ + wxWindow::SetFont( font ); + + GSList *item = gtk_radio_button_group( m_radio ); + while (item) + { + GtkButton *button = GTK_BUTTON( item->data ); + + gtk_widget_set_style( button->child, + gtk_style_ref( + gtk_widget_get_style( m_widget ) ) ); + + item = item->next; + } +} diff --git a/src/gtk1/radiobut.cpp b/src/gtk1/radiobut.cpp index 321210ec3d..a0e789bcbd 100644 --- a/src/gtk1/radiobut.cpp +++ b/src/gtk1/radiobut.cpp @@ -86,4 +86,27 @@ bool wxRadioButton::GetValue(void) const return GTK_TOGGLE_BUTTON(m_widget)->active; } +void wxRadioButton::SetFont( const wxFont &font ) +{ + m_font = font; + + GtkButton *bin = GTK_BUTTON( m_widget ); + GtkWidget *label = bin->child; + + GtkStyle *style = (GtkStyle*) NULL; + if (!m_hasOwnStyle) + { + m_hasOwnStyle = TRUE; + style = gtk_style_copy( gtk_widget_get_style( label ) ); + } + else + { + style = gtk_widget_get_style( label ); + } + + gdk_font_unref( style->font ); + style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) ); + + gtk_widget_set_style( label, style ); +} diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index 5d5b5056b3..f5e2643287 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -429,5 +429,25 @@ bool wxTextCtrl::IsOwnGtkWindow( GdkWindow *window ) return (window == GTK_ENTRY(m_text)->text_area); } +void wxTextCtrl::SetFont( const wxFont &font ) +{ + m_font = font; + + GtkStyle *style = (GtkStyle*) NULL; + if (!m_hasOwnStyle) + { + m_hasOwnStyle = TRUE; + style = gtk_style_copy( gtk_widget_get_style( m_text ) ); + } + else + { + style = gtk_widget_get_style( m_text ); + } + + gdk_font_unref( style->font ); + style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) ); + + gtk_widget_set_style( m_text, style ); +} diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 2ca9ce464e..4a17f081c1 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -34,6 +34,80 @@ #include "wx/gtk/win_gtk.h" #include "gdk/gdkprivate.h" +//----------------------------------------------------------------------------- +// documentation on internals +//----------------------------------------------------------------------------- + +/* + I have been asked several times about writing some documentation about + the GTK port of wxWindows, especially its internal structures. Obviously, + you cannot understand wxGTK without knowing a little about the GTK, but + some more information about what the wxWindow, which is the base class + for all other window classes, does seems required as well. + + What does wxWindow do? It contains the common interface for the following + jobs of its descentants: + + 1) Define the rudimentary behaviour common to all window classes, such as + resizing, intercepting user input so as to make it possible to use these + events for special purposes in a derived class, window names etc. + + 2) Provide the possibility to contain and manage children, if the derived + class is allowed to contain children, which holds true for those window + classes, which do not display a native GTK widget. To name them, these + classes are wxPanel, wxScrolledWindow, wxDialog, wxFrame. The MDI frame- + work classes are a special case and are handled a bit differently from + the rest. + + 3) Provide the possibility to draw into a client area of a window. This, + too, only holds true for classes that do not display a native GTK widget + as above. + + 4) Provide the entire mechanism for scrolling widgets. This actaul inter- + face for this is usually in wxScrolledWidget, but the GTK implementation + is in this class. + + 5) A multitude of helper or extra methods for special purposes, such as + Drag'n'Drop, managing validators etc. + + Normally one might expect, that one wxWindows class would always contain + one GTK widget. Under GTK, there is no such allround widget that has all + the functionality. Moreover, the GTK defines a client area as a different + widget from the actual widget you are handling. Last but not least some + special classes (e.g. wxFrame) handle different categories of widgets and + still have the possibility to draw something in the client area. + It was therefore required to write a special purpose GTK widget, that would + represent a client area in the sense of wxWindows capable to do the jobs + 2), 3) and 4). I have written this class and it resides in win_gtk.c of + this directory. + + All windows must have a widget, with which they interact with other under- + lying GTK widget. It is this widget, e.g. that has to be resized etc and + thw wxWindow class has a member variable called m_widget which holds a + pointer to this widget. When the window class displays a GTK native widget, + this is the only GTK widget the class manages. When the class has a client + area for drawing into and for containing children it must have at least + one more GTK widget to handle (of the type GtkMyFixed, defined in win_gtk.c), + but there can be any number of widgets, handled by a class (e.g. the frame + class handles three). The common rule for all windows is only, that the + widget that interacts with the rest of GTK must be referenced in m_widget + and all other widgets must be children of this widget on the GTK level. + The top-most widget, which also represents the client area, must be in + the m_wxwindow field and must be of the type GtkMyFixed. + + As I said, the window classes that display a GTK native widget only have + one widget, so in the case of e.g. the wxButton class m_widget holds a + pointer to a GtkButton widget. But windows with client areas (for drawing + and children) have a m_widget field that is a pointer to a GtkScrolled- + Window and a m_wxwindow field that is pointer to a GtkMyFixed and this + one is (in the GTK sense) a child of the GtkScrolledWindow. + + If the m_wxwindow field is set, then all input to this widget is inter- + cepted and sent to the wxWindows class. If not, all input to the widget + that gets pointed to by m_widget gets intercepted and sent to the class. + +*/ + //----------------------------------------------------------------------------- // data //----------------------------------------------------------------------------- @@ -753,6 +827,7 @@ wxWindow::wxWindow() m_isEnabled = TRUE; m_pDropTarget = (wxDropTarget *) NULL; m_resizing = FALSE; + m_hasOwnStyle = FALSE; } bool wxWindow::Create( wxWindow *parent, wxWindowID id, @@ -937,6 +1012,7 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id, m_pDropTarget = (wxDropTarget *) NULL; m_resizing = FALSE; m_windowValidator = (wxValidator *) NULL; + m_hasOwnStyle = FALSE; } void wxWindow::PostCreation(void) @@ -1851,15 +1927,21 @@ bool wxWindow::IsOwnGtkWindow( GdkWindow *window ) void wxWindow::SetFont( const wxFont &font ) { m_font = font; -/* - create new style - copy old style values to new one - set font in new style - -> takes to many resources + GtkStyle *style = (GtkStyle*) NULL; + if (!m_hasOwnStyle) + { + m_hasOwnStyle = TRUE; + style = gtk_style_copy( gtk_widget_get_style( m_widget ) ); + } + else + { + style = gtk_widget_get_style( m_widget ); + } - GtkStyle *style = gtk_style_new(); - ... -*/ + gdk_font_unref( style->font ); + style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) ); + + gtk_widget_set_style( m_widget, style ); } wxFont *wxWindow::GetFont(void) -- 2.45.2