]> git.tdb.fi Git - libs/gltk.git/blob - source/container.h
3275f6a016116ba3f98e4946f5c802e90ccc67eb
[libs/gltk.git] / source / container.h
1 #ifndef MSP_GLTK_CONTAINER_H_
2 #define MSP_GLTK_CONTAINER_H_
3
4 #include <list>
5 #include <stdexcept>
6 #include <sigc++/trackable.h>
7 #include "widget.h"
8
9 namespace Msp {
10 namespace GLtk {
11
12 class hierarchy_error: public std::logic_error
13 {
14 public:
15         hierarchy_error(const std::string &);
16         virtual ~hierarchy_error() throw() { }
17 };
18
19
20 class Container: virtual public Widget
21 {
22 protected:
23         struct Child: public sigc::trackable
24         {
25                 Container &container;
26                 Widget *widget;
27
28                 Child(Container &, Widget *);
29                 virtual ~Child();
30
31                 void visibility_changed(bool);
32                 void request_focus();
33                 void grab_pointer();
34                 void ungrab_pointer();
35         };
36
37         std::list<Child *> children;
38         Widget *click_focus;
39         unsigned click_button;
40         Widget *pointer_focus;
41         bool pointer_grabbed;
42         Widget *input_focus;
43
44         Container();
45 public:
46         virtual ~Container();
47
48         void add(Widget &);
49         void remove(Widget &);
50 protected:
51         virtual Child *create_child(Widget *);
52 public:
53         std::list<Widget *> get_children() const;
54         Widget *get_child_at(int, int);
55         Widget *get_descendant_at(int, int);
56         void raise(Widget &);
57
58 protected:
59         void set_pointer_focus(Widget *);
60         void set_input_focus(Widget *);
61 public:
62         Widget *get_input_focus() const { return input_focus; }
63         Widget *get_final_input_focus() const;
64
65         virtual void button_press(int, int, unsigned);
66         virtual void button_release(int, int, unsigned);
67         virtual void pointer_motion(int, int);
68 private:
69         Widget *get_pointer_target(int, int);
70 public:
71         virtual void pointer_leave();
72         virtual void key_press(unsigned, unsigned);
73         virtual void key_release(unsigned, unsigned);
74         virtual void character(wchar_t);
75         virtual void focus_out();
76 protected:
77         virtual void on_reparent();
78         virtual void on_child_added(Widget &) { }
79         virtual void on_child_removed(Widget &) { }
80 };
81
82 } // namespace GLtk
83 } // namespace Msp
84
85 #endif