#ifndef ASH_SHELF_DESK_BUTTON_WIDGET_H_
#define ASH_SHELF_DESK_BUTTON_WIDGET_H_
#include "ash/ash_export.h"
#include "ash/shelf/shelf_component.h"
#include "base/memory/raw_ptr.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h"
namespace ash {
class DeskButtonContainer;
class DeskButtonWidget;
class Shelf;
enum class ShelfAlignment;
class DeskButtonWidgetDelegateView : public views::WidgetDelegateView {
public:
DeskButtonWidgetDelegateView();
DeskButtonWidgetDelegateView(const DeskButtonWidgetDelegateView&) = delete;
DeskButtonWidgetDelegateView& operator=(const DeskButtonWidgetDelegateView&) =
delete;
~DeskButtonWidgetDelegateView() override;
DeskButtonContainer* desk_button_container() const {
return desk_button_container_;
}
void Init(DeskButtonWidget* desk_button_widget);
void Layout(PassKey) override;
bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
private:
raw_ptr<DeskButtonContainer> desk_button_container_ = nullptr;
raw_ptr<DeskButtonWidget> desk_button_widget_ = nullptr;
};
class ASH_EXPORT DeskButtonWidget : public ShelfComponent,
public views::Widget {
public:
explicit DeskButtonWidget(Shelf* shelf);
DeskButtonWidget(const DeskButtonWidget&) = delete;
DeskButtonWidget& operator=(const DeskButtonWidget&) = delete;
~DeskButtonWidget() override;
static int GetMaxLength(bool horizontal_shelf);
DeskButtonWidgetDelegateView* delegate_view() const { return delegate_view_; }
Shelf* shelf() const { return shelf_; }
bool ShouldReserveSpaceFromShelf() const;
bool ShouldBeVisible() const;
void PrepareForAlignmentChange();
void CalculateTargetBounds() override;
gfx::Rect GetTargetBounds() const override;
void UpdateLayout(bool animate) override;
void UpdateTargetBoundsForGesture(int shelf_position) override;
void HandleLocaleChange();
void Initialize(aura::Window* container);
DeskButtonContainer* GetDeskButtonContainer() const;
bool IsHorizontalShelf() const;
void SetDefaultChildToFocus(views::View* default_child_to_focus);
void StoreDeskButtonFocus();
void RestoreDeskButtonFocus();
void MaybeFocusOut(bool reverse);
void InitializeAccessibleProperties();
private:
bool OnNativeWidgetActivationChanged(bool active) override;
raw_ptr<DeskButtonWidgetDelegateView, DanglingUntriaged> delegate_view_ =
nullptr;
gfx::Rect target_bounds_;
raw_ptr<Shelf> const shelf_;
raw_ptr<views::View> default_child_to_focus_ = nullptr;
raw_ptr<views::View> stored_focused_view_ = nullptr;
};
}
#endif