LayoutNode.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #pragma once
  2. #include <AK/Retained.h>
  3. #include <AK/Vector.h>
  4. #include <SharedGraphics/Rect.h>
  5. class Node;
  6. class LayoutNode {
  7. public:
  8. virtual ~LayoutNode();
  9. void retain();
  10. void release();
  11. int retain_count() const { return m_retain_count; }
  12. const Rect& rect() const { return m_rect; }
  13. void set_rect(const Rect& rect) { m_rect = rect; }
  14. bool is_anonymous() const { return !m_node; }
  15. const Node* node() const { return m_node; }
  16. LayoutNode* next_sibling() { return m_next_sibling; }
  17. LayoutNode* previous_sibling() { return m_previous_sibling; }
  18. LayoutNode* first_child() { return m_first_child; }
  19. LayoutNode* last_child() { return m_last_child; }
  20. const LayoutNode* next_sibling() const { return m_next_sibling; }
  21. const LayoutNode* previous_sibling() const { return m_previous_sibling; }
  22. const LayoutNode* first_child() const { return m_first_child; }
  23. const LayoutNode* last_child() const { return m_last_child; }
  24. void append_child(Retained<LayoutNode>);
  25. void set_next_sibling(LayoutNode* node) { m_next_sibling = node; }
  26. void set_previous_sibling(LayoutNode* node) { m_previous_sibling = node; }
  27. template<typename Callback>
  28. inline void for_each_child(Callback callback) const
  29. {
  30. for (auto* node = first_child(); node; node = node->next_sibling())
  31. callback(*node);
  32. }
  33. virtual const char* class_name() const { return "LayoutNode"; }
  34. virtual bool is_text() const { return false; }
  35. protected:
  36. explicit LayoutNode(const Node*);
  37. private:
  38. int m_retain_count { 1 };
  39. const Node* m_node { nullptr };
  40. LayoutNode* m_parent_node { nullptr };
  41. LayoutNode* m_first_child { nullptr };
  42. LayoutNode* m_last_child { nullptr };
  43. LayoutNode* m_next_sibling { nullptr };
  44. LayoutNode* m_previous_sibling { nullptr };
  45. Rect m_rect;
  46. };