]> git.saurik.com Git - wxWidgets.git/commitdiff
make it possible to associate context help text with individual radiobox items
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 11 Jun 2006 21:13:13 +0000 (21:13 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 11 Jun 2006 21:13:13 +0000 (21:13 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39676 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/tech/tn0014.txt
include/wx/gtk/radiobox.h
include/wx/msw/radiobox.h
include/wx/radiobox.h
include/wx/xrc/xh_radbx.h
src/common/radiocmn.cpp
src/gtk/radiobox.cpp
src/msw/radiobox.cpp
src/xrc/xh_radbx.cpp

index 57d73456b660499dca7269f78a2190278f772da3..c09c90793963a84f335fd03193091c579950ab68 100644 (file)
@@ -423,7 +423,8 @@ wxRadioBox
 This control may have "dimension" (major dimension) and (initial) "selection"
 Integer subelements and a composite "content" element similar to wxCheckList.
 The only difference is that the "item" subelements can have an optional
 This control may have "dimension" (major dimension) and (initial) "selection"
 Integer subelements and a composite "content" element similar to wxCheckList.
 The only difference is that the "item" subelements can have an optional
-"tooltip=I18nString" attribute to specify the per-item tooltip.
+"tooltip=I18nString" and "helptext=I18nString" attributes to specify
+the per-item tooltip and helptext.
 
 
 wxScrolledWindow
 
 
 wxScrolledWindow
index ef0830aad9bf14a09767494fecebcd6079f6cf99..11bc0a2ed343d6671f6eacb4ab87f4b83d0aa3ab 100644 (file)
 
 #include "wx/bitmap.h"
 
 
 #include "wx/bitmap.h"
 
+class WXDLLIMPEXP_CORE wxGTKRadioButtonInfo;
+
+#include "wx/list.h"
+
+WX_DECLARE_LIST(wxGTKRadioButtonInfo, wxRadioBoxButtonsInfoList);
+
+
 //-----------------------------------------------------------------------------
 // wxRadioBox
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // wxRadioBox
 //-----------------------------------------------------------------------------
@@ -107,6 +114,17 @@ public:
     static wxVisualAttributes
     GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
 
     static wxVisualAttributes
     GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
 
+    virtual int GetItemFromPoint( const wxPoint& pt ) const;
+#if wxUSE_HELP
+    // override virtual wxWindow::GetHelpTextAtPoint to use common platform independent
+    // wxRadioBoxBase::DoGetHelpTextAtPoint from the platform independent
+    // base class-interface wxRadioBoxBase.
+    virtual wxString GetHelpTextAtPoint(const wxPoint & pt, wxHelpEvent::Origin origin) const
+    {
+        return wxRadioBoxBase::DoGetHelpTextAtPoint( this, pt, origin );
+    }
+#endif // wxUSE_HELP
+
     // implementation
     // --------------
 
     // implementation
     // --------------
 
@@ -120,9 +138,9 @@ public:
 
     virtual void OnInternalIdle();
 
 
     virtual void OnInternalIdle();
 
-    bool             m_hasFocus,
-                     m_lostFocus;
-    wxList           m_buttons;
+    bool                        m_hasFocus,
+                                m_lostFocus;
+    wxRadioBoxButtonsInfoList   m_buttonsInfo;
 
 protected:
 #if wxUSE_TOOLTIPS
 
 protected:
 #if wxUSE_TOOLTIPS
index f3cd4d83317fc9211a83f6914b54ff306921b33a..60f29cb922cdc61e8a86cf7a746638ef2ad106a0 100644 (file)
@@ -144,6 +144,16 @@ protected:
     virtual void DoSetItemToolTip(unsigned int n, wxToolTip * tooltip);
 #endif
 
     virtual void DoSetItemToolTip(unsigned int n, wxToolTip * tooltip);
 #endif
 
+    virtual int GetItemFromPoint(const wxPoint& pt) const;
+
+#if wxUSE_HELP
+    // override virtual function with a platform-independent implementation
+    virtual wxString GetHelpTextAtPoint(const wxPoint & pt, wxHelpEvent::Origin origin) const
+    {
+        return wxRadioBoxBase::DoGetHelpTextAtPoint( this, pt, origin );
+    }
+#endif // wxUSE_HELP
+
 #ifndef __WXWINCE__
     virtual WXHRGN MSWGetRegionWithoutChildren();
 #endif // __WXWINCE__
 #ifndef __WXWINCE__
     virtual WXHRGN MSWGetRegionWithoutChildren();
 #endif // __WXWINCE__
index dc9ab4be18c662bbf02565af3b9485d8a2cd90d1..540e4945c3c8aef58cd0134f507185ff4f189c34 100644 (file)
@@ -61,6 +61,29 @@ public:
         { return m_itemsTooltips ? (*m_itemsTooltips)[item] : NULL; }
 #endif // wxUSE_TOOLTIPS
 
         { return m_itemsTooltips ? (*m_itemsTooltips)[item] : NULL; }
 #endif // wxUSE_TOOLTIPS
 
+#if wxUSE_HELP
+    // set helptext for a particular item, pass an empty string to erase it
+    void SetItemHelpText(unsigned int n, const wxString& helpText);
+
+    // retrieve helptext for a particular item, empty string means no help text
+    wxString GetItemHelpText(unsigned int n) const;
+#else // wxUSE_HELP
+    // just silently ignore the help text, it's better than requiring using
+    // conditional compilation in all code using this function
+    void SetItemHelpText(unsigned int WXUNUSED(n),
+                         const wxString& WXUNUSED(helpText))
+    {
+    }
+#endif // wxUSE_HELP
+
+    // returns the radio item at the given position or wxNOT_FOUND if none
+    // (currently implemented only under MSW and GTK)
+    virtual int GetItemFromPoint(const wxPoint& WXUNUSED(pt)) const
+    {
+        return wxNOT_FOUND;
+    }
+
+
     // deprecated functions
     // --------------------
 
     // deprecated functions
     // --------------------
 
@@ -101,6 +124,14 @@ protected:
     bool HasItemToolTips() const { return m_itemsTooltips != NULL; }
 #endif // wxUSE_TOOLTIPS
 
     bool HasItemToolTips() const { return m_itemsTooltips != NULL; }
 #endif // wxUSE_TOOLTIPS
 
+#if wxUSE_HELP
+    // Retrieve help text for an item: this is a helper for the implementation
+    // of wxWindow::GetHelpTextAtPoint() in the real radiobox class
+    wxString DoGetHelpTextAtPoint(const wxWindow *derived,
+                                  const wxPoint& pt,
+                                  wxHelpEvent::Origin origin) const;
+#endif // wxUSE_HELP
+
 private:
     // the number of elements in major dimension (i.e. number of columns if
     // wxRA_SPECIFY_COLS or the number of rows if wxRA_SPECIFY_ROWS) and also
 private:
     // the number of elements in major dimension (i.e. number of columns if
     // wxRA_SPECIFY_COLS or the number of rows if wxRA_SPECIFY_ROWS) and also
@@ -115,6 +146,11 @@ private:
     // this array is initially NULL and initialized on first use
     wxToolTipArray *m_itemsTooltips;
 #endif
     // this array is initially NULL and initialized on first use
     wxToolTipArray *m_itemsTooltips;
 #endif
+
+#if wxUSE_HELP
+    // help text associated with a particular item or empty string if none
+    wxArrayString m_itemsHelpTexts;
+#endif // wxUSE_HELP
 };
 
 #if defined(__WXUNIVERSAL__)
 };
 
 #if defined(__WXUNIVERSAL__)
@@ -139,5 +175,4 @@ private:
 
 #endif // wxUSE_RADIOBOX
 
 
 #endif // wxUSE_RADIOBOX
 
-#endif
-    // _WX_RADIOBOX_H_BASE_
+#endif // _WX_RADIOBOX_H_BASE_
index ac1c14b1d7744ae08aa2556826931cfd17fcc200..a61ea262ad350e908bc20f167522d156b7cdd487 100644 (file)
@@ -28,8 +28,12 @@ private:
     // the items labels
     wxArrayString labels;
 
     // the items labels
     wxArrayString labels;
 
-    // the items tooltips (some or all elements may be empty)
+    // the items tooltips
     wxArrayString tooltips;
     wxArrayString tooltips;
+
+       // the item help text
+    wxArrayString helptexts;
+    wxArrayInt    helptextSpecified;
 };
 
 #endif // wxUSE_RADIOBOX
 };
 
 #endif // wxUSE_RADIOBOX
index b236ec9f179695a2c6eaac40c7153b1458293b0e..d31889c4b304b764044e52c8eb192f8abad1be05 100644 (file)
     #include "wx/tooltip.h"
 #endif // wxUSE_TOOLTIPS
 
     #include "wx/tooltip.h"
 #endif // wxUSE_TOOLTIPS
 
+#if wxUSE_HELP
+    #include "wx/cshelp.h"
+#endif
+
 // ============================================================================
 // implementation
 // ============================================================================
 // ============================================================================
 // implementation
 // ============================================================================
@@ -228,6 +232,51 @@ wxRadioBoxBase::~wxRadioBoxBase()
 #endif // wxUSE_TOOLTIPS
 }
 
 #endif // wxUSE_TOOLTIPS
 }
 
+#if wxUSE_HELP
+
+// set helptext for a particular item
+void wxRadioBoxBase::SetItemHelpText(unsigned int n, const wxString& helpText)
+{
+    wxCHECK_RET( n < GetCount(), _T("Invalid item index") );
+
+    if ( m_itemsHelpTexts.empty() )
+    {
+        // once-only initialization of the array: reserve space for all items
+        m_itemsHelpTexts.Add(wxEmptyString, GetCount());
+    }
+
+    m_itemsHelpTexts[n] = helpText;
+}
+
+// retrieve helptext for a particular item
+wxString wxRadioBoxBase::GetItemHelpText( unsigned int n ) const
+{
+    wxCHECK_MSG( n < GetCount(), wxEmptyString, _T("Invalid item index") );
+
+    return m_itemsHelpTexts.empty() ? wxString() : m_itemsHelpTexts[n];
+}
+
+// return help text for the item for which wxEVT_HELP was generated.
+wxString wxRadioBoxBase::DoGetHelpTextAtPoint(const wxWindow *derived,
+                                              const wxPoint& pt,
+                                              wxHelpEvent::Origin origin) const
+{
+    const int item = origin == wxHelpEvent::Origin_HelpButton
+                        ? GetItemFromPoint(pt)
+                        : GetSelection();
+
+    if ( item != wxNOT_FOUND )
+    {
+        wxString text = GetItemHelpText(wx_static_cast(unsigned int, item));
+        if( !text.empty() )
+            return text;
+    }
+
+    return derived->wxWindowBase::GetHelpTextAtPoint(pt, origin);
+}
+
+#endif // wxUSE_HELP
+
 #if WXWIN_COMPATIBILITY_2_4
 
 // these functions are deprecated and don't do anything
 #if WXWIN_COMPATIBILITY_2_4
 
 // these functions are deprecated and don't do anything
index fc86bc36c57c7005fdf7fb6fbbcd5e4665bdbb49..f38936d468c46fdfb1bdc33f689f46bf577a709b 100644 (file)
 
 #include "wx/gtk/win_gtk.h"
 
 
 #include "wx/gtk/win_gtk.h"
 
+//-----------------------------------------------------------------------------
+// wxGTKRadioButtonInfo
+//-----------------------------------------------------------------------------
+// structure internally used by wxRadioBox to store its child buttons
+
+class wxGTKRadioButtonInfo : public wxObject
+{
+public:
+    wxGTKRadioButtonInfo( GtkRadioButton * abutton, const wxRect & arect )
+    : button( abutton ), rect( arect ) {}
+
+    GtkRadioButton * button;
+    wxRect           rect;
+};
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
 
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
 
+#include "wx/listimpl.cpp"
+WX_DEFINE_LIST( wxRadioBoxButtonsInfoList );
+
 extern bool          g_blockEventsOnDrag;
 extern wxWindowGTK  *g_delayedFocus;
 
 extern bool          g_blockEventsOnDrag;
 extern wxWindowGTK  *g_delayedFocus;
 
@@ -93,7 +111,11 @@ static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_
         return FALSE;
     }
 
         return FALSE;
     }
 
-    wxList::compatibility_iterator node = rb->m_buttons.Find( (wxObject*) widget );
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = rb->m_buttonsInfo.GetFirst();
+    while( node && GTK_WIDGET( node->GetData()->button ) != widget )
+    {
+        node = node->GetNext();
+    }
     if (!node)
     {
         return FALSE;
     if (!node)
     {
         return FALSE;
@@ -104,20 +126,20 @@ static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_
     if ((gdk_event->keyval == GDK_Up) ||
         (gdk_event->keyval == GDK_Left))
     {
     if ((gdk_event->keyval == GDK_Up) ||
         (gdk_event->keyval == GDK_Left))
     {
-        if (node == rb->m_buttons.GetFirst())
-            node = rb->m_buttons.GetLast();
+        if (node == rb->m_buttonsInfo.GetFirst())
+            node = rb->m_buttonsInfo.GetLast();
         else
             node = node->GetPrevious();
     }
     else
     {
         else
             node = node->GetPrevious();
     }
     else
     {
-        if (node == rb->m_buttons.GetLast())
-            node = rb->m_buttons.GetFirst();
+        if (node == rb->m_buttonsInfo.GetLast())
+            node = rb->m_buttonsInfo.GetFirst();
         else
             node = node->GetNext();
     }
 
         else
             node = node->GetNext();
     }
 
-    GtkWidget *button = (GtkWidget*) node->GetData();
+    GtkWidget *button = (GtkWidget*) node->GetData()->button;
 
     gtk_widget_grab_focus( button );
 
 
     gtk_widget_grab_focus( button );
 
@@ -170,6 +192,29 @@ static gint gtk_radiobutton_focus_out( GtkWidget *widget,
 }
 }
 
 }
 }
 
+extern "C" {
+static void gtk_radiobutton_size_allocate( GtkWidget *widget,
+                                           GtkAllocation * alloc,
+                                           wxRadioBox *win )
+{
+    unsigned int n = 0;
+    for ( wxRadioBoxButtonsInfoList::compatibility_iterator node = win->m_buttonsInfo.GetFirst();
+          node;
+          node = node->GetNext(), n++ )
+    {
+        if( widget == GTK_WIDGET(node->GetData()->button) )
+        {
+            const wxPoint origin = win->GetPosition();
+            wxRect rect = wxRect( alloc->x - origin.x, alloc->y - origin.y,
+                                  alloc->width, alloc->height );
+            node->GetData()->rect = rect;
+            break;
+        }
+    }
+}
+}
+
+
 //-----------------------------------------------------------------------------
 // wxRadioBox
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // wxRadioBox
 //-----------------------------------------------------------------------------
@@ -250,7 +295,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
         g_signal_connect (rbtn, "key_press_event",
                           G_CALLBACK (gtk_radiobox_keypress_callback), this);
 
         g_signal_connect (rbtn, "key_press_event",
                           G_CALLBACK (gtk_radiobox_keypress_callback), this);
 
-        m_buttons.Append( (wxObject*) rbtn );
+        m_buttonsInfo.Append( new wxGTKRadioButtonInfo( rbtn, wxRect() ) );
 
         if (HasFlag(wxRA_SPECIFY_COLS))
         {
 
         if (HasFlag(wxRA_SPECIFY_COLS))
         {
@@ -282,6 +327,8 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
                           G_CALLBACK (gtk_radiobutton_focus_in), this);
         g_signal_connect (rbtn, "focus_out_event",
                           G_CALLBACK (gtk_radiobutton_focus_out), this);
                           G_CALLBACK (gtk_radiobutton_focus_in), this);
         g_signal_connect (rbtn, "focus_out_event",
                           G_CALLBACK (gtk_radiobutton_focus_out), this);
+        g_signal_connect (rbtn, "size_allocate",
+                          G_CALLBACK (gtk_radiobutton_size_allocate), this);
     }
 
     m_parent->DoAddChild( this );
     }
 
     m_parent->DoAddChild( this );
@@ -293,13 +340,14 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
 
 wxRadioBox::~wxRadioBox()
 {
 
 wxRadioBox::~wxRadioBox()
 {
-    wxList::compatibility_iterator node = m_buttons.GetFirst();
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst();
     while (node)
     {
     while (node)
     {
-        GtkWidget *button = GTK_WIDGET( node->GetData() );
+        GtkWidget *button = GTK_WIDGET( node->GetData()->button );
         gtk_widget_destroy( button );
         node = node->GetNext();
     }
         gtk_widget_destroy( button );
         node = node->GetNext();
     }
+    WX_CLEAR_LIST( wxRadioBoxButtonsInfoList, m_buttonsInfo );
 }
 
 bool wxRadioBox::Show( bool show )
 }
 
 bool wxRadioBox::Show( bool show )
@@ -315,10 +363,10 @@ bool wxRadioBox::Show( bool show )
     if ( HasFlag(wxNO_BORDER) )
         gtk_widget_hide( m_widget );
 
     if ( HasFlag(wxNO_BORDER) )
         gtk_widget_hide( m_widget );
 
-    wxList::compatibility_iterator node = m_buttons.GetFirst();
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst();
     while (node)
     {
     while (node)
     {
-        GtkWidget *button = GTK_WIDGET( node->GetData() );
+        GtkWidget *button = GTK_WIDGET( node->GetData()->button );
 
         if (show)
             gtk_widget_show( button );
 
         if (show)
             gtk_widget_show( button );
@@ -335,12 +383,12 @@ void wxRadioBox::SetFocus()
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid radiobox") );
 
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid radiobox") );
 
-    if (m_buttons.GetCount() == 0) return;
+    if (m_buttonsInfo.GetCount() == 0) return;
 
 
-    wxList::compatibility_iterator node = m_buttons.GetFirst();
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst();
     while (node)
     {
     while (node)
     {
-        GtkToggleButton *button = GTK_TOGGLE_BUTTON( node->GetData() );
+        GtkToggleButton *button = GTK_TOGGLE_BUTTON( node->GetData()->button );
         if (button->active)
         {
             gtk_widget_grab_focus( GTK_WIDGET(button) );
         if (button->active)
         {
             gtk_widget_grab_focus( GTK_WIDGET(button) );
@@ -354,11 +402,11 @@ void wxRadioBox::SetSelection( int n )
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid radiobox") );
 
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid radiobox") );
 
-    wxList::compatibility_iterator node = m_buttons.Item( n );
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.Item( n );
 
     wxCHECK_RET( node, wxT("radiobox wrong index") );
 
 
     wxCHECK_RET( node, wxT("radiobox wrong index") );
 
-    GtkToggleButton *button = GTK_TOGGLE_BUTTON( node->GetData() );
+    GtkToggleButton *button = GTK_TOGGLE_BUTTON( node->GetData()->button );
 
     GtkDisableEvents();
 
 
     GtkDisableEvents();
 
@@ -373,10 +421,10 @@ int wxRadioBox::GetSelection(void) const
 
     int count = 0;
 
 
     int count = 0;
 
-    wxList::compatibility_iterator node = m_buttons.GetFirst();
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst();
     while (node)
     {
     while (node)
     {
-        GtkToggleButton *button = GTK_TOGGLE_BUTTON( node->GetData() );
+        GtkToggleButton *button = GTK_TOGGLE_BUTTON( node->GetData()->button );
         if (button->active) return count;
         count++;
         node = node->GetNext();
         if (button->active) return count;
         count++;
         node = node->GetNext();
@@ -391,11 +439,11 @@ wxString wxRadioBox::GetString(unsigned int n) const
 {
     wxCHECK_MSG( m_widget != NULL, wxEmptyString, wxT("invalid radiobox") );
 
 {
     wxCHECK_MSG( m_widget != NULL, wxEmptyString, wxT("invalid radiobox") );
 
-    wxList::compatibility_iterator node = m_buttons.Item( n );
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.Item( n );
 
     wxCHECK_MSG( node, wxEmptyString, wxT("radiobox wrong index") );
 
 
     wxCHECK_MSG( node, wxEmptyString, wxT("radiobox wrong index") );
 
-    GtkLabel *label = GTK_LABEL(GTK_BIN(node->GetData())->child);
+    GtkLabel *label = GTK_LABEL(GTK_BIN(node->GetData()->button)->child);
 
     wxString str( wxGTK_CONV_BACK( gtk_label_get_text(label) ) );
 
 
     wxString str( wxGTK_CONV_BACK( gtk_label_get_text(label) ) );
 
@@ -413,11 +461,11 @@ void wxRadioBox::SetString(unsigned int item, const wxString& label)
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid radiobox") );
 
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid radiobox") );
 
-    wxList::compatibility_iterator node = m_buttons.Item( item );
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.Item( item );
 
     wxCHECK_RET( node, wxT("radiobox wrong index") );
 
 
     wxCHECK_RET( node, wxT("radiobox wrong index") );
 
-    GtkLabel *g_label = GTK_LABEL(GTK_BIN(node->GetData())->child);
+    GtkLabel *g_label = GTK_LABEL(GTK_BIN(node->GetData()->button)->child);
 
     gtk_label_set_text( g_label, wxGTK_CONV( label ) );
 }
 
     gtk_label_set_text( g_label, wxGTK_CONV( label ) );
 }
@@ -427,10 +475,10 @@ bool wxRadioBox::Enable( bool enable )
     if ( !wxControl::Enable( enable ) )
         return false;
 
     if ( !wxControl::Enable( enable ) )
         return false;
 
-    wxList::compatibility_iterator node = m_buttons.GetFirst();
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst();
     while (node)
     {
     while (node)
     {
-        GtkButton *button = GTK_BUTTON( node->GetData() );
+        GtkButton *button = GTK_BUTTON( node->GetData()->button );
         GtkLabel *label = GTK_LABEL(GTK_BIN(button)->child);
 
         gtk_widget_set_sensitive( GTK_WIDGET(button), enable );
         GtkLabel *label = GTK_LABEL(GTK_BIN(button)->child);
 
         gtk_widget_set_sensitive( GTK_WIDGET(button), enable );
@@ -445,11 +493,11 @@ bool wxRadioBox::Enable(unsigned int item, bool enable)
 {
     wxCHECK_MSG( m_widget != NULL, false, wxT("invalid radiobox") );
 
 {
     wxCHECK_MSG( m_widget != NULL, false, wxT("invalid radiobox") );
 
-    wxList::compatibility_iterator node = m_buttons.Item( item );
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.Item( item );
 
     wxCHECK_MSG( node, false, wxT("radiobox wrong index") );
 
 
     wxCHECK_MSG( node, false, wxT("radiobox wrong index") );
 
-    GtkButton *button = GTK_BUTTON( node->GetData() );
+    GtkButton *button = GTK_BUTTON( node->GetData()->button );
     GtkLabel *label = GTK_LABEL(GTK_BIN(button)->child);
 
     gtk_widget_set_sensitive( GTK_WIDGET(button), enable );
     GtkLabel *label = GTK_LABEL(GTK_BIN(button)->child);
 
     gtk_widget_set_sensitive( GTK_WIDGET(button), enable );
@@ -462,11 +510,11 @@ bool wxRadioBox::IsItemEnabled(unsigned int item) const
 {
     wxCHECK_MSG( m_widget != NULL, false, wxT("invalid radiobox") );
 
 {
     wxCHECK_MSG( m_widget != NULL, false, wxT("invalid radiobox") );
 
-    wxList::compatibility_iterator node = m_buttons.Item( item );
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.Item( item );
 
     wxCHECK_MSG( node, false, wxT("radiobox wrong index") );
 
 
     wxCHECK_MSG( node, false, wxT("radiobox wrong index") );
 
-    GtkButton *button = GTK_BUTTON( node->GetData() );
+    GtkButton *button = GTK_BUTTON( node->GetData()->button );
 
     // don't use GTK_WIDGET_IS_SENSITIVE() here, we want to return true even if
     // the parent radiobox is disabled
 
     // don't use GTK_WIDGET_IS_SENSITIVE() here, we want to return true even if
     // the parent radiobox is disabled
@@ -477,11 +525,11 @@ bool wxRadioBox::Show(unsigned int item, bool show)
 {
     wxCHECK_MSG( m_widget != NULL, false, wxT("invalid radiobox") );
 
 {
     wxCHECK_MSG( m_widget != NULL, false, wxT("invalid radiobox") );
 
-    wxList::compatibility_iterator node = m_buttons.Item( item );
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.Item( item );
 
     wxCHECK_MSG( node, false, wxT("radiobox wrong index") );
 
 
     wxCHECK_MSG( node, false, wxT("radiobox wrong index") );
 
-    GtkWidget *button = GTK_WIDGET( node->GetData() );
+    GtkWidget *button = GTK_WIDGET( node->GetData()->button );
 
     if (show)
         gtk_widget_show( button );
 
     if (show)
         gtk_widget_show( button );
@@ -495,26 +543,26 @@ bool wxRadioBox::IsItemShown(unsigned int item) const
 {
     wxCHECK_MSG( m_widget != NULL, false, wxT("invalid radiobox") );
 
 {
     wxCHECK_MSG( m_widget != NULL, false, wxT("invalid radiobox") );
 
-    wxList::compatibility_iterator node = m_buttons.Item( item );
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.Item( item );
 
     wxCHECK_MSG( node, false, wxT("radiobox wrong index") );
 
 
     wxCHECK_MSG( node, false, wxT("radiobox wrong index") );
 
-    GtkButton *button = GTK_BUTTON( node->GetData() );
+    GtkButton *button = GTK_BUTTON( node->GetData()->button );
 
     return GTK_WIDGET_VISIBLE(GTK_WIDGET(button));
 }
 
 unsigned int wxRadioBox::GetCount() const
 {
 
     return GTK_WIDGET_VISIBLE(GTK_WIDGET(button));
 }
 
 unsigned int wxRadioBox::GetCount() const
 {
-    return m_buttons.GetCount();
+    return m_buttonsInfo.GetCount();
 }
 
 void wxRadioBox::GtkDisableEvents()
 {
 }
 
 void wxRadioBox::GtkDisableEvents()
 {
-    wxList::compatibility_iterator node = m_buttons.GetFirst();
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst();
     while (node)
     {
     while (node)
     {
-        g_signal_handlers_disconnect_by_func (node->GetData(),
+        g_signal_handlers_disconnect_by_func (node->GetData()->button,
                                               (gpointer) gtk_radiobutton_clicked_callback,
                                               this);
 
                                               (gpointer) gtk_radiobutton_clicked_callback,
                                               this);
 
@@ -524,10 +572,10 @@ void wxRadioBox::GtkDisableEvents()
 
 void wxRadioBox::GtkEnableEvents()
 {
 
 void wxRadioBox::GtkEnableEvents()
 {
-    wxList::compatibility_iterator node = m_buttons.GetFirst();
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst();
     while (node)
     {
     while (node)
     {
-        g_signal_connect (node->GetData(), "clicked",
+        g_signal_connect (node->GetData()->button, "clicked",
                           G_CALLBACK (gtk_radiobutton_clicked_callback), this);
 
         node = node->GetNext();
                           G_CALLBACK (gtk_radiobutton_clicked_callback), this);
 
         node = node->GetNext();
@@ -538,10 +586,10 @@ void wxRadioBox::DoApplyWidgetStyle(GtkRcStyle *style)
 {
     GTKFrameApplyWidgetStyle(GTK_FRAME(m_widget), style);
 
 {
     GTKFrameApplyWidgetStyle(GTK_FRAME(m_widget), style);
 
-    wxList::compatibility_iterator node = m_buttons.GetFirst();
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst();
     while (node)
     {
     while (node)
     {
-        GtkWidget *widget = GTK_WIDGET( node->GetData() );
+        GtkWidget *widget = GTK_WIDGET( node->GetData()->button );
 
         gtk_widget_modify_style( widget, style );
         gtk_widget_modify_style(GTK_BIN(widget)->child, style);
 
         gtk_widget_modify_style( widget, style );
         gtk_widget_modify_style(GTK_BIN(widget)->child, style);
@@ -565,13 +613,13 @@ void wxRadioBox::ApplyToolTip(GtkTooltips * WXUNUSED(tips), const wxChar *tip)
 {
     // set this tooltip for all radiobuttons which don't have their own tips
     unsigned n = 0;
 {
     // set this tooltip for all radiobuttons which don't have their own tips
     unsigned n = 0;
-    for ( wxList::compatibility_iterator node = m_buttons.GetFirst();
+    for ( wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst();
           node;
           node = node->GetNext(), n++ )
     {
         if ( !GetItemToolTip(n) )
         {
           node;
           node = node->GetNext(), n++ )
     {
         if ( !GetItemToolTip(n) )
         {
-            wxToolTip::Apply(GTK_WIDGET(node->GetData()),
+            wxToolTip::Apply(GTK_WIDGET(node->GetData()->button),
                              wxConvCurrent->cWX2MB(tip));
         }
     }
                              wxConvCurrent->cWX2MB(tip));
         }
     }
@@ -585,7 +633,7 @@ void wxRadioBox::DoSetItemToolTip(unsigned int n, wxToolTip *tooltip)
     if ( tooltip )
         buf = wxGTK_CONV(tooltip->GetTip());
 
     if ( tooltip )
         buf = wxGTK_CONV(tooltip->GetTip());
 
-    wxToolTip::Apply(GTK_WIDGET(m_buttons[n]), buf);
+    wxToolTip::Apply(GTK_WIDGET(m_buttonsInfo[n]->button), buf);
 }
 
 #endif // wxUSE_TOOLTIPS
 }
 
 #endif // wxUSE_TOOLTIPS
@@ -595,10 +643,10 @@ bool wxRadioBox::IsOwnGtkWindow( GdkWindow *window )
     if (window == m_widget->window)
         return true;
 
     if (window == m_widget->window)
         return true;
 
-    wxList::compatibility_iterator node = m_buttons.GetFirst();
+    wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst();
     while (node)
     {
     while (node)
     {
-        GtkWidget *button = GTK_WIDGET( node->GetData() );
+        GtkWidget *button = GTK_WIDGET( node->GetData()->button );
 
         if (window == button->window)
             return true;
 
         if (window == button->window)
             return true;
@@ -646,4 +694,18 @@ wxRadioBox::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
     return attr;
 }
 
     return attr;
 }
 
+int wxRadioBox::GetItemFromPoint(const wxPoint& point) const
+{
+    const wxPoint pt = ScreenToClient(point);
+    unsigned n = 0;
+    for ( wxRadioBoxButtonsInfoList::compatibility_iterator
+            node = m_buttonsInfo.GetFirst(); node; node = node->GetNext(), n++ )
+    {
+        if ( m_buttonsInfo[n]->rect.Inside(pt) )
+            return n;
+    }
+
+    return wxNOT_FOUND;
+}
+
 #endif // wxUSE_RADIOBOX
 #endif // wxUSE_RADIOBOX
index 3f320fd6636a14cfa2a48895c10044e5da048982..66534b1e2ad23d0a99b148c7a07cf4be5db4a368 100644 (file)
@@ -656,6 +656,23 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
     }
 }
 
     }
 }
 
+int wxRadioBox::GetItemFromPoint(const wxPoint& pt) const
+{
+    const unsigned int count = GetCount();
+    for ( unsigned int i = 0; i < count; i++ )
+    {
+        RECT rect = wxGetWindowRect((*m_radioButtons)[i]);
+
+        if ( rect.left <= pt.x && pt.x < rect.right &&
+                rect.top  <= pt.y && pt.y < rect.bottom )
+        {
+            return i;
+        }
+    }
+
+    return wxNOT_FOUND;
+}
+
 // ----------------------------------------------------------------------------
 // radio box drawing
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // radio box drawing
 // ----------------------------------------------------------------------------
index edbbbf6a492d4cf39d397bd9ff5e4bb2e1ccb5c6..2b5a066b1dbb3f9f0e5f4169f3c9cb01d744da44 100644 (file)
@@ -80,37 +80,53 @@ wxObject *wxRadioBoxXmlHandler::DoCreateResource()
 
         SetupWindow(control);
 
 
         SetupWindow(control);
 
-#if wxUSE_TOOLTIPS
         const unsigned count = labels.size();
         for( unsigned i = 0; i < count; i++ )
         {
         const unsigned count = labels.size();
         for( unsigned i = 0; i < count; i++ )
         {
+#if wxUSE_TOOLTIPS
             if ( !tooltips[i].empty() )
                 control->SetItemToolTip(i, tooltips[i]);
             if ( !tooltips[i].empty() )
                 control->SetItemToolTip(i, tooltips[i]);
-        }
 #endif // wxUSE_TOOLTIPS
 #endif // wxUSE_TOOLTIPS
+#if wxUSE_HELP
+            if ( helptextSpecified[i] )
+                control->SetItemHelpText(i, helptexts[i]);
+#endif // wxUSE_HELP
+        }
 
         labels.clear();    // dump the strings
 
         labels.clear();    // dump the strings
+
         tooltips.clear();    // dump the tooltips
 
         tooltips.clear();    // dump the tooltips
 
+        helptexts.clear();   // dump the helptexts
+        helptextSpecified.clear();
+
         return control;
     }
     else // inside the radiobox element
     {
         return control;
     }
     else // inside the radiobox element
     {
-        // we handle <item tooltip="...">Label</item> constructs here
+        // we handle handle <item tooltip="..." helptext="...">Label</item> constructs here
 
         wxString str = GetNodeContent(m_node);
 
         wxString str = GetNodeContent(m_node);
+
         wxString tooltip;
         m_node->GetPropVal(wxT("tooltip"), &tooltip);
 
         wxString tooltip;
         m_node->GetPropVal(wxT("tooltip"), &tooltip);
 
+        wxString helptext;
+        bool hasHelptext = m_node->GetPropVal(wxT("helptext"), &helptext);
+
         if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
         {
             str = wxGetTranslation(str);
             if ( !tooltip.empty() )
                 tooltip = wxGetTranslation(tooltip);
         if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
         {
             str = wxGetTranslation(str);
             if ( !tooltip.empty() )
                 tooltip = wxGetTranslation(tooltip);
+            if ( hasHelptext )
+                helptext = wxGetTranslation(helptext);
         }
 
         labels.push_back(str);
         tooltips.push_back(tooltip);
         }
 
         labels.push_back(str);
         tooltips.push_back(tooltip);
+        helptexts.push_back(helptext);
+        helptextSpecified.push_back(hasHelptext);
 
         return NULL;
     }
 
         return NULL;
     }