X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e06b95691f1cc89509100700985101c34da7759e..8e907a13eae0ef1cd0eb4a318c824ba095a64684:/src/generic/treectrl.cpp diff --git a/src/generic/treectrl.cpp b/src/generic/treectrl.cpp index 09a31f1449..b4bf898049 100644 --- a/src/generic/treectrl.cpp +++ b/src/generic/treectrl.cpp @@ -1072,13 +1072,36 @@ void wxTreeCtrl::DeleteChildren(const wxTreeItemId& itemId) void wxTreeCtrl::Delete(const wxTreeItemId& itemId) { wxGenericTreeItem *item = itemId.m_pItem; - wxGenericTreeItem *parent = item->GetParent(); + // don't stay with invalid m_key_current or we will crash in the next call + // to OnChar() + bool changeKeyCurrent = FALSE; + wxGenericTreeItem *itemKey = m_key_current; + while ( itemKey && !changeKeyCurrent ) + { + if ( itemKey == item ) + { + // m_key_current is a descendant of the item being deleted + changeKeyCurrent = TRUE; + } + else + { + itemKey = itemKey->GetParent(); + } + } + + wxGenericTreeItem *parent = item->GetParent(); if ( parent ) { parent->GetChildren().Remove( item ); // remove by value } + if ( changeKeyCurrent ) + { + // may be NULL or not + m_key_current = parent; + } + item->DeleteChildren(this); SendDeleteEvent(item); delete item; @@ -1331,7 +1354,12 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& itemId, // shift press if (extended_select) { - if (m_current == NULL) m_current=m_key_current=GetRootItem().m_pItem; + if ( !m_current ) + { + m_current = + m_key_current = GetRootItem().m_pItem; + } + // don't change the mark (m_current) SelectItemRange(m_current, item); } @@ -1496,10 +1524,12 @@ void wxTreeCtrl::SetImageList(wxImageList *imageList) { m_imageListNormal = imageList; + if ( !m_imageListNormal ) + return; + // Calculate a m_lineHeight value from the image sizes. // May be toggle off. Then wxTreeCtrl will spread when // necessary (which might look ugly). -#if 1 wxClientDC dc(this); m_lineHeight = (int)(dc.GetCharHeight() + 4); int width = 0, height = 0, @@ -1515,7 +1545,6 @@ void wxTreeCtrl::SetImageList(wxImageList *imageList) m_lineHeight += 2; // at least 2 pixels else m_lineHeight += m_lineHeight/10; // otherwise 10% extra spacing -#endif } void wxTreeCtrl::SetStateImageList(wxImageList *imageList) @@ -1571,8 +1600,15 @@ void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc) int image = item->GetCurrentImage(); if ( image != NO_IMAGE ) { - m_imageListNormal->GetSize( image, image_w, image_h ); - image_w += 4; + if ( m_imageListNormal ) + { + m_imageListNormal->GetSize( image, image_w, image_h ); + image_w += 4; + } + else + { + image = NO_IMAGE; + } } int total_h = GetLineHeight(item); @@ -1943,7 +1979,6 @@ void wxTreeCtrl::OnChar( wxKeyEvent &event ) else { wxTreeItemId next = GetNextSibling( m_key_current ); -// if (next == 0) if (!next) { wxTreeItemId current = m_key_current; @@ -1953,7 +1988,6 @@ void wxTreeCtrl::OnChar( wxKeyEvent &event ) if (current) next = GetNextSibling( current ); } } -// if (next != 0) if (next) { SelectItem( next, unselect_others, extended_select ); @@ -2062,8 +2096,15 @@ void wxTreeCtrl::Edit( const wxTreeItemId& item ) int image = m_currentEdit->GetCurrentImage(); if ( image != NO_IMAGE ) { - m_imageListNormal->GetSize( image, image_w, image_h ); - image_w += 4; + if ( m_imageListNormal ) + { + m_imageListNormal->GetSize( image, image_w, image_h ); + image_w += 4; + } + else + { + wxFAIL_MSG(_T("you must create an image list to use images!")); + } } x += image_w; w -= image_w + 4; // I don't know why +4 is needed @@ -2304,8 +2345,11 @@ void wxTreeCtrl::CalculateSize( wxGenericTreeItem *item, wxDC &dc ) int image = item->GetCurrentImage(); if ( image != NO_IMAGE ) { - m_imageListNormal->GetSize( image, image_w, image_h ); - image_w += 4; + if ( m_imageListNormal ) + { + m_imageListNormal->GetSize( image, image_w, image_h ); + image_w += 4; + } } int total_h = (image_h > text_h) ? image_h : text_h;