1// Copyright (c) 2013 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#import "ui/message_center/cocoa/status_item_view.h" 6 7#include <cmath> 8 9#include "base/format_macros.h" 10#include "grit/ui_resources.h" 11#include "ui/base/resource/resource_bundle.h" 12 13// The width of the status bar item when it's just the icon. 14const CGFloat kStatusItemLength = 26; 15 16// The amount of space between the left and right edges and the content of the 17// status item. 18const CGFloat kMargin = 5; 19 20 21@interface MCStatusItemView (Private) 22// Whether or not the status item should be drawn highlighted. 23- (BOOL)shouldHighlight; 24 25- (int)getTrayResourceId; 26@end 27 28@implementation MCStatusItemView 29 30@synthesize highlight = highlight_; 31 32- (id)init { 33 statusItem_.reset([[[NSStatusBar systemStatusBar] statusItemWithLength: 34 NSVariableStatusItemLength] retain]); 35 CGFloat thickness = [[statusItem_ statusBar] thickness]; 36 37 NSRect frame = NSMakeRect(0, 0, kStatusItemLength, thickness); 38 if ((self = [super initWithFrame:frame])) { 39 [statusItem_ setView:self]; 40 } 41 return self; 42} 43 44- (void)removeItem { 45 [[NSStatusBar systemStatusBar] removeStatusItem:statusItem_]; 46 statusItem_.reset(); 47} 48 49- (size_t)unreadCount { 50 return unreadCount_; 51} 52 53- (message_center::StatusItemClickedCallback)callback { 54 return callback_.get(); 55} 56 57- (void)setCallback:(message_center::StatusItemClickedCallback)callback { 58 callback_.reset(callback, base::scoped_policy::RETAIN); 59} 60 61- (void)setUnreadCount:(size_t)unreadCount withQuietMode:(BOOL)quietMode { 62 unreadCount_ = unreadCount; 63 quietMode_ = quietMode; 64 65 NSRect frame = [self frame]; 66 frame.size.width = kStatusItemLength; 67 [self setFrame:frame]; 68 69 [self setNeedsDisplay:YES]; 70} 71 72- (void)setHighlight:(BOOL)highlight { 73 highlight_ = highlight; 74 [self setNeedsDisplay:YES]; 75} 76 77- (void)mouseDown:(NSEvent*)event { 78 inMouseEventSequence_ = YES; 79 [self setNeedsDisplay:YES]; 80 81 if (callback_) 82 callback_.get()(); 83} 84 85- (void)mouseUp:(NSEvent*)event { 86 inMouseEventSequence_ = NO; 87 [self setNeedsDisplay:YES]; 88} 89 90- (void)rightMouseDown:(NSEvent*)event { 91 [self mouseDown:event]; 92} 93 94- (void)rightMouseUp:(NSEvent*)event { 95 [self mouseUp:event]; 96} 97 98- (void)otherMouseDown:(NSEvent*)event { 99 [self mouseDown:event]; 100} 101 102- (void)otherMouseUp:(NSEvent*)event { 103 [self mouseUp:event]; 104} 105 106- (void)drawRect:(NSRect)dirtyRect { 107 NSRect frame = [self bounds]; 108 109 // Draw the background color. 110 BOOL highlight = [self shouldHighlight]; 111 [statusItem_ drawStatusBarBackgroundInRect:frame 112 withHighlight:highlight]; 113 114 int resource_id = [self getTrayResourceId]; 115 // Draw the icon. 116 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 117 NSImage* image = rb.GetNativeImageNamed(resource_id).ToNSImage(); 118 NSSize size = [image size]; 119 NSRect drawRect = NSMakeRect(kMargin, 120 floorf((NSHeight(frame) - size.height) / 2), 121 size.width, 122 size.height); 123 [image drawInRect:drawRect 124 fromRect:NSZeroRect 125 operation:NSCompositeSourceOver 126 fraction:1.0]; 127} 128 129- (NSArray*)accessibilityActionNames { 130 return @[ NSAccessibilityPressAction ]; 131} 132 133- (void)accessibilityPerformAction:(NSString*)action { 134 if ([action isEqualToString:NSAccessibilityPressAction]) { 135 if (callback_) 136 callback_.get()(); 137 return; 138 } 139 [super accessibilityPerformAction:action]; 140} 141 142// Private ///////////////////////////////////////////////////////////////////// 143 144- (BOOL)shouldHighlight { 145 return highlight_ || inMouseEventSequence_; 146} 147 148- (int)getTrayResourceId { 149 BOOL highlight = [self shouldHighlight]; 150 BOOL hasUnreadItems = unreadCount_ > 0; 151 int kResourceIds[2][2][2] = { 152 { 153 { IDR_TRAY_EMPTY, IDR_TRAY_EMPTY_PRESSED }, 154 { IDR_TRAY_ATTENTION, IDR_TRAY_ATTENTION_PRESSED }, 155 }, 156 { 157 { IDR_TRAY_DO_NOT_DISTURB_EMPTY, 158 IDR_TRAY_DO_NOT_DISTURB_EMPTY_PRESSED }, 159 { IDR_TRAY_DO_NOT_DISTURB_ATTENTION, 160 IDR_TRAY_DO_NOT_DISTURB_ATTENTION_PRESSED }, 161 }, 162 }; 163 return kResourceIds[quietMode_][hasUnreadItems][highlight]; 164} 165 166@end 167