2 // "$Id: Fl_Menu_Item.H 7983 2010-12-09 00:04:06Z AlbrechtS $"
4 // Menu item header file for the Fast Light Tool Kit (FLTK).
6 // Copyright 1998-2010 by Bill Spitzak and others.
8 // This library is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU Library General Public
10 // License as published by the Free Software Foundation; either
11 // version 2 of the License, or (at your option) any later version.
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // Library General Public License for more details.
18 // You should have received a copy of the GNU Library General Public
19 // License along with this library; if not, write to the Free Software
20 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
23 // Please report all bugs and problems on the following page:
25 // http://www.fltk.org/str.php
28 #ifndef Fl_Menu_Item_H
29 #define Fl_Menu_Item_H
31 # include "Fl_Widget.H"
32 # include "Fl_Image.H"
34 # if defined(__APPLE__) && defined(check)
38 enum { // values for flags:
39 FL_MENU_INACTIVE = 1, ///< Deactivate menu item (gray out)
40 FL_MENU_TOGGLE= 2, ///< Item is a checkbox toggle (shows checkbox for on/off state)
41 FL_MENU_VALUE = 4, ///< The on/off state for checkbox/radio buttons (if set, state is 'on')
42 FL_MENU_RADIO = 8, ///< Item is a radio button (one checkbox of many can be on)
43 FL_MENU_INVISIBLE = 0x10, ///< Item will not show up (shortcut will work)
44 FL_SUBMENU_POINTER = 0x20, ///< Indicates user_data() is a pointer to another menu array
45 FL_SUBMENU = 0x40, ///< This item is a submenu to other items
46 FL_MENU_DIVIDER = 0x80, ///< Creates divider line below this item. Also ends a group of radio buttons.
47 FL_MENU_HORIZONTAL = 0x100 ///< ??? -- reserved
50 extern FL_EXPORT Fl_Shortcut fl_old_shortcut(const char*);
55 The Fl_Menu_Item structure defines a single menu item that
56 is used by the Fl_Menu_ class.
59 const char* text; // label()
61 Fl_Callback* callback_;
70 enum { // values for flags:
71 FL_MENU_INACTIVE = 1, // Deactivate menu item (gray out)
72 FL_MENU_TOGGLE = 2, // Item is a checkbox toggle (shows checkbox for on/off state)
73 FL_MENU_VALUE = 4, // The on/off state for checkbox/radio buttons (if set, state is 'on')
74 FL_MENU_RADIO = 8, // Item is a radio button (one checkbox of many can be on)
75 FL_MENU_INVISIBLE = 0x10, // Item will not show up (shortcut will work)
76 FL_SUBMENU_POINTER = 0x20, // Indicates user_data() is a pointer to another menu array
77 FL_SUBMENU = 0x40, // This item is a submenu to other items
78 FL_MENU_DIVIDER = 0x80, // Creates divider line below this item. Also ends a group of radio buttons.
79 FL_MENU_HORIZONTAL = 0x100 // ??? -- reserved
82 Typically menu items are statically defined; for example:
84 Fl_Menu_Item popup[] = {
85 {"&alpha", FL_ALT+'a', the_cb, (void*)1},
86 {"&beta", FL_ALT+'b', the_cb, (void*)2},
87 {"gamma", FL_ALT+'c', the_cb, (void*)3, FL_MENU_DIVIDER},
88 {"&strange", 0, strange_cb},
89 {"&charm", 0, charm_cb},
90 {"&truth", 0, truth_cb},
91 {"b&eauty", 0, beauty_cb},
92 {"sub&menu", 0, 0, 0, FL_SUBMENU},
97 {"inactive", FL_ALT+'i', 0, 0, FL_MENU_INACTIVE|FL_MENU_DIVIDER},
98 {"invisible",FL_ALT+'i', 0, 0, FL_MENU_INVISIBLE},
99 {"check", FL_ALT+'i', 0, 0, FL_MENU_TOGGLE|FL_MENU_VALUE},
100 {"box", FL_ALT+'i', 0, 0, FL_MENU_TOGGLE},
106 \image latex menu.png "menu" width=10cm
108 A submenu title is identified by the bit FL_SUBMENU in the
109 flags field, and ends with a label() that is NULL.
110 You can nest menus to any depth. A pointer to the first item in the
111 submenu can be treated as an Fl_Menu array itself. It is also
112 possible to make separate submenu arrays with FL_SUBMENU_POINTER flags.
114 You should use the method functions to access structure members and
115 not access them directly to avoid compatibility problems with future
118 struct FL_EXPORT Fl_Menu_Item {
119 const char *text; ///< menu item text, returned by label()
120 int shortcut_; ///< menu item shortcut
121 Fl_Callback *callback_; ///< menu item callback
122 void *user_data_; ///< menu item user_data for the menu's callback
123 int flags; ///< menu item flags like FL_MENU_TOGGLE, FL_MENU_RADIO
124 uchar labeltype_; ///< how the menu item text looks like
125 Fl_Font labelfont_; ///< which font for this menu item text
126 Fl_Fontsize labelsize_; ///< size of menu item text
127 Fl_Color labelcolor_; ///< menu item text color
129 // advance N items, skipping submenus:
130 const Fl_Menu_Item *next(int=1) const;
133 Advances a pointer by n items through a menu array, skipping
134 the contents of submenus and invisible items. There are two calls so
135 that you can advance through const and non-const data.
137 Fl_Menu_Item *next(int i=1) {
138 return (Fl_Menu_Item*)(((const Fl_Menu_Item*)this)->next(i));}
140 /** Returns the first menu item, same as next(0). */
141 const Fl_Menu_Item *first() const { return next(0); }
143 /** Returns the first menu item, same as next(0). */
144 Fl_Menu_Item *first() { return next(0); }
146 // methods on menu items:
148 Returns the title of the item.
149 A NULL here indicates the end of the menu (or of a submenu).
150 A '&' in the item will print an underscore under the next letter,
151 and if the menu is popped up that letter will be a "shortcut" to pick
152 that item. To get a real '&' put two in a row.
154 const char* label() const {return text;}
156 /** See const char* Fl_Menu_Item::label() const */
157 void label(const char* a) {text=a;}
159 /** See const char* Fl_Menu_Item::label() const */
160 void label(Fl_Labeltype a,const char* b) {labeltype_ = a; text = b;}
163 Returns the menu item's labeltype.
164 A labeltype identifies a routine that draws the label of the
165 widget. This can be used for special effects such as emboss, or to use
166 the label() pointer as another form of data such as a bitmap.
167 The value FL_NORMAL_LABEL prints the label as text.
169 Fl_Labeltype labeltype() const {return (Fl_Labeltype)labeltype_;}
172 Sets the menu item's labeltype.
173 A labeltype identifies a routine that draws the label of the
174 widget. This can be used for special effects such as emboss, or to use
175 the label() pointer as another form of data such as a bitmap.
176 The value FL_NORMAL_LABEL prints the label as text.
178 void labeltype(Fl_Labeltype a) {labeltype_ = a;}
181 Gets the menu item's label color.
182 This color is passed to the labeltype routine, and is typically the
183 color of the label text. This defaults to FL_BLACK. If this
184 color is not black fltk will \b not use overlay bitplanes to draw
185 the menu - this is so that images put in the menu draw correctly.
187 Fl_Color labelcolor() const {return labelcolor_;}
190 Sets the menu item's label color.
191 \see Fl_Color Fl_Menu_Item::labelcolor() const
193 void labelcolor(Fl_Color a) {labelcolor_ = a;}
195 Gets the menu item's label font.
196 Fonts are identified by small 8-bit indexes into a table. See the
197 enumeration list for predefined fonts. The default value is a
198 Helvetica font. The function Fl::set_font() can define new fonts.
200 Fl_Font labelfont() const {return labelfont_;}
203 Sets the menu item's label font.
204 Fonts are identified by small 8-bit indexes into a table. See the
205 enumeration list for predefined fonts. The default value is a
206 Helvetica font. The function Fl::set_font() can define new fonts.
208 void labelfont(Fl_Font a) {labelfont_ = a;}
210 /** Gets the label font pixel size/height. */
211 Fl_Fontsize labelsize() const {return labelsize_;}
213 /** Sets the label font pixel size/height.*/
214 void labelsize(Fl_Fontsize a) {labelsize_ = a;}
217 Returns the callback function that is set for the menu item.
218 Each item has space for a callback function and an argument for that
219 function. Due to back compatibility, the Fl_Menu_Item itself
220 is not passed to the callback, instead you have to get it by calling
221 ((Fl_Menu_*)w)->mvalue() where w is the widget argument.
223 Fl_Callback_p callback() const {return callback_;}
226 Sets the menu item's callback function and userdata() argument.
227 \see Fl_Callback_p Fl_MenuItem::callback() const
229 void callback(Fl_Callback* c, void* p) {callback_=c; user_data_=p;}
232 Sets the menu item's callback function.
233 This method does not set the userdata() argument.
234 \see Fl_Callback_p Fl_MenuItem::callback() const
236 void callback(Fl_Callback* c) {callback_=c;}
239 Sets the menu item's callback function.
240 This method does not set the userdata() argument.
241 \see Fl_Callback_p Fl_MenuItem::callback() const
243 void callback(Fl_Callback0*c) {callback_=(Fl_Callback*)c;}
246 Sets the menu item's callback function and userdata() argument.
247 This method does not set the userdata() argument.
248 The argument \p is cast to void* and stored as the userdata()
249 for the menu item's callback function.
250 \see Fl_Callback_p Fl_MenuItem::callback() const
252 void callback(Fl_Callback1*c, long p=0) {callback_=(Fl_Callback*)c; user_data_=(void*)p;}
255 Gets the user_data() argument that is sent to the callback function.
257 void* user_data() const {return user_data_;}
259 Sets the user_data() argument that is sent to the callback function.
261 void user_data(void* v) {user_data_ = v;}
263 Gets the user_data() argument that is sent to the callback function.
264 For convenience you can also define the callback as taking a long
265 argument. This method casts the stored userdata() argument to long
266 and returns it as a \e long value.
268 long argument() const {return (long)(fl_intptr_t)user_data_;}
270 Sets the user_data() argument that is sent to the callback function.
271 For convenience you can also define the callback as taking a long
272 argument. This method casts the given argument \p v to void*
273 and stores it in the menu item's userdata() member.
274 This may not be portable to some machines.
276 void argument(long v) {user_data_ = (void*)v;}
278 /** Gets what key combination shortcut will trigger the menu item. */
279 int shortcut() const {return shortcut_;}
282 Sets exactly what key combination will trigger the menu item. The
283 value is a logical 'or' of a key and a set of shift flags, for instance
284 FL_ALT+'a' or FL_ALT+FL_F+10 or just 'a'. A value of
285 zero disables the shortcut.
287 The key can be any value returned by Fl::event_key(), but will usually
288 be an ASCII letter. Use a lower-case letter unless you require the shift
291 The shift flags can be any set of values accepted by Fl::event_state().
292 If the bit is on that shift key must be pushed. Meta, Alt, Ctrl,
293 and Shift must be off if they are not in the shift flags (zero for the
294 other bits indicates a "don't care" setting).
296 void shortcut(int s) {shortcut_ = s;}
298 Returns true if either FL_SUBMENU or FL_SUBMENU_POINTER
299 is on in the flags. FL_SUBMENU indicates an embedded submenu
300 that goes from the next item through the next one with a NULL
301 label(). FL_SUBMENU_POINTER indicates that user_data()
302 is a pointer to another menu array.
304 int submenu() const {return flags&(FL_SUBMENU|FL_SUBMENU_POINTER);}
306 Returns true if a checkbox will be drawn next to this item.
307 This is true if FL_MENU_TOGGLE or FL_MENU_RADIO is set in the flags.
309 int checkbox() const {return flags&FL_MENU_TOGGLE;}
311 Returns true if this item is a radio item.
312 When a radio button is selected all "adjacent" radio buttons are
313 turned off. A set of radio items is delimited by an item that has
314 radio() false, or by an item with FL_MENU_DIVIDER turned on.
316 int radio() const {return flags&FL_MENU_RADIO;}
317 /** Returns the current value of the check or radio item. */
318 int value() const {return flags&FL_MENU_VALUE;}
320 Turns the check or radio item "on" for the menu item. Note that this
321 does not turn off any adjacent radio items like set_only() does.
323 void set() {flags |= FL_MENU_VALUE;}
325 /** Turns the check or radio item "off" for the menu item. */
326 void clear() {flags &= ~FL_MENU_VALUE;}
330 /** Gets the visibility of an item. */
331 int visible() const {return !(flags&FL_MENU_INVISIBLE);}
333 /** Makes an item visible in the menu. */
334 void show() {flags &= ~FL_MENU_INVISIBLE;}
336 /** Hides an item in the menu. */
337 void hide() {flags |= FL_MENU_INVISIBLE;}
339 /** Gets whether or not the item can be picked. */
340 int active() const {return !(flags&FL_MENU_INACTIVE);}
342 /** Allows a menu item to be picked. */
343 void activate() {flags &= ~FL_MENU_INACTIVE;}
345 Prevents a menu item from being picked. Note that this will also cause
346 the menu item to appear grayed-out.
348 void deactivate() {flags |= FL_MENU_INACTIVE;}
349 /** Returns non 0 if FL_INACTIVE and FL_INVISIBLE are cleared, 0 otherwise. */
350 int activevisible() const {return !(flags & (FL_MENU_INACTIVE|FL_MENU_INVISIBLE));}
352 // compatibility for FLUID so it can set the image of a menu item...
354 /** compatibility api for FLUID, same as a->label(this) */
355 void image(Fl_Image* a) {a->label(this);}
357 /** compatibility api for FLUID, same as a.label(this) */
358 void image(Fl_Image& a) {a.label(this);}
361 int measure(int* h, const Fl_Menu_*) const;
362 void draw(int x, int y, int w, int h, const Fl_Menu_*, int t=0) const;
364 // popup menus without using an Fl_Menu_ widget:
365 const Fl_Menu_Item* popup(
367 const char *title = 0,
368 const Fl_Menu_Item* picked=0,
369 const Fl_Menu_* = 0) const;
370 const Fl_Menu_Item* pulldown(
371 int X, int Y, int W, int H,
372 const Fl_Menu_Item* picked = 0,
374 const Fl_Menu_Item* title = 0,
375 int menubar=0) const;
376 const Fl_Menu_Item* test_shortcut() const;
377 const Fl_Menu_Item* find_shortcut(int *ip=0, const bool require_alt = false) const;
380 Calls the Fl_Menu_Item item's callback, and provides the Fl_Widget argument.
381 The callback is called with the stored user_data() as its second argument.
382 You must first check that callback() is non-zero before calling this.
384 void do_callback(Fl_Widget* o) const {callback_(o, user_data_);}
387 Calls the Fl_Menu_Item item's callback, and provides the Fl_Widget argument.
388 This call overrides the callback's second argument with the given value \p arg.
389 You must first check that callback() is non-zero before calling this.
391 void do_callback(Fl_Widget* o,void* arg) const {callback_(o, arg);}
394 Calls the Fl_Menu_Item item's callback, and provides the Fl_Widget argument.
395 This call overrides the callback's second argument with the
396 given value \p arg. long \p arg is cast to void* when calling
398 You must first check that callback() is non-zero before calling this.
400 void do_callback(Fl_Widget* o,long arg) const {callback_(o, (void*)arg);}
402 // back-compatibility, do not use:
404 /** back compatibility only \deprecated. */
405 int checked() const {return flags&FL_MENU_VALUE;}
407 /** back compatibility only \deprecated. */
408 void check() {flags |= FL_MENU_VALUE;}
410 /** back compatibility only \deprecated. */
411 void uncheck() {flags &= ~FL_MENU_VALUE;}
413 int insert(int,const char*,int,Fl_Callback*,void* =0, int =0);
414 int add(const char*, int shortcut, Fl_Callback*, void* =0, int = 0);
416 /** See int add(const char*, int shortcut, Fl_Callback*, void*, int) */
417 int add(const char*a, const char* b, Fl_Callback* c,
418 void* d = 0, int e = 0) {
419 return add(a,fl_old_shortcut(b),c,d,e);}
424 typedef Fl_Menu_Item Fl_Menu; // back compatibility
426 enum { // back-compatibility enum:
428 FL_PUP_GREY = FL_MENU_INACTIVE,
429 FL_PUP_GRAY = FL_MENU_INACTIVE,
430 FL_MENU_BOX = FL_MENU_TOGGLE,
431 FL_PUP_BOX = FL_MENU_TOGGLE,
432 FL_MENU_CHECK = FL_MENU_VALUE,
433 FL_PUP_CHECK = FL_MENU_VALUE,
434 FL_PUP_RADIO = FL_MENU_RADIO,
435 FL_PUP_INVISIBLE = FL_MENU_INVISIBLE,
436 FL_PUP_SUBMENU = FL_SUBMENU_POINTER
442 // End of "$Id: Fl_Menu_Item.H 7983 2010-12-09 00:04:06Z AlbrechtS $".