[773] | 1 | // "$Id: Menu.h 4319 2005-05-08 19:18:50Z spitzak $" |
---|
| 2 | // |
---|
| 3 | // Copyright 1998-2005 by Bill Spitzak and others. |
---|
| 4 | // |
---|
| 5 | // This library is free software; you can redistribute it and/or |
---|
| 6 | // modify it under the terms of the GNU Library General Public |
---|
| 7 | // License as published by the Free Software Foundation; either |
---|
| 8 | // version 2 of the License, or (at your option) any later version. |
---|
| 9 | // |
---|
| 10 | // This library is distributed in the hope that it will be useful, |
---|
| 11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
| 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
---|
| 13 | // Library General Public License for more details. |
---|
| 14 | // |
---|
| 15 | // You should have received a copy of the GNU Library General Public |
---|
| 16 | // License along with this library; if not, write to the Free Software |
---|
| 17 | // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
---|
| 18 | // USA. |
---|
| 19 | // |
---|
| 20 | // Please report all bugs and problems to "fltk-bugs@fltk.org". |
---|
| 21 | |
---|
| 22 | #ifndef fltk_Menu_h |
---|
| 23 | #define fltk_Menu_h |
---|
| 24 | |
---|
| 25 | #include "Group.h" |
---|
| 26 | |
---|
| 27 | namespace fltk { |
---|
| 28 | |
---|
| 29 | class FL_API Menu; |
---|
| 30 | |
---|
| 31 | class FL_API List { |
---|
| 32 | public: |
---|
| 33 | virtual int children(const Menu*, const int* indexes, int level); |
---|
| 34 | virtual Widget* child(const Menu*, const int* indexes, int level); |
---|
| 35 | virtual void flags_changed(const Menu*, Widget*); |
---|
| 36 | //virtual ~List() {} // not done as it slows program exit |
---|
| 37 | }; |
---|
| 38 | |
---|
| 39 | enum { // Special flag values for add(), you can also use Flags.h values |
---|
| 40 | // These match values from Fl_Menu_Item in fltk 1.0: |
---|
| 41 | MENU_TOGGLE = 2, |
---|
| 42 | MENU_RADIO = 8, |
---|
| 43 | SUBMENU = 0x40, |
---|
| 44 | MENU_DIVIDER = 0x80 |
---|
| 45 | }; |
---|
| 46 | |
---|
| 47 | class FL_API Menu : public Group { |
---|
| 48 | |
---|
| 49 | public: |
---|
| 50 | |
---|
| 51 | Menu(int,int,int,int, const char* l=0); |
---|
| 52 | List* list() const {return list_;} |
---|
| 53 | void list(List* l) {list_ = l;} |
---|
| 54 | void layout(); |
---|
| 55 | |
---|
| 56 | static NamedStyle* default_style; |
---|
| 57 | |
---|
| 58 | int children(const int* indexes, int level) const ; |
---|
| 59 | int children(int index) const; |
---|
| 60 | int children() const ; |
---|
| 61 | Widget* child(const int* indexes, int level) const ; |
---|
| 62 | Widget* child(int index) const ; |
---|
| 63 | |
---|
| 64 | Widget* item() const {return item_;} |
---|
| 65 | Widget* item(Widget* v) {return item_ = v;} |
---|
| 66 | |
---|
| 67 | bool set_item(const int* indexes, int level); |
---|
| 68 | Widget* get_item(); |
---|
| 69 | int value() const {return Group::focus_index();} |
---|
| 70 | bool value(int v); |
---|
| 71 | int size() const {return children();} |
---|
| 72 | |
---|
| 73 | void layout_in(Widget*,const int* indexes, int level) const; |
---|
| 74 | void draw_in(Widget*,const int* indexes, int level, int, int) const; |
---|
| 75 | int find_selected(Widget*,const int* indexes, int level, int, int) const; |
---|
| 76 | Rectangle get_location(Widget*,const int* indexes, int level, int) const; |
---|
| 77 | |
---|
| 78 | int popup(const Rectangle&, const char* title=0,bool menubar=false); |
---|
| 79 | int handle_shortcut(); |
---|
| 80 | static void default_callback(Widget*, void*); |
---|
| 81 | void execute(Widget*); |
---|
| 82 | void global(); |
---|
| 83 | |
---|
| 84 | Widget* find(const char*) const; |
---|
| 85 | void remove(const char* l) { delete find(l); } |
---|
| 86 | Widget* add(const char*, unsigned shortcut, Callback*, void* = 0, int = 0); |
---|
| 87 | Widget* replace(const char*, unsigned shortcut, Callback*, void* = 0, int = 0); |
---|
| 88 | Widget* insert(int n, const char*, unsigned shortcut, Callback*, void* = 0, int = 0); |
---|
| 89 | Widget* add(const char*, void* = 0); |
---|
| 90 | Widget* add_many(const char*); |
---|
| 91 | Widget* replace(const char*, void* = 0); |
---|
| 92 | Widget* insert(int n, const char*, void* = 0); |
---|
| 93 | |
---|
| 94 | // Undo the overrides of stuff from Group: |
---|
| 95 | void add(Widget& o) {Group::add(o);} |
---|
| 96 | void add(Widget* o) {add(*o);} |
---|
| 97 | void insert(Widget& o, int n) {Group::insert(o, n);} |
---|
| 98 | void replace(int index, Widget& o) {Group::replace(index, o);} |
---|
| 99 | void replace(Widget& old, Widget& o) {Group::replace(old,o);} |
---|
| 100 | void remove(int index) {Group::remove(index);} |
---|
| 101 | void remove(Widget& o) {Group::remove(o);} |
---|
| 102 | void remove(Widget* o) {Group::remove(o);} |
---|
| 103 | |
---|
| 104 | #ifdef Fl_Menu_Item_h |
---|
| 105 | // Commented-out methods cannot be emulated. |
---|
| 106 | //const Fl_Menu_Item* test_shortcut(); |
---|
| 107 | //Fl_Menu_Item* menu() const; |
---|
| 108 | void copy(const Fl_Menu_Item* m, void* data = 0) {clear(); m->add_to(this,data);} |
---|
| 109 | void menu(const Fl_Menu_Item* m) {copy(m,0);} |
---|
| 110 | void replace(int n, const char* s) { child(n)->label(s); } |
---|
| 111 | void replace(const char* l, const char* s) { find(l)->label(s); } |
---|
| 112 | void shortcut(const char* l, unsigned s) { find(l)->shortcut(s); } |
---|
| 113 | void shortcut(unsigned s) {Widget::shortcut(s);} |
---|
| 114 | unsigned shortcut() const {return Widget::shortcut();} |
---|
| 115 | void shortcut(int i, unsigned s) { child(i)->shortcut(s); } |
---|
| 116 | //int index(Fl_Menu_Item* m) const { return m - menu_; } |
---|
| 117 | //int index(const char* label) const; |
---|
| 118 | //void replace(Fl_Menu_Item* m, const char* s) { replace(index(m), s); } |
---|
| 119 | //void remove(Fl_Menu_Item* m) { remove(index(m)); } |
---|
| 120 | //void shortcut(Fl_Menu_Item* m, unsigned s) {shortcut(index(m), s);} |
---|
| 121 | //void mode(int i,int x); |
---|
| 122 | //void mode(Fl_Menu_Item* m, int x) {mode(index(m), x);} |
---|
| 123 | //void mode(const char* l, int x) {mode(index(l), x);} |
---|
| 124 | unsigned mode(int i) const {return child(i)->flags() >> 8;} |
---|
| 125 | //unsigned mode(Fl_Menu_Item* m) const {return mode(index(m));} |
---|
| 126 | unsigned mode(const char* l) const {return find(l)->flags() >> 8;} |
---|
| 127 | |
---|
| 128 | // in fltk 1.0 these returned/took an Fl_Menu_Item*: |
---|
| 129 | Widget* mvalue() {return item();} |
---|
| 130 | //void value(Widget* o) {set_item(o);} |
---|
| 131 | |
---|
| 132 | const char *text(int i) const {return i >= 0 ? child(i)->label() : 0;} |
---|
| 133 | const char *text() const {Widget* w = item(); return w ? w->label() : 0;} |
---|
| 134 | #endif |
---|
| 135 | |
---|
| 136 | protected: |
---|
| 137 | Widget *try_popup(const Rectangle&,const char* title=0,bool menubar=false); |
---|
| 138 | |
---|
| 139 | private: |
---|
| 140 | List* list_; |
---|
| 141 | Widget* item_; |
---|
| 142 | }; |
---|
| 143 | |
---|
| 144 | } |
---|
| 145 | |
---|
| 146 | #endif |
---|
| 147 | |
---|
| 148 | // |
---|
| 149 | // End of "$Id: Menu.h 4319 2005-05-08 19:18:50Z spitzak $". |
---|
| 150 | // |
---|