1 #ifndef LH_BOX_H
2 #define LH_BOX_H
3 
4 namespace litehtml
5 {
6 	class html_tag;
7 
8 	enum box_type
9 	{
10 		box_block,
11 		box_line
12 	};
13 
14 	class box
15 	{
16 	public:
17 		typedef std::unique_ptr<litehtml::box>	ptr;
18 		typedef std::vector< box::ptr >			vector;
19 	protected:
20 		int		m_box_top;
21 		int		m_box_left;
22 		int		m_box_right;
23 	public:
box(int top,int left,int right)24 		box(int top, int left, int right)
25 		{
26 			m_box_top	= top;
27 			m_box_left	= left;
28 			m_box_right	= right;
29 		}
~box()30 		virtual ~box() {}
31 
bottom()32 		int		bottom()	{ return m_box_top + height();	}
top()33 		int		top()		{ return m_box_top;				}
right()34 		int		right()		{ return m_box_left + width();	}
left()35 		int		left()		{ return m_box_left;			}
36 
37 		virtual litehtml::box_type	get_type() = 0;
38 		virtual int					height() = 0;
39 		virtual int					width() = 0;
40 		virtual void				add_element(const element::ptr &el) = 0;
41 		virtual bool				can_hold(const element::ptr &el, white_space ws) = 0;
42 		virtual void				finish(bool last_box = false) = 0;
43 		virtual bool				is_empty() = 0;
44 		virtual int					baseline() = 0;
45 		virtual void				get_elements(elements_vector& els) = 0;
46 		virtual int					top_margin() = 0;
47 		virtual int					bottom_margin() = 0;
48 		virtual void				y_shift(int shift) = 0;
49 		virtual void				new_width(int left, int right, elements_vector& els) = 0;
50 	};
51 
52 	//////////////////////////////////////////////////////////////////////////
53 
54 	class block_box : public box
55 	{
56 		element::ptr m_element;
57 	public:
block_box(int top,int left,int right)58 		block_box(int top, int left, int right) : box(top, left, right)
59 		{
60 			m_element = 0;
61 		}
62 
63 		virtual litehtml::box_type	get_type();
64 		virtual int					height();
65 		virtual int					width();
66 		virtual void				add_element(const element::ptr &el);
67 		virtual bool				can_hold(const element::ptr &el, white_space ws);
68 		virtual void				finish(bool last_box = false);
69 		virtual bool				is_empty();
70 		virtual int					baseline();
71 		virtual void				get_elements(elements_vector& els);
72 		virtual int					top_margin();
73 		virtual int					bottom_margin();
74 		virtual void				y_shift(int shift);
75 		virtual void				new_width(int left, int right, elements_vector& els);
76 	};
77 
78 	//////////////////////////////////////////////////////////////////////////
79 
80 	class line_box : public box
81 	{
82 		elements_vector			m_items;
83 		int						m_height;
84 		int						m_width;
85 		int						m_line_height;
86 		font_metrics			m_font_metrics;
87 		int						m_baseline;
88 		text_align				m_text_align;
89 	public:
line_box(int top,int left,int right,int line_height,font_metrics & fm,text_align align)90 		line_box(int top, int left, int right, int line_height, font_metrics& fm, text_align align) : box(top, left, right)
91 		{
92 			m_height		= 0;
93 			m_width			= 0;
94 			m_font_metrics	= fm;
95 			m_line_height	= line_height;
96 			m_baseline		= 0;
97 			m_text_align	= align;
98 		}
99 
100 		virtual litehtml::box_type	get_type();
101 		virtual int					height();
102 		virtual int					width();
103 		virtual void				add_element(const element::ptr &el);
104 		virtual bool				can_hold(const element::ptr &el, white_space ws);
105 		virtual void				finish(bool last_box = false);
106 		virtual bool				is_empty();
107 		virtual int					baseline();
108 		virtual void				get_elements(elements_vector& els);
109 		virtual int					top_margin();
110 		virtual int					bottom_margin();
111 		virtual void				y_shift(int shift);
112 		virtual void				new_width(int left, int right, elements_vector& els);
113 
114 	private:
115 		bool						have_last_space();
116 		bool						is_break_only();
117 	};
118 }
119 
120 #endif  // LH_BOX_H
121