1 #ifndef LH_HTML_TAG_H
2 #define LH_HTML_TAG_H
3 
4 #include "element.h"
5 #include "style.h"
6 #include "background.h"
7 #include "css_margins.h"
8 #include "borders.h"
9 #include "css_selector.h"
10 #include "stylesheet.h"
11 #include "box.h"
12 #include "table.h"
13 
14 namespace litehtml
15 {
16 	struct line_context
17 	{
18 		int calculatedTop;
19 		int top;
20 		int left;
21 		int right;
22 
widthline_context23 		int width()
24 		{
25 			return right - left;
26 		}
fix_topline_context27 		void fix_top()
28 		{
29 			calculatedTop = top;
30 		}
31 	};
32 
33 	class html_tag : public element
34 	{
35 		friend class elements_iterator;
36 		friend class el_table;
37 		friend class table_grid;
38 		friend class block_box;
39 		friend class line_box;
40 	public:
41 		typedef std::shared_ptr<litehtml::html_tag>	ptr;
42 	protected:
43 		box::vector				m_boxes;
44 		string_vector			m_class_values;
45 		tstring					m_tag;
46 		litehtml::style			m_style;
47 		string_map				m_attrs;
48 		vertical_align			m_vertical_align;
49 		text_align				m_text_align;
50 		style_display			m_display;
51 		list_style_type			m_list_style_type;
52 		list_style_position		m_list_style_position;
53 		white_space				m_white_space;
54 		element_float			m_float;
55 		element_clear			m_clear;
56 		floated_box::vector		m_floats_left;
57 		floated_box::vector		m_floats_right;
58 		elements_vector			m_positioned;
59 		background				m_bg;
60 		element_position		m_el_position;
61 		int						m_line_height;
62 		bool					m_lh_predefined;
63 		string_vector			m_pseudo_classes;
64 		used_selector::vector	m_used_styles;
65 
66 		uint_ptr				m_font;
67 		int						m_font_size;
68 		font_metrics			m_font_metrics;
69 
70 		css_margins				m_css_margins;
71 		css_margins				m_css_padding;
72 		css_borders				m_css_borders;
73 		css_length				m_css_width;
74 		css_length				m_css_height;
75 		css_length				m_css_min_width;
76 		css_length				m_css_min_height;
77 		css_length				m_css_max_width;
78 		css_length				m_css_max_height;
79 		css_offsets				m_css_offsets;
80 		css_length				m_css_text_indent;
81 
82 		overflow				m_overflow;
83 		visibility				m_visibility;
84 		int						m_z_index;
85 		box_sizing				m_box_sizing;
86 
87 		int_int_cache			m_cahe_line_left;
88 		int_int_cache			m_cahe_line_right;
89 
90 		// data for table rendering
91 		std::unique_ptr<table_grid>	m_grid;
92 		css_length				m_css_border_spacing_x;
93 		css_length				m_css_border_spacing_y;
94 		int						m_border_spacing_x;
95 		int						m_border_spacing_y;
96 		border_collapse			m_border_collapse;
97 
98 		virtual void			select_all(const css_selector& selector, elements_vector& res) override;
99 
100 	public:
101 		html_tag(const std::shared_ptr<litehtml::document>& doc);
102 		virtual ~html_tag();
103 
104 		/* render functions */
105 
106 		virtual int					render(int x, int y, int max_width, bool second_pass = false) override;
107 
108 		virtual int					render_inline(const element::ptr &container, int max_width) override;
109 		virtual int					place_element(const element::ptr &el, int max_width) override;
110 		virtual bool				fetch_positioned() override;
111 		virtual void				render_positioned(render_type rt = render_all) override;
112 
113 		int							new_box(const element::ptr &el, int max_width, line_context& line_ctx);
114 
115 		int							get_cleared_top(const element::ptr &el, int line_top) const;
116 		int							finish_last_box(bool end_of_render = false);
117 
118 		virtual bool				appendChild(const element::ptr &el) override;
119 		virtual bool				removeChild(const element::ptr &el) override;
120 		virtual void				clearRecursive() override;
121 		virtual const tchar_t*		get_tagName() const override;
122 		virtual void				set_tagName(const tchar_t* tag) override;
123 		virtual void				set_data(const tchar_t* data) override;
124 		virtual element_float		get_float() const override;
125 		virtual vertical_align		get_vertical_align() const override;
126 		virtual css_length			get_css_left() const override;
127 		virtual css_length			get_css_right() const override;
128 		virtual css_length			get_css_top() const override;
129 		virtual css_length			get_css_bottom() const override;
130 		virtual css_length			get_css_width() const override;
131 		virtual css_offsets			get_css_offsets() const override;
132 		virtual void				set_css_width(css_length& w) override;
133 		virtual css_length			get_css_height() const override;
134 		virtual element_clear		get_clear() const override;
135 		virtual size_t				get_children_count() const override;
136 		virtual element::ptr		get_child(int idx) const override;
137 		virtual element_position	get_element_position(css_offsets* offsets = 0) const override;
138 		virtual overflow			get_overflow() const override;
139 
140 		virtual void				set_attr(const tchar_t* name, const tchar_t* val) override;
141 		virtual const tchar_t*		get_attr(const tchar_t* name, const tchar_t* def = 0) override;
142 		virtual void				apply_stylesheet(const litehtml::css& stylesheet) override;
143 		virtual void				refresh_styles() override;
144 
145 		virtual bool				is_white_space() const override;
146 		virtual bool				is_body() const override;
147 		virtual bool				is_break() const override;
148 		virtual int					get_base_line() override;
149 		virtual bool				on_mouse_over() override;
150 		virtual bool				on_mouse_leave() override;
151 		virtual bool				on_lbutton_down() override;
152 		virtual bool				on_lbutton_up() override;
153 		virtual void				on_click() override;
154 		virtual bool				find_styles_changes(position::vector& redraw_boxes, int x, int y) override;
155 		virtual const tchar_t*		get_cursor() override;
156 		virtual void				init_font() override;
157 		virtual bool				set_pseudo_class(const tchar_t* pclass, bool add) override;
158 		virtual bool				set_class(const tchar_t* pclass, bool add) override;
159 		virtual bool				is_replaced() const override;
160 		virtual int					line_height() const override;
161 		virtual white_space			get_white_space() const override;
162 		virtual style_display		get_display() const override;
163 		virtual visibility			get_visibility() const override;
164 		virtual void				parse_styles(bool is_reparse = false) override;
165 		virtual void				draw(uint_ptr hdc, int x, int y, const position* clip) override;
166 		virtual void				draw_background(uint_ptr hdc, int x, int y, const position* clip) override;
167 
168 		virtual const tchar_t*		get_style_property(const tchar_t* name, bool inherited, const tchar_t* def = 0) override;
169 		virtual uint_ptr			get_font(font_metrics* fm = 0) override;
170 		virtual int					get_font_size() const override;
171 
172 		elements_vector&			children();
173 		virtual void				calc_outlines(int parent_width) override;
174 		virtual void				calc_auto_margins(int parent_width) override;
175 
176 		virtual int					select(const css_selector& selector, bool apply_pseudo = true) override;
177 		virtual int					select(const css_element_selector& selector, bool apply_pseudo = true) override;
178 
179 		virtual elements_vector		select_all(const tstring& selector) override;
180 		virtual elements_vector		select_all(const css_selector& selector) override;
181 
182 		virtual element::ptr		select_one(const tstring& selector) override;
183 		virtual element::ptr		select_one(const css_selector& selector) override;
184 
185 		virtual element::ptr		find_ancestor(const css_selector& selector, bool apply_pseudo = true, bool* is_pseudo = 0) override;
186 		virtual element::ptr		find_adjacent_sibling(const element::ptr& el, const css_selector& selector, bool apply_pseudo = true, bool* is_pseudo = 0) override;
187 		virtual element::ptr		find_sibling(const element::ptr& el, const css_selector& selector, bool apply_pseudo = true, bool* is_pseudo = 0) override;
188 		virtual void				get_text(tstring& text) override;
189 		virtual void				parse_attributes() override;
190 
191 		virtual bool				is_first_child_inline(const element::ptr& el) const override;
192 		virtual bool				is_last_child_inline(const element::ptr& el) override;
193 		virtual bool				have_inline_child() const override;
194 		virtual void				get_content_size(size& sz, int max_width) override;
195 		virtual void				init() override;
196 		virtual void				get_inline_boxes(position::vector& boxes) override;
197 		virtual bool				is_floats_holder() const override;
198 		virtual int					get_floats_height(element_float el_float = float_none) const override;
199 		virtual int					get_left_floats_height() const override;
200 		virtual int					get_right_floats_height() const override;
201 		virtual int					get_line_left(int y) override;
202 		virtual int					get_line_right(int y, int def_right) override;
203 		virtual void				get_line_left_right(int y, int def_right, int& ln_left, int& ln_right) override;
204 		virtual void				add_float(const element::ptr &el, int x, int y) override;
205 		virtual void				update_floats(int dy, const element::ptr &parent) override;
206 		virtual void				add_positioned(const element::ptr &el) override;
207 		virtual int					find_next_line_top(int top, int width, int def_right) override;
208 		virtual void				apply_vertical_align() override;
209 		virtual void				draw_children(uint_ptr hdc, int x, int y, const position* clip, draw_flag flag, int zindex) override;
210 		virtual int					get_zindex() const override;
211 		virtual void				draw_stacking_context(uint_ptr hdc, int x, int y, const position* clip, bool with_positioned) override;
212 		virtual void				calc_document_size(litehtml::size& sz, int x = 0, int y = 0) override;
213 		virtual void				get_redraw_box(litehtml::position& pos, int x = 0, int y = 0) override;
214 		virtual void				add_style(const litehtml::style& st) override;
215 		virtual element::ptr		get_element_by_point(int x, int y, int client_x, int client_y) override;
216 		virtual element::ptr		get_child_by_point(int x, int y, int client_x, int client_y, draw_flag flag, int zindex) override;
217 
218 		virtual bool				is_nth_child(const element::ptr& el, int num, int off, bool of_type) const override;
219 		virtual bool				is_nth_last_child(const element::ptr& el, int num, int off, bool of_type) const override;
220 		virtual bool				is_only_child(const element::ptr& el, bool of_type) const override;
221 		virtual const background*	get_background(bool own_only = false) override;
222 
223 	protected:
224 		void						draw_children_box(uint_ptr hdc, int x, int y, const position* clip, draw_flag flag, int zindex);
225 		void						draw_children_table(uint_ptr hdc, int x, int y, const position* clip, draw_flag flag, int zindex);
226 		int							render_box(int x, int y, int max_width, bool second_pass = false);
227 		int							render_table(int x, int y, int max_width, bool second_pass = false);
228 		int							fix_line_width(int max_width, element_float flt);
229 		void						parse_background();
230 		void						init_background_paint( position pos, background_paint &bg_paint, const background* bg );
231 		void						draw_list_marker( uint_ptr hdc, const position &pos );
232 		void						parse_nth_child_params( tstring param, int &num, int &off );
233 		void						remove_before_after();
234 		litehtml::element::ptr		get_element_before();
235 		litehtml::element::ptr		get_element_after();
236 	};
237 
238 	/************************************************************************/
239 	/*                        Inline Functions                              */
240 	/************************************************************************/
241 
children()242 	inline elements_vector& litehtml::html_tag::children()
243 	{
244 		return m_children;
245 	}
246 }
247 
248 #endif  // LH_HTML_TAG_H
249