]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/scout/lib/src/browser_window.cc
update
[l4.git] / l4 / pkg / scout / lib / src / browser_window.cc
1 #include "browser_window.h"
2 #include "factory.h"
3
4 #include <l4/scout-gfx/sky_texture>
5 #include <l4/scout-gfx/stack_layout>
6 #include <l4/scout-gfx/box_layout>
7 #include <l4/scout-gfx/scroll_pane>
8 #include <l4/scout-gfx/fonts>
9
10
11 /****************************
12  ** External graphics data **
13  ****************************/
14
15 #define SIZER_RGBA    _binary_sizer_rgba_start
16 #define TITLEBAR_RGBA _binary_titlebar_rgba_start
17
18 extern unsigned char SIZER_RGBA[];
19 extern unsigned char TITLEBAR_RGBA[];
20
21 static Mag_gfx::Font &title_font = Scout_gfx::Fonts::vera18;
22
23 class Browser_sizer_event_handler : public Scout_gfx::Sizer_event_handler
24 {
25 private:
26
27   Browser_window *_browser_win;
28   Scout_gfx::Widget              *_ca;         /* original visible element     */
29
30   /**
31    * Event handler interface
32    */
33   void start_drag()
34   {
35     Sizer_event_handler::start_drag();
36     _ca = _browser_win->curr_anchor();
37   }
38
39   void do_drag()
40   {
41     Sizer_event_handler::do_drag();
42     _browser_win->go_to(_ca, 0);
43   }
44
45 public:
46
47   /**
48    * Constructor
49    */
50   Browser_sizer_event_handler(Browser_window *browser_win)
51   : Sizer_event_handler(browser_win)
52   {
53     _browser_win = browser_win;
54   }
55 };
56
57
58 /******************************
59  ** Browser window interface **
60  ******************************/
61
62 Browser_window::Browser_window(Factory *f,
63     Scout_gfx::Document *initial_content,
64     Scout_gfx::View *pf,
65     Area const &max_sz, int attr)
66 : Basic_window(pf, max_sz),
67   _titlebar(f, &title_font), _cont(0)
68 {
69   using namespace Mag_gfx;
70   using namespace Scout_gfx;
71   /* init attributes */
72   _document = initial_content;
73   _attr     = attr;
74
75   Scout_gfx::Event_handler *mev = new Scout_gfx::Mover_event_handler(this);
76   _panel = f->create_panel(this);
77   _panel->event_handler(mev);
78
79   Scout_gfx::Sky_texture *txt = f->create_sky();
80   txt->generate(Area(512, 512));
81
82   Scout_gfx::Scroll_pane *sp = new Scout_gfx::Scroll_pane(f);
83   sp->set_texture(txt);
84   append(sp);
85
86   /* init docview and history with initial document */
87   //_docview.texture(_texture);
88   //_docview.voffset(doc_offset());
89   //voffset(doc_offset());
90   _history.add(initial_content);
91
92
93   /* titlebar */
94   _titlebar.rgba(TITLEBAR_RGBA);
95   _titlebar.text(_document->title);
96   _titlebar.event_handler(mev);
97
98   _min_sz = _panel->size() + Area(0, 250);
99   _size = _min_sz;
100
101   /* adopt widgets as child elements */
102   append(_panel);
103
104   _shadow = f->create_shadow();
105   append(_shadow);
106
107   /* resize handle */
108   if (_attr & ATTR_SIZER)
109     {
110       _sizer = f->create_icon(SIZER_RGBA, Area(32, 32));
111       _sizer->event_handler(new Browser_sizer_event_handler(this));
112       _sizer->alpha(100);
113       sp->set_reserved_scrollbar_area(_sizer->min_size());
114       append(_sizer);
115     }
116   else
117     _sizer = 0;
118
119   if (_attr & ATTR_TITLEBAR) append(&_titlebar);
120
121   Scout_gfx::Layout *l = Scout_gfx::Stack_layout::create();
122   set_child_layout(l);
123
124   Scout_gfx::Layout *n = Scout_gfx::Box_layout::create_vert();
125   l->add_item(n);
126
127   n->set_alignment(Align_top);
128   if (_attr & ATTR_TITLEBAR)
129     n->add_item(&_titlebar);
130
131   n->add_item(_panel);
132   n->add_item(_shadow);
133   l->add_item(sp);
134   n->add_item(sp->view_pane_layout_item());
135   Scout_gfx::Layout *vl1 = Scout_gfx::Box_layout::create_vert();
136   vl1->set_margin(5);
137   sp->set_child_layout(vl1);
138   _cont_pane = sp;
139
140   Scout_gfx::Layout *n2 = Scout_gfx::Box_layout::create_horz();
141   n2->set_alignment(Align_bottom | Align_right);
142   if (_sizer)
143     n2->add_item(_sizer);
144   else
145     n2->add_item(new Scout_gfx::Spacer_item(Mag_gfx::Horizontal));
146   l->add_item(n2);
147   _content(initial_content);
148
149 }
150
151
152 /***********************
153  ** Browser interface **
154  ***********************/
155
156 Scout_gfx::Parent_widget *Browser_window::_content()
157 {
158   return _cont;
159 }
160
161
162 void Browser_window::_content(Parent_widget *content)
163 {
164   if (!content || (content == _cont))
165     return;
166
167   content->fill_cache(view()->pixel_info());
168   if (_cont)
169     {
170       _cont_pane->child_layout()->remove_item(_cont);
171       _cont_pane->remove(_cont);
172     }
173   _cont = content;
174   _cont_pane->child_layout()->add_item(_cont);
175   _cont_pane->append(_cont);
176   _cont_pane->refresh_geometry();
177   refresh();
178 }
179
180
181 Widget *Browser_window::curr_anchor()
182 { return _cont_pane->find(_cont_pane->child_layout()->geometry().p1() + Point (5, 5)); }
183
184