+ default:
+ wxFAIL_MSG( wxT("unexpected wxDirection value") );
+ return wxNOT_FOUND;
+ }
+
+ // ensure that the item is in range [0..count)
+ if ( item < 0 )
+ {
+ // first map the item to the one in the same column but in the last
+ // row
+ item += count;
+
+ // now there are 2 cases: either it is the first item of the last
+ // row in which case we need to wrap again and get to the last item
+ // or we can just go to the previous item
+ if ( item % (horz ? numCols : numRows) )
+ item--;
+ else
+ item = count - 1;
+ }
+ else if ( item >= count )
+ {
+ // same logic as above
+ item -= count;
+
+ // ... except that we need to check if this is not the last item,
+ // not the first one
+ if ( (item + 1) % (horz ? numCols : numRows) )
+ item++;
+ else
+ item = 0;
+ }
+
+ wxASSERT_MSG( item < count && item >= 0,
+ wxT("logic error in wxRadioBox::GetNextItem()") );
+ }
+ // we shouldn't select the non-active items, continue looking for a
+ // visible and shown one unless we came back to the item we started from in
+ // which case bail out to avoid infinite loop
+ while ( !(IsItemShown(item) && IsItemEnabled(item)) && item != itemStart );
+
+ return item;
+}
+
+#if wxUSE_TOOLTIPS
+
+void wxRadioBoxBase::SetItemToolTip(unsigned int item, const wxString& text)
+{
+ wxASSERT_MSG( item < GetCount(), wxT("Invalid item index") );
+
+ // extend the array to have entries for all our items on first use
+ if ( !m_itemsTooltips )
+ {
+ m_itemsTooltips = new wxToolTipArray;
+ m_itemsTooltips->resize(GetCount());
+ }
+
+ wxToolTip *tooltip = (*m_itemsTooltips)[item];
+
+ bool changed = true;
+ if ( text.empty() )
+ {
+ if ( tooltip )
+ {
+ // delete the tooltip
+ delete tooltip;
+ tooltip = NULL;
+ }
+ else // nothing to do
+ {
+ changed = false;
+ }
+ }
+ else // non empty tooltip text
+ {
+ if ( tooltip )
+ {
+ // just change the existing tooltip text, don't change the tooltip
+ tooltip->SetTip(text);
+ changed = false;
+ }
+ else // no tooltip yet
+ {
+ // create the new one
+ tooltip = new wxToolTip(text);
+ }