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

Unified Diff: ui/message_center/message_center_tray.cc

Issue 11819048: Implement message center on Windows (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase on master @fa1d2262 and rearrange dependencies. Created 7 years, 11 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
Index: ui/message_center/message_center_tray.cc
diff --git a/ui/message_center/message_center_tray.cc b/ui/message_center/message_center_tray.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9db7e07ebc45b6011b9f8752eeb4669d0a5ed88f
--- /dev/null
+++ b/ui/message_center/message_center_tray.cc
@@ -0,0 +1,270 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/message_center/message_center_tray.h"
+
+#include "base/memory/singleton.h"
+#include "base/utf_string_conversions.h"
+#include "ui/message_center/message_center_bubble.h"
+#include "ui/message_center/message_popup_bubble.h"
+#include "ui/views/bubble/tray_bubble_view.h"
+#include "ui/views/widget/widget.h"
+
+namespace {
+
+// Helper class that owns the MessageBubbleBase and listens to widget closing
+// events.
+class WebNotificationBubbleWrapper : public views::WidgetObserver {
+ public:
+ WebNotificationBubbleWrapper(
+ ui::MessageCenterTray* tray,
+ message_center::MessageBubbleBase* bubble,
+ views::TrayBubbleView::InitParams init_params,
+ gfx::NativeWindow bubble_window_container,
+ views::View* anchor_view);
+ virtual ~WebNotificationBubbleWrapper();
+ // Convenience accessors.
+ message_center::MessageBubbleBase* message_bubble() const {
+ return message_bubble_.get();
+ }
+ views::TrayBubbleView* bubble_view() const {
+ return message_bubble_->bubble_view();
+ }
+ bool IsMessageBubbleVisible();
+
+ // views::WidgetObserver overrides:
+ virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE;
+
+ private:
+ scoped_ptr<message_center::MessageBubbleBase> message_bubble_;
+ views::TrayBubbleView* bubble_view_; // unowned
+ views::Widget* bubble_widget_;
+ ui::MessageCenterTray* tray_;
+ DISALLOW_COPY_AND_ASSIGN(WebNotificationBubbleWrapper);
+};
+
+WebNotificationBubbleWrapper::WebNotificationBubbleWrapper(
+ ui::MessageCenterTray* tray,
+ message_center::MessageBubbleBase* bubble,
+ views::TrayBubbleView::InitParams init_params,
+ gfx::NativeWindow bubble_window_container,
+ views::View* anchor_view) :
+ tray_(tray) {
+ message_bubble_.reset(bubble);
+
+ init_params.close_on_deactivate = false;
+ init_params.anchor_type = views::TrayBubbleView::ANCHOR_TYPE_TRAY;
+
+ bubble_view_ = views::TrayBubbleView::Create(
+ bubble_window_container,
+ anchor_view,
+ tray_,
+ &init_params);
+
+ bubble_widget_ = views::BubbleDelegateView::CreateBubble(bubble_view_);
+ bubble_widget_->AddObserver(this);
+ bubble_widget_->StackAtTop();
+ bubble_widget_->SetAlwaysOnTop(true);
+ bubble_widget_->Activate();
+
+ bubble_view_->InitializeAndShowBubble();
+
+ bubble_view_->set_close_on_deactivate(true);
+ bubble->InitializeContents(bubble_view_);
+}
+
+WebNotificationBubbleWrapper::~WebNotificationBubbleWrapper() {
+ if (bubble_widget_) {
+ bubble_widget_->RemoveObserver(this);
+ bubble_widget_->Close();
+ }
+}
+
+void WebNotificationBubbleWrapper::OnWidgetClosing(
+ views::Widget* widget) {
+ if (widget == bubble_widget_) {
+ bubble_widget_->RemoveObserver(this);
+ bubble_widget_->Close();
+ if (bubble_view_) {
+ tray_->HideBubble(bubble_view_);
+ }
+ }
+}
+
+} // namespace
+
+namespace ui {
+
+MessageCenterTray::MessageCenterTray(MessageCenterTrayHost* host)
+ : host_(host) {
+ message_center_ = new message_center::MessageCenter();
+ message_center_->AddObserver(this);
+}
+
+MessageCenterTray::~MessageCenterTray() {
+ message_center_->RemoveObserver(this);
+ popup_bubble_.reset();
+}
+
+void MessageCenterTray::ShowMessageCenterBubble() {
+ if (message_center_bubble_.get())
+ return;
+
+ host_->OnShowMessageCenterBubble();
+
+ message_center_->SetMessageCenterVisible(true);
+ OnChanged();
+ HidePopupBubble();
+
+ message_center::MessageCenterBubble* bubble =
+ new message_center::MessageCenterBubble(message_center_);
+ // Delegate to the host to find the system-specific anchor alignment, and to
+ // modify the InitParams as necessary.
+ views::TrayBubbleView::AnchorAlignment alignment =
+ host_->GetAnchorAlignment();
+ views::TrayBubbleView::InitParams init_params =
+ bubble->GetInitParams(alignment);
+ host_->UpdateInitParams(&init_params);
+ message_center_bubble_.reset(new WebNotificationBubbleWrapper(
+ this,
+ bubble,
+ init_params,
+ host_->GetBubbleWindowContainer(),
+ host_->GetAnchorView()));
+}
+
+bool MessageCenterTray::HideMessageCenterBubble() {
+ if (!message_center_bubble_.get())
+ return false;
+
+ host_->OnHideMessageCenterBubble();
+
+ message_center_bubble_.reset();
+ message_center_->SetMessageCenterVisible(false);
+ OnChanged();
+ return true;
+}
+
+void MessageCenterTray::ToggleMessageCenterBubble() {
+ if (message_center_bubble_.get()) {
+ HideMessageCenterBubble();
+ } else {
+ ShowMessageCenterBubble();
+ }
+}
+
+void MessageCenterTray::ShowPopupBubble() {
+ if (!host_->CanShowPopups())
+ return;
+ if (message_center_bubble_)
+ return;
+
+ OnChanged();
+
+ // If there is already a popup bubble, just update it.
+ if (popup_bubble_) {
+ popup_bubble_->message_bubble()->ScheduleUpdate();
+ return;
+ }
+ if (message_center_->HasPopupNotifications()) {
+ message_center::MessagePopupBubble* bubble =
+ new message_center::MessagePopupBubble(message_center_);
+ views::TrayBubbleView::AnchorAlignment alignment =
+ host_->GetAnchorAlignment();
+ views::TrayBubbleView::InitParams init_params =
+ bubble->GetInitParams(alignment);
+ host_->UpdateInitParams(&init_params);
+
+ // Delegate to the host to find the system-specific anchor alignment, and to
+ // modify the InitParams as necessary.
+ popup_bubble_.reset(new WebNotificationBubbleWrapper(
+ this,
+ bubble,
+ init_params,
+ host_->GetBubbleWindowContainer(),
+ host_->GetAnchorView()));
+ bubble->ScheduleUpdate();
+ }
+}
+
+bool MessageCenterTray::HidePopupBubble() {
+ if (!popup_bubble_.get())
+ return false;
+ popup_bubble_.reset();
+ return true;
+}
+
+views::TrayBubbleView* MessageCenterTray::GetPopupBubbleView() {
+ if (popup_bubble_.get())
+ return popup_bubble_->bubble_view();
+ return NULL;
+}
+
+views::TrayBubbleView* MessageCenterTray::GetMessageCenterBubbleView() {
+ if (message_center_bubble_.get())
+ return message_center_bubble_->bubble_view();
+ return NULL;
+}
+
+void MessageCenterTray::BubbleViewDestroyed() {
+ if (message_center_bubble_.get())
+ message_center_bubble_->message_bubble()->BubbleViewDestroyed();
+ if (popup_bubble_.get())
+ popup_bubble_->message_bubble()->BubbleViewDestroyed();
+}
+
+void MessageCenterTray::OnMouseEnteredView() {
+ if (popup_bubble_.get())
+ popup_bubble_->message_bubble()->OnMouseEnteredView();
+}
+
+void MessageCenterTray::OnMouseExitedView() {
+ if (popup_bubble_.get())
+ popup_bubble_->message_bubble()->OnMouseExitedView();
+}
+
+string16 MessageCenterTray::GetAccessibleNameForBubble() {
+ return host_->GetAccessibleNameForBubble();
+}
+
+gfx::Rect MessageCenterTray::GetAnchorRect(views::Widget* anchor_widget,
+ AnchorType anchor_type,
+ AnchorAlignment anchor_alignment) {
+ return host_->GetAnchorRect(anchor_widget, anchor_type, anchor_alignment);
+}
+
+void MessageCenterTray::HideBubble(const views::TrayBubbleView* bubble_view) {
+ if (message_center_bubble_.get() &&
+ bubble_view == message_center_bubble_->bubble_view()) {
+ HideMessageCenterBubble();
+ } else if (popup_bubble_.get() &&
+ bubble_view == popup_bubble_->bubble_view()) {
+ HidePopupBubble();
+ }
+}
+
+void MessageCenterTray::OnMessageCenterChanged(bool new_notification) {
+ if (message_center_bubble_.get()) {
+ if (message_center_->NotificationCount() == 0)
+ HideMessageCenterBubble();
+ else
+ message_center_bubble_->message_bubble()->ScheduleUpdate();
+ }
+ if (popup_bubble_.get()) {
+ if (message_center_->NotificationCount() == 0)
+ HidePopupBubble();
+ else
+ popup_bubble_->message_bubble()->ScheduleUpdate();
+ }
+
+ OnChanged();
+ if (new_notification)
+ ShowPopupBubble();
+}
+
+void MessageCenterTray::OnChanged() {
+ host_->OnMessageCenterTrayChanged();
+}
+
+} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698