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
This commit is contained in:
Vadim Zeitlin
2006-06-11 21:13:13 +00:00
parent dc6588e771
commit dc26eeb36a
9 changed files with 266 additions and 54 deletions

View File

@@ -423,7 +423,8 @@ wxRadioBox
This control may have "dimension" (major dimension) and (initial) "selection" This control may have "dimension" (major dimension) and (initial) "selection"
Integer subelements and a composite "content" element similar to wxCheckList. Integer subelements and a composite "content" element similar to wxCheckList.
The only difference is that the "item" subelements can have an optional 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

View File

@@ -12,6 +12,13 @@
#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 static wxVisualAttributes
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); 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, bool m_hasFocus,
m_lostFocus; m_lostFocus;
wxList m_buttons; wxRadioBoxButtonsInfoList m_buttonsInfo;
protected: protected:
#if wxUSE_TOOLTIPS #if wxUSE_TOOLTIPS

View File

@@ -144,6 +144,16 @@ protected:
virtual void DoSetItemToolTip(unsigned int n, wxToolTip * tooltip); virtual void DoSetItemToolTip(unsigned int n, wxToolTip * tooltip);
#endif #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__ #ifndef __WXWINCE__
virtual WXHRGN MSWGetRegionWithoutChildren(); virtual WXHRGN MSWGetRegionWithoutChildren();
#endif // __WXWINCE__ #endif // __WXWINCE__

View File

@@ -61,6 +61,29 @@ public:
{ return m_itemsTooltips ? (*m_itemsTooltips)[item] : NULL; } { return m_itemsTooltips ? (*m_itemsTooltips)[item] : NULL; }
#endif // wxUSE_TOOLTIPS #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; } bool HasItemToolTips() const { return m_itemsTooltips != NULL; }
#endif // wxUSE_TOOLTIPS #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: private:
// the number of elements in major dimension (i.e. number of columns if // 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 // 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 // this array is initially NULL and initialized on first use
wxToolTipArray *m_itemsTooltips; wxToolTipArray *m_itemsTooltips;
#endif #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 #endif // _WX_RADIOBOX_H_BASE_
// _WX_RADIOBOX_H_BASE_

View File

@@ -28,8 +28,12 @@ private:
// the items labels // the items labels
wxArrayString 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

View File

@@ -34,6 +34,10 @@
#include "wx/tooltip.h" #include "wx/tooltip.h"
#endif // wxUSE_TOOLTIPS #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 #if WXWIN_COMPATIBILITY_2_4
// these functions are deprecated and don't do anything // these functions are deprecated and don't do anything

View File

@@ -29,10 +29,28 @@
#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 bool g_blockEventsOnDrag;
extern wxWindowGTK *g_delayedFocus; 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) if (!node)
{ {
return FALSE; return FALSE;
@@ -104,20 +126,20 @@ static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_
if ((gdk_event->keyval == GDK_Up) || if ((gdk_event->keyval == GDK_Up) ||
(gdk_event->keyval == GDK_Left)) (gdk_event->keyval == GDK_Left))
{ {
if (node == rb->m_buttons.GetFirst()) if (node == rb->m_buttonsInfo.GetFirst())
node = rb->m_buttons.GetLast(); node = rb->m_buttonsInfo.GetLast();
else else
node = node->GetPrevious(); node = node->GetPrevious();
} }
else else
{ {
if (node == rb->m_buttons.GetLast()) if (node == rb->m_buttonsInfo.GetLast())
node = rb->m_buttons.GetFirst(); node = rb->m_buttonsInfo.GetFirst();
else else
node = node->GetNext(); 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_signal_connect (rbtn, "key_press_event",
G_CALLBACK (gtk_radiobox_keypress_callback), this); 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_CALLBACK (gtk_radiobutton_focus_in), this);
g_signal_connect (rbtn, "focus_out_event", g_signal_connect (rbtn, "focus_out_event",
G_CALLBACK (gtk_radiobutton_focus_out), this); 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 ); gtk_widget_destroy( button );
node = node->GetNext(); 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) ) if ( HasFlag(wxNO_BORDER) )
gtk_widget_hide( m_widget ); 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) if (show)
gtk_widget_show( button ); 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) if (button->active)
{ {
gtk_widget_grab_focus( GTK_WIDGET(button) ); 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; if (button->active) return count;
count++; count++;
node = node->GetNext(); 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 ) ) if ( !wxControl::Enable( enable ) )
return false; 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); GtkLabel *label = GTK_LABEL(GTK_BIN(button)->child);
gtk_widget_set_sensitive( GTK_WIDGET(button), enable ); 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); GtkLabel *label = GTK_LABEL(GTK_BIN(button)->child);
gtk_widget_set_sensitive( GTK_WIDGET(button), enable ); 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 // don't use GTK_WIDGET_IS_SENSITIVE() here, we want to return true even if
// the parent radiobox is disabled // 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) if (show)
gtk_widget_show( button ); 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)); return GTK_WIDGET_VISIBLE(GTK_WIDGET(button));
} }
unsigned int wxRadioBox::GetCount() const 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, (gpointer) gtk_radiobutton_clicked_callback,
this); 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); G_CALLBACK (gtk_radiobutton_clicked_callback), this);
node = node->GetNext(); 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( widget, style );
gtk_widget_modify_style(GTK_BIN(widget)->child, 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 // set this tooltip for all radiobuttons which don't have their own tips
unsigned n = 0; unsigned n = 0;
for ( wxList::compatibility_iterator node = m_buttons.GetFirst(); for ( wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst();
node; node;
node = node->GetNext(), n++ ) node = node->GetNext(), n++ )
{ {
if ( !GetItemToolTip(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 ) if ( tooltip )
buf = wxGTK_CONV(tooltip->GetTip()); 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) if (window == m_widget->window)
return true; 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) if (window == button->window)
return true; 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

View 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
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -80,37 +80,53 @@ wxObject *wxRadioBoxXmlHandler::DoCreateResource()
SetupWindow(control); SetupWindow(control);
#if wxUSE_TOOLTIPS
const unsigned count = labels.size(); const unsigned count = labels.size();
for( unsigned i = 0; i < count; i++ ) for( unsigned i = 0; i < count; i++ )
{ {
#if wxUSE_TOOLTIPS
if ( !tooltips[i].empty() ) if ( !tooltips[i].empty() )
control->SetItemToolTip(i, tooltips[i]); 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; return control;
} }
else // inside the radiobox element 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; wxString tooltip;
m_node->GetPropVal(wxT("tooltip"), &tooltip); m_node->GetPropVal(wxT("tooltip"), &tooltip);
wxString helptext;
bool hasHelptext = m_node->GetPropVal(wxT("helptext"), &helptext);
if (m_resource->GetFlags() & wxXRC_USE_LOCALE) if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
{ {
str = wxGetTranslation(str); str = wxGetTranslation(str);
if ( !tooltip.empty() ) if ( !tooltip.empty() )
tooltip = wxGetTranslation(tooltip); tooltip = wxGetTranslation(tooltip);
if ( hasHelptext )
helptext = wxGetTranslation(helptext);
} }
labels.push_back(str); labels.push_back(str);
tooltips.push_back(tooltip); tooltips.push_back(tooltip);
helptexts.push_back(helptext);
helptextSpecified.push_back(hasHelptext);
return NULL; return NULL;
} }