/* * Copyright (c) 2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Web::Layout { class TableFormattingContext final : public FormattingContext { public: explicit TableFormattingContext(LayoutState&, TableBox const&, FormattingContext* parent); ~TableFormattingContext(); virtual void run(Box const&, LayoutMode, AvailableSpace const&) override; virtual CSSPixels automatic_content_width() const override; virtual CSSPixels automatic_content_height() const override; TableBox const& table_box() const { return static_cast(context_box()); } TableWrapper const& table_wrapper() const { return verify_cast(*table_box().containing_block()); } private: void calculate_row_column_grid(Box const&); void compute_table_measures(); void compute_table_width(); void distribute_width_to_columns(); void determine_intrisic_size_of_table_container(AvailableSpace const& available_space); void calculate_row_heights(LayoutMode layout_mode); void position_row_boxes(CSSPixels&); void position_cell_boxes(); CSSPixels m_automatic_content_height { 0 }; Optional m_available_space; enum class ColumnType { Percent, Pixel, Auto }; struct Column { ColumnType type { ColumnType::Auto }; CSSPixels left_offset { 0 }; CSSPixels min_width { 0 }; CSSPixels max_width { 0 }; CSSPixels used_width { 0 }; float percentage_width { 0 }; }; struct Row { JS::NonnullGCPtr box; CSSPixels used_height { 0 }; CSSPixels baseline { 0 }; }; struct Cell { JS::NonnullGCPtr box; size_t column_index; size_t row_index; size_t column_span; size_t row_span; CSSPixels baseline { 0 }; CSSPixels min_width { 0 }; CSSPixels max_width { 0 }; }; Vector m_cells; Vector m_columns; Vector m_rows; }; }