#pragma once #include #include class Element; class LayoutBlock : public LayoutBox { public: LayoutBlock(const Node*, NonnullRefPtr); virtual ~LayoutBlock() override; virtual const char* class_name() const override { return "LayoutBlock"; } virtual void layout() override; virtual void render(RenderingContext&) override; virtual LayoutNode& inline_wrapper() override; Vector& line_boxes() { return m_line_boxes; } const Vector& line_boxes() const { return m_line_boxes; } LineBox& ensure_last_line_box(); LineBox& add_line_box(); virtual HitTestResult hit_test(const Point&) const override; LayoutBlock* previous_sibling() { return to(LayoutNode::previous_sibling()); } const LayoutBlock* previous_sibling() const { return to(LayoutNode::previous_sibling()); } LayoutBlock* next_sibling() { return to(LayoutNode::next_sibling()); } const LayoutBlock* next_sibling() const { return to(LayoutNode::next_sibling()); } template void for_each_fragment(Callback); template void for_each_fragment(Callback) const; private: virtual bool is_block() const override { return true; } NonnullRefPtr style_for_anonymous_block() const; void layout_inline_children(); void layout_block_children(); void compute_width(); void compute_position(); void compute_height(); Vector m_line_boxes; }; template void LayoutBlock::for_each_fragment(Callback callback) { for (auto& line_box : line_boxes()) { for (auto& fragment : line_box.fragments()) { if (callback(fragment) == IterationDecision::Break) return; } } } template void LayoutBlock::for_each_fragment(Callback callback) const { for (auto& line_box : line_boxes()) { for (auto& fragment : line_box.fragments()) { if (callback(fragment) == IterationDecision::Break) return; } } } template<> inline bool is(const LayoutNode& node) { return node.is_block(); }