Index: chrome/browser/chromeos/views/menu_locator.cc |
diff --git a/chrome/browser/chromeos/views/menu_locator.cc b/chrome/browser/chromeos/views/menu_locator.cc |
deleted file mode 100644 |
index 837a7ac4b53ed1d4ec859533d75a285ded489cdd..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/views/menu_locator.cc |
+++ /dev/null |
@@ -1,313 +0,0 @@ |
-// Copyright (c) 2011 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/chromeos/views/menu_locator.h" |
- |
-#include "base/i18n/rtl.h" |
-#include "base/logging.h" |
-#include "chrome/browser/chromeos/views/webui_menu_widget.h" |
-#include "ui/gfx/insets.h" |
-#include "ui/gfx/point.h" |
-#include "ui/gfx/rect.h" |
-#include "views/screen.h" |
-#include "views/widget/widget.h" |
- |
-namespace { |
- |
-using chromeos::WebUIMenuWidget; |
- |
-// Menu's corner radious. |
-const int kMenuCornerRadius = 0; // crosbug.com/7718. |
-const int kSubmenuOverlapPx = 1; |
- |
-gfx::Rect GetBoundsOf(const views::Widget* widget) { |
- return widget->GetClientAreaScreenBounds(); |
-} |
- |
-// Returns the Rect of the screen that contains the point (x, y). |
-gfx::Rect GetScreenRectAt(int x, int y) { |
- return views::Screen::GetMonitorAreaNearestPoint(gfx::Point(x, y)); |
-} |
- |
-// Returns adjusted height of the menu that fits to the screen's |
-// height, and enables scrolling if necessary. |
-int AdjustHeight(WebUIMenuWidget* widget, |
- int screen_height, |
- int height) { |
- // TODO(oshima): Locator needs a preferred size so that |
- // 1) we can tell height == screen_rect is the result of |
- // locator resizing it, or preferred size happens to be |
- // same hight of the screen (which is rare). |
- // 2) when the menu is moved to place where it has more space, it can |
- // hide the scrollbar again. (which won't happen on chromeos now) |
- if (height >= screen_height) { |
- widget->EnableScroll(true); |
- return screen_height; |
- } |
- widget->EnableScroll(false); |
- return height; |
-} |
- |
-// Updates the root menu's bounds to fit to the screen. |
-void UpdateRootMenuBounds(WebUIMenuWidget* widget, |
- const gfx::Point& origin, |
- const gfx::Size& size, |
- bool align_right) { |
- gfx::Rect screen_rect = GetScreenRectAt(origin.x(), origin.y()); |
- int width = std::min(screen_rect.width(), size.width()); |
- int height = AdjustHeight(widget, screen_rect.height(), size.height()); |
- |
- int x = align_right ? origin.x() - width : origin.x(); |
- int y = origin.y(); |
- if (x + width > screen_rect.right()) |
- x = screen_rect.right() - width; |
- if (y + height > screen_rect.bottom()) |
- y = screen_rect.bottom() - height; |
- widget->SetBounds(gfx::Rect(x, y, width, height)); |
-} |
- |
-// MenuLocator for dropdown menu. |
-class DropDownMenuLocator : public chromeos::MenuLocator { |
- public: |
- explicit DropDownMenuLocator(const gfx::Point& origin) |
- : origin_(origin) { |
- } |
- |
- private: |
- virtual SubmenuDirection GetSubmenuDirection() const { |
- return DEFAULT; |
- } |
- |
- virtual void Move(WebUIMenuWidget* widget) { |
- // TODO(oshima): |
- // Dropdown Menu has to be shown above the button, which is not currently |
- // possible with Menu2. I'll update Menu2 and this code |
- // after beta. |
- gfx::Rect bounds = widget->GetClientAreaScreenBounds(); |
- UpdateRootMenuBounds(widget, origin_, bounds.size(), !base::i18n::IsRTL()); |
- } |
- |
- virtual void SetBounds(WebUIMenuWidget* widget, const gfx::Size& size) { |
- gfx::Size new_size(size); |
- new_size.Enlarge(0, kMenuCornerRadius); |
- UpdateRootMenuBounds(widget, origin_, size, !base::i18n::IsRTL()); |
- } |
- |
- virtual void GetInsets(gfx::Insets* insets) const { |
- insets->Set(0, 0, kMenuCornerRadius, 0); |
- } |
- |
- virtual const SkScalar* GetCorners() const { |
- static const SkScalar corners[] = { |
- 0, 0, |
- 0, 0, |
- kMenuCornerRadius, kMenuCornerRadius, |
- kMenuCornerRadius, kMenuCornerRadius, |
- }; |
- return corners; |
- } |
- |
- gfx::Point origin_; |
- |
- DISALLOW_COPY_AND_ASSIGN(DropDownMenuLocator); |
-}; |
- |
-// MenuLocator for context menu. |
-class ContextMenuLocator : public chromeos::MenuLocator { |
- public: |
- explicit ContextMenuLocator(const gfx::Point& origin) |
- : origin_(origin) { |
- } |
- |
- private: |
- virtual SubmenuDirection GetSubmenuDirection() const { |
- return DEFAULT; |
- } |
- |
- virtual void Move(WebUIMenuWidget* widget) { |
- gfx::Rect bounds = widget->GetClientAreaScreenBounds(); |
- UpdateRootMenuBounds(widget, origin_, bounds.size(), base::i18n::IsRTL()); |
- } |
- |
- virtual void SetBounds(WebUIMenuWidget* widget, const gfx::Size& size) { |
- gfx::Size new_size(size); |
- new_size.Enlarge(0, kMenuCornerRadius * 2); |
- UpdateRootMenuBounds(widget, origin_, new_size, base::i18n::IsRTL()); |
- } |
- |
- virtual const SkScalar* GetCorners() const { |
- static const SkScalar corners[] = { |
- kMenuCornerRadius, kMenuCornerRadius, |
- kMenuCornerRadius, kMenuCornerRadius, |
- kMenuCornerRadius, kMenuCornerRadius, |
- kMenuCornerRadius, kMenuCornerRadius, |
- }; |
- return corners; |
- } |
- |
- virtual void GetInsets(gfx::Insets* insets) const { |
- insets->Set(kMenuCornerRadius, 0, kMenuCornerRadius, 0); |
- } |
- |
- gfx::Point origin_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ContextMenuLocator); |
-}; |
- |
-// MenuLocator for submenu. |
-class SubMenuLocator : public chromeos::MenuLocator { |
- public: |
- SubMenuLocator(const WebUIMenuWidget* parent, |
- MenuLocator::SubmenuDirection parent_direction, |
- int y) |
- : parent_rect_(GetBoundsOf(parent)), |
- parent_direction_(parent_direction), |
- root_y_(parent_rect_.y() + y), |
- corners_(NULL), |
- direction_(DEFAULT) { |
- } |
- |
- private: |
- virtual SubmenuDirection GetSubmenuDirection() const { |
- return direction_; |
- } |
- |
- virtual void Move(WebUIMenuWidget* widget) { |
- gfx::Rect bounds = widget->GetClientAreaScreenBounds(); |
- UpdateBounds(widget, bounds.size()); |
- } |
- |
- virtual void SetBounds(WebUIMenuWidget* widget, const gfx::Size& size) { |
- gfx::Size new_size(size); |
- new_size.Enlarge(0, kMenuCornerRadius * 2); |
- UpdateBounds(widget, new_size); |
- } |
- |
- virtual const SkScalar* GetCorners() const { |
- return corners_; |
- } |
- |
- virtual void GetInsets(gfx::Insets* insets) const { |
- insets->Set(kMenuCornerRadius, 0, kMenuCornerRadius, 0); |
- } |
- |
- // Rounded corner definitions for right/left attached submenu. |
- static const SkScalar kRightCorners[]; |
- static const SkScalar kLeftCorners[]; |
- |
- void UpdateBounds(WebUIMenuWidget* widget, const gfx::Size& size) { |
- gfx::Rect screen_rect = GetScreenRectAt(parent_rect_.x(), root_y_); |
- int width = std::min(screen_rect.width(), size.width()); |
- int height = AdjustHeight(widget, size.height(), screen_rect.height()); |
- |
- SubmenuDirection direction = parent_direction_; |
- if (direction == DEFAULT) { |
- if (base::i18n::IsRTL()) { |
- direction = LEFT; |
- } else { |
- direction = RIGHT; |
- } |
- } |
- // Adjust Y to fit the screen. |
- int y = root_y_; |
- if (root_y_ + height > screen_rect.bottom()) |
- y = screen_rect.bottom() - height; |
- // Determine the attachment. |
- // TODO(oshima): |
- // Come up with better placement when menu is wide, |
- // probably limit max width and let each menu scroll |
- // horizontally when selected. |
- int x = direction == RIGHT ? |
- ComputeXToRight(screen_rect, width) : |
- ComputeXToLeft(screen_rect, width); |
- corners_ = direction_ == RIGHT ? kRightCorners : kLeftCorners; |
- widget->SetBounds(gfx::Rect(x, y, width, height)); |
- } |
- |
- int ComputeXToRight(const gfx::Rect& screen_rect, int width) { |
- if (parent_rect_.right() + width > screen_rect.right()) { |
- if (parent_rect_.x() - width < screen_rect.x()) { |
- // Place on the right to fit to the screen if no space on left |
- direction_ = RIGHT; |
- return screen_rect.right() - width; |
- } |
- direction_ = LEFT; |
- return parent_rect_.x() - width + kSubmenuOverlapPx; |
- } else { |
- direction_ = RIGHT; |
- return parent_rect_.right() - kSubmenuOverlapPx; |
- } |
- } |
- |
- int ComputeXToLeft(const gfx::Rect& screen_rect, int width) { |
- if (parent_rect_.x() - width < screen_rect.x()) { |
- if (parent_rect_.right() + width > screen_rect.right()) { |
- // no space on right |
- direction_ = LEFT; |
- return screen_rect.x(); |
- } |
- corners_ = kRightCorners; |
- direction_ = RIGHT; |
- return parent_rect_.right() - kSubmenuOverlapPx; |
- } else { |
- corners_ = kLeftCorners; |
- direction_ = LEFT; |
- return parent_rect_.x() - width + kSubmenuOverlapPx; |
- } |
- } |
- |
- const gfx::Rect parent_rect_; |
- |
- const MenuLocator::SubmenuDirection parent_direction_; |
- |
- const int root_y_; |
- |
- SkScalar const* corners_; |
- |
- // The direction the this menu is attached to its parent. Submenu may still |
- // choose different direction if there is no spece for that direction |
- // (2nd turnaround). |
- SubmenuDirection direction_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SubMenuLocator); |
-}; |
- |
-// Rounded corners of the submenu attached to right side. |
-const SkScalar SubMenuLocator::kRightCorners[] = { |
- 0, 0, |
- kMenuCornerRadius, kMenuCornerRadius, |
- kMenuCornerRadius, kMenuCornerRadius, |
- kMenuCornerRadius, kMenuCornerRadius, |
-}; |
- |
-// Rounded corners of the submenu attached to left side. |
-const SkScalar SubMenuLocator::kLeftCorners[] = { |
- kMenuCornerRadius, kMenuCornerRadius, |
- 0, 0, |
- kMenuCornerRadius, kMenuCornerRadius, |
- kMenuCornerRadius, kMenuCornerRadius, |
-}; |
- |
- |
-} // namespace |
- |
-namespace chromeos { |
- |
-// static |
-MenuLocator* MenuLocator::CreateDropDownMenuLocator(const gfx::Point& p) { |
- return new DropDownMenuLocator(p); |
-} |
- |
-MenuLocator* MenuLocator::CreateContextMenuLocator(const gfx::Point& p) { |
- return new ContextMenuLocator(p); |
-} |
- |
-MenuLocator* MenuLocator::CreateSubMenuLocator( |
- const WebUIMenuWidget* parent, |
- MenuLocator::SubmenuDirection parent_direction, |
- int y) { |
- return new SubMenuLocator(parent, parent_direction, y); |
-} |
- |
-} // namespace chromeos |