X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3cbab64109b007fa1d939fe588f5e79f9105b915..143591e943c40bd8264cca2a70d8d8688b224ba7:/src/gtk1/listbox.cpp?ds=sidebyside diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index f88efbcf38..8828edc2a3 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -10,21 +10,23 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/defs.h" - #if wxUSE_LISTBOX #include "wx/listbox.h" -#include "wx/dynarray.h" -#include "wx/arrstr.h" -#include "wx/utils.h" -#include "wx/intl.h" -#include "wx/checklst.h" -#include "wx/settings.h" + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" + #include "wx/intl.h" + #include "wx/utils.h" + #include "wx/settings.h" + #include "wx/checklst.h" + #include "wx/arrstr.h" +#endif + #include "wx/gtk1/private.h" #if wxUSE_TOOLTIPS -#include "wx/tooltip.h" + #include "wx/tooltip.h" #endif #include @@ -49,7 +51,7 @@ extern wxWindowGTK *g_delayedFocus; extern wxWindowGTK *g_focusWindow; extern wxWindowGTK *g_focusWindowLast; -static bool g_hasDoubleClicked = FALSE; +static bool g_hasDoubleClicked = false; //----------------------------------------------------------------------------- // idle callback for SetFirstItem @@ -73,7 +75,7 @@ static gint wxlistbox_idle_callback( gpointer gdata ) // check that the items haven't been deleted from the listbox since we had // installed this callback wxListBox *lbox = data->m_listbox; - if ( data->m_item < lbox->GetCount() ) + if ( data->m_item < (int)lbox->GetCount() ) { lbox->SetFirstItem( data->m_item ); } @@ -105,7 +107,7 @@ static gint gtk_listitem_focus_in_callback( GtkWidget *widget, if ( !win->m_hasFocus ) { // not yet, notify it - win->m_hasFocus = TRUE; + win->m_hasFocus = true; wxChildFocusEvent eventChildFocus(win); (void)win->GetEventHandler()->ProcessEvent(eventChildFocus); @@ -136,7 +138,7 @@ static gint gtk_listitem_focus_out_callback( GtkWidget *widget, GdkEventFocus *g // have focus already if ( win->m_hasFocus ) { - win->m_hasFocus = FALSE; + win->m_hasFocus = false; wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() ); event.SetEventObject( win ); @@ -241,14 +243,14 @@ gtk_listbox_button_press_callback( GtkWidget *widget, (((listbox->GetWindowStyleFlag() & wxLB_MULTIPLE) != 0) || ((listbox->GetWindowStyleFlag() & wxLB_EXTENDED) != 0)) ) { - listbox->m_blockEvent = TRUE; + listbox->m_blockEvent = true; int i; for (i = 0; i < (int)listbox->GetCount(); i++) if (i != sel) gtk_list_unselect_item( GTK_LIST(listbox->m_list), i ); - listbox->m_blockEvent = FALSE; + listbox->m_blockEvent = false; return false; } @@ -274,7 +276,7 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis if (g_blockEventsOnDrag) return FALSE; - bool ret = FALSE; + bool ret = false; if ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) { @@ -290,7 +292,7 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis if ((gdk_event->keyval == GDK_Return) && (!ret)) { // eat return in all modes - ret = TRUE; + ret = true; } #if wxUSE_CHECKLISTBOX @@ -318,7 +320,7 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis if (sel != -1) { - ret = TRUE; + ret = true; if (listbox->IsSelected( sel )) gtk_list_unselect_item( listbox->m_list, sel ); @@ -448,7 +450,7 @@ gtk_listbox_realized_callback( GtkWidget *m_widget, wxListBox *win ) // wxListBox //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxListBox,wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControlWithItems) // ---------------------------------------------------------------------------- // construction @@ -458,7 +460,7 @@ wxListBox::wxListBox() { m_list = (GtkList *) NULL; #if wxUSE_CHECKLISTBOX - m_hasCheckBoxes = FALSE; + m_hasCheckBoxes = false; #endif // wxUSE_CHECKLISTBOX } @@ -480,16 +482,16 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, long style, const wxValidator& validator, const wxString &name ) { - m_needParent = TRUE; - m_acceptsFocus = TRUE; + m_needParent = true; + m_acceptsFocus = true; m_prevSelection = 0; // or -1 ?? - m_blockEvent = FALSE; + m_blockEvent = false; if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator, name )) { wxFAIL_MSG( wxT("wxListBox creation failed") ); - return FALSE; + return false; } m_widget = gtk_scrolled_window_new( (GtkAdjustment*) NULL, (GtkAdjustment*) NULL ); @@ -539,7 +541,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, if ( style & wxLB_SORT ) { - // this will change DoAppend() behaviour + // this will change Append() behaviour m_strings = new wxSortedArrayString; } else @@ -547,23 +549,19 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, m_strings = (wxSortedArrayString *)NULL; } - for (int i = 0; i < n; i++) - { - // add one by one - DoAppend(choices[i]); - } + Append(n, choices); m_parent->DoAddChild( this ); PostCreation(size); - SetBestSize(size); // need this too because this is a wxControlWithItems + SetInitialSize(size); // need this too because this is a wxControlWithItems - return TRUE; + return true; } wxListBox::~wxListBox() { - m_hasVMT = FALSE; + m_hasVMT = false; Clear(); @@ -575,101 +573,44 @@ wxListBox::~wxListBox() // adding items // ---------------------------------------------------------------------------- -void wxListBox::DoInsertItems(const wxArrayString& items, int pos) +int wxListBox::DoInsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData, + wxClientDataType type) { - wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); + wxCHECK_MSG( m_list != NULL, wxNOT_FOUND, wxT("invalid listbox") ); - // VZ: notice that InsertItems knows nothing about sorting, so calling it - // from outside (and not from our own Append) is likely to break - // everything + const unsigned count = GetCount(); + wxCHECK_MSG( pos <= count, wxNOT_FOUND, + wxT("invalid index in wxListBox::InsertItems") ); // code elsewhere supposes we have as many items in m_clientList as items // in the listbox - wxASSERT_MSG( m_clientList.GetCount() == (size_t)GetCount(), - wxT("bug in client data management") ); + wxASSERT_MSG( m_clientList.GetCount() == count, + wxT("bug in client data management") ); InvalidateBestSize(); - GList *children = m_list->children; - int length = g_list_length(children); - - wxCHECK_RET( pos <= length, wxT("invalid index in wxListBox::InsertItems") ); - - size_t nItems = items.GetCount(); - int index; + const unsigned numItems = items.GetCount(); - if (m_strings) - { - for (size_t n = 0; n < nItems; n++) - { - index = m_strings->Add( items[n] ); - - if (index != GetCount()) - { - GtkAddItem( items[n], index ); - wxList::compatibility_iterator node = m_clientList.Item( index ); - m_clientList.Insert( node, (wxObject*) NULL ); - } - else - { - GtkAddItem( items[n] ); - m_clientList.Append( (wxObject*) NULL ); - } - } - } - else + for ( unsigned int n = 0; n < numItems; ++n, ++pos ) { - if (pos == length) - { - for ( size_t n = 0; n < nItems; n++ ) - { - GtkAddItem( items[n] ); - - m_clientList.Append((wxObject *)NULL); - } - } - else - { - wxList::compatibility_iterator node = m_clientList.Item( pos ); - for ( size_t n = 0; n < nItems; n++ ) - { - GtkAddItem( items[n], pos+n ); + const wxString& item = items[n]; - m_clientList.Insert( node, (wxObject *)NULL ); - } - } - } - - wxASSERT_MSG( m_clientList.GetCount() == (size_t)GetCount(), - wxT("bug in client data management") ); -} - -int wxListBox::DoAppend( const wxString& item ) -{ - InvalidateBestSize(); - - if (m_strings) - { - // need to determine the index - int index = m_strings->Add( item ); + const unsigned idx = m_strings ? m_strings->Add(item) + : pos; - // only if not at the end anyway - if (index != GetCount()) - { - GtkAddItem( item, index ); + GtkAddItem(item, idx == GetCount() ? (unsigned) -1 : idx); - wxList::compatibility_iterator node = m_clientList.Item( index ); - m_clientList.Insert( node, (wxObject *)NULL ); + m_clientList.Insert(idx, NULL); - return index; - } + AssignNewItemClientData(idx, clientData, n, type); } - GtkAddItem(item); - - m_clientList.Append((wxObject *)NULL); + wxASSERT_MSG( m_clientList.GetCount() == GetCount(), + wxT("bug in client data management") ); - return GetCount() - 1; + return pos - 1; } void wxListBox::GtkAddItem( const wxString &item, int pos ) @@ -750,32 +691,15 @@ void wxListBox::GtkAddItem( const wxString &item, int pos ) } } -void wxListBox::DoSetItems( const wxArrayString& items, - void **clientData) -{ - Clear(); - - DoInsertItems(items, 0); - - if ( clientData ) - { - size_t count = items.GetCount(); - for ( size_t n = 0; n < count; n++ ) - { - SetClientData(n, clientData[n]); - } - } -} - // ---------------------------------------------------------------------------- // deleting items // ---------------------------------------------------------------------------- -void wxListBox::Clear() +void wxListBox::DoClear() { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); - gtk_list_clear_items( m_list, 0, GetCount() ); + gtk_list_clear_items( m_list, 0, (int)GetCount() ); if ( GTK_LIST(m_list)->last_focus_child != NULL ) { @@ -783,25 +707,13 @@ void wxListBox::Clear() GTK_LIST(m_list)->last_focus_child = NULL; } - if ( HasClientObjectData() ) - { - // destroy the data (due to Robert's idea of using wxList - // and not wxList we can't just say - // m_clientList.DeleteContents(TRUE) - this would crash! - wxList::compatibility_iterator node = m_clientList.GetFirst(); - while ( node ) - { - delete (wxClientData *)node->GetData(); - node = node->GetNext(); - } - } m_clientList.Clear(); if ( m_strings ) m_strings->Clear(); } -void wxListBox::Delete( int n ) +void wxListBox::DoDeleteOneItem(unsigned int n) { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); @@ -816,12 +728,6 @@ void wxListBox::Delete( int n ) wxList::compatibility_iterator node = m_clientList.Item( n ); if ( node ) { - if ( m_clientDataItemsType == wxClientData_Object ) - { - wxClientData *cd = (wxClientData*)node->GetData(); - delete cd; - } - m_clientList.Erase( node ); } @@ -833,7 +739,7 @@ void wxListBox::Delete( int n ) // client data // ---------------------------------------------------------------------------- -void wxListBox::DoSetItemClientData( int n, void* clientData ) +void wxListBox::DoSetItemClientData(unsigned int n, void* clientData) { wxCHECK_RET( m_widget != NULL, wxT("invalid listbox control") ); @@ -843,7 +749,7 @@ void wxListBox::DoSetItemClientData( int n, void* clientData ) node->SetData( (wxObject*) clientData ); } -void* wxListBox::DoGetItemClientData( int n ) const +void* wxListBox::DoGetItemClientData(unsigned int n) const { wxCHECK_MSG( m_widget != NULL, NULL, wxT("invalid listbox control") ); @@ -853,29 +759,6 @@ void* wxListBox::DoGetItemClientData( int n ) const return node->GetData(); } -void wxListBox::DoSetItemClientObject( int n, wxClientData* clientData ) -{ - wxCHECK_RET( m_widget != NULL, wxT("invalid listbox control") ); - - wxList::compatibility_iterator node = m_clientList.Item( n ); - wxCHECK_RET( node, wxT("invalid index in wxListBox::DoSetItemClientObject") ); - - // wxItemContainer already deletes data for us - - node->SetData( (wxObject*) clientData ); -} - -wxClientData* wxListBox::DoGetItemClientObject( int n ) const -{ - wxCHECK_MSG( m_widget != NULL, (wxClientData*) NULL, wxT("invalid listbox control") ); - - wxList::compatibility_iterator node = m_clientList.Item( n ); - wxCHECK_MSG( node, (wxClientData *)NULL, - wxT("invalid index in wxListBox::DoGetItemClientObject") ); - - return (wxClientData*) node->GetData(); -} - // ---------------------------------------------------------------------------- // string list access // ---------------------------------------------------------------------------- @@ -900,7 +783,7 @@ wxString wxListBox::GetRealLabel(GList *item) const return str; } -void wxListBox::SetString( int n, const wxString &string ) +void wxListBox::SetString(unsigned int n, const wxString &string) { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); @@ -925,7 +808,7 @@ void wxListBox::SetString( int n, const wxString &string ) } } -wxString wxListBox::GetString( int n ) const +wxString wxListBox::GetString(unsigned int n) const { wxCHECK_MSG( m_list != NULL, wxEmptyString, wxT("invalid listbox") ); @@ -940,9 +823,9 @@ wxString wxListBox::GetString( int n ) const return wxEmptyString; } -int wxListBox::GetCount() const +unsigned int wxListBox::GetCount() const { - wxCHECK_MSG( m_list != NULL, -1, wxT("invalid listbox") ); + wxCHECK_MSG( m_list != NULL, 0, wxT("invalid listbox") ); GList *children = m_list->children; return g_list_length(children); @@ -974,7 +857,7 @@ int wxListBox::FindString( const wxString &item, bool bCase ) const int wxListBox::GetSelection() const { - wxCHECK_MSG( m_list != NULL, -1, wxT("invalid listbox") ); + wxCHECK_MSG( m_list != NULL, wxNOT_FOUND, wxT("invalid listbox") ); GList *child = m_list->children; int count = 0; @@ -984,12 +867,12 @@ int wxListBox::GetSelection() const count++; child = child->next; } - return -1; + return wxNOT_FOUND; } int wxListBox::GetSelections( wxArrayInt& aSelections ) const { - wxCHECK_MSG( m_list != NULL, -1, wxT("invalid listbox") ); + wxCHECK_MSG( m_list != NULL, wxNOT_FOUND, wxT("invalid listbox") ); // get the number of selected items first GList *child = m_list->children; @@ -1019,11 +902,11 @@ int wxListBox::GetSelections( wxArrayInt& aSelections ) const bool wxListBox::IsSelected( int n ) const { - wxCHECK_MSG( m_list != NULL, FALSE, wxT("invalid listbox") ); + wxCHECK_MSG( m_list != NULL, false, wxT("invalid listbox") ); GList *target = g_list_nth( m_list->children, n ); - wxCHECK_MSG( target, FALSE, wxT("invalid listbox index") ); + wxCHECK_MSG( target, false, wxT("invalid listbox index") ); return (GTK_WIDGET(target->data)->state == GTK_STATE_SELECTED) ; } @@ -1032,7 +915,7 @@ void wxListBox::DoSetSelection( int n, bool select ) { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); - m_blockEvent = TRUE; + m_blockEvent = true; if (select) { @@ -1044,7 +927,7 @@ void wxListBox::DoSetSelection( int n, bool select ) else gtk_list_unselect_item( m_list, n ); - m_blockEvent = FALSE; + m_blockEvent = false; } void wxListBox::DoSetFirstItem( int n ) @@ -1124,22 +1007,22 @@ GtkWidget *wxListBox::GetConnectWidget() bool wxListBox::IsOwnGtkWindow( GdkWindow *window ) { - return TRUE; + return true; #if 0 - if (m_widget->window == window) return TRUE; + if (m_widget->window == window) return true; - if (GTK_WIDGET(m_list)->window == window) return TRUE; + if (GTK_WIDGET(m_list)->window == window) return true; GList *child = m_list->children; while (child) { GtkWidget *bin = GTK_WIDGET( child->data ); - if (bin->window == window) return TRUE; + if (bin->window == window) return true; child = child->next; } - return FALSE; + return false; #endif } @@ -1218,7 +1101,7 @@ wxSize wxListBox::DoGetBestSize() const int wLine; // Find the widest line - for(int i = 0; i < GetCount(); i++) { + for(unsigned int i = 0; i < GetCount(); i++) { wxString str(GetString(i)); GetTextExtent(str, &wLine, NULL); lbWidth = wxMax(lbWidth, wLine);