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

Unified Diff: ui/views/controls/menu/menu_scroll_view_container.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 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
« no previous file with comments | « ui/views/controls/menu/menu_scroll_view_container.h ('k') | ui/views/controls/menu/menu_separator.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/controls/menu/menu_scroll_view_container.cc
diff --git a/ui/views/controls/menu/menu_scroll_view_container.cc b/ui/views/controls/menu/menu_scroll_view_container.cc
deleted file mode 100644
index 2d3db74126ae32a37b33e27240ffcc3aec9cc843..0000000000000000000000000000000000000000
--- a/ui/views/controls/menu/menu_scroll_view_container.cc
+++ /dev/null
@@ -1,334 +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 "ui/views/controls/menu/menu_scroll_view_container.h"
-
-#include "third_party/skia/include/core/SkPaint.h"
-#include "third_party/skia/include/core/SkPath.h"
-#include "ui/accessibility/ax_view_state.h"
-#include "ui/gfx/canvas.h"
-#include "ui/native_theme/native_theme_aura.h"
-#include "ui/views/border.h"
-#include "ui/views/bubble/bubble_border.h"
-#include "ui/views/controls/menu/menu_config.h"
-#include "ui/views/controls/menu/menu_controller.h"
-#include "ui/views/controls/menu/menu_item_view.h"
-#include "ui/views/controls/menu/submenu_view.h"
-#include "ui/views/round_rect_painter.h"
-
-using ui::NativeTheme;
-
-namespace views {
-
-namespace {
-
-static const int kBorderPaddingDueToRoundedCorners = 1;
-
-// MenuScrollButton ------------------------------------------------------------
-
-// MenuScrollButton is used for the scroll buttons when not all menu items fit
-// on screen. MenuScrollButton forwards appropriate events to the
-// MenuController.
-
-class MenuScrollButton : public View {
- public:
- MenuScrollButton(SubmenuView* host, bool is_up)
- : host_(host),
- is_up_(is_up),
- // Make our height the same as that of other MenuItemViews.
- pref_height_(MenuItemView::pref_menu_height()) {
- }
-
- virtual gfx::Size GetPreferredSize() const override {
- return gfx::Size(
- host_->GetMenuItem()->GetMenuConfig().scroll_arrow_height * 2 - 1,
- pref_height_);
- }
-
- virtual bool CanDrop(const OSExchangeData& data) override {
- DCHECK(host_->GetMenuItem()->GetMenuController());
- return true; // Always return true so that drop events are targeted to us.
- }
-
- virtual void OnDragEntered(const ui::DropTargetEvent& event) override {
- DCHECK(host_->GetMenuItem()->GetMenuController());
- host_->GetMenuItem()->GetMenuController()->OnDragEnteredScrollButton(
- host_, is_up_);
- }
-
- virtual int OnDragUpdated(const ui::DropTargetEvent& event) override {
- return ui::DragDropTypes::DRAG_NONE;
- }
-
- virtual void OnDragExited() override {
- DCHECK(host_->GetMenuItem()->GetMenuController());
- host_->GetMenuItem()->GetMenuController()->OnDragExitedScrollButton(host_);
- }
-
- virtual int OnPerformDrop(const ui::DropTargetEvent& event) override {
- return ui::DragDropTypes::DRAG_NONE;
- }
-
- virtual void OnPaint(gfx::Canvas* canvas) override {
- const MenuConfig& config = host_->GetMenuItem()->GetMenuConfig();
-
- // The background.
- gfx::Rect item_bounds(0, 0, width(), height());
- NativeTheme::ExtraParams extra;
- extra.menu_item.is_selected = false;
- GetNativeTheme()->Paint(canvas->sk_canvas(),
- NativeTheme::kMenuItemBackground,
- NativeTheme::kNormal, item_bounds, extra);
-
- // Then the arrow.
- int x = width() / 2;
- int y = (height() - config.scroll_arrow_height) / 2;
-
- int x_left = x - config.scroll_arrow_height;
- int x_right = x + config.scroll_arrow_height;
- int y_bottom;
-
- if (!is_up_) {
- y_bottom = y;
- y = y_bottom + config.scroll_arrow_height;
- } else {
- y_bottom = y + config.scroll_arrow_height;
- }
- SkPath path;
- path.setFillType(SkPath::kWinding_FillType);
- path.moveTo(SkIntToScalar(x), SkIntToScalar(y));
- path.lineTo(SkIntToScalar(x_left), SkIntToScalar(y_bottom));
- path.lineTo(SkIntToScalar(x_right), SkIntToScalar(y_bottom));
- path.lineTo(SkIntToScalar(x), SkIntToScalar(y));
- SkPaint paint;
- paint.setStyle(SkPaint::kFill_Style);
- paint.setAntiAlias(true);
- paint.setColor(config.arrow_color);
- canvas->DrawPath(path, paint);
- }
-
- private:
- // SubmenuView we were created for.
- SubmenuView* host_;
-
- // Direction of the button.
- bool is_up_;
-
- // Preferred height.
- int pref_height_;
-
- DISALLOW_COPY_AND_ASSIGN(MenuScrollButton);
-};
-
-} // namespace
-
-// MenuScrollView --------------------------------------------------------------
-
-// MenuScrollView is a viewport for the SubmenuView. It's reason to exist is so
-// that ScrollRectToVisible works.
-//
-// NOTE: It is possible to use ScrollView directly (after making it deal with
-// null scrollbars), but clicking on a child of ScrollView forces the window to
-// become active, which we don't want. As we really only need a fraction of
-// what ScrollView does, so we use a one off variant.
-
-class MenuScrollViewContainer::MenuScrollView : public View {
- public:
- explicit MenuScrollView(View* child) {
- AddChildView(child);
- }
-
- virtual void ScrollRectToVisible(const gfx::Rect& rect) override {
- // NOTE: this assumes we only want to scroll in the y direction.
-
- // If the rect is already visible, do not scroll.
- if (GetLocalBounds().Contains(rect))
- return;
-
- // Scroll just enough so that the rect is visible.
- int dy = 0;
- if (rect.bottom() > GetLocalBounds().bottom())
- dy = rect.bottom() - GetLocalBounds().bottom();
- else
- dy = rect.y();
-
- // Convert rect.y() to view's coordinates and make sure we don't show past
- // the bottom of the view.
- View* child = GetContents();
- child->SetY(-std::max(0, std::min(
- child->GetPreferredSize().height() - this->height(),
- dy - child->y())));
- }
-
- // Returns the contents, which is the SubmenuView.
- View* GetContents() {
- return child_at(0);
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(MenuScrollView);
-};
-
-// MenuScrollViewContainer ----------------------------------------------------
-
-MenuScrollViewContainer::MenuScrollViewContainer(SubmenuView* content_view)
- : content_view_(content_view),
- arrow_(BubbleBorder::NONE),
- bubble_border_(NULL) {
- scroll_up_button_ = new MenuScrollButton(content_view, true);
- scroll_down_button_ = new MenuScrollButton(content_view, false);
- AddChildView(scroll_up_button_);
- AddChildView(scroll_down_button_);
-
- scroll_view_ = new MenuScrollView(content_view);
- AddChildView(scroll_view_);
-
- arrow_ = BubbleBorderTypeFromAnchor(
- content_view_->GetMenuItem()->GetMenuController()->GetAnchorPosition());
-
- if (arrow_ != BubbleBorder::NONE)
- CreateBubbleBorder();
- else
- CreateDefaultBorder();
-}
-
-bool MenuScrollViewContainer::HasBubbleBorder() {
- return arrow_ != BubbleBorder::NONE;
-}
-
-void MenuScrollViewContainer::SetBubbleArrowOffset(int offset) {
- DCHECK(HasBubbleBorder());
- bubble_border_->set_arrow_offset(offset);
-}
-
-void MenuScrollViewContainer::OnPaintBackground(gfx::Canvas* canvas) {
- if (background()) {
- View::OnPaintBackground(canvas);
- return;
- }
-
- gfx::Rect bounds(0, 0, width(), height());
- NativeTheme::ExtraParams extra;
- const MenuConfig& menu_config = content_view_->GetMenuItem()->GetMenuConfig();
- extra.menu_background.corner_radius = menu_config.corner_radius;
- GetNativeTheme()->Paint(canvas->sk_canvas(),
- NativeTheme::kMenuPopupBackground, NativeTheme::kNormal, bounds, extra);
-}
-
-void MenuScrollViewContainer::Layout() {
- gfx::Insets insets = GetInsets();
- int x = insets.left();
- int y = insets.top();
- int width = View::width() - insets.width();
- int content_height = height() - insets.height();
- if (!scroll_up_button_->visible()) {
- scroll_view_->SetBounds(x, y, width, content_height);
- scroll_view_->Layout();
- return;
- }
-
- gfx::Size pref = scroll_up_button_->GetPreferredSize();
- scroll_up_button_->SetBounds(x, y, width, pref.height());
- content_height -= pref.height();
-
- const int scroll_view_y = y + pref.height();
-
- pref = scroll_down_button_->GetPreferredSize();
- scroll_down_button_->SetBounds(x, height() - pref.height() - insets.top(),
- width, pref.height());
- content_height -= pref.height();
-
- scroll_view_->SetBounds(x, scroll_view_y, width, content_height);
- scroll_view_->Layout();
-}
-
-gfx::Size MenuScrollViewContainer::GetPreferredSize() const {
- gfx::Size prefsize = scroll_view_->GetContents()->GetPreferredSize();
- gfx::Insets insets = GetInsets();
- prefsize.Enlarge(insets.width(), insets.height());
- return prefsize;
-}
-
-void MenuScrollViewContainer::GetAccessibleState(
- ui::AXViewState* state) {
- // Get the name from the submenu view.
- content_view_->GetAccessibleState(state);
-
- // Now change the role.
- state->role = ui::AX_ROLE_MENU_BAR;
- // Some AT (like NVDA) will not process focus events on menu item children
- // unless a parent claims to be focused.
- state->AddStateFlag(ui::AX_STATE_FOCUSED);
-}
-
-void MenuScrollViewContainer::OnBoundsChanged(
- const gfx::Rect& previous_bounds) {
- gfx::Size content_pref = scroll_view_->GetContents()->GetPreferredSize();
- scroll_up_button_->SetVisible(content_pref.height() > height());
- scroll_down_button_->SetVisible(content_pref.height() > height());
- Layout();
-}
-
-void MenuScrollViewContainer::CreateDefaultBorder() {
- arrow_ = BubbleBorder::NONE;
- bubble_border_ = NULL;
-
- const MenuConfig& menu_config =
- content_view_->GetMenuItem()->GetMenuConfig();
-
- bool use_border = true;
- int padding = menu_config.corner_radius > 0 ?
- kBorderPaddingDueToRoundedCorners : 0;
-
-#if defined(USE_AURA) && !(defined(OS_LINUX) && !defined(OS_CHROMEOS))
- if (menu_config.native_theme == ui::NativeThemeAura::instance()) {
- // In case of NativeThemeAura the border gets drawn with the shadow.
- // Furthermore no additional padding is wanted.
- use_border = false;
- padding = 0;
- }
-#endif
-
- int top = menu_config.menu_vertical_border_size + padding;
- int left = menu_config.menu_horizontal_border_size + padding;
- int bottom = menu_config.menu_vertical_border_size + padding;
- int right = menu_config.menu_horizontal_border_size + padding;
-
- if (use_border) {
- SetBorder(views::Border::CreateBorderPainter(
- new views::RoundRectPainter(
- menu_config.native_theme->GetSystemColor(
- ui::NativeTheme::kColorId_MenuBorderColor),
- menu_config.corner_radius),
- gfx::Insets(top, left, bottom, right)));
- } else {
- SetBorder(Border::CreateEmptyBorder(top, left, bottom, right));
- }
-}
-
-void MenuScrollViewContainer::CreateBubbleBorder() {
- bubble_border_ = new BubbleBorder(arrow_,
- BubbleBorder::SMALL_SHADOW,
- SK_ColorWHITE);
- SetBorder(scoped_ptr<Border>(bubble_border_));
- set_background(new BubbleBackground(bubble_border_));
-}
-
-BubbleBorder::Arrow MenuScrollViewContainer::BubbleBorderTypeFromAnchor(
- MenuAnchorPosition anchor) {
- switch (anchor) {
- case MENU_ANCHOR_BUBBLE_LEFT:
- return BubbleBorder::RIGHT_CENTER;
- case MENU_ANCHOR_BUBBLE_RIGHT:
- return BubbleBorder::LEFT_CENTER;
- case MENU_ANCHOR_BUBBLE_ABOVE:
- return BubbleBorder::BOTTOM_CENTER;
- case MENU_ANCHOR_BUBBLE_BELOW:
- return BubbleBorder::TOP_CENTER;
- default:
- return BubbleBorder::NONE;
- }
-}
-
-} // namespace views
« no previous file with comments | « ui/views/controls/menu/menu_scroll_view_container.h ('k') | ui/views/controls/menu/menu_separator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698