From 53010e52d3adc63d2771263e294714bf644fc979 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 3 Jun 1998 19:06:13 +0000 Subject: [PATCH] GTK combobox idle handling makefile fixes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/listctrl.h | 3 +- include/wx/gtk/app.h | 29 +++- include/wx/gtk/combobox.h | 2 +- include/wx/gtk1/app.h | 29 +++- include/wx/gtk1/combobox.h | 2 +- samples/controls/minimal.cpp | 38 ++++- src/Makefile.in | 6 +- src/generic/listctrl.cpp | 97 +++++------- src/gtk/app.cpp | 78 +++++++++- src/gtk/combobox.cpp | 282 ++++++++++++++++++++++++++++++++++ src/gtk/notebook.cpp | 13 +- src/gtk/setup/maketmpl.in | 7 +- src/gtk1/app.cpp | 78 +++++++++- src/gtk1/combobox.cpp | 282 ++++++++++++++++++++++++++++++++++ src/gtk1/notebook.cpp | 13 +- src/gtk1/setup/maketmpl.in | 7 +- user/wxFile/filectrl.cpp | 1 - 17 files changed, 864 insertions(+), 103 deletions(-) create mode 100644 src/gtk/combobox.cpp create mode 100644 src/gtk1/combobox.cpp diff --git a/include/wx/generic/listctrl.h b/include/wx/generic/listctrl.h index 45dcc2bdb5..93106ffa1d 100644 --- a/include/wx/generic/listctrl.h +++ b/include/wx/generic/listctrl.h @@ -602,7 +602,6 @@ class wxListCtrl: public wxControl void SetSingleStyle( const long style, const bool add = TRUE ) ; void SetWindowStyleFlag(const long style); void RecreateWindow(void) {}; - void RealizeChanges( void ); // whereas this is much needed in wxGLC long GetNextItem(const long item, int geometry = wxLIST_NEXT_ALL, int state = wxLIST_STATE_DONTCARE); wxImageList *GetImageList(const int which); void SetImageList(wxImageList *imageList, const int which) ; @@ -631,6 +630,8 @@ class wxListCtrl: public wxControl { m_mainWin->SetDropTarget( dropTarget ); }; wxDropTarget *GetDropTarget() const { return m_mainWin->GetDropTarget(); }; + + void OnIdle( wxIdleEvent &event ); protected: diff --git a/include/wx/gtk/app.h b/include/wx/gtk/app.h index 6e79190ab4..0e90356615 100644 --- a/include/wx/gtk/app.h +++ b/include/wx/gtk/app.h @@ -61,10 +61,10 @@ class wxApp: public wxEvtHandler static void SetInitializerFunction(wxAppInitializerFunction fn) { m_appInitFn = fn; } static wxAppInitializerFunction GetInitializerFunction(void) { return m_appInitFn; } + virtual bool OnInit(void); virtual bool OnInitGui(void); virtual int OnRun(void); - virtual bool OnIdle(void); virtual int OnExit(void); wxWindow *GetTopWindow(void); @@ -74,8 +74,14 @@ class wxApp: public wxEvtHandler bool Initialized(void); virtual bool Pending(void); virtual void Dispatch(void); - void DeletePendingObjects(void); - + + inline void SetWantDebugOutput(bool flag) { m_wantDebugOutput = flag; } + inline bool GetWantDebugOutput(void) { return m_wantDebugOutput; } + + void OnIdle( wxIdleEvent &event ); + bool SendIdleEvents(void); + bool SendIdleEvents( wxWindow* win ); + inline wxString GetAppName(void) const { if (m_appName != "") return m_appName; @@ -90,9 +96,6 @@ class wxApp: public wxEvtHandler void SetPrintMode(int WXUNUSED(mode) ) {}; int GetPrintMode(void) const { return wxPRINT_POSTSCRIPT; }; - - static void CommonInit(void); - static void CommonCleanUp(void); // override this function to create default log target of arbitrary // user-defined classv (default implementation creates a wxLogGui object) @@ -104,17 +107,29 @@ class wxApp: public wxEvtHandler virtual wxConfig *CreateConfig() { return NULL; } #endif + // GTK implementation + + static void CommonInit(void); + static void CommonCleanUp(void); + + bool ProcessIdle(void); + void DeletePendingObjects(void); + bool m_initialized; bool m_exitOnFrameDelete; - gint m_idleTag; + bool m_wantDebugOutput; wxWindow *m_topWindow; wxString m_appName; wxString m_className; + gint m_idleTag; + int argc; char **argv; static wxAppInitializerFunction m_appInitFn; + + DECLARE_EVENT_TABLE() }; #endif // __GTKAPPH__ diff --git a/include/wx/gtk/combobox.h b/include/wx/gtk/combobox.h index d63ebd233e..cd4d25d3a4 100644 --- a/include/wx/gtk/combobox.h +++ b/include/wx/gtk/combobox.h @@ -75,7 +75,7 @@ class wxComboBox: public wxControl wxString GetString( const int n ) const; wxString GetStringSelection(void) const; int Number(void) const; - void SetSelection( const int n, const bool select = TRUE ); + void SetSelection( const int n ); // Text field functions wxString GetValue(void) const ; diff --git a/include/wx/gtk1/app.h b/include/wx/gtk1/app.h index 6e79190ab4..0e90356615 100644 --- a/include/wx/gtk1/app.h +++ b/include/wx/gtk1/app.h @@ -61,10 +61,10 @@ class wxApp: public wxEvtHandler static void SetInitializerFunction(wxAppInitializerFunction fn) { m_appInitFn = fn; } static wxAppInitializerFunction GetInitializerFunction(void) { return m_appInitFn; } + virtual bool OnInit(void); virtual bool OnInitGui(void); virtual int OnRun(void); - virtual bool OnIdle(void); virtual int OnExit(void); wxWindow *GetTopWindow(void); @@ -74,8 +74,14 @@ class wxApp: public wxEvtHandler bool Initialized(void); virtual bool Pending(void); virtual void Dispatch(void); - void DeletePendingObjects(void); - + + inline void SetWantDebugOutput(bool flag) { m_wantDebugOutput = flag; } + inline bool GetWantDebugOutput(void) { return m_wantDebugOutput; } + + void OnIdle( wxIdleEvent &event ); + bool SendIdleEvents(void); + bool SendIdleEvents( wxWindow* win ); + inline wxString GetAppName(void) const { if (m_appName != "") return m_appName; @@ -90,9 +96,6 @@ class wxApp: public wxEvtHandler void SetPrintMode(int WXUNUSED(mode) ) {}; int GetPrintMode(void) const { return wxPRINT_POSTSCRIPT; }; - - static void CommonInit(void); - static void CommonCleanUp(void); // override this function to create default log target of arbitrary // user-defined classv (default implementation creates a wxLogGui object) @@ -104,17 +107,29 @@ class wxApp: public wxEvtHandler virtual wxConfig *CreateConfig() { return NULL; } #endif + // GTK implementation + + static void CommonInit(void); + static void CommonCleanUp(void); + + bool ProcessIdle(void); + void DeletePendingObjects(void); + bool m_initialized; bool m_exitOnFrameDelete; - gint m_idleTag; + bool m_wantDebugOutput; wxWindow *m_topWindow; wxString m_appName; wxString m_className; + gint m_idleTag; + int argc; char **argv; static wxAppInitializerFunction m_appInitFn; + + DECLARE_EVENT_TABLE() }; #endif // __GTKAPPH__ diff --git a/include/wx/gtk1/combobox.h b/include/wx/gtk1/combobox.h index d63ebd233e..cd4d25d3a4 100644 --- a/include/wx/gtk1/combobox.h +++ b/include/wx/gtk1/combobox.h @@ -75,7 +75,7 @@ class wxComboBox: public wxControl wxString GetString( const int n ) const; wxString GetStringSelection(void) const; int Number(void) const; - void SetSelection( const int n, const bool select = TRUE ); + void SetSelection( const int n ); // Text field functions wxString GetValue(void) const ; diff --git a/samples/controls/minimal.cpp b/samples/controls/minimal.cpp index 2fc4ff9ee5..1ad0899e58 100644 --- a/samples/controls/minimal.cpp +++ b/samples/controls/minimal.cpp @@ -47,6 +47,8 @@ class MyPanel: public wxPanel void OnListBoxButtons( wxCommandEvent &event ); wxListBox *m_listbox; + wxChoice *m_choice; + wxComboBox *m_combo; wxTextCtrl *m_text; wxNotebook *m_notebook; @@ -123,6 +125,14 @@ const ID_LISTBOX_SEL_STR = 132; const ID_LISTBOX_CLEAR = 133; const ID_LISTBOX_APPEND = 134; +const ID_CHOICE = 120; +const ID_CHOICE_SEL_NUM = 121; +const ID_CHOICE_SEL_STR = 122; +const ID_CHOICE_CLEAR = 123; +const ID_CHOICE_APPEND = 124; + +const ID_COMBO = 140; + BEGIN_EVENT_TABLE(MyPanel, wxPanel) EVT_SIZE ( MyPanel::OnSize) EVT_LISTBOX (ID_LISTBOX, MyPanel::OnListBox) @@ -139,23 +149,34 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) : m_notebook = new wxNotebook( this, ID_NOTEBOOK, wxPoint(0,0), wxSize(200,150) ); - wxString choices[4] = + wxString choices[] = { "This", "is", "a", - "wonderfull example." + "wonderfull example.", + "Or", + "what", + "do", + "you", + "think?" }; wxPanel *panel = m_notebook->CreatePage( 0, "wxList" ); - m_listbox = new wxListBox( panel, ID_LISTBOX, wxPoint(10,10), wxSize(120,70), 4, choices ); - (void)new wxButton( panel, ID_LISTBOX_SEL_NUM, "Select #2", wxPoint(140,30), wxSize(100,30) ); - (void)new wxButton( panel, ID_LISTBOX_SEL_STR, "Select 'This'", wxPoint(260,30), wxSize(100,30) ); - (void)new wxButton( panel, ID_LISTBOX_CLEAR, "Clear", wxPoint(140,80), wxSize(100,30) ); - (void)new wxButton( panel, ID_LISTBOX_APPEND, "Append 'Hi!'", wxPoint(260,80), wxSize(100,30) ); + m_listbox = new wxListBox( panel, ID_LISTBOX, wxPoint(10,10), wxSize(120,70), 9, choices ); + (void)new wxButton( panel, ID_LISTBOX_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(100,30) ); + (void)new wxButton( panel, ID_LISTBOX_SEL_STR, "Select 'This'", wxPoint(300,30), wxSize(100,30) ); + (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) ); + + panel = m_notebook->CreatePage( 1, "wxChoice" ); + + m_choice = new wxChoice( panel, ID_CHOICE, wxPoint(10,10), wxSize(120,-1), 9, choices ); + + panel = m_notebook->CreatePage( 2, "wxComboBox" ); - m_notebook->CreatePage( 1, "wxChoice" ); + m_combo = new wxComboBox( panel, ID_COMBO, "This", wxPoint(10,10), wxSize(120,-1), 9, choices ); } void MyPanel::OnSize( wxSizeEvent& WXUNUSED(event) ) @@ -178,6 +199,7 @@ void MyPanel::OnListBox( wxCommandEvent &event ) void MyPanel::OnListBoxButtons( wxCommandEvent &WXUNUSED(event) ) { + m_notebook->DeletePage( 1 ); } //---------------------------------------------------------------------- diff --git a/src/Makefile.in b/src/Makefile.in index 97690c5f9b..d76b0cb635 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -64,6 +64,7 @@ LIB_CPP_SRC=\ gtk/checkbox.cpp \ gtk/choice.cpp \ gtk/colour.cpp \ + gtk/combobox.cpp \ gtk/control.cpp \ gtk/cursor.cpp \ gtk/data.cpp \ @@ -181,7 +182,10 @@ clean:: #additional things needed for compile ADD_COMPILE= \ - -DHAVE_LIBPNG -DDJPEG_PROG=\"\" -DCJPEG_PROG=\"\" + -DHAVE_LIBPNG -DDJPEG_PROG=\"\" -DCJPEG_PROG=\"\" \ + -I$(WXBASEDIR)/src/png \ + -I$(WXBASEDIR)/src/zlib \ + -I$(WXBASEDIR)/src/gdk_imlib # include the definitions now include ../../template.mak diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index a1090aff83..383f729e33 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -1948,6 +1948,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) BEGIN_EVENT_TABLE(wxListCtrl,wxControl) EVT_SIZE (wxListCtrl::OnSize) + EVT_IDLE (wxListCtrl::OnIdle) END_EVENT_TABLE() wxListCtrl::wxListCtrl(void) @@ -1998,24 +1999,9 @@ bool wxListCtrl::Create( wxWindow *parent, const wxWindowID id, void wxListCtrl::OnSize( wxSizeEvent &WXUNUSED(event) ) { - RealizeChanges(); -/* - wxWindow::OnSize( event ); - - int cw = 0; - int ch = 0; - GetClientSize( &cw, &ch ); + // handled in OnIdle - if (GetWindowStyleFlag() & wxLC_REPORT) - { - m_headerWin->SetSize( 0, 0, cw, 23 ); - m_mainWin->SetSize( 0, 24, cw, ch-24 ); - } - else - { - m_mainWin->SetSize( 0, 0, cw, ch ); - }; -*/ + if (m_mainWin) m_mainWin->m_dirty = TRUE; }; void wxListCtrl::SetSingleStyle( const long style, const bool add ) @@ -2079,45 +2065,6 @@ void wxListCtrl::SetWindowStyleFlag( const long flag ) wxWindow::SetWindowStyleFlag( flag ); }; -void wxListCtrl::RealizeChanges( void ) -{ - m_mainWin->m_dirty = TRUE; - - int cw = 0; - int ch = 0; - GetClientSize( &cw, &ch ); - - int x = 0; - int y = 0; - int w = 0; - int h = 0; - - if (GetWindowStyleFlag() & wxLC_REPORT) - { - m_headerWin->GetPosition( &x, &y ); - m_headerWin->GetSize( &w, &h ); - if ((x != 0) || (y != 0) || (w != cw) || (h != 23)) - m_headerWin->SetSize( 0, 0, cw, 23 ); - - m_mainWin->GetPosition( &x, &y ); - m_mainWin->GetSize( &w, &h ); - if ((x != 0) || (y != 24) || (w != cw) || (h != ch-24)) - m_mainWin->SetSize( 0, 24, cw, ch-24 ); - } - else - { - m_mainWin->GetPosition( &x, &y ); - m_mainWin->GetSize( &w, &h ); - if ((x != 0) || (y != 24) || (w != cw) || (h != ch)) - m_mainWin->SetSize( 0, 0, cw, ch ); - }; - - m_mainWin->CalculatePositions(); - m_mainWin->RealizeChanges(); - m_mainWin->m_dirty = FALSE; - m_mainWin->Refresh(); -}; - void wxListCtrl::SetBackgroundColour(const wxColour& col) { // This is from Julian. You know. @@ -2451,4 +2398,42 @@ bool wxListCtrl::SortItems( wxListCtrlCompare fn, long data ) return TRUE; }; +void wxListCtrl::OnIdle( wxIdleEvent &event ) +{ + if (!m_mainWin->m_dirty) return; + + int cw = 0; + int ch = 0; + GetClientSize( &cw, &ch ); + + int x = 0; + int y = 0; + int w = 0; + int h = 0; + + if (GetWindowStyleFlag() & wxLC_REPORT) + { + m_headerWin->GetPosition( &x, &y ); + m_headerWin->GetSize( &w, &h ); + if ((x != 0) || (y != 0) || (w != cw) || (h != 23)) + m_headerWin->SetSize( 0, 0, cw, 23 ); + + m_mainWin->GetPosition( &x, &y ); + m_mainWin->GetSize( &w, &h ); + if ((x != 0) || (y != 24) || (w != cw) || (h != ch-24)) + m_mainWin->SetSize( 0, 24, cw, ch-24 ); + } + else + { + m_mainWin->GetPosition( &x, &y ); + m_mainWin->GetSize( &w, &h ); + if ((x != 0) || (y != 24) || (w != cw) || (h != ch)) + m_mainWin->SetSize( 0, 0, cw, ch ); + }; + + m_mainWin->CalculatePositions(); + m_mainWin->RealizeChanges(); + m_mainWin->Refresh(); +}; + diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 8081fc3c04..ee5c02afca 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -61,9 +61,13 @@ bool wxYield(void) IMPLEMENT_DYNAMIC_CLASS(wxApp,wxEvtHandler) +BEGIN_EVENT_TABLE(wxApp, wxEvtHandler) + EVT_IDLE(wxApp::OnIdle) +END_EVENT_TABLE() + gint wxapp_idle_callback( gpointer WXUNUSED(data) ) { - if (wxTheApp) wxTheApp->OnIdle(); + if (wxTheApp) while (wxTheApp->ProcessIdle()) {}; usleep( 10000 ); return TRUE; }; @@ -96,10 +100,78 @@ int wxApp::OnRun(void) return MainLoop(); }; -bool wxApp::OnIdle(void) +bool wxApp::ProcessIdle(void) +{ + wxIdleEvent event; + event.SetEventObject( this ); + ProcessEvent( event ); + + return event.MoreRequested(); +}; + +void wxApp::OnIdle( wxIdleEvent &event ) { + static bool inOnIdle = FALSE; + + // Avoid recursion (via ProcessEvent default case) + if (inOnIdle) + return; + + inOnIdle = TRUE; + + // 'Garbage' collection of windows deleted with Close(). DeletePendingObjects(); - return FALSE; + + // flush the logged messages if any + wxLog *pLog = wxLog::GetActiveTarget(); + if ( pLog != NULL && pLog->HasPendingMessages() ) + pLog->Flush(); + + // Send OnIdle events to all windows + bool needMore = SendIdleEvents(); + + if (needMore) + event.RequestMore(TRUE); + + inOnIdle = FALSE; +}; + +bool wxApp::SendIdleEvents(void) +{ + bool needMore = FALSE; + wxNode* node = wxTopLevelWindows.First(); + while (node) + { + wxWindow* win = (wxWindow*) node->Data(); + if (SendIdleEvents(win)) + needMore = TRUE; + + node = node->Next(); + } + return needMore; +}; + +bool wxApp::SendIdleEvents( wxWindow* win ) +{ + bool needMore = FALSE; + + wxIdleEvent event; + event.SetEventObject(win); + win->ProcessEvent(event); + + if (event.MoreRequested()) + needMore = TRUE; + + wxNode* node = win->GetChildren()->First(); + while (node) + { + wxWindow* win = (wxWindow*) node->Data(); + if (SendIdleEvents(win)) + needMore = TRUE; + + node = node->Next(); + } + return needMore ; }; int wxApp::OnExit(void) diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp new file mode 100644 index 0000000000..b3630535a5 --- /dev/null +++ b/src/gtk/combobox.cpp @@ -0,0 +1,282 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: combobox.cpp +// Purpose: +// Author: Robert Roebling +// Created: 01/02/97 +// Id: +// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma implementation "combobox.h" +#endif + +#include "wx/combobox.h" + +//----------------------------------------------------------------------------- +// wxComboBox +//----------------------------------------------------------------------------- + +void gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) +{ + wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, combo->GetId()); + event.SetInt( combo->GetSelection() ); + wxString tmp( combo->GetStringSelection() ); + event.SetString( WXSTRINGCAST(tmp) ); + event.SetEventObject(combo); + combo->ProcessEvent(event); +}; + +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxComboBox,wxControl) + +bool wxComboBox::Create(wxWindow *parent, const wxWindowID id, const wxString& value, + const wxPoint& pos, const wxSize& size, + const int n, const wxString choices[], + const long style, const wxString& name ) +{ + m_needParent = TRUE; + + PreCreation( parent, id, pos, size, style, name ); + + m_widget = gtk_combo_new(); + + wxSize newSize = size; + if (newSize.x == -1) newSize.x = 100; + if (newSize.y == -1) newSize.y = 26; + SetSize( newSize.x, newSize.y ); + + GtkWidget *list = GTK_COMBO(m_widget)->list; + + for (int i = 0; i < n; i++) + { + GtkWidget *list_item; + list_item = gtk_list_item_new_with_label( choices[i] ); + + gtk_signal_connect( GTK_OBJECT(list_item), "select", + GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); + + gtk_container_add( GTK_CONTAINER(list), list_item ); + + gtk_widget_show( list_item ); + }; + + PostCreation(); + + if (!value.IsNull()) SetValue( value ); + + Show( TRUE ); + + return TRUE; +}; + +void wxComboBox::Clear(void) +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + gtk_list_clear_items( GTK_LIST(list), 0, Number() ); +}; + +void wxComboBox::Append( const wxString &item ) +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GtkWidget *list_item; + list_item = gtk_list_item_new_with_label( item ); + + gtk_signal_connect( GTK_OBJECT(list_item), "select", + GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); + + gtk_container_add( GTK_CONTAINER(list), list_item ); + + gtk_widget_show( list_item ); +}; + +void wxComboBox::Append( const wxString &WXUNUSED(item), char* WXUNUSED(clientData) ) +{ +}; + +void wxComboBox::Delete( const int n ) +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + gtk_list_clear_items( GTK_LIST(list), n, n ); +}; + +int wxComboBox::FindString( const wxString &item ) +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GList *child = GTK_LIST(list)->children; + int count = 0; + while (child) + { + GtkBin *bin = GTK_BIN( child->data ); + GtkLabel *label = GTK_LABEL( bin->child ); + if (item == label->label) return count; + count++; + child = child->next; + }; + return -1; +}; + +char* wxComboBox::GetClientData( const int n ) +{ + wxNode *node = m_clientData.Nth( n ); + if (node) return (char*)node->Data(); + return NULL; +}; + +void wxComboBox::SetClientData( const int n, char * clientData ) +{ + wxNode *node = m_clientData.Nth( n ); + if (node) node->SetData( (wxObject*) clientData ); +}; + +int wxComboBox::GetSelection(void) const +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GList *selection = GTK_LIST(list)->selection; + if (selection) + { + GList *child = GTK_LIST(list)->children; + int count = 0; + while (child) + { + if (child->data == selection->data) return count; + count++; + child = child->next; + }; + }; + return -1; +}; + +wxString wxComboBox::GetString( const int n ) const +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GList *child = g_list_nth( GTK_LIST(list)->children, n ); + if (child) + { + GtkBin *bin = GTK_BIN( child->data ); + GtkLabel *label = GTK_LABEL( bin->child ); + return label->label; + }; + return ""; +}; + +wxString wxComboBox::GetStringSelection(void) const +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GList *selection = GTK_LIST(list)->selection; + if (selection) + { + GtkBin *bin = GTK_BIN( selection->data ); + wxString tmp = GTK_LABEL( bin->child )->label; + return tmp; + }; + return ""; +}; + +int wxComboBox::Number(void) const +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GList *child = GTK_LIST(list)->children; + int count = 0; + while (child) { count++; child = child->next; }; + return count; +}; + +void wxComboBox::SetSelection( const int n ) +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + gtk_list_select_item( GTK_LIST(list), n ); +}; + +wxString wxComboBox::GetValue(void) const +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + wxString tmp = gtk_entry_get_text( GTK_ENTRY(entry) ); + return tmp; +}; + +void wxComboBox::SetValue( const wxString& value ) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + wxString tmp = ""; + if (!value.IsNull()) tmp = value; + gtk_entry_set_text( GTK_ENTRY(entry), tmp ); +}; + +void wxComboBox::Copy(void) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + gtk_editable_copy_clipboard( GTK_EDITABLE(entry), 0 ); +}; + +void wxComboBox::Cut(void) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + gtk_editable_cut_clipboard( GTK_EDITABLE(entry), 0 ); +}; + +void wxComboBox::Paste(void) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + gtk_editable_paste_clipboard( GTK_EDITABLE(entry), 0 ); +}; + +void wxComboBox::SetInsertionPoint( const long pos ) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + int tmp = (int) pos; + gtk_entry_set_position( GTK_ENTRY(entry), tmp ); +}; + +void wxComboBox::SetInsertionPointEnd(void) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + int pos = GTK_ENTRY(entry)->text_length; + SetInsertionPoint( pos-1 ); +}; + +long wxComboBox::GetInsertionPoint(void) const +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + return (long) GTK_EDITABLE(entry)->current_pos; +}; + +long wxComboBox::GetLastPosition(void) const +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + int pos = GTK_ENTRY(entry)->text_length; + return (long) pos-1; +}; + +void wxComboBox::Replace( const long from, const long to, const wxString& value ) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to ); + if (value.IsNull()) return; + gint pos = (gint)to; + gtk_editable_insert_text( GTK_EDITABLE(entry), value, value.Length(), &pos ); +}; + +void wxComboBox::Remove(const long from, const long to) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to ); +}; + +void wxComboBox::SetSelection( const long WXUNUSED(from), const long WXUNUSED(to) ) +{ +}; + +void wxComboBox::SetEditable( const bool WXUNUSED(editable) ) +{ +}; + + diff --git a/src/gtk/notebook.cpp b/src/gtk/notebook.cpp index 7ec169b526..c58f048ccb 100644 --- a/src/gtk/notebook.cpp +++ b/src/gtk/notebook.cpp @@ -314,10 +314,13 @@ bool wxNotebook::DeletePage( const int page ) page_num++; child = child->next; }; - - if (!child) wxFatalError( "Notebook delete error" );; + + wxASSERT( child ); + + delete nb_page->m_clientPanel; - gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page_num ); +// Amazingly, this is not necessary +// gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page_num ); m_pages.DeleteObject( nb_page ); @@ -341,7 +344,9 @@ wxPanel *wxNotebook::CreatePage( const int item, const wxString &text, const int m_frame = NULL; - page->m_page = GTK_NOTEBOOK(m_widget)->cur_page; + page->m_page = (GtkNotebookPage*)( g_list_last( GTK_NOTEBOOK(m_widget)->children )->data ); + + if (!page->m_page) wxFatalError( "Notebook page creation error" ); m_pages.Append( page ); diff --git a/src/gtk/setup/maketmpl.in b/src/gtk/setup/maketmpl.in index 961c31d281..7c299ea814 100644 --- a/src/gtk/setup/maketmpl.in +++ b/src/gtk/setup/maketmpl.in @@ -95,13 +95,14 @@ $(TOOLKIT_DEF) \ -I. \ -I.. \ -I$(WXBASEDIR)/include \ --I$(WXBASEDIR)/src/png \ --I$(WXBASEDIR)/src/zlib \ --I$(WXBASEDIR)/src/gdk_imlib \ $(GUI_TK_INCLUDE) \ $(OPENGL_INCLUDE) \ $(X_CFLAGS) +# -I$(WXBASEDIR)/src/png \ +# -I$(WXBASEDIR)/src/zlib \ +# -I$(WXBASEDIR)/src/gdk_imlib \ + WX_LIBS = -L$(GLOBAL_LIB_DIR) -lwx_gtk OPENGL_LIBS = $(OPENGL_LIBRARY) $(OPENGL_LINK) diff --git a/src/gtk1/app.cpp b/src/gtk1/app.cpp index 8081fc3c04..ee5c02afca 100644 --- a/src/gtk1/app.cpp +++ b/src/gtk1/app.cpp @@ -61,9 +61,13 @@ bool wxYield(void) IMPLEMENT_DYNAMIC_CLASS(wxApp,wxEvtHandler) +BEGIN_EVENT_TABLE(wxApp, wxEvtHandler) + EVT_IDLE(wxApp::OnIdle) +END_EVENT_TABLE() + gint wxapp_idle_callback( gpointer WXUNUSED(data) ) { - if (wxTheApp) wxTheApp->OnIdle(); + if (wxTheApp) while (wxTheApp->ProcessIdle()) {}; usleep( 10000 ); return TRUE; }; @@ -96,10 +100,78 @@ int wxApp::OnRun(void) return MainLoop(); }; -bool wxApp::OnIdle(void) +bool wxApp::ProcessIdle(void) +{ + wxIdleEvent event; + event.SetEventObject( this ); + ProcessEvent( event ); + + return event.MoreRequested(); +}; + +void wxApp::OnIdle( wxIdleEvent &event ) { + static bool inOnIdle = FALSE; + + // Avoid recursion (via ProcessEvent default case) + if (inOnIdle) + return; + + inOnIdle = TRUE; + + // 'Garbage' collection of windows deleted with Close(). DeletePendingObjects(); - return FALSE; + + // flush the logged messages if any + wxLog *pLog = wxLog::GetActiveTarget(); + if ( pLog != NULL && pLog->HasPendingMessages() ) + pLog->Flush(); + + // Send OnIdle events to all windows + bool needMore = SendIdleEvents(); + + if (needMore) + event.RequestMore(TRUE); + + inOnIdle = FALSE; +}; + +bool wxApp::SendIdleEvents(void) +{ + bool needMore = FALSE; + wxNode* node = wxTopLevelWindows.First(); + while (node) + { + wxWindow* win = (wxWindow*) node->Data(); + if (SendIdleEvents(win)) + needMore = TRUE; + + node = node->Next(); + } + return needMore; +}; + +bool wxApp::SendIdleEvents( wxWindow* win ) +{ + bool needMore = FALSE; + + wxIdleEvent event; + event.SetEventObject(win); + win->ProcessEvent(event); + + if (event.MoreRequested()) + needMore = TRUE; + + wxNode* node = win->GetChildren()->First(); + while (node) + { + wxWindow* win = (wxWindow*) node->Data(); + if (SendIdleEvents(win)) + needMore = TRUE; + + node = node->Next(); + } + return needMore ; }; int wxApp::OnExit(void) diff --git a/src/gtk1/combobox.cpp b/src/gtk1/combobox.cpp new file mode 100644 index 0000000000..b3630535a5 --- /dev/null +++ b/src/gtk1/combobox.cpp @@ -0,0 +1,282 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: combobox.cpp +// Purpose: +// Author: Robert Roebling +// Created: 01/02/97 +// Id: +// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma implementation "combobox.h" +#endif + +#include "wx/combobox.h" + +//----------------------------------------------------------------------------- +// wxComboBox +//----------------------------------------------------------------------------- + +void gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo ) +{ + wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, combo->GetId()); + event.SetInt( combo->GetSelection() ); + wxString tmp( combo->GetStringSelection() ); + event.SetString( WXSTRINGCAST(tmp) ); + event.SetEventObject(combo); + combo->ProcessEvent(event); +}; + +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxComboBox,wxControl) + +bool wxComboBox::Create(wxWindow *parent, const wxWindowID id, const wxString& value, + const wxPoint& pos, const wxSize& size, + const int n, const wxString choices[], + const long style, const wxString& name ) +{ + m_needParent = TRUE; + + PreCreation( parent, id, pos, size, style, name ); + + m_widget = gtk_combo_new(); + + wxSize newSize = size; + if (newSize.x == -1) newSize.x = 100; + if (newSize.y == -1) newSize.y = 26; + SetSize( newSize.x, newSize.y ); + + GtkWidget *list = GTK_COMBO(m_widget)->list; + + for (int i = 0; i < n; i++) + { + GtkWidget *list_item; + list_item = gtk_list_item_new_with_label( choices[i] ); + + gtk_signal_connect( GTK_OBJECT(list_item), "select", + GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); + + gtk_container_add( GTK_CONTAINER(list), list_item ); + + gtk_widget_show( list_item ); + }; + + PostCreation(); + + if (!value.IsNull()) SetValue( value ); + + Show( TRUE ); + + return TRUE; +}; + +void wxComboBox::Clear(void) +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + gtk_list_clear_items( GTK_LIST(list), 0, Number() ); +}; + +void wxComboBox::Append( const wxString &item ) +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GtkWidget *list_item; + list_item = gtk_list_item_new_with_label( item ); + + gtk_signal_connect( GTK_OBJECT(list_item), "select", + GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this ); + + gtk_container_add( GTK_CONTAINER(list), list_item ); + + gtk_widget_show( list_item ); +}; + +void wxComboBox::Append( const wxString &WXUNUSED(item), char* WXUNUSED(clientData) ) +{ +}; + +void wxComboBox::Delete( const int n ) +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + gtk_list_clear_items( GTK_LIST(list), n, n ); +}; + +int wxComboBox::FindString( const wxString &item ) +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GList *child = GTK_LIST(list)->children; + int count = 0; + while (child) + { + GtkBin *bin = GTK_BIN( child->data ); + GtkLabel *label = GTK_LABEL( bin->child ); + if (item == label->label) return count; + count++; + child = child->next; + }; + return -1; +}; + +char* wxComboBox::GetClientData( const int n ) +{ + wxNode *node = m_clientData.Nth( n ); + if (node) return (char*)node->Data(); + return NULL; +}; + +void wxComboBox::SetClientData( const int n, char * clientData ) +{ + wxNode *node = m_clientData.Nth( n ); + if (node) node->SetData( (wxObject*) clientData ); +}; + +int wxComboBox::GetSelection(void) const +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GList *selection = GTK_LIST(list)->selection; + if (selection) + { + GList *child = GTK_LIST(list)->children; + int count = 0; + while (child) + { + if (child->data == selection->data) return count; + count++; + child = child->next; + }; + }; + return -1; +}; + +wxString wxComboBox::GetString( const int n ) const +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GList *child = g_list_nth( GTK_LIST(list)->children, n ); + if (child) + { + GtkBin *bin = GTK_BIN( child->data ); + GtkLabel *label = GTK_LABEL( bin->child ); + return label->label; + }; + return ""; +}; + +wxString wxComboBox::GetStringSelection(void) const +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GList *selection = GTK_LIST(list)->selection; + if (selection) + { + GtkBin *bin = GTK_BIN( selection->data ); + wxString tmp = GTK_LABEL( bin->child )->label; + return tmp; + }; + return ""; +}; + +int wxComboBox::Number(void) const +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + + GList *child = GTK_LIST(list)->children; + int count = 0; + while (child) { count++; child = child->next; }; + return count; +}; + +void wxComboBox::SetSelection( const int n ) +{ + GtkWidget *list = GTK_COMBO(m_widget)->list; + gtk_list_select_item( GTK_LIST(list), n ); +}; + +wxString wxComboBox::GetValue(void) const +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + wxString tmp = gtk_entry_get_text( GTK_ENTRY(entry) ); + return tmp; +}; + +void wxComboBox::SetValue( const wxString& value ) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + wxString tmp = ""; + if (!value.IsNull()) tmp = value; + gtk_entry_set_text( GTK_ENTRY(entry), tmp ); +}; + +void wxComboBox::Copy(void) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + gtk_editable_copy_clipboard( GTK_EDITABLE(entry), 0 ); +}; + +void wxComboBox::Cut(void) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + gtk_editable_cut_clipboard( GTK_EDITABLE(entry), 0 ); +}; + +void wxComboBox::Paste(void) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + gtk_editable_paste_clipboard( GTK_EDITABLE(entry), 0 ); +}; + +void wxComboBox::SetInsertionPoint( const long pos ) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + int tmp = (int) pos; + gtk_entry_set_position( GTK_ENTRY(entry), tmp ); +}; + +void wxComboBox::SetInsertionPointEnd(void) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + int pos = GTK_ENTRY(entry)->text_length; + SetInsertionPoint( pos-1 ); +}; + +long wxComboBox::GetInsertionPoint(void) const +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + return (long) GTK_EDITABLE(entry)->current_pos; +}; + +long wxComboBox::GetLastPosition(void) const +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + int pos = GTK_ENTRY(entry)->text_length; + return (long) pos-1; +}; + +void wxComboBox::Replace( const long from, const long to, const wxString& value ) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to ); + if (value.IsNull()) return; + gint pos = (gint)to; + gtk_editable_insert_text( GTK_EDITABLE(entry), value, value.Length(), &pos ); +}; + +void wxComboBox::Remove(const long from, const long to) +{ + GtkWidget *entry = GTK_COMBO(m_widget)->entry; + gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to ); +}; + +void wxComboBox::SetSelection( const long WXUNUSED(from), const long WXUNUSED(to) ) +{ +}; + +void wxComboBox::SetEditable( const bool WXUNUSED(editable) ) +{ +}; + + diff --git a/src/gtk1/notebook.cpp b/src/gtk1/notebook.cpp index 7ec169b526..c58f048ccb 100644 --- a/src/gtk1/notebook.cpp +++ b/src/gtk1/notebook.cpp @@ -314,10 +314,13 @@ bool wxNotebook::DeletePage( const int page ) page_num++; child = child->next; }; - - if (!child) wxFatalError( "Notebook delete error" );; + + wxASSERT( child ); + + delete nb_page->m_clientPanel; - gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page_num ); +// Amazingly, this is not necessary +// gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page_num ); m_pages.DeleteObject( nb_page ); @@ -341,7 +344,9 @@ wxPanel *wxNotebook::CreatePage( const int item, const wxString &text, const int m_frame = NULL; - page->m_page = GTK_NOTEBOOK(m_widget)->cur_page; + page->m_page = (GtkNotebookPage*)( g_list_last( GTK_NOTEBOOK(m_widget)->children )->data ); + + if (!page->m_page) wxFatalError( "Notebook page creation error" ); m_pages.Append( page ); diff --git a/src/gtk1/setup/maketmpl.in b/src/gtk1/setup/maketmpl.in index 961c31d281..7c299ea814 100644 --- a/src/gtk1/setup/maketmpl.in +++ b/src/gtk1/setup/maketmpl.in @@ -95,13 +95,14 @@ $(TOOLKIT_DEF) \ -I. \ -I.. \ -I$(WXBASEDIR)/include \ --I$(WXBASEDIR)/src/png \ --I$(WXBASEDIR)/src/zlib \ --I$(WXBASEDIR)/src/gdk_imlib \ $(GUI_TK_INCLUDE) \ $(OPENGL_INCLUDE) \ $(X_CFLAGS) +# -I$(WXBASEDIR)/src/png \ +# -I$(WXBASEDIR)/src/zlib \ +# -I$(WXBASEDIR)/src/gdk_imlib \ + WX_LIBS = -L$(GLOBAL_LIB_DIR) -lwx_gtk OPENGL_LIBS = $(OPENGL_LIBRARY) $(OPENGL_LINK) diff --git a/user/wxFile/filectrl.cpp b/user/wxFile/filectrl.cpp index 6320a655e1..79630252e1 100644 --- a/user/wxFile/filectrl.cpp +++ b/user/wxFile/filectrl.cpp @@ -321,7 +321,6 @@ void wxFileCtrl::Update( void ) f = wxFindNextFile(); }; SortItems( ListCompare, 0 ); - RealizeChanges(); }; -- 2.45.2