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

Side by Side Diff: chrome/browser/cocoa/status_icons/status_icon_mac.mm

Issue 661454: Initial implementation of status tray functionality (mac-only, currently). (Closed)
Patch Set: more changes per review feedback Created 10 years, 9 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
OLDNEW
(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 }
OLDNEW
« no previous file with comments | « chrome/browser/cocoa/status_icons/status_icon_mac.h ('k') | chrome/browser/cocoa/status_icons/status_icon_mac_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698