LayoutBlock.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #pragma once
  2. #include <LibHTML/Layout/LayoutBox.h>
  3. #include <LibHTML/Layout/LineBox.h>
  4. class Element;
  5. class LayoutBlock : public LayoutBox {
  6. public:
  7. LayoutBlock(const Node*, NonnullRefPtr<StyleProperties>);
  8. virtual ~LayoutBlock() override;
  9. virtual const char* class_name() const override { return "LayoutBlock"; }
  10. virtual void layout() override;
  11. virtual void render(RenderingContext&) override;
  12. virtual LayoutNode& inline_wrapper() override;
  13. Vector<LineBox>& line_boxes() { return m_line_boxes; }
  14. const Vector<LineBox>& line_boxes() const { return m_line_boxes; }
  15. LineBox& ensure_last_line_box();
  16. LineBox& add_line_box();
  17. virtual HitTestResult hit_test(const Point&) const override;
  18. LayoutBlock* previous_sibling() { return to<LayoutBlock>(LayoutNode::previous_sibling()); }
  19. const LayoutBlock* previous_sibling() const { return to<LayoutBlock>(LayoutNode::previous_sibling()); }
  20. LayoutBlock* next_sibling() { return to<LayoutBlock>(LayoutNode::next_sibling()); }
  21. const LayoutBlock* next_sibling() const { return to<LayoutBlock>(LayoutNode::next_sibling()); }
  22. private:
  23. virtual bool is_block() const override { return true; }
  24. NonnullRefPtr<StyleProperties> style_for_anonymous_block() const;
  25. void layout_inline_children();
  26. void layout_block_children();
  27. void compute_width();
  28. void compute_position();
  29. void compute_height();
  30. Vector<LineBox> m_line_boxes;
  31. };
  32. template<typename Callback>
  33. void LayoutNode::for_each_fragment_of_this(Callback callback)
  34. {
  35. auto& block = *containing_block();
  36. for (auto& line_box : block.line_boxes()) {
  37. for (auto& fragment : line_box.fragments()) {
  38. if (callback(fragment) == IterationDecision::Break)
  39. return;
  40. }
  41. }
  42. }
  43. template<>
  44. inline bool is<LayoutBlock>(const LayoutNode& node)
  45. {
  46. return node.is_block();
  47. }