MenuField.h revision 7c234361
1/*
2 * Copyright 2006-2016 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _MENU_FIELD_H
6#define _MENU_FIELD_H
7
8
9#include <Menu.h>
10
11
12class BMenuBar;
13class BMessageFilter;
14
15
16class BMenuField : public BView {
17public:
18								BMenuField(BRect frame, const char* name,
19									const char* label, BMenu* menu,
20									uint32 resizingMode = B_FOLLOW_LEFT_TOP,
21									uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
22								BMenuField(BRect frame, const char* name,
23									const char* label, BMenu* menu,
24									bool fixed_size,
25									uint32 resizingMode = B_FOLLOW_LEFT_TOP,
26									uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
27								BMenuField(const char* name,
28									const char* label, BMenu* menu,
29									uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
30								BMenuField(const char* label, BMenu* menu,
31									uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
32								BMenuField(BMessage* data);
33	virtual						~BMenuField();
34
35	static	BArchivable*		Instantiate(BMessage* archive);
36	virtual	status_t			Archive(BMessage* archive,
37									bool deep = true) const;
38
39	virtual	void				Draw(BRect updateRect);
40	virtual	void				AttachedToWindow();
41	virtual	void				AllAttached();
42	virtual	void				MouseDown(BPoint where);
43	virtual	void				KeyDown(const char* bytes, int32 numBytes);
44	virtual	void				MakeFocus(bool focused);
45	virtual	void				MessageReceived(BMessage* message);
46	virtual	void				WindowActivated(bool active);
47	virtual	void				MouseUp(BPoint where);
48	virtual	void				MouseMoved(BPoint where, uint32 transit,
49									const BMessage* dragMessage);
50	virtual	void				DetachedFromWindow();
51	virtual	void				AllDetached();
52	virtual	void				FrameMoved(BPoint where);
53	virtual	void				FrameResized(float width, float height);
54
55			BMenu*				Menu() const;
56			BMenuBar*			MenuBar() const;
57			BMenuItem*			MenuItem() const;
58
59	virtual	void				SetLabel(const char* label);
60			const char*			Label() const;
61
62	virtual	void				SetEnabled(bool on);
63			bool				IsEnabled() const;
64
65	virtual	void				SetAlignment(alignment label);
66			alignment			Alignment() const;
67	virtual	void				SetDivider(float position);
68			float				Divider() const;
69
70			void				ShowPopUpMarker();
71			void				HidePopUpMarker();
72
73	virtual	BHandler*			ResolveSpecifier(BMessage* message,
74									int32 index, BMessage* specifier,
75									int32 form, const char* property);
76	virtual	status_t			GetSupportedSuites(BMessage* data);
77
78	virtual	void				ResizeToPreferred();
79	virtual	void				GetPreferredSize(float* width, float* height);
80
81	virtual	BSize				MinSize();
82	virtual	BSize				MaxSize();
83	virtual	BSize				PreferredSize();
84
85			BLayoutItem*		CreateLabelLayoutItem();
86			BLayoutItem*		CreateMenuBarLayoutItem();
87
88	virtual status_t			Perform(perform_code d, void* arg);
89
90protected:
91	virtual	status_t			AllArchived(BMessage* into) const;
92	virtual	status_t			AllUnarchived(const BMessage* from);
93
94	virtual	void				LayoutInvalidated(bool descendants);
95	virtual	void				DoLayout();
96
97private:
98	// FBC padding
99	virtual	void				_ReservedMenuField1();
100	virtual	void				_ReservedMenuField2();
101	virtual	void				_ReservedMenuField3();
102
103	// Forbidden
104			BMenuField&			operator=(const BMenuField& other);
105
106private:
107	class LabelLayoutItem;
108	class MenuBarLayoutItem;
109	struct LayoutData;
110
111	friend class _BMCMenuBar_;
112	friend class LabelLayoutItem;
113	friend class MenuBarLayoutItem;
114	friend struct LayoutData;
115
116								BMenuField(const char* name,
117									const char* label, BMenu* menu,
118									BMessage* message,
119									uint32 flags);
120								BMenuField(const char* label,
121									BMenu* menu, BMessage* message);
122
123			void				_DrawLabel(BRect updateRect);
124			void				_DrawMenuBar(BRect updateRect);
125
126			void				InitObject(const char* label);
127			void				InitObject2();
128
129	static	void				InitMenu(BMenu* menu);
130
131			int32				_MenuTask();
132	static	int32				_thread_entry(void *arg);
133
134			void				_UpdateFrame();
135			void				_InitMenuBar(BMenu* menu,
136									BRect frame, bool fixedSize);
137			void				_InitMenuBar(const BMessage* archive);
138			void				_AddMenu(BMenu* menu);
139
140			void				_ValidateLayoutData();
141			float				_MenuBarOffset() const;
142			float				_MenuBarWidth() const;
143
144			void				_DoneTracking(BPoint point);
145			void				_Track(BPoint point, uint32);
146
147private:
148			char*				fLabel;
149			BMenu*				fMenu;
150			BMenuBar*			fMenuBar;
151			alignment			fAlign;
152			float				fDivider;
153			bool				fEnabled;
154			bool				fFixedSizeMB;
155			thread_id			fMenuTaskID;
156
157			LayoutData*			fLayoutData;
158			BMessageFilter*		fMouseDownFilter;
159
160			uint32				_reserved[2];
161};
162
163
164#endif // _MENU_FIELD_H
165