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);