blob: acb9edcf28f7ff1df630a3c127d10986889466b4 [file] [log] [blame]
// Copyright (c) 2013 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 "chrome/browser/ui/cocoa/notifications/message_center_tray_bridge.h"
#include "base/bind.h"
#include "base/i18n/number_formatting.h"
#include "base/message_loop/message_loop.h"
#include "chrome/browser/browser_process.h"
#include "grit/chromium_strings.h"
#include "grit/generated_resources.h"
#include "grit/ui_strings.h"
#include "ui/base/l10n/l10n_util.h"
#import "ui/base/l10n/l10n_util_mac.h"
#import "ui/message_center/cocoa/popup_collection.h"
#import "ui/message_center/cocoa/status_item_view.h"
#import "ui/message_center/cocoa/tray_controller.h"
#import "ui/message_center/cocoa/tray_view_controller.h"
#include "ui/message_center/message_center.h"
#include "ui/message_center/message_center_tray.h"
namespace message_center {
MessageCenterTrayDelegate* CreateMessageCenterTray() {
return new MessageCenterTrayBridge(g_browser_process->message_center());
}
} // namespace message_center
MessageCenterTrayBridge::MessageCenterTrayBridge(
message_center::MessageCenter* message_center)
: message_center_(message_center),
tray_(new message_center::MessageCenterTray(this, message_center)),
weak_ptr_factory_(this) {
}
MessageCenterTrayBridge::~MessageCenterTrayBridge() {
[status_item_view_ removeItem];
}
void MessageCenterTrayBridge::OnMessageCenterTrayChanged() {
// Update the status item on the next run of the message loop so that if a
// popup is displayed, the item doesn't flash the unread count.
base::MessageLoop::current()->PostTask(FROM_HERE,
base::Bind(&MessageCenterTrayBridge::UpdateStatusItem,
weak_ptr_factory_.GetWeakPtr()));
[tray_controller_ onMessageCenterTrayChanged];
}
bool MessageCenterTrayBridge::ShowPopups() {
popup_collection_.reset(
[[MCPopupCollection alloc] initWithMessageCenter:message_center_]);
return true;
}
void MessageCenterTrayBridge::HidePopups() {
popup_collection_.reset();
}
bool MessageCenterTrayBridge::ShowMessageCenter() {
if (tray_controller_)
return false;
OpenTrayWindow();
return true;
}
void MessageCenterTrayBridge::HideMessageCenter() {
[status_item_view_ setHighlight:NO];
[tray_controller_ close];
tray_controller_.autorelease();
UpdateStatusItem();
}
bool MessageCenterTrayBridge::ShowNotifierSettings() {
// This method needs to be implemented when the context menu of each
// notification is ready and it contains 'settings' menu item.
return false;
}
message_center::MessageCenterTray*
MessageCenterTrayBridge::GetMessageCenterTray() {
return tray_.get();
}
void MessageCenterTrayBridge::UpdateStatusItem() {
if (!status_item_view_) {
status_item_view_.reset([[MCStatusItemView alloc] init]);
[status_item_view_ setCallback:^{ tray_->ToggleMessageCenterBubble(); }];
}
// We want a static message center icon while it's visible.
if (message_center()->IsMessageCenterVisible())
return;
size_t unread_count = message_center_->UnreadNotificationCount();
bool quiet_mode = message_center_->IsQuietMode();
[status_item_view_ setUnreadCount:unread_count withQuietMode:quiet_mode];
if (unread_count > 0) {
string16 unread_count_string = base::FormatNumber(unread_count);
[status_item_view_ setToolTip:
l10n_util::GetNSStringF(IDS_MESSAGE_CENTER_TOOLTIP_UNREAD,
unread_count_string)];
} else {
[status_item_view_ setToolTip:
l10n_util::GetNSString(IDS_MESSAGE_CENTER_TOOLTIP)];
}
}
void MessageCenterTrayBridge::OpenTrayWindow() {
DCHECK(!tray_controller_);
tray_controller_.reset(
[[MCTrayController alloc] initWithMessageCenterTray:tray_.get()]);
[[tray_controller_ viewController] setTrayTitle:
l10n_util::GetNSStringF(IDS_MESSAGE_CENTER_FOOTER_WITH_PRODUCT_TITLE,
l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME))];
UpdateStatusItem();
[status_item_view_ setHighlight:YES];
NSRect frame = [[status_item_view_ window] frame];
[tray_controller_ showTrayAtRightOf:NSMakePoint(NSMinX(frame),
NSMinY(frame))
atLeftOf:NSMakePoint(NSMaxX(frame),
NSMinY(frame))];
}