| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/system/tray/system_tray_bubble.h" | 5 #include "ash/system/tray/system_tray_bubble.h" |
| 6 | 6 |
| 7 #include "ash/shell.h" | 7 #include "ash/shell.h" |
| 8 #include "ash/shell_window_ids.h" | 8 #include "ash/shell_window_ids.h" |
| 9 #include "ash/system/tray/system_tray.h" | 9 #include "ash/system/tray/system_tray.h" |
| 10 #include "ash/system/tray/system_tray_delegate.h" | 10 #include "ash/system/tray/system_tray_delegate.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 #include "ui/views/layout/box_layout.h" | 28 #include "ui/views/layout/box_layout.h" |
| 29 #include "ui/views/layout/fill_layout.h" | 29 #include "ui/views/layout/fill_layout.h" |
| 30 #include "ui/views/view.h" | 30 #include "ui/views/view.h" |
| 31 | 31 |
| 32 namespace ash { | 32 namespace ash { |
| 33 | 33 |
| 34 namespace { | 34 namespace { |
| 35 | 35 |
| 36 const int kShadowThickness = 4; | 36 const int kShadowThickness = 4; |
| 37 | 37 |
| 38 const int kLeftPadding = 4; | |
| 39 const int kBottomLineHeight = 1; | 38 const int kBottomLineHeight = 1; |
| 40 | 39 |
| 40 const int kSystemTrayBubbleHorizontalInset = 1; |
| 41 const int kSystemTrayBubbleVerticalInset = 1; |
| 42 |
| 41 const int kArrowHeight = 10; | 43 const int kArrowHeight = 10; |
| 42 const int kArrowWidth = 20; | 44 const int kArrowWidth = 20; |
| 43 const int kArrowPaddingFromRight = 20; | 45 const int kArrowPaddingFromRight = 20; |
| 46 const int kMinArrowOffset = 12; |
| 44 | 47 |
| 45 const int kAnimationDurationForPopupMS = 200; | 48 const int kAnimationDurationForPopupMS = 200; |
| 46 | 49 |
| 47 const SkColor kShadowColor = SkColorSetARGB(0xff, 0, 0, 0); | 50 const SkColor kShadowColor = SkColorSetARGB(0xff, 0, 0, 0); |
| 48 | 51 |
| 49 void DrawBlurredShadowAroundView(gfx::Canvas* canvas, | 52 void DrawBlurredShadowAroundView(gfx::Canvas* canvas, |
| 50 int top, | 53 int top, |
| 51 int bottom, | 54 int bottom, |
| 52 int width, | 55 int width, |
| 53 const gfx::Insets& inset) { | 56 const gfx::Insets& inset) { |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 canvas->FillRect(gfx::Rect(size()), | 125 canvas->FillRect(gfx::Rect(size()), |
| 123 hover_ ? kHoverBackgroundColor : kBackgroundColor); | 126 hover_ ? kHoverBackgroundColor : kBackgroundColor); |
| 124 } | 127 } |
| 125 } | 128 } |
| 126 | 129 |
| 127 bool hover_; | 130 bool hover_; |
| 128 | 131 |
| 129 DISALLOW_COPY_AND_ASSIGN(TrayPopupItemContainer); | 132 DISALLOW_COPY_AND_ASSIGN(TrayPopupItemContainer); |
| 130 }; | 133 }; |
| 131 | 134 |
| 132 class SystemTrayBubbleBackground : public views::Background { | 135 class SystemTrayBubbleBorder : public views::BubbleBorder { |
| 133 public: | 136 public: |
| 134 explicit SystemTrayBubbleBackground(views::View* owner) | 137 SystemTrayBubbleBorder(views::View* owner, |
| 135 : owner_(owner) { | 138 views::BubbleBorder::ArrowLocation arrow_location, |
| 139 int arrow_offset) |
| 140 : views::BubbleBorder(arrow_location, |
| 141 views::BubbleBorder::NO_SHADOW), |
| 142 owner_(owner), |
| 143 arrow_offset_(std::max(arrow_offset, kMinArrowOffset)) { |
| 144 set_alignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); |
| 136 } | 145 } |
| 137 | 146 |
| 138 virtual ~SystemTrayBubbleBackground() {} | 147 virtual ~SystemTrayBubbleBorder() {} |
| 139 | 148 |
| 140 private: | 149 private: |
| 141 // Overridden from views::Background. | 150 void PaintChildBorder(gfx::Canvas* canvas) const { |
| 142 virtual void Paint(gfx::Canvas* canvas, views::View* view) const OVERRIDE { | 151 gfx::Insets insets; |
| 152 GetInsets(&insets); |
| 153 canvas->Save(); |
| 154 canvas->Translate(gfx::Point(insets.left(), insets.top())); |
| 143 views::View* last_view = NULL; | 155 views::View* last_view = NULL; |
| 144 for (int i = 0; i < owner_->child_count(); i++) { | 156 for (int i = 0; i < owner_->child_count(); i++) { |
| 145 views::View* v = owner_->child_at(i); | 157 views::View* v = owner_->child_at(i); |
| 158 if (!v->visible()) |
| 159 continue; |
| 146 | 160 |
| 147 if (!v->border()) { | 161 if (!v->border()) { |
| 148 canvas->DrawLine(gfx::Point(v->x(), v->y() - 1), | 162 canvas->DrawLine(gfx::Point(v->x(), v->y() - 1), |
| 149 gfx::Point(v->x() + v->width(), v->y() - 1), | 163 gfx::Point(v->x() + v->width(), v->y() - 1), |
| 150 !last_view || last_view->border() ? kBorderDarkColor : | 164 !last_view || last_view->border() ? kBorderDarkColor : |
| 151 kBorderLightColor); | 165 kBorderLightColor); |
| 152 } else if (last_view && !last_view->border()) { | 166 } else if (last_view && !last_view->border()) { |
| 153 canvas->DrawLine(gfx::Point(v->x() - 1, v->y() - 1), | 167 canvas->DrawLine(gfx::Point(v->x() - 1, v->y() - 1), |
| 154 gfx::Point(v->x() + v->width() + 1, v->y() - 1), | 168 gfx::Point(v->x() + v->width() + 1, v->y() - 1), |
| 155 kBorderDarkColor); | 169 kBorderDarkColor); |
| 156 } | 170 } |
| 157 | 171 |
| 158 canvas->DrawLine(gfx::Point(v->x() - 1, v->y() - 1), | 172 canvas->DrawLine(gfx::Point(v->x() - 1, v->y() - 1), |
| 159 gfx::Point(v->x() - 1, v->y() + v->height() + 1), | 173 gfx::Point(v->x() - 1, v->y() + v->height() + 1), |
| 160 kBorderDarkColor); | 174 kBorderDarkColor); |
| 161 canvas->DrawLine(gfx::Point(v->x() + v->width(), v->y() - 1), | 175 canvas->DrawLine(gfx::Point(v->x() + v->width(), v->y() - 1), |
| 162 gfx::Point(v->x() + v->width(), v->y() + v->height() + 1), | 176 gfx::Point(v->x() + v->width(), v->y() + v->height() + 1), |
| 163 kBorderDarkColor); | 177 kBorderDarkColor); |
| 164 last_view = v; | 178 last_view = v; |
| 165 } | 179 } |
| 180 canvas->Restore(); |
| 166 } | 181 } |
| 167 | 182 |
| 168 views::View* owner_; | |
| 169 | |
| 170 DISALLOW_COPY_AND_ASSIGN(SystemTrayBubbleBackground); | |
| 171 }; | |
| 172 | |
| 173 class SystemTrayBubbleBorder : public views::BubbleBorder { | |
| 174 public: | |
| 175 enum ArrowType { | |
| 176 ARROW_TYPE_NONE, | |
| 177 ARROW_TYPE_BOTTOM, | |
| 178 }; | |
| 179 | |
| 180 SystemTrayBubbleBorder(views::View* owner, | |
| 181 ArrowType arrow_type, | |
| 182 int arrow_offset) | |
| 183 : views::BubbleBorder(views::BubbleBorder::BOTTOM_RIGHT, | |
| 184 views::BubbleBorder::NO_SHADOW), | |
| 185 owner_(owner), | |
| 186 arrow_type_(arrow_type), | |
| 187 arrow_offset_(arrow_offset) { | |
| 188 set_alignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); | |
| 189 } | |
| 190 | |
| 191 virtual ~SystemTrayBubbleBorder() {} | |
| 192 | |
| 193 private: | |
| 194 // Overridden from views::Border. | 183 // Overridden from views::Border. |
| 195 virtual void Paint(const views::View& view, | 184 virtual void Paint(const views::View& view, |
| 196 gfx::Canvas* canvas) const OVERRIDE { | 185 gfx::Canvas* canvas) const OVERRIDE { |
| 197 gfx::Insets inset; | 186 gfx::Insets inset; |
| 198 GetInsets(&inset); | 187 GetInsets(&inset); |
| 199 DrawBlurredShadowAroundView(canvas, 0, owner_->height(), owner_->width(), | 188 DrawBlurredShadowAroundView(canvas, 0, owner_->height(), owner_->width(), |
| 200 inset); | 189 inset); |
| 201 | 190 |
| 191 PaintChildBorder(canvas); |
| 192 |
| 202 // Draw the bottom line. | 193 // Draw the bottom line. |
| 203 int y = owner_->height() + 1; | 194 int y = owner_->height() + 1; |
| 204 canvas->FillRect(gfx::Rect(kLeftPadding, y, owner_->width(), | 195 canvas->FillRect(gfx::Rect(inset.left(), y, owner_->width(), |
| 205 kBottomLineHeight), kBorderDarkColor); | 196 kBottomLineHeight), kBorderDarkColor); |
| 206 | 197 |
| 207 if (!Shell::GetInstance()->shelf()->IsVisible()) | 198 if (!Shell::GetInstance()->shelf()->IsVisible() || |
| 199 arrow_location() == views::BubbleBorder::NONE) |
| 208 return; | 200 return; |
| 209 | 201 |
| 210 // Draw the arrow. | 202 // Draw the arrow after drawing child borders, so that the arrow can cover |
| 211 if (arrow_type_ == ARROW_TYPE_BOTTOM) { | 203 // the its overlap section with child border. |
| 204 SkPath path; |
| 205 path.incReserve(4); |
| 206 if (arrow_location() == views::BubbleBorder::BOTTOM_RIGHT) { |
| 212 int tip_x = base::i18n::IsRTL() ? arrow_offset_ : | 207 int tip_x = base::i18n::IsRTL() ? arrow_offset_ : |
| 213 owner_->width() - arrow_offset_; | 208 owner_->width() - arrow_offset_; |
| 214 if (tip_x < kArrowPaddingFromRight + kArrowWidth / 2) | 209 if (tip_x < kArrowPaddingFromRight + kArrowWidth / 2) |
| 215 tip_x = kArrowPaddingFromRight + kArrowWidth / 2; | 210 tip_x = kArrowPaddingFromRight + kArrowWidth / 2; |
| 216 if (tip_x > owner_->width() - kArrowPaddingFromRight - kArrowWidth / 2) | 211 if (tip_x > owner_->width() - kArrowPaddingFromRight - kArrowWidth / 2) |
| 217 tip_x = owner_->width() - kArrowPaddingFromRight - kArrowWidth / 2; | 212 tip_x = owner_->width() - kArrowPaddingFromRight - kArrowWidth / 2; |
| 218 int left_base_x = tip_x - kArrowWidth / 2; | 213 int left_base_x = tip_x - kArrowWidth / 2; |
| 219 int left_base_y = y; | 214 int left_base_y = y; |
| 220 int tip_y = left_base_y + kArrowHeight; | 215 int tip_y = left_base_y + kArrowHeight; |
| 221 | |
| 222 SkPath path; | |
| 223 path.incReserve(4); | |
| 224 path.moveTo(SkIntToScalar(left_base_x), SkIntToScalar(left_base_y)); | 216 path.moveTo(SkIntToScalar(left_base_x), SkIntToScalar(left_base_y)); |
| 225 path.lineTo(SkIntToScalar(tip_x), SkIntToScalar(tip_y)); | 217 path.lineTo(SkIntToScalar(tip_x), SkIntToScalar(tip_y)); |
| 226 path.lineTo(SkIntToScalar(left_base_x + kArrowWidth), | 218 path.lineTo(SkIntToScalar(left_base_x + kArrowWidth), |
| 227 SkIntToScalar(left_base_y)); | 219 SkIntToScalar(left_base_y)); |
| 220 } else if (arrow_location() == views::BubbleBorder::LEFT_BOTTOM) { |
| 221 int tip_y = y - arrow_offset_; |
| 222 int top_base_y = tip_y - kArrowWidth / 2; |
| 223 int top_base_x = inset.left() + kSystemTrayBubbleHorizontalInset; |
| 224 int tip_x = top_base_x - kArrowHeight; |
| 225 path.moveTo(SkIntToScalar(top_base_x), SkIntToScalar(top_base_y)); |
| 226 path.lineTo(SkIntToScalar(tip_x), SkIntToScalar(tip_y)); |
| 227 path.lineTo(SkIntToScalar(top_base_x), |
| 228 SkIntToScalar(top_base_y + kArrowWidth)); |
| 229 } else if (arrow_location() == views::BubbleBorder::RIGHT_BOTTOM){ |
| 230 int tip_y = y - arrow_offset_; |
| 231 int top_base_y = tip_y - kArrowWidth / 2; |
| 232 int top_base_x = inset.left() + owner_->width() - |
| 233 kSystemTrayBubbleHorizontalInset; |
| 234 int tip_x = top_base_x + kArrowHeight; |
| 235 path.moveTo(SkIntToScalar(top_base_x), SkIntToScalar(top_base_y)); |
| 236 path.lineTo(SkIntToScalar(tip_x), SkIntToScalar(tip_y)); |
| 237 path.lineTo(SkIntToScalar(top_base_x), |
| 238 SkIntToScalar(top_base_y + kArrowWidth)); |
| 239 } |
| 228 | 240 |
| 229 SkPaint paint; | 241 SkPaint paint; |
| 230 paint.setStyle(SkPaint::kFill_Style); | 242 paint.setStyle(SkPaint::kFill_Style); |
| 231 paint.setColor(kHeaderBackgroundColorDark); | 243 paint.setColor(kHeaderBackgroundColorDark); |
| 232 canvas->DrawPath(path, paint); | 244 canvas->DrawPath(path, paint); |
| 233 | 245 |
| 234 // Now draw the arrow border. | 246 // Now draw the arrow border. |
| 235 paint.setStyle(SkPaint::kStroke_Style); | 247 paint.setStyle(SkPaint::kStroke_Style); |
| 236 paint.setColor(kBorderDarkColor); | 248 paint.setColor(kBorderDarkColor); |
| 237 canvas->DrawPath(path, paint); | 249 canvas->DrawPath(path, paint); |
| 238 } | 250 |
| 239 } | 251 } |
| 240 | 252 |
| 241 views::View* owner_; | 253 views::View* owner_; |
| 242 ArrowType arrow_type_; | |
| 243 const int arrow_offset_; | 254 const int arrow_offset_; |
| 244 | 255 |
| 245 DISALLOW_COPY_AND_ASSIGN(SystemTrayBubbleBorder); | 256 DISALLOW_COPY_AND_ASSIGN(SystemTrayBubbleBorder); |
| 246 }; | 257 }; |
| 247 | 258 |
| 248 } // namespace | 259 } // namespace |
| 249 | 260 |
| 250 namespace internal { | 261 namespace internal { |
| 251 | 262 |
| 252 // SystemTrayBubbleView | 263 // SystemTrayBubbleView |
| 253 | 264 |
| 254 SystemTrayBubbleView::SystemTrayBubbleView(views::View* anchor, | 265 SystemTrayBubbleView::SystemTrayBubbleView(views::View* anchor, |
| 255 SystemTrayBubble* host, | 266 views::BubbleBorder::ArrowLocation arrow_location, |
| 256 bool can_activate) | 267 SystemTrayBubble* host, |
| 257 : views::BubbleDelegateView(anchor, views::BubbleBorder::BOTTOM_RIGHT), | 268 bool can_activate) |
| 269 : views::BubbleDelegateView(anchor, arrow_location), |
| 258 host_(host), | 270 host_(host), |
| 259 can_activate_(can_activate) { | 271 can_activate_(can_activate) { |
| 260 set_margin(0); | 272 set_margin(0); |
| 261 set_parent_window(ash::Shell::GetInstance()->GetContainer( | 273 set_parent_window(ash::Shell::GetInstance()->GetContainer( |
| 262 ash::internal::kShellWindowId_SettingBubbleContainer)); | 274 ash::internal::kShellWindowId_SettingBubbleContainer)); |
| 263 set_notify_enter_exit_on_child(true); | 275 set_notify_enter_exit_on_child(true); |
| 264 } | 276 } |
| 265 | 277 |
| 266 SystemTrayBubbleView::~SystemTrayBubbleView() { | 278 SystemTrayBubbleView::~SystemTrayBubbleView() { |
| 267 // Inform host items (models) that their views are being destroyed. | 279 // Inform host items (models) that their views are being destroyed. |
| 268 if (host_) | 280 if (host_) |
| 269 host_->DestroyItemViews(); | 281 host_->DestroyItemViews(); |
| 270 } | 282 } |
| 271 | 283 |
| 272 void SystemTrayBubbleView::SetBubbleBorder(views::BubbleBorder* border) { | 284 void SystemTrayBubbleView::SetBubbleBorder(views::BubbleBorder* border) { |
| 273 GetBubbleFrameView()->SetBubbleBorder(border); | 285 GetBubbleFrameView()->SetBubbleBorder(border); |
| 274 } | 286 } |
| 275 | 287 |
| 276 void SystemTrayBubbleView::UpdateAnchor() { | 288 void SystemTrayBubbleView::UpdateAnchor() { |
| 277 SizeToContents(); | 289 SizeToContents(); |
| 278 GetWidget()->GetRootView()->SchedulePaint(); | 290 GetWidget()->GetRootView()->SchedulePaint(); |
| 279 } | 291 } |
| 280 | 292 |
| 281 void SystemTrayBubbleView::Init() { | 293 void SystemTrayBubbleView::Init() { |
| 282 views::BoxLayout* layout = | 294 views::BoxLayout* layout = |
| 283 new views::BoxLayout(views::BoxLayout::kVertical, 1, 1, 1); | 295 new views::BoxLayout(views::BoxLayout::kVertical, |
| 296 kSystemTrayBubbleHorizontalInset, |
| 297 kSystemTrayBubbleVerticalInset, |
| 298 1); |
| 284 layout->set_spread_blank_space(true); | 299 layout->set_spread_blank_space(true); |
| 285 SetLayoutManager(layout); | 300 SetLayoutManager(layout); |
| 286 set_background(new SystemTrayBubbleBackground(this)); | 301 set_background(NULL); |
| 287 } | 302 } |
| 288 | 303 |
| 289 gfx::Rect SystemTrayBubbleView::GetAnchorRect() { | 304 gfx::Rect SystemTrayBubbleView::GetAnchorRect() { |
| 290 gfx::Rect rect; | 305 gfx::Rect rect; |
| 291 if (host_) | 306 if (host_) |
| 292 rect = host_->GetAnchorRect(); | 307 rect = host_->GetAnchorRect(); |
| 308 // TODO(jennyz): May need to add left/right alignment in the following code. |
| 293 if (rect.IsEmpty()) { | 309 if (rect.IsEmpty()) { |
| 294 rect = gfx::Screen::GetPrimaryMonitor().bounds(); | 310 rect = gfx::Screen::GetPrimaryMonitor().bounds(); |
| 295 rect = gfx::Rect(base::i18n::IsRTL() ? kPaddingFromRightEdgeOfScreen : | 311 rect = gfx::Rect( |
| 296 rect.width() - kPaddingFromRightEdgeOfScreen, | 312 base::i18n::IsRTL() ? kPaddingFromRightEdgeOfScreenBottomAlignment : |
| 297 rect.height() - kPaddingFromBottomOfScreen, | 313 rect.width() - kPaddingFromRightEdgeOfScreenBottomAlignment, |
| 298 0, 0); | 314 rect.height() - kPaddingFromBottomOfScreenBottomAlignment, |
| 315 0, 0); |
| 299 } | 316 } |
| 300 return rect; | 317 return rect; |
| 301 } | 318 } |
| 302 | 319 |
| 303 void SystemTrayBubbleView::ChildPreferredSizeChanged(View* child) { | 320 void SystemTrayBubbleView::ChildPreferredSizeChanged(View* child) { |
| 304 SizeToContents(); | 321 SizeToContents(); |
| 305 } | 322 } |
| 306 | 323 |
| 307 void SystemTrayBubbleView::GetAccessibleState(ui::AccessibleViewState* state) { | 324 void SystemTrayBubbleView::GetAccessibleState(ui::AccessibleViewState* state) { |
| 308 if (can_activate_) { | 325 if (can_activate_) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 CreateItemViews(Shell::GetInstance()->tray_delegate()->GetUserLoginStatus()); | 400 CreateItemViews(Shell::GetInstance()->tray_delegate()->GetUserLoginStatus()); |
| 384 bubble_widget_->GetContentsView()->Layout(); | 401 bubble_widget_->GetContentsView()->Layout(); |
| 385 // Make sure that the bubble is large enough for the default view. | 402 // Make sure that the bubble is large enough for the default view. |
| 386 if (bubble_type_ == BUBBLE_TYPE_DEFAULT) | 403 if (bubble_type_ == BUBBLE_TYPE_DEFAULT) |
| 387 bubble_view_->SizeToContents(); | 404 bubble_view_->SizeToContents(); |
| 388 } | 405 } |
| 389 | 406 |
| 390 void SystemTrayBubble::InitView(const InitParams& init_params) { | 407 void SystemTrayBubble::InitView(const InitParams& init_params) { |
| 391 DCHECK(bubble_view_ == NULL); | 408 DCHECK(bubble_view_ == NULL); |
| 392 anchor_type_ = init_params.anchor_type; | 409 anchor_type_ = init_params.anchor_type; |
| 410 views::BubbleBorder::ArrowLocation arrow_location; |
| 411 if (anchor_type_ == ANCHOR_TYPE_TRAY) { |
| 412 if (tray_->shelf_alignment() == SHELF_ALIGNMENT_BOTTOM) { |
| 413 arrow_location = views::BubbleBorder::BOTTOM_RIGHT; |
| 414 } else if (tray_->shelf_alignment() == SHELF_ALIGNMENT_LEFT) { |
| 415 arrow_location = views::BubbleBorder::LEFT_BOTTOM; |
| 416 } else { |
| 417 arrow_location = views::BubbleBorder::RIGHT_BOTTOM; |
| 418 } |
| 419 } else { |
| 420 arrow_location = views::BubbleBorder::NONE; |
| 421 } |
| 393 bubble_view_ = new SystemTrayBubbleView( | 422 bubble_view_ = new SystemTrayBubbleView( |
| 394 init_params.anchor, this, init_params.can_activate); | 423 init_params.anchor, arrow_location, this, init_params.can_activate); |
| 395 if (bubble_type_ == BUBBLE_TYPE_NOTIFICATION) | 424 if (bubble_type_ == BUBBLE_TYPE_NOTIFICATION) |
| 396 bubble_view_->set_close_on_deactivate(false); | 425 bubble_view_->set_close_on_deactivate(false); |
| 397 | 426 |
| 398 CreateItemViews(init_params.login_status); | 427 CreateItemViews(init_params.login_status); |
| 399 | 428 |
| 400 DCHECK(bubble_widget_ == NULL); | 429 DCHECK(bubble_widget_ == NULL); |
| 401 bubble_widget_ = views::BubbleDelegateView::CreateBubble(bubble_view_); | 430 bubble_widget_ = views::BubbleDelegateView::CreateBubble(bubble_view_); |
| 402 | 431 |
| 403 // Must occur after call to CreateBubble() | 432 // Must occur after call to CreateBubble() |
| 404 bubble_view_->SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); | 433 bubble_view_->SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); |
| 405 bubble_widget_->non_client_view()->frame_view()->set_background(NULL); | 434 bubble_widget_->non_client_view()->frame_view()->set_background(NULL); |
| 406 SystemTrayBubbleBorder::ArrowType arrow_type; | |
| 407 if (anchor_type_ == ANCHOR_TYPE_TRAY) | |
| 408 arrow_type = SystemTrayBubbleBorder::ARROW_TYPE_BOTTOM; | |
| 409 else | |
| 410 arrow_type = SystemTrayBubbleBorder::ARROW_TYPE_NONE; | |
| 411 | |
| 412 SystemTrayBubbleBorder* bubble_border = new SystemTrayBubbleBorder( | 435 SystemTrayBubbleBorder* bubble_border = new SystemTrayBubbleBorder( |
| 413 bubble_view_, arrow_type, init_params.arrow_offset); | 436 bubble_view_, arrow_location, init_params.arrow_offset); |
| 414 bubble_view_->SetBubbleBorder(bubble_border); | 437 bubble_view_->SetBubbleBorder(bubble_border); |
| 415 | 438 |
| 416 bubble_widget_->AddObserver(this); | 439 bubble_widget_->AddObserver(this); |
| 417 | 440 |
| 418 // Setup animation. | 441 // Setup animation. |
| 419 ash::SetWindowVisibilityAnimationType( | 442 ash::SetWindowVisibilityAnimationType( |
| 420 bubble_widget_->GetNativeWindow(), | 443 bubble_widget_->GetNativeWindow(), |
| 421 ash::WINDOW_VISIBILITY_ANIMATION_TYPE_FADE); | 444 ash::WINDOW_VISIBILITY_ANIMATION_TYPE_FADE); |
| 422 ash::SetWindowVisibilityAnimationTransition( | 445 ash::SetWindowVisibilityAnimationTransition( |
| 423 bubble_widget_->GetNativeWindow(), | 446 bubble_widget_->GetNativeWindow(), |
| 424 ash::ANIMATE_BOTH); | 447 ash::ANIMATE_BOTH); |
| 425 ash::SetWindowVisibilityAnimationDuration( | 448 ash::SetWindowVisibilityAnimationDuration( |
| 426 bubble_widget_->GetNativeWindow(), | 449 bubble_widget_->GetNativeWindow(), |
| 427 base::TimeDelta::FromMilliseconds(kAnimationDurationForPopupMS)); | 450 base::TimeDelta::FromMilliseconds(kAnimationDurationForPopupMS)); |
| 428 | 451 |
| 429 bubble_view_->Show(); | 452 bubble_view_->Show(); |
| 430 } | 453 } |
| 431 | 454 |
| 432 gfx::Rect SystemTrayBubble::GetAnchorRect() const { | 455 gfx::Rect SystemTrayBubble::GetAnchorRect() const { |
| 433 gfx::Rect rect; | 456 gfx::Rect rect; |
| 434 views::Widget* widget = bubble_view()->anchor_widget(); | 457 views::Widget* widget = bubble_view()->anchor_widget(); |
| 435 if (widget->IsVisible()) { | 458 if (widget->IsVisible()) { |
| 436 rect = widget->GetWindowScreenBounds(); | 459 rect = widget->GetWindowScreenBounds(); |
| 437 if (anchor_type_ == ANCHOR_TYPE_TRAY) { | 460 if (anchor_type_ == ANCHOR_TYPE_TRAY) { |
| 438 rect.Inset( | 461 if (tray_->shelf_alignment() == SHELF_ALIGNMENT_BOTTOM) { |
| 439 base::i18n::IsRTL() ? kPaddingFromRightEdgeOfScreen : 0, | 462 rect.Inset( |
| 440 0, | 463 base::i18n::IsRTL() ? |
| 441 base::i18n::IsRTL() ? 0 : kPaddingFromRightEdgeOfScreen, | 464 kPaddingFromRightEdgeOfScreenBottomAlignment : 0, |
| 442 kPaddingFromBottomOfScreen); | 465 0, |
| 466 base::i18n::IsRTL() ? |
| 467 0 : kPaddingFromRightEdgeOfScreenBottomAlignment, |
| 468 kPaddingFromBottomOfScreenBottomAlignment); |
| 469 } else if (tray_->shelf_alignment() == SHELF_ALIGNMENT_LEFT) { |
| 470 rect.Inset(0, 0, kPaddingFromLeftEdgeOfScreenLeftAlignment, |
| 471 kPaddingFromBottomOfScreenVerticalAlignment); |
| 472 } else { |
| 473 rect.Inset(-kPaddingFromRightEdgeOfScreenRightAlignment, |
| 474 0, 0, kPaddingFromBottomOfScreenVerticalAlignment); |
| 475 } |
| 443 } else if (anchor_type_ == ANCHOR_TYPE_BUBBLE) { | 476 } else if (anchor_type_ == ANCHOR_TYPE_BUBBLE) { |
| 477 // TODO(jennyz): add left/right launcher support for notification bubble. |
| 444 rect.Inset( | 478 rect.Inset( |
| 445 base::i18n::IsRTL() ? kShadowThickness - 1 : 0, | 479 base::i18n::IsRTL() ? kShadowThickness - 1 : 0, |
| 446 0, | 480 0, |
| 447 base::i18n::IsRTL() ? 0 : kShadowThickness - 1, | 481 base::i18n::IsRTL() ? 0 : kShadowThickness - 1, |
| 448 0); | 482 0); |
| 449 } | 483 } |
| 450 } | 484 } |
| 451 return rect; | 485 return rect; |
| 452 } | 486 } |
| 453 | 487 |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 void SystemTrayBubble::OnWidgetVisibilityChanged(views::Widget* widget, | 575 void SystemTrayBubble::OnWidgetVisibilityChanged(views::Widget* widget, |
| 542 bool visible) { | 576 bool visible) { |
| 543 if (!visible) | 577 if (!visible) |
| 544 MessageLoopForUI::current()->RemoveObserver(this); | 578 MessageLoopForUI::current()->RemoveObserver(this); |
| 545 else | 579 else |
| 546 MessageLoopForUI::current()->AddObserver(this); | 580 MessageLoopForUI::current()->AddObserver(this); |
| 547 } | 581 } |
| 548 | 582 |
| 549 } // namespace internal | 583 } // namespace internal |
| 550 } // namespace ash | 584 } // namespace ash |
| OLD | NEW |