summaryrefslogtreecommitdiffstats
path: root/fltk/fltk/compat/FL/Fl_Menu_Item.H
blob: 6b7a31a4d6c857fae753658f5bfcf5fc50a40665 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
//
// "$Id: Fl_Menu_Item.H 4886 2006-03-30 09:55:32Z fabien $"
//
// Back-compatability menu items for FLTK.  The new fltk::Menu class
// converts these tables into child fltk::Item and fltk::ItemGroup widgets.
// You should not use this for new programs.
//
// Copyright 1998-2006 by Bill Spitzak and others.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA.
//
// Please report all bugs and problems to "fltk-bugs@fltk.org".
//

#ifndef Fl_Menu_Item_h
#define Fl_Menu_Item_h

#include <fltk/Widget.h>

enum { // values for flags:
  FL_MENU_INACTIVE = 1,
  FL_MENU_TOGGLE= 2,
  FL_MENU_VALUE = 4,
  FL_MENU_RADIO = 8,
  FL_MENU_INVISIBLE = 0x10,
  FL_SUBMENU_POINTER = 0x20,
  FL_SUBMENU = 0x40,
  FL_MENU_DIVIDER = 0x80,
  FL_MENU_HORIZONTAL = 0x100 // not used!
};

namespace fltk {
  class FL_API Menu;
}

struct FL_API Fl_Menu_Item {
  const char *text;
  int shortcut_;
  fltk::Callback *callback_;
  void *user_data_;
  int flags;
  fltk::LabelType* labeltype_;
  fltk::Font* labelfont_;
  unsigned labelsize_;
  fltk::Color labelcolor_;

  // Used to add or set an fltk::Menu widget:
  void add_to(fltk::Menu*, void* data = 0) const;

  // popup menus without using an fltk::Menu widget:
  // Warning: this is now quite expensive, as it creates a temporary
  // fltk::Menu and child widgets!  These also do not match the fltk 1.0
  // calls, if there is any callback it is called directly (with the
  // dummy fltk::Menu as an argument).
  const Fl_Menu_Item*
	pulldown(int X, int Y, int W, int H,
		 const Fl_Menu_Item* picked = 0,
		 const char* title = 0) const;
  const Fl_Menu_Item*
	popup(int X, int Y, const char* title=0,
	      const Fl_Menu_Item* picked = 0) const {
    return pulldown(X, Y, 0, 0, picked, title);}
  const Fl_Menu_Item*
	test_shortcut() const;

  // return offset of terminating null item:
  int size() const ;

  // advance a pointer by N items, skipping submenus:
  const Fl_Menu_Item *next(int=1) const;
  Fl_Menu_Item *next(int i=1) {
    return (Fl_Menu_Item*)(((const Fl_Menu_Item*)this)->next(i));}

  const char* label() const {return text;}
  fltk::LabelType* labeltype() const {return labeltype_;}
  fltk::Color labelcolor() const {return labelcolor_;}
  fltk::Font* labelfont() const {return labelfont_;}
  unsigned labelsize() const {return labelsize_;}
  fltk::Callback_p callback() const {return callback_;}
  void* user_data() const {return user_data_;}
  long argument() const {return (long)user_data_;}
  int shortcut() const {return shortcut_;}
  int submenu() const {return flags&(FL_SUBMENU|FL_SUBMENU_POINTER);}
  int checkbox() const {return flags&FL_MENU_TOGGLE;}
  int radio() const {return flags&FL_MENU_RADIO;}
  int value() const {return flags&FL_MENU_VALUE;}
  int visible() const {return !(flags&FL_MENU_INVISIBLE);}
  int active() const {return !(flags&FL_MENU_INACTIVE);}
  int activevisible() const {return !(flags&0x11);}

  void label(const char* a) {text=a;}
  void label(fltk::LabelType* a,const char* b) {labeltype_ = a; text = b;}
  void labeltype(fltk::LabelType* a) {labeltype_ = a;}
  void labelcolor(uchar a) {labelcolor_ = a;}
  void labelfont(fltk::Font* a) {labelfont_ = a;}
  void labelsize(uchar a) {labelsize_ = a;}
  void callback(fltk::Callback* c, void* p) {callback_=c; user_data_=p;}
  void callback(fltk::Callback* c) {callback_=c;}
  void callback(fltk::Callback0*c) {callback_=(fltk::Callback*)c;}
  void callback(fltk::Callback1*c, long p=0) {callback_=(fltk::Callback*)c; user_data_=(void*)p;}
  void user_data(void* v) {user_data_ = v;}
  void argument(long v) {user_data_ = (void*)v;}
  void shortcut(int s) {shortcut_ = s;}
  void set() {flags |= FL_MENU_VALUE;}
  void clear() {flags &= ~FL_MENU_VALUE;}
  void setonly();
  void show() {flags &= ~FL_MENU_INVISIBLE;}
  void hide() {flags |= FL_MENU_INVISIBLE;}
  void activate() {flags &= ~FL_MENU_INACTIVE;}
  void deactivate() {flags |= FL_MENU_INACTIVE;}

  const Fl_Menu_Item* find_shortcut(int *ip=0) const;

  void do_callback(fltk::Widget* o) const {callback_(o, user_data_);}
  void do_callback(fltk::Widget* o,void* arg) const {callback_(o, arg);}
  void do_callback(fltk::Widget* o,long arg) const {callback_(o, (void*)arg);}

  // back-compatability, do not use:
  int checked() const {return flags&FL_MENU_VALUE;}
  void check() {flags |= FL_MENU_VALUE;}
  void uncheck() {flags &= ~FL_MENU_VALUE;}

#if 0
  int add(const char*, int shortcut, fltk::Callback*, void* =0, int = 0);
  int add(const char*a, const char* b, fltk::Callback* c,
	  void* d = 0, int e = 0) {
    return add(a,fltk::old_shortcut(b),c,d,e);}
#endif
};

typedef Fl_Menu_Item Fl_Menu; // back compatability with fltk < 1.0

enum {	// back-compatability enum:
  FL_PUP_NONE	= 0,
  FL_PUP_GREY	= FL_MENU_INACTIVE,
  FL_PUP_GRAY	= FL_MENU_INACTIVE,
  FL_MENU_BOX	= FL_MENU_TOGGLE,
  FL_PUP_BOX	= FL_MENU_TOGGLE,
  FL_MENU_CHECK	= FL_MENU_VALUE,
  FL_PUP_CHECK	= FL_MENU_VALUE,
  FL_PUP_RADIO	= FL_MENU_RADIO,
  FL_PUP_INVISIBLE = FL_MENU_INVISIBLE,
  FL_PUP_SUBMENU = FL_SUBMENU_POINTER
};

#endif

//
// End of "$Id: Fl_Menu_Item.H 4886 2006-03-30 09:55:32Z fabien $".
//