]> git.saurik.com Git - wxWidgets.git/commitdiff
many fixes to wxTextCrtl, wxTreeCrtl, wxListBox,
authorRobert Roebling <robert@roebling.de>
Mon, 20 Jul 1998 18:05:48 +0000 (18:05 +0000)
committerRobert Roebling <robert@roebling.de>
Mon, 20 Jul 1998 18:05:48 +0000 (18:05 +0000)
wxDialog, wxFrame
two more samples work now, docview and treectrl

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

25 files changed:
include/wx/generic/imaglist.h
include/wx/generic/treectrl.h
include/wx/gtk/dialog.h
include/wx/gtk/frame.h
include/wx/gtk/listbox.h
include/wx/gtk/menu.h
include/wx/gtk1/dialog.h
include/wx/gtk1/frame.h
include/wx/gtk1/listbox.h
include/wx/gtk1/menu.h
samples/docview/docview.cpp
samples/treectrl/treetest.cpp
src/generic/treectrl.cpp
src/gtk/dialog.cpp
src/gtk/filedlg.cpp
src/gtk/frame.cpp
src/gtk/listbox.cpp
src/gtk/menu.cpp
src/gtk/textctrl.cpp
src/gtk1/dialog.cpp
src/gtk1/filedlg.cpp
src/gtk1/frame.cpp
src/gtk1/listbox.cpp
src/gtk1/menu.cpp
src/gtk1/textctrl.cpp

index 2a0893a3ac18b073195c18c390885d2b35167ad9..2d7248f203d22660c797ad435ccec06e7b9b2208 100644 (file)
 #define wxIMAGELIST_DRAW_SELECTED       0x0004
 #define wxIMAGELIST_DRAW_FOCUSED        0x0008
 
+// Flag values for Set/GetImageList
+enum {
+    wxIMAGE_LIST_NORMAL, // Normal icons
+    wxIMAGE_LIST_SMALL,  // Small icons
+    wxIMAGE_LIST_STATE   // State icons: unimplemented (see WIN32 documentation)
+};
+
 class wxImageList: public wxObject
 {
    DECLARE_DYNAMIC_CLASS(wxImageList)
index 03cee90cff159dd1bc10b5eceaf7aaf88997ae12..a26f8ffc80ec31c0c2b77b763d38a7344d969882 100644 (file)
@@ -276,6 +276,9 @@ public:
   void DeleteItem( long item );
   void DeleteChildren( long item );
   bool DeleteAllItems();
+  bool ExpandItem(long item)   { return ExpandItem(item, wxTREE_EXPAND_EXPAND);   }
+  bool CollapseItem(long item) { return ExpandItem(item, wxTREE_EXPAND_COLLAPSE); }
+  bool ToggleItem(long item)   { return ExpandItem(item, wxTREE_EXPAND_TOGGLE);   }
   bool ExpandItem( long item, int action );
   bool GetItem( wxTreeItem &info ) const;
   long GetItemData( long item ) const;
@@ -302,9 +305,9 @@ public:
   void OnChar( wxKeyEvent &event );
   void OnMouse( const wxMouseEvent &event );
 
-  void SetImageList(wxImageList *imageList) { m_imageList = imageList; }
-  wxImageList *GetImageList() const { return m_imageList; }
-
+  wxImageList *GetImageList(int which = wxIMAGE_LIST_NORMAL) const;
+  void SetImageList(wxImageList *imageList, int which = wxIMAGE_LIST_NORMAL);
+  
 private:
   wxGenericTreeItem   *m_anchor;
   wxGenericTreeItem   *m_current;
@@ -318,6 +321,7 @@ private:
   wxPaintDC           *m_dc;
   wxBrush             *m_hilightBrush;
   wxImageList         *m_imageList;
+  wxImageList         *m_smallImageList;
 
   void CalculateLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, int &y );
   void CalculatePositions();
index 44f11d3fdf59ea49a8f862e09676df84eecaf3c2..db28c7772b6b255fa3ac139d8406126091ce28fb 100644 (file)
@@ -65,6 +65,7 @@ class wxDialog: public wxWindow
     void OnCancel( wxCommandEvent &event );
     void OnOk( wxCommandEvent &event );
     void OnPaint(wxPaintEvent& event);
+    bool Destroy(void);
     void OnCloseWindow(wxCloseEvent& event);
 /*
     void OnCharHook(wxKeyEvent& event);
@@ -74,11 +75,6 @@ class wxDialog: public wxWindow
     virtual void EndModal(int retCode);
     virtual bool IsModal(void) const { return ((GetWindowStyleFlag() & wxDIALOG_MODAL) == wxDIALOG_MODAL); }
     virtual void InitDialog(void);
-/*
-    void OnOK(wxCommandEvent& event);
-    void OnApply(wxCommandEvent& event);
-    void OnCancel(wxCommandEvent& event);
-*/
     
   private:
   
index 517edc95069851ef95f9823f62831aff8975edec..9e909a9b5eacfe2f50470fc2b74dbdc1dcceda2e 100644 (file)
@@ -69,10 +69,13 @@ class wxFrame: public wxWindow
     void SetTitle( const wxString &title );
     wxString GetTitle(void) const;
     void OnActivate( wxActivateEvent &WXUNUSED(event) ) {};
+    void OnIdle( wxIdleEvent &event );
     
   //private:    
     
     void GtkOnSize( int x, int y, int width, int height );
+    void DoMenuUpdates(void);
+    void DoMenuUpdates(wxMenu* menu);
     
   private:
   
index 55ba995672fe74967761274651049463b481536a..ee3332ba2ef47833cd7edb0d0e121eba791f9260 100644 (file)
@@ -76,6 +76,7 @@ class wxListBox: public wxControl
   private:
   
     GtkList   *m_list;
+    wxList     m_clientData;
     
   public:
   
index 83376e780b0be44b4a3dbf5881c4207ab747db0b..d4c48d4cd44e3a6853e877223986a3d3e41b495e 100644 (file)
@@ -29,6 +29,12 @@ class wxMenuBar;
 class wxMenuItem;
 class wxMenu;
 
+//-----------------------------------------------------------------------------
+// const
+//-----------------------------------------------------------------------------
+
+#define   ID_SEPARATOR    (-1)
+
 //-----------------------------------------------------------------------------
 // wxMenuBar
 //-----------------------------------------------------------------------------
@@ -69,6 +75,14 @@ class wxMenuItem: public wxObject
     wxString      m_helpStr;
     
     GtkWidget    *m_menuItem;  // GtkMenuItem
+    
+  bool              IsSeparator() const { return m_id == ID_SEPARATOR;  }
+  bool              IsEnabled()   const { return m_isEnabled;  }
+  bool              IsChecked()   const { return m_checked;  }
+
+  int               GetId()       const { return m_id;    }
+  const wxString&   GetHelp()     const { return m_helpStr;   }
+  wxMenu           *GetSubMenu()  const { return m_subMenu;  }
   
 };
 
@@ -86,6 +100,7 @@ class wxMenu: public wxEvtHandler
       wxMenu *subMenu, const wxString &helpStr = "" );
     int FindItem( const wxString itemString ) const;
     void Break(void) {};
+    void Check(int id, bool Flag);
     void Enable( int id, bool enable );
     bool Enabled( int id ) const;
     void SetLabel( int id, const wxString &label );
index 44f11d3fdf59ea49a8f862e09676df84eecaf3c2..db28c7772b6b255fa3ac139d8406126091ce28fb 100644 (file)
@@ -65,6 +65,7 @@ class wxDialog: public wxWindow
     void OnCancel( wxCommandEvent &event );
     void OnOk( wxCommandEvent &event );
     void OnPaint(wxPaintEvent& event);
+    bool Destroy(void);
     void OnCloseWindow(wxCloseEvent& event);
 /*
     void OnCharHook(wxKeyEvent& event);
@@ -74,11 +75,6 @@ class wxDialog: public wxWindow
     virtual void EndModal(int retCode);
     virtual bool IsModal(void) const { return ((GetWindowStyleFlag() & wxDIALOG_MODAL) == wxDIALOG_MODAL); }
     virtual void InitDialog(void);
-/*
-    void OnOK(wxCommandEvent& event);
-    void OnApply(wxCommandEvent& event);
-    void OnCancel(wxCommandEvent& event);
-*/
     
   private:
   
index 517edc95069851ef95f9823f62831aff8975edec..9e909a9b5eacfe2f50470fc2b74dbdc1dcceda2e 100644 (file)
@@ -69,10 +69,13 @@ class wxFrame: public wxWindow
     void SetTitle( const wxString &title );
     wxString GetTitle(void) const;
     void OnActivate( wxActivateEvent &WXUNUSED(event) ) {};
+    void OnIdle( wxIdleEvent &event );
     
   //private:    
     
     void GtkOnSize( int x, int y, int width, int height );
+    void DoMenuUpdates(void);
+    void DoMenuUpdates(wxMenu* menu);
     
   private:
   
index 55ba995672fe74967761274651049463b481536a..ee3332ba2ef47833cd7edb0d0e121eba791f9260 100644 (file)
@@ -76,6 +76,7 @@ class wxListBox: public wxControl
   private:
   
     GtkList   *m_list;
+    wxList     m_clientData;
     
   public:
   
index 83376e780b0be44b4a3dbf5881c4207ab747db0b..d4c48d4cd44e3a6853e877223986a3d3e41b495e 100644 (file)
@@ -29,6 +29,12 @@ class wxMenuBar;
 class wxMenuItem;
 class wxMenu;
 
+//-----------------------------------------------------------------------------
+// const
+//-----------------------------------------------------------------------------
+
+#define   ID_SEPARATOR    (-1)
+
 //-----------------------------------------------------------------------------
 // wxMenuBar
 //-----------------------------------------------------------------------------
@@ -69,6 +75,14 @@ class wxMenuItem: public wxObject
     wxString      m_helpStr;
     
     GtkWidget    *m_menuItem;  // GtkMenuItem
+    
+  bool              IsSeparator() const { return m_id == ID_SEPARATOR;  }
+  bool              IsEnabled()   const { return m_isEnabled;  }
+  bool              IsChecked()   const { return m_checked;  }
+
+  int               GetId()       const { return m_id;    }
+  const wxString&   GetHelp()     const { return m_helpStr;   }
+  wxMenu           *GetSubMenu()  const { return m_subMenu;  }
   
 };
 
@@ -86,6 +100,7 @@ class wxMenu: public wxEvtHandler
       wxMenu *subMenu, const wxString &helpStr = "" );
     int FindItem( const wxString itemString ) const;
     void Break(void) {};
+    void Check(int id, bool Flag);
     void Enable( int id, bool enable );
     bool Enabled( int id ) const;
     void SetLabel( int id, const wxString &label );
index 075238f442a4e1c0710f96a7b69e0cc25dac63d0..8943fb94c6cf9445d62c2ed4020fbeb7cbd1ebd2 100644 (file)
@@ -126,7 +126,7 @@ bool MyApp::OnInit(void)
   
   file_menu->AppendSeparator();
   file_menu->Append(wxID_EXIT, "E&xit");
-
+  
   // A nice touch: a history of files visited. Use this menu.
   m_docManager->FileHistoryUseMenu(file_menu);
 
index f162be97aeb0176aade5e624aba75c9fd3bcb477..48759220c0e83178c4ce68adba1271d2ea705ee9 100644 (file)
@@ -73,10 +73,13 @@ bool MyApp::OnInit(void)
   // Make an image list containing small icons
   m_imageListNormal = new wxImageList(16, 16, TRUE);
 
+#ifdef __WXMSW__
   wxIcon icon1("icon1", wxBITMAP_TYPE_ICO_RESOURCE);
   m_imageListNormal->Add(icon1);
   wxIcon icon2("icon2", wxBITMAP_TYPE_ICO_RESOURCE);
   m_imageListNormal->Add(icon2);
+#else
+#endif
 
   // Make a menubar
   wxMenu *file_menu = new wxMenu;
index 91f7733f4fbca5e78fd7a7aec3a3c3d8e94cf646..a24f76cde200a971b1802d352dfd6e5be3076367 100644 (file)
@@ -236,13 +236,16 @@ long wxGenericTreeItem::HitTest( const wxPoint& point, int &flags )
   }
   else
   {
-    wxNode *node = m_children.First();
-    while (node)
+    if (!m_isCollapsed)
     {
-      wxGenericTreeItem *child = (wxGenericTreeItem*)node->Data();
-      long res = child->HitTest( point, flags );
-      if (res != -1) return res;
-      node = node->Next();
+      wxNode *node = m_children.First();
+      while (node)
+      {
+        wxGenericTreeItem *child = (wxGenericTreeItem*)node->Data();
+        long res = child->HitTest( point, flags );
+        if (res != -1) return res;
+        node = node->Next();
+      };
     };
   };
   return -1;
@@ -352,6 +355,8 @@ wxTreeCtrl::wxTreeCtrl()
   m_isCreated = FALSE;
   m_dc = NULL;
   m_hilightBrush = new wxBrush( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT), wxSOLID );
+  m_imageList = NULL;
+  m_smallImageList = NULL;
 };
 
 wxTreeCtrl::wxTreeCtrl(wxWindow *parent, wxWindowID id,
@@ -369,6 +374,8 @@ wxTreeCtrl::wxTreeCtrl(wxWindow *parent, wxWindowID id,
   m_isCreated = FALSE;
   m_dc = NULL;
   m_hilightBrush = new wxBrush( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT), wxSOLID );
+  m_imageList = NULL;
+  m_smallImageList = NULL;
   Create( parent, id, pos, size, style, name );
 };
 
@@ -437,6 +444,8 @@ long wxTreeCtrl::InsertItem( long parent, const wxString& label, int image,
   {
     CalculatePositions();
 
+    if (!p->HasChildren()) p->m_hasChildren = TRUE;
+    
     int ch = 0;
     GetClientSize( NULL, &ch );
 
@@ -515,6 +524,8 @@ long wxTreeCtrl::InsertItem( long parent, wxTreeItem &info, long WXUNUSED(insert
   if (p)
   {
     CalculatePositions();
+    
+    if (!p->HasChildren()) p->m_hasChildren = TRUE;
 
     int ch = 0;
     GetClientSize( NULL, &ch );
@@ -581,6 +592,8 @@ bool wxTreeCtrl::ExpandItem( long item, int action )
         node = node->Next();
       };
 
+      CalculatePositions();
+      
       i->SendCollapse( this );
       break;
     }
@@ -757,6 +770,26 @@ long wxTreeCtrl::HitTest( const wxPoint& point, int &flags )
   return m_anchor->HitTest( point, flags );
 };
 
+wxImageList *wxTreeCtrl::GetImageList( int which ) const
+{
+  if (which == wxIMAGE_LIST_NORMAL) return m_imageList;
+  return m_smallImageList;
+};
+
+void wxTreeCtrl::SetImageList( wxImageList *imageList, int which )
+{
+  if (which == wxIMAGE_LIST_NORMAL)
+  {
+    if (m_imageList) delete m_imageList;
+    m_imageList = imageList;
+  }
+  else
+  {
+    if (m_smallImageList) delete m_smallImageList;
+    m_smallImageList = imageList;
+  };
+};
+
 void wxTreeCtrl::AdjustMyScrollbars()
 {
   if (m_anchor)
@@ -810,13 +843,18 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level,
       {
         dc.SetTextForeground( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_HIGHLIGHTTEXT ) );
         dc.SetBrush( *m_hilightBrush );
-        if (m_hasFocus)
-          dc.SetPen( *wxBLACK_PEN );
-        else
-          dc.SetPen( *wxWHITE_PEN );
         long tw, th;
         dc.GetTextExtent( item->m_text, &tw, &th );
-        dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 );
+        if (m_hasFocus)
+       {
+          dc.SetPen( *wxBLACK_PEN );
+          dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 );
+       }
+       else
+       {
+         dc.SetPen( *wxTRANSPARENT_PEN );
+          dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 );
+       }
         dc.DrawText( item->m_text, item->m_x, item->m_y );
 
         dc.SetPen( *wxBLACK_PEN );
@@ -825,7 +863,7 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level,
       }
       else
       {
-        dc.SetPen( *wxWHITE_PEN );
+       dc.SetPen( *wxTRANSPARENT_PEN );
         long tw, th;
         dc.GetTextExtent( item->m_text, &tw, &th );
         dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 );
@@ -835,19 +873,23 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level,
   };
 
   if (item->NumberOfVisibleChildren() == 0) return;
-    
+
+  int semiOldY = y;    
+  
   wxNode *node = item->m_children.First();
   while (node)
   {
     wxGenericTreeItem *child = (wxGenericTreeItem *)node->Data();
 
     y += m_lineHeight;
+    semiOldY = y;
+    
     PaintLevel( child, dc, level+1, y );
       
     node = node->Next();
   };
 
-  dc.DrawLine( horizX+15, oldY+5, horizX+15, y );
+  dc.DrawLine( horizX+15, oldY+5, horizX+15, semiOldY );
 }
 
 void wxTreeCtrl::OnPaint( const wxPaintEvent &WXUNUSED(event) )
index b38fedf80673729986e7e92dbe170ecb9232433f..f472f31e6c3e6a66976492b7f2d8f6c451263a8f 100644 (file)
 #include "wx/app.h"
 #include "wx/gtk/win_gtk.h"
 
+//-----------------------------------------------------------------------------
+
+extern wxList wxPendingDelete;
+
 //-----------------------------------------------------------------------------
 // delete
 
@@ -167,6 +171,14 @@ bool wxDialog::OnClose(void)
   return FALSE;
 }
 
+bool wxDialog::Destroy(void)
+{
+  if (!wxPendingDelete.Member(this))
+    wxPendingDelete.Append(this);
+
+  return TRUE;
+}
+
 void wxDialog::OnCloseWindow(wxCloseEvent& event)
 {
   if (GetEventHandler()->OnClose() || event.GetForce())
@@ -204,8 +216,8 @@ int wxDialog::ShowModal(void)
 
 void wxDialog::EndModal( int retCode )
 {
-  gtk_main_quit();
   SetReturnCode( retCode );
+  gtk_main_quit();
 };
 
 void wxDialog::InitDialog(void)
index 8f7b97ed89c261ffdf99c9f0e5c0efe394a091c3..aa05bdac13fbc3c21e216fcd3b80b66706397c35 100644 (file)
@@ -51,7 +51,7 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
 {
   m_needParent = FALSE;
   
-  PreCreation( parent, -1, pos, wxDefaultSize, style, "filedialog" );
+  PreCreation( parent, -1, pos, wxDefaultSize, style | wxDIALOG_MODAL, "filedialog" );
   m_message = message;
   m_path = "";
   m_fileName = defaultFileName;
index c0631c4fce53f4bf2130cd3979edf2bbb3984570..aecc4ffd00dc942c8d8e66c2d05e906f207dc133 100644 (file)
@@ -67,6 +67,7 @@ bool gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(
 BEGIN_EVENT_TABLE(wxFrame, wxWindow)
   EVT_CLOSE(wxFrame::OnCloseWindow)
   EVT_SIZE(wxFrame::OnSize)
+  EVT_IDLE(wxFrame::OnIdle)
 END_EVENT_TABLE()
 
 IMPLEMENT_DYNAMIC_CLASS(wxFrame,wxWindow)
@@ -360,3 +361,54 @@ wxString wxFrame::GetTitle(void) const
   return (wxString&)m_title;
 };
 
+void wxFrame::OnIdle(wxIdleEvent& WXUNUSED(event))
+{
+  DoMenuUpdates();
+}
+
+// Query app for menu item updates (called from OnIdle)
+void wxFrame::DoMenuUpdates(void)
+{
+  wxMenuBar* bar = GetMenuBar();
+  if (!bar) return;
+
+  wxNode *node = bar->m_menus.First();
+  while (node)
+  {
+    wxMenu* menu = (wxMenu*)node->Data();
+    DoMenuUpdates(menu);
+    
+    node = node->Next();
+  };
+}
+
+void wxFrame::DoMenuUpdates(wxMenu* menu)
+{
+  wxNode* node = menu->m_items.First();
+  while (node)
+  {
+    wxMenuItem* item = (wxMenuItem*) node->Data();
+    if ( !item->IsSeparator() )
+    {
+        wxWindowID id = item->GetId();
+      wxUpdateUIEvent event(id);
+      event.SetEventObject( this );
+
+      if (GetEventHandler()->ProcessEvent(event))
+      {
+        if (event.GetSetText())
+          menu->SetLabel(id, event.GetText());
+        if (event.GetSetChecked())
+          menu->Check(id, event.GetChecked());
+        if (event.GetSetEnabled())
+          menu->Enable(id, event.GetEnabled());
+      }
+
+      if (item->GetSubMenu())
+        DoMenuUpdates(item->GetSubMenu());
+    }
+    node = node->Next();
+  }
+}
+
+
index 58842aa9c50b6d3f5e6cacc58ab5b0b7ab6e4c68..aca47629374b5b40c848b2f507099c2ea8f273d7 100644 (file)
@@ -92,6 +92,8 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
   
     gtk_container_add( GTK_CONTAINER(m_list), list_item );
     
+    m_clientData.Append( (wxObject*)NULL );
+    
     gtk_widget_show( list_item );
   };
  
@@ -112,22 +114,44 @@ void wxListBox::Append( const wxString &item )
   
   gtk_container_add( GTK_CONTAINER(m_list), list_item );
     
+  m_clientData.Append( (wxObject*)NULL );
+  
   gtk_widget_show( list_item );
 };
 
-void wxListBox::Append( const wxString &WXUNUSED(item), char *WXUNUSED(clientData) )
+void wxListBox::Append( const wxString &item, char *clientData )
 {
-  wxFAIL_MSG("wxListBox::Append(clientdata) not implemented");
+  GtkWidget *list_item;
+  list_item = gtk_list_item_new_with_label( item ); 
+  
+ gtk_signal_connect( GTK_OBJECT(list_item), "select", 
+    GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this );
+  
+  gtk_container_add( GTK_CONTAINER(m_list), list_item );
+  
+  m_clientData.Append( (wxObject*)clientData );
+  
+  gtk_widget_show( list_item );
 };
 
 void wxListBox::Clear(void)
 {
   gtk_list_clear_items( m_list, 0, Number() );
+  
+  m_clientData.Clear();
 };
 
 void wxListBox::Delete( int n )
 {
   gtk_list_clear_items( m_list, n, n );
+  
+  wxNode *node = m_clientData.Nth( n );
+  if (!node)
+  {
+    wxFAIL_MSG("wxListBox::Delete wrong index");
+  }
+  else
+    m_clientData.DeleteNode( node );
 };
 
 void wxListBox::Deselect( int n )
@@ -150,10 +174,10 @@ int wxListBox::FindString( const wxString &item ) const
   return -1;
 };
 
-char *wxListBox::GetClientData( int WXUNUSED(n) ) const
+char *wxListBox::GetClientData( int n ) const
 {
-  wxFAIL_MSG("wxListBox::GetClientData not implemented");
-
+  wxNode *node = m_clientData.Nth( n );
+  if (node) return ((char*)node->Data());
   return NULL;
 };
 
@@ -250,8 +274,10 @@ void wxListBox::Set( int WXUNUSED(n), const wxString *WXUNUSED(choices) )
 {
 };
 
-void wxListBox::SetClientData( int WXUNUSED(n), char *WXUNUSED(clientData) )
+void wxListBox::SetClientData( int n, char *clientData )
 {
+  wxNode *node = m_clientData.Nth( n );
+  if (node) node->SetData( (wxObject*)clientData );
 };
 
 void wxListBox::SetFirstItem( int WXUNUSED(n) )
index 6df21c5987d8db737ad35ce988553a2baa8d17ec..3e3377f106bef386d70792fcf56069ff8890e75e 100644 (file)
@@ -137,7 +137,7 @@ wxMenu::wxMenu( const wxString &title )
 void wxMenu::AppendSeparator(void)
 {
   wxMenuItem *mitem = new wxMenuItem();
-  mitem->m_id = -1;
+  mitem->m_id = ID_SEPARATOR;
   mitem->m_text = "";
   mitem->m_helpStr = "";
   mitem->m_isCheckMenu = FALSE;
@@ -219,6 +219,11 @@ int wxMenu::FindItem( const wxString itemString ) const
   return -1;
 };
 
+void wxMenu::Check( int WXUNUSED(id), bool WXUNUSED(Flag) )
+{
+  // I'm just too lazy
+};
+
 void wxMenu::Enable( int id, bool enable )
 {
   wxNode *node = m_items.First();
index 86eef711a7916225235bfba8b19c6bdd8b4a207a..568d0babb5004b4e7520835f59cc6a6ec1b31d1f 100644 (file)
@@ -33,6 +33,9 @@ END_EVENT_TABLE()
 
 wxTextCtrl::wxTextCtrl(void) : streambuf()
 {
+    if( allocate() )
+       setp(base(),ebuf());
   m_modified = FALSE;
 };
 
@@ -40,6 +43,9 @@ wxTextCtrl::wxTextCtrl( wxWindow *parent, wxWindowID id, const wxString &value,
       const wxPoint &pos, const wxSize &size,
       int style, const wxString &name ) : streambuf()
 {
+    if( allocate() )
+       setp(base(),ebuf());
   m_modified = FALSE;
   Create( parent, id, value, pos, size, style, name );
 };
@@ -273,65 +279,6 @@ void wxTextCtrl::OnChar( wxKeyEvent &WXUNUSED(event) )
 
 int wxTextCtrl::overflow(int c)
 {
-  // Make sure there is a holding area
-  if ( allocate()==EOF )
-  {
-    wxError("Streambuf allocation failed","Internal error");
-    return EOF;
-  }
-
-  // Verify that there are no characters in get area
-  if ( gptr() && gptr() < egptr() )
-  {
-     wxError("Who's trespassing my get area?","Internal error");
-     return EOF;
-  }
-
-  // Reset get area
-  setg(0,0,0);
-
-  // Make sure there is a put area
-  if ( ! pptr() )
-  {
-/* This doesn't seem to be fatal so comment out error message */
-//    wxError("Put area not opened","Internal error");
-    setp( base(), base() );
-  }
-
-  // Determine how many characters have been inserted but no consumed
-  int plen = pptr() - pbase();
-
-  // Now Jerry relies on the fact that the buffer is at least 2 chars
-  // long, but the holding area "may be as small as 1" ???
-  // And we need an additional \0, so let's keep this inefficient but
-  // safe copy.
-
-  // If c!=EOF, it is a character that must also be comsumed
-  int xtra = c==EOF? 0 : 1;
-
-  // Write temporary C-string to wxTextWindow
-  {
-  char *txt = new char[plen+xtra+1];
-  memcpy(txt, pbase(), plen);
-  txt[plen] = (char)c;     // append c
-  txt[plen+xtra] = '\0';   // append '\0' or overwrite c
-    // If the put area already contained \0, output will be truncated there
-  WriteText(txt);
-    delete[] txt;
-  }
-
-  // Reset put area
-  setp(pbase(), epptr());
-
-#if defined(__WATCOMC__)
-  return __NOT_EOF;
-#elif defined(zapeof)     // HP-UX (all cfront based?)
-  return zapeof(c);
-#else
-  return c!=EOF ? c : 0;  // this should make everybody happy
-#endif
-
-/* OLD CODE
   int len = pptr() - pbase();
   char *txt = new char[len+1];
   strncpy(txt, pbase(), len);
@@ -340,22 +287,10 @@ int wxTextCtrl::overflow(int c)
   setp(pbase(), epptr());
   delete[] txt;
   return EOF;
-*/
 };
 
 int wxTextCtrl::sync(void)
 {
-  // Verify that there are no characters in get area
-  if ( gptr() && gptr() < egptr() )
-  {
-     wxError("Who's trespassing my get area?","Internal error");
-     return EOF;
-  }
-
-  if ( pptr() && pptr() > pbase() ) return overflow(EOF);
-
-  return 0;
-/* OLD CODE
   int len = pptr() - pbase();
   char *txt = new char[len+1];
   strncpy(txt, pbase(), len);
@@ -364,7 +299,6 @@ int wxTextCtrl::sync(void)
   setp(pbase(), epptr());
   delete[] txt;
   return 0;
-*/
 };
 
 int wxTextCtrl::underflow(void)
index b38fedf80673729986e7e92dbe170ecb9232433f..f472f31e6c3e6a66976492b7f2d8f6c451263a8f 100644 (file)
 #include "wx/app.h"
 #include "wx/gtk/win_gtk.h"
 
+//-----------------------------------------------------------------------------
+
+extern wxList wxPendingDelete;
+
 //-----------------------------------------------------------------------------
 // delete
 
@@ -167,6 +171,14 @@ bool wxDialog::OnClose(void)
   return FALSE;
 }
 
+bool wxDialog::Destroy(void)
+{
+  if (!wxPendingDelete.Member(this))
+    wxPendingDelete.Append(this);
+
+  return TRUE;
+}
+
 void wxDialog::OnCloseWindow(wxCloseEvent& event)
 {
   if (GetEventHandler()->OnClose() || event.GetForce())
@@ -204,8 +216,8 @@ int wxDialog::ShowModal(void)
 
 void wxDialog::EndModal( int retCode )
 {
-  gtk_main_quit();
   SetReturnCode( retCode );
+  gtk_main_quit();
 };
 
 void wxDialog::InitDialog(void)
index 8f7b97ed89c261ffdf99c9f0e5c0efe394a091c3..aa05bdac13fbc3c21e216fcd3b80b66706397c35 100644 (file)
@@ -51,7 +51,7 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
 {
   m_needParent = FALSE;
   
-  PreCreation( parent, -1, pos, wxDefaultSize, style, "filedialog" );
+  PreCreation( parent, -1, pos, wxDefaultSize, style | wxDIALOG_MODAL, "filedialog" );
   m_message = message;
   m_path = "";
   m_fileName = defaultFileName;
index c0631c4fce53f4bf2130cd3979edf2bbb3984570..aecc4ffd00dc942c8d8e66c2d05e906f207dc133 100644 (file)
@@ -67,6 +67,7 @@ bool gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(
 BEGIN_EVENT_TABLE(wxFrame, wxWindow)
   EVT_CLOSE(wxFrame::OnCloseWindow)
   EVT_SIZE(wxFrame::OnSize)
+  EVT_IDLE(wxFrame::OnIdle)
 END_EVENT_TABLE()
 
 IMPLEMENT_DYNAMIC_CLASS(wxFrame,wxWindow)
@@ -360,3 +361,54 @@ wxString wxFrame::GetTitle(void) const
   return (wxString&)m_title;
 };
 
+void wxFrame::OnIdle(wxIdleEvent& WXUNUSED(event))
+{
+  DoMenuUpdates();
+}
+
+// Query app for menu item updates (called from OnIdle)
+void wxFrame::DoMenuUpdates(void)
+{
+  wxMenuBar* bar = GetMenuBar();
+  if (!bar) return;
+
+  wxNode *node = bar->m_menus.First();
+  while (node)
+  {
+    wxMenu* menu = (wxMenu*)node->Data();
+    DoMenuUpdates(menu);
+    
+    node = node->Next();
+  };
+}
+
+void wxFrame::DoMenuUpdates(wxMenu* menu)
+{
+  wxNode* node = menu->m_items.First();
+  while (node)
+  {
+    wxMenuItem* item = (wxMenuItem*) node->Data();
+    if ( !item->IsSeparator() )
+    {
+        wxWindowID id = item->GetId();
+      wxUpdateUIEvent event(id);
+      event.SetEventObject( this );
+
+      if (GetEventHandler()->ProcessEvent(event))
+      {
+        if (event.GetSetText())
+          menu->SetLabel(id, event.GetText());
+        if (event.GetSetChecked())
+          menu->Check(id, event.GetChecked());
+        if (event.GetSetEnabled())
+          menu->Enable(id, event.GetEnabled());
+      }
+
+      if (item->GetSubMenu())
+        DoMenuUpdates(item->GetSubMenu());
+    }
+    node = node->Next();
+  }
+}
+
+
index 58842aa9c50b6d3f5e6cacc58ab5b0b7ab6e4c68..aca47629374b5b40c848b2f507099c2ea8f273d7 100644 (file)
@@ -92,6 +92,8 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
   
     gtk_container_add( GTK_CONTAINER(m_list), list_item );
     
+    m_clientData.Append( (wxObject*)NULL );
+    
     gtk_widget_show( list_item );
   };
  
@@ -112,22 +114,44 @@ void wxListBox::Append( const wxString &item )
   
   gtk_container_add( GTK_CONTAINER(m_list), list_item );
     
+  m_clientData.Append( (wxObject*)NULL );
+  
   gtk_widget_show( list_item );
 };
 
-void wxListBox::Append( const wxString &WXUNUSED(item), char *WXUNUSED(clientData) )
+void wxListBox::Append( const wxString &item, char *clientData )
 {
-  wxFAIL_MSG("wxListBox::Append(clientdata) not implemented");
+  GtkWidget *list_item;
+  list_item = gtk_list_item_new_with_label( item ); 
+  
+ gtk_signal_connect( GTK_OBJECT(list_item), "select", 
+    GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this );
+  
+  gtk_container_add( GTK_CONTAINER(m_list), list_item );
+  
+  m_clientData.Append( (wxObject*)clientData );
+  
+  gtk_widget_show( list_item );
 };
 
 void wxListBox::Clear(void)
 {
   gtk_list_clear_items( m_list, 0, Number() );
+  
+  m_clientData.Clear();
 };
 
 void wxListBox::Delete( int n )
 {
   gtk_list_clear_items( m_list, n, n );
+  
+  wxNode *node = m_clientData.Nth( n );
+  if (!node)
+  {
+    wxFAIL_MSG("wxListBox::Delete wrong index");
+  }
+  else
+    m_clientData.DeleteNode( node );
 };
 
 void wxListBox::Deselect( int n )
@@ -150,10 +174,10 @@ int wxListBox::FindString( const wxString &item ) const
   return -1;
 };
 
-char *wxListBox::GetClientData( int WXUNUSED(n) ) const
+char *wxListBox::GetClientData( int n ) const
 {
-  wxFAIL_MSG("wxListBox::GetClientData not implemented");
-
+  wxNode *node = m_clientData.Nth( n );
+  if (node) return ((char*)node->Data());
   return NULL;
 };
 
@@ -250,8 +274,10 @@ void wxListBox::Set( int WXUNUSED(n), const wxString *WXUNUSED(choices) )
 {
 };
 
-void wxListBox::SetClientData( int WXUNUSED(n), char *WXUNUSED(clientData) )
+void wxListBox::SetClientData( int n, char *clientData )
 {
+  wxNode *node = m_clientData.Nth( n );
+  if (node) node->SetData( (wxObject*)clientData );
 };
 
 void wxListBox::SetFirstItem( int WXUNUSED(n) )
index 6df21c5987d8db737ad35ce988553a2baa8d17ec..3e3377f106bef386d70792fcf56069ff8890e75e 100644 (file)
@@ -137,7 +137,7 @@ wxMenu::wxMenu( const wxString &title )
 void wxMenu::AppendSeparator(void)
 {
   wxMenuItem *mitem = new wxMenuItem();
-  mitem->m_id = -1;
+  mitem->m_id = ID_SEPARATOR;
   mitem->m_text = "";
   mitem->m_helpStr = "";
   mitem->m_isCheckMenu = FALSE;
@@ -219,6 +219,11 @@ int wxMenu::FindItem( const wxString itemString ) const
   return -1;
 };
 
+void wxMenu::Check( int WXUNUSED(id), bool WXUNUSED(Flag) )
+{
+  // I'm just too lazy
+};
+
 void wxMenu::Enable( int id, bool enable )
 {
   wxNode *node = m_items.First();
index 86eef711a7916225235bfba8b19c6bdd8b4a207a..568d0babb5004b4e7520835f59cc6a6ec1b31d1f 100644 (file)
@@ -33,6 +33,9 @@ END_EVENT_TABLE()
 
 wxTextCtrl::wxTextCtrl(void) : streambuf()
 {
+    if( allocate() )
+       setp(base(),ebuf());
   m_modified = FALSE;
 };
 
@@ -40,6 +43,9 @@ wxTextCtrl::wxTextCtrl( wxWindow *parent, wxWindowID id, const wxString &value,
       const wxPoint &pos, const wxSize &size,
       int style, const wxString &name ) : streambuf()
 {
+    if( allocate() )
+       setp(base(),ebuf());
   m_modified = FALSE;
   Create( parent, id, value, pos, size, style, name );
 };
@@ -273,65 +279,6 @@ void wxTextCtrl::OnChar( wxKeyEvent &WXUNUSED(event) )
 
 int wxTextCtrl::overflow(int c)
 {
-  // Make sure there is a holding area
-  if ( allocate()==EOF )
-  {
-    wxError("Streambuf allocation failed","Internal error");
-    return EOF;
-  }
-
-  // Verify that there are no characters in get area
-  if ( gptr() && gptr() < egptr() )
-  {
-     wxError("Who's trespassing my get area?","Internal error");
-     return EOF;
-  }
-
-  // Reset get area
-  setg(0,0,0);
-
-  // Make sure there is a put area
-  if ( ! pptr() )
-  {
-/* This doesn't seem to be fatal so comment out error message */
-//    wxError("Put area not opened","Internal error");
-    setp( base(), base() );
-  }
-
-  // Determine how many characters have been inserted but no consumed
-  int plen = pptr() - pbase();
-
-  // Now Jerry relies on the fact that the buffer is at least 2 chars
-  // long, but the holding area "may be as small as 1" ???
-  // And we need an additional \0, so let's keep this inefficient but
-  // safe copy.
-
-  // If c!=EOF, it is a character that must also be comsumed
-  int xtra = c==EOF? 0 : 1;
-
-  // Write temporary C-string to wxTextWindow
-  {
-  char *txt = new char[plen+xtra+1];
-  memcpy(txt, pbase(), plen);
-  txt[plen] = (char)c;     // append c
-  txt[plen+xtra] = '\0';   // append '\0' or overwrite c
-    // If the put area already contained \0, output will be truncated there
-  WriteText(txt);
-    delete[] txt;
-  }
-
-  // Reset put area
-  setp(pbase(), epptr());
-
-#if defined(__WATCOMC__)
-  return __NOT_EOF;
-#elif defined(zapeof)     // HP-UX (all cfront based?)
-  return zapeof(c);
-#else
-  return c!=EOF ? c : 0;  // this should make everybody happy
-#endif
-
-/* OLD CODE
   int len = pptr() - pbase();
   char *txt = new char[len+1];
   strncpy(txt, pbase(), len);
@@ -340,22 +287,10 @@ int wxTextCtrl::overflow(int c)
   setp(pbase(), epptr());
   delete[] txt;
   return EOF;
-*/
 };
 
 int wxTextCtrl::sync(void)
 {
-  // Verify that there are no characters in get area
-  if ( gptr() && gptr() < egptr() )
-  {
-     wxError("Who's trespassing my get area?","Internal error");
-     return EOF;
-  }
-
-  if ( pptr() && pptr() > pbase() ) return overflow(EOF);
-
-  return 0;
-/* OLD CODE
   int len = pptr() - pbase();
   char *txt = new char[len+1];
   strncpy(txt, pbase(), len);
@@ -364,7 +299,6 @@ int wxTextCtrl::sync(void)
   setp(pbase(), epptr());
   delete[] txt;
   return 0;
-*/
 };
 
 int wxTextCtrl::underflow(void)