OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/cocoa/status_icons/status_icon_mac.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "base/sys_string_conversions.h" |
| 9 #include "skia/ext/skia_utils_mac.h" |
| 10 #include "third_party/skia/include/core/SkBitmap.h" |
| 11 |
| 12 @interface StatusItemController : NSObject { |
| 13 StatusIconMac* statusIcon_; // weak |
| 14 } |
| 15 - initWithIcon:(StatusIconMac*)icon; |
| 16 - (void)handleClick:(id)sender; |
| 17 |
| 18 @end // @interface StatusItemController |
| 19 |
| 20 @implementation StatusItemController |
| 21 |
| 22 - (id)initWithIcon:(StatusIconMac*)icon { |
| 23 statusIcon_ = icon; |
| 24 return self; |
| 25 } |
| 26 |
| 27 - (void)handleClick:(id)sender { |
| 28 // Pass along the click notification to our owner. |
| 29 DCHECK(statusIcon_); |
| 30 statusIcon_->HandleClick(); |
| 31 } |
| 32 |
| 33 @end |
| 34 |
| 35 StatusIconMac::StatusIconMac() |
| 36 : item_(NULL) { |
| 37 controller_.reset([[StatusItemController alloc] initWithIcon:this]); |
| 38 } |
| 39 |
| 40 StatusIconMac::~StatusIconMac() { |
| 41 // Remove the status item from the status bar. |
| 42 if (item_) |
| 43 [[NSStatusBar systemStatusBar] removeStatusItem:item_]; |
| 44 } |
| 45 |
| 46 NSStatusItem* StatusIconMac::item() { |
| 47 if (!item_.get()) { |
| 48 // Create a new status item. |
| 49 item_.reset([[[NSStatusBar systemStatusBar] |
| 50 statusItemWithLength:NSSquareStatusItemLength] retain]); |
| 51 [item_ setEnabled:YES]; |
| 52 [item_ setTarget:controller_]; |
| 53 [item_ setAction:@selector(handleClick:)]; |
| 54 } |
| 55 return item_.get(); |
| 56 } |
| 57 |
| 58 void StatusIconMac::SetImage(const SkBitmap& bitmap) { |
| 59 if (!bitmap.isNull()) { |
| 60 NSImage* image = gfx::SkBitmapToNSImage(bitmap); |
| 61 if (image) |
| 62 [item() setImage:image]; |
| 63 } |
| 64 } |
| 65 |
| 66 void StatusIconMac::SetToolTip(const string16& tool_tip) { |
| 67 [item() setToolTip:base::SysUTF16ToNSString(tool_tip)]; |
| 68 } |
| 69 |
| 70 void StatusIconMac::AddObserver(StatusIconObserver* observer) { |
| 71 observers_.push_back(observer); |
| 72 } |
| 73 |
| 74 void StatusIconMac::RemoveObserver(StatusIconObserver* observer) { |
| 75 std::vector<StatusIconObserver*>::iterator iter = |
| 76 std::find(observers_.begin(), observers_.end(), observer); |
| 77 if (iter != observers_.end()) |
| 78 observers_.erase(iter); |
| 79 } |
| 80 |
| 81 void StatusIconMac::HandleClick() { |
| 82 // Walk observers, call callback for each one. |
| 83 for (std::vector<StatusIconObserver*>::const_iterator iter = |
| 84 observers_.begin(); |
| 85 iter != observers_.end(); |
| 86 ++iter) { |
| 87 StatusIconObserver* observer = *iter; |
| 88 observer->OnClicked(); |
| 89 } |
| 90 } |
| 91 |
| 92 // static factory method |
| 93 StatusIcon* StatusIcon::Create() { |
| 94 return new StatusIconMac(); |
| 95 } |
OLD | NEW |