00001 #ifndef SGE_GUI_WIDGET_HPP_INCLUDED 00002 #define SGE_GUI_WIDGET_HPP_INCLUDED 00003 00004 #include "events/fwd.hpp" 00005 #include "types.hpp" 00006 #include "size_policy.hpp" 00007 #include "../export.hpp" 00008 00009 #include <boost/ptr_container/ptr_vector.hpp> 00010 #include <boost/function.hpp> 00011 #include <boost/noncopyable.hpp> 00012 00013 namespace sge 00014 { 00015 namespace gui 00016 { 00017 // forward declarations 00018 namespace widgets 00019 { 00020 class container; 00021 } 00022 class manager; 00023 00024 // declaration 00025 class SGE_CLASS_SYMBOL widget : boost::noncopyable 00026 { 00027 public: 00028 typedef sge::gui::size_policy size_policy_t; 00029 00030 class parent_data 00031 { 00032 widgets::container *const widget_; 00033 manager &manager_; 00034 00035 public: 00036 SGE_SYMBOL explicit parent_data(widgets::container &); 00037 SGE_SYMBOL explicit parent_data(manager &); 00038 00039 widgets::container *parent_widget() const { return widget_; } 00040 manager &parent_manager() { return manager_; } 00041 }; 00042 00043 SGE_SYMBOL widget( 00044 parent_data, 00045 size_policy_t const & = size_policy_t::default_policy); 00046 00047 // getters and setters go here 00048 point const &pos() const { return pos_; } 00049 dim const &size() const { return size_; } 00050 00051 // parent stuff 00052 manager &parent_manager() { return manager_; } 00053 manager const &parent_manager() const { return manager_; } 00054 00055 widgets::container *parent_widget() { return parent_; } 00056 widgets::container const *parent_widget() const { return parent_; } 00057 00058 size_policy_t const &size_policy() const { return size_policy_; } 00059 void size_policy(size_policy_t const &s) { size_policy_ = s; } 00060 00061 SGE_SYMBOL void size(dim const &); 00062 SGE_SYMBOL void pos(point const &); 00063 SGE_SYMBOL void compile(); 00064 SGE_SYMBOL bool is_container() const; 00065 00066 // pure virtuals 00067 virtual dim const size_hint() const = 0; 00068 virtual void process(events::invalid_area const &) {} 00069 virtual void process(events::mouse_enter const &) {} 00070 virtual void process(events::mouse_leave const &) {} 00071 virtual void process(events::mouse_move const &) {} 00072 virtual void process(events::mouse_click const &) {} 00073 00074 // virtuals 00075 SGE_SYMBOL virtual ~widget(); 00076 00077 SGE_SYMBOL rect const relative_area() const; 00078 SGE_SYMBOL rect const absolute_area() const; 00079 00080 void set_size_raw(dim const &d) { size_ = d; } 00081 void set_pos_raw(point const &p) { pos_ = p; } 00082 virtual void do_compile() {} 00083 00084 protected: 00085 virtual void do_size(dim const &s) { set_size_raw(s); } 00086 virtual void do_pos(point const &p) { set_pos_raw(p); } 00087 virtual widget *do_recalculate_focus(point const &) { return this; } 00088 00089 private: 00090 // parent data 00091 widgets::container *const parent_; 00092 manager &manager_; 00093 00094 point pos_; 00095 dim size_,size_hint_; 00096 size_policy_t size_policy_; 00097 00098 widget *recalculate_focus(point const &mouse_click); 00099 00100 // friend functions 00101 friend class layout; 00102 friend class manager; 00103 friend class widgets::container; 00104 }; 00105 } 00106 } 00107 00108 #endif
1.5.5