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

Unified Diff: chrome/browser/ui/views/website_settings/permission_selector_row.cc

Issue 2744933002: Move Views Page Info UI code to its own folder. (Closed)
Patch Set: *shakes other fist at mass-rename.py* Created 3 years, 9 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: chrome/browser/ui/views/website_settings/permission_selector_row.cc
diff --git a/chrome/browser/ui/views/website_settings/permission_selector_row.cc b/chrome/browser/ui/views/website_settings/permission_selector_row.cc
deleted file mode 100644
index 8efa73854e11dc7eaff9c6cac61e09d9f7e5477d..0000000000000000000000000000000000000000
--- a/chrome/browser/ui/views/website_settings/permission_selector_row.cc
+++ /dev/null
@@ -1,351 +0,0 @@
-// Copyright (c) 2012 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 "chrome/browser/ui/views/website_settings/permission_selector_row.h"
-
-#include "base/i18n/rtl.h"
-#include "base/macros.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/ui/page_info/permission_menu_model.h"
-#include "chrome/browser/ui/page_info/website_settings_ui.h"
-#include "chrome/browser/ui/views/website_settings/non_accessible_image_view.h"
-#include "chrome/browser/ui/views/website_settings/website_settings_popup_view.h"
-#include "chrome/grit/generated_resources.h"
-#include "ui/accessibility/ax_node_data.h"
-#include "ui/base/material_design/material_design_controller.h"
-#include "ui/base/models/combobox_model.h"
-#include "ui/gfx/image/image.h"
-#include "ui/views/controls/button/menu_button.h"
-#include "ui/views/controls/combobox/combobox.h"
-#include "ui/views/controls/combobox/combobox_listener.h"
-#include "ui/views/controls/image_view.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/controls/menu/menu_runner.h"
-#include "ui/views/layout/grid_layout.h"
-#include "ui/views/view.h"
-#include "ui/views/widget/widget.h"
-
-namespace internal {
-
-// The |PermissionMenuButton| provides a menu for selecting a setting a
-// permissions type.
-class PermissionMenuButton : public views::MenuButton,
- public views::MenuButtonListener {
- public:
- // Creates a new |PermissionMenuButton| with the passed |text|. The ownership
- // of the |model| remains with the caller and is not transfered to the
- // |PermissionMenuButton|. If the |show_menu_marker| flag is true, then a
- // small icon is be displayed next to the button |text|, indicating that the
- // button opens a drop down menu.
- PermissionMenuButton(const base::string16& text,
- PermissionMenuModel* model,
- bool show_menu_marker);
- ~PermissionMenuButton() override;
-
- // Overridden from views::View.
- void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
- void OnNativeThemeChanged(const ui::NativeTheme* theme) override;
-
- private:
- // Overridden from views::MenuButtonListener.
- void OnMenuButtonClicked(views::MenuButton* source,
- const gfx::Point& point,
- const ui::Event* event) override;
-
- PermissionMenuModel* menu_model_; // Owned by |PermissionSelectorRow|.
- std::unique_ptr<views::MenuRunner> menu_runner_;
-
- bool is_rtl_display_;
-
- DISALLOW_COPY_AND_ASSIGN(PermissionMenuButton);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// PermissionMenuButton
-///////////////////////////////////////////////////////////////////////////////
-
-PermissionMenuButton::PermissionMenuButton(const base::string16& text,
- PermissionMenuModel* model,
- bool show_menu_marker)
- : MenuButton(text, this, show_menu_marker), menu_model_(model) {
- // Since PermissionMenuButtons are added to a GridLayout, they are not always
- // sized to their preferred size. Disclosure arrows are always right-aligned,
- // so if the text is not right-aligned, awkward space appears between the text
- // and the arrow.
- SetHorizontalAlignment(gfx::ALIGN_RIGHT);
-
- // Update the themed border before the NativeTheme is applied. Usually this
- // happens in a call to LabelButton::OnNativeThemeChanged(). However, if
- // PermissionMenuButton called that from its override, the NativeTheme would
- // be available, and the button would get native GTK styling on Linux.
- UpdateThemedBorder();
-
- SetFocusForPlatform();
- set_request_focus_on_press(true);
- is_rtl_display_ =
- base::i18n::RIGHT_TO_LEFT == base::i18n::GetStringDirection(text);
-}
-
-PermissionMenuButton::~PermissionMenuButton() {
-}
-
-void PermissionMenuButton::GetAccessibleNodeData(ui::AXNodeData* node_data) {
- MenuButton::GetAccessibleNodeData(node_data);
- node_data->SetValue(GetText());
-}
-
-void PermissionMenuButton::OnNativeThemeChanged(const ui::NativeTheme* theme) {
- SetTextColor(views::Button::STATE_NORMAL, theme->GetSystemColor(
- ui::NativeTheme::kColorId_LabelEnabledColor));
- SetTextColor(views::Button::STATE_HOVERED, theme->GetSystemColor(
- ui::NativeTheme::kColorId_LabelEnabledColor));
- SetTextColor(views::Button::STATE_DISABLED, theme->GetSystemColor(
- ui::NativeTheme::kColorId_LabelDisabledColor));
-}
-
-void PermissionMenuButton::OnMenuButtonClicked(views::MenuButton* source,
- const gfx::Point& point,
- const ui::Event* event) {
- menu_runner_.reset(new views::MenuRunner(
- menu_model_,
- views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::ASYNC));
-
- gfx::Point p(point);
- p.Offset(is_rtl_display_ ? source->width() : -source->width(), 0);
- menu_runner_->RunMenuAt(source->GetWidget()->GetTopLevelWidget(), this,
- gfx::Rect(p, gfx::Size()), views::MENU_ANCHOR_TOPLEFT,
- ui::MENU_SOURCE_NONE);
-}
-
-// This class adapts a |PermissionMenuModel| into a |ui::ComboboxModel| so that
-// |PermissionCombobox| can use it.
-class ComboboxModelAdapter : public ui::ComboboxModel {
- public:
- explicit ComboboxModelAdapter(PermissionMenuModel* model) : model_(model) {}
- ~ComboboxModelAdapter() override {}
-
- void OnPerformAction(int index);
-
- // Returns the checked index of the underlying PermissionMenuModel, of which
- // there must be exactly one. This is used to choose which index is selected
- // in the PermissionCombobox.
- int GetCheckedIndex();
-
- // ui::ComboboxModel:
- int GetItemCount() const override;
- base::string16 GetItemAt(int index) override;
-
- private:
- PermissionMenuModel* model_;
-};
-
-void ComboboxModelAdapter::OnPerformAction(int index) {
- model_->ExecuteCommand(index, 0);
-}
-
-int ComboboxModelAdapter::GetCheckedIndex() {
- int checked_index = -1;
- for (int i = 0; i < model_->GetItemCount(); ++i) {
- if (model_->IsCommandIdChecked(i)) {
- // This function keeps track of |checked_index| instead of returning early
- // here so that it can DCHECK that there's exactly one selected item,
- // which is not normally guaranteed by MenuModel, but *is* true of
- // PermissionMenuModel.
- DCHECK_EQ(checked_index, -1);
- checked_index = i;
- }
- }
- return checked_index;
-}
-
-int ComboboxModelAdapter::GetItemCount() const {
- DCHECK(model_);
- return model_->GetItemCount();
-}
-
-base::string16 ComboboxModelAdapter::GetItemAt(int index) {
- return model_->GetLabelAt(index);
-}
-
-// The |PermissionCombobox| provides a combobox for selecting a permission type.
-// This is only used on platforms where the permission dialog uses a combobox
-// instead of a MenuButton (currently, Mac).
-class PermissionCombobox : public views::Combobox,
- public views::ComboboxListener {
- public:
- PermissionCombobox(ComboboxModelAdapter* model,
- bool enabled,
- bool use_default);
- ~PermissionCombobox() override;
-
- void UpdateSelectedIndex(bool use_default);
-
- private:
- // views::Combobox:
- void OnPaintBorder(gfx::Canvas* canvas) override;
-
- // views::ComboboxListener:
- void OnPerformAction(Combobox* combobox) override;
-
- ComboboxModelAdapter* model_;
-};
-
-PermissionCombobox::PermissionCombobox(ComboboxModelAdapter* model,
- bool enabled,
- bool use_default)
- : views::Combobox(model), model_(model) {
- set_listener(this);
- SetEnabled(enabled);
- UpdateSelectedIndex(use_default);
- if (ui::MaterialDesignController::IsSecondaryUiMaterial()) {
- set_size_to_largest_label(false);
- ModelChanged();
- }
-}
-
-PermissionCombobox::~PermissionCombobox() {}
-
-void PermissionCombobox::UpdateSelectedIndex(bool use_default) {
- int index = model_->GetCheckedIndex();
- if (use_default && index == -1)
- index = 0;
- SetSelectedIndex(index);
-}
-
-void PermissionCombobox::OnPaintBorder(gfx::Canvas* canvas) {
- // No border except a focus indicator for MD mode.
- if (ui::MaterialDesignController::IsSecondaryUiMaterial() && !HasFocus())
- return;
- Combobox::OnPaintBorder(canvas);
-}
-
-void PermissionCombobox::OnPerformAction(Combobox* combobox) {
- model_->OnPerformAction(combobox->selected_index());
-}
-
-} // namespace internal
-
-///////////////////////////////////////////////////////////////////////////////
-// PermissionSelectorRow
-///////////////////////////////////////////////////////////////////////////////
-
-PermissionSelectorRow::PermissionSelectorRow(
- Profile* profile,
- const GURL& url,
- const WebsiteSettingsUI::PermissionInfo& permission,
- views::GridLayout* layout)
- : profile_(profile), icon_(NULL), menu_button_(NULL), combobox_(NULL) {
- // Create the permission icon.
- icon_ = new NonAccessibleImageView();
- const gfx::Image& image = WebsiteSettingsUI::GetPermissionIcon(permission);
- icon_->SetImage(image.ToImageSkia());
- layout->AddView(icon_, 1, 1, views::GridLayout::CENTER,
- views::GridLayout::CENTER);
- // Create the label that displays the permission type.
- label_ = new views::Label(
- WebsiteSettingsUI::PermissionTypeToUIString(permission.type));
- layout->AddView(label_, 1, 1, views::GridLayout::LEADING,
- views::GridLayout::CENTER);
- // Create the menu model.
- menu_model_.reset(new PermissionMenuModel(
- profile, url, permission,
- base::Bind(&PermissionSelectorRow::PermissionChanged,
- base::Unretained(this))));
-
- // Create the permission menu button.
-#if defined(OS_MACOSX)
- bool use_real_combobox = true;
-#else
- bool use_real_combobox =
- ui::MaterialDesignController::IsSecondaryUiMaterial();
-#endif
- if (use_real_combobox)
- InitializeComboboxView(layout, permission);
- else
- InitializeMenuButtonView(layout, permission);
-}
-
-void PermissionSelectorRow::AddObserver(
- PermissionSelectorRowObserver* observer) {
- observer_list_.AddObserver(observer);
-}
-
-PermissionSelectorRow::~PermissionSelectorRow() {
- // Gross. On paper the Combobox and the ComboboxModelAdapter are both owned by
- // this class, but actually, the Combobox is owned by View and will be
- // destroyed in ~View(), which runs *after* ~PermissionSelectorRow() is done,
- // which means the Combobox gets destroyed after its ComboboxModel, which
- // causes an explosion when the Combobox attempts to stop observing the
- // ComboboxModel. This hack ensures the Combobox is deleted before its
- // ComboboxModel.
- //
- // Technically, the MenuButton has the same problem, but MenuButton doesn't
- // use its model in its destructor.
- if (combobox_)
- combobox_->parent()->RemoveChildView(combobox_);
-}
-
-void PermissionSelectorRow::InitializeMenuButtonView(
- views::GridLayout* layout,
- const WebsiteSettingsUI::PermissionInfo& permission) {
- bool button_enabled =
- permission.source == content_settings::SETTING_SOURCE_USER;
- menu_button_ = new internal::PermissionMenuButton(
- WebsiteSettingsUI::PermissionActionToUIString(
- profile_, permission.type, permission.setting,
- permission.default_setting, permission.source),
- menu_model_.get(), button_enabled);
- menu_button_->SetEnabled(button_enabled);
- menu_button_->SetAccessibleName(
- WebsiteSettingsUI::PermissionTypeToUIString(permission.type));
- layout->AddView(menu_button_);
-}
-
-void PermissionSelectorRow::InitializeComboboxView(
- views::GridLayout* layout,
- const WebsiteSettingsUI::PermissionInfo& permission) {
- bool button_enabled =
- permission.source == content_settings::SETTING_SOURCE_USER;
- combobox_model_adapter_.reset(
- new internal::ComboboxModelAdapter(menu_model_.get()));
- combobox_ = new internal::PermissionCombobox(
- combobox_model_adapter_.get(), button_enabled, true);
- combobox_->SetEnabled(button_enabled);
- combobox_->SetAccessibleName(
- WebsiteSettingsUI::PermissionTypeToUIString(permission.type));
- layout->AddView(combobox_);
-}
-
-void PermissionSelectorRow::PermissionChanged(
- const WebsiteSettingsUI::PermissionInfo& permission) {
- // Change the permission icon to reflect the selected setting.
- const gfx::Image& image = WebsiteSettingsUI::GetPermissionIcon(permission);
- icon_->SetImage(image.ToImageSkia());
-
- // Update the menu button text to reflect the new setting.
- if (menu_button_) {
- menu_button_->SetText(WebsiteSettingsUI::PermissionActionToUIString(
- profile_, permission.type, permission.setting,
- permission.default_setting, content_settings::SETTING_SOURCE_USER));
- menu_button_->SizeToPreferredSize();
- // Re-layout will be done at the |WebsiteSettingsPopupView| level, since
- // that view may need to resize itself to accomodate the new sizes of its
- // contents.
- menu_button_->InvalidateLayout();
- } else if (combobox_) {
- bool use_default = permission.setting == CONTENT_SETTING_DEFAULT;
- combobox_->UpdateSelectedIndex(use_default);
- }
-
- for (PermissionSelectorRowObserver& observer : observer_list_)
- observer.OnPermissionChanged(permission);
-}
-
-views::View* PermissionSelectorRow::button() {
- // These casts are required because the two arms of a ?: cannot have different
- // types T1 and T2, even if the resulting value of the ?: is about to be a T
- // and T1 and T2 are both subtypes of T.
- return menu_button_ ? static_cast<views::View*>(menu_button_)
- : static_cast<views::View*>(combobox_);
-}

Powered by Google App Engine
This is Rietveld 408576698