From dc26eeb36a7415bd73d3e442c79b7acc0aeed6eb Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 11 Jun 2006 21:13:13 +0000 Subject: [PATCH] make it possible to associate context help text with individual radiobox items git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39676 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/tech/tn0014.txt | 3 +- include/wx/gtk/radiobox.h | 24 +++++- include/wx/msw/radiobox.h | 10 +++ include/wx/radiobox.h | 39 +++++++++- include/wx/xrc/xh_radbx.h | 6 +- src/common/radiocmn.cpp | 49 +++++++++++++ src/gtk/radiobox.cpp | 150 +++++++++++++++++++++++++++----------- src/msw/radiobox.cpp | 17 +++++ src/xrc/xh_radbx.cpp | 22 +++++- 9 files changed, 266 insertions(+), 54 deletions(-) diff --git a/docs/tech/tn0014.txt b/docs/tech/tn0014.txt index 57d73456b6..c09c907939 100644 --- a/docs/tech/tn0014.txt +++ b/docs/tech/tn0014.txt @@ -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 -"tooltip=I18nString" attribute to specify the per-item tooltip. +"tooltip=I18nString" and "helptext=I18nString" attributes to specify +the per-item tooltip and helptext. wxScrolledWindow diff --git a/include/wx/gtk/radiobox.h b/include/wx/gtk/radiobox.h index ef0830aad9..11bc0a2ed3 100644 --- a/include/wx/gtk/radiobox.h +++ b/include/wx/gtk/radiobox.h @@ -12,6 +12,13 @@ #include "wx/bitmap.h" +class WXDLLIMPEXP_CORE wxGTKRadioButtonInfo; + +#include "wx/list.h" + +WX_DECLARE_LIST(wxGTKRadioButtonInfo, wxRadioBoxButtonsInfoList); + + //----------------------------------------------------------------------------- // wxRadioBox //----------------------------------------------------------------------------- @@ -107,6 +114,17 @@ public: 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 // -------------- @@ -120,9 +138,9 @@ public: virtual void OnInternalIdle(); - bool m_hasFocus, - m_lostFocus; - wxList m_buttons; + bool m_hasFocus, + m_lostFocus; + wxRadioBoxButtonsInfoList m_buttonsInfo; protected: #if wxUSE_TOOLTIPS diff --git a/include/wx/msw/radiobox.h b/include/wx/msw/radiobox.h index f3cd4d8331..60f29cb922 100644 --- a/include/wx/msw/radiobox.h +++ b/include/wx/msw/radiobox.h @@ -144,6 +144,16 @@ protected: 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__ diff --git a/include/wx/radiobox.h b/include/wx/radiobox.h index dc9ab4be18..540e4945c3 100644 --- a/include/wx/radiobox.h +++ b/include/wx/radiobox.h @@ -61,6 +61,29 @@ public: { 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 // -------------------- @@ -101,6 +124,14 @@ protected: 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 @@ -115,6 +146,11 @@ private: // 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__) @@ -139,5 +175,4 @@ private: #endif // wxUSE_RADIOBOX -#endif - // _WX_RADIOBOX_H_BASE_ +#endif // _WX_RADIOBOX_H_BASE_ diff --git a/include/wx/xrc/xh_radbx.h b/include/wx/xrc/xh_radbx.h index ac1c14b1d7..a61ea262ad 100644 --- a/include/wx/xrc/xh_radbx.h +++ b/include/wx/xrc/xh_radbx.h @@ -28,8 +28,12 @@ private: // the items labels wxArrayString labels; - // the items tooltips (some or all elements may be empty) + // the items tooltips wxArrayString tooltips; + + // the item help text + wxArrayString helptexts; + wxArrayInt helptextSpecified; }; #endif // wxUSE_RADIOBOX diff --git a/src/common/radiocmn.cpp b/src/common/radiocmn.cpp index b236ec9f17..d31889c4b3 100644 --- a/src/common/radiocmn.cpp +++ b/src/common/radiocmn.cpp @@ -34,6 +34,10 @@ #include "wx/tooltip.h" #endif // wxUSE_TOOLTIPS +#if wxUSE_HELP + #include "wx/cshelp.h" +#endif + // ============================================================================ // implementation // ============================================================================ @@ -228,6 +232,51 @@ wxRadioBoxBase::~wxRadioBoxBase() #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 diff --git a/src/gtk/radiobox.cpp b/src/gtk/radiobox.cpp index fc86bc36c5..f38936d468 100644 --- a/src/gtk/radiobox.cpp +++ b/src/gtk/radiobox.cpp @@ -29,10 +29,28 @@ #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 //----------------------------------------------------------------------------- +#include "wx/listimpl.cpp" +WX_DEFINE_LIST( wxRadioBoxButtonsInfoList ); + extern bool g_blockEventsOnDrag; extern wxWindowGTK *g_delayedFocus; @@ -93,7 +111,11 @@ static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_ 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; @@ -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 (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 { - 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(); } - GtkWidget *button = (GtkWidget*) node->GetData(); + GtkWidget *button = (GtkWidget*) node->GetData()->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 //----------------------------------------------------------------------------- @@ -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); - m_buttons.Append( (wxObject*) rbtn ); + m_buttonsInfo.Append( new wxGTKRadioButtonInfo( rbtn, wxRect() ) ); 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_signal_connect (rbtn, "size_allocate", + G_CALLBACK (gtk_radiobutton_size_allocate), this); } m_parent->DoAddChild( this ); @@ -293,13 +340,14 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title, wxRadioBox::~wxRadioBox() { - wxList::compatibility_iterator node = m_buttons.GetFirst(); + wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst(); while (node) { - GtkWidget *button = GTK_WIDGET( node->GetData() ); + GtkWidget *button = GTK_WIDGET( node->GetData()->button ); gtk_widget_destroy( button ); node = node->GetNext(); } + WX_CLEAR_LIST( wxRadioBoxButtonsInfoList, m_buttonsInfo ); } bool wxRadioBox::Show( bool show ) @@ -315,10 +363,10 @@ bool wxRadioBox::Show( bool show ) 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) { - GtkWidget *button = GTK_WIDGET( node->GetData() ); + GtkWidget *button = GTK_WIDGET( node->GetData()->button ); if (show) gtk_widget_show( button ); @@ -335,12 +383,12 @@ void wxRadioBox::SetFocus() { 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) { - 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) ); @@ -354,11 +402,11 @@ void wxRadioBox::SetSelection( int n ) { 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") ); - GtkToggleButton *button = GTK_TOGGLE_BUTTON( node->GetData() ); + GtkToggleButton *button = GTK_TOGGLE_BUTTON( node->GetData()->button ); GtkDisableEvents(); @@ -373,10 +421,10 @@ int wxRadioBox::GetSelection(void) const int count = 0; - wxList::compatibility_iterator node = m_buttons.GetFirst(); + wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst(); 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(); @@ -391,11 +439,11 @@ wxString wxRadioBox::GetString(unsigned int n) const { 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") ); - 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) ) ); @@ -413,11 +461,11 @@ void wxRadioBox::SetString(unsigned int item, const wxString& label) { 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") ); - 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 ) ); } @@ -427,10 +475,10 @@ bool wxRadioBox::Enable( bool enable ) if ( !wxControl::Enable( enable ) ) return false; - wxList::compatibility_iterator node = m_buttons.GetFirst(); + wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst(); 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 ); @@ -445,11 +493,11 @@ bool wxRadioBox::Enable(unsigned int item, bool enable) { 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") ); - 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 ); @@ -462,11 +510,11 @@ bool wxRadioBox::IsItemEnabled(unsigned int item) const { 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") ); - 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 @@ -477,11 +525,11 @@ bool wxRadioBox::Show(unsigned int item, bool show) { 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") ); - GtkWidget *button = GTK_WIDGET( node->GetData() ); + GtkWidget *button = GTK_WIDGET( node->GetData()->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") ); - wxList::compatibility_iterator node = m_buttons.Item( item ); + wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.Item( item ); 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 m_buttons.GetCount(); + return m_buttonsInfo.GetCount(); } void wxRadioBox::GtkDisableEvents() { - wxList::compatibility_iterator node = m_buttons.GetFirst(); + wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst(); 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); @@ -524,10 +572,10 @@ void wxRadioBox::GtkDisableEvents() void wxRadioBox::GtkEnableEvents() { - wxList::compatibility_iterator node = m_buttons.GetFirst(); + wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst(); 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(); @@ -538,10 +586,10 @@ void wxRadioBox::DoApplyWidgetStyle(GtkRcStyle *style) { GTKFrameApplyWidgetStyle(GTK_FRAME(m_widget), style); - wxList::compatibility_iterator node = m_buttons.GetFirst(); + wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst(); 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); @@ -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; - for ( wxList::compatibility_iterator node = m_buttons.GetFirst(); + for ( wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst(); node; node = node->GetNext(), n++ ) { if ( !GetItemToolTip(n) ) { - wxToolTip::Apply(GTK_WIDGET(node->GetData()), + wxToolTip::Apply(GTK_WIDGET(node->GetData()->button), wxConvCurrent->cWX2MB(tip)); } } @@ -585,7 +633,7 @@ void wxRadioBox::DoSetItemToolTip(unsigned int n, wxToolTip *tooltip) 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 @@ -595,10 +643,10 @@ bool wxRadioBox::IsOwnGtkWindow( GdkWindow *window ) if (window == m_widget->window) return true; - wxList::compatibility_iterator node = m_buttons.GetFirst(); + wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst(); while (node) { - GtkWidget *button = GTK_WIDGET( node->GetData() ); + GtkWidget *button = GTK_WIDGET( node->GetData()->button ); if (window == button->window) return true; @@ -646,4 +694,18 @@ wxRadioBox::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) 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 diff --git a/src/msw/radiobox.cpp b/src/msw/radiobox.cpp index 3f320fd663..66534b1e2a 100644 --- a/src/msw/radiobox.cpp +++ b/src/msw/radiobox.cpp @@ -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 // ---------------------------------------------------------------------------- diff --git a/src/xrc/xh_radbx.cpp b/src/xrc/xh_radbx.cpp index edbbbf6a49..2b5a066b1d 100644 --- a/src/xrc/xh_radbx.cpp +++ b/src/xrc/xh_radbx.cpp @@ -80,37 +80,53 @@ wxObject *wxRadioBoxXmlHandler::DoCreateResource() SetupWindow(control); -#if wxUSE_TOOLTIPS const unsigned count = labels.size(); for( unsigned i = 0; i < count; i++ ) { +#if wxUSE_TOOLTIPS if ( !tooltips[i].empty() ) control->SetItemToolTip(i, tooltips[i]); - } #endif // wxUSE_TOOLTIPS +#if wxUSE_HELP + if ( helptextSpecified[i] ) + control->SetItemHelpText(i, helptexts[i]); +#endif // wxUSE_HELP + } labels.clear(); // dump the strings + tooltips.clear(); // dump the tooltips + helptexts.clear(); // dump the helptexts + helptextSpecified.clear(); + return control; } else // inside the radiobox element { - // we handle Label constructs here + // we handle handle Label constructs here wxString str = GetNodeContent(m_node); + 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 ( hasHelptext ) + helptext = wxGetTranslation(helptext); } labels.push_back(str); tooltips.push_back(tooltip); + helptexts.push_back(helptext); + helptextSpecified.push_back(hasHelptext); return NULL; } -- 2.45.2