1128277c9SStephan Aßmus /* 2*4b0dffe5SZardshard * Copyright 2006, 2023, Haiku. 3128277c9SStephan Aßmus * Distributed under the terms of the MIT License. 4128277c9SStephan Aßmus * 5128277c9SStephan Aßmus * Authors: 6128277c9SStephan Aßmus * Stephan Aßmus <superstippi@gmx.de> 7*4b0dffe5SZardshard * Zardshard 8128277c9SStephan Aßmus */ 9128277c9SStephan Aßmus 10128277c9SStephan Aßmus #ifndef LIST_VIEWS_H 11128277c9SStephan Aßmus #define LIST_VIEWS_H 12128277c9SStephan Aßmus 13128277c9SStephan Aßmus #include <ListItem.h> 14128277c9SStephan Aßmus #include <ListView.h> 15128277c9SStephan Aßmus #include <Message.h> 16128277c9SStephan Aßmus 17cfda5dd7SStephan Aßmus #ifdef LIB_LAYOUT 18128277c9SStephan Aßmus # include <layout.h> 19cfda5dd7SStephan Aßmus #endif 20128277c9SStephan Aßmus 21128277c9SStephan Aßmus #include "MouseWheelFilter.h" 220e1ba39fSStephan Aßmus #include "Observer.h" 23128277c9SStephan Aßmus 24128277c9SStephan Aßmus enum 25128277c9SStephan Aßmus { 26128277c9SStephan Aßmus FLAGS_NONE = 0x00, 27128277c9SStephan Aßmus FLAGS_TINTED_LINE = 0x01, 28128277c9SStephan Aßmus FLAGS_FOCUSED = 0x02, 29128277c9SStephan Aßmus }; 30128277c9SStephan Aßmus 31128277c9SStephan Aßmus // portion of the listviews height that triggers autoscrolling 32128277c9SStephan Aßmus // when the mouse is over it with a dragmessage 33128277c9SStephan Aßmus #define SCROLL_AREA 0.1 34128277c9SStephan Aßmus 35128277c9SStephan Aßmus class BMessageFilter; 360e1ba39fSStephan Aßmus class BMessageRunner; 37128277c9SStephan Aßmus class BScrollView; 380e1ba39fSStephan Aßmus class Selectable; 390e1ba39fSStephan Aßmus class Selection; 40128277c9SStephan Aßmus 41128277c9SStephan Aßmus // SimpleItem 42128277c9SStephan Aßmus class SimpleItem : public BStringItem 43128277c9SStephan Aßmus { 44128277c9SStephan Aßmus public: 45128277c9SStephan Aßmus SimpleItem(const char* name); 46128277c9SStephan Aßmus virtual ~SimpleItem(); 47128277c9SStephan Aßmus 48128277c9SStephan Aßmus virtual void Draw(BView* owner, BRect frame, 49128277c9SStephan Aßmus uint32 flags); 50128277c9SStephan Aßmus virtual void DrawBackground(BView* owner, BRect frame, 51128277c9SStephan Aßmus uint32 flags); 52128277c9SStephan Aßmus 53128277c9SStephan Aßmus // let the item know what's going on 54128277c9SStephan Aßmus /* virtual void AttachedToListView(SimpleListView* owner); 55128277c9SStephan Aßmus virtual void DetachedFromListView(SimpleListView* owner); 56128277c9SStephan Aßmus 57128277c9SStephan Aßmus virtual void SetItemFrame(BRect frame);*/ 58128277c9SStephan Aßmus 59128277c9SStephan Aßmus private: 60128277c9SStephan Aßmus 61128277c9SStephan Aßmus }; 62128277c9SStephan Aßmus 63128277c9SStephan Aßmus // DragSortableListView 64128277c9SStephan Aßmus class DragSortableListView : public MouseWheelTarget, 650e1ba39fSStephan Aßmus public BListView, 660e1ba39fSStephan Aßmus public Observer { 67128277c9SStephan Aßmus public: 68128277c9SStephan Aßmus DragSortableListView(BRect frame, 69128277c9SStephan Aßmus const char* name, 70128277c9SStephan Aßmus list_view_type type 71128277c9SStephan Aßmus = B_SINGLE_SELECTION_LIST, 72128277c9SStephan Aßmus uint32 resizingMode 73128277c9SStephan Aßmus = B_FOLLOW_LEFT 74128277c9SStephan Aßmus | B_FOLLOW_TOP, 75128277c9SStephan Aßmus uint32 flags 76128277c9SStephan Aßmus = B_WILL_DRAW 77128277c9SStephan Aßmus | B_NAVIGABLE 78128277c9SStephan Aßmus | B_FRAME_EVENTS); 79128277c9SStephan Aßmus virtual ~DragSortableListView(); 80128277c9SStephan Aßmus 810e1ba39fSStephan Aßmus // BListView interface 82128277c9SStephan Aßmus virtual void AttachedToWindow(); 83128277c9SStephan Aßmus virtual void DetachedFromWindow(); 84128277c9SStephan Aßmus virtual void FrameResized(float width, float height); 85128277c9SStephan Aßmus // virtual void MakeFocus(bool focused); 86128277c9SStephan Aßmus virtual void Draw(BRect updateRect); 87128277c9SStephan Aßmus virtual void ScrollTo(BPoint where); 88128277c9SStephan Aßmus virtual void TargetedByScrollView(BScrollView* scrollView); 89128277c9SStephan Aßmus virtual bool InitiateDrag(BPoint point, int32 index, 90128277c9SStephan Aßmus bool wasSelected); 91128277c9SStephan Aßmus virtual void MessageReceived(BMessage* message); 92128277c9SStephan Aßmus virtual void KeyDown(const char* bytes, int32 numBytes); 93128277c9SStephan Aßmus virtual void MouseDown(BPoint where); 94128277c9SStephan Aßmus virtual void MouseMoved(BPoint where, uint32 transit, 95128277c9SStephan Aßmus const BMessage* dragMessage); 96128277c9SStephan Aßmus virtual void MouseUp(BPoint where); 97128277c9SStephan Aßmus virtual void WindowActivated(bool active); 98128277c9SStephan Aßmus virtual void DrawItem(BListItem *item, BRect itemFrame, 99128277c9SStephan Aßmus bool complete = false); 100128277c9SStephan Aßmus 1010e1ba39fSStephan Aßmus // MouseWheelTarget interface 102128277c9SStephan Aßmus virtual bool MouseWheelChanged(float x, float y); 103128277c9SStephan Aßmus 1040e1ba39fSStephan Aßmus // Observer interface (watching Selection) 1050e1ba39fSStephan Aßmus virtual void ObjectChanged(const Observable* object); 1060e1ba39fSStephan Aßmus 107128277c9SStephan Aßmus // DragSortableListView 108128277c9SStephan Aßmus virtual void SetDragCommand(uint32 command); 109128277c9SStephan Aßmus virtual void ModifiersChanged(); // called by window 110128277c9SStephan Aßmus virtual void DoubleClicked(int32 index) {} 111128277c9SStephan Aßmus 112128277c9SStephan Aßmus virtual void SetItemFocused(int32 index); 113128277c9SStephan Aßmus 114128277c9SStephan Aßmus virtual bool AcceptDragMessage(const BMessage* message) const; 115f0eab45bSStephan Aßmus virtual bool HandleDropMessage(const BMessage* message, 116f0eab45bSStephan Aßmus int32 dropIndex); 117128277c9SStephan Aßmus virtual void SetDropTargetRect(const BMessage* message, 118128277c9SStephan Aßmus BPoint where); 119128277c9SStephan Aßmus 120128277c9SStephan Aßmus // autoscrolling 121128277c9SStephan Aßmus void SetAutoScrolling(bool enable); 122128277c9SStephan Aßmus bool DoesAutoScrolling() const; 123128277c9SStephan Aßmus BScrollView* ScrollView() const 124128277c9SStephan Aßmus { return fScrollView; } 125128277c9SStephan Aßmus void ScrollTo(int32 index); 126128277c9SStephan Aßmus 127128277c9SStephan Aßmus virtual void MoveItems(BList& items, int32 toIndex); 128128277c9SStephan Aßmus virtual void CopyItems(BList& items, int32 toIndex); 129128277c9SStephan Aßmus virtual void RemoveItemList(BList& indices); 130128277c9SStephan Aßmus void RemoveSelected(); // uses RemoveItemList() 131128277c9SStephan Aßmus virtual bool DeleteItem(int32 index); 132128277c9SStephan Aßmus 1330e1ba39fSStephan Aßmus // selection 1340e1ba39fSStephan Aßmus void SetSelection(Selection* selection); 1350e1ba39fSStephan Aßmus 1360e1ba39fSStephan Aßmus virtual int32 IndexOfSelectable(Selectable* selectable) const; 1370e1ba39fSStephan Aßmus virtual Selectable* SelectableFor(BListItem* item) const; 1380e1ba39fSStephan Aßmus 1390e1ba39fSStephan Aßmus void SetDeselectAllInGlobalSelection(bool deselect); 1400e1ba39fSStephan Aßmus 1410e1ba39fSStephan Aßmus void SelectAll(); 1420e1ba39fSStephan Aßmus int32 CountSelectedItems() const; 1430e1ba39fSStephan Aßmus virtual void SelectionChanged(); 1440e1ba39fSStephan Aßmus 145128277c9SStephan Aßmus virtual BListItem* CloneItem(int32 atIndex) const = 0; 146128277c9SStephan Aßmus virtual void DrawListItem(BView* owner, int32 index, 147128277c9SStephan Aßmus BRect itemFrame) const = 0; 148128277c9SStephan Aßmus virtual void MakeDragMessage(BMessage* message) const = 0; 149128277c9SStephan Aßmus 150128277c9SStephan Aßmus private: 151128277c9SStephan Aßmus void _RemoveDropAnticipationRect(); 152128277c9SStephan Aßmus void _SetDragMessage(const BMessage* message); 153128277c9SStephan Aßmus 154128277c9SStephan Aßmus BRect fDropRect; 155128277c9SStephan Aßmus BMessage fDragMessageCopy; 156128277c9SStephan Aßmus BMessageFilter* fMouseWheelFilter; 157128277c9SStephan Aßmus BMessageRunner* fScrollPulse; 158128277c9SStephan Aßmus BPoint fLastMousePos; 159128277c9SStephan Aßmus 160128277c9SStephan Aßmus protected: 161128277c9SStephan Aßmus void _SetDropAnticipationRect(BRect r); 162128277c9SStephan Aßmus void _SetDropIndex(int32 index); 163128277c9SStephan Aßmus 164128277c9SStephan Aßmus int32 fDropIndex; 165128277c9SStephan Aßmus BListItem* fLastClickedItem; 166128277c9SStephan Aßmus BScrollView* fScrollView; 167128277c9SStephan Aßmus uint32 fDragCommand; 168128277c9SStephan Aßmus int32 fFocusedIndex; 1690e1ba39fSStephan Aßmus 1700e1ba39fSStephan Aßmus Selection* fSelection; 1710e1ba39fSStephan Aßmus bool fSyncingToSelection; 1720e1ba39fSStephan Aßmus bool fModifyingSelection; 173128277c9SStephan Aßmus }; 174128277c9SStephan Aßmus 175128277c9SStephan Aßmus // SimpleListView 176cfda5dd7SStephan Aßmus class SimpleListView : 177cfda5dd7SStephan Aßmus #ifdef LIB_LAYOUT 178cfda5dd7SStephan Aßmus public MView, 179cfda5dd7SStephan Aßmus #endif 180cfda5dd7SStephan Aßmus public DragSortableListView { 181128277c9SStephan Aßmus public: 182128277c9SStephan Aßmus SimpleListView(BRect frame, 183128277c9SStephan Aßmus BMessage* selectionChangeMessage = NULL); 184128277c9SStephan Aßmus SimpleListView(BRect frame, 185128277c9SStephan Aßmus const char* name, 186128277c9SStephan Aßmus BMessage* selectionChangeMessage = NULL, 187128277c9SStephan Aßmus list_view_type type 188128277c9SStephan Aßmus = B_MULTIPLE_SELECTION_LIST, 189128277c9SStephan Aßmus uint32 resizingMode 190128277c9SStephan Aßmus = B_FOLLOW_ALL_SIDES, 191128277c9SStephan Aßmus uint32 flags 192128277c9SStephan Aßmus = B_WILL_DRAW | B_NAVIGABLE 193128277c9SStephan Aßmus | B_FRAME_EVENTS | B_FULL_UPDATE_ON_RESIZE); 194128277c9SStephan Aßmus ~SimpleListView(); 195128277c9SStephan Aßmus 196cfda5dd7SStephan Aßmus #ifdef LIB_LAYOUT 197128277c9SStephan Aßmus // MView 198128277c9SStephan Aßmus virtual minimax layoutprefs(); 199128277c9SStephan Aßmus virtual BRect layout(BRect frame); 200cfda5dd7SStephan Aßmus #endif 201128277c9SStephan Aßmus // BListView 2020e1ba39fSStephan Aßmus virtual void DetachedFromWindow(); 203128277c9SStephan Aßmus virtual void MessageReceived(BMessage* message); 204128277c9SStephan Aßmus 205128277c9SStephan Aßmus virtual BListItem* CloneItem(int32 atIndex) const; 206128277c9SStephan Aßmus virtual void DrawListItem(BView* owner, int32 index, 207128277c9SStephan Aßmus BRect itemFrame) const; 208*4b0dffe5SZardshard 209*4b0dffe5SZardshard /*! Archive the selected items. 210*4b0dffe5SZardshard The information should be sufficient for \c InstantiateSelection to 211*4b0dffe5SZardshard create a new copy of the objects without relying on the original object. 212*4b0dffe5SZardshard */ 213*4b0dffe5SZardshard virtual status_t ArchiveSelection(BMessage* into, bool deep = true) const = 0; 214*4b0dffe5SZardshard /*! Put a copy of the items archived by \c ArchiveSelection into the list. 215*4b0dffe5SZardshard This method should ensure whether the item is truly meant for the list 216*4b0dffe5SZardshard view. 217*4b0dffe5SZardshard */ 218*4b0dffe5SZardshard virtual bool InstantiateSelection(const BMessage* archive, int32 dropIndex) = 0; 219*4b0dffe5SZardshard 220128277c9SStephan Aßmus virtual void MakeDragMessage(BMessage* message) const; 221*4b0dffe5SZardshard virtual bool HandleDropMessage(const BMessage* message, 222*4b0dffe5SZardshard int32 dropIndex); 223*4b0dffe5SZardshard bool HandlePaste(const BMessage* archive); 224128277c9SStephan Aßmus 225bab183a2SStephan Aßmus protected: 226bab183a2SStephan Aßmus void _MakeEmpty(); 227bab183a2SStephan Aßmus 228128277c9SStephan Aßmus private: 229128277c9SStephan Aßmus 230128277c9SStephan Aßmus BMessage* fSelectionChangeMessage; 231128277c9SStephan Aßmus }; 232128277c9SStephan Aßmus 233128277c9SStephan Aßmus #endif // LIST_VIEWS_H 234