]> git.saurik.com Git - wxWidgets.git/commitdiff
GTK
authorRobert Roebling <robert@roebling.de>
Wed, 3 Jun 1998 19:06:13 +0000 (19:06 +0000)
committerRobert Roebling <robert@roebling.de>
Wed, 3 Jun 1998 19:06:13 +0000 (19:06 +0000)
    combobox
    idle handling
    makefile fixes

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

17 files changed:
include/wx/generic/listctrl.h
include/wx/gtk/app.h
include/wx/gtk/combobox.h
include/wx/gtk1/app.h
include/wx/gtk1/combobox.h
samples/controls/minimal.cpp
src/Makefile.in
src/generic/listctrl.cpp
src/gtk/app.cpp
src/gtk/combobox.cpp [new file with mode: 0644]
src/gtk/notebook.cpp
src/gtk/setup/maketmpl.in
src/gtk1/app.cpp
src/gtk1/combobox.cpp [new file with mode: 0644]
src/gtk1/notebook.cpp
src/gtk1/setup/maketmpl.in
user/wxFile/filectrl.cpp

index 45dcc2bdb50ebb9f8079cd0f2bf008425b030bdd..93106ffa1dbf7041caddfdf71ee53d62e4f34152 100644 (file)
@@ -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:
   
index 6e79190ab468c2b0fbc22c8e19fd3b8210166cff..0e90356615c7095bd3af9aae9523778e1601b81b 100644 (file)
@@ -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__
index d63ebd233ec13cafd7e07c5cdc078f9633b60f43..cd4d25d3a49d674a4fe959712fa878370ef258f2 100644 (file)
@@ -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 ;
index 6e79190ab468c2b0fbc22c8e19fd3b8210166cff..0e90356615c7095bd3af9aae9523778e1601b81b 100644 (file)
@@ -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__
index d63ebd233ec13cafd7e07c5cdc078f9633b60f43..cd4d25d3a49d674a4fe959712fa878370ef258f2 100644 (file)
@@ -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 ;
index 2fc4ff9ee5dee902518b16edf8621fab360ba8fd..1ad0899e58b9166d3e57aac18d35dc1d80ce34f0 100644 (file)
@@ -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 );
 }
 
 //----------------------------------------------------------------------
index 97690c5f9b4e331bee0f6bf1b577bb7daffbe27c..d76b0cb635950520ab7cefc7a5ff67b565aedd65 100644 (file)
@@ -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
index a1090aff836697415ab060756d1019647bde61a1..383f729e333ad4f6257c81a520e2655e9faaa638 100644 (file)
@@ -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();
+};
+
 
index 8081fc3c04a7c53f2ea087095985355e01105fa0..ee5c02afca1e76c04e5a3fba0bcc22991ae57388 100644 (file)
@@ -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 (file)
index 0000000..b363053
--- /dev/null
@@ -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) )
+{
+};
+
+      
index 7ec169b52664a25fbbe67ad5f1fd1ed4cb2696a9..c58f048ccbcd289b80350014379264a6f77c5c7f 100644 (file)
@@ -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 );
 
index 961c31d281571d389aa8fdd56dbac9c1401b3769..7c299ea814fde20437152fbbdffd46027bb85c8c 100644 (file)
@@ -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)
index 8081fc3c04a7c53f2ea087095985355e01105fa0..ee5c02afca1e76c04e5a3fba0bcc22991ae57388 100644 (file)
@@ -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 (file)
index 0000000..b363053
--- /dev/null
@@ -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) )
+{
+};
+
+      
index 7ec169b52664a25fbbe67ad5f1fd1ed4cb2696a9..c58f048ccbcd289b80350014379264a6f77c5c7f 100644 (file)
@@ -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 );
 
index 961c31d281571d389aa8fdd56dbac9c1401b3769..7c299ea814fde20437152fbbdffd46027bb85c8c 100644 (file)
@@ -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)
index 6320a655e13deee1edbe54de8663de15008d17f6..79630252e18ac2cc9e968c976f27db1857e2b0fa 100644 (file)
@@ -321,7 +321,6 @@ void wxFileCtrl::Update( void )
     f = wxFindNextFile();
   };
   SortItems( ListCompare, 0 );
-  RealizeChanges();
 };