]> git.tdb.fi Git - libs/gltk.git/blob - source/container.h
Rework exceptions and use maputils
[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         };
33
34         std::list<Child *> children;
35         Widget *click_focus;
36         unsigned click_button;
37
38         Container();
39 public:
40         virtual ~Container();
41
42         void add(Widget &);
43         void remove(Widget &);
44 protected:
45         virtual Child *create_child(Widget *);
46 public:
47         std::list<Widget *> get_children() const;
48         Widget *get_child_at(int, int);
49         Widget *get_descendant_at(int, int);
50
51         virtual void button_press(int, int, unsigned);
52         virtual void button_release(int, int, unsigned);
53         virtual void pointer_motion(int, int);
54         virtual void pointer_leave();
55 protected:
56         virtual void on_reparent();
57         virtual void on_child_added(Widget &) { }
58         virtual void on_child_removed(Widget &) { }
59 };
60
61 } // namespace GLtk
62 } // namespace Msp
63
64 #endif