Fix build error
[claws.git] / src / plugins / litehtml_viewer / litehtml / element.cpp
1 #include "html.h"
2 #include "element.h"
3 #include "document.h"
4
5 #define LITEHTML_EMPTY_FUNC                     {}
6 #define LITEHTML_RETURN_FUNC(ret)       {return ret;}
7
8 litehtml::element::element(const std::shared_ptr<litehtml::document>& doc) : m_doc(doc)
9 {
10         m_box           = 0;
11         m_skip          = false;
12 }
13
14 litehtml::element::~element()
15 {
16
17 }
18
19
20 bool litehtml::element::is_point_inside( int x, int y )
21 {
22         if(get_display() != display_inline && get_display() != display_table_row)
23         {
24                 position pos = m_pos;
25                 pos += m_padding;
26                 pos += m_borders;
27                 if(pos.is_point_inside(x, y))
28                 {
29                         return true;
30                 } else
31                 {
32                         return false;
33                 }
34         } else
35         {
36                 position::vector boxes;
37                 get_inline_boxes(boxes);
38                 for(position::vector::iterator box = boxes.begin(); box != boxes.end(); box++)
39                 {
40                         if(box->is_point_inside(x, y))
41                         {
42                                 return true;
43                         }
44                 }
45         }
46         return false;
47 }
48
49 litehtml::web_color litehtml::element::get_color( const tchar_t* prop_name, bool inherited, const litehtml::web_color& def_color )
50 {
51         const tchar_t* clrstr = get_style_property(prop_name, inherited, 0);
52         if(!clrstr)
53         {
54                 return def_color;
55         }
56         return web_color::from_string(clrstr, get_document()->container());
57 }
58
59 litehtml::position litehtml::element::get_placement() const
60 {
61         litehtml::position pos = m_pos;
62         element::ptr cur_el = parent();
63         while(cur_el)
64         {
65                 pos.x += cur_el->m_pos.x;
66                 pos.y += cur_el->m_pos.y;
67                 cur_el = cur_el->parent();
68         }
69         return pos;
70 }
71
72 bool litehtml::element::is_inline_box() const
73 {
74         style_display d = get_display();
75         if(     d == display_inline || 
76                 d == display_inline_block || 
77                 d == display_inline_text)
78         {
79                 return true;
80         }
81         return false;
82 }
83
84 bool litehtml::element::collapse_top_margin() const
85 {
86         if(!m_borders.top && !m_padding.top && in_normal_flow() && get_float() == float_none && m_margins.top >= 0 && have_parent())
87         {
88                 return true;
89         }
90         return false;
91 }
92
93 bool litehtml::element::collapse_bottom_margin() const
94 {
95         if(!m_borders.bottom && !m_padding.bottom && in_normal_flow() && get_float() == float_none && m_margins.bottom >= 0 && have_parent())
96         {
97                 return true;
98         }
99         return false;
100 }
101
102 bool litehtml::element::get_predefined_height(int& p_height) const
103 {
104         css_length h = get_css_height();
105         if(h.is_predefined())
106         {
107                 p_height = m_pos.height;
108                 return false;
109         }
110         if(h.units() == css_units_percentage)
111         {
112                 element::ptr el_parent = parent();
113                 if (!el_parent)
114                 {
115                         position client_pos;
116                         get_document()->container()->get_client_rect(client_pos);
117                         p_height = h.calc_percent(client_pos.height);
118                         return true;
119                 } else
120                 {
121                         int ph = 0;
122                         if (el_parent->get_predefined_height(ph))
123                         {
124                                 p_height = h.calc_percent(ph);
125                                 if (is_body())
126                                 {
127                                         p_height -= content_margins_height();
128                                 }
129                                 return true;
130                         } else
131                         {
132                                 p_height = m_pos.height;
133                                 return false;
134                         }
135                 }
136         }
137         p_height = get_document()->cvt_units(h, get_font_size());
138         return true;
139 }
140
141 void litehtml::element::calc_document_size( litehtml::size& sz, int x /*= 0*/, int y /*= 0*/ )
142 {
143         if(is_visible())
144         {
145                 sz.width        = std::max(sz.width,    x + right());
146                 sz.height       = std::max(sz.height,   y + bottom());
147         }
148 }
149
150 void litehtml::element::get_redraw_box(litehtml::position& pos, int x /*= 0*/, int y /*= 0*/)
151 {
152         if(is_visible())
153         {
154                 int p_left              = std::min(pos.left(),  x + m_pos.left() - m_padding.left - m_borders.left);
155                 int p_right             = std::max(pos.right(), x + m_pos.right() + m_padding.left + m_borders.left);
156                 int p_top               = std::min(pos.top(), y + m_pos.top() - m_padding.top - m_borders.top);
157                 int p_bottom    = std::max(pos.bottom(), y + m_pos.bottom() + m_padding.bottom + m_borders.bottom);
158
159                 pos.x = p_left;
160                 pos.y = p_top;
161                 pos.width       = p_right - p_left;
162                 pos.height      = p_bottom - p_top;
163         }
164 }
165
166 int litehtml::element::calc_width(int defVal) const
167 {
168         css_length w = get_css_width();
169         if(w.is_predefined())
170         {
171                 return defVal;
172         }
173         if(w.units() == css_units_percentage)
174         {
175                 element::ptr el_parent = parent();
176                 if (!el_parent)
177                 {
178                         position client_pos;
179                         get_document()->container()->get_client_rect(client_pos);
180                         return w.calc_percent(client_pos.width);
181                 } else
182                 {
183                         int pw = el_parent->calc_width(defVal);
184                         if (is_body())
185                         {
186                                 pw -= content_margins_width();
187                         }
188                         return w.calc_percent(pw);
189                 }
190         }
191         return  get_document()->cvt_units(w, get_font_size());
192 }
193
194 bool litehtml::element::is_ancestor(const ptr &el) const
195 {
196         element::ptr el_parent = parent();
197         while(el_parent && el_parent != el)
198         {
199                 el_parent = el_parent->parent();
200         }
201         if(el_parent)
202         {
203                 return true;
204         }
205         return false;
206 }
207
208 int litehtml::element::get_inline_shift_left()
209 {
210         int ret = 0;
211         element::ptr el_parent = parent();
212         if (el_parent)
213         {
214                 if (el_parent->get_display() == display_inline)
215                 {
216                         style_display disp = get_display();
217
218                         if (disp == display_inline_text || disp == display_inline_block)
219                         {
220                                 element::ptr el = shared_from_this();
221                                 while (el_parent && el_parent->get_display() == display_inline)
222                                 {
223                                         if (el_parent->is_first_child_inline(el))
224                                         {
225                                                 ret += el_parent->padding_left() + el_parent->border_left() + el_parent->margin_left();
226                                         }
227                                         el = el_parent;
228                                         el_parent = el_parent->parent();
229                                 }
230                         }
231                 }
232         }
233
234         return ret;
235 }
236
237 int litehtml::element::get_inline_shift_right()
238 {
239         int ret = 0;
240         element::ptr el_parent = parent();
241         if (el_parent)
242         {
243                 if (el_parent->get_display() == display_inline)
244                 {
245                         style_display disp = get_display();
246
247                         if (disp == display_inline_text || disp == display_inline_block)
248                         {
249                                 element::ptr el = shared_from_this();
250                                 while (el_parent && el_parent->get_display() == display_inline)
251                                 {
252                                         if (el_parent->is_last_child_inline(el))
253                                         {
254                                                 ret += el_parent->padding_right() + el_parent->border_right() + el_parent->margin_right();
255                                         }
256                                         el = el_parent;
257                                         el_parent = el_parent->parent();
258                                 }
259                         }
260                 }
261         }
262
263         return ret;
264 }
265
266 void litehtml::element::apply_relative_shift(int parent_width)
267 {
268         css_offsets offsets;
269         if (get_element_position(&offsets) == element_position_relative)
270         {
271                 element::ptr parent_ptr = parent();
272                 if (!offsets.left.is_predefined())
273                 {
274                         m_pos.x += offsets.left.calc_percent(parent_width);
275                 }
276                 else if (!offsets.right.is_predefined())
277                 {
278                         m_pos.x -= offsets.right.calc_percent(parent_width);
279                 }
280                 if (!offsets.top.is_predefined())
281                 {
282                         int h = 0;
283
284                         if (offsets.top.units() == css_units_percentage)
285                         {
286                                 element::ptr el_parent = parent();
287                                 if (el_parent)
288                                 {
289                                         el_parent->get_predefined_height(h);
290                                 }
291                         }
292
293                         m_pos.y += offsets.top.calc_percent(h);
294                 }
295                 else if (!offsets.bottom.is_predefined())
296                 {
297                         int h = 0;
298
299                         if (offsets.top.units() == css_units_percentage)
300                         {
301                                 element::ptr el_parent = parent();
302                                 if (el_parent)
303                                 {
304                                         el_parent->get_predefined_height(h);
305                                 }
306                         }
307
308                         m_pos.y -= offsets.bottom.calc_percent(h);
309                 }
310         }
311 }
312
313 void litehtml::element::calc_auto_margins(int parent_width)                                                     LITEHTML_EMPTY_FUNC
314 const litehtml::background* litehtml::element::get_background(bool own_only)            LITEHTML_RETURN_FUNC(0)
315 litehtml::element::ptr litehtml::element::get_element_by_point(int x, int y, int client_x, int client_y)        LITEHTML_RETURN_FUNC(0)
316 litehtml::element::ptr litehtml::element::get_child_by_point(int x, int y, int client_x, int client_y, draw_flag flag, int zindex) LITEHTML_RETURN_FUNC(0)
317 void litehtml::element::get_line_left_right( int y, int def_right, int& ln_left, int& ln_right ) LITEHTML_EMPTY_FUNC
318 void litehtml::element::add_style( const litehtml::style& st )                                          LITEHTML_EMPTY_FUNC
319 void litehtml::element::select_all(const css_selector& selector, litehtml::elements_vector& res)        LITEHTML_EMPTY_FUNC
320 litehtml::elements_vector litehtml::element::select_all(const litehtml::css_selector& selector)  LITEHTML_RETURN_FUNC(litehtml::elements_vector())
321 litehtml::elements_vector litehtml::element::select_all(const litehtml::tstring& selector)                       LITEHTML_RETURN_FUNC(litehtml::elements_vector())
322 litehtml::element::ptr litehtml::element::select_one( const css_selector& selector ) LITEHTML_RETURN_FUNC(0)
323 litehtml::element::ptr litehtml::element::select_one( const tstring& selector )         LITEHTML_RETURN_FUNC(0)
324 litehtml::element::ptr litehtml::element::find_adjacent_sibling(const element::ptr& el, const css_selector& selector, bool apply_pseudo /*= true*/, bool* is_pseudo /*= 0*/) LITEHTML_RETURN_FUNC(0)
325 litehtml::element::ptr litehtml::element::find_sibling(const element::ptr& el, const css_selector& selector, bool apply_pseudo /*= true*/, bool* is_pseudo /*= 0*/) LITEHTML_RETURN_FUNC(0)
326 bool litehtml::element::is_nth_last_child(const element::ptr& el, int num, int off, bool of_type) const         LITEHTML_RETURN_FUNC(false)
327 bool litehtml::element::is_nth_child(const element::ptr&, int num, int off, bool of_type) const         LITEHTML_RETURN_FUNC(false)
328 bool litehtml::element::is_only_child(const element::ptr& el, bool of_type)      const  LITEHTML_RETURN_FUNC(false)
329 litehtml::overflow litehtml::element::get_overflow() const                                                      LITEHTML_RETURN_FUNC(overflow_visible)
330 void litehtml::element::draw_children( uint_ptr hdc, int x, int y, const position* clip, draw_flag flag, int zindex ) LITEHTML_EMPTY_FUNC
331 void litehtml::element::draw_stacking_context( uint_ptr hdc, int x, int y, const position* clip, bool with_positioned ) LITEHTML_EMPTY_FUNC
332 void litehtml::element::render_positioned(render_type rt)                                                       LITEHTML_EMPTY_FUNC
333 int litehtml::element::get_zindex() const                                                                                       LITEHTML_RETURN_FUNC(0)
334 bool litehtml::element::fetch_positioned()                                                                                      LITEHTML_RETURN_FUNC(false)
335 litehtml::visibility litehtml::element::get_visibility() const                                          LITEHTML_RETURN_FUNC(visibility_visible)
336 void litehtml::element::apply_vertical_align()                                                                          LITEHTML_EMPTY_FUNC
337 void litehtml::element::set_css_width( css_length& w )                                                          LITEHTML_EMPTY_FUNC
338 litehtml::element::ptr litehtml::element::get_child( int idx ) const                            LITEHTML_RETURN_FUNC(0)
339 size_t litehtml::element::get_children_count() const                                                            LITEHTML_RETURN_FUNC(0)
340 void litehtml::element::calc_outlines( int parent_width )                                                       LITEHTML_EMPTY_FUNC
341 litehtml::css_length litehtml::element::get_css_width() const                                           LITEHTML_RETURN_FUNC(css_length())
342 litehtml::css_length litehtml::element::get_css_height() const                                          LITEHTML_RETURN_FUNC(css_length())
343 litehtml::element_clear litehtml::element::get_clear() const                                            LITEHTML_RETURN_FUNC(clear_none)
344 litehtml::css_length litehtml::element::get_css_left() const                                            LITEHTML_RETURN_FUNC(css_length())
345 litehtml::css_length litehtml::element::get_css_right() const                                           LITEHTML_RETURN_FUNC(css_length())
346 litehtml::css_length litehtml::element::get_css_top() const                                                     LITEHTML_RETURN_FUNC(css_length())
347 litehtml::css_length litehtml::element::get_css_bottom() const                                          LITEHTML_RETURN_FUNC(css_length())
348 litehtml::css_offsets litehtml::element::get_css_offsets() const                                        LITEHTML_RETURN_FUNC(css_offsets())
349 litehtml::vertical_align litehtml::element::get_vertical_align() const                          LITEHTML_RETURN_FUNC(va_baseline)
350 int litehtml::element::place_element(const ptr &el, int max_width)                                      LITEHTML_RETURN_FUNC(0)
351 int litehtml::element::render_inline(const ptr &container, int max_width)                       LITEHTML_RETURN_FUNC(0)
352 void litehtml::element::add_positioned(const ptr &el)                                                   LITEHTML_EMPTY_FUNC
353 int litehtml::element::find_next_line_top( int top, int width, int def_right )          LITEHTML_RETURN_FUNC(0)
354 litehtml::element_float litehtml::element::get_float() const                                            LITEHTML_RETURN_FUNC(float_none)
355 void litehtml::element::add_float(const ptr &el, int x, int y)                                  LITEHTML_EMPTY_FUNC
356 void litehtml::element::update_floats(int dy, const ptr &parent)                                        LITEHTML_EMPTY_FUNC
357 int litehtml::element::get_line_left( int y )                                                                           LITEHTML_RETURN_FUNC(0)
358 int litehtml::element::get_line_right( int y, int def_right )                                           LITEHTML_RETURN_FUNC(def_right)
359 int litehtml::element::get_left_floats_height() const                                                           LITEHTML_RETURN_FUNC(0)
360 int litehtml::element::get_right_floats_height() const                                                          LITEHTML_RETURN_FUNC(0)
361 int litehtml::element::get_floats_height(element_float el_float) const                          LITEHTML_RETURN_FUNC(0)
362 bool litehtml::element::is_floats_holder() const                                                                        LITEHTML_RETURN_FUNC(false)
363 void litehtml::element::get_content_size( size& sz, int max_width )                                     LITEHTML_EMPTY_FUNC
364 void litehtml::element::init()                                                                                                          LITEHTML_EMPTY_FUNC
365 int litehtml::element::render( int x, int y, int max_width, bool second_pass )          LITEHTML_RETURN_FUNC(0)
366 bool litehtml::element::appendChild(const ptr &el)                                              LITEHTML_RETURN_FUNC(false)
367 bool litehtml::element::removeChild(const ptr &el)                                              LITEHTML_RETURN_FUNC(false)
368 void litehtml::element::clearRecursive()                                                                                        LITEHTML_EMPTY_FUNC
369 const litehtml::tchar_t* litehtml::element::get_tagName() const                                         LITEHTML_RETURN_FUNC(_t(""))
370 void litehtml::element::set_tagName( const tchar_t* tag )                                                       LITEHTML_EMPTY_FUNC
371 void litehtml::element::set_data( const tchar_t* data )                                                         LITEHTML_EMPTY_FUNC
372 void litehtml::element::set_attr( const tchar_t* name, const tchar_t* val )                     LITEHTML_EMPTY_FUNC
373 void litehtml::element::apply_stylesheet( const litehtml::css& stylesheet )                     LITEHTML_EMPTY_FUNC
374 void litehtml::element::refresh_styles()                                                                                        LITEHTML_EMPTY_FUNC
375 void litehtml::element::on_click()                                                                                                      LITEHTML_EMPTY_FUNC
376 void litehtml::element::init_font()                                                                                                     LITEHTML_EMPTY_FUNC
377 void litehtml::element::get_inline_boxes( position::vector& boxes )                                     LITEHTML_EMPTY_FUNC
378 void litehtml::element::parse_styles( bool is_reparse /*= false*/ )                                     LITEHTML_EMPTY_FUNC
379 const litehtml::tchar_t* litehtml::element::get_attr( const tchar_t* name, const tchar_t* def /*= 0*/ ) LITEHTML_RETURN_FUNC(def)
380 bool litehtml::element::is_white_space() const                                                                          LITEHTML_RETURN_FUNC(false)
381 bool litehtml::element::is_body() const                                                                                         LITEHTML_RETURN_FUNC(false)
382 bool litehtml::element::is_break() const                                                                                        LITEHTML_RETURN_FUNC(false)
383 int litehtml::element::get_base_line()                                                                                          LITEHTML_RETURN_FUNC(0)
384 bool litehtml::element::on_mouse_over()                                                                                         LITEHTML_RETURN_FUNC(false)
385 bool litehtml::element::on_mouse_leave()                                                                                        LITEHTML_RETURN_FUNC(false)
386 bool litehtml::element::on_lbutton_down()                                                                                       LITEHTML_RETURN_FUNC(false)
387 bool litehtml::element::on_lbutton_up()                                                                                         LITEHTML_RETURN_FUNC(false)
388 bool litehtml::element::find_styles_changes( position::vector& redraw_boxes, int x, int y )     LITEHTML_RETURN_FUNC(false)
389 const litehtml::tchar_t* litehtml::element::get_cursor()                                                        LITEHTML_RETURN_FUNC(0)
390 litehtml::white_space litehtml::element::get_white_space() const                                        LITEHTML_RETURN_FUNC(white_space_normal)
391 litehtml::style_display litehtml::element::get_display() const                                          LITEHTML_RETURN_FUNC(display_none)
392 bool litehtml::element::set_pseudo_class( const tchar_t* pclass, bool add )                     LITEHTML_RETURN_FUNC(false)
393 bool litehtml::element::set_class( const tchar_t* pclass, bool add )                            LITEHTML_RETURN_FUNC(false)
394 litehtml::element_position litehtml::element::get_element_position(css_offsets* offsets) const                  LITEHTML_RETURN_FUNC(element_position_static)
395 bool litehtml::element::is_replaced() const                                                                                     LITEHTML_RETURN_FUNC(false)
396 int litehtml::element::line_height() const                                                                                      LITEHTML_RETURN_FUNC(0)
397 void litehtml::element::draw( uint_ptr hdc, int x, int y, const position* clip )        LITEHTML_EMPTY_FUNC
398 void litehtml::element::draw_background( uint_ptr hdc, int x, int y, const position* clip )     LITEHTML_EMPTY_FUNC
399 const litehtml::tchar_t* litehtml::element::get_style_property( const tchar_t* name, bool inherited, const tchar_t* def /*= 0*/ )       LITEHTML_RETURN_FUNC(0)
400 litehtml::uint_ptr litehtml::element::get_font( font_metrics* fm /*= 0*/ )                      LITEHTML_RETURN_FUNC(0)
401 int litehtml::element::get_font_size()  const                                                                           LITEHTML_RETURN_FUNC(0)
402 void litehtml::element::get_text( tstring& text )                                                                       LITEHTML_EMPTY_FUNC
403 void litehtml::element::parse_attributes()                                                                                      LITEHTML_EMPTY_FUNC
404 int litehtml::element::select( const css_selector& selector, bool apply_pseudo)         LITEHTML_RETURN_FUNC(select_no_match)
405 int litehtml::element::select( const css_element_selector& selector, bool apply_pseudo /*= true*/ )     LITEHTML_RETURN_FUNC(select_no_match)
406 litehtml::element::ptr litehtml::element::find_ancestor(const css_selector& selector, bool apply_pseudo, bool* is_pseudo)       LITEHTML_RETURN_FUNC(0)
407 bool litehtml::element::is_first_child_inline(const element::ptr& el) const                     LITEHTML_RETURN_FUNC(false)
408 bool litehtml::element::is_last_child_inline(const element::ptr& el)                            LITEHTML_RETURN_FUNC(false)
409 bool litehtml::element::have_inline_child() const                                                                       LITEHTML_RETURN_FUNC(false)