void BOutlineListView::SortItemsUnder(BListItem* underItem, bool oneLevelOnly, int (*compareFunc)(const BListItem* a, const BListItem* b)) { // This method is quite complicated: basically, it creates a real tree // from the items of the full list, sorts them as needed, and then // populates the entries back into the full and display lists int32 firstIndex = FullListIndexOf(underItem) + 1; int32 lastIndex = firstIndex; BList* tree = _BuildTree(underItem, lastIndex); _SortTree(tree, oneLevelOnly, compareFunc); // Populate to the full list _PopulateTree(tree, fFullList, firstIndex, false); if (underItem == NULL || (underItem->IsItemVisible() && underItem->IsExpanded())) { // Populate to BListView's list firstIndex = fList.IndexOf(underItem) + 1; lastIndex = firstIndex; _PopulateTree(tree, fList, lastIndex, true); if (fFirstSelected != -1) { // update selection hints fFirstSelected = _CalcFirstSelected(0); fLastSelected = _CalcLastSelected(CountItems()); } // only invalidate what may have changed _RecalcItemTops(firstIndex); BRect top = ItemFrame(firstIndex); BRect bottom = ItemFrame(lastIndex - 1); BRect update(top.left, top.top, bottom.right, bottom.bottom); Invalidate(update); } _DestructTree(tree); }
bool BListView::_DeselectAll(int32 exceptFrom, int32 exceptTo) { if (fFirstSelected == -1) return false; BAutolock locker(Window()); if (Window() && !locker.IsLocked()) return false; bool changed = false; for (int32 index = fFirstSelected; index <= fLastSelected; index++) { // don't deselect the items we shouldn't deselect if (exceptFrom != -1 && exceptFrom <= index && exceptTo >= index) continue; BListItem *item = ItemAt(index); if (item && item->IsSelected()) { item->Deselect(); InvalidateItem(index); changed = true; } } if (!changed) return false; if (exceptFrom != -1) { fFirstSelected = _CalcFirstSelected(exceptFrom); fLastSelected = _CalcLastSelected(exceptTo); } else fFirstSelected = fLastSelected = -1; return true; }
bool BListView::_Deselect(int32 index) { if (index < 0 || index >= CountItems()) return false; BWindow *window = Window(); BAutolock locker(window); if (window && !locker.IsLocked()) return false; BListItem *item = ItemAt(index); if (item && item->IsSelected()) { BRect frame(ItemFrame(index)); BRect bounds(Bounds()); item->Deselect(); if (fFirstSelected == index && fLastSelected == index) { fFirstSelected = -1; fLastSelected = -1; } else { if (fFirstSelected == index) fFirstSelected = _CalcFirstSelected(index); if (fLastSelected == index) fLastSelected = _CalcLastSelected(index); } if (window && bounds.Intersects(frame)) DrawItem(ItemAt(index), frame, true); } return true; }