X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9b00bb1626a28272e58728633f431c0c2996cd2d..599a97e9ab9d9c1fca761d501ef101595e0ae486:/src/generic/treectrl.cpp diff --git a/src/generic/treectrl.cpp b/src/generic/treectrl.cpp index 36f8be5bfa..151c9b78d3 100644 --- a/src/generic/treectrl.cpp +++ b/src/generic/treectrl.cpp @@ -263,8 +263,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxTreeEvent, wxNotifyEvent) wxTreeEvent::wxTreeEvent( wxEventType commandType, int id ) : wxNotifyEvent( commandType, id ) { - m_code = 0; - m_itemOld = (wxGenericTreeItem *)NULL; + m_code = 0; + m_itemOld = (wxGenericTreeItem *)NULL; } // ----------------------------------------------------------------------------- @@ -278,124 +278,120 @@ wxGenericTreeItem::wxGenericTreeItem(wxGenericTreeItem *parent, wxTreeItemData *data) : m_text(text) { - m_images[wxTreeItemIcon_Normal] = image; - m_images[wxTreeItemIcon_Selected] = selImage; - m_images[wxTreeItemIcon_Expanded] = NO_IMAGE; - m_images[wxTreeItemIcon_SelectedExpanded] = NO_IMAGE; + m_images[wxTreeItemIcon_Normal] = image; + m_images[wxTreeItemIcon_Selected] = selImage; + m_images[wxTreeItemIcon_Expanded] = NO_IMAGE; + m_images[wxTreeItemIcon_SelectedExpanded] = NO_IMAGE; - m_data = data; - m_x = m_y = 0; - m_xCross = m_yCross = 0; + m_data = data; + m_x = m_y = 0; + m_xCross = m_yCross = 0; - m_level = 0; + m_level = 0; - m_isCollapsed = TRUE; - m_hasHilight = FALSE; - m_hasPlus = FALSE; - m_isBold = FALSE; + m_isCollapsed = TRUE; + m_hasHilight = FALSE; + m_hasPlus = FALSE; + m_isBold = FALSE; - m_parent = parent; + m_parent = parent; - m_attr = (wxTreeItemAttr *)NULL; - - dc.GetTextExtent( m_text, &m_width, &m_height ); - // TODO : Add the width of the image - // PB : We don't know which image is shown (image, selImage) - // We don't even know imageList from the treectrl this item belongs to !!! - // At this point m_width doesn't mean much, this can be remove ! + m_attr = (wxTreeItemAttr *)NULL; + + // We don't know the height here yet. + m_width = 0; + m_height = 0; } wxGenericTreeItem::~wxGenericTreeItem() { - delete m_data; + delete m_data; - delete m_attr; + delete m_attr; - wxASSERT_MSG( m_children.IsEmpty(), - wxT("please call DeleteChildren() before deleting the item") ); + wxASSERT_MSG( m_children.IsEmpty(), + wxT("please call DeleteChildren() before deleting the item") ); } void wxGenericTreeItem::DeleteChildren(wxTreeCtrl *tree) { - size_t count = m_children.Count(); - for ( size_t n = 0; n < count; n++ ) - { - wxGenericTreeItem *child = m_children[n]; - if ( tree ) + size_t count = m_children.Count(); + for ( size_t n = 0; n < count; n++ ) { - tree->SendDeleteEvent(child); - } + wxGenericTreeItem *child = m_children[n]; + if (tree) + tree->SendDeleteEvent(child); - child->DeleteChildren(tree); - delete child; - } + child->DeleteChildren(tree); + delete child; + } - m_children.Empty(); + m_children.Empty(); } void wxGenericTreeItem::SetText( const wxString &text ) { - m_text = text; + m_text = text; } void wxGenericTreeItem::Reset() { - m_text.Empty(); - for ( int i = 0; i < wxTreeItemIcon_Max; i++ ) - { - m_images[i] = NO_IMAGE; - } + m_text.Empty(); + for ( int i = 0; i < wxTreeItemIcon_Max; i++ ) + { + m_images[i] = NO_IMAGE; + } - m_data = NULL; - m_x = m_y = - m_height = m_width = 0; - m_xCross = - m_yCross = 0; + m_data = NULL; + m_x = m_y = + m_height = m_width = 0; + m_xCross = + m_yCross = 0; - m_level = 0; + m_level = 0; - DeleteChildren(); - m_isCollapsed = TRUE; + DeleteChildren(); + m_isCollapsed = TRUE; - m_parent = (wxGenericTreeItem *)NULL; + m_parent = (wxGenericTreeItem *)NULL; } size_t wxGenericTreeItem::GetChildrenCount(bool recursively) const { - size_t count = m_children.Count(); - if ( !recursively ) - return count; + size_t count = m_children.Count(); + if ( !recursively ) + return count; - size_t total = count; - for ( size_t n = 0; n < count; ++n ) - { - total += m_children[n]->GetChildrenCount(); - } + size_t total = count; + for ( size_t n = 0; n < count; ++n ) + { + total += m_children[n]->GetChildrenCount(); + } - return total; + return total; } void wxGenericTreeItem::SetCross( int x, int y ) { - m_xCross = x; - m_yCross = y; + m_xCross = x; + m_yCross = y; } void wxGenericTreeItem::GetSize( int &x, int &y, const wxTreeCtrl *theTree ) { - int bottomY=m_y+theTree->GetLineHeight(this); - if ( y < bottomY ) y = bottomY; - int width = m_x + m_width; - if ( x < width ) x = width; + int bottomY=m_y+theTree->GetLineHeight(this); + if ( y < bottomY ) y = bottomY; + int width = m_x + m_width; + if ( x < width ) x = width; - if (IsExpanded()) - { - size_t count = m_children.Count(); - for ( size_t n = 0; n < count; ++n ) + if (IsExpanded()) { - m_children[n]->GetSize( x, y, theTree ); + size_t count = m_children.Count(); + for ( size_t n = 0; n < count; ++n ) + { + m_children[n]->GetSize( x, y, theTree ); + } } - } } wxGenericTreeItem *wxGenericTreeItem::HitTest( const wxPoint& point, @@ -500,12 +496,12 @@ int wxGenericTreeItem::GetCurrentImage() const IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxScrolledWindow) BEGIN_EVENT_TABLE(wxTreeCtrl,wxScrolledWindow) - EVT_PAINT (wxTreeCtrl::OnPaint) - EVT_MOUSE_EVENTS (wxTreeCtrl::OnMouse) - EVT_CHAR (wxTreeCtrl::OnChar) - EVT_SET_FOCUS (wxTreeCtrl::OnSetFocus) - EVT_KILL_FOCUS (wxTreeCtrl::OnKillFocus) - EVT_IDLE (wxTreeCtrl::OnIdle) + EVT_PAINT (wxTreeCtrl::OnPaint) + EVT_MOUSE_EVENTS (wxTreeCtrl::OnMouse) + EVT_CHAR (wxTreeCtrl::OnChar) + EVT_SET_FOCUS (wxTreeCtrl::OnSetFocus) + EVT_KILL_FOCUS (wxTreeCtrl::OnKillFocus) + EVT_IDLE (wxTreeCtrl::OnIdle) END_EVENT_TABLE() // ----------------------------------------------------------------------------- @@ -514,33 +510,33 @@ END_EVENT_TABLE() void wxTreeCtrl::Init() { - m_current = - m_key_current = - m_anchor = (wxGenericTreeItem *) NULL; - m_hasFocus = FALSE; - m_dirty = FALSE; + m_current = + m_key_current = + m_anchor = (wxGenericTreeItem *) NULL; + m_hasFocus = FALSE; + m_dirty = FALSE; - m_xScroll = 0; - m_yScroll = 0; - m_lineHeight = 10; - m_indent = 15; - m_spacing = 18; + m_xScroll = 0; + m_yScroll = 0; + m_lineHeight = 10; + m_indent = 15; + m_spacing = 18; - m_hilightBrush = new wxBrush + m_hilightBrush = new wxBrush ( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT), wxSOLID ); - m_imageListNormal = - m_imageListState = (wxImageList *) NULL; + m_imageListNormal = + m_imageListState = (wxImageList *) NULL; - m_dragCount = 0; + m_dragCount = 0; - m_renameTimer = new wxTreeRenameTimer( this ); + m_renameTimer = new wxTreeRenameTimer( this ); - m_normalFont = wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT ); - m_boldFont = wxFont( m_normalFont.GetPointSize(), + m_normalFont = wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT ); + m_boldFont = wxFont( m_normalFont.GetPointSize(), m_normalFont.GetFamily(), m_normalFont.GetStyle(), wxBOLD, @@ -555,28 +551,28 @@ bool wxTreeCtrl::Create(wxWindow *parent, wxWindowID id, #endif const wxString& name ) { - Init(); + Init(); - wxScrolledWindow::Create( parent, id, pos, size, style|wxHSCROLL|wxVSCROLL, name ); + wxScrolledWindow::Create( parent, id, pos, size, style|wxHSCROLL|wxVSCROLL, name ); #if wxUSE_VALIDATORS - SetValidator( validator ); + SetValidator( validator ); #endif - SetBackgroundColour( *wxWHITE ); -// m_dottedPen = wxPen( "grey", 0, wxDOT ); - m_dottedPen = wxPen( "grey", 0, 0 ); + SetBackgroundColour( *wxWHITE ); +// m_dottedPen = wxPen( "grey", 0, wxDOT ); too slow under XFree86 + m_dottedPen = wxPen( "grey", 0, 0 ); - return TRUE; + return TRUE; } wxTreeCtrl::~wxTreeCtrl() { - wxDELETE( m_hilightBrush ); + wxDELETE( m_hilightBrush ); - DeleteAllItems(); + DeleteAllItems(); - delete m_renameTimer; + delete m_renameTimer; } // ----------------------------------------------------------------------------- @@ -1078,46 +1074,51 @@ void wxTreeCtrl::Collapse(const wxTreeItemId& itemId) void wxTreeCtrl::CollapseAndReset(const wxTreeItemId& item) { - Collapse(item); - DeleteChildren(item); + Collapse(item); + DeleteChildren(item); } void wxTreeCtrl::Toggle(const wxTreeItemId& itemId) { - wxGenericTreeItem *item = itemId.m_pItem; + wxGenericTreeItem *item = itemId.m_pItem; - if ( item->IsExpanded() ) - Collapse(itemId); - else - Expand(itemId); + if (item->IsExpanded()) + Collapse(itemId); + else + Expand(itemId); } void wxTreeCtrl::Unselect() { - if ( m_current ) - { - m_current->SetHilight( FALSE ); - RefreshLine( m_current ); - } + if (m_current) + { + m_current->SetHilight( FALSE ); + RefreshLine( m_current ); + } } void wxTreeCtrl::UnselectAllChildren(wxGenericTreeItem *item) { - item->SetHilight(FALSE); - RefreshLine(item); + if (item->IsSelected()) + { + item->SetHilight(FALSE); + RefreshLine(item); + } - if (item->HasChildren()) + if (item->HasChildren()) { - wxArrayGenericTreeItems& children = item->GetChildren(); - size_t count = children.Count(); - for ( size_t n = 0; n < count; ++n ) - UnselectAllChildren(children[n]); + wxArrayGenericTreeItems& children = item->GetChildren(); + size_t count = children.Count(); + for ( size_t n = 0; n < count; ++n ) + { + UnselectAllChildren(children[n]); + } } } void wxTreeCtrl::UnselectAll() { - UnselectAllChildren(GetRootItem().m_pItem); + UnselectAllChildren(GetRootItem().m_pItem); } // Recursive function ! @@ -1130,8 +1131,8 @@ bool wxTreeCtrl::TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem { wxGenericTreeItem *parent = crt_item->GetParent(); - if ( parent == NULL ) // This is root item - return TagAllChildrenUntilLast(crt_item, last_item, select); + if (parent == NULL) // This is root item + return TagAllChildrenUntilLast(crt_item, last_item, select); wxArrayGenericTreeItems& children = parent->GetChildren(); int index = children.Index(crt_item); @@ -1139,24 +1140,30 @@ bool wxTreeCtrl::TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem size_t count = children.Count(); for (size_t n=(size_t)(index+1); nSetHilight(select); - RefreshLine(crt_item); + crt_item->SetHilight(select); + RefreshLine(crt_item); - if (crt_item==last_item) return TRUE; + if (crt_item==last_item) + return TRUE; - if (crt_item->HasChildren()) + if (crt_item->HasChildren()) { - wxArrayGenericTreeItems& children = crt_item->GetChildren(); - size_t count = children.Count(); - for ( size_t n = 0; n < count; ++n ) - if (TagAllChildrenUntilLast(children[n], last_item, select)) return TRUE; + wxArrayGenericTreeItems& children = crt_item->GetChildren(); + size_t count = children.Count(); + for ( size_t n = 0; n < count; ++n ) + { + if (TagAllChildrenUntilLast(children[n], last_item, select)) + return TRUE; + } } return FALSE; @@ -1327,21 +1334,23 @@ void wxTreeCtrl::ScrollTo(const wxTreeItemId &item) int y = 0; m_anchor->GetSize( x, y, this ); y += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + x += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels int x_pos = GetScrollPos( wxHORIZONTAL ); // Item should appear at top SetScrollbars( PIXELS_PER_UNIT, PIXELS_PER_UNIT, x/PIXELS_PER_UNIT, y/PIXELS_PER_UNIT, x_pos, item_y/PIXELS_PER_UNIT ); } else if (item_y+GetLineHeight(gitem) > start_y+client_h) { - // going up - int x = 0; - int y = 0; - m_anchor->GetSize( x, y, this ); - y += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels - item_y += PIXELS_PER_UNIT+2; - int x_pos = GetScrollPos( wxHORIZONTAL ); + // going up + int x = 0; + int y = 0; + m_anchor->GetSize( x, y, this ); + y += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + x += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + item_y += PIXELS_PER_UNIT+2; + int x_pos = GetScrollPos( wxHORIZONTAL ); // Item should appear at bottom - SetScrollbars( PIXELS_PER_UNIT, PIXELS_PER_UNIT, x/PIXELS_PER_UNIT, y/PIXELS_PER_UNIT, x_pos, (item_y+GetLineHeight(gitem)-client_h)/PIXELS_PER_UNIT ); + SetScrollbars( PIXELS_PER_UNIT, PIXELS_PER_UNIT, x/PIXELS_PER_UNIT, y/PIXELS_PER_UNIT, x_pos, (item_y+GetLineHeight(gitem)-client_h)/PIXELS_PER_UNIT ); } } @@ -1413,7 +1422,7 @@ void wxTreeCtrl::SetImageList(wxImageList *imageList) if(height > m_lineHeight) m_lineHeight = height; } - if (m_lineHeight<40) m_lineHeight+=4; // at least 4 pixels (odd such that a line can be drawn in between) + if (m_lineHeight<40) m_lineHeight+=2; // at least 4 pixels (odd such that a line can be drawn in between) else m_lineHeight+=m_lineHeight/10; // otherwise 10% extra spacing #endif @@ -1435,8 +1444,8 @@ void wxTreeCtrl::AdjustMyScrollbars() int x = 0; int y = 0; m_anchor->GetSize( x, y, this ); - //y += GetLineHeight(m_anchor); y += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + x += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels int x_pos = GetScrollPos( wxHORIZONTAL ); int y_pos = GetScrollPos( wxVERTICAL ); SetScrollbars( PIXELS_PER_UNIT, PIXELS_PER_UNIT, x/PIXELS_PER_UNIT, y/PIXELS_PER_UNIT, x_pos, y_pos ); @@ -2077,7 +2086,7 @@ void wxTreeCtrl::CalculateSize( wxGenericTreeItem *item, wxDC &dc ) int total_h = (image_h > text_h) ? image_h : text_h; - if (total_h<40) total_h+=4; // at least 4 pixels + if (total_h<40) total_h+=2; // at least 4 pixels else total_h+=total_h/10; // otherwise 10% extra spacing item->SetHeight(total_h);