[773] | 1 | // |
---|
| 2 | // "$Id: Widget.h 4366 2005-05-23 05:11:51Z spitzak $" |
---|
| 3 | // |
---|
| 4 | // The base class of all widgets. |
---|
| 5 | // |
---|
| 6 | // Copyright 1998-2003 by Bill Spitzak and others. |
---|
| 7 | // |
---|
| 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. |
---|
| 12 | // |
---|
| 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. |
---|
| 17 | // |
---|
| 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 |
---|
| 21 | // USA. |
---|
| 22 | // |
---|
| 23 | // Please report all bugs and problems to "fltk-bugs@fltk.org". |
---|
| 24 | // |
---|
| 25 | |
---|
| 26 | #ifndef fltk_Widget_h |
---|
| 27 | #define fltk_Widget_h |
---|
| 28 | |
---|
| 29 | #include "Style.h" |
---|
| 30 | #include "Rectangle.h" |
---|
| 31 | |
---|
| 32 | namespace fltk { |
---|
| 33 | |
---|
| 34 | class FL_API Widget; |
---|
| 35 | class FL_API Window; |
---|
| 36 | class FL_API Symbol; |
---|
| 37 | class FL_API Group; |
---|
| 38 | struct Cursor; |
---|
| 39 | |
---|
| 40 | typedef void (Callback )(Widget*, void*); |
---|
| 41 | typedef Callback* Callback_p; // needed for BORLAND |
---|
| 42 | typedef void (Callback0)(Widget*); |
---|
| 43 | typedef void (Callback1)(Widget*, long); |
---|
| 44 | |
---|
| 45 | class FL_API Widget : public Rectangle { |
---|
| 46 | // disable the copy assignment/constructors: |
---|
| 47 | Widget & operator=(const Widget &); |
---|
| 48 | Widget(const Widget &); |
---|
| 49 | |
---|
| 50 | public: |
---|
| 51 | |
---|
| 52 | Widget(int,int,int,int,const char* =0); |
---|
| 53 | virtual ~Widget(); |
---|
| 54 | |
---|
| 55 | virtual void draw(); |
---|
| 56 | virtual int handle(int); |
---|
| 57 | int send(int event); |
---|
| 58 | virtual void layout(); |
---|
| 59 | |
---|
| 60 | const Style* style() const { return style_; } |
---|
| 61 | void style(const Style* s) { style_ = s; } |
---|
| 62 | void style(const Style& s) { style_ = &s; } |
---|
| 63 | bool copy_style(const Style* s); |
---|
| 64 | static NamedStyle* default_style; |
---|
| 65 | static void default_glyph(int, const Rectangle&); |
---|
| 66 | |
---|
| 67 | Group* parent() const { return parent_; } |
---|
| 68 | void parent(Group* w) { parent_ = w; } |
---|
| 69 | Window* window() const ; |
---|
| 70 | |
---|
| 71 | enum { // values for type(): |
---|
| 72 | RESERVED_TYPE = 0x64, |
---|
| 73 | GROUP_TYPE = 0xe0, |
---|
| 74 | WINDOW_TYPE = 0xf0 |
---|
| 75 | }; |
---|
| 76 | uchar type() const { return type_; } |
---|
| 77 | void type(uchar t) { type_ = t; } |
---|
| 78 | bool is_group() const { return type_ >= GROUP_TYPE; } |
---|
| 79 | bool is_window() const { return type_ >= WINDOW_TYPE; } |
---|
| 80 | |
---|
| 81 | bool resize(int x,int y,int w,int h); |
---|
| 82 | bool position(int x, int y) ; |
---|
| 83 | bool resize(int w, int h) ; |
---|
| 84 | |
---|
| 85 | void get_absolute_rect( Rectangle *rect ) const; |
---|
| 86 | |
---|
| 87 | const char* label() const { return label_; } |
---|
| 88 | void label(const char* a); |
---|
| 89 | void copy_label(const char* a); |
---|
| 90 | |
---|
| 91 | const Symbol* image() const { return image_; } |
---|
| 92 | void image(const Symbol* a) { image_ = a; } |
---|
| 93 | void image(const Symbol& a) { image_ = &a; } |
---|
| 94 | |
---|
| 95 | const char *tooltip() const { return tooltip_; } |
---|
| 96 | void tooltip(const char *t) { tooltip_ = t; } |
---|
| 97 | |
---|
| 98 | unsigned shortcut() const ; |
---|
| 99 | bool shortcut(unsigned key) ; |
---|
| 100 | bool add_shortcut(unsigned key); |
---|
| 101 | bool remove_shortcut(unsigned key); |
---|
| 102 | bool remove_shortcuts() ; |
---|
| 103 | unsigned label_shortcut() const; |
---|
| 104 | bool test_label_shortcut() const; |
---|
| 105 | bool test_shortcut() const ; |
---|
| 106 | bool test_shortcut(bool) const; |
---|
| 107 | |
---|
| 108 | Callback_p callback() const { return callback_; } |
---|
| 109 | void callback(Callback* c, void* p) { callback_=c; user_data_=p; } |
---|
| 110 | void callback(Callback* c) { callback_=c; } |
---|
| 111 | void callback(Callback0*c) { callback_=(Callback*)c; } |
---|
| 112 | void callback(Callback1*c, long p=0) { callback_=(Callback*)c; user_data_=(void*)p; } |
---|
| 113 | void* user_data() const { return user_data_; } |
---|
| 114 | void user_data(void* v) { user_data_ = v; } |
---|
| 115 | long argument() const { return (long)user_data_; } |
---|
| 116 | void argument(long v) { user_data_ = (void*)v; } |
---|
| 117 | uchar when() const { return when_; } |
---|
| 118 | void when(uchar i) { when_ = i; } |
---|
| 119 | |
---|
| 120 | static void default_callback(Widget*, void*); |
---|
| 121 | void do_callback() { callback_(this,user_data_); } |
---|
| 122 | void do_callback(Widget* o,void* arg=0) { callback_(o,arg); } |
---|
| 123 | void do_callback(Widget* o,long arg) { callback_(o,(void*)arg); } |
---|
| 124 | bool contains(const Widget*) const; |
---|
| 125 | bool inside(const Widget* o) const { return o && o->contains(this); } |
---|
| 126 | bool pushed() const ; |
---|
| 127 | bool focused() const ; |
---|
| 128 | bool belowmouse() const ; |
---|
| 129 | |
---|
| 130 | Flags flags() const { return flags_; } |
---|
| 131 | Flags flags(Flags f) { return flags_ = f; } |
---|
| 132 | Flags set_flag(int c) { return flags_ |= c; } |
---|
| 133 | Flags clear_flag(int c) { return flags_ &= ~c; } |
---|
| 134 | Flags invert_flag(int c) { return flags_ ^= c; } |
---|
| 135 | |
---|
| 136 | Flags align() const { return flags_&ALIGN_MASK; } |
---|
| 137 | void align(unsigned a) { flags_ = (flags_ & (~ALIGN_MASK)) | a; } |
---|
| 138 | bool visible() const { return !(flags_&INVISIBLE); } |
---|
| 139 | bool visible_r() const ; |
---|
| 140 | void show() ; |
---|
| 141 | void hide() ; |
---|
| 142 | void set_visible() { flags_ &= ~INVISIBLE; } |
---|
| 143 | void clear_visible() { flags_ |= INVISIBLE; } |
---|
| 144 | bool active() const { return !(flags_&NOTACTIVE); } |
---|
| 145 | bool active_r() const ; |
---|
| 146 | void activate() ; |
---|
| 147 | void activate(int b) { if (b) activate(); else deactivate(); } |
---|
| 148 | void deactivate() ; |
---|
| 149 | bool output() const { return (flags_&OUTPUT)!=0; } |
---|
| 150 | void set_output() { flags_ |= OUTPUT; } |
---|
| 151 | void clear_output() { flags_ &= ~OUTPUT; } |
---|
| 152 | bool takesevents() const { return !(flags_&(OUTPUT|INVISIBLE|NOTACTIVE)); } |
---|
| 153 | bool changed() const { return (flags_&CHANGED)!=0; } |
---|
| 154 | void set_changed() { flags_ |= CHANGED; } |
---|
| 155 | void clear_changed() { flags_ &= ~CHANGED; } |
---|
| 156 | bool value() const { return (flags_&VALUE)!=0; } |
---|
| 157 | void set_value() { flags_ |= VALUE; } |
---|
| 158 | void clear_value() { flags_ &= ~VALUE; } |
---|
| 159 | bool selected() const { return (flags_&SELECTED)!=0; } |
---|
| 160 | void set_selected() { flags_ |= SELECTED; } |
---|
| 161 | void clear_selected() { flags_ &= ~SELECTED; } |
---|
| 162 | bool click_to_focus() { return (flags_ & CLICK_TO_FOCUS) != 0; } |
---|
| 163 | void set_click_to_focus() { flags_ |= CLICK_TO_FOCUS; } |
---|
| 164 | void clear_click_to_focus() { flags_ &= ~CLICK_TO_FOCUS; } |
---|
| 165 | bool tab_to_focus() { return (flags_ & TAB_TO_FOCUS) != 0; } |
---|
| 166 | void set_tab_to_focus() { flags_ |= TAB_TO_FOCUS; } |
---|
| 167 | void clear_tab_to_focus() { flags_ &= ~(TAB_TO_FOCUS|CLICK_TO_FOCUS); } |
---|
| 168 | bool horizontal() const { return !(flags_&LAYOUT_VERTICAL);} |
---|
| 169 | bool vertical() const { return (flags_&LAYOUT_VERTICAL)!=0;} |
---|
| 170 | void set_horizontal() { flags_ &= ~LAYOUT_VERTICAL; } |
---|
| 171 | void set_vertical() { flags_ |= LAYOUT_VERTICAL; } |
---|
| 172 | |
---|
| 173 | bool take_focus() ; |
---|
| 174 | void throw_focus() ; |
---|
| 175 | |
---|
| 176 | void redraw() ; |
---|
| 177 | void redraw(uchar c) ; |
---|
| 178 | void redraw_label() ; |
---|
| 179 | void redraw_highlight() ; |
---|
| 180 | void redraw(const Rectangle&); |
---|
| 181 | uchar damage() const { return damage_; } |
---|
| 182 | void set_damage(uchar c) { damage_ = c; } // should be called damage(c) |
---|
| 183 | |
---|
| 184 | void relayout() ; |
---|
| 185 | void relayout(uchar damage) ; |
---|
| 186 | uchar layout_damage() const { return layout_damage_; } |
---|
| 187 | void layout_damage(uchar c) { layout_damage_ = c; } |
---|
| 188 | |
---|
| 189 | void add_timeout(float) ; |
---|
| 190 | void repeat_timeout(float) ; |
---|
| 191 | void remove_timeout() ; |
---|
| 192 | |
---|
| 193 | void make_current() const ; |
---|
| 194 | void draw_background() const ; |
---|
| 195 | void draw_frame() const ; |
---|
| 196 | void draw_box() const ; |
---|
| 197 | void draw_glyph(int t, const Rectangle& r) const {glyph()(t,r);} |
---|
| 198 | void draw_label() const ; |
---|
| 199 | void draw_label(const Rectangle&, Flags) const ; |
---|
| 200 | void cursor(Cursor*) const ; |
---|
| 201 | |
---|
| 202 | void measure_label(int&, int&) const ; |
---|
| 203 | |
---|
| 204 | Box* box() const; |
---|
| 205 | Box* buttonbox() const; |
---|
| 206 | Box* focusbox() const; |
---|
| 207 | GlyphStyle glyph() const; |
---|
| 208 | Font* labelfont() const; |
---|
| 209 | Font* textfont() const; |
---|
| 210 | LabelType* labeltype() const; |
---|
| 211 | Color color() const; |
---|
| 212 | Color textcolor() const; |
---|
| 213 | Color selection_color() const; |
---|
| 214 | Color selection_textcolor() const; |
---|
| 215 | Color buttoncolor() const; |
---|
| 216 | Color labelcolor() const; |
---|
| 217 | Color highlight_color() const; |
---|
| 218 | Color highlight_textcolor() const; |
---|
| 219 | float labelsize() const; |
---|
| 220 | float textsize() const; |
---|
| 221 | float leading() const; |
---|
| 222 | unsigned char scrollbar_align() const; |
---|
| 223 | unsigned char scrollbar_width() const; |
---|
| 224 | |
---|
| 225 | void box(Box*) ; |
---|
| 226 | void buttonbox(Box*) ; |
---|
| 227 | void focusbox(Box*) ; |
---|
| 228 | void glyph(GlyphStyle) ; |
---|
| 229 | void labelfont(Font*) ; |
---|
| 230 | void textfont(Font*) ; |
---|
| 231 | void labeltype(LabelType*) ; |
---|
| 232 | void color(Color) ; |
---|
| 233 | void textcolor(Color a) ; |
---|
| 234 | void selection_color(Color) ; |
---|
| 235 | void selection_textcolor(Color); |
---|
| 236 | void buttoncolor(Color) ; |
---|
| 237 | void labelcolor(Color) ; |
---|
| 238 | void highlight_color(Color) ; |
---|
| 239 | void highlight_textcolor(Color); |
---|
| 240 | void labelsize(float a) ; |
---|
| 241 | void textsize(float a) ; |
---|
| 242 | void leading(float a) ; |
---|
| 243 | void scrollbar_align(unsigned char); |
---|
| 244 | void scrollbar_width(unsigned char); |
---|
| 245 | |
---|
| 246 | #ifdef FLTK_1_WIDGET // back-compatability section: |
---|
| 247 | |
---|
| 248 | Box* down_box() const { return box(); } |
---|
| 249 | Box* slider() const { return buttonbox(); } |
---|
| 250 | Box* box2() const { return box(); } |
---|
| 251 | Box* fly_box() const { return box(); } |
---|
| 252 | Color color2() const { return selection_color(); } |
---|
| 253 | Color color3() const { return buttoncolor(); } |
---|
| 254 | Color down_labelcolor() const { return selection_textcolor(); } |
---|
| 255 | Color fly_color() const { return highlight_color(); } |
---|
| 256 | Color selected_textcolor() const { return selection_textcolor(); } |
---|
| 257 | Color cursor_color() const { return selection_color(); } |
---|
| 258 | float text_size() const { return textsize(); } |
---|
| 259 | float label_size() const { return labelsize(); } |
---|
| 260 | |
---|
| 261 | void down_box(Box* a) { box(a); } |
---|
| 262 | void slider(Box* a) { buttonbox(a); } |
---|
| 263 | void fly_box(Box*) { } |
---|
| 264 | void color(Color a, Color b) { color(a); selection_color(b); } |
---|
| 265 | void color2(Color a) { selection_color(a); } |
---|
| 266 | void color3(Color a) { buttoncolor(a); } |
---|
| 267 | void down_labelcolor(Color a) { selection_textcolor(a); } |
---|
| 268 | void labelfont(unsigned a) { labelfont(font(a)); } |
---|
| 269 | void fly_color(Color a) { highlight_color(a); } |
---|
| 270 | void textfont(unsigned a) { textfont(font(a)); } |
---|
| 271 | void selected_textcolor(Color a) { selection_textcolor(a); } |
---|
| 272 | void cursor_color(Color a) { selection_color(a); } |
---|
| 273 | void text_size(float n) { textsize(n); } |
---|
| 274 | void label_size(float n) { labelsize(n); } |
---|
| 275 | |
---|
| 276 | #endif |
---|
| 277 | |
---|
| 278 | private: |
---|
| 279 | |
---|
| 280 | const char* label_; |
---|
| 281 | const Symbol* image_; |
---|
| 282 | unsigned flags_; |
---|
| 283 | const Style* style_; |
---|
| 284 | Callback* callback_; |
---|
| 285 | void* user_data_; |
---|
| 286 | const char* tooltip_; // make this into another widget? |
---|
| 287 | Group* parent_; |
---|
| 288 | uchar type_; |
---|
| 289 | uchar damage_; |
---|
| 290 | uchar layout_damage_; |
---|
| 291 | uchar when_; |
---|
| 292 | |
---|
| 293 | }; |
---|
| 294 | |
---|
| 295 | enum { // Widget::when() values |
---|
| 296 | WHEN_NEVER = 0, |
---|
| 297 | WHEN_CHANGED = 1, |
---|
| 298 | WHEN_RELEASE = 4, |
---|
| 299 | WHEN_RELEASE_ALWAYS = 6, |
---|
| 300 | WHEN_ENTER_KEY = 8, |
---|
| 301 | WHEN_ENTER_KEY_ALWAYS =10, |
---|
| 302 | WHEN_ENTER_KEY_CHANGED=11, |
---|
| 303 | WHEN_NOT_CHANGED = 2 // modifier bit to disable changed() test |
---|
| 304 | }; |
---|
| 305 | |
---|
| 306 | } |
---|
| 307 | |
---|
| 308 | #endif |
---|
| 309 | |
---|
| 310 | // |
---|
| 311 | // End of "$Id: Widget.h 4366 2005-05-23 05:11:51Z spitzak $". |
---|
| 312 | // |
---|