Index: ash/common/shelf/overflow_bubble_view.cc |
diff --git a/ash/common/shelf/overflow_bubble_view.cc b/ash/common/shelf/overflow_bubble_view.cc |
deleted file mode 100644 |
index ebee64e1fe6e3a81d5877bbc3fa14c2cfee3f3ac..0000000000000000000000000000000000000000 |
--- a/ash/common/shelf/overflow_bubble_view.cc |
+++ /dev/null |
@@ -1,228 +0,0 @@ |
-// Copyright 2013 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/shelf/overflow_bubble_view.h" |
- |
-#include <algorithm> |
- |
-#include "ash/common/shelf/shelf_constants.h" |
-#include "ash/common/shelf/wm_shelf.h" |
-#include "ash/common/wm_window.h" |
-#include "ash/public/cpp/shell_window_ids.h" |
-#include "ash/root_window_controller.h" |
-#include "ui/display/display.h" |
-#include "ui/display/screen.h" |
-#include "ui/events/event.h" |
-#include "ui/gfx/geometry/insets.h" |
-#include "ui/views/bubble/bubble_frame_view.h" |
-#include "ui/views/view.h" |
-#include "ui/views/widget/widget.h" |
- |
-namespace ash { |
-namespace { |
- |
-// Max bubble size to screen size ratio. |
-const float kMaxBubbleSizeToScreenRatio = 0.5f; |
- |
-// Inner padding in pixels for shelf view inside bubble. |
-const int kPadding = 2; |
- |
-// Padding space in pixels between ShelfView's left/top edge to its contents. |
-const int kShelfViewLeadingInset = 8; |
- |
-} // namespace |
- |
-OverflowBubbleView::OverflowBubbleView(WmShelf* wm_shelf) |
- : wm_shelf_(wm_shelf), shelf_view_(nullptr) { |
- DCHECK(wm_shelf_); |
-} |
- |
-OverflowBubbleView::~OverflowBubbleView() {} |
- |
-void OverflowBubbleView::InitOverflowBubble(views::View* anchor, |
- views::View* shelf_view) { |
- shelf_view_ = shelf_view; |
- |
- SetAnchorView(anchor); |
- set_arrow(GetBubbleArrow()); |
- set_mirror_arrow_in_rtl(false); |
- set_background(nullptr); |
- set_color(kShelfDefaultBaseColor); |
- set_margins(gfx::Insets(kPadding, kPadding, kPadding, kPadding)); |
- // Overflow bubble should not get focus. If it get focus when it is shown, |
- // active state item is changed to running state. |
- set_can_activate(false); |
- |
- // Makes bubble view has a layer and clip its children layers. |
- SetPaintToLayer(); |
- layer()->SetFillsBoundsOpaquely(false); |
- layer()->SetMasksToBounds(true); |
- |
- // Calls into OnBeforeBubbleWidgetInit to set the window parent container. |
- views::BubbleDialogDelegateView::CreateBubble(this); |
- AddChildView(shelf_view_); |
-} |
- |
-const gfx::Size OverflowBubbleView::GetContentsSize() const { |
- return shelf_view_->GetPreferredSize(); |
-} |
- |
-// Gets arrow location based on shelf alignment. |
-views::BubbleBorder::Arrow OverflowBubbleView::GetBubbleArrow() const { |
- switch (wm_shelf_->GetAlignment()) { |
- case SHELF_ALIGNMENT_BOTTOM: |
- case SHELF_ALIGNMENT_BOTTOM_LOCKED: |
- return views::BubbleBorder::BOTTOM_LEFT; |
- case SHELF_ALIGNMENT_LEFT: |
- return views::BubbleBorder::LEFT_TOP; |
- case SHELF_ALIGNMENT_RIGHT: |
- return views::BubbleBorder::RIGHT_TOP; |
- } |
- NOTREACHED(); |
- return views::BubbleBorder::NONE; |
-} |
- |
-void OverflowBubbleView::ScrollByXOffset(int x_offset) { |
- const gfx::Rect visible_bounds(GetContentsBounds()); |
- const gfx::Size contents_size(GetContentsSize()); |
- |
- DCHECK_GE(contents_size.width(), visible_bounds.width()); |
- int x = std::min(contents_size.width() - visible_bounds.width(), |
- std::max(0, scroll_offset_.x() + x_offset)); |
- scroll_offset_.set_x(x); |
-} |
- |
-void OverflowBubbleView::ScrollByYOffset(int y_offset) { |
- const gfx::Rect visible_bounds(GetContentsBounds()); |
- const gfx::Size contents_size(GetContentsSize()); |
- |
- DCHECK_GE(contents_size.width(), visible_bounds.width()); |
- int y = std::min(contents_size.height() - visible_bounds.height(), |
- std::max(0, scroll_offset_.y() + y_offset)); |
- scroll_offset_.set_y(y); |
-} |
- |
-gfx::Size OverflowBubbleView::GetPreferredSize() const { |
- gfx::Size preferred_size = GetContentsSize(); |
- |
- const gfx::Rect monitor_rect = |
- display::Screen::GetScreen() |
- ->GetDisplayNearestPoint(GetAnchorRect().CenterPoint()) |
- .work_area(); |
- if (!monitor_rect.IsEmpty()) { |
- if (wm_shelf_->IsHorizontalAlignment()) { |
- preferred_size.set_width( |
- std::min(preferred_size.width(), |
- static_cast<int>(monitor_rect.width() * |
- kMaxBubbleSizeToScreenRatio))); |
- } else { |
- preferred_size.set_height( |
- std::min(preferred_size.height(), |
- static_cast<int>(monitor_rect.height() * |
- kMaxBubbleSizeToScreenRatio))); |
- } |
- } |
- |
- return preferred_size; |
-} |
- |
-void OverflowBubbleView::Layout() { |
- shelf_view_->SetBoundsRect(gfx::Rect( |
- gfx::PointAtOffsetFromOrigin(-scroll_offset_), GetContentsSize())); |
-} |
- |
-void OverflowBubbleView::ChildPreferredSizeChanged(views::View* child) { |
- // When contents size is changed, ContentsBounds should be updated before |
- // calculating scroll offset. |
- SizeToContents(); |
- |
- // Ensures |shelf_view_| is still visible. |
- if (wm_shelf_->IsHorizontalAlignment()) |
- ScrollByXOffset(0); |
- else |
- ScrollByYOffset(0); |
- Layout(); |
-} |
- |
-bool OverflowBubbleView::OnMouseWheel(const ui::MouseWheelEvent& event) { |
- // The MouseWheelEvent was changed to support both X and Y offsets |
- // recently, but the behavior of this function was retained to continue |
- // using Y offsets only. Might be good to simply scroll in both |
- // directions as in OverflowBubbleView::OnScrollEvent. |
- if (wm_shelf_->IsHorizontalAlignment()) |
- ScrollByXOffset(-event.y_offset()); |
- else |
- ScrollByYOffset(-event.y_offset()); |
- Layout(); |
- |
- return true; |
-} |
- |
-void OverflowBubbleView::OnScrollEvent(ui::ScrollEvent* event) { |
- ScrollByXOffset(-event->x_offset()); |
- ScrollByYOffset(-event->y_offset()); |
- Layout(); |
- event->SetHandled(); |
-} |
- |
-int OverflowBubbleView::GetDialogButtons() const { |
- return ui::DIALOG_BUTTON_NONE; |
-} |
- |
-void OverflowBubbleView::OnBeforeBubbleWidgetInit( |
- views::Widget::InitParams* params, |
- views::Widget* bubble_widget) const { |
- // Place the bubble in the same root window as the anchor. |
- WmWindow::Get(anchor_widget()->GetNativeWindow()) |
- ->GetRootWindowController() |
- ->ConfigureWidgetInitParamsForContainer( |
- bubble_widget, kShellWindowId_ShelfBubbleContainer, params); |
-} |
- |
-gfx::Rect OverflowBubbleView::GetBubbleBounds() { |
- views::BubbleBorder* border = GetBubbleFrameView()->bubble_border(); |
- gfx::Insets bubble_insets = border->GetInsets(); |
- |
- const int border_size = views::BubbleBorder::is_arrow_on_horizontal(arrow()) |
- ? bubble_insets.left() |
- : bubble_insets.top(); |
- const int arrow_offset = border_size + kPadding + kShelfViewLeadingInset + |
- GetShelfConstant(SHELF_SIZE) / 2; |
- |
- const gfx::Size content_size = GetPreferredSize(); |
- border->set_arrow_offset(arrow_offset); |
- |
- const gfx::Rect anchor_rect = GetAnchorRect(); |
- gfx::Rect bubble_rect = GetBubbleFrameView()->GetUpdatedWindowBounds( |
- anchor_rect, content_size, false); |
- |
- gfx::Rect monitor_rect = |
- display::Screen::GetScreen() |
- ->GetDisplayNearestPoint(anchor_rect.CenterPoint()) |
- .work_area(); |
- |
- int offset = 0; |
- if (views::BubbleBorder::is_arrow_on_horizontal(arrow())) { |
- if (bubble_rect.x() < monitor_rect.x()) |
- offset = monitor_rect.x() - bubble_rect.x(); |
- else if (bubble_rect.right() > monitor_rect.right()) |
- offset = monitor_rect.right() - bubble_rect.right(); |
- |
- bubble_rect.Offset(offset, 0); |
- border->set_arrow_offset(anchor_rect.CenterPoint().x() - bubble_rect.x()); |
- } else { |
- if (bubble_rect.y() < monitor_rect.y()) |
- offset = monitor_rect.y() - bubble_rect.y(); |
- else if (bubble_rect.bottom() > monitor_rect.bottom()) |
- offset = monitor_rect.bottom() - bubble_rect.bottom(); |
- |
- bubble_rect.Offset(0, offset); |
- border->set_arrow_offset(anchor_rect.CenterPoint().y() - bubble_rect.y()); |
- } |
- |
- GetBubbleFrameView()->SchedulePaint(); |
- return bubble_rect; |
-} |
- |
-} // namespace ash |