BList* BOutlineListView::_BuildTree(BListItem* underItem, int32& fullIndex) { int32 fullCount = FullListCountItems(); uint32 level = underItem != NULL ? underItem->OutlineLevel() + 1 : 0; BList* list = new BList; if (underItem != NULL) underItem->fTemporaryList = list; while (fullIndex < fullCount) { BListItem* item = FullListItemAt(fullIndex); // If we jump out of the subtree, break out if (item->fLevel < level) break; // If the level matches, put them into the list // (we handle the case of a missing sublevel gracefully) list->AddItem(item); fullIndex++; if (item->HasSubitems()) { // we're going deeper _BuildTree(item, fullIndex); } } return list; }
void BOutlineListView::_DestructTree(BList* tree) { for (int32 index = tree->CountItems(); index-- > 0;) { BListItem* item = (BListItem*)tree->ItemAt(index); if (item->HasSubitems()) _DestructTree(item->fTemporaryList); } delete tree; }
void BOutlineListView::_PopulateTree(BList* tree, BList& target, int32& firstIndex, bool onlyVisible) { BListItem** items = (BListItem**)target.Items(); int32 count = tree->CountItems(); for (int32 index = 0; index < count; index++) { BListItem* item = (BListItem*)tree->ItemAtFast(index); items[firstIndex++] = item; if (item->HasSubitems() && (!onlyVisible || item->IsExpanded())) _PopulateTree(item->fTemporaryList, target, firstIndex, onlyVisible); } }
void BOutlineListView::_SortTree(BList* tree, bool oneLevelOnly, int (*compareFunc)(const BListItem* a, const BListItem* b)) { BListItem** items = (BListItem**)tree->Items(); std::sort(items, items + tree->CountItems(), ListItemComparator(compareFunc)); if (oneLevelOnly) return; for (int32 index = tree->CountItems(); index-- > 0;) { BListItem* item = (BListItem*)tree->ItemAt(index); if (item->HasSubitems()) _SortTree(item->fTemporaryList, false, compareFunc); } }