| // Copyright 2017 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. |
| |
| #include "ash/shelf/back_button.h" |
| |
| #include "ash/keyboard/keyboard_util.h" |
| #include "ash/resources/vector_icons/vector_icons.h" |
| #include "ash/shelf/shelf.h" |
| #include "ash/shelf/shelf_focus_cycler.h" |
| #include "ash/strings/grit/ash_strings.h" |
| #include "ash/style/ash_color_provider.h" |
| #include "ash/style/default_color_constants.h" |
| #include "ash/style/default_colors.h" |
| #include "ash/wm/window_state.h" |
| #include "ash/wm/window_util.h" |
| #include "base/metrics/user_metrics.h" |
| #include "base/metrics/user_metrics_action.h" |
| #include "ui/aura/window.h" |
| #include "ui/aura/window_tree_host.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/gfx/canvas.h" |
| #include "ui/gfx/paint_vector_icon.h" |
| #include "ui/views/widget/widget.h" |
| |
| namespace ash { |
| |
| // static |
| const char BackButton::kViewClassName[] = "ash/BackButton"; |
| |
| BackButton::BackButton(Shelf* shelf) : ShelfControlButton(shelf, this) { |
| SetAccessibleName(l10n_util::GetStringUTF16(IDS_ASH_SHELF_BACK_BUTTON_TITLE)); |
| EnableCanvasFlippingForRTLUI(true); |
| } |
| |
| BackButton::~BackButton() {} |
| |
| void BackButton::HandleLocaleChange() { |
| SetAccessibleName(l10n_util::GetStringUTF16(IDS_ASH_SHELF_BACK_BUTTON_TITLE)); |
| TooltipTextChanged(); |
| } |
| |
| void BackButton::PaintButtonContents(gfx::Canvas* canvas) { |
| // Use PaintButtonContents instead of SetImage so the icon gets drawn at |
| // |GetCenterPoint| coordinates instead of always in the center. |
| gfx::ImageSkia img = CreateVectorIcon( |
| kShelfBackIcon, DeprecatedGetContentLayerColor( |
| AshColorProvider::ContentLayerType::kButtonIconColor, |
| kShelfButtonColor)); |
| canvas->DrawImageInt(img, GetCenterPoint().x() - img.width() / 2, |
| GetCenterPoint().y() - img.height() / 2); |
| } |
| |
| const char* BackButton::GetClassName() const { |
| return kViewClassName; |
| } |
| |
| base::string16 BackButton::GetTooltipText(const gfx::Point& p) const { |
| return GetAccessibleName(); |
| } |
| |
| void BackButton::OnShelfButtonAboutToRequestFocusFromTabTraversal( |
| ShelfButton* button, |
| bool reverse) { |
| DCHECK_EQ(button, this); |
| if (!reverse) { |
| // We're trying to focus this button by advancing from the last view of |
| // the shelf. Let the focus manager advance to the status area instead. |
| shelf()->shelf_focus_cycler()->FocusOut(reverse, |
| SourceView::kShelfNavigationView); |
| } |
| } |
| |
| void BackButton::ButtonPressed(views::Button* sender, |
| const ui::Event& event, |
| views::InkDrop* ink_drop) { |
| base::RecordAction(base::UserMetricsAction("AppList_BackButtonPressed")); |
| |
| if (keyboard_util::CloseKeyboardIfActive()) |
| return; |
| |
| if (window_util::ShouldMinimizeTopWindowOnBack()) { |
| auto* top_window = window_util::GetTopWindow(); |
| DCHECK(top_window); |
| WindowState::Get(top_window)->Minimize(); |
| return; |
| } |
| |
| window_util::SendBackKeyEvent( |
| GetWidget()->GetNativeWindow()->GetRootWindow()); |
| } |
| |
| } // namespace ash |