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