blob: ab01a7a53b4168c8aaad994d624ddc896a9847b0 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// 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_TAB_GROUP_HEADER_H_
#define CHROME_BROWSER_UI_VIEWS_TABS_TAB_GROUP_HEADER_H_
#include "chrome/browser/ui/views/tabs/tab_slot_view.h"
#include "components/tab_groups/tab_group_id.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/views/context_menu_controller.h"
#include "ui/views/controls/focus_ring.h"
#include "ui/views/view_targeter_delegate.h"
#include "ui/views/widget/widget_observer.h"
class TabStrip;
struct TabSizeInfo;
namespace views {
class Label;
class View;
}
// View for tab group headers in the tab strip, which are markers of group
// boundaries. There is one header for each group, which is included in the tab
// strip flow and positioned left of the leftmost tab in the group.
class TabGroupHeader : public TabSlotView,
public views::ContextMenuController,
public views::ViewTargeterDelegate {
public:
METADATA_HEADER(TabGroupHeader);
TabGroupHeader(TabStrip* tab_strip, const tab_groups::TabGroupId& group);
TabGroupHeader(const TabGroupHeader&) = delete;
TabGroupHeader& operator=(const TabGroupHeader&) = delete;
~TabGroupHeader() override;
// TabSlotView:
bool OnKeyPressed(const ui::KeyEvent& event) override;
bool OnMousePressed(const ui::MouseEvent& event) override;
bool OnMouseDragged(const ui::MouseEvent& event) override;
void OnMouseReleased(const ui::MouseEvent& event) override;
void OnMouseEntered(const ui::MouseEvent& event) override;
void OnGestureEvent(ui::GestureEvent* event) override;
void OnFocus() override;
void OnThemeChanged() override;
void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
TabSlotView::ViewType GetTabSlotViewType() const override;
TabSizeInfo GetTabSizeInfo() const override;
std::u16string GetTooltipText(const gfx::Point& p) const override;
// views::ContextMenuController:
void ShowContextMenuForViewImpl(views::View* source,
const gfx::Point& point,
ui::MenuSourceType source_type) override;
// views::ViewTargeterDelegate:
bool DoesIntersectRect(const views::View* target,
const gfx::Rect& rect) const override;
// Updates our visual state according to the tab_groups::TabGroupVisualData
// for our group.
void VisualsChanged();
// Removes {editor_bubble_tracker_} from observing the widget.
void RemoveObserverFromWidget(views::Widget* widget);
private:
friend class TabGroupEditorBubbleViewDialogBrowserTest;
// Calculate the width for this View.
int GetDesiredWidth() const;
// Helper method used to log the time since the group was last expanded or
// collapsed.
void LogCollapseTime();
TabStrip* const tab_strip_;
views::View* title_chip_;
views::Label* title_;
// Time used for logging the last time the group was collapsed or expanded.
base::TimeTicks last_modified_expansion_;
// Tracks whether our editor bubble is open. At most one can be open
// at once.
class EditorBubbleTracker : public views::WidgetObserver {
public:
EditorBubbleTracker() = default;
~EditorBubbleTracker() override;
void Opened(views::Widget* bubble_widget);
bool is_open() const { return is_open_; }
views::Widget* widget() const { return widget_; }
// views::WidgetObserver:
void OnWidgetDestroyed(views::Widget* widget) override;
private:
bool is_open_ = false;
views::Widget* widget_;
};
EditorBubbleTracker editor_bubble_tracker_;
};
#endif // CHROME_BROWSER_UI_VIEWS_TABS_TAB_GROUP_HEADER_H_