Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "chrome/browser/ui/views/message_center/web_notification_tray_win.h" | 5 #include "chrome/browser/ui/views/message_center/web_notification_tray_win.h" |
| 6 | 6 |
| 7 #include "base/i18n/number_formatting.h" | 7 #include "base/i18n/number_formatting.h" |
| 8 #include "base/string16.h" | 8 #include "base/string16.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "chrome/browser/browser_process.h" | 10 #include "chrome/browser/browser_process.h" |
| 11 #include "chrome/browser/status_icons/status_icon.h" | 11 #include "chrome/browser/status_icons/status_icon.h" |
| 12 #include "chrome/browser/status_icons/status_tray.h" | 12 #include "chrome/browser/status_icons/status_tray.h" |
| 13 #include "chrome/browser/ui/views/message_center/notification_bubble_wrapper_win .h" | 13 #include "chrome/browser/ui/views/message_center/notification_bubble_wrapper_win .h" |
| 14 #include "chrome/browser/ui/views/status_icons/status_icon_win.h" | 14 #include "chrome/browser/ui/views/status_icons/status_icon_win.h" |
| 15 #include "grit/chromium_strings.h" | 15 #include "grit/chromium_strings.h" |
| 16 #include "grit/theme_resources.h" | 16 #include "grit/theme_resources.h" |
| 17 #include "grit/ui_strings.h" | 17 #include "grit/ui_strings.h" |
| 18 #include "ui/base/l10n/l10n_util.h" | 18 #include "ui/base/l10n/l10n_util.h" |
| 19 #include "ui/base/models/simple_menu_model.h" | 19 #include "ui/base/models/simple_menu_model.h" |
| 20 #include "ui/base/resource/resource_bundle.h" | 20 #include "ui/base/resource/resource_bundle.h" |
| 21 #include "ui/base/win/hwnd_util.h" | 21 #include "ui/base/win/hwnd_util.h" |
| 22 #include "ui/gfx/canvas.h" | |
| 22 #include "ui/gfx/image/image_skia_operations.h" | 23 #include "ui/gfx/image/image_skia_operations.h" |
| 24 #include "ui/gfx/rect.h" | |
| 23 #include "ui/gfx/screen.h" | 25 #include "ui/gfx/screen.h" |
| 26 #include "ui/gfx/size.h" | |
| 24 #include "ui/message_center/message_center_tray.h" | 27 #include "ui/message_center/message_center_tray.h" |
| 25 #include "ui/message_center/message_center_tray_delegate.h" | 28 #include "ui/message_center/message_center_tray_delegate.h" |
| 26 #include "ui/message_center/views/message_bubble_base.h" | 29 #include "ui/message_center/views/message_bubble_base.h" |
| 27 #include "ui/message_center/views/message_center_bubble.h" | 30 #include "ui/message_center/views/message_center_bubble.h" |
| 28 #include "ui/message_center/views/message_popup_collection.h" | 31 #include "ui/message_center/views/message_popup_collection.h" |
| 29 #include "ui/views/widget/widget.h" | 32 #include "ui/views/widget/widget.h" |
| 30 | 33 |
| 31 namespace { | 34 namespace { |
| 32 | 35 |
| 33 // Tray constants | 36 // Tray constants |
| 34 const int kScreenEdgePadding = 2; | 37 const int kScreenEdgePadding = 2; |
| 35 | 38 |
| 39 const int kSystemTrayWidth = 16; | |
| 40 const int kSystemTrayHeight = 16; | |
| 41 const int kNumberOfSystemTraySprites = 10; | |
| 42 | |
| 36 gfx::Rect GetCornerAnchorRect() { | 43 gfx::Rect GetCornerAnchorRect() { |
| 37 // TODO(dewittj): Use the preference to determine which corner to anchor from. | 44 // TODO(dewittj): Use the preference to determine which corner to anchor from. |
| 38 gfx::Screen* screen = gfx::Screen::GetNativeScreen(); | 45 gfx::Screen* screen = gfx::Screen::GetNativeScreen(); |
| 39 gfx::Rect rect = screen->GetPrimaryDisplay().work_area(); | 46 gfx::Rect rect = screen->GetPrimaryDisplay().work_area(); |
| 40 rect.Inset(kScreenEdgePadding, kScreenEdgePadding); | 47 rect.Inset(kScreenEdgePadding, kScreenEdgePadding); |
| 41 return gfx::Rect(rect.bottom_right(), gfx::Size()); | 48 return gfx::Rect(rect.bottom_right(), gfx::Size()); |
| 42 } | 49 } |
| 43 | 50 |
| 44 gfx::Point GetClosestCorner(gfx::Rect rect, gfx::Point query) { | 51 gfx::Point GetClosestCorner(gfx::Rect rect, gfx::Point query) { |
| 45 gfx::Point center_point = rect.CenterPoint(); | 52 gfx::Point center_point = rect.CenterPoint(); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 65 // TODO(dewittj): GetNativeScreen could be wrong for Aura. | 72 // TODO(dewittj): GetNativeScreen could be wrong for Aura. |
| 66 gfx::Screen* screen = gfx::Screen::GetNativeScreen(); | 73 gfx::Screen* screen = gfx::Screen::GetNativeScreen(); |
| 67 gfx::Rect work_area = screen->GetPrimaryDisplay().work_area(); | 74 gfx::Rect work_area = screen->GetPrimaryDisplay().work_area(); |
| 68 work_area.Inset(kScreenEdgePadding, kScreenEdgePadding); | 75 work_area.Inset(kScreenEdgePadding, kScreenEdgePadding); |
| 69 gfx::Point corner = GetClosestCorner(work_area, cursor); | 76 gfx::Point corner = GetClosestCorner(work_area, cursor); |
| 70 | 77 |
| 71 gfx::Rect mouse_anchor_rect(gfx::BoundingRect(cursor, corner)); | 78 gfx::Rect mouse_anchor_rect(gfx::BoundingRect(cursor, corner)); |
| 72 return mouse_anchor_rect; | 79 return mouse_anchor_rect; |
| 73 } | 80 } |
| 74 | 81 |
| 75 gfx::ImageSkia GetIcon(bool has_unread) { | 82 gfx::ImageSkia GetIcon(int unread_count) { |
| 83 bool has_unread = unread_count > 0; | |
| 76 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 84 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 77 gfx::ImageSkia* icon = rb.GetImageSkiaNamed( | 85 if (!has_unread) |
| 78 has_unread ? IDR_NOTIFICATION_TRAY_LIT : IDR_NOTIFICATION_TRAY_DIM); | 86 return *rb.GetImageSkiaNamed(IDR_NOTIFICATION_TRAY_DIM); |
|
Jun Mukai
2013/04/19 19:00:50
Do we use DIM for the default icon? not LIT? Bette
dewittj
2013/04/19 22:10:28
I had the correct icon, but didn't change the name
| |
| 79 DCHECK(icon); | 87 |
| 80 return *icon; | 88 // TODO(dewittj): Use scale factors other than 100P. |
| 89 scoped_ptr<gfx::Canvas> canvas(new gfx::Canvas( | |
| 90 gfx::Size(kSystemTrayWidth, kSystemTrayHeight), | |
| 91 ui::SCALE_FACTOR_100P, | |
| 92 false)); | |
| 93 | |
| 94 // Draw the attention-grabbing background image. | |
| 95 canvas->DrawImageInt(*rb.GetImageSkiaNamed(IDR_NOTIFICATION_TRAY_LIT), 0, 0); | |
| 96 | |
| 97 // |numbers| is a sprite map with the image of a number from 1-9 and 9+. They | |
| 98 // are arranged horizontally, and have a transparent background. | |
| 99 gfx::ImageSkia* numbers = rb.GetImageSkiaNamed(IDR_NOTIFICATION_TRAY_NUMBERS); | |
| 100 | |
| 101 // Assume that the last sprite is the catch-all for higher numbers of | |
| 102 // notifications. | |
| 103 int effective_unread = std::min(unread_count, kNumberOfSystemTraySprites); | |
| 104 int x_offset = (effective_unread - 1) * kSystemTrayWidth; | |
| 105 | |
| 106 canvas->DrawImageInt(*numbers, | |
| 107 x_offset, 0, kSystemTrayWidth, kSystemTrayHeight, | |
| 108 0, 0, kSystemTrayWidth, kSystemTrayHeight, | |
| 109 false); | |
| 110 | |
| 111 return gfx::ImageSkia(canvas->ExtractImageRep()); | |
| 81 } | 112 } |
| 82 | 113 |
| 83 } // namespace | 114 } // namespace |
| 84 | 115 |
| 85 namespace message_center { | 116 namespace message_center { |
| 86 | 117 |
| 87 MessageCenterTrayDelegate* CreateMessageCenterTray() { | 118 MessageCenterTrayDelegate* CreateMessageCenterTray() { |
| 88 return new WebNotificationTrayWin(); | 119 return new WebNotificationTrayWin(); |
| 89 } | 120 } |
| 90 | 121 |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 206 } | 237 } |
| 207 return views::TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM; | 238 return views::TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM; |
| 208 } | 239 } |
| 209 | 240 |
| 210 gfx::NativeView WebNotificationTrayWin::GetBubbleWindowContainer() { | 241 gfx::NativeView WebNotificationTrayWin::GetBubbleWindowContainer() { |
| 211 return NULL; | 242 return NULL; |
| 212 } | 243 } |
| 213 | 244 |
| 214 void WebNotificationTrayWin::UpdateStatusIcon() { | 245 void WebNotificationTrayWin::UpdateStatusIcon() { |
| 215 int unread_notifications = message_center()->UnreadNotificationCount(); | 246 int unread_notifications = message_center()->UnreadNotificationCount(); |
| 216 status_icon_->SetImage(GetIcon(unread_notifications > 0)); | 247 status_icon_->SetImage(GetIcon(unread_notifications)); |
| 217 | 248 |
| 218 string16 product_name(l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)); | 249 string16 product_name(l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)); |
| 219 if (unread_notifications > 0) { | 250 if (unread_notifications > 0) { |
| 220 string16 str_unread_count = base::FormatNumber(unread_notifications); | 251 string16 str_unread_count = base::FormatNumber(unread_notifications); |
| 221 status_icon_->SetToolTip(l10n_util::GetStringFUTF16( | 252 status_icon_->SetToolTip(l10n_util::GetStringFUTF16( |
| 222 IDS_MESSAGE_CENTER_TOOLTIP_UNREAD, product_name, str_unread_count)); | 253 IDS_MESSAGE_CENTER_TOOLTIP_UNREAD, product_name, str_unread_count)); |
| 223 } else { | 254 } else { |
| 224 status_icon_->SetToolTip(l10n_util::GetStringFUTF16( | 255 status_icon_->SetToolTip(l10n_util::GetStringFUTF16( |
| 225 IDS_MESSAGE_CENTER_TOOLTIP, product_name)); | 256 IDS_MESSAGE_CENTER_TOOLTIP, product_name)); |
| 226 } | 257 } |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 248 | 279 |
| 249 message_center::MessageCenterBubble* | 280 message_center::MessageCenterBubble* |
| 250 WebNotificationTrayWin::GetMessageCenterBubbleForTest() { | 281 WebNotificationTrayWin::GetMessageCenterBubbleForTest() { |
| 251 if (!message_center_bubble_.get()) | 282 if (!message_center_bubble_.get()) |
| 252 return NULL; | 283 return NULL; |
| 253 return static_cast<message_center::MessageCenterBubble*>( | 284 return static_cast<message_center::MessageCenterBubble*>( |
| 254 message_center_bubble_->bubble()); | 285 message_center_bubble_->bubble()); |
| 255 } | 286 } |
| 256 | 287 |
| 257 } // namespace message_center | 288 } // namespace message_center |
| OLD | NEW |