1*415ef601SStephan Aßmus /* 2*415ef601SStephan Aßmus * Copyright 2006-2007, Haiku. All rights reserved. 3*415ef601SStephan Aßmus * Distributed under the terms of the MIT License. 4*415ef601SStephan Aßmus * 5*415ef601SStephan Aßmus * Authors: 6*415ef601SStephan Aßmus * Stephan Aßmus <superstippi@gmx.de> 7*415ef601SStephan Aßmus */ 8*415ef601SStephan Aßmus #ifndef LIST_VIEWS_H 9*415ef601SStephan Aßmus #define LIST_VIEWS_H 10*415ef601SStephan Aßmus 11*415ef601SStephan Aßmus #include <ListItem.h> 12*415ef601SStephan Aßmus #include <ListView.h> 13*415ef601SStephan Aßmus #include <Message.h> 14*415ef601SStephan Aßmus 15*415ef601SStephan Aßmus enum { 16*415ef601SStephan Aßmus FLAGS_NONE = 0x00, 17*415ef601SStephan Aßmus FLAGS_TINTED_LINE = 0x01, 18*415ef601SStephan Aßmus FLAGS_FOCUSED = 0x02, 19*415ef601SStephan Aßmus }; 20*415ef601SStephan Aßmus 21*415ef601SStephan Aßmus // portion of the listviews height that triggers autoscrolling 22*415ef601SStephan Aßmus // when the mouse is over it with a dragmessage 23*415ef601SStephan Aßmus #define SCROLL_AREA 0.1 24*415ef601SStephan Aßmus 25*415ef601SStephan Aßmus class BMessageRunner; 26*415ef601SStephan Aßmus class BMessageFilter; 27*415ef601SStephan Aßmus class InterfaceWindow; 28*415ef601SStephan Aßmus class BScrollView; 29*415ef601SStephan Aßmus 30*415ef601SStephan Aßmus // SimpleItem 31*415ef601SStephan Aßmus class SimpleItem : public BStringItem { 32*415ef601SStephan Aßmus public: 33*415ef601SStephan Aßmus SimpleItem(const char* name); 34*415ef601SStephan Aßmus virtual ~SimpleItem(); 35*415ef601SStephan Aßmus 36*415ef601SStephan Aßmus virtual void Draw(BView* owner, BRect frame, 37*415ef601SStephan Aßmus uint32 flags); 38*415ef601SStephan Aßmus virtual void DrawBackground(BView* owner, BRect frame, 39*415ef601SStephan Aßmus uint32 flags); 40*415ef601SStephan Aßmus }; 41*415ef601SStephan Aßmus 42*415ef601SStephan Aßmus // DragSortableListView 43*415ef601SStephan Aßmus class DragSortableListView : public BListView { 44*415ef601SStephan Aßmus public: 45*415ef601SStephan Aßmus DragSortableListView(BRect frame, const char* name, 46*415ef601SStephan Aßmus list_view_type type = B_SINGLE_SELECTION_LIST, 47*415ef601SStephan Aßmus uint32 resizingMode = B_FOLLOW_LEFT 48*415ef601SStephan Aßmus | B_FOLLOW_TOP, 49*415ef601SStephan Aßmus uint32 flags = B_WILL_DRAW | B_NAVIGABLE 50*415ef601SStephan Aßmus | B_FRAME_EVENTS); 51*415ef601SStephan Aßmus virtual ~DragSortableListView(); 52*415ef601SStephan Aßmus 53*415ef601SStephan Aßmus // BListView interface 54*415ef601SStephan Aßmus virtual void AttachedToWindow(); 55*415ef601SStephan Aßmus virtual void DetachedFromWindow(); 56*415ef601SStephan Aßmus virtual void FrameResized(float width, float height); 57*415ef601SStephan Aßmus virtual void Draw(BRect updateRect); 58*415ef601SStephan Aßmus virtual void ScrollTo(BPoint where); 59*415ef601SStephan Aßmus virtual void TargetedByScrollView(BScrollView* scrollView); 60*415ef601SStephan Aßmus virtual bool InitiateDrag(BPoint point, int32 index, 61*415ef601SStephan Aßmus bool wasSelected); 62*415ef601SStephan Aßmus virtual void MessageReceived(BMessage* message); 63*415ef601SStephan Aßmus virtual void KeyDown(const char* bytes, int32 numBytes); 64*415ef601SStephan Aßmus virtual void MouseDown(BPoint where); 65*415ef601SStephan Aßmus virtual void MouseMoved(BPoint where, uint32 transit, 66*415ef601SStephan Aßmus const BMessage* dragMessage); 67*415ef601SStephan Aßmus virtual void MouseUp(BPoint where); 68*415ef601SStephan Aßmus virtual void WindowActivated(bool active); 69*415ef601SStephan Aßmus virtual void DrawItem(BListItem *item, BRect itemFrame, 70*415ef601SStephan Aßmus bool complete = false); 71*415ef601SStephan Aßmus 72*415ef601SStephan Aßmus // DragSortableListView 73*415ef601SStephan Aßmus virtual void SetDragCommand(uint32 command); 74*415ef601SStephan Aßmus virtual void ModifiersChanged(); // called by window 75*415ef601SStephan Aßmus virtual void DoubleClicked(int32 index) {} 76*415ef601SStephan Aßmus 77*415ef601SStephan Aßmus virtual void SetItemFocused(int32 index); 78*415ef601SStephan Aßmus 79*415ef601SStephan Aßmus virtual bool AcceptDragMessage(const BMessage* message) const; 80*415ef601SStephan Aßmus virtual void SetDropTargetRect(const BMessage* message, 81*415ef601SStephan Aßmus BPoint where); 82*415ef601SStephan Aßmus 83*415ef601SStephan Aßmus // autoscrolling 84*415ef601SStephan Aßmus void SetAutoScrolling(bool enable); 85*415ef601SStephan Aßmus bool DoesAutoScrolling() const; 86*415ef601SStephan Aßmus BScrollView* ScrollView() const 87*415ef601SStephan Aßmus { return fScrollView; } 88*415ef601SStephan Aßmus void ScrollTo(int32 index); 89*415ef601SStephan Aßmus 90*415ef601SStephan Aßmus bool MouseWheelChanged(float x, float y); 91*415ef601SStephan Aßmus 92*415ef601SStephan Aßmus virtual void MoveItems(BList& indices, int32 toIndex); 93*415ef601SStephan Aßmus virtual void CopyItems(BList& indices, int32 toIndex); 94*415ef601SStephan Aßmus virtual void RemoveItemList(BList& indices); 95*415ef601SStephan Aßmus void RemoveSelected(); // uses RemoveItemList() 96*415ef601SStephan Aßmus int32 CountSelectedItems() const; 97*415ef601SStephan Aßmus void SelectAll(); 98*415ef601SStephan Aßmus virtual bool DeleteItem(int32 index); 99*415ef601SStephan Aßmus 100*415ef601SStephan Aßmus virtual BListItem* CloneItem(int32 atIndex) const = 0; 101*415ef601SStephan Aßmus virtual void DrawListItem(BView* owner, int32 index, 102*415ef601SStephan Aßmus BRect itemFrame) const = 0; 103*415ef601SStephan Aßmus virtual void MakeDragMessage(BMessage* message) const = 0; 104*415ef601SStephan Aßmus 105*415ef601SStephan Aßmus private: 106*415ef601SStephan Aßmus void _RemoveDropAnticipationRect(); 107*415ef601SStephan Aßmus void _SetDragMessage(const BMessage* message); 108*415ef601SStephan Aßmus 109*415ef601SStephan Aßmus BRect fDropRect; 110*415ef601SStephan Aßmus BMessage fDragMessageCopy; 111*415ef601SStephan Aßmus BMessageRunner* fScrollPulse; 112*415ef601SStephan Aßmus BPoint fLastMousePos; 113*415ef601SStephan Aßmus 114*415ef601SStephan Aßmus protected: 115*415ef601SStephan Aßmus void _SetDropAnticipationRect(BRect r); 116*415ef601SStephan Aßmus void _SetDropIndex(int32 index); 117*415ef601SStephan Aßmus 118*415ef601SStephan Aßmus int32 fDropIndex; 119*415ef601SStephan Aßmus BListItem* fLastClickedItem; 120*415ef601SStephan Aßmus BScrollView* fScrollView; 121*415ef601SStephan Aßmus uint32 fDragCommand; 122*415ef601SStephan Aßmus int32 fFocusedIndex; 123*415ef601SStephan Aßmus }; 124*415ef601SStephan Aßmus 125*415ef601SStephan Aßmus // SimpleListView 126*415ef601SStephan Aßmus class SimpleListView : public DragSortableListView { 127*415ef601SStephan Aßmus public: 128*415ef601SStephan Aßmus SimpleListView(BRect frame, 129*415ef601SStephan Aßmus BMessage* selectionChangeMessage = NULL); 130*415ef601SStephan Aßmus SimpleListView(BRect frame, const char* name, 131*415ef601SStephan Aßmus BMessage* selectionChangeMessage = NULL, 132*415ef601SStephan Aßmus list_view_type type = B_MULTIPLE_SELECTION_LIST, 133*415ef601SStephan Aßmus uint32 resizingMode = B_FOLLOW_ALL_SIDES, 134*415ef601SStephan Aßmus uint32 flags = B_WILL_DRAW | B_NAVIGABLE 135*415ef601SStephan Aßmus | B_FRAME_EVENTS | B_FULL_UPDATE_ON_RESIZE); 136*415ef601SStephan Aßmus ~SimpleListView(); 137*415ef601SStephan Aßmus 138*415ef601SStephan Aßmus // DragSortableListView interface 139*415ef601SStephan Aßmus virtual void MessageReceived(BMessage* message); 140*415ef601SStephan Aßmus virtual void SelectionChanged(); 141*415ef601SStephan Aßmus 142*415ef601SStephan Aßmus virtual BListItem* CloneItem(int32 atIndex) const; 143*415ef601SStephan Aßmus virtual void DrawListItem(BView* owner, int32 index, 144*415ef601SStephan Aßmus BRect itemFrame) const; 145*415ef601SStephan Aßmus virtual void MakeDragMessage(BMessage* message) const; 146*415ef601SStephan Aßmus 147*415ef601SStephan Aßmus private: 148*415ef601SStephan Aßmus 149*415ef601SStephan Aßmus BMessage* fSelectionChangeMessage; 150*415ef601SStephan Aßmus }; 151*415ef601SStephan Aßmus 152*415ef601SStephan Aßmus #endif // LIST_VIEWS_H 153