xref: /haiku/headers/os/interface/Dragger.h (revision c237c4ce593ee823d9867fd997e51e4c447f5623)
1 /*
2  * Copyright 2006-2009, Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _DRAGGER_H
6 #define _DRAGGER_H
7 
8 
9 #include <Locker.h>
10 #include <List.h>
11 #include <View.h>
12 
13 class BBitmap;
14 class BMessage;
15 class BPopUpMenu;
16 class BShelf;
17 
18 namespace BPrivate {
19 	struct replicant_data;
20 	class ShelfContainerViewFilter;
21 };
22 
23 
24 class BDragger : public BView {
25 public:
26 								BDragger(BRect frame, BView* target,
27 									uint32 resizingMode = B_FOLLOW_NONE,
28 									uint32 flags = B_WILL_DRAW);
29 								BDragger(BView* target,
30 									uint32 flags = B_WILL_DRAW);
31 								BDragger(BMessage* data);
32 	virtual						~BDragger();
33 
34 	static	BArchivable*		 Instantiate(BMessage* data);
35 	virtual	status_t			Archive(BMessage* data,
36 									bool deep = true) const;
37 
38 	virtual void				AttachedToWindow();
39 	virtual void				DetachedFromWindow();
40 
41 	virtual void				Draw(BRect updateRect);
42 	virtual void				MouseDown(BPoint where);
43 	virtual	void				MouseUp(BPoint where);
44 	virtual	void				MouseMoved(BPoint where, uint32 transit,
45 									const BMessage* dragMessage);
46 	virtual void				MessageReceived(BMessage* message);
47 	virtual	void				FrameMoved(BPoint newPosition);
48 	virtual	void				FrameResized(float newWidth, float newHeight);
49 
50 	static	status_t			ShowAllDraggers();
51 	static	status_t			HideAllDraggers();
52 	static	bool				AreDraggersDrawn();
53 
54 	virtual BHandler*			ResolveSpecifier(BMessage* message,
55 									int32 index, BMessage* specifier,
56 									int32 form, const char* property);
57 	virtual status_t			GetSupportedSuites(BMessage* data);
58 	virtual status_t			Perform(perform_code code, void* data);
59 
60 	virtual void				ResizeToPreferred();
61 	virtual void				GetPreferredSize(float* _width,
62 									float* _height);
63 	virtual void				MakeFocus(bool focus = true);
64 	virtual void				AllAttached();
65 	virtual void				AllDetached();
66 
67 			status_t			SetPopUp(BPopUpMenu* contextMenu);
68 			BPopUpMenu*			PopUp() const;
69 
70 			bool				InShelf() const;
71 			BView*				Target() const;
72 
73 	virtual	BBitmap*			DragBitmap(BPoint* offset, drawing_mode* mode);
74 
75 	class Private;
76 
77 protected:
78 			bool				IsVisibilityChanging() const;
79 
80 private:
81 	friend class BPrivate::ShelfContainerViewFilter;
82 	friend struct BPrivate::replicant_data;
83 	friend class Private;
84 	friend class BShelf;
85 
86 	virtual	void				_ReservedDragger2();
87 	virtual	void				_ReservedDragger3();
88 	virtual	void				_ReservedDragger4();
89 
90 	static	void				_UpdateShowAllDraggers(bool visible);
91 
92 			BDragger&			operator=(const BDragger& other);
93 
94 			void				_InitData();
95 			void				_AddToList();
96 			void				_RemoveFromList();
97 			status_t			_DetermineRelationship();
98 			status_t			_SetViewToDrag(BView* target);
99 			void				_SetShelf(BShelf* shelf);
100 			void				_SetZombied(bool state);
101 			void				_BuildDefaultPopUp();
102 			void				_ShowPopUp(BView* target, BPoint where);
103 
104 			enum relation {
105 				TARGET_UNKNOWN,
106 				TARGET_IS_CHILD,
107 				TARGET_IS_PARENT,
108 				TARGET_IS_SIBLING
109 			};
110 
111 			BView*				fTarget;
112 			relation			fRelation;
113 			BShelf*				fShelf;
114 			bool				fTransition;
115 			bool				fIsZombie;
116 			char				fErrCount;
117 			bool				fPopUpIsCustom;
118 			BBitmap*			fBitmap;
119 			BPopUpMenu*			fPopUp;
120 			uint32				_reserved[3];
121 };
122 
123 #endif /* _DRAGGER_H */
124