blob: 2bb729cd473affcb54504d377f485d17054540fe [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_TABS_NEW_TAB_BUTTON_H_
#define CHROME_BROWSER_UI_VIEWS_TABS_NEW_TAB_BUTTON_H_
#include "base/memory/raw_ptr.h"
#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
#include "chrome/browser/ui/views/tabs/tab_strip.h"
#include "chrome/browser/ui/views/tabs/tab_strip_control_button.h"
#include "ui/menus/simple_menu_model.h"
#include "ui/views/context_menu_controller.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/controls/menu/menu_runner.h"
#include "ui/views/view.h"
namespace views {
class MenuRunner;
}
class NewTabButtonMenuModel;
// A subclass of TabStripControlButton that provides a specialized
// context menu to the new tab button for adding new tabs in
// groups or making new tab groups.
class NewTabButton : public TabStripControlButton,
public views::ContextMenuController {
public:
NewTabButton(TabStripController* tab_strip,
PressedCallback callback,
const gfx::VectorIcon& icon,
Edge fixed_flat_edge = Edge::kNone,
Edge animated_flat_edge = Edge::kNone,
BrowserWindowInterface* browser = nullptr);
NewTabButton(const NewTabButton&) = delete;
NewTabButton& operator=(const NewTabButton&) = delete;
~NewTabButton() override;
// views::ContextMenuController
void ShowContextMenuForViewImpl(
View* source,
const gfx::Point& point,
ui::mojom::MenuSourceType source_type) override;
private:
std::unique_ptr<NewTabButtonMenuModel> context_menu_model_;
std::unique_ptr<views::MenuRunner> context_menu_runner_;
raw_ptr<BrowserWindowInterface> browser_;
};
class NewTabButtonMenuModel : public ui::SimpleMenuModel,
public ui::SimpleMenuModel::Delegate {
public:
DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kNewTab);
DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kNewTabInGroup);
DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kNewSplitView);
DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kCreateNewTabGroup);
explicit NewTabButtonMenuModel(BrowserWindowInterface* browser);
NewTabButtonMenuModel(const NewTabButtonMenuModel&) = delete;
NewTabButtonMenuModel& operator=(const NewTabButtonMenuModel&) = delete;
~NewTabButtonMenuModel() override;
// ui::SimpleMenuModel::Delegate:
void ExecuteCommand(int command_id, int event_flags) override;
bool GetAcceleratorForCommandId(int command_id,
ui::Accelerator* accelerator) const override;
private:
void AddNewTabInGroupItem();
void AddNewSplitTabItem();
raw_ptr<BrowserWindowInterface> browser_;
};
#endif // CHROME_BROWSER_UI_VIEWS_TABS_NEW_TAB_BUTTON_H_