Cogs.Core
box.h
1#ifndef LH_BOX_H
2#define LH_BOX_H
3
4namespace 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:
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 }
30 virtual ~box() {}
31
32 int bottom() { return m_box_top + height(); }
33 int top() { return m_box_top; }
34 int right() { return m_box_left + width(); }
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
53
54 class block_box : public box
55 {
56 element::ptr m_element;
57 public:
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
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:
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