Apply choice patch for proper handling of clearing

wxChoice (it reported a selection value of 0)


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30873 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2004-12-06 12:47:06 +00:00
parent 6372b068b2
commit 16edee16a7
4 changed files with 104 additions and 0 deletions

View File

@ -104,6 +104,10 @@ private:
// allocate it if it's needed (hence using pointer)
wxSortedArrayString *m_strings;
// this circumvents a GTK+ 2.0 bug so that the selection is
// invalidated properly
int m_selection_hack;
DECLARE_DYNAMIC_CLASS(wxChoice)
};

View File

@ -104,6 +104,10 @@ private:
// allocate it if it's needed (hence using pointer)
wxSortedArrayString *m_strings;
// this circumvents a GTK+ 2.0 bug so that the selection is
// invalidated properly
int m_selection_hack;
DECLARE_DYNAMIC_CLASS(wxChoice)
};

View File

@ -111,6 +111,9 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id,
m_strings = new wxSortedArrayString;
}
// begin with no selection
m_selection_hack = wxNOT_FOUND;
GtkWidget *menu = gtk_menu_new();
for (int i = 0; i < n; i++)
@ -154,6 +157,13 @@ int wxChoice::DoInsert( const wxString &item, int pos )
GtkWidget *menu = gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) );
// if the item to insert is at or before the selection, and the selection is valid
if ((pos <= m_selection_hack) && (m_selection_hack != wxNOT_FOUND))
{
// move the selection forward one
m_selection_hack++;
}
return GtkAddHelper(menu, pos, item);
}
@ -224,6 +234,9 @@ void wxChoice::Clear()
if ( m_strings )
m_strings->Clear();
// begin with no selection
m_selection_hack = wxNOT_FOUND;
}
void wxChoice::Delete( int n )
@ -237,6 +250,18 @@ void wxChoice::Delete( int n )
wxCHECK_RET( n >= 0 && n < count, _T("invalid index in wxChoice::Delete") );
// if the item to delete is before the selection, and the selection is valid
if ((n < m_selection_hack) && (m_selection_hack != wxNOT_FOUND))
{
// move the selection back one
m_selection_hack--;
}
else if (n == m_selection_hack)
{
// invalidate the selection
m_selection_hack = wxNOT_FOUND;
}
const bool hasClientData = m_clientDataItemsType != wxClientData_None;
const bool hasObjectData = m_clientDataItemsType == wxClientData_Object;
@ -329,6 +354,10 @@ int wxChoice::GetSelection() const
{
wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid choice") );
// this has the same (if not better) behaviour as the following commented code
return m_selection_hack;
/*
#ifdef __WXGTK20__
return gtk_option_menu_get_history( GTK_OPTION_MENU(m_widget) );
@ -348,6 +377,7 @@ int wxChoice::GetSelection() const
return -1;
#endif
*/
}
void wxChoice::SetString( int n, const wxString& str )
@ -435,6 +465,24 @@ void wxChoice::SetSelection( int n )
int tmp = n;
gtk_option_menu_set_history( GTK_OPTION_MENU(m_widget), (gint)tmp );
// set the local selection variable manually
if ((n >= 0) && (n < GetCount()))
{
// a valid selection has been made
m_selection_hack = n;
}
else if ((n == wxNOT_FOUND) || (GetCount() == 0))
{
// invalidates the selection if there are no items
// or if it is specifically set to wxNOT_FOUND
m_selection_hack = wxNOT_FOUND;
}
else
{
// this selects the first item by default if the selection is out of bounds
m_selection_hack = 0;
}
}
void wxChoice::DoApplyWidgetStyle(GtkRcStyle *style)

View File

@ -111,6 +111,9 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id,
m_strings = new wxSortedArrayString;
}
// begin with no selection
m_selection_hack = wxNOT_FOUND;
GtkWidget *menu = gtk_menu_new();
for (int i = 0; i < n; i++)
@ -154,6 +157,13 @@ int wxChoice::DoInsert( const wxString &item, int pos )
GtkWidget *menu = gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) );
// if the item to insert is at or before the selection, and the selection is valid
if ((pos <= m_selection_hack) && (m_selection_hack != wxNOT_FOUND))
{
// move the selection forward one
m_selection_hack++;
}
return GtkAddHelper(menu, pos, item);
}
@ -224,6 +234,9 @@ void wxChoice::Clear()
if ( m_strings )
m_strings->Clear();
// begin with no selection
m_selection_hack = wxNOT_FOUND;
}
void wxChoice::Delete( int n )
@ -237,6 +250,18 @@ void wxChoice::Delete( int n )
wxCHECK_RET( n >= 0 && n < count, _T("invalid index in wxChoice::Delete") );
// if the item to delete is before the selection, and the selection is valid
if ((n < m_selection_hack) && (m_selection_hack != wxNOT_FOUND))
{
// move the selection back one
m_selection_hack--;
}
else if (n == m_selection_hack)
{
// invalidate the selection
m_selection_hack = wxNOT_FOUND;
}
const bool hasClientData = m_clientDataItemsType != wxClientData_None;
const bool hasObjectData = m_clientDataItemsType == wxClientData_Object;
@ -329,6 +354,10 @@ int wxChoice::GetSelection() const
{
wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid choice") );
// this has the same (if not better) behaviour as the following commented code
return m_selection_hack;
/*
#ifdef __WXGTK20__
return gtk_option_menu_get_history( GTK_OPTION_MENU(m_widget) );
@ -348,6 +377,7 @@ int wxChoice::GetSelection() const
return -1;
#endif
*/
}
void wxChoice::SetString( int n, const wxString& str )
@ -435,6 +465,24 @@ void wxChoice::SetSelection( int n )
int tmp = n;
gtk_option_menu_set_history( GTK_OPTION_MENU(m_widget), (gint)tmp );
// set the local selection variable manually
if ((n >= 0) && (n < GetCount()))
{
// a valid selection has been made
m_selection_hack = n;
}
else if ((n == wxNOT_FOUND) || (GetCount() == 0))
{
// invalidates the selection if there are no items
// or if it is specifically set to wxNOT_FOUND
m_selection_hack = wxNOT_FOUND;
}
else
{
// this selects the first item by default if the selection is out of bounds
m_selection_hack = 0;
}
}
void wxChoice::DoApplyWidgetStyle(GtkRcStyle *style)