#ifndef UI_VIEWS_CONTROLS_TABLE_TABLE_HEADER_H_
#define UI_VIEWS_CONTROLS_TABLE_TABLE_HEADER_H_
#include <memory>
#include "base/memory/weak_ptr.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/gfx/font_list.h"
#include "ui/views/controls/table/table_view.h"
#include "ui/views/view.h"
#include "ui/views/views_export.h"
namespace views {
class VIEWS_EXPORT TableHeader : public View {
METADATA_HEADER(TableHeader, View)
public:
explicit TableHeader(base::WeakPtr<TableView> table);
TableHeader(const TableHeader&) = delete;
TableHeader& operator=(const TableHeader&) = delete;
~TableHeader() override;
const gfx::FontList& font_list() const { return font_list_; }
void ResizeColumnViaKeyboard(size_t index,
TableView::AdvanceDirection direction);
void InstallFocusRing();
void UpdateFocusState();
int GetCellVerticalPadding() const;
int GetCellHorizontalPadding() const;
int GetResizeBarVerticalPadding() const;
int GetSeparatorHorizontalPadding() const;
ui::ColorId GetSeparatorHorizontalColorId() const;
ui::ColorId GetSeparatorVerticalColorId() const;
ui::ColorId GetBackgroundColorId() const;
int GetSortIndicatorWidth() const;
gfx::Font::Weight GetFontWeight() const;
float GetFocusRingUpperRadius() const;
void OnPaint(gfx::Canvas* canvas) override;
gfx::Size CalculatePreferredSize(
const SizeBounds& ) const override;
bool GetNeedsNotificationWhenVisibleBoundsChange() const override;
void OnVisibleBoundsChanged() override;
void AddedToWidget() override;
ui::Cursor GetCursor(const ui::MouseEvent& event) override;
bool OnMousePressed(const ui::MouseEvent& event) override;
bool OnMouseDragged(const ui::MouseEvent& event) override;
void OnMouseReleased(const ui::MouseEvent& event) override;
void OnMouseCaptureLost() override;
void OnGestureEvent(ui::GestureEvent* event) override;
void OnThemeChanged() override;
private:
class HighlightPathGenerator;
struct ColumnResizeDetails {
ColumnResizeDetails() = default;
size_t column_index = 0;
int initial_x = 0;
int initial_width = 0;
};
bool GetHeaderRowHasFocus() const;
gfx::Rect GetActiveHeaderCellBounds() const;
bool HasFocusIndicator() const;
float GetDefaultFocusRingRadius() const;
bool StartResize(const ui::LocatedEvent& event);
void ContinueResize(const ui::LocatedEvent& event);
void ToggleSortOrder(const ui::LocatedEvent& event);
std::optional<size_t> GetResizeColumn(int x) const;
bool is_resizing() const { return resize_details_.get() != nullptr; }
const base::WeakPtr<TableView> table_;
const gfx::FontList font_list_;
std::unique_ptr<ColumnResizeDetails> resize_details_;
};
}
#endif