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

Side by Side Diff: ash/system/web_notification/web_notification_tray.cc

Issue 369573004: Separate the logic of popup alignment and workarea handling as delegate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix Created 6 years, 5 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/web_notification/web_notification_tray.h" 5 #include "ash/system/web_notification/web_notification_tray.h"
6 6
7 #include "ash/ash_switches.h" 7 #include "ash/ash_switches.h"
8 #include "ash/root_window_controller.h" 8 #include "ash/root_window_controller.h"
9 #include "ash/shelf/shelf_layout_manager.h" 9 #include "ash/shelf/shelf_layout_manager.h"
10 #include "ash/shelf/shelf_layout_manager_observer.h" 10 #include "ash/shelf/shelf_layout_manager_observer.h"
11 #include "ash/shelf/shelf_widget.h" 11 #include "ash/shelf/shelf_widget.h"
12 #include "ash/shell.h" 12 #include "ash/shell.h"
13 #include "ash/shell_window_ids.h" 13 #include "ash/shell_window_ids.h"
14 #include "ash/system/status_area_widget.h" 14 #include "ash/system/status_area_widget.h"
15 #include "ash/system/tray/system_tray.h" 15 #include "ash/system/tray/system_tray.h"
16 #include "ash/system/tray/tray_background_view.h" 16 #include "ash/system/tray/tray_background_view.h"
17 #include "ash/system/tray/tray_bubble_wrapper.h" 17 #include "ash/system/tray/tray_bubble_wrapper.h"
18 #include "ash/system/tray/tray_constants.h" 18 #include "ash/system/tray/tray_constants.h"
19 #include "ash/system/tray/tray_utils.h" 19 #include "ash/system/tray/tray_utils.h"
20 #include "ash/system/web_notification/ash_popup_alignment_delegate.h"
20 #include "base/auto_reset.h" 21 #include "base/auto_reset.h"
21 #include "base/i18n/number_formatting.h" 22 #include "base/i18n/number_formatting.h"
22 #include "base/i18n/rtl.h" 23 #include "base/i18n/rtl.h"
23 #include "base/strings/utf_string_conversions.h" 24 #include "base/strings/utf_string_conversions.h"
24 #include "grit/ash_strings.h" 25 #include "grit/ash_strings.h"
25 #include "grit/ui_strings.h" 26 #include "grit/ui_strings.h"
26 #include "ui/aura/window.h" 27 #include "ui/aura/window.h"
27 #include "ui/aura/window_event_dispatcher.h" 28 #include "ui/aura/window_event_dispatcher.h"
28 #include "ui/base/l10n/l10n_util.h" 29 #include "ui/base/l10n/l10n_util.h"
29 #include "ui/gfx/screen.h" 30 #include "ui/gfx/screen.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 } 64 }
64 65
65 namespace { 66 namespace {
66 67
67 const SkColor kWebNotificationColorNoUnread = 68 const SkColor kWebNotificationColorNoUnread =
68 SkColorSetARGB(128, 255, 255, 255); 69 SkColorSetARGB(128, 255, 255, 255);
69 const SkColor kWebNotificationColorWithUnread = SK_ColorWHITE; 70 const SkColor kWebNotificationColorWithUnread = SK_ColorWHITE;
70 71
71 } 72 }
72 73
73 // Observes the change of work area (including temporary change by auto-hide)
74 // and notifies MessagePopupCollection.
75 class WorkAreaObserver : public ShelfLayoutManagerObserver,
76 public ShellObserver {
77 public:
78 WorkAreaObserver();
79 virtual ~WorkAreaObserver();
80
81 void SetSystemTrayHeight(int height);
82
83 // Starts observing |shelf| and shell and sends the change to |collection|.
84 void StartObserving(message_center::MessagePopupCollection* collection,
85 aura::Window* root_window);
86
87 // Stops the observing session.
88 void StopObserving();
89
90 // Overridden from ShellObserver:
91 virtual void OnDisplayWorkAreaInsetsChanged() OVERRIDE;
92
93 // Overridden from ShelfLayoutManagerObserver:
94 virtual void OnAutoHideStateChanged(ShelfAutoHideState new_state) OVERRIDE;
95
96 private:
97 // Updates |shelf_| from |root_window_|.
98 void UpdateShelf();
99
100 message_center::MessagePopupCollection* collection_;
101 aura::Window* root_window_;
102 ShelfLayoutManager* shelf_;
103 int system_tray_height_;
104
105 DISALLOW_COPY_AND_ASSIGN(WorkAreaObserver);
106 };
107
108 WorkAreaObserver::WorkAreaObserver()
109 : collection_(NULL),
110 root_window_(NULL),
111 shelf_(NULL),
112 system_tray_height_(0) {
113 }
114
115 WorkAreaObserver::~WorkAreaObserver() {
116 StopObserving();
117 }
118
119 void WorkAreaObserver::SetSystemTrayHeight(int height) {
120 system_tray_height_ = height;
121
122 // If the shelf is shown during auto-hide state, the distance from the edge
123 // should be reduced by the height of shelf's shown height.
124 if (shelf_ && shelf_->visibility_state() == SHELF_AUTO_HIDE &&
125 shelf_->auto_hide_state() == SHELF_AUTO_HIDE_SHOWN) {
126 system_tray_height_ -= kShelfSize - ShelfLayoutManager::kAutoHideSize;
127 }
128
129 if (system_tray_height_ > 0)
130 system_tray_height_ += message_center::kMarginBetweenItems;
131
132 if (!shelf_)
133 return;
134
135 OnAutoHideStateChanged(shelf_->auto_hide_state());
136 }
137
138 void WorkAreaObserver::StartObserving(
139 message_center::MessagePopupCollection* collection,
140 aura::Window* root_window) {
141 DCHECK(collection);
142 collection_ = collection;
143 root_window_ = root_window;
144 UpdateShelf();
145 Shell::GetInstance()->AddShellObserver(this);
146 if (system_tray_height_ > 0)
147 OnAutoHideStateChanged(shelf_->auto_hide_state());
148 }
149
150 void WorkAreaObserver::StopObserving() {
151 Shell::GetInstance()->RemoveShellObserver(this);
152 if (shelf_)
153 shelf_->RemoveObserver(this);
154 collection_ = NULL;
155 shelf_ = NULL;
156 }
157
158 void WorkAreaObserver::OnDisplayWorkAreaInsetsChanged() {
159 UpdateShelf();
160
161 collection_->OnDisplayMetricsChanged(
162 Shell::GetScreen()->GetDisplayNearestWindow(
163 shelf_->shelf_widget()->GetNativeView()),
164 gfx::DisplayObserver::DISPLAY_METRIC_WORK_AREA);
165 }
166
167 void WorkAreaObserver::OnAutoHideStateChanged(ShelfAutoHideState new_state) {
168 gfx::Display display = Shell::GetScreen()->GetDisplayNearestWindow(
169 shelf_->shelf_widget()->GetNativeView());
170 gfx::Rect work_area = display.work_area();
171 int width = 0;
172 if ((shelf_->visibility_state() == SHELF_AUTO_HIDE) &&
173 new_state == SHELF_AUTO_HIDE_SHOWN) {
174 // Since the work_area is already reduced by kAutoHideSize, the inset width
175 // should be just the difference.
176 width = kShelfSize - ShelfLayoutManager::kAutoHideSize;
177 }
178 work_area.Inset(shelf_->SelectValueForShelfAlignment(
179 gfx::Insets(0, 0, width, 0),
180 gfx::Insets(0, width, 0, 0),
181 gfx::Insets(0, 0, 0, width),
182 gfx::Insets(width, 0, 0, 0)));
183 if (system_tray_height_ > 0) {
184 work_area.set_height(
185 std::max(0, work_area.height() - system_tray_height_));
186 if (shelf_->GetAlignment() == SHELF_ALIGNMENT_TOP)
187 work_area.set_y(work_area.y() + system_tray_height_);
188 }
189 collection_->SetDisplayInfo(work_area, display.bounds());
190 }
191
192 void WorkAreaObserver::UpdateShelf() {
193 if (shelf_)
194 return;
195
196 shelf_ = ShelfLayoutManager::ForShelf(root_window_);
197 if (shelf_)
198 shelf_->AddObserver(this);
199 }
200
201 // Class to initialize and manage the WebNotificationBubble and 74 // Class to initialize and manage the WebNotificationBubble and
202 // TrayBubbleWrapper instances for a bubble. 75 // TrayBubbleWrapper instances for a bubble.
203 class WebNotificationBubbleWrapper { 76 class WebNotificationBubbleWrapper {
204 public: 77 public:
205 // Takes ownership of |bubble| and creates |bubble_wrapper_|. 78 // Takes ownership of |bubble| and creates |bubble_wrapper_|.
206 WebNotificationBubbleWrapper(WebNotificationTray* tray, 79 WebNotificationBubbleWrapper(WebNotificationTray* tray,
207 message_center::MessageBubbleBase* bubble) { 80 message_center::MessageBubbleBase* bubble) {
208 bubble_.reset(bubble); 81 bubble_.reset(bubble);
209 views::TrayBubbleView::AnchorAlignment anchor_alignment = 82 views::TrayBubbleView::AnchorAlignment anchor_alignment =
210 tray->GetAnchorAlignment(); 83 tray->GetAnchorAlignment();
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 should_block_shelf_auto_hide_(false) { 174 should_block_shelf_auto_hide_(false) {
302 button_ = new WebNotificationButton(this); 175 button_ = new WebNotificationButton(this);
303 button_->set_triggerable_event_flags( 176 button_->set_triggerable_event_flags(
304 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_RIGHT_MOUSE_BUTTON); 177 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_RIGHT_MOUSE_BUTTON);
305 tray_container()->AddChildView(button_); 178 tray_container()->AddChildView(button_);
306 SetContentsBackground(); 179 SetContentsBackground();
307 tray_container()->SetBorder(views::Border::NullBorder()); 180 tray_container()->SetBorder(views::Border::NullBorder());
308 message_center_tray_.reset(new message_center::MessageCenterTray( 181 message_center_tray_.reset(new message_center::MessageCenterTray(
309 this, 182 this,
310 message_center::MessageCenter::Get())); 183 message_center::MessageCenter::Get()));
184 popup_alignment_delegate_.reset(new AshPopupAlignmentDelegate());
311 popup_collection_.reset(new message_center::MessagePopupCollection( 185 popup_collection_.reset(new message_center::MessagePopupCollection(
312 ash::Shell::GetContainer( 186 ash::Shell::GetContainer(
313 status_area_widget->GetNativeView()->GetRootWindow(), 187 status_area_widget->GetNativeView()->GetRootWindow(),
314 kShellWindowId_StatusContainer), 188 kShellWindowId_StatusContainer),
315 message_center(), 189 message_center(),
316 message_center_tray_.get(), 190 message_center_tray_.get(),
317 true)); 191 popup_alignment_delegate_.get()));
318 work_area_observer_.reset(new WorkAreaObserver()); 192 const gfx::Display& display = Shell::GetScreen()->GetDisplayNearestWindow(
319 work_area_observer_->StartObserving( 193 status_area_widget->GetNativeView());
320 popup_collection_.get(), 194 popup_alignment_delegate_->StartObserving(Shell::GetScreen(), display);
321 status_area_widget->GetNativeView()->GetRootWindow());
322 OnMessageCenterTrayChanged(); 195 OnMessageCenterTrayChanged();
323 } 196 }
324 197
325 WebNotificationTray::~WebNotificationTray() { 198 WebNotificationTray::~WebNotificationTray() {
326 // Release any child views that might have back pointers before ~View(). 199 // Release any child views that might have back pointers before ~View().
327 message_center_bubble_.reset(); 200 message_center_bubble_.reset();
201 popup_alignment_delegate_.reset();
328 popup_collection_.reset(); 202 popup_collection_.reset();
329 work_area_observer_.reset();
330 } 203 }
331 204
332 // Public methods. 205 // Public methods.
333 206
334 bool WebNotificationTray::ShowMessageCenterInternal(bool show_settings) { 207 bool WebNotificationTray::ShowMessageCenterInternal(bool show_settings) {
335 if (!ShouldShowMessageCenter()) 208 if (!ShouldShowMessageCenter())
336 return false; 209 return false;
337 210
338 should_block_shelf_auto_hide_ = true; 211 should_block_shelf_auto_hide_ = true;
339 message_center::MessageCenterBubble* message_center_bubble = 212 message_center::MessageCenterBubble* message_center_bubble =
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 SetDrawBackgroundAsActive(false); 264 SetDrawBackgroundAsActive(false);
392 message_center_bubble_.reset(); 265 message_center_bubble_.reset();
393 should_block_shelf_auto_hide_ = false; 266 should_block_shelf_auto_hide_ = false;
394 show_message_center_on_unlock_ = false; 267 show_message_center_on_unlock_ = false;
395 status_area_widget()->SetHideSystemNotifications(false); 268 status_area_widget()->SetHideSystemNotifications(false);
396 GetShelfLayoutManager()->UpdateAutoHideState(); 269 GetShelfLayoutManager()->UpdateAutoHideState();
397 button_->SetBubbleVisible(false); 270 button_->SetBubbleVisible(false);
398 } 271 }
399 272
400 void WebNotificationTray::SetSystemTrayHeight(int height) { 273 void WebNotificationTray::SetSystemTrayHeight(int height) {
401 work_area_observer_->SetSystemTrayHeight(height); 274 popup_alignment_delegate_->SetSystemTrayHeight(height);
402 } 275 }
403 276
404 bool WebNotificationTray::ShowPopups() { 277 bool WebNotificationTray::ShowPopups() {
405 if (message_center_bubble()) 278 if (message_center_bubble())
406 return false; 279 return false;
407 280
408 popup_collection_->DoUpdateIfPossible(); 281 popup_collection_->DoUpdateIfPossible();
409 return true; 282 return true;
410 } 283 }
411 284
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 485
613 message_center::MessageCenterBubble* 486 message_center::MessageCenterBubble*
614 WebNotificationTray::GetMessageCenterBubbleForTest() { 487 WebNotificationTray::GetMessageCenterBubbleForTest() {
615 if (!message_center_bubble()) 488 if (!message_center_bubble())
616 return NULL; 489 return NULL;
617 return static_cast<message_center::MessageCenterBubble*>( 490 return static_cast<message_center::MessageCenterBubble*>(
618 message_center_bubble()->bubble()); 491 message_center_bubble()->bubble());
619 } 492 }
620 493
621 } // namespace ash 494 } // namespace ash
OLDNEW
« no previous file with comments | « ash/system/web_notification/web_notification_tray.h ('k') | ash/system/web_notification/web_notification_tray_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698