diff --git a/headers/os/interface/ListView.h b/headers/os/interface/ListView.h index 51afb5bf78..3a43df4d41 100644 --- a/headers/os/interface/ListView.h +++ b/headers/os/interface/ListView.h @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006, Haiku, Inc. All Rights Reserved. + * Copyright 2002-2009, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. */ #ifndef _LIST_VIEW_H @@ -7,9 +7,9 @@ #include -#include #include #include +#include struct track_data; @@ -21,167 +21,170 @@ enum list_view_type { class BListView : public BView, public BInvoker { - public: - BListView(BRect frame, const char* name, - list_view_type type = B_SINGLE_SELECTION_LIST, - uint32 resizeMask = B_FOLLOW_LEFT | B_FOLLOW_TOP, - uint32 flags = B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE); - BListView(const char* name, - list_view_type type = B_SINGLE_SELECTION_LIST, - uint32 flags = B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE); - BListView(list_view_type type = B_SINGLE_SELECTION_LIST); - BListView(BMessage* data); +public: + BListView(BRect frame, const char* name, + list_view_type type = B_SINGLE_SELECTION_LIST, + uint32 resizeMask = B_FOLLOW_LEFT | B_FOLLOW_TOP, + uint32 flags = B_WILL_DRAW | B_FRAME_EVENTS + | B_NAVIGABLE); + BListView(const char* name, + list_view_type type = B_SINGLE_SELECTION_LIST, + uint32 flags = B_WILL_DRAW | B_FRAME_EVENTS + | B_NAVIGABLE); + BListView( + list_view_type type = B_SINGLE_SELECTION_LIST); + BListView(BMessage* data); - virtual ~BListView() ; + virtual ~BListView(); - static BArchivable* Instantiate(BMessage* data); - virtual status_t Archive(BMessage* data, bool deep = true) const; - virtual void Draw(BRect updateRect); - virtual void MessageReceived(BMessage* msg); - virtual void MouseDown(BPoint where); - virtual void KeyDown(const char* bytes, int32 numBytes); - virtual void MakeFocus(bool state = true); - virtual void AttachedToWindow(); - virtual void FrameResized(float newWidth, float newHeight); - virtual void FrameMoved(BPoint newPosition); - virtual void SetFont(const BFont* font, - uint32 mask = B_FONT_ALL); - virtual void TargetedByScrollView(BScrollView* scroller); - virtual void ScrollTo(BPoint where); - inline void ScrollTo(float x, float y); - virtual bool AddItem(BListItem* item); - virtual bool AddItem(BListItem* item, int32 atIndex); - virtual bool AddList(BList* newItems); - virtual bool AddList(BList* newItems, int32 atIndex); - virtual bool RemoveItem(BListItem* item); - virtual BListItem* RemoveItem(int32 index); - virtual bool RemoveItems(int32 index, int32 count); + static BArchivable* Instantiate(BMessage* data); + virtual status_t Archive(BMessage* data, bool deep = true) const; + virtual void Draw(BRect updateRect); + virtual void MessageReceived(BMessage* message); + virtual void MouseDown(BPoint where); + virtual void KeyDown(const char* bytes, int32 numBytes); + virtual void MakeFocus(bool state = true); + virtual void AttachedToWindow(); + virtual void FrameResized(float newWidth, float newHeight); + virtual void FrameMoved(BPoint newPosition); + virtual void SetFont(const BFont* font, uint32 mask = B_FONT_ALL); + virtual void TargetedByScrollView(BScrollView* scroller); + virtual void ScrollTo(BPoint where); + inline void ScrollTo(float x, float y); + virtual bool AddItem(BListItem* item); + virtual bool AddItem(BListItem* item, int32 atIndex); + virtual bool AddList(BList* newItems); + virtual bool AddList(BList* newItems, int32 atIndex); + virtual bool RemoveItem(BListItem* item); + virtual BListItem* RemoveItem(int32 index); + virtual bool RemoveItems(int32 index, int32 count); - virtual void SetSelectionMessage(BMessage* message); - virtual void SetInvocationMessage(BMessage* message); + virtual void SetSelectionMessage(BMessage* message); + virtual void SetInvocationMessage(BMessage* message); - BMessage* SelectionMessage() const; - uint32 SelectionCommand() const; - BMessage* InvocationMessage() const; - uint32 InvocationCommand() const; + BMessage* SelectionMessage() const; + uint32 SelectionCommand() const; + BMessage* InvocationMessage() const; + uint32 InvocationCommand() const; - virtual void SetListType(list_view_type type); - list_view_type ListType() const; + virtual void SetListType(list_view_type type); + list_view_type ListType() const; - BListItem* ItemAt(int32 index) const; - int32 IndexOf(BPoint point) const; - int32 IndexOf(BListItem* item) const; - BListItem* FirstItem() const; - BListItem* LastItem() const; - bool HasItem(BListItem* item) const; - int32 CountItems() const; - virtual void MakeEmpty(); - bool IsEmpty() const; - void DoForEach(bool (*func)(BListItem* item)); - void DoForEach(bool (*func)(BListItem* item, void* arg), void* arg); - const BListItem** Items() const; - void InvalidateItem(int32 index); - void ScrollToSelection(); + BListItem* ItemAt(int32 index) const; + int32 IndexOf(BPoint point) const; + int32 IndexOf(BListItem* item) const; + BListItem* FirstItem() const; + BListItem* LastItem() const; + bool HasItem(BListItem* item) const; + int32 CountItems() const; + virtual void MakeEmpty(); + bool IsEmpty() const; + void DoForEach(bool (*func)(BListItem* item)); + void DoForEach(bool (*func)(BListItem* item, void* arg), + void* arg); + const BListItem** Items() const; + void InvalidateItem(int32 index); + void ScrollToSelection(); - void Select(int32 index, bool extend = false); - void Select(int32 from, int32 to, bool extend = false); - bool IsItemSelected(int32 index) const; - int32 CurrentSelection(int32 index = 0) const; - virtual status_t Invoke(BMessage* message = NULL); + void Select(int32 index, bool extend = false); + void Select(int32 from, int32 to, bool extend = false); + bool IsItemSelected(int32 index) const; + int32 CurrentSelection(int32 index = 0) const; + virtual status_t Invoke(BMessage* message = NULL); - void DeselectAll(); - void DeselectExcept(int32 exceptFrom, int32 exceptTo); - void Deselect(int32 index); + void DeselectAll(); + void DeselectExcept(int32 exceptFrom, int32 exceptTo); + void Deselect(int32 index); - virtual void SelectionChanged(); + virtual void SelectionChanged(); - void SortItems(int (*cmp)(const void*, const void*)); + void SortItems(int (*cmp)(const void*, const void*)); - /* These functions bottleneck through DoMiscellaneous() */ - bool SwapItems(int32 a, int32 b); - bool MoveItem(int32 from, int32 to); - bool ReplaceItem(int32 index, BListItem* item); + /* These functions bottleneck through DoMiscellaneous() */ + bool SwapItems(int32 a, int32 b); + bool MoveItem(int32 from, int32 to); + bool ReplaceItem(int32 index, BListItem* item); - BRect ItemFrame(int32 index); + BRect ItemFrame(int32 index); - virtual BHandler* ResolveSpecifier(BMessage* message, int32 index, - BMessage* specifier, int32 form, const char* property); - virtual status_t GetSupportedSuites(BMessage* data); + virtual BHandler* ResolveSpecifier(BMessage* message, int32 index, + BMessage* specifier, int32 form, + const char* property); + virtual status_t GetSupportedSuites(BMessage* data); - virtual status_t Perform(perform_code code, void* arg); + virtual status_t Perform(perform_code code, void* arg); - virtual void WindowActivated(bool state); - virtual void MouseUp(BPoint point); - virtual void MouseMoved(BPoint point, uint32 code, - const BMessage *dragMessage); - virtual void DetachedFromWindow(); - virtual bool InitiateDrag(BPoint point, int32 itemIndex, + virtual void WindowActivated(bool state); + virtual void MouseUp(BPoint point); + virtual void MouseMoved(BPoint point, uint32 code, + const BMessage* dragMessage); + virtual void DetachedFromWindow(); + virtual bool InitiateDrag(BPoint point, int32 itemIndex, bool initialySelected); - virtual void ResizeToPreferred(); - virtual void GetPreferredSize(float* _width, float* _height); - virtual void AllAttached(); - virtual void AllDetached(); + virtual void ResizeToPreferred(); + virtual void GetPreferredSize(float* _width, float* _height); + virtual void AllAttached(); + virtual void AllDetached(); - virtual BSize MinSize(); - virtual BSize MaxSize(); - virtual BSize PreferredSize(); + virtual BSize MinSize(); + virtual BSize MaxSize(); + virtual BSize PreferredSize(); - protected: - enum MiscCode { B_NO_OP, B_REPLACE_OP, B_MOVE_OP, B_SWAP_OP }; - union MiscData { - struct Spare { int32 data[5]; }; - struct Replace { int32 index; BListItem *item; } replace; - struct Move { int32 from; int32 to; } move; - struct Swap { int32 a; int32 b; } swap; - }; +protected: + enum MiscCode { B_NO_OP, B_REPLACE_OP, B_MOVE_OP, B_SWAP_OP }; + union MiscData { + struct Spare { int32 data[5]; }; + struct Replace { int32 index; BListItem *item; } replace; + struct Move { int32 from; int32 to; } move; + struct Swap { int32 a; int32 b; } swap; + }; - virtual bool DoMiscellaneous(MiscCode code, MiscData *data); - private: - friend class BOutlineListView; + virtual bool DoMiscellaneous(MiscCode code, MiscData* data); - virtual void _ReservedListView2(); - virtual void _ReservedListView3(); - virtual void _ReservedListView4(); +private: + friend class BOutlineListView; - BListView& operator=(const BListView&); + virtual void _ReservedListView2(); + virtual void _ReservedListView3(); + virtual void _ReservedListView4(); - void _InitObject(list_view_type type); - void _FixupScrollBar(); - void _InvalidateFrom(int32 index); - status_t _PostMessage(BMessage* message); - void _FontChanged(); - int32 _RangeCheck(int32 index); - bool _Select(int32 index, bool extend); - bool _Select(int32 from, int32 to, bool extend); - bool _Deselect(int32 index); -// void _Deselect(int32 from, int32 to); - bool _DeselectAll(int32 exceptFrom, int32 exceptTo); -// void PerformDelayedSelect(); - bool _TryInitiateDrag(BPoint where); - int32 _CalcFirstSelected(int32 after); - int32 _CalcLastSelected(int32 before); - void _RecalcItemTops(int32 start, int32 end = -1); - virtual void DrawItem(BListItem* item, BRect itemRect, + BListView& operator=(const BListView& other); + + void _InitObject(list_view_type type); + void _FixupScrollBar(); + void _InvalidateFrom(int32 index); + status_t _PostMessage(BMessage* message); + void _FontChanged(); + int32 _RangeCheck(int32 index); + bool _Select(int32 index, bool extend); + bool _Select(int32 from, int32 to, bool extend); + bool _Deselect(int32 index); + bool _DeselectAll(int32 exceptFrom, int32 exceptTo); + int32 _CalcFirstSelected(int32 after); + int32 _CalcLastSelected(int32 before); + void _RecalcItemTops(int32 start, int32 end = -1); + virtual void DrawItem(BListItem* item, BRect itemRect, bool complete = false); - - bool _SwapItems(int32 a, int32 b); - bool _MoveItem(int32 from, int32 to); - bool _ReplaceItem(int32 index, BListItem* item); - void _RescanSelection(int32 from, int32 to); - BList fList; - list_view_type fListType; - int32 fFirstSelected; - int32 fLastSelected; - int32 fAnchorIndex; - BMessage* fSelectMessage; - BScrollView* fScrollView; - track_data* fTrack; + bool _SwapItems(int32 a, int32 b); + bool _MoveItem(int32 from, int32 to); + bool _ReplaceItem(int32 index, BListItem* item); + void _RescanSelection(int32 from, int32 to); - uint32 _reserved[4]; + BList fList; + list_view_type fListType; + int32 fFirstSelected; + int32 fLastSelected; + int32 fAnchorIndex; + BMessage* fSelectMessage; + BScrollView* fScrollView; + track_data* fTrack; + + uint32 _reserved[4]; }; + inline void BListView::ScrollTo(float x, float y) { diff --git a/src/kits/interface/ListView.cpp b/src/kits/interface/ListView.cpp index b9e7863315..5c57fc1da9 100644 --- a/src/kits/interface/ListView.cpp +++ b/src/kits/interface/ListView.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2008, Haiku, Inc. + * Copyright (c) 2001-2009, Haiku, Inc. * Distributed under the terms of the MIT license. * * Authors: @@ -323,13 +323,13 @@ BListView::MouseDown(BPoint point) bigtime_t doubleClickSpeed; get_click_speed(&doubleClickSpeed); bool doubleClick = false; - + if (timeDelta < doubleClickSpeed && fabs(delta.x) < kDoubleClickTresh && fabs(delta.y) < kDoubleClickTresh && fTrack->item_index == index) doubleClick = true; - + if (doubleClick && index >= fFirstSelected && index <= fLastSelected) { fTrack->drag_start.Set(LONG_MAX, LONG_MAX); Invoke(); @@ -338,7 +338,7 @@ BListView::MouseDown(BPoint point) int32 modifiers; message->FindInt32("modifiers", &modifiers); - + if (!doubleClick) { fTrack->drag_start = point; fTrack->last_click_time = system_time(); @@ -382,22 +382,27 @@ BListView::MouseDown(BPoint point) void BListView::MouseUp(BPoint pt) { - fTrack->item_index = -1; fTrack->try_drag = false; } -// MouseMoved + void -BListView::MouseMoved(BPoint pt, uint32 code, const BMessage *msg) +BListView::MouseMoved(BPoint where, uint32 code, const BMessage* dragMessage) { - if (fTrack->item_index == -1) { + if (fTrack->item_index == -1 || !fTrack->try_drag) { // mouse was not clicked above any item // or no mouse button pressed return; } - if (_TryInitiateDrag(pt)) - return; + // Initiate a drag if the mouse was moved far enough + BPoint offset = where - fTrack->drag_start; + float dragDistance = sqrtf(offset.x * offset.x + offset.y * offset.y); + if (dragDistance >= 5.0f) { + fTrack->try_drag = false; + InitiateDrag(fTrack->drag_start, fTrack->item_index, + fTrack->was_selected); + } } @@ -615,7 +620,7 @@ BListView::AddList(BList* list, int32 index) ItemAt(i)->SetTop((i > 0) ? ItemAt(i - 1)->Bottom() + 1.0 : 0.0); ItemAt(i)->Update(this, &font); } - + _RecalcItemTops(index + list->CountItems() - 1); _FixupScrollBar(); @@ -1553,23 +1558,6 @@ BListView::_DeselectAll(int32 exceptFrom, int32 exceptTo) } -bool -BListView::_TryInitiateDrag(BPoint where) -{ - if (!fTrack->try_drag || fTrack->item_index < 0) - return false; - - BPoint offset = where - fTrack->drag_start; - float dragDistance = sqrtf(offset.x * offset.x + offset.y * offset.y); - - if (dragDistance > 5.0) { - fTrack->try_drag = false; - return InitiateDrag(fTrack->drag_start, fTrack->item_index, fTrack->was_selected); - } - return false; -} - - int32 BListView::_CalcFirstSelected(int32 after) {