+void wxTreeCtrlBase::SetItemState(const wxTreeItemId& item, int state)
+{
+ if ( state == wxTREE_ITEMSTATE_NEXT )
+ {
+ int current = GetItemState(item);
+ if ( current == wxTREE_ITEMSTATE_NONE )
+ return;
+ state = current + 1;
+ if ( m_imageListState && state >= m_imageListState->GetImageCount() )
+ state = 0;
+ }
+ else if ( state == wxTREE_ITEMSTATE_PREV )
+ {
+ int current = GetItemState(item);
+ if ( current == wxTREE_ITEMSTATE_NONE )
+ return;
+ state = current - 1;
+ if ( state == -1 )
+ state = m_imageListState ? m_imageListState->GetImageCount() - 1 : 0;
+ }
+ // else: wxTREE_ITEMSTATE_NONE depending on platform
+
+ DoSetItemState(item, state);
+}
+
+static void
+wxGetBestTreeSize(const wxTreeCtrlBase* treeCtrl, wxTreeItemId id, wxSize& size)
+{
+ wxRect rect;
+
+ if ( treeCtrl->GetBoundingRect(id, rect, true /* just the item */) )
+ {
+ // Translate to logical position so we get the full extent
+#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
+ rect.x += treeCtrl->GetScrollPos(wxHORIZONTAL);
+ rect.y += treeCtrl->GetScrollPos(wxVERTICAL);
+#endif
+
+ size.IncTo(wxSize(rect.GetRight(), rect.GetBottom()));
+ }
+
+ wxTreeItemIdValue cookie;
+ for ( wxTreeItemId item = treeCtrl->GetFirstChild(id, cookie);
+ item.IsOk();
+ item = treeCtrl->GetNextChild(id, cookie) )
+ {
+ wxGetBestTreeSize(treeCtrl, item, size);
+ }
+}
+