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

Unified Diff: ash/system/tray/system_tray_bubble.cc

Issue 10514008: Add WebNotificationTray (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 8 years, 6 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 | « ash/system/tray/system_tray_bubble.h ('k') | ash/system/tray/system_tray_bubble_view.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/system/tray/system_tray_bubble.cc
diff --git a/ash/system/tray/system_tray_bubble.cc b/ash/system/tray/system_tray_bubble.cc
index a15bd59e87bfb6d65d2ffac4199918ecc0b48f55..2dd201f8cae043f1e76541074de4797948164683 100644
--- a/ash/system/tray/system_tray_bubble.cc
+++ b/ash/system/tray/system_tray_bubble.cc
@@ -5,51 +5,25 @@
#include "ash/system/tray/system_tray_bubble.h"
#include "ash/shell.h"
-#include "ash/shell_window_ids.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_delegate.h"
#include "ash/system/tray/system_tray_item.h"
#include "ash/system/tray/tray_constants.h"
-#include "ash/wm/shelf_layout_manager.h"
#include "ash/wm/window_animations.h"
#include "base/message_loop.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"
-#include "third_party/skia/include/core/SkPath.h"
-#include "third_party/skia/include/effects/SkBlurImageFilter.h"
#include "ui/aura/event.h"
#include "ui/aura/window.h"
-#include "ui/base/accessibility/accessible_view_state.h"
-#include "ui/base/l10n/l10n_util.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_animation_observer.h"
#include "ui/compositor/scoped_layer_animation_settings.h"
#include "ui/gfx/canvas.h"
-#include "ui/gfx/screen.h"
-#include "ui/views/bubble/bubble_frame_view.h"
#include "ui/views/layout/box_layout.h"
-#include "ui/views/layout/fill_layout.h"
#include "ui/views/view.h"
namespace ash {
namespace {
-const int kShadowThickness = 4;
-
-const int kBottomLineHeight = 1;
-
-const int kSystemTrayBubbleHorizontalInset = 1;
-const int kSystemTrayBubbleVerticalInset = 1;
-
-const int kArrowHeight = 10;
-const int kArrowWidth = 20;
-const int kArrowPaddingFromRight = 20;
-const int kArrowPaddingFromBottom = 17;
-const int kMinArrowOffset = 12;
-
const int kAnimationDurationForPopupMS = 200;
// Normally a detailed view is the same size as the default view. However,
@@ -59,34 +33,6 @@ const int kAnimationDurationForPopupMS = 200;
// detailed view.
const int kDetailedBubbleMaxHeight = kTrayPopupItemHeight * 5;
-const SkColor kShadowColor = SkColorSetARGB(0xff, 0, 0, 0);
-
-void DrawBlurredShadowAroundView(gfx::Canvas* canvas,
- int top,
- int bottom,
- int width,
- const gfx::Insets& inset) {
- SkPath path;
- path.incReserve(4);
- path.moveTo(SkIntToScalar(inset.left() + kShadowThickness),
- SkIntToScalar(top + kShadowThickness + 1));
- path.lineTo(SkIntToScalar(inset.left() + kShadowThickness),
- SkIntToScalar(bottom));
- path.lineTo(SkIntToScalar(width),
- SkIntToScalar(bottom));
- path.lineTo(SkIntToScalar(width),
- SkIntToScalar(top + kShadowThickness + 1));
-
- SkPaint paint;
- paint.setColor(kShadowColor);
- paint.setStyle(SkPaint::kStroke_Style);
- paint.setXfermodeMode(SkXfermode::kSrcOver_Mode);
- paint.setStrokeWidth(SkIntToScalar(3));
- paint.setImageFilter(new SkBlurImageFilter(
- SkIntToScalar(3), SkIntToScalar(3)))->unref();
- canvas->sk_canvas()->drawPath(path, paint);
-}
-
// A view with some special behaviour for tray items in the popup:
// - changes background color on hover.
class TrayPopupItemContainer : public views::View {
@@ -147,119 +93,6 @@ class TrayPopupItemContainer : public views::View {
DISALLOW_COPY_AND_ASSIGN(TrayPopupItemContainer);
};
-class SystemTrayBubbleBorder : public views::BubbleBorder {
- public:
- SystemTrayBubbleBorder(views::View* owner,
- views::BubbleBorder::ArrowLocation arrow_location,
- int arrow_offset)
- : views::BubbleBorder(arrow_location,
- views::BubbleBorder::NO_SHADOW),
- owner_(owner),
- arrow_offset_(std::max(arrow_offset, kMinArrowOffset)) {
- set_alignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
- }
-
- virtual ~SystemTrayBubbleBorder() {}
-
- private:
- // Overridden from views::BubbleBorder.
- // Override views::BubbleBorder to set the bubble on top of the anchor when
- // it has no arrow.
- virtual gfx::Rect GetBounds(const gfx::Rect& position_relative_to,
- const gfx::Size& contents_size) const OVERRIDE {
- if (arrow_location() != NONE) {
- return views::BubbleBorder::GetBounds(position_relative_to,
- contents_size);
- }
-
- gfx::Size border_size(contents_size);
- gfx::Insets insets;
- GetInsets(&insets);
- border_size.Enlarge(insets.width(), insets.height());
-
- const int kArrowOverlap = 3;
- int x = position_relative_to.x() +
- position_relative_to.width() / 2 - border_size.width() / 2;
- // Position the bubble on top of the anchor.
- int y = position_relative_to.y() +
- kArrowOverlap - border_size.height();
- return gfx::Rect(x, y, border_size.width(), border_size.height());
- }
-
- // Overridden from views::Border.
- virtual void Paint(const views::View& view,
- gfx::Canvas* canvas) const OVERRIDE {
- gfx::Insets inset;
- GetInsets(&inset);
- DrawBlurredShadowAroundView(canvas, 0, owner_->height(), owner_->width(),
- inset);
-
- // Draw the bottom line.
- int y = owner_->height() + 1;
- canvas->FillRect(gfx::Rect(inset.left(), y, owner_->width(),
- kBottomLineHeight), kBorderDarkColor);
-
- if (!Shell::GetInstance()->shelf()->IsVisible() ||
- arrow_location() == views::BubbleBorder::NONE)
- return;
-
- // Draw the arrow after drawing child borders, so that the arrow can cover
- // the its overlap section with child border.
- SkPath path;
- path.incReserve(4);
- if (arrow_location() == views::BubbleBorder::BOTTOM_RIGHT) {
- int tip_x = base::i18n::IsRTL() ? arrow_offset_ :
- owner_->width() - arrow_offset_;
- if (tip_x < kArrowPaddingFromRight + kArrowWidth / 2)
- tip_x = kArrowPaddingFromRight + kArrowWidth / 2;
- if (tip_x > owner_->width() - kArrowPaddingFromRight - kArrowWidth / 2)
- tip_x = owner_->width() - kArrowPaddingFromRight - kArrowWidth / 2;
- int left_base_x = tip_x - kArrowWidth / 2;
- int left_base_y = y;
- int tip_y = left_base_y + kArrowHeight;
- path.moveTo(SkIntToScalar(left_base_x), SkIntToScalar(left_base_y));
- path.lineTo(SkIntToScalar(tip_x), SkIntToScalar(tip_y));
- path.lineTo(SkIntToScalar(left_base_x + kArrowWidth),
- SkIntToScalar(left_base_y));
- } else if (arrow_location() == views::BubbleBorder::LEFT_BOTTOM) {
- int tip_y = y - arrow_offset_;
- int top_base_y = tip_y - kArrowWidth / 2;
- int top_base_x = inset.left() + kSystemTrayBubbleHorizontalInset;
- int tip_x = top_base_x - kArrowHeight;
- path.moveTo(SkIntToScalar(top_base_x), SkIntToScalar(top_base_y));
- path.lineTo(SkIntToScalar(tip_x), SkIntToScalar(tip_y));
- path.lineTo(SkIntToScalar(top_base_x),
- SkIntToScalar(top_base_y + kArrowWidth));
- } else if (arrow_location() == views::BubbleBorder::RIGHT_BOTTOM){
- int tip_y = y - arrow_offset_;
- int top_base_y = tip_y - kArrowWidth / 2;
- int top_base_x = inset.left() + owner_->width() -
- kSystemTrayBubbleHorizontalInset;
- int tip_x = top_base_x + kArrowHeight;
- path.moveTo(SkIntToScalar(top_base_x), SkIntToScalar(top_base_y));
- path.lineTo(SkIntToScalar(tip_x), SkIntToScalar(tip_y));
- path.lineTo(SkIntToScalar(top_base_x),
- SkIntToScalar(top_base_y + kArrowWidth));
- }
-
- SkPaint paint;
- paint.setStyle(SkPaint::kFill_Style);
- paint.setColor(kHeaderBackgroundColorDark);
- canvas->DrawPath(path, paint);
-
- // Now draw the arrow border.
- paint.setStyle(SkPaint::kStroke_Style);
- paint.setColor(kBorderDarkColor);
- canvas->DrawPath(path, paint);
-
- }
-
- views::View* owner_;
- const int arrow_offset_;
-
- DISALLOW_COPY_AND_ASSIGN(SystemTrayBubbleBorder);
-};
-
// Implicit animation observer that deletes itself and the layer at the end of
// the animation.
class AnimationObserverDeleteLayer : public ui::ImplicitAnimationObserver {
@@ -285,108 +118,6 @@ class AnimationObserverDeleteLayer : public ui::ImplicitAnimationObserver {
namespace internal {
-// SystemTrayBubbleView
-
-SystemTrayBubbleView::SystemTrayBubbleView(
- views::View* anchor,
- views::BubbleBorder::ArrowLocation arrow_location,
- SystemTrayBubble* host,
- bool can_activate)
- : views::BubbleDelegateView(anchor, arrow_location),
- host_(host),
- can_activate_(can_activate),
- max_height_(0) {
- set_margin(0);
- set_parent_window(ash::Shell::GetInstance()->GetContainer(
- ash::internal::kShellWindowId_SettingBubbleContainer));
- set_notify_enter_exit_on_child(true);
- SetPaintToLayer(true);
- SetFillsBoundsOpaquely(true);
-}
-
-SystemTrayBubbleView::~SystemTrayBubbleView() {
- // Inform host items (models) that their views are being destroyed.
- if (host_)
- host_->DestroyItemViews();
-}
-
-void SystemTrayBubbleView::SetBubbleBorder(views::BubbleBorder* border) {
- GetBubbleFrameView()->SetBubbleBorder(border);
-}
-
-void SystemTrayBubbleView::UpdateAnchor() {
- SizeToContents();
- GetWidget()->GetRootView()->SchedulePaint();
-}
-
-void SystemTrayBubbleView::Init() {
- views::BoxLayout* layout =
- new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0);
- layout->set_spread_blank_space(true);
- SetLayoutManager(layout);
- set_background(NULL);
-}
-
-gfx::Rect SystemTrayBubbleView::GetAnchorRect() {
- gfx::Rect rect;
- if (host_)
- rect = host_->GetAnchorRect();
- // TODO(jennyz): May need to add left/right alignment in the following code.
- if (rect.IsEmpty()) {
- rect = gfx::Screen::GetPrimaryMonitor().bounds();
- rect = gfx::Rect(
- base::i18n::IsRTL() ? kPaddingFromRightEdgeOfScreenBottomAlignment :
- rect.width() - kPaddingFromRightEdgeOfScreenBottomAlignment,
- rect.height() - kPaddingFromBottomOfScreenBottomAlignment,
- 0, 0);
- }
- return rect;
-}
-
-bool SystemTrayBubbleView::CanActivate() const {
- return can_activate_;
-}
-
-gfx::Size SystemTrayBubbleView::GetPreferredSize() {
- gfx::Size size = views::BubbleDelegateView::GetPreferredSize();
- int height = size.height();
- if (max_height_ != 0 && height > max_height_)
- height = max_height_;
- return gfx::Size(kTrayPopupWidth, height);
-}
-
-void SystemTrayBubbleView::OnMouseEntered(const views::MouseEvent& event) {
- if (host_)
- host_->StopAutoCloseTimer();
-}
-
-void SystemTrayBubbleView::OnMouseExited(const views::MouseEvent& event) {
- if (host_)
- host_->RestartAutoCloseTimer();
-}
-
-void SystemTrayBubbleView::GetAccessibleState(ui::AccessibleViewState* state) {
- if (can_activate_) {
- state->role = ui::AccessibilityTypes::ROLE_WINDOW;
- state->name = l10n_util::GetStringUTF16(
- IDS_ASH_STATUS_TRAY_ACCESSIBLE_NAME);
- }
-}
-
-void SystemTrayBubbleView::ChildPreferredSizeChanged(View* child) {
- SizeToContents();
-}
-
-void SystemTrayBubbleView::ViewHierarchyChanged(bool is_add,
- views::View* parent,
- views::View* child) {
- if (is_add && child == this) {
- parent->SetPaintToLayer(true);
- parent->SetFillsBoundsOpaquely(true);
- parent->layer()->SetMasksToBounds(true);
- }
-}
-
// SystemTrayBubble::InitParams
SystemTrayBubble::InitParams::InitParams(
SystemTrayBubble::AnchorType anchor_type,
@@ -395,10 +126,7 @@ SystemTrayBubble::InitParams::InitParams(
anchor_type(anchor_type),
can_activate(false),
login_status(ash::user::LOGGED_IN_NONE),
- arrow_offset(
- (shelf_alignment == SHELF_ALIGNMENT_BOTTOM ?
- kArrowPaddingFromRight : kArrowPaddingFromBottom)
- + kArrowWidth / 2),
+ arrow_offset(0),
max_height(0) {
}
@@ -494,8 +222,7 @@ void SystemTrayBubble::UpdateView(
bubble_widget_->GetContentsView()->Layout();
// Make sure that the bubble is large enough for the default view.
if (bubble_type_ == BUBBLE_TYPE_DEFAULT) {
- bubble_view_->set_max_height(0); // Clear max height limit.
- bubble_view_->SizeToContents();
+ bubble_view_->SetMaxHeight(0); // Clear max height limit.
}
// When transitioning from default view to detailed view, animate the new
@@ -539,7 +266,7 @@ void SystemTrayBubble::InitView(const InitParams& init_params) {
if (bubble_type_ == BUBBLE_TYPE_DETAILED &&
max_height < kDetailedBubbleMaxHeight)
max_height = kDetailedBubbleMaxHeight;
- bubble_view_->set_max_height(max_height);
+ bubble_view_->SetMaxHeight(max_height);
CreateItemViews(init_params.login_status);
@@ -549,11 +276,7 @@ void SystemTrayBubble::InitView(const InitParams& init_params) {
// Must occur after call to CreateBubble()
bubble_view_->SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
bubble_widget_->non_client_view()->frame_view()->set_background(NULL);
- SystemTrayBubbleBorder* bubble_border = new SystemTrayBubbleBorder(
- bubble_view_, arrow_location, init_params.arrow_offset);
- bubble_view_->SetBubbleBorder(bubble_border);
- // Recalculate with new border.
- bubble_view_->SizeToContents();
+ bubble_view_->SetBubbleBorder(init_params.arrow_offset);
bubble_widget_->AddObserver(this);
@@ -571,6 +294,10 @@ void SystemTrayBubble::InitView(const InitParams& init_params) {
bubble_view_->Show();
}
+void SystemTrayBubble::BubbleViewDestroyed() {
+ DestroyItemViews();
+}
+
gfx::Rect SystemTrayBubble::GetAnchorRect() const {
gfx::Rect rect;
views::Widget* widget = bubble_view()->anchor_widget();
@@ -605,6 +332,14 @@ gfx::Rect SystemTrayBubble::GetAnchorRect() const {
return rect;
}
+void SystemTrayBubble::OnMouseEnteredView() {
+ StopAutoCloseTimer();
+}
+
+void SystemTrayBubble::OnMouseExitedView() {
+ RestartAutoCloseTimer();
+}
+
void SystemTrayBubble::DestroyItemViews() {
for (std::vector<ash::SystemTrayItem*>::iterator it = items_.begin();
it != items_.end();
@@ -647,6 +382,19 @@ void SystemTrayBubble::Close() {
bubble_widget_->Close();
}
+void SystemTrayBubble::SetVisible(bool is_visible) {
+ if (bubble_widget_) {
+ if (is_visible)
+ bubble_widget_->Show();
+ else
+ bubble_widget_->Hide();
+ }
+}
+
+bool SystemTrayBubble::IsVisible() {
+ return bubble_widget_ && bubble_widget_->IsVisible();
+}
+
void SystemTrayBubble::CreateItemViews(user::LoginStatus login_status) {
for (std::vector<ash::SystemTrayItem*>::iterator it = items_.begin();
it != items_.end();
« no previous file with comments | « ash/system/tray/system_tray_bubble.h ('k') | ash/system/tray/system_tray_bubble_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698