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 "ui/message_center/views/message_view.h" | 5 #include "ui/message_center/views/message_view.h" |
6 | 6 |
7 #include "grit/ui_resources.h" | 7 #include "grit/ui_resources.h" |
8 #include "grit/ui_strings.h" | 8 #include "grit/ui_strings.h" |
9 #include "ui/base/accessibility/accessible_view_state.h" | 9 #include "ui/base/accessibility/accessible_view_state.h" |
10 #include "ui/base/l10n/l10n_util.h" | 10 #include "ui/base/l10n/l10n_util.h" |
11 #include "ui/base/models/simple_menu_model.h" | 11 #include "ui/base/models/simple_menu_model.h" |
12 #include "ui/base/resource/resource_bundle.h" | 12 #include "ui/base/resource/resource_bundle.h" |
13 #include "ui/compositor/scoped_layer_animation_settings.h" | 13 #include "ui/compositor/scoped_layer_animation_settings.h" |
14 #include "ui/gfx/canvas.h" | 14 #include "ui/gfx/canvas.h" |
15 #include "ui/message_center/message_center.h" | 15 #include "ui/message_center/message_center.h" |
16 #include "ui/message_center/message_center_style.h" | 16 #include "ui/message_center/message_center_style.h" |
17 #include "ui/message_center/message_center_tray.h" | |
18 #include "ui/message_center/message_center_util.h" | 17 #include "ui/message_center/message_center_util.h" |
19 #include "ui/message_center/views/padded_button.h" | 18 #include "ui/message_center/views/padded_button.h" |
20 #include "ui/views/context_menu_controller.h" | 19 #include "ui/views/context_menu_controller.h" |
21 #include "ui/views/controls/button/image_button.h" | 20 #include "ui/views/controls/button/image_button.h" |
22 #include "ui/views/controls/menu/menu_runner.h" | 21 #include "ui/views/controls/menu/menu_runner.h" |
23 #include "ui/views/controls/scroll_view.h" | 22 #include "ui/views/controls/scroll_view.h" |
24 #include "ui/views/shadow_border.h" | 23 #include "ui/views/shadow_border.h" |
25 #include "ui/views/widget/widget.h" | 24 #include "ui/views/widget/widget.h" |
26 | 25 |
27 namespace { | 26 namespace { |
28 | 27 |
29 const int kCloseIconTopPadding = 5; | 28 const int kCloseIconTopPadding = 5; |
30 const int kCloseIconRightPadding = 5; | 29 const int kCloseIconRightPadding = 5; |
31 | 30 |
32 const int kShadowOffset = 1; | 31 const int kShadowOffset = 1; |
33 const int kShadowBlur = 4; | 32 const int kShadowBlur = 4; |
34 | 33 |
35 // Menu constants | 34 // Menu constants |
36 const int kTogglePermissionCommand = 0; | 35 const int kTogglePermissionCommand = 0; |
37 const int kShowSettingsCommand = 1; | 36 const int kShowSettingsCommand = 1; |
38 | 37 |
39 // A dropdown menu for notifications. | 38 // A dropdown menu for notifications. |
40 class MenuModel : public ui::SimpleMenuModel, | 39 class MenuModel : public ui::SimpleMenuModel, |
41 public ui::SimpleMenuModel::Delegate { | 40 public ui::SimpleMenuModel::Delegate { |
42 public: | 41 public: |
43 MenuModel(message_center::MessageCenter* message_center, | 42 MenuModel(message_center::MessageView* message_view, |
44 message_center::MessageCenterTray* tray, | 43 const string16& display_source); |
45 const std::string& notification_id, | |
46 const string16& display_source, | |
47 const message_center::NotifierId& notifier_id); | |
48 virtual ~MenuModel(); | 44 virtual ~MenuModel(); |
49 | 45 |
50 // Overridden from ui::SimpleMenuModel::Delegate: | 46 // Overridden from ui::SimpleMenuModel::Delegate: |
51 virtual bool IsItemForCommandIdDynamic(int command_id) const OVERRIDE; | 47 virtual bool IsItemForCommandIdDynamic(int command_id) const OVERRIDE; |
52 virtual bool IsCommandIdChecked(int command_id) const OVERRIDE; | 48 virtual bool IsCommandIdChecked(int command_id) const OVERRIDE; |
53 virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE; | 49 virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE; |
54 virtual bool GetAcceleratorForCommandId( | 50 virtual bool GetAcceleratorForCommandId( |
55 int command_id, | 51 int command_id, |
56 ui::Accelerator* accelerator) OVERRIDE; | 52 ui::Accelerator* accelerator) OVERRIDE; |
57 virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE; | 53 virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE; |
58 | 54 |
59 private: | 55 private: |
60 message_center::MessageCenter* message_center_; // Weak reference. | 56 message_center::MessageView* message_view_; // Weak, owns us. |
61 message_center::MessageCenterTray* tray_; // Weak reference. | |
62 std::string notification_id_; | |
63 message_center::NotifierId notifier_id_; | |
64 | |
65 DISALLOW_COPY_AND_ASSIGN(MenuModel); | 57 DISALLOW_COPY_AND_ASSIGN(MenuModel); |
66 }; | 58 }; |
67 | 59 |
68 MenuModel::MenuModel(message_center::MessageCenter* message_center, | 60 MenuModel::MenuModel(message_center::MessageView* message_view, |
69 message_center::MessageCenterTray* tray, | 61 const string16& display_source) |
70 const std::string& notification_id, | |
71 const string16& display_source, | |
72 const message_center::NotifierId& notifier_id) | |
73 : ui::SimpleMenuModel(this), | 62 : ui::SimpleMenuModel(this), |
74 message_center_(message_center), | 63 message_view_(message_view) { |
75 tray_(tray), | |
76 notification_id_(notification_id), | |
77 notifier_id_(notifier_id) { | |
78 // Add 'disable notifications' menu item. | 64 // Add 'disable notifications' menu item. |
79 if (!display_source.empty()) { | 65 if (!display_source.empty()) { |
80 AddItem(kTogglePermissionCommand, | 66 AddItem(kTogglePermissionCommand, |
81 l10n_util::GetStringFUTF16(IDS_MESSAGE_CENTER_NOTIFIER_DISABLE, | 67 l10n_util::GetStringFUTF16(IDS_MESSAGE_CENTER_NOTIFIER_DISABLE, |
82 display_source)); | 68 display_source)); |
83 } | 69 } |
84 // Add settings menu item. | 70 // Add settings menu item. |
85 AddItem(kShowSettingsCommand, | 71 AddItem(kShowSettingsCommand, |
86 l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_SETTINGS)); | 72 l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_SETTINGS)); |
87 } | 73 } |
(...skipping 14 matching lines...) Expand all Loading... |
102 } | 88 } |
103 | 89 |
104 bool MenuModel::GetAcceleratorForCommandId(int command_id, | 90 bool MenuModel::GetAcceleratorForCommandId(int command_id, |
105 ui::Accelerator* accelerator) { | 91 ui::Accelerator* accelerator) { |
106 return false; | 92 return false; |
107 } | 93 } |
108 | 94 |
109 void MenuModel::ExecuteCommand(int command_id, int event_flags) { | 95 void MenuModel::ExecuteCommand(int command_id, int event_flags) { |
110 switch (command_id) { | 96 switch (command_id) { |
111 case kTogglePermissionCommand: | 97 case kTogglePermissionCommand: |
112 message_center_->DisableNotificationsByNotifier(notifier_id_); | 98 message_view_->DisableNotificationsFromThisSource(); |
113 break; | 99 break; |
114 case kShowSettingsCommand: | 100 case kShowSettingsCommand: |
115 // |tray_| may be NULL in tests. | 101 message_view_->ShowNotifierSettingsBubble(); |
116 if (tray_) | |
117 tray_->ShowNotifierSettingsBubble(); | |
118 break; | 102 break; |
119 default: | 103 default: |
120 NOTREACHED(); | 104 NOTREACHED(); |
121 } | 105 } |
122 } | 106 } |
123 | 107 |
124 } // namespace | 108 } // namespace |
125 | 109 |
126 namespace message_center { | 110 namespace message_center { |
127 | 111 |
128 class MessageViewContextMenuController : public views::ContextMenuController { | 112 class MessageViewContextMenuController : public views::ContextMenuController { |
129 public: | 113 public: |
130 MessageViewContextMenuController( | 114 MessageViewContextMenuController(MessageView* message_view, |
131 MessageCenter* message_center, | 115 const string16& display_source); |
132 MessageCenterTray* tray, | |
133 const Notification& notification); | |
134 virtual ~MessageViewContextMenuController(); | 116 virtual ~MessageViewContextMenuController(); |
135 | 117 |
136 protected: | 118 protected: |
137 // Overridden from views::ContextMenuController: | 119 // Overridden from views::ContextMenuController: |
138 virtual void ShowContextMenuForView(views::View* source, | 120 virtual void ShowContextMenuForView(views::View* source, |
139 const gfx::Point& point, | 121 const gfx::Point& point, |
140 ui::MenuSourceType source_type) OVERRIDE; | 122 ui::MenuSourceType source_type) OVERRIDE; |
141 | 123 |
142 MessageCenter* message_center_; // Weak reference. | 124 MessageView* message_view_; // Weak, owns us. |
143 MessageCenterTray* tray_; // Weak reference. | |
144 std::string notification_id_; | |
145 string16 display_source_; | 125 string16 display_source_; |
146 NotifierId notifier_id_; | |
147 }; | 126 }; |
148 | 127 |
149 MessageViewContextMenuController::MessageViewContextMenuController( | 128 MessageViewContextMenuController::MessageViewContextMenuController( |
150 MessageCenter* message_center, | 129 MessageView* message_view, |
151 MessageCenterTray* tray, | 130 const string16& display_source) |
152 const Notification& notification) | 131 : message_view_(message_view), |
153 : message_center_(message_center), | 132 display_source_(display_source) { |
154 tray_(tray), | |
155 notification_id_(notification.id()), | |
156 display_source_(notification.display_source()), | |
157 notifier_id_(notification.notifier_id()) { | |
158 } | 133 } |
159 | 134 |
160 MessageViewContextMenuController::~MessageViewContextMenuController() { | 135 MessageViewContextMenuController::~MessageViewContextMenuController() { |
161 } | 136 } |
162 | 137 |
163 void MessageViewContextMenuController::ShowContextMenuForView( | 138 void MessageViewContextMenuController::ShowContextMenuForView( |
164 views::View* source, | 139 views::View* source, |
165 const gfx::Point& point, | 140 const gfx::Point& point, |
166 ui::MenuSourceType source_type) { | 141 ui::MenuSourceType source_type) { |
167 MenuModel menu_model(message_center_, tray_, notification_id_, | 142 MenuModel menu_model(message_view_, display_source_); |
168 display_source_, notifier_id_); | |
169 if (menu_model.GetItemCount() == 0) | 143 if (menu_model.GetItemCount() == 0) |
170 return; | 144 return; |
171 | 145 |
172 views::MenuRunner menu_runner(&menu_model); | 146 views::MenuRunner menu_runner(&menu_model); |
173 | 147 |
174 ignore_result(menu_runner.RunMenuAt( | 148 ignore_result(menu_runner.RunMenuAt( |
175 source->GetWidget()->GetTopLevelWidget(), | 149 source->GetWidget()->GetTopLevelWidget(), |
176 NULL, | 150 NULL, |
177 gfx::Rect(point, gfx::Size()), | 151 gfx::Rect(point, gfx::Size()), |
178 views::MenuItemView::TOPRIGHT, | 152 views::MenuItemView::TOPRIGHT, |
179 source_type, | 153 source_type, |
180 views::MenuRunner::HAS_MNEMONICS)); | 154 views::MenuRunner::HAS_MNEMONICS)); |
181 } | 155 } |
182 | 156 |
183 MessageView::MessageView(const Notification& notification, | 157 MessageView::MessageView(const string16& display_source) |
184 MessageCenter* message_center, | 158 : context_menu_controller_( |
185 MessageCenterTray* tray) | 159 new MessageViewContextMenuController(this, display_source)), |
186 : message_center_(message_center), | |
187 notification_id_(notification.id()), | |
188 context_menu_controller_(new MessageViewContextMenuController( | |
189 message_center, tray, notification)), | |
190 scroller_(NULL) { | 160 scroller_(NULL) { |
191 set_focusable(true); | 161 set_focusable(true); |
192 set_context_menu_controller(context_menu_controller_.get()); | 162 set_context_menu_controller(context_menu_controller_.get()); |
193 | 163 |
194 PaddedButton *close = new PaddedButton(this); | 164 PaddedButton *close = new PaddedButton(this); |
195 close->SetPadding(-kCloseIconRightPadding, kCloseIconTopPadding); | 165 close->SetPadding(-kCloseIconRightPadding, kCloseIconTopPadding); |
196 close->SetNormalImage(IDR_NOTIFICATION_CLOSE); | 166 close->SetNormalImage(IDR_NOTIFICATION_CLOSE); |
197 close->SetHoveredImage(IDR_NOTIFICATION_CLOSE_HOVER); | 167 close->SetHoveredImage(IDR_NOTIFICATION_CLOSE_HOVER); |
198 close->SetPressedImage(IDR_NOTIFICATION_CLOSE_PRESSED); | 168 close->SetPressedImage(IDR_NOTIFICATION_CLOSE_PRESSED); |
199 close->set_owned_by_client(); | 169 close->set_owned_by_client(); |
200 close->set_animate_on_state_change(false); | 170 close->set_animate_on_state_change(false); |
201 close->SetAccessibleName(l10n_util::GetStringUTF16( | 171 close->SetAccessibleName(l10n_util::GetStringUTF16( |
202 IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME)); | 172 IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME)); |
203 close_button_.reset(close); | 173 close_button_.reset(close); |
204 } | 174 } |
205 | 175 |
206 MessageView::MessageView() { | |
207 } | |
208 | |
209 MessageView::~MessageView() { | 176 MessageView::~MessageView() { |
210 } | 177 } |
211 | 178 |
212 // static | 179 // static |
213 gfx::Insets MessageView::GetShadowInsets() { | 180 gfx::Insets MessageView::GetShadowInsets() { |
214 return gfx::Insets(kShadowBlur / 2 - kShadowOffset, | 181 return gfx::Insets(kShadowBlur / 2 - kShadowOffset, |
215 kShadowBlur / 2, | 182 kShadowBlur / 2, |
216 kShadowBlur / 2 + kShadowOffset, | 183 kShadowBlur / 2 + kShadowOffset, |
217 kShadowBlur / 2); | 184 kShadowBlur / 2); |
218 } | 185 } |
(...skipping 13 matching lines...) Expand all Loading... |
232 void MessageView::RequestFocusOnCloseButton() { | 199 void MessageView::RequestFocusOnCloseButton() { |
233 close_button_->RequestFocus(); | 200 close_button_->RequestFocus(); |
234 } | 201 } |
235 | 202 |
236 void MessageView::GetAccessibleState(ui::AccessibleViewState* state) { | 203 void MessageView::GetAccessibleState(ui::AccessibleViewState* state) { |
237 state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON; | 204 state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON; |
238 state->name = accessible_name_; | 205 state->name = accessible_name_; |
239 } | 206 } |
240 | 207 |
241 bool MessageView::OnMousePressed(const ui::MouseEvent& event) { | 208 bool MessageView::OnMousePressed(const ui::MouseEvent& event) { |
242 if (event.IsOnlyLeftMouseButton()) { | 209 if (!event.IsOnlyLeftMouseButton()) |
243 message_center_->ClickOnNotification(notification_id_); | 210 return false; |
244 return true; | 211 |
245 } | 212 ClickOnNotification(); |
246 return false; | 213 return true; |
247 } | 214 } |
248 | 215 |
249 bool MessageView::OnKeyPressed(const ui::KeyEvent& event) { | 216 bool MessageView::OnKeyPressed(const ui::KeyEvent& event) { |
250 if (event.flags() != ui::EF_NONE) | 217 if (event.flags() != ui::EF_NONE) |
251 return false; | 218 return false; |
252 | 219 |
253 if (event.key_code() == ui::VKEY_RETURN) { | 220 if (event.key_code() == ui::VKEY_RETURN) { |
254 message_center_->ClickOnNotification(notification_id_); | 221 ClickOnNotification(); |
255 return true; | 222 return true; |
256 } else if ((event.key_code() == ui::VKEY_DELETE || | 223 } else if ((event.key_code() == ui::VKEY_DELETE || |
257 event.key_code() == ui::VKEY_BACK)) { | 224 event.key_code() == ui::VKEY_BACK)) { |
258 message_center_->RemoveNotification(notification_id_, true); // By user. | 225 RemoveNotification(true); // By user. |
259 return true; | 226 return true; |
260 } | 227 } |
261 | 228 |
262 return false; | 229 return false; |
263 } | 230 } |
264 | 231 |
265 bool MessageView::OnKeyReleased(const ui::KeyEvent& event) { | 232 bool MessageView::OnKeyReleased(const ui::KeyEvent& event) { |
266 // Space key handling is triggerred at key-release timing. See | 233 // Space key handling is triggerred at key-release timing. See |
267 // ui/views/controls/buttons/custom_button.cc for why. | 234 // ui/views/controls/buttons/custom_button.cc for why. |
268 if (event.flags() != ui::EF_NONE || event.flags() != ui::VKEY_SPACE) | 235 if (event.flags() != ui::EF_NONE || event.flags() != ui::VKEY_SPACE) |
269 return false; | 236 return false; |
270 | 237 |
271 message_center_->ClickOnNotification(notification_id_); | 238 ClickOnNotification(); |
272 return true; | 239 return true; |
273 } | 240 } |
274 | 241 |
275 void MessageView::OnGestureEvent(ui::GestureEvent* event) { | 242 void MessageView::OnGestureEvent(ui::GestureEvent* event) { |
276 if (event->type() == ui::ET_GESTURE_TAP) { | 243 if (event->type() == ui::ET_GESTURE_TAP) { |
277 message_center_->ClickOnNotification(notification_id_); | 244 ClickOnNotification(); |
278 event->SetHandled(); | 245 event->SetHandled(); |
279 return; | 246 return; |
280 } | 247 } |
281 | 248 |
282 SlideOutView::OnGestureEvent(event); | 249 SlideOutView::OnGestureEvent(event); |
283 // Do not return here by checking handled(). SlideOutView calls SetHandled() | 250 // Do not return here by checking handled(). SlideOutView calls SetHandled() |
284 // even though the scroll gesture doesn't make no (or little) effects on the | 251 // even though the scroll gesture doesn't make no (or little) effects on the |
285 // slide-out behavior. See http://crbug.com/172991 | 252 // slide-out behavior. See http://crbug.com/172991 |
286 | 253 |
287 if (!event->IsScrollGestureEvent() && !event->IsFlingScrollEvent()) | 254 if (!event->IsScrollGestureEvent() && !event->IsFlingScrollEvent()) |
288 return; | 255 return; |
289 | 256 |
290 if (scroller_) | 257 if (scroller_) |
291 scroller_->OnGestureEvent(event); | 258 scroller_->OnGestureEvent(event); |
292 event->SetHandled(); | 259 event->SetHandled(); |
293 } | 260 } |
294 | 261 |
295 void MessageView::OnPaintFocusBorder(gfx::Canvas* canvas) { | 262 void MessageView::OnPaintFocusBorder(gfx::Canvas* canvas) { |
296 if (HasFocus()) { | 263 if (HasFocus()) { |
297 canvas->DrawRect(gfx::Rect(1, 0, width() - 2, height() - 2), | 264 canvas->DrawRect(gfx::Rect(1, 0, width() - 2, height() - 2), |
298 message_center::kFocusBorderColor); | 265 message_center::kFocusBorderColor); |
299 } | 266 } |
300 } | 267 } |
301 | 268 |
302 void MessageView::ButtonPressed(views::Button* sender, | 269 void MessageView::ButtonPressed(views::Button* sender, |
303 const ui::Event& event) { | 270 const ui::Event& event) { |
304 if (sender == close_button()) { | 271 if (sender == close_button()) { |
305 message_center_->RemoveNotification(notification_id_, true); // By user. | 272 RemoveNotification(true); // By user. |
306 } | 273 } |
307 } | 274 } |
308 | 275 |
309 void MessageView::OnSlideOut() { | 276 void MessageView::OnSlideOut() { |
310 message_center_->RemoveNotification(notification_id_, true); // By user. | 277 RemoveNotification(true); // By user. |
311 } | 278 } |
312 | 279 |
313 } // namespace message_center | 280 } // namespace message_center |
OLD | NEW |