1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
4 # include "../config.h"
5 #endif // HAVE_CONFIG_H
13 OtkWidget::OtkWidget(OtkWidget *parent, Direction direction)
14 : OtkBaseWidget(parent),
15 _direction(direction), _stretchable_vert(false), _stretchable_horz(false),
16 _event_dispatcher(parent->getEventDispatcher())
19 _event_dispatcher->registerHandler(getWindow(), this);
22 OtkWidget::OtkWidget(OtkEventDispatcher *event_dispatcher, Style *style,
23 Direction direction, Cursor cursor, int bevel_width)
24 : OtkBaseWidget(style, cursor, bevel_width),
25 _direction(direction), _stretchable_vert(false), _stretchable_horz(false),
26 _event_dispatcher(event_dispatcher)
28 assert(event_dispatcher);
29 _event_dispatcher->registerHandler(getWindow(), this);
32 OtkWidget::~OtkWidget()
34 _event_dispatcher->clearHandler(_window);
37 void OtkWidget::adjust(void)
39 if (_direction == Horizontal)
45 void OtkWidget::adjustHorz(void)
47 if (_children.size() == 0)
51 OtkBaseWidgetList::iterator it, end = _children.end();
54 int width = _bevel_width;
55 OtkBaseWidgetList stretchable;
57 for (it = _children.begin(); it != end; ++it) {
58 if (!(tmp = dynamic_cast<OtkWidget*>(*it))) continue;
59 if (tmp->isStretchableVert())
60 tmp->setHeight(_rect.height() > _bevel_width * 2 ?
61 _rect.height() - _bevel_width * 2 : _bevel_width);
62 if (tmp->isStretchableHorz())
63 stretchable.push_back(tmp);
65 width += tmp->_rect.width() + _bevel_width;
67 if (tmp->_rect.height() > tallest)
68 tallest = tmp->_rect.height();
71 if (stretchable.size() > 0) {
72 OtkBaseWidgetList::iterator str_it = stretchable.begin(),
73 str_end = stretchable.end();
75 int str_width = _rect.width() - width / stretchable.size();
77 for (; str_it != str_end; ++str_it)
78 (*str_it)->setWidth(str_width > _bevel_width ? str_width - _bevel_width
82 OtkWidget *prev_widget = 0;
84 for (it = _children.begin(); it != end; ++it) {
85 if (!(tmp = dynamic_cast<OtkWidget*>(*it))) continue;
89 x = prev_widget->_rect.x() + prev_widget->_rect.width() + _bevel_width;
91 x = _rect.x() + _bevel_width;
92 y = (tallest - tmp->_rect.height()) / 2 + _bevel_width;
99 internalResize(width, tallest + _bevel_width * 2);
102 void OtkWidget::adjustVert(void)
104 if (_children.size() == 0)
108 OtkBaseWidgetList::iterator it, end = _children.end();
111 int height = _bevel_width;
112 OtkBaseWidgetList stretchable;
114 for (it = _children.begin(); it != end; ++it) {
115 if (!(tmp = dynamic_cast<OtkWidget*>(*it))) continue;
116 if (tmp->isStretchableHorz())
117 tmp->setWidth(_rect.width() > _bevel_width * 2 ?
118 _rect.width() - _bevel_width * 2 : _bevel_width);
119 if (tmp->isStretchableVert())
120 stretchable.push_back(tmp);
122 height += tmp->_rect.height() + _bevel_width;
124 if (tmp->_rect.width() > widest)
125 widest = tmp->_rect.width();
128 if (stretchable.size() > 0) {
129 OtkBaseWidgetList::iterator str_it = stretchable.begin(),
130 str_end = stretchable.end();
132 int str_height = _rect.height() - height / stretchable.size();
134 for (; str_it != str_end; ++str_it)
135 (*str_it)->setHeight(str_height > _bevel_width ?
136 str_height - _bevel_width : _bevel_width);
139 OtkWidget *prev_widget = 0;
141 for (it = _children.begin(); it != end; ++it) {
142 if (!(tmp = dynamic_cast<OtkWidget*>(*it))) continue;
146 y = prev_widget->_rect.y() + prev_widget->_rect.height() + _bevel_width;
148 y = _rect.y() + _bevel_width;
149 x = (widest - tmp->_rect.width()) / 2 + _bevel_width;
156 internalResize(widest + _bevel_width * 2, height);
159 void OtkWidget::update(void)
164 OtkBaseWidget::update();
167 void OtkWidget::internalResize(int w, int h)
169 assert(w > 0 && h > 0);
171 // if (! _fixed_width && ! _fixed_height)
173 // else if (! _fixed_width)
174 // resize(w, _rect.height());
175 // else if (! _fixed_height)
176 // resize(_rect.width(), h);
179 void OtkWidget::setEventDispatcher(OtkEventDispatcher *disp)
181 if (_event_dispatcher)
182 _event_dispatcher->clearHandler(_window);
183 _event_dispatcher = disp;
184 _event_dispatcher->registerHandler(_window, this);