#ifndef CHROME_BROWSER_UI_VIEWS_TOOLBAR_TOOLBAR_ACTION_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_TOOLBAR_TOOLBAR_ACTION_VIEW_H_
#include "base/callback_list.h"
#include "base/memory/raw_ptr.h"
#include "chrome/browser/ui/views/extensions/extension_context_menu_controller.h"
#include "chrome/browser/ui/views/toolbar/toolbar_action_hover_card_controller.h"
#include "extensions/common/extension_id.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h"
#include "ui/views/context_menu_controller.h"
#include "ui/views/controls/button/menu_button.h"
#include "ui/views/controls/button/menu_button_controller.h"
#include "ui/views/controls/menu/menu_model_adapter.h"
#include "ui/views/drag_controller.h"
namespace content {
class WebContents;
}
class ToolbarActionView : public views::MenuButton,
public ExtensionContextMenuController::Observer {
METADATA_HEADER(ToolbarActionView, views::MenuButton)
public:
class Delegate : public views::DragController {
public:
virtual content::WebContents* GetCurrentWebContents() = 0;
virtual views::LabelButton* GetOverflowReferenceView() const = 0;
virtual gfx::Size GetToolbarActionSize() = 0;
virtual void MovePinnedActionBy(const std::string& action_id,
int move_by) = 0;
virtual void UpdateHoverCard(
ToolbarActionView* action_view,
ToolbarActionHoverCardUpdateType update_type) = 0;
virtual void OnContextMenuShown(const std::string& action_id) = 0;
virtual void OnContextMenuClosed(const std::string& action_id) = 0;
protected:
~Delegate() override = default;
};
ToolbarActionView(ToolbarActionViewModel* view_model, Delegate* delegate);
ToolbarActionView(const ToolbarActionView&) = delete;
ToolbarActionView& operator=(const ToolbarActionView&) = delete;
~ToolbarActionView() override;
void MaybeUpdateHoverCardStatus(const ui::MouseEvent& event);
void ShowContextMenuAsFallback();
void OnPopupShown(bool by_user);
void OnPopupClosed();
views::BubbleAnchor GetReferenceButtonForPopup();
void UpdateState();
gfx::Rect GetAnchorBoundsInScreen() const override;
std::unique_ptr<views::LabelButtonBorder> CreateDefaultBorder()
const override;
bool IsTriggerableEvent(const ui::Event& event) override;
bool OnKeyPressed(const ui::KeyEvent& event) override;
void OnMouseMoved(const ui::MouseEvent& event) override;
void OnMouseEntered(const ui::MouseEvent& event) override;
ToolbarActionViewModel* view_model() { return view_model_; }
gfx::ImageSkia GetIconForTest();
int GetDragOperationsForTest(const gfx::Point& point);
private:
friend class ToolbarActionHoverCardBubbleViewUITest;
gfx::Size CalculatePreferredSize(
const views::SizeBounds& available_size) const override;
bool OnMousePressed(const ui::MouseEvent& event) override;
void OnMouseReleased(const ui::MouseEvent& event) override;
void OnGestureEvent(ui::GestureEvent* event) override;
void OnDragDone() override;
void AddedToWidget() override;
void RemovedFromWidget() override;
void OnContextMenuShown() override;
void OnContextMenuClosed() override;
views::Button* GetReferenceButtonForPopupInternal();
void ButtonPressed();
std::unique_ptr<views::MenuButtonController::PressedLock> pressed_lock_;
raw_ptr<ToolbarActionViewModel> view_model_;
raw_ptr<Delegate> delegate_;
bool suppress_next_release_ = false;
std::unique_ptr<ExtensionContextMenuController> context_menu_controller_;
base::CallbackListSubscription model_subscription_;
base::WeakPtrFactory<ToolbarActionView> weak_factory_{this};
};
#endif