| Index: chrome/browser/cocoa/status_icons/status_icon_mac.mm
|
| diff --git a/chrome/browser/cocoa/status_icons/status_icon_mac.mm b/chrome/browser/cocoa/status_icons/status_icon_mac.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..201b6d4f97da293fcf600b574c9e14f45b2a4177
|
| --- /dev/null
|
| +++ b/chrome/browser/cocoa/status_icons/status_icon_mac.mm
|
| @@ -0,0 +1,95 @@
|
| +// Copyright (c) 2010 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/cocoa/status_icons/status_icon_mac.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/sys_string_conversions.h"
|
| +#include "skia/ext/skia_utils_mac.h"
|
| +#include "third_party/skia/include/core/SkBitmap.h"
|
| +
|
| +@interface StatusItemController : NSObject {
|
| + StatusIconMac* statusIcon_; // weak
|
| +}
|
| +- initWithIcon:(StatusIconMac*)icon;
|
| +- (void)handleClick:(id)sender;
|
| +
|
| +@end // @interface StatusItemController
|
| +
|
| +@implementation StatusItemController
|
| +
|
| +- (id)initWithIcon:(StatusIconMac*)icon {
|
| + statusIcon_ = icon;
|
| + return self;
|
| +}
|
| +
|
| +- (void)handleClick:(id)sender {
|
| + // Pass along the click notification to our owner.
|
| + DCHECK(statusIcon_);
|
| + statusIcon_->HandleClick();
|
| +}
|
| +
|
| +@end
|
| +
|
| +StatusIconMac::StatusIconMac()
|
| + : item_(NULL) {
|
| + controller_.reset([[StatusItemController alloc] initWithIcon:this]);
|
| +}
|
| +
|
| +StatusIconMac::~StatusIconMac() {
|
| + // Remove the status item from the status bar.
|
| + if (item_)
|
| + [[NSStatusBar systemStatusBar] removeStatusItem:item_];
|
| +}
|
| +
|
| +NSStatusItem* StatusIconMac::item() {
|
| + if (!item_.get()) {
|
| + // Create a new status item.
|
| + item_.reset([[[NSStatusBar systemStatusBar]
|
| + statusItemWithLength:NSSquareStatusItemLength] retain]);
|
| + [item_ setEnabled:YES];
|
| + [item_ setTarget:controller_];
|
| + [item_ setAction:@selector(handleClick:)];
|
| + }
|
| + return item_.get();
|
| +}
|
| +
|
| +void StatusIconMac::SetImage(const SkBitmap& bitmap) {
|
| + if (!bitmap.isNull()) {
|
| + NSImage* image = gfx::SkBitmapToNSImage(bitmap);
|
| + if (image)
|
| + [item() setImage:image];
|
| + }
|
| +}
|
| +
|
| +void StatusIconMac::SetToolTip(const string16& tool_tip) {
|
| + [item() setToolTip:base::SysUTF16ToNSString(tool_tip)];
|
| +}
|
| +
|
| +void StatusIconMac::AddObserver(StatusIconObserver* observer) {
|
| + observers_.push_back(observer);
|
| +}
|
| +
|
| +void StatusIconMac::RemoveObserver(StatusIconObserver* observer) {
|
| + std::vector<StatusIconObserver*>::iterator iter =
|
| + std::find(observers_.begin(), observers_.end(), observer);
|
| + if (iter != observers_.end())
|
| + observers_.erase(iter);
|
| +}
|
| +
|
| +void StatusIconMac::HandleClick() {
|
| + // Walk observers, call callback for each one.
|
| + for (std::vector<StatusIconObserver*>::const_iterator iter =
|
| + observers_.begin();
|
| + iter != observers_.end();
|
| + ++iter) {
|
| + StatusIconObserver* observer = *iter;
|
| + observer->OnClicked();
|
| + }
|
| +}
|
| +
|
| +// static factory method
|
| +StatusIcon* StatusIcon::Create() {
|
| + return new StatusIconMac();
|
| +}
|
|
|