OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/cocoa/status_bubble_mac.h" | 5 #include "chrome/browser/cocoa/status_bubble_mac.h" |
6 | 6 |
7 #include "app/gfx/text_elider.h" | 7 #include "app/gfx/text_elider.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "base/sys_string_conversions.h" | 9 #include "base/sys_string_conversions.h" |
10 #include "googleurl/src/gurl.h" | 10 #include "googleurl/src/gurl.h" |
11 #import "third_party/GTM/AppKit/GTMNSBezierPath+RoundRect.h" | 11 #import "third_party/GTM/AppKit/GTMNSBezierPath+RoundRect.h" |
12 #import "third_party/GTM/AppKit/GTMNSColor+Luminance.h" | |
13 #import "third_party/GTM/AppKit/GTMTheme.h" | |
14 | 12 |
15 namespace { | 13 namespace { |
16 | 14 |
17 const int kWindowHeight = 18; | 15 const int kWindowHeight = 18; |
18 // The width of the bubble in relation to the width of the parent window. | 16 // The width of the bubble in relation to the width of the parent window. |
19 const float kWindowWidthPercent = 1.0f/3.0f; | 17 const float kWindowWidthPercent = 1.0f/3.0f; |
20 | 18 |
21 // How close the mouse can get to the infobubble before it starts sliding | 19 // How close the mouse can get to the infobubble before it starts sliding |
22 // off-screen. | 20 // off-screen. |
23 const int kMousePadding = 20; | 21 const int kMousePadding = 20; |
(...skipping 20 matching lines...) Expand all Loading... |
44 enum BubbleStyle { | 42 enum BubbleStyle { |
45 STYLE_BOTTOM, // Hanging off the bottom of the parent window | 43 STYLE_BOTTOM, // Hanging off the bottom of the parent window |
46 STYLE_FLOATING, // Between BOTTOM and STANDARD | 44 STYLE_FLOATING, // Between BOTTOM and STANDARD |
47 STYLE_STANDARD // Nestled in the corner of the parent window | 45 STYLE_STANDARD // Nestled in the corner of the parent window |
48 }; | 46 }; |
49 | 47 |
50 @interface StatusBubbleViewCocoa : NSView { | 48 @interface StatusBubbleViewCocoa : NSView { |
51 @private | 49 @private |
52 NSString* content_; | 50 NSString* content_; |
53 BubbleStyle style_; | 51 BubbleStyle style_; |
54 NSWindow* parent_; | |
55 } | 52 } |
56 | 53 |
57 - (void)setContent:(NSString*)content; | 54 - (void)setContent:(NSString*)content; |
58 - (void)setStyle:(BubbleStyle)style; | 55 - (void)setStyle:(BubbleStyle)style; |
59 - (void)setParent:(NSWindow*)parent; | |
60 - (NSFont*)font; | 56 - (NSFont*)font; |
61 @end | 57 @end |
62 | 58 |
63 StatusBubbleMac::StatusBubbleMac(NSWindow* parent, id delegate) | 59 StatusBubbleMac::StatusBubbleMac(NSWindow* parent, id delegate) |
64 : parent_(parent), | 60 : parent_(parent), |
65 delegate_(delegate), | 61 delegate_(delegate), |
66 window_(nil), | 62 window_(nil), |
67 status_text_(nil), | 63 status_text_(nil), |
68 url_text_(nil), | 64 url_text_(nil), |
69 is_download_shelf_visible_(false) { | 65 is_download_shelf_visible_(false) { |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 backing:NSBackingStoreBuffered | 213 backing:NSBackingStoreBuffered |
218 defer:YES]; | 214 defer:YES]; |
219 [window_ setMovableByWindowBackground:NO]; | 215 [window_ setMovableByWindowBackground:NO]; |
220 [window_ setBackgroundColor:[NSColor clearColor]]; | 216 [window_ setBackgroundColor:[NSColor clearColor]]; |
221 [window_ setLevel:NSNormalWindowLevel]; | 217 [window_ setLevel:NSNormalWindowLevel]; |
222 [window_ setOpaque:NO]; | 218 [window_ setOpaque:NO]; |
223 [window_ setHasShadow:NO]; | 219 [window_ setHasShadow:NO]; |
224 | 220 |
225 StatusBubbleViewCocoa* view = | 221 StatusBubbleViewCocoa* view = |
226 [[[StatusBubbleViewCocoa alloc] initWithFrame:NSZeroRect] autorelease]; | 222 [[[StatusBubbleViewCocoa alloc] initWithFrame:NSZeroRect] autorelease]; |
227 [view setParent:parent_]; | |
228 | |
229 [window_ setContentView:view]; | 223 [window_ setContentView:view]; |
230 | 224 |
231 [parent_ addChildWindow:window_ ordered:NSWindowAbove]; | 225 [parent_ addChildWindow:window_ ordered:NSWindowAbove]; |
232 | 226 |
233 [window_ setAlphaValue:0.0f]; | 227 [window_ setAlphaValue:0.0f]; |
234 | 228 |
235 offset_ = 0; | 229 offset_ = 0; |
236 [view setStyle:STYLE_STANDARD]; | 230 [view setStyle:STYLE_STANDARD]; |
237 MouseMoved(); | 231 MouseMoved(); |
238 } | 232 } |
(...skipping 23 matching lines...) Expand all Loading... |
262 [content_ autorelease]; | 256 [content_ autorelease]; |
263 content_ = [content copy]; | 257 content_ = [content copy]; |
264 [self setNeedsDisplay:YES]; | 258 [self setNeedsDisplay:YES]; |
265 } | 259 } |
266 | 260 |
267 - (void)setStyle:(BubbleStyle)style { | 261 - (void)setStyle:(BubbleStyle)style { |
268 style_ = style; | 262 style_ = style; |
269 [self setNeedsDisplay:YES]; | 263 [self setNeedsDisplay:YES]; |
270 } | 264 } |
271 | 265 |
272 - (void)setParent:(NSWindow*)parent { | |
273 [parent_ autorelease]; | |
274 parent_ = [parent retain]; | |
275 [self setNeedsDisplay:YES]; | |
276 } | |
277 | |
278 - (GTMTheme*)gtm_theme { | |
279 return [parent_ gtm_theme]; | |
280 } | |
281 | |
282 - (NSFont*)font { | 266 - (NSFont*)font { |
283 return [NSFont systemFontOfSize:[NSFont smallSystemFontSize]]; | 267 return [NSFont systemFontOfSize:[NSFont smallSystemFontSize]]; |
284 } | 268 } |
285 | 269 |
286 - (void)drawRect:(NSRect)rect { | 270 - (void)drawRect:(NSRect)rect { |
287 float tl_radius, tr_radius, bl_radius, br_radius; | 271 float tl_radius, tr_radius, bl_radius, br_radius; |
288 | 272 |
289 switch (style_) { | 273 switch (style_) { |
290 case STYLE_BOTTOM: | 274 case STYLE_BOTTOM: |
291 tl_radius = 0.0f; | 275 tl_radius = 0.0f; |
(...skipping 17 matching lines...) Expand all Loading... |
309 NOTREACHED(); | 293 NOTREACHED(); |
310 tl_radius = 0.0f; | 294 tl_radius = 0.0f; |
311 tr_radius = 0.0f; | 295 tr_radius = 0.0f; |
312 bl_radius = 0.0f; | 296 bl_radius = 0.0f; |
313 br_radius = 0.0f; | 297 br_radius = 0.0f; |
314 } | 298 } |
315 | 299 |
316 // Background / Edge | 300 // Background / Edge |
317 | 301 |
318 NSRect bounds = [self bounds]; | 302 NSRect bounds = [self bounds]; |
319 bounds = NSInsetRect(bounds, 0.5, 0.5); | |
320 NSBezierPath *border = [NSBezierPath gtm_bezierPathWithRoundRect:bounds | 303 NSBezierPath *border = [NSBezierPath gtm_bezierPathWithRoundRect:bounds |
321 topLeftCornerRadius:tl_radius | 304 topLeftCornerRadius:tl_radius |
322 topRightCornerRadius:tr_radius | 305 topRightCornerRadius:tr_radius |
323 bottomLeftCornerRadius:bl_radius | 306 bottomLeftCornerRadius:bl_radius |
324 bottomRightCornerRadius:br_radius]; | 307 bottomRightCornerRadius:br_radius]; |
325 | 308 |
326 NSColor* color = | 309 [[NSColor colorWithDeviceWhite:kWindowFill alpha:1.0f] set]; |
327 [[self gtm_theme] backgroundColorForStyle:GTMThemeStyleToolBar | |
328 state:GTMThemeStateActiveWindow]; | |
329 | |
330 // workaround for default theme | |
331 // TODO(alcor) next GTM update return nil for background color if not set; | |
332 if ([color isEqual:[NSColor colorWithCalibratedWhite:0.5 alpha:1.0]]) | |
333 color = nil; | |
334 if (!color) | |
335 color = [NSColor colorWithCalibratedWhite:0.9 alpha:1.0]; | |
336 [color set]; | |
337 [border fill]; | 310 [border fill]; |
338 | 311 |
339 border = [NSBezierPath gtm_bezierPathWithRoundRect:bounds | 312 border = [NSBezierPath gtm_bezierPathWithRoundRect:bounds |
340 topLeftCornerRadius:tl_radius | 313 topLeftCornerRadius:tl_radius |
341 topRightCornerRadius:tr_radius | 314 topRightCornerRadius:tr_radius |
342 bottomLeftCornerRadius:bl_radius | 315 bottomLeftCornerRadius:bl_radius |
343 bottomRightCornerRadius:br_radius]; | 316 bottomRightCornerRadius:br_radius]; |
344 | 317 |
345 [[NSColor colorWithDeviceWhite:kWindowEdge alpha:1.0f] set]; | 318 [[NSColor colorWithDeviceWhite:kWindowEdge alpha:1.0f] set]; |
346 [border stroke]; | 319 [border stroke]; |
347 | 320 |
348 // Text | 321 // Text |
349 NSColor* textColor = [color gtm_legibleTextColor]; | 322 |
350 NSFont* textFont = [self font]; | 323 NSFont* textFont = [self font]; |
351 NSShadow* textShadow = [[[NSShadow alloc] init] autorelease]; | 324 NSShadow* textShadow = [[[NSShadow alloc] init] autorelease]; |
352 [textShadow setShadowBlurRadius:0.0f]; | 325 [textShadow setShadowBlurRadius:1.5f]; |
353 [textShadow setShadowColor:[textColor gtm_legibleTextColor]]; | 326 [textShadow setShadowColor:[NSColor whiteColor]]; |
354 [textShadow setShadowOffset:NSMakeSize(0.0f, -1.0f)]; | 327 [textShadow setShadowOffset:NSMakeSize(0.0f, -1.0f)]; |
355 | 328 |
356 NSDictionary* textDict = [NSDictionary dictionaryWithObjectsAndKeys: | 329 NSDictionary* textDict = [NSDictionary dictionaryWithObjectsAndKeys: |
357 textFont, NSFontAttributeName, | 330 textFont, NSFontAttributeName, |
358 textShadow, NSShadowAttributeName, | 331 textShadow, NSShadowAttributeName, |
359 nil]; | 332 nil]; |
360 [content_ drawAtPoint:NSMakePoint(kTextPositionX, kTextPositionY) | 333 [content_ drawAtPoint:NSMakePoint(kTextPositionX, kTextPositionY) |
361 withAttributes:textDict]; | 334 withAttributes:textDict]; |
362 } | 335 } |
363 | 336 |
364 @end | 337 @end |
OLD | NEW |