diff options
Diffstat (limited to 'fltk/fltk/Widget.h')
-rw-r--r-- | fltk/fltk/Widget.h | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/fltk/fltk/Widget.h b/fltk/fltk/Widget.h new file mode 100644 index 0000000..2947b12 --- /dev/null +++ b/fltk/fltk/Widget.h @@ -0,0 +1,331 @@ +// "$Id: Widget.h 6518 2008-11-11 22:31:26Z spitzak $" +// +// 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 fltk_Widget_h +#define fltk_Widget_h + +#include "Style.h" +#include "Rectangle.h" + +namespace fltk { + +class FL_API Widget; +class FL_API Window; +class FL_API Symbol; +class FL_API Group; +class FL_API AssociationType; +class FL_API AssociationFunctor; +struct Cursor; + +typedef void (Callback )(Widget*, void*); +typedef Callback* Callback_p; // needed for BORLAND +typedef void (Callback0)(Widget*); +typedef void (Callback1)(Widget*, long); + +#ifdef FLTK_1_WIDGET // back-compatability section: +FL_API Font* font(int); +#endif + +class FL_API Widget : public Rectangle { + // disable the copy assignment/constructors: + Widget & operator=(const Widget &); + Widget(const Widget &); + +public: + + Widget(int,int,int,int,const char* =0); + virtual ~Widget(); + + virtual void draw(); + virtual int handle(int); + int send(int event); + virtual void layout(); + + const Style* style() const { return style_; } + void style(const Style* s) { style_ = s; } + void style(const Style& s) { style_ = &s; } + bool copy_style(const Style* s); + static NamedStyle* default_style; + static Symbol* default_glyph; + + Group* parent() const { return parent_; } + void parent(Group* w) { parent_ = w; } + Window* window() const ; + + enum WidgetVisualType { + // Values for type() shared by Button and menu Item, and for fake RTTI: + RESERVED_TYPE = 0x64, + TOGGLE = RESERVED_TYPE+1, + RADIO = RESERVED_TYPE+2, + GROUP_TYPE = 0xe0, + WINDOW_TYPE = 0xf0 + }; + + uchar type() const { return type_; } + void type(uchar t) { type_ = t; } + bool is_group() const { return type_ >= GROUP_TYPE; } + bool is_window() const { return type_ >= WINDOW_TYPE; } + + bool resize(int x,int y,int w,int h); + bool position(int x, int y) ; + bool resize(int w, int h) ; + + void get_absolute_rect( Rectangle *rect ) const; + + const char* label() const { return label_; } + void label(const char* a); + void copy_label(const char* a); + + const Symbol* image() const { return image_; } + void image(const Symbol* a) { image_ = a; } + void image(const Symbol& a) { image_ = &a; } + + const char *tooltip() const { return tooltip_; } + void tooltip(const char *t) { tooltip_ = t; } + + unsigned shortcut() const ; + void shortcut(unsigned key) ; + bool add_shortcut(unsigned key); + bool remove_shortcut(unsigned key); + void remove_shortcuts() ; + unsigned label_shortcut() const; + bool test_label_shortcut() const; + bool test_shortcut() const ; + bool test_shortcut(bool) const; + + Callback_p callback() const { return callback_; } + void callback(Callback* c, void* p) { callback_=c; user_data_=p; } + void callback(Callback* c) { callback_=c; } + void callback(Callback0*c) { callback_=(Callback*)c; } + void callback(Callback1*c, long p=0) { callback_=(Callback*)c; user_data_=(void*)p; } + void* user_data() const { return user_data_; } + void user_data(void* v) { user_data_ = v; } + long argument() const { return (long)user_data_; } + void argument(long v) { user_data_ = (void*)v; } + uchar when() const { return when_; } + void when(uchar i) { when_ = i; } + + static void default_callback(Widget*, void*); + void do_callback() { callback_(this,user_data_); } + void do_callback(Widget* o,void* arg=0) { callback_(o,arg); } + void do_callback(Widget* o,long arg) { callback_(o,(void*)arg); } + bool contains(const Widget*) const; + bool inside(const Widget* o) const { return o && o->contains(this); } + bool pushed() const ; + bool focused() const ; + bool belowmouse() const ; + + Flags flags() const { return flags_; } + void flags(Flags f) { flags_ = f; } + void set_flag(unsigned f) { flags_ |= f; } + void clear_flag(unsigned f) { flags_ &= ~f; } + void invert_flag(unsigned f) { flags_ ^= f; } + void set_flag(unsigned f,bool b) { flags_ = (flags_&~f)|(b?f:0); } + bool flag(unsigned f) const { return (flags_ & f) != 0; } + bool any_of(unsigned f) const{ return (flags_ & f) != 0; } + bool all_of(unsigned f) const{ return (flags_ & f) == f; } + + bool state() const { return flag(STATE); } + bool state(bool); + bool set() { return state(true); } + bool clear() { return state(false); } + void setonly(); + + Flags align() const { return flags_&ALIGN_MASK; } + void align(unsigned a) { flags_ = (flags_ & (~ALIGN_MASK)) | a; } + bool visible() const { return !flag(INVISIBLE); } + bool visible_r() const ; + void show() ; + void hide() ; + void set_visible() { clear_flag(INVISIBLE); } + void clear_visible() { set_flag(INVISIBLE); } + bool active() const { return !flag(INACTIVE); } + bool active_r() const ; + void activate() ; + void activate(int b) { if (b) activate(); else deactivate(); } + void deactivate() ; + bool output() const { return flag(OUTPUT); } + void set_output() { set_flag(OUTPUT); } + void clear_output() { clear_flag(OUTPUT); } + bool takesevents() const { return !any_of(OUTPUT|INVISIBLE|INACTIVE); } + bool changed() const { return flag(CHANGED); } + void set_changed() { set_flag(CHANGED); } + void clear_changed() { clear_flag(CHANGED); } + bool selected() const { return flag(SELECTED); } + void set_selected() { set_flag(SELECTED); } + void clear_selected() { clear_flag(SELECTED); } + bool click_to_focus() { return flag(CLICK_TO_FOCUS); } + void set_click_to_focus() { set_flag(CLICK_TO_FOCUS); } + void clear_click_to_focus() { clear_flag(CLICK_TO_FOCUS); } + bool tab_to_focus() { return flag(TAB_TO_FOCUS); } + void set_tab_to_focus() { set_flag(TAB_TO_FOCUS); } + void clear_tab_to_focus() { clear_flag(TAB_TO_FOCUS|CLICK_TO_FOCUS); } + bool horizontal() const { return !flag(LAYOUT_VERTICAL);} + bool vertical() const { return flag(LAYOUT_VERTICAL);} + void set_horizontal() { clear_flag(LAYOUT_VERTICAL); } + void set_vertical() { set_flag(LAYOUT_VERTICAL); } + + bool take_focus() ; + void throw_focus() ; + + void redraw() ; + void redraw(uchar c) ; + void redraw_label() ; + void redraw_highlight() ; + void redraw(const Rectangle&); + uchar damage() const { return damage_; } + void set_damage(uchar c) { damage_ = c; } // should be called damage(c) + + void relayout() ; + void relayout(uchar damage) ; + uchar layout_damage() const { return layout_damage_; } + void layout_damage(uchar c) { layout_damage_ = c; } + + void add_timeout(float) ; + void repeat_timeout(float) ; + void remove_timeout() ; + + void make_current() const ; + void draw_background() const ; + void draw_frame() const ; + void draw_box() const ; + void draw_box(const Rectangle& r) const ; // multiple boxes drawing for a single Widget + void draw_label() const ; + void draw_label(const Rectangle&, Flags) const ; + void draw_glyph(int, const Rectangle&) const ; + void cursor(Cursor*) const ; + + void measure_label(int&, int&) const ; + + Box* box() const; + Box* buttonbox() const; + Symbol* glyph() const; + Font* labelfont() const; + Font* textfont() const; + LabelType* labeltype() const; + Color color() const; + Color textcolor() const; + Color selection_color() const; + Color selection_textcolor() const; + Color buttoncolor() const; + Color labelcolor() const; + Color highlight_color() const; + Color highlight_textcolor() const; + float labelsize() const; + float textsize() const; + float leading() const; + unsigned char scrollbar_align() const; + unsigned char scrollbar_width() const; + + void box(Box*) ; + void buttonbox(Box*) ; + void glyph(Symbol*) ; + void labelfont(Font*) ; + void textfont(Font*) ; + void labeltype(LabelType*) ; + void color(Color) ; + void textcolor(Color a) ; + void selection_color(Color) ; + void selection_textcolor(Color); + void buttoncolor(Color) ; + void labelcolor(Color) ; + void highlight_color(Color) ; + void highlight_textcolor(Color); + void labelsize(float a) ; + void textsize(float a) ; + void leading(float a) ; + void scrollbar_align(unsigned char); + void scrollbar_width(unsigned char); + + void add(const AssociationType&, void* data); + void set(const AssociationType&, void* data); + void* get(const AssociationType&) const; + void* foreach(const AssociationType&, AssociationFunctor&) const; + bool remove(const AssociationType&, void* data); + bool find(const AssociationType&, void* data) const; + +#ifdef FLTK_1_WIDGET // back-compatability section: + + Box* down_box() const { return box(); } + Box* slider() const { return buttonbox(); } + Box* box2() const { return box(); } + Box* fly_box() const { return box(); } + Color color2() const { return selection_color(); } + Color color3() const { return buttoncolor(); } + Color down_labelcolor() const { return selection_textcolor(); } + Color fly_color() const { return highlight_color(); } + Color selected_textcolor() const { return selection_textcolor(); } + Color cursor_color() const { return selection_color(); } + float text_size() const { return textsize(); } + float label_size() const { return labelsize(); } + + void down_box(Box* a) { box(a); } + void slider(Box* a) { buttonbox(a); } + void fly_box(Box*) { } + void color(Color a, Color b) { color(a); selection_color(b); } + void color2(Color a) { selection_color(a); } + void color3(Color a) { buttoncolor(a); } + void down_labelcolor(Color a) { selection_textcolor(a); } + void labelfont(unsigned a) { labelfont(font(a)); } + void fly_color(Color a) { highlight_color(a); } + void textfont(unsigned a) { textfont(font(a)); } + void selected_textcolor(Color a) { selection_textcolor(a); } + void cursor_color(Color a) { selection_color(a); } + void text_size(float n) { textsize(n); } + void label_size(float n) { labelsize(n); } + +#endif + +private: + + const char* label_; + const Symbol* image_; + unsigned flags_; + const Style* style_; + Callback* callback_; + void* user_data_; + const char* tooltip_; // make this into another widget? + Group* parent_; + uchar type_; + uchar damage_; + uchar layout_damage_; + uchar when_; + +}; + +enum { // Widget::when() values + WHEN_NEVER = 0, + WHEN_CHANGED = 1, + WHEN_RELEASE = 4, + WHEN_RELEASE_ALWAYS = 6, + WHEN_ENTER_KEY = 8, + WHEN_ENTER_KEY_ALWAYS =10, + WHEN_ENTER_KEY_CHANGED=11, + WHEN_NOT_CHANGED = 2 // modifier bit to disable changed() test +}; + +} + +#endif + +// +// End of "$Id: Widget.h 6518 2008-11-11 22:31:26Z spitzak $". +// |