]> git.saurik.com Git - wxWidgets.git/commitdiff
wxListBox mouse events now report coords relative
authorRobert Roebling <robert@roebling.de>
Thu, 8 Nov 2001 23:24:16 +0000 (23:24 +0000)
committerRobert Roebling <robert@roebling.de>
Thu, 8 Nov 2001 23:24:16 +0000 (23:24 +0000)
    to the whole list box.
  wxRadioButton doesn't emit any event when unpressed.
  Similar correction to wxRadioBox and wxToggleButton.
  Upported change to wxMenuEvent so that the id is
     set in the constructor. Otherwise the EVT_MENU
     macro is pretty useless. Already in 2.2.8.

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

13 files changed:
include/wx/event.h
include/wx/gtk/window.h
include/wx/gtk1/window.h
src/gtk/listbox.cpp
src/gtk/radiobox.cpp
src/gtk/radiobut.cpp
src/gtk/tglbtn.cpp
src/gtk/window.cpp
src/gtk1/listbox.cpp
src/gtk1/radiobox.cpp
src/gtk1/radiobut.cpp
src/gtk1/tglbtn.cpp
src/gtk1/window.cpp

index 760e675e55c3293762496465464498a22105c8f0..8189e166289c47b1d251d58c0d392e5139fc44f8 100644 (file)
@@ -1027,7 +1027,7 @@ class WXDLLEXPORT wxMenuEvent : public wxEvent
 
 public:
     wxMenuEvent(wxEventType type = wxEVT_NULL, int id = 0)
-      { m_eventType = type; m_menuId = id; }
+      { m_eventType = type; m_menuId = id; m_id = id; }
 
     int GetMenuId() const { return m_menuId; }
 
index cfb1e5af1b190a5314df88a0e6e642666651819a..0e9f17f19ea9fb834ba66683411051a360e797cb 100644 (file)
@@ -193,6 +193,7 @@ public:
     bool                 m_resizing:1;
     bool                 m_isStaticBox:1;       // faster than IS_KIND_OF
     bool                 m_isRadioButton:1;     // faster than IS_KIND_OF
+    bool                 m_isListBox:1;         // faster than IS_KIND_OF
     bool                 m_isFrame:1;           // faster than IS_KIND_OF
     bool                 m_acceptsFocus:1;      // not wxStaticBox, not wxStaticBitmap etc.
     bool                 m_isScrolling;
index cfb1e5af1b190a5314df88a0e6e642666651819a..0e9f17f19ea9fb834ba66683411051a360e797cb 100644 (file)
@@ -193,6 +193,7 @@ public:
     bool                 m_resizing:1;
     bool                 m_isStaticBox:1;       // faster than IS_KIND_OF
     bool                 m_isRadioButton:1;     // faster than IS_KIND_OF
+    bool                 m_isListBox:1;         // faster than IS_KIND_OF
     bool                 m_isFrame:1;           // faster than IS_KIND_OF
     bool                 m_acceptsFocus:1;      // not wxStaticBox, not wxStaticBitmap etc.
     bool                 m_isScrolling;
index ea20374c2ded7e221a76daeaa5916771ec3582ae..449d4fbe014ad67378076a66ed5b26a0b3a1be90 100644 (file)
@@ -333,6 +333,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
 {
     m_needParent = TRUE;
     m_acceptsFocus = TRUE;
+    m_isListBox = TRUE;
     m_prevSelection = 0;  // or -1 ??
 
     if (!PreCreation( parent, pos, size ) ||
index 64881d7cfc6ab1252c43d387104097a91f27290b..20d1af4563e1f1c85b5aa662e26d433176c9ec59 100644 (file)
@@ -44,20 +44,14 @@ extern bool       g_blockEventsOnDrag;
 // "clicked"
 //-----------------------------------------------------------------------------
 
-static void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioBox *rb )
+static void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioBox *rb )
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
     if (!rb->m_hasVMT) return;
     if (g_blockEventsOnDrag) return;
 
-    if (rb->m_alreadySent)
-    {
-        rb->m_alreadySent = FALSE;
-        return;
-    }
-
-    rb->m_alreadySent = TRUE;
+    if (!button->active) return;
 
     wxCommandEvent event( wxEVT_COMMAND_RADIOBOX_SELECTED, rb->GetId() );
     event.SetInt( rb->GetSelection() );
@@ -166,7 +160,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxRadioBox,wxControl)
 
 void wxRadioBox::Init()
 {
-    m_alreadySent = FALSE;
     m_needParent = TRUE;
     m_acceptsFocus = TRUE;
 
@@ -184,7 +177,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
         !CreateBase( parent, id, pos, size, style, validator, name ))
     {
         wxFAIL_MSG( wxT("wxRadioBox creation failed") );
-       return FALSE;
+        return FALSE;
     }
 
     m_widget = gtk_frame_new( title.mbc_str() );
@@ -478,7 +471,7 @@ void wxRadioBox::SetSelection( int n )
 
     GtkDisableEvents();
     
-    gtk_toggle_button_set_state( button, 1 );
+    gtk_toggle_button_set_active( button, 1 );
     
     GtkEnableEvents();
 }
index 278af7b0d43c4bf4ac744f6f98a627ccc54fd2a5..69897c451a902e4772fd4b4493359572fe3db0ef 100644 (file)
@@ -4,7 +4,7 @@
 // Author:      Robert Roebling
 // Id:          $Id$
 // Copyright:   (c) 1998 Robert Roebling
-// Licence:    wxWindows licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 
@@ -40,7 +40,7 @@ extern wxCursor   g_globalCursor;
 //-----------------------------------------------------------------------------
 
 static 
-void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioButton *rb )
+void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *rb )
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
@@ -48,6 +48,8 @@ void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioButto
   
     if (g_blockEventsOnDrag) return;
   
+    if (!button->active) return;
+  
     wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId());
     event.SetInt( rb->GetValue() );
     event.SetEventObject( rb );
@@ -72,7 +74,7 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
         !CreateBase( parent, id, pos, size, style, validator, name ))
     {
         wxFAIL_MSG( wxT("wxRadioButton creation failed") );
-       return FALSE;
+    return FALSE;
     }
 
     if (HasFlag(wxRB_GROUP))
@@ -86,25 +88,25 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
         wxRadioButton *chief = (wxRadioButton*) NULL;
         wxWindowList::Node *node = parent->GetChildren().GetLast();
         while (node)
-           {
-               wxWindow *child = node->GetData();
-               if (child->m_isRadioButton)
-               {
-                   chief = (wxRadioButton*) child;
-                       if (child->HasFlag(wxRB_GROUP)) break;
-               }
-               node = node->GetPrevious();
+        {
+            wxWindow *child = node->GetData();
+            if (child->m_isRadioButton)
+            {
+                chief = (wxRadioButton*) child;
+                if (child->HasFlag(wxRB_GROUP)) break;
+            }
+            node = node->GetPrevious();
         }
-           if (chief)
-           {
+        if (chief)
+        {
             /* we are part of the group started by chief */
-               m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) );
-           }
-           else
-           {
+            m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) );
+        }
+        else
+        {
             /* start a new group */
             m_radioButtonGroup = (GSList*) NULL;
-           }
+        }
     }
 
     m_widget = gtk_radio_button_new_with_label( m_radioButtonGroup, label.mbc_str() );
@@ -159,7 +161,7 @@ void wxRadioButton::SetValue( bool val )
 
     if (val)
     {
-        gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widget), TRUE );
+        gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(m_widget), TRUE );
     }
     else
     {
@@ -209,11 +211,11 @@ void wxRadioButton::OnInternalIdle()
     if (GTK_TOGGLE_BUTTON(m_widget)->event_window && cursor.Ok())
     {
         /* I now set the cursor the anew in every OnInternalIdle call
-          as setting the cursor in a parent window also effects the
-          windows above so that checking for the current cursor is
-          not possible. */
-          
-          gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() );
+       as setting the cursor in a parent window also effects the
+       windows above so that checking for the current cursor is
+       not possible. */
+       
+       gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() );
     }
 
     UpdateWindowUI();
index 28497c76ce0f17d823faaa7a7dd1bb1bdc8a67b3..cfa6e1efdf9c7c855414625ddc6bd7da4f2139c1 100644 (file)
@@ -106,7 +106,7 @@ void wxToggleButton::SetValue(bool state)
                                  GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
                                  (gpointer *)this);
 
-   gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(m_widget), state);
+   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state);
 
    gtk_signal_connect(GTK_OBJECT(m_widget), "clicked",
                       GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
index 57925258007e5fa548330408d93a403d28e62d18..2d74acd13549c7d95d6090160164518b16779afc 100644 (file)
@@ -1333,6 +1333,14 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
     event.m_y = (wxCoord)gdk_event->y;
 
     AdjustEventButtonState(event);
+    
+    // wxListBox actually get mouse events from the item
+    
+    if (win->m_isListBox)
+    {
+        event.m_x += widget->allocation.x;
+        event.m_y += widget->allocation.y;
+    }
 
     // Some control don't have their own X window and thus cannot get
     // any events.
@@ -1466,6 +1474,14 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
 
     AdjustEventButtonState(event);
 
+    // wxListBox actually get mouse events from the item
+    
+    if (win->m_isListBox)
+    {
+        event.m_x += widget->allocation.x;
+        event.m_y += widget->allocation.y;
+    }
+
     // Some control don't have their own X window and thus cannot get
     // any events.
 
@@ -2366,6 +2382,7 @@ void wxWindowGTK::Init()
 
     m_isStaticBox = FALSE;
     m_isRadioButton = FALSE;
+    m_isListBox = FALSE;
     m_isFrame = FALSE;
     m_acceptsFocus = FALSE;
 
index ea20374c2ded7e221a76daeaa5916771ec3582ae..449d4fbe014ad67378076a66ed5b26a0b3a1be90 100644 (file)
@@ -333,6 +333,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
 {
     m_needParent = TRUE;
     m_acceptsFocus = TRUE;
+    m_isListBox = TRUE;
     m_prevSelection = 0;  // or -1 ??
 
     if (!PreCreation( parent, pos, size ) ||
index 64881d7cfc6ab1252c43d387104097a91f27290b..20d1af4563e1f1c85b5aa662e26d433176c9ec59 100644 (file)
@@ -44,20 +44,14 @@ extern bool       g_blockEventsOnDrag;
 // "clicked"
 //-----------------------------------------------------------------------------
 
-static void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioBox *rb )
+static void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioBox *rb )
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
     if (!rb->m_hasVMT) return;
     if (g_blockEventsOnDrag) return;
 
-    if (rb->m_alreadySent)
-    {
-        rb->m_alreadySent = FALSE;
-        return;
-    }
-
-    rb->m_alreadySent = TRUE;
+    if (!button->active) return;
 
     wxCommandEvent event( wxEVT_COMMAND_RADIOBOX_SELECTED, rb->GetId() );
     event.SetInt( rb->GetSelection() );
@@ -166,7 +160,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxRadioBox,wxControl)
 
 void wxRadioBox::Init()
 {
-    m_alreadySent = FALSE;
     m_needParent = TRUE;
     m_acceptsFocus = TRUE;
 
@@ -184,7 +177,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
         !CreateBase( parent, id, pos, size, style, validator, name ))
     {
         wxFAIL_MSG( wxT("wxRadioBox creation failed") );
-       return FALSE;
+        return FALSE;
     }
 
     m_widget = gtk_frame_new( title.mbc_str() );
@@ -478,7 +471,7 @@ void wxRadioBox::SetSelection( int n )
 
     GtkDisableEvents();
     
-    gtk_toggle_button_set_state( button, 1 );
+    gtk_toggle_button_set_active( button, 1 );
     
     GtkEnableEvents();
 }
index 278af7b0d43c4bf4ac744f6f98a627ccc54fd2a5..69897c451a902e4772fd4b4493359572fe3db0ef 100644 (file)
@@ -4,7 +4,7 @@
 // Author:      Robert Roebling
 // Id:          $Id$
 // Copyright:   (c) 1998 Robert Roebling
-// Licence:    wxWindows licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 
@@ -40,7 +40,7 @@ extern wxCursor   g_globalCursor;
 //-----------------------------------------------------------------------------
 
 static 
-void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioButton *rb )
+void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *rb )
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
@@ -48,6 +48,8 @@ void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioButto
   
     if (g_blockEventsOnDrag) return;
   
+    if (!button->active) return;
+  
     wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId());
     event.SetInt( rb->GetValue() );
     event.SetEventObject( rb );
@@ -72,7 +74,7 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
         !CreateBase( parent, id, pos, size, style, validator, name ))
     {
         wxFAIL_MSG( wxT("wxRadioButton creation failed") );
-       return FALSE;
+    return FALSE;
     }
 
     if (HasFlag(wxRB_GROUP))
@@ -86,25 +88,25 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
         wxRadioButton *chief = (wxRadioButton*) NULL;
         wxWindowList::Node *node = parent->GetChildren().GetLast();
         while (node)
-           {
-               wxWindow *child = node->GetData();
-               if (child->m_isRadioButton)
-               {
-                   chief = (wxRadioButton*) child;
-                       if (child->HasFlag(wxRB_GROUP)) break;
-               }
-               node = node->GetPrevious();
+        {
+            wxWindow *child = node->GetData();
+            if (child->m_isRadioButton)
+            {
+                chief = (wxRadioButton*) child;
+                if (child->HasFlag(wxRB_GROUP)) break;
+            }
+            node = node->GetPrevious();
         }
-           if (chief)
-           {
+        if (chief)
+        {
             /* we are part of the group started by chief */
-               m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) );
-           }
-           else
-           {
+            m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) );
+        }
+        else
+        {
             /* start a new group */
             m_radioButtonGroup = (GSList*) NULL;
-           }
+        }
     }
 
     m_widget = gtk_radio_button_new_with_label( m_radioButtonGroup, label.mbc_str() );
@@ -159,7 +161,7 @@ void wxRadioButton::SetValue( bool val )
 
     if (val)
     {
-        gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widget), TRUE );
+        gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(m_widget), TRUE );
     }
     else
     {
@@ -209,11 +211,11 @@ void wxRadioButton::OnInternalIdle()
     if (GTK_TOGGLE_BUTTON(m_widget)->event_window && cursor.Ok())
     {
         /* I now set the cursor the anew in every OnInternalIdle call
-          as setting the cursor in a parent window also effects the
-          windows above so that checking for the current cursor is
-          not possible. */
-          
-          gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() );
+       as setting the cursor in a parent window also effects the
+       windows above so that checking for the current cursor is
+       not possible. */
+       
+       gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() );
     }
 
     UpdateWindowUI();
index 28497c76ce0f17d823faaa7a7dd1bb1bdc8a67b3..cfa6e1efdf9c7c855414625ddc6bd7da4f2139c1 100644 (file)
@@ -106,7 +106,7 @@ void wxToggleButton::SetValue(bool state)
                                  GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
                                  (gpointer *)this);
 
-   gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(m_widget), state);
+   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state);
 
    gtk_signal_connect(GTK_OBJECT(m_widget), "clicked",
                       GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
index 57925258007e5fa548330408d93a403d28e62d18..2d74acd13549c7d95d6090160164518b16779afc 100644 (file)
@@ -1333,6 +1333,14 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
     event.m_y = (wxCoord)gdk_event->y;
 
     AdjustEventButtonState(event);
+    
+    // wxListBox actually get mouse events from the item
+    
+    if (win->m_isListBox)
+    {
+        event.m_x += widget->allocation.x;
+        event.m_y += widget->allocation.y;
+    }
 
     // Some control don't have their own X window and thus cannot get
     // any events.
@@ -1466,6 +1474,14 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
 
     AdjustEventButtonState(event);
 
+    // wxListBox actually get mouse events from the item
+    
+    if (win->m_isListBox)
+    {
+        event.m_x += widget->allocation.x;
+        event.m_y += widget->allocation.y;
+    }
+
     // Some control don't have their own X window and thus cannot get
     // any events.
 
@@ -2366,6 +2382,7 @@ void wxWindowGTK::Init()
 
     m_isStaticBox = FALSE;
     m_isRadioButton = FALSE;
+    m_isListBox = FALSE;
     m_isFrame = FALSE;
     m_acceptsFocus = FALSE;