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