1128277c9SStephan Aßmus /* 24b0dffe5SZardshard * 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> 74b0dffe5SZardshard * 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 17128277c9SStephan Aßmus #include "MouseWheelFilter.h" 180e1ba39fSStephan Aßmus #include "Observer.h" 19128277c9SStephan Aßmus 20128277c9SStephan Aßmus // portion of the listviews height that triggers autoscrolling 21128277c9SStephan Aßmus // when the mouse is over it with a dragmessage 22128277c9SStephan Aßmus #define SCROLL_AREA 0.1 23128277c9SStephan Aßmus 24128277c9SStephan Aßmus class BMessageFilter; 250e1ba39fSStephan Aßmus class BMessageRunner; 26128277c9SStephan Aßmus class BScrollView; 270e1ba39fSStephan Aßmus class Selectable; 280e1ba39fSStephan Aßmus class Selection; 29128277c9SStephan Aßmus 30128277c9SStephan Aßmus // SimpleItem 31128277c9SStephan Aßmus class SimpleItem : public BStringItem 32128277c9SStephan Aßmus { 33128277c9SStephan Aßmus public: 34128277c9SStephan Aßmus SimpleItem(const char* name); 35128277c9SStephan Aßmus virtual ~SimpleItem(); 36128277c9SStephan Aßmus 37*f99596f4SJohn Scipione virtual void DrawItem(BView*, BRect, bool even = false); 38*f99596f4SJohn Scipione virtual void DrawBackground(BView*, BRect, bool even); 39128277c9SStephan Aßmus }; 40128277c9SStephan Aßmus 41be84a3d6SJohn Scipione 42be84a3d6SJohn Scipione class DragSortableListView : public BListView, 43be84a3d6SJohn Scipione public MouseWheelTarget, public Observer { 44128277c9SStephan Aßmus public: 45128277c9SStephan Aßmus DragSortableListView(BRect frame, 46128277c9SStephan Aßmus const char* name, 47be84a3d6SJohn Scipione list_view_type type = B_SINGLE_SELECTION_LIST, 48128277c9SStephan Aßmus uint32 resizingMode 49be84a3d6SJohn Scipione = B_FOLLOW_LEFT | B_FOLLOW_TOP, 50be84a3d6SJohn Scipione uint32 flags = B_WILL_DRAW | B_NAVIGABLE 51128277c9SStephan Aßmus | B_FRAME_EVENTS); 52128277c9SStephan Aßmus virtual ~DragSortableListView(); 53128277c9SStephan Aßmus 540e1ba39fSStephan Aßmus // BListView interface 55128277c9SStephan Aßmus virtual void AttachedToWindow(); 56128277c9SStephan Aßmus virtual void DetachedFromWindow(); 57128277c9SStephan Aßmus virtual void FrameResized(float width, float height); 58128277c9SStephan Aßmus // virtual void MakeFocus(bool focused); 59*f99596f4SJohn Scipione virtual void TargetedByScrollView(BScrollView*); 60128277c9SStephan Aßmus virtual void MessageReceived(BMessage* message); 61128277c9SStephan Aßmus virtual void KeyDown(const char* bytes, int32 numBytes); 62128277c9SStephan Aßmus virtual void MouseDown(BPoint where); 63*f99596f4SJohn Scipione virtual void MouseMoved(BPoint where, uint32, const BMessage*); 64128277c9SStephan Aßmus virtual void MouseUp(BPoint where); 65128277c9SStephan Aßmus virtual void WindowActivated(bool active); 66128277c9SStephan Aßmus 670e1ba39fSStephan Aßmus // MouseWheelTarget interface 68128277c9SStephan Aßmus virtual bool MouseWheelChanged(float x, float y); 69128277c9SStephan Aßmus 700e1ba39fSStephan Aßmus // Observer interface (watching Selection) 710e1ba39fSStephan Aßmus virtual void ObjectChanged(const Observable* object); 720e1ba39fSStephan Aßmus 73128277c9SStephan Aßmus // DragSortableListView 74128277c9SStephan Aßmus virtual void SetDragCommand(uint32 command); 75128277c9SStephan Aßmus virtual void ModifiersChanged(); // called by window DoubleClicked(int32 index)76128277c9SStephan Aßmus virtual void DoubleClicked(int32 index) {} 77128277c9SStephan Aßmus 78128277c9SStephan Aßmus virtual void SetItemFocused(int32 index); 79128277c9SStephan Aßmus 80128277c9SStephan Aßmus virtual bool AcceptDragMessage(const BMessage* message) const; 81f0eab45bSStephan Aßmus virtual bool HandleDropMessage(const BMessage* message, 82f0eab45bSStephan Aßmus int32 dropIndex); 83128277c9SStephan Aßmus virtual void SetDropTargetRect(const BMessage* message, 84128277c9SStephan Aßmus BPoint where); 85128277c9SStephan Aßmus 86128277c9SStephan Aßmus bool DoesAutoScrolling() const; ScrollView()87128277c9SStephan Aßmus BScrollView* ScrollView() const 88128277c9SStephan Aßmus { return fScrollView; } 89128277c9SStephan Aßmus 90128277c9SStephan Aßmus virtual void MoveItems(BList& items, int32 toIndex); 91128277c9SStephan Aßmus virtual void CopyItems(BList& items, int32 toIndex); 92128277c9SStephan Aßmus virtual void RemoveItemList(BList& indices); 93128277c9SStephan Aßmus void RemoveSelected(); // uses RemoveItemList() 94128277c9SStephan Aßmus virtual bool DeleteItem(int32 index); 95128277c9SStephan Aßmus 960e1ba39fSStephan Aßmus // selection 970e1ba39fSStephan Aßmus void SetSelection(Selection* selection); 980e1ba39fSStephan Aßmus 990e1ba39fSStephan Aßmus virtual int32 IndexOfSelectable(Selectable* selectable) const; 1000e1ba39fSStephan Aßmus virtual Selectable* SelectableFor(BListItem* item) const; 1010e1ba39fSStephan Aßmus 1020e1ba39fSStephan Aßmus void SetDeselectAllInGlobalSelection(bool deselect); 1030e1ba39fSStephan Aßmus 1040e1ba39fSStephan Aßmus void SelectAll(); 1050e1ba39fSStephan Aßmus int32 CountSelectedItems() const; 1060e1ba39fSStephan Aßmus virtual void SelectionChanged(); 1070e1ba39fSStephan Aßmus 108128277c9SStephan Aßmus virtual BListItem* CloneItem(int32 atIndex) const = 0; 109128277c9SStephan Aßmus virtual void MakeDragMessage(BMessage* message) const = 0; 110128277c9SStephan Aßmus 111be84a3d6SJohn Scipione protected: 112be84a3d6SJohn Scipione void InvalidateDropRect(); 113be84a3d6SJohn Scipione void SetDragMessage(const BMessage* message); 114128277c9SStephan Aßmus 115128277c9SStephan Aßmus BRect fDropRect; 116128277c9SStephan Aßmus BMessage fDragMessageCopy; 117128277c9SStephan Aßmus BMessageFilter* fMouseWheelFilter; 118128277c9SStephan Aßmus BMessageRunner* fScrollPulse; 119128277c9SStephan Aßmus BPoint fLastMousePos; 120128277c9SStephan Aßmus 121128277c9SStephan Aßmus protected: 122be84a3d6SJohn Scipione void SetDropRect(BRect rect); 123be84a3d6SJohn Scipione void SetDropIndex(int32 index); 124128277c9SStephan Aßmus 125128277c9SStephan Aßmus int32 fDropIndex; 126128277c9SStephan Aßmus BListItem* fLastClickedItem; 127128277c9SStephan Aßmus BScrollView* fScrollView; 128128277c9SStephan Aßmus uint32 fDragCommand; 129128277c9SStephan Aßmus int32 fFocusedIndex; 1300e1ba39fSStephan Aßmus 1310e1ba39fSStephan Aßmus Selection* fSelection; 1320e1ba39fSStephan Aßmus bool fSyncingToSelection; 1330e1ba39fSStephan Aßmus bool fModifyingSelection; 134128277c9SStephan Aßmus }; 135128277c9SStephan Aßmus 136128277c9SStephan Aßmus // SimpleListView 137be84a3d6SJohn Scipione class SimpleListView : public DragSortableListView { 138128277c9SStephan Aßmus public: 139128277c9SStephan Aßmus SimpleListView(BRect frame, 140be84a3d6SJohn Scipione BMessage* selectionChanged = NULL); 141be84a3d6SJohn Scipione SimpleListView(BRect frame, const char* name, 142be84a3d6SJohn Scipione BMessage* selectionChanged = NULL, 143128277c9SStephan Aßmus list_view_type type 144128277c9SStephan Aßmus = B_MULTIPLE_SELECTION_LIST, 145be84a3d6SJohn Scipione uint32 resizingMode = B_FOLLOW_ALL_SIDES, 146be84a3d6SJohn Scipione uint32 flags = B_WILL_DRAW | B_NAVIGABLE 147128277c9SStephan Aßmus | B_FRAME_EVENTS | B_FULL_UPDATE_ON_RESIZE); 148128277c9SStephan Aßmus ~SimpleListView(); 149128277c9SStephan Aßmus 150128277c9SStephan Aßmus // BListView 1510e1ba39fSStephan Aßmus virtual void DetachedFromWindow(); 152*f99596f4SJohn Scipione virtual void Draw(BRect updateRect); 153*f99596f4SJohn Scipione virtual bool InitiateDrag(BPoint, int32, bool); 154128277c9SStephan Aßmus virtual void MessageReceived(BMessage* message); 155128277c9SStephan Aßmus 156128277c9SStephan Aßmus virtual BListItem* CloneItem(int32 atIndex) const; 1574b0dffe5SZardshard 1584b0dffe5SZardshard /*! Archive the selected items. 1594b0dffe5SZardshard The information should be sufficient for \c InstantiateSelection to 1604b0dffe5SZardshard create a new copy of the objects without relying on the original object. 1614b0dffe5SZardshard */ 162be84a3d6SJohn Scipione virtual status_t ArchiveSelection(BMessage*, bool = true) const = 0; 1634b0dffe5SZardshard /*! Put a copy of the items archived by \c ArchiveSelection into the list. 1644b0dffe5SZardshard This method should ensure whether the item is truly meant for the list 1654b0dffe5SZardshard view. 1664b0dffe5SZardshard */ 167be84a3d6SJohn Scipione virtual bool InstantiateSelection(const BMessage*, int32) = 0; 1684b0dffe5SZardshard 169128277c9SStephan Aßmus virtual void MakeDragMessage(BMessage* message) const; 1704b0dffe5SZardshard virtual bool HandleDropMessage(const BMessage* message, 1714b0dffe5SZardshard int32 dropIndex); 1724b0dffe5SZardshard bool HandlePaste(const BMessage* archive); 173128277c9SStephan Aßmus 174bab183a2SStephan Aßmus protected: 175bab183a2SStephan Aßmus void _MakeEmpty(); 176bab183a2SStephan Aßmus 177128277c9SStephan Aßmus private: 178128277c9SStephan Aßmus 179128277c9SStephan Aßmus BMessage* fSelectionChangeMessage; 180128277c9SStephan Aßmus }; 181128277c9SStephan Aßmus 182128277c9SStephan Aßmus #endif // LIST_VIEWS_H 183