haiku/headers/os/interface/OutlineListView.h
Axel Dörfler b66c623116 * AddItem() versions did not work correctly at all: maximum insertion index
was limited by the visible list count, it did not care if the insertion
  failed, it didn't maintain the BListItem::fHasSubitems field, neither
  fVisible, and it didn't invalidate the latch of the parent, if needed.
* The "add item at end" also did not care if the item should be added to the
  visible list, too, it always did.
* AddUnder() would have crashed with a NULL superitem.
* _RemoveItem() now updates the fHasSubitems field as well.
* _SuperitemForIndex() can now return the index of the superitem as well.
* SortItemsUnder() did not check if the "underItem" if the items should be
  added to the visible list or not, it also just did.
* SortItemsUnder() now invalidates the part of the visible list that may
  have been changed.
* This fixed bug #662, and possibly #663, too (at least I could never
  reproduce it).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17812 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-06-13 10:11:11 +00:00

139 lines
4.9 KiB
C++

/*
* Copyright 2006, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _OUTLINE_LIST_VIEW_H
#define _OUTLINE_LIST_VIEW_H
#include <ListView.h>
class BListItem;
class BOutlineListView : public BListView {
public:
BOutlineListView(BRect frame, const char* name,
list_view_type type = B_SINGLE_SELECTION_LIST,
uint32 resizeMode = B_FOLLOW_LEFT | B_FOLLOW_TOP,
uint32 flags = B_WILL_DRAW | B_FRAME_EVENTS
| B_NAVIGABLE);
BOutlineListView(BMessage* archive);
virtual ~BOutlineListView();
static BArchivable* Instantiate(BMessage* archive);
virtual status_t Archive(BMessage* archive, bool deep = true) const;
virtual void MouseDown(BPoint where);
virtual void KeyDown(const char* bytes, int32 numBytes);
virtual void FrameMoved(BPoint newPosition);
virtual void FrameResized(float newWidth, float newHeight);
virtual void MouseUp(BPoint where);
virtual bool AddUnder(BListItem* item, BListItem* underItem);
virtual bool AddItem(BListItem* item);
virtual bool AddItem(BListItem* item, int32 fullListIndex);
virtual bool AddList(BList* newItems);
virtual bool AddList(BList* newItems, int32 fullListIndex);
virtual bool RemoveItem(BListItem* item);
virtual BListItem* RemoveItem(int32 fullListIndex);
virtual bool RemoveItems(int32 fullListIndex, int32 count);
BListItem* FullListItemAt(int32 fullListIndex) const;
int32 FullListIndexOf(BPoint point) const;
int32 FullListIndexOf(BListItem* item) const;
BListItem* FullListFirstItem() const;
BListItem* FullListLastItem() const;
bool FullListHasItem(BListItem* item) const;
int32 FullListCountItems() const;
int32 FullListCurrentSelection(int32 index = 0) const;
virtual void MakeEmpty();
bool FullListIsEmpty() const;
void FullListDoForEach(bool (*func)(BListItem* item));
void FullListDoForEach(bool (*func)(BListItem* item, void *), void*);
BListItem* Superitem(const BListItem* item);
void Expand(BListItem* item);
void Collapse(BListItem* item);
bool IsExpanded(int32 fullListIndex);
virtual BHandler* ResolveSpecifier(BMessage* message, int32 index,
BMessage* specifier, int32 what, const char* property);
virtual status_t GetSupportedSuites(BMessage* data);
virtual status_t Perform(perform_code d, void* arg);
virtual void ResizeToPreferred();
virtual void GetPreferredSize(float* _width, float* _height);
virtual void MakeFocus(bool focus = true);
virtual void AllAttached();
virtual void AllDetached();
virtual void DetachedFromWindow();
void FullListSortItems(int (*compareFunc)(const BListItem* first,
const BListItem* second));
void SortItemsUnder(BListItem* underItem, bool oneLevelOnly,
int (*compareFunc)(const BListItem* first,
const BListItem* second));
int32 CountItemsUnder(BListItem* under, bool oneLevelOnly) const;
BListItem* EachItemUnder(BListItem* underItem, bool oneLevelOnly,
BListItem* (*eachFunc)(BListItem* item, void* arg),
void* arg);
BListItem* ItemUnderAt(BListItem* underItem, bool oneLevelOnly,
int32 index) const;
protected:
virtual bool DoMiscellaneous(MiscCode code, MiscData* data);
virtual void MessageReceived(BMessage *message);
private:
virtual void _ReservedOutlineListView1();
virtual void _ReservedOutlineListView2();
virtual void _ReservedOutlineListView3();
virtual void _ReservedOutlineListView4();
typedef BListView _inherited;
int32 FullListIndex(int32 index) const;
int32 ListViewIndex(int32 index) const;
protected:
virtual void ExpandOrCollapse(BListItem* underItem, bool expand);
virtual BRect LatchRect(BRect itemRect, int32 level) const;
virtual void DrawLatch(BRect itemRect, int32 level, bool collapsed,
bool highlighted, bool misTracked);
virtual void DrawItem(BListItem* item, BRect itemRect, bool complete = false);
private:
void _PopulateTree(BList* tree, BList& target,
int32& firstIndex, bool onlyVisible);
void _SortTree(BList* tree, bool oneLevelOnly,
int (*compareFunc)(const BListItem* a, const BListItem* b));
void _DestructTree(BList* tree);
BList* _BuildTree(BListItem* underItem, int32& index);
BListItem* _RemoveItem(BListItem* item, int32 fullListIndex);
BListItem* RemoveOne(int32 fullListIndex);
static void TrackInLatchItem(void *);
static void TrackOutLatchItem(void *);
bool OutlineSwapItems(int32 a, int32 b);
bool OutlineMoveItem(int32 from, int32 to);
bool OutlineReplaceItem(int32 index, BListItem* item);
void CommonMoveItems(int32 from, int32 count, int32 to);
BListItem* _SuperitemForIndex(int32 fullListIndex, int32 level,
int32* _superIndex = NULL);
int32 _FindPreviousVisibleIndex(int32 fullListIndex);
private:
BList fFullList;
uint32 _reserved[2];
};
#endif // _OUTLINE_LIST_VIEW_H