Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Unified Diff: ash/common/system/chromeos/ime_menu/ime_list_view.cc

Issue 2734653002: chromeos: Move files in //ash/common to //ash (Closed)
Patch Set: fix a11y tests, fix docs Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ash/common/system/chromeos/ime_menu/ime_list_view.cc
diff --git a/ash/common/system/chromeos/ime_menu/ime_list_view.cc b/ash/common/system/chromeos/ime_menu/ime_list_view.cc
deleted file mode 100644
index c26468cad1d3d677cfe222cf182755389a0d99c9..0000000000000000000000000000000000000000
--- a/ash/common/system/chromeos/ime_menu/ime_list_view.cc
+++ /dev/null
@@ -1,469 +0,0 @@
-// Copyright 2016 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/common/system/chromeos/ime_menu/ime_list_view.h"
-
-#include "ash/common/material_design/material_design_controller.h"
-#include "ash/common/system/tray/hover_highlight_view.h"
-#include "ash/common/system/tray/ime_info.h"
-#include "ash/common/system/tray/system_menu_button.h"
-#include "ash/common/system/tray/system_tray_delegate.h"
-#include "ash/common/system/tray/tray_constants.h"
-#include "ash/common/system/tray/tray_details_view.h"
-#include "ash/common/system/tray/tray_popup_header_button.h"
-#include "ash/common/system/tray/tray_popup_item_style.h"
-#include "ash/common/system/tray/tray_popup_utils.h"
-#include "ash/common/system/tray/tri_view.h"
-#include "ash/common/wm_shell.h"
-#include "ash/resources/grit/ash_resources.h"
-#include "ash/strings/grit/ash_strings.h"
-#include "ui/accessibility/ax_node_data.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/color_palette.h"
-#include "ui/gfx/paint_vector_icon.h"
-#include "ui/gfx/vector_icons_public.h"
-#include "ui/keyboard/keyboard_util.h"
-#include "ui/views/background.h"
-#include "ui/views/border.h"
-#include "ui/views/controls/button/toggle_button.h"
-#include "ui/views/controls/image_view.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/controls/separator.h"
-#include "ui/views/layout/fill_layout.h"
-#include "ui/views/painter.h"
-#include "ui/views/view.h"
-#include "ui/views/widget/widget.h"
-
-namespace ash {
-namespace {
-
-const int kMinFontSizeDelta = -10;
-
-const SkColor kKeyboardRowSeparatorColor = SkColorSetA(SK_ColorBLACK, 0x1F);
-
-// A |HoverHighlightView| that uses bold or normal font depending on whether it
-// is selected. This view exposes itself as a checkbox to the accessibility
-// framework.
-class SelectableHoverHighlightView : public HoverHighlightView {
- public:
- SelectableHoverHighlightView(ViewClickListener* listener,
- const base::string16& label,
- bool selected)
- : HoverHighlightView(listener), selected_(selected) {
- AddLabel(label, gfx::ALIGN_LEFT, selected);
- }
-
- ~SelectableHoverHighlightView() override {}
-
- protected:
- // views::View:
- void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
- HoverHighlightView::GetAccessibleNodeData(node_data);
- node_data->role = ui::AX_ROLE_CHECK_BOX;
- if (selected_)
- node_data->AddStateFlag(ui::AX_STATE_CHECKED);
- }
-
- private:
- bool selected_;
-
- DISALLOW_COPY_AND_ASSIGN(SelectableHoverHighlightView);
-};
-
-// The IME list item view used in the material design. It contains IME info
-// (name and label) and a check button if the item is selected. It's also used
-// for IME property item, which has no name but label and a gray checked icon.
-class ImeListItemView : public ActionableView {
- public:
- ImeListItemView(SystemTrayItem* owner,
- ImeListView* list_view,
- const base::string16& id,
- const base::string16& label,
- bool selected,
- const SkColor button_color)
- : ActionableView(owner, TrayPopupInkDropStyle::FILL_BOUNDS),
- ime_list_view_(list_view),
- selected_(selected) {
- if (MaterialDesignController::IsSystemTrayMenuMaterial())
- SetInkDropMode(InkDropHostView::InkDropMode::ON);
-
- TriView* tri_view = TrayPopupUtils::CreateDefaultRowView();
- AddChildView(tri_view);
- SetLayoutManager(new views::FillLayout);
-
- // The id button shows the IME short name.
- views::Label* id_label = TrayPopupUtils::CreateDefaultLabel();
- id_label->SetText(id);
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- const gfx::FontList& base_font_list =
- rb.GetFontList(ui::ResourceBundle::MediumBoldFont);
- id_label->SetFontList(base_font_list);
-
- // For IMEs whose short name are more than 2 characters (INTL, EXTD, etc.),
- // |kMenuIconSize| is not enough. The label will trigger eliding as "I..."
- // or "...". So we shrink the font size until it fits within the bounds.
- int size_delta = -1;
- while ((id_label->GetPreferredSize().width() -
- id_label->GetInsets().width()) > kMenuIconSize &&
- size_delta >= kMinFontSizeDelta) {
- id_label->SetFontList(base_font_list.DeriveWithSizeDelta(size_delta));
- --size_delta;
- }
- tri_view->AddView(TriView::Container::START, id_label);
-
- // The label shows the IME name.
- auto* label_view = TrayPopupUtils::CreateDefaultLabel();
- label_view->SetText(label);
- TrayPopupItemStyle style(
- TrayPopupItemStyle::FontStyle::DETAILED_VIEW_LABEL);
- style.SetupLabel(label_view);
-
- label_view->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- tri_view->AddView(TriView::Container::CENTER, label_view);
-
- if (selected) {
- // The checked button indicates the IME is selected.
- views::ImageView* checked_image = TrayPopupUtils::CreateMainImageView();
- checked_image->SetImage(gfx::CreateVectorIcon(
- gfx::VectorIconId::CHECK_CIRCLE, kMenuIconSize, button_color));
- tri_view->AddView(TriView::Container::END, checked_image);
- }
- SetAccessibleName(label_view->text());
- }
-
- ~ImeListItemView() override {}
-
- // ActionableView:
- bool PerformAction(const ui::Event& event) override {
- if (ime_list_view_->should_focus_ime_after_selection_with_keyboard() &&
- event.type() == ui::EventType::ET_KEY_PRESSED) {
- ime_list_view_->set_last_item_selected_with_keyboard(true);
- } else {
- ime_list_view_->set_last_item_selected_with_keyboard(false);
- }
-
- ime_list_view_->HandleViewClicked(this);
- return true;
- }
-
- void OnFocus() override {
- ActionableView::OnFocus();
- if (ime_list_view_ && ime_list_view_->scroll_content())
- ime_list_view_->scroll_content()->ScrollRectToVisible(bounds());
- }
-
- void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
- ActionableView::GetAccessibleNodeData(node_data);
- node_data->role = ui::AX_ROLE_CHECK_BOX;
- node_data->AddStateFlag(selected_ ? ui::AX_STATE_CHECKED
- : ui::AX_STATE_NONE);
- }
-
- private:
- ImeListView* ime_list_view_;
- bool selected_;
-
- DISALLOW_COPY_AND_ASSIGN(ImeListItemView);
-};
-
-} // namespace
-
-// The view that contains a |KeyboardButtonView| and a toggle button.
-class MaterialKeyboardStatusRowView : public views::View {
- public:
- MaterialKeyboardStatusRowView(views::ButtonListener* listener, bool enabled)
- : listener_(listener), toggle_(nullptr) {
- Init();
- toggle_->SetIsOn(enabled, false);
- }
-
- ~MaterialKeyboardStatusRowView() override {}
-
- views::Button* toggle() const { return toggle_; }
- bool is_toggled() const { return toggle_->is_on(); }
-
- protected:
- // views::View:
- int GetHeightForWidth(int w) const override {
- return GetPreferredSize().height();
- }
-
- private:
- void Init() {
- TrayPopupUtils::ConfigureAsStickyHeader(this);
- SetLayoutManager(new views::FillLayout);
-
- TriView* tri_view = TrayPopupUtils::CreateDefaultRowView();
- AddChildView(tri_view);
-
- // The on-screen keyboard image button.
- views::ImageView* keyboard_image = TrayPopupUtils::CreateMainImageView();
- keyboard_image->SetImage(gfx::CreateVectorIcon(
- kImeMenuOnScreenKeyboardIcon, kMenuIconSize, kMenuIconColor));
- tri_view->AddView(TriView::Container::START, keyboard_image);
-
- // The on-screen keyboard label ('On-screen keyboard').
- auto* label = TrayPopupUtils::CreateDefaultLabel();
- label->SetText(ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
- IDS_ASH_STATUS_TRAY_ACCESSIBILITY_VIRTUAL_KEYBOARD));
- TrayPopupItemStyle style(
- TrayPopupItemStyle::FontStyle::DETAILED_VIEW_LABEL);
- style.SetupLabel(label);
- tri_view->AddView(TriView::Container::CENTER, label);
-
- // The on-screen keyboard toggle button.
- toggle_ = TrayPopupUtils::CreateToggleButton(
- listener_, IDS_ASH_STATUS_TRAY_ACCESSIBILITY_VIRTUAL_KEYBOARD);
- tri_view->AddView(TriView::Container::END, toggle_);
- }
-
- // ButtonListener to notify when |toggle_| is clicked.
- views::ButtonListener* listener_;
-
- // ToggleButton to toggle keyboard on or off.
- views::ToggleButton* toggle_;
-
- DISALLOW_COPY_AND_ASSIGN(MaterialKeyboardStatusRowView);
-};
-
-ImeListView::ImeListView(SystemTrayItem* owner)
- : TrayDetailsView(owner),
- last_item_selected_with_keyboard_(false),
- should_focus_ime_after_selection_with_keyboard_(false),
- current_ime_view_(nullptr) {}
-
-ImeListView::~ImeListView() {}
-
-void ImeListView::Init(bool show_keyboard_toggle,
- SingleImeBehavior single_ime_behavior) {
- SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
- IMEInfoList list;
- delegate->GetAvailableIMEList(&list);
- IMEPropertyInfoList property_list;
- delegate->GetCurrentIMEProperties(&property_list);
- Update(list, property_list, show_keyboard_toggle, single_ime_behavior);
-}
-
-void ImeListView::Update(const IMEInfoList& list,
- const IMEPropertyInfoList& property_list,
- bool show_keyboard_toggle,
- SingleImeBehavior single_ime_behavior) {
- ResetImeListView();
- ime_map_.clear();
- property_map_.clear();
- CreateScrollableList();
-
- // Appends IME list and IME properties.
- if (single_ime_behavior == ImeListView::SHOW_SINGLE_IME || list.size() > 1) {
- if (MaterialDesignController::IsSystemTrayMenuMaterial()) {
- AppendImeListAndProperties(list, property_list);
- } else {
- AppendIMEList(list);
- if (!property_list.empty())
- AppendIMEProperties(property_list);
- }
- }
-
- if (show_keyboard_toggle) {
- if (MaterialDesignController::IsSystemTrayMenuMaterial()) {
- PrependMaterialKeyboardStatus();
- } else {
- if (list.size() > 1 || !property_list.empty())
- AddScrollSeparator();
- AppendKeyboardStatus();
- }
- }
-
- Layout();
- SchedulePaint();
-
- if (should_focus_ime_after_selection_with_keyboard_ &&
- last_item_selected_with_keyboard_) {
- FocusCurrentImeIfNeeded();
- } else if (current_ime_view_) {
- scroll_content()->ScrollRectToVisible(current_ime_view_->bounds());
- }
-}
-
-void ImeListView::ResetImeListView() {
- // Children are removed from the view hierarchy and deleted in Reset().
- Reset();
- material_keyboard_status_view_ = nullptr;
- keyboard_status_ = nullptr;
- current_ime_view_ = nullptr;
-}
-
-void ImeListView::CloseImeListView() {
- last_selected_item_id_.clear();
- current_ime_view_ = nullptr;
- last_item_selected_with_keyboard_ = false;
- GetWidget()->Close();
-}
-
-void ImeListView::AppendIMEList(const IMEInfoList& list) {
- DCHECK(ime_map_.empty());
- for (size_t i = 0; i < list.size(); i++) {
- HoverHighlightView* container =
- new SelectableHoverHighlightView(this, list[i].name, list[i].selected);
- scroll_content()->AddChildView(container);
- ime_map_[container] = list[i].id;
- }
-}
-
-void ImeListView::AppendIMEProperties(
- const IMEPropertyInfoList& property_list) {
- DCHECK(property_map_.empty());
- for (size_t i = 0; i < property_list.size(); i++) {
- HoverHighlightView* container = new SelectableHoverHighlightView(
- this, property_list[i].name, property_list[i].selected);
- if (i == 0)
- container->SetBorder(
- views::CreateSolidSidedBorder(1, 0, 0, 0, kBorderLightColor));
- scroll_content()->AddChildView(container);
- property_map_[container] = property_list[i].key;
- }
-}
-
-void ImeListView::AppendImeListAndProperties(
- const IMEInfoList& list,
- const IMEPropertyInfoList& property_list) {
- DCHECK(ime_map_.empty());
- for (size_t i = 0; i < list.size(); i++) {
- views::View* ime_view =
- new ImeListItemView(owner(), this, list[i].short_name, list[i].name,
- list[i].selected, gfx::kGoogleGreen700);
- scroll_content()->AddChildView(ime_view);
- ime_map_[ime_view] = list[i].id;
-
- if (list[i].selected)
- current_ime_view_ = ime_view;
-
- // In material design, the property items will be added after the current
- // selected IME item.
- if (list[i].selected && !property_list.empty()) {
- // Adds a separator on the top of property items.
- scroll_content()->AddChildView(
- TrayPopupUtils::CreateListItemSeparator(true));
-
- // Adds the property items.
- for (size_t i = 0; i < property_list.size(); i++) {
- ImeListItemView* property_view = new ImeListItemView(
- owner(), this, base::string16(), property_list[i].name,
- property_list[i].selected, kMenuIconColor);
- scroll_content()->AddChildView(property_view);
- property_map_[property_view] = property_list[i].key;
- }
-
- // Adds a separator on the bottom of property items if there are still
- // other IMEs under the current one.
- if (i < list.size() - 1)
- scroll_content()->AddChildView(
- TrayPopupUtils::CreateListItemSeparator(true));
- }
- }
-}
-
-void ImeListView::AppendKeyboardStatus() {
- DCHECK(!MaterialDesignController::IsSystemTrayMenuMaterial());
- HoverHighlightView* container = new HoverHighlightView(this);
- int id = keyboard::IsKeyboardEnabled() ? IDS_ASH_STATUS_TRAY_DISABLE_KEYBOARD
- : IDS_ASH_STATUS_TRAY_ENABLE_KEYBOARD;
- container->AddLabel(
- ui::ResourceBundle::GetSharedInstance().GetLocalizedString(id),
- gfx::ALIGN_LEFT, false /* highlight */);
- scroll_content()->AddChildView(container);
- keyboard_status_ = container;
-}
-
-void ImeListView::PrependMaterialKeyboardStatus() {
- DCHECK(MaterialDesignController::IsSystemTrayMenuMaterial());
- DCHECK(!material_keyboard_status_view_);
- MaterialKeyboardStatusRowView* view =
- new MaterialKeyboardStatusRowView(this, keyboard::IsKeyboardEnabled());
- scroll_content()->AddChildViewAt(view, 0);
- material_keyboard_status_view_ = view;
-}
-
-void ImeListView::HandleViewClicked(views::View* view) {
- if (view == keyboard_status_) {
- WmShell::Get()->ToggleIgnoreExternalKeyboard();
- last_selected_item_id_.clear();
- last_item_selected_with_keyboard_ = false;
- return;
- }
-
- SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
- std::map<views::View*, std::string>::const_iterator ime = ime_map_.find(view);
- if (ime != ime_map_.end()) {
- WmShell::Get()->RecordUserMetricsAction(UMA_STATUS_AREA_IME_SWITCH_MODE);
- std::string ime_id = ime->second;
- last_selected_item_id_ = ime_id;
- delegate->SwitchIME(ime_id);
- } else {
- std::map<views::View*, std::string>::const_iterator property =
- property_map_.find(view);
- if (property == property_map_.end())
- return;
- const std::string key = property->second;
- last_selected_item_id_ = key;
- delegate->ActivateIMEProperty(key);
- }
-
- if (!should_focus_ime_after_selection_with_keyboard_ ||
- !last_item_selected_with_keyboard_) {
- CloseImeListView();
- }
-}
-
-void ImeListView::HandleButtonPressed(views::Button* sender,
- const ui::Event& event) {
- if (material_keyboard_status_view_ &&
- sender == material_keyboard_status_view_->toggle()) {
- WmShell::Get()->ToggleIgnoreExternalKeyboard();
- last_selected_item_id_.clear();
- last_item_selected_with_keyboard_ = false;
- }
-}
-
-void ImeListView::VisibilityChanged(View* starting_from, bool is_visible) {
- if (!is_visible || (should_focus_ime_after_selection_with_keyboard_ &&
- last_item_selected_with_keyboard_) ||
- !current_ime_view_) {
- return;
- }
-
- scroll_content()->ScrollRectToVisible(current_ime_view_->bounds());
-}
-
-void ImeListView::FocusCurrentImeIfNeeded() {
- views::FocusManager* manager = GetFocusManager();
- if (!manager || manager->GetFocusedView() || last_selected_item_id_.empty())
- return;
-
- for (auto ime_map : ime_map_) {
- if (ime_map.second == last_selected_item_id_) {
- (ime_map.first)->RequestFocus();
- return;
- }
- }
-
- for (auto property_map : property_map_) {
- if (property_map.second == last_selected_item_id_) {
- (property_map.first)->RequestFocus();
- return;
- }
- }
-}
-
-ImeListViewTestApi::ImeListViewTestApi(ImeListView* ime_list_view)
- : ime_list_view_(ime_list_view) {}
-
-ImeListViewTestApi::~ImeListViewTestApi() {}
-
-views::View* ImeListViewTestApi::GetToggleView() const {
- return ime_list_view_->material_keyboard_status_view_->toggle();
-}
-
-} // namespace ash
« no previous file with comments | « ash/common/system/chromeos/ime_menu/ime_list_view.h ('k') | ash/common/system/chromeos/ime_menu/ime_menu_tray.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698