Index: ash/system/tray/tray_bubble_view.cc |
diff --git a/ash/system/tray/tray_bubble_view.cc b/ash/system/tray/tray_bubble_view.cc |
index e40b88da807178c45af2888b2819f5148cbd2266..fc56be8f2ffc41353ddfcdc74138aeae248e105d 100644 |
--- a/ash/system/tray/tray_bubble_view.cc |
+++ b/ash/system/tray/tray_bubble_view.cc |
@@ -4,14 +4,6 @@ |
#include "ash/system/tray/tray_bubble_view.h" |
-#include "ash/root_window_controller.h" |
-#include "ash/shell.h" |
-#include "ash/shell_window_ids.h" |
-#include "ash/system/tray/tray_constants.h" |
-#include "ash/wm/property_util.h" |
-#include "ash/wm/shelf_layout_manager.h" |
-#include "ash/wm/window_animations.h" |
-#include "grit/ash_strings.h" |
#include "third_party/skia/include/core/SkCanvas.h" |
#include "third_party/skia/include/core/SkColor.h" |
#include "third_party/skia/include/core/SkPaint.h" |
@@ -24,21 +16,20 @@ |
#include "ui/gfx/canvas.h" |
#include "ui/gfx/insets.h" |
#include "ui/gfx/path.h" |
-#include "ui/gfx/screen.h" |
#include "ui/gfx/skia_util.h" |
#include "ui/views/bubble/bubble_frame_view.h" |
#include "ui/views/layout/box_layout.h" |
#include "ui/views/widget/widget.h" |
-namespace ash { |
- |
-namespace internal { |
+namespace { |
// Inset the arrow a bit from the edge. |
const int kArrowMinOffset = 20; |
const int kBubbleSpacing = 20; |
-const int kAnimationDurationForPopupMS = 200; |
+} // namespace |
+ |
+namespace ash { |
// Custom border for TrayBubbleView. Contains special logic for GetBounds() |
// to stack bubbles with no arrows correctly. Also calculates the arrow offset. |
@@ -46,9 +37,8 @@ class TrayBubbleBorder : public views::BubbleBorder { |
public: |
TrayBubbleBorder(views::View* owner, |
views::View* anchor, |
- views::BubbleBorder::ArrowLocation arrow_location, |
TrayBubbleView::InitParams params) |
- : views::BubbleBorder(arrow_location, params.shadow), |
+ : views::BubbleBorder(params.arrow_location, params.shadow), |
owner_(owner), |
anchor_(anchor), |
tray_arrow_offset_(params.arrow_offset) { |
@@ -87,7 +77,7 @@ class TrayBubbleBorder : public views::BubbleBorder { |
arrow_location() == views::BubbleBorder::BOTTOM_LEFT) { |
// Note: tray_arrow_offset_ is relative to the anchor widget. |
if (tray_arrow_offset_ == |
- internal::TrayBubbleView::InitParams::kArrowDefaultOffset) { |
+ TrayBubbleView::InitParams::kArrowDefaultOffset) { |
arrow_offset = kArrowMinOffset; |
} else { |
const int width = owner_->GetWidget()->GetContentsView()->width(); |
@@ -103,7 +93,7 @@ class TrayBubbleBorder : public views::BubbleBorder { |
} |
} else { |
if (tray_arrow_offset_ == |
- internal::TrayBubbleView::InitParams::kArrowDefaultOffset) { |
+ TrayBubbleView::InitParams::kArrowDefaultOffset) { |
arrow_offset = kArrowMinOffset; |
} else { |
gfx::Point pt(0, tray_arrow_offset_); |
@@ -185,7 +175,7 @@ class TrayBubbleBackground : public views::Background { |
// enough height. Otherwise, makes sure the bottom rows are visible. |
class BottomAlignedBoxLayout : public views::BoxLayout { |
public: |
- explicit BottomAlignedBoxLayout(internal::TrayBubbleView* bubble_view) |
+ explicit BottomAlignedBoxLayout(TrayBubbleView* bubble_view) |
: views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0), |
bubble_view_(bubble_view) { |
} |
@@ -213,7 +203,7 @@ class BottomAlignedBoxLayout : public views::BoxLayout { |
} |
} |
- internal::TrayBubbleView* bubble_view_; |
+ TrayBubbleView* bubble_view_; |
DISALLOW_COPY_AND_ASSIGN(BottomAlignedBoxLayout); |
}; |
@@ -222,62 +212,60 @@ class BottomAlignedBoxLayout : public views::BoxLayout { |
const int TrayBubbleView::InitParams::kArrowDefaultOffset = -1; |
TrayBubbleView::InitParams::InitParams(AnchorType anchor_type, |
- ShelfAlignment shelf_alignment) |
+ AnchorAlignment anchor_alignment, |
+ int bubble_width) |
: anchor_type(anchor_type), |
- shelf_alignment(shelf_alignment), |
- bubble_width(kTrayPopupWidth), |
+ anchor_alignment(anchor_alignment), |
+ bubble_width(bubble_width), |
max_height(0), |
can_activate(false), |
close_on_deactivate(true), |
top_color(SK_ColorBLACK), |
arrow_color(SK_ColorBLACK), |
+ arrow_location(views::BubbleBorder::NONE), |
arrow_offset(kArrowDefaultOffset), |
shadow(views::BubbleBorder::BIG_SHADOW) { |
} |
-TrayBubbleView* TrayBubbleView::Create(views::View* anchor, |
- Host* host, |
- const InitParams& init_params) { |
+TrayBubbleView* TrayBubbleView::Create(aura::Window* parent_window, |
+ views::View* anchor, |
+ Delegate* delegate, |
+ InitParams* init_params) { |
// Set arrow_location here so that it can be passed correctly to the |
// BubbleView constructor. |
- views::BubbleBorder::ArrowLocation arrow_location; |
- if (init_params.anchor_type == ANCHOR_TYPE_TRAY) { |
- if (init_params.shelf_alignment == SHELF_ALIGNMENT_BOTTOM) { |
- arrow_location = base::i18n::IsRTL() ? |
+ if (init_params->anchor_type == ANCHOR_TYPE_TRAY) { |
+ if (init_params->anchor_alignment == ANCHOR_ALIGNMENT_BOTTOM) { |
+ init_params->arrow_location = base::i18n::IsRTL() ? |
views::BubbleBorder::BOTTOM_LEFT : views::BubbleBorder::BOTTOM_RIGHT; |
- } else if (init_params.shelf_alignment == SHELF_ALIGNMENT_LEFT) { |
- arrow_location = views::BubbleBorder::LEFT_BOTTOM; |
+ } else if (init_params->anchor_alignment == ANCHOR_ALIGNMENT_LEFT) { |
+ init_params->arrow_location = views::BubbleBorder::LEFT_BOTTOM; |
} else { |
- arrow_location = views::BubbleBorder::RIGHT_BOTTOM; |
+ init_params->arrow_location = views::BubbleBorder::RIGHT_BOTTOM; |
} |
} else { |
- arrow_location = views::BubbleBorder::NONE; |
+ init_params->arrow_location = views::BubbleBorder::NONE; |
} |
- return new TrayBubbleView(init_params, arrow_location, anchor, host); |
+ return new TrayBubbleView(parent_window, anchor, delegate, *init_params); |
} |
-TrayBubbleView::TrayBubbleView( |
- const InitParams& init_params, |
- views::BubbleBorder::ArrowLocation arrow_location, |
- views::View* anchor, |
- Host* host) |
- : views::BubbleDelegateView(anchor, arrow_location), |
+TrayBubbleView::TrayBubbleView(aura::Window* parent_window, |
+ views::View* anchor, |
+ Delegate* delegate, |
+ const InitParams& init_params) |
+ : views::BubbleDelegateView(anchor, init_params.arrow_location), |
params_(init_params), |
- host_(host), |
+ delegate_(delegate), |
bubble_border_(NULL), |
bubble_background_(NULL), |
is_gesture_dragging_(false) { |
- set_parent_window(Shell::GetContainer( |
- anchor->GetWidget()->GetNativeWindow()->GetRootWindow(), |
- internal::kShellWindowId_SettingBubbleContainer)); |
+ set_parent_window(parent_window); |
set_notify_enter_exit_on_child(true); |
set_close_on_deactivate(init_params.close_on_deactivate); |
SetPaintToLayer(true); |
SetFillsBoundsOpaquely(true); |
- bubble_border_ = new TrayBubbleBorder( |
- this, anchor_view(), arrow_location, params_); |
+ bubble_border_ = new TrayBubbleBorder(this, anchor_view(), params_); |
bubble_background_ = new TrayBubbleBackground( |
bubble_border_, init_params.top_color, init_params.arrow_color); |
@@ -290,8 +278,17 @@ TrayBubbleView::TrayBubbleView( |
TrayBubbleView::~TrayBubbleView() { |
// Inform host items (models) that their views are being destroyed. |
- if (host_) |
- host_->BubbleViewDestroyed(); |
+ if (delegate_) |
+ delegate_->BubbleViewDestroyed(); |
+} |
+ |
+void TrayBubbleView::InitializeAndShowBubble(views::Widget* widget) { |
jennyz
2012/10/12 23:05:34
The input argument widget is not used, remove it?
stevenjb
2012/10/12 23:41:50
Done.
|
+ // Must occur after call to BubbleDelegateView::CreateBubble(). |
+ SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); |
+ bubble_border_->UpdateArrowOffset(); |
+ |
+ Show(); |
+ UpdateBubble(); |
} |
void TrayBubbleView::UpdateBubble() { |
@@ -305,6 +302,10 @@ void TrayBubbleView::SetMaxHeight(int height) { |
SizeToContents(); |
} |
+void TrayBubbleView::GetBorderInsets(gfx::Insets* insets) const { |
+ bubble_border_->GetInsets(insets); |
+} |
+ |
void TrayBubbleView::Init() { |
views::BoxLayout* layout = new BottomAlignedBoxLayout(this); |
layout->set_spread_blank_space(true); |
@@ -312,47 +313,11 @@ void TrayBubbleView::Init() { |
} |
gfx::Rect TrayBubbleView::GetAnchorRect() { |
- gfx::Rect rect; |
- |
- if (anchor_widget() && anchor_widget()->IsVisible()) { |
- rect = anchor_widget()->GetWindowBoundsInScreen(); |
- if (params_.anchor_type == ANCHOR_TYPE_TRAY) { |
- if (params_.shelf_alignment == SHELF_ALIGNMENT_BOTTOM) { |
- bool rtl = base::i18n::IsRTL(); |
- rect.Inset( |
- rtl ? kPaddingFromRightEdgeOfScreenBottomAlignment : 0, |
- 0, |
- rtl ? 0 : kPaddingFromRightEdgeOfScreenBottomAlignment, |
- kPaddingFromBottomOfScreenBottomAlignment); |
- } else if (params_.shelf_alignment == SHELF_ALIGNMENT_LEFT) { |
- rect.Inset(0, 0, kPaddingFromInnerEdgeOfLauncherVerticalAlignment, |
- kPaddingFromBottomOfScreenVerticalAlignment); |
- } else { |
- rect.Inset(kPaddingFromInnerEdgeOfLauncherVerticalAlignment, |
- 0, 0, kPaddingFromBottomOfScreenVerticalAlignment); |
- } |
- } else if (params_.anchor_type == ANCHOR_TYPE_BUBBLE) { |
- // Invert the offsets to align with the bubble below. |
- if (params_.shelf_alignment == SHELF_ALIGNMENT_LEFT) { |
- rect.Inset(kPaddingFromInnerEdgeOfLauncherVerticalAlignment, |
- 0, 0, kPaddingFromBottomOfScreenVerticalAlignment); |
- } else if (params_.shelf_alignment == SHELF_ALIGNMENT_RIGHT) { |
- rect.Inset(0, 0, kPaddingFromInnerEdgeOfLauncherVerticalAlignment, |
- kPaddingFromBottomOfScreenVerticalAlignment); |
- } |
- } |
- } |
- |
- // TODO(jennyz): May need to add left/right alignment in the following code. |
- if (rect.IsEmpty()) { |
- rect = gfx::Screen::GetPrimaryDisplay().bounds(); |
- rect = gfx::Rect( |
- base::i18n::IsRTL() ? kPaddingFromRightEdgeOfScreenBottomAlignment : |
- rect.width() - kPaddingFromRightEdgeOfScreenBottomAlignment, |
- rect.height() - kPaddingFromBottomOfScreenBottomAlignment, |
- 0, 0); |
- } |
- return rect; |
+ if (!delegate_) |
+ return gfx::Rect(); |
+ return delegate_->GetAnchorRect(anchor_widget(), |
+ params_.anchor_type, |
+ params_.anchor_alignment); |
} |
bool TrayBubbleView::CanActivate() const { |
@@ -386,19 +351,19 @@ gfx::Size TrayBubbleView::GetPreferredSize() { |
} |
void TrayBubbleView::OnMouseEntered(const ui::MouseEvent& event) { |
- if (host_) |
- host_->OnMouseEnteredView(); |
+ if (delegate_) |
+ delegate_->OnMouseEnteredView(); |
} |
void TrayBubbleView::OnMouseExited(const ui::MouseEvent& event) { |
- if (host_) |
- host_->OnMouseExitedView(); |
+ if (delegate_) |
+ delegate_->OnMouseExitedView(); |
} |
void TrayBubbleView::GetAccessibleState(ui::AccessibleViewState* state) { |
if (params_.can_activate) { |
state->role = ui::AccessibilityTypes::ROLE_WINDOW; |
- state->name = host_->GetAccessibleName(); |
+ state->name = delegate_->GetAccessibleName(); |
} |
} |
@@ -416,101 +381,4 @@ void TrayBubbleView::ViewHierarchyChanged(bool is_add, |
} |
} |
-TrayBubbleView::Host::Host() |
- : widget_(NULL), |
- bubble_view_(NULL), |
- tray_view_(NULL) { |
- Shell::GetInstance()->AddEnvEventFilter(this); |
-} |
- |
-TrayBubbleView::Host::~Host() { |
- Shell::GetInstance()->RemoveEnvEventFilter(this); |
-} |
- |
-void TrayBubbleView::Host::InitializeAndShowBubble(views::Widget* widget, |
- TrayBubbleView* bubble_view, |
- views::View* tray_view) { |
- widget_ = widget; |
- bubble_view_ = bubble_view; |
- tray_view_ = tray_view; |
- |
- // Must occur after call to BubbleDelegateView::CreateBubble(). |
- bubble_view->SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); |
- |
- bubble_view->bubble_border()->UpdateArrowOffset(); |
- |
- // Setup animation. |
- ash::SetWindowVisibilityAnimationType( |
- widget->GetNativeWindow(), |
- ash::WINDOW_VISIBILITY_ANIMATION_TYPE_FADE); |
- ash::SetWindowVisibilityAnimationTransition( |
- widget->GetNativeWindow(), |
- ash::ANIMATE_BOTH); |
- ash::SetWindowVisibilityAnimationDuration( |
- widget->GetNativeWindow(), |
- base::TimeDelta::FromMilliseconds(kAnimationDurationForPopupMS)); |
- |
- bubble_view->Show(); |
- bubble_view->UpdateBubble(); |
-} |
- |
-bool TrayBubbleView::Host::PreHandleKeyEvent(aura::Window* target, |
- ui::KeyEvent* event) { |
- return false; |
-} |
- |
-bool TrayBubbleView::Host::PreHandleMouseEvent(aura::Window* target, |
- ui::MouseEvent* event) { |
- if (event->type() == ui::ET_MOUSE_PRESSED) |
- ProcessLocatedEvent(target, *event); |
- return false; |
-} |
- |
-ui::TouchStatus TrayBubbleView::Host::PreHandleTouchEvent( |
- aura::Window* target, |
- ui::TouchEvent* event) { |
- if (event->type() == ui::ET_TOUCH_PRESSED) |
- ProcessLocatedEvent(target, *event); |
- return ui::TOUCH_STATUS_UNKNOWN; |
-} |
- |
-ui::EventResult TrayBubbleView::Host::PreHandleGestureEvent( |
- aura::Window* target, |
- ui::GestureEvent* event) { |
- return ui::ER_UNHANDLED; |
-} |
- |
-void TrayBubbleView::Host::ProcessLocatedEvent( |
- aura::Window* target, const ui::LocatedEvent& event) { |
- if (target) { |
- // Don't process events that occurred inside an embedded menu. |
- RootWindowController* root_controller = |
- GetRootWindowController(target->GetRootWindow()); |
- if (root_controller && root_controller->GetContainer( |
- ash::internal::kShellWindowId_MenuContainer)->Contains(target)) { |
- return; |
- } |
- } |
- if (!widget_) |
- return; |
- gfx::Rect bounds = widget_->GetWindowBoundsInScreen(); |
- gfx::Insets insets; |
- bubble_view_->bubble_border()->GetInsets(&insets); |
- bounds.Inset(insets); |
- if (bounds.Contains(event.root_location())) |
- return; |
- if (tray_view_) { |
- // If the user clicks on the parent tray, don't process the event here, |
- // let the tray logic handle the event and determine show/hide behavior. |
- bounds = tray_view_->GetWidget()->GetClientAreaBoundsInScreen(); |
- if (bounds.Contains(event.root_location())) |
- return; |
- } |
- // Handle clicking outside the bubble and tray. We don't block the event, so |
- // it will also be handled by whatever widget was clicked on. |
- OnClickedOutsideView(); |
-} |
- |
- |
-} // namespace internal |
} // namespace ash |