Index: chrome/browser/cocoa/status_bubble_mac.mm |
=================================================================== |
--- chrome/browser/cocoa/status_bubble_mac.mm (revision 25624) |
+++ chrome/browser/cocoa/status_bubble_mac.mm (working copy) |
@@ -7,6 +7,7 @@ |
#include "app/gfx/text_elider.h" |
#include "base/string_util.h" |
#include "base/sys_string_conversions.h" |
+#import "chrome/browser/cocoa/bubble_view.h" |
#include "googleurl/src/gurl.h" |
#import "third_party/GTM/AppKit/GTMNSBezierPath+RoundRect.h" |
#import "third_party/GTM/AppKit/GTMNSColor+Luminance.h" |
@@ -23,15 +24,7 @@ |
const int kMousePadding = 20; |
const int kTextPadding = 3; |
-const int kTextPositionX = 4; |
-const int kTextPositionY = 2; |
-const float kWindowFill = 0.8f; |
-const float kWindowEdge = 0.7f; |
- |
-// The roundedness of the edges of our bubble. |
-const int kBubbleCornerRadius = 4.0f; |
- |
// How long each fade should last for. |
const int kShowFadeDuration = 0.120f; |
const int kHideFadeDuration = 0.200f; |
@@ -41,25 +34,6 @@ |
// TODO(avi): |
// - do display delay |
-enum BubbleStyle { |
- STYLE_BOTTOM, // Hanging off the bottom of the parent window |
- STYLE_FLOATING, // Between BOTTOM and STANDARD |
- STYLE_STANDARD // Nestled in the corner of the parent window |
-}; |
- |
-@interface StatusBubbleViewCocoa : NSView { |
- @private |
- NSString* content_; |
- BubbleStyle style_; |
- NSWindow* parent_; |
-} |
- |
-- (void)setContent:(NSString*)content; |
-- (void)setStyle:(BubbleStyle)style; |
-- (void)setParent:(NSWindow*)parent; |
-- (NSFont*)font; |
-@end |
- |
StatusBubbleMac::StatusBubbleMac(NSWindow* parent, id delegate) |
: parent_(parent), |
delegate_(delegate), |
@@ -86,7 +60,7 @@ |
NSRect frame = [window_ frame]; |
int text_width = static_cast<int>(frame.size.width - |
- kTextPositionX - |
+ kBubbleViewTextPositionX - |
kTextPadding); |
NSFont* font = [[window_ contentView] font]; |
gfx::Font font_chr = |
@@ -177,18 +151,21 @@ |
// and mate to the edges of the tab content). |
if (offset >= NSHeight(window_frame)) { |
offset = NSHeight(window_frame); |
- [[window_ contentView] setStyle:STYLE_BOTTOM]; |
+ [[window_ contentView] setCornerFlags: |
+ kRoundedBottomLeftCorner | kRoundedBottomRightCorner]; |
} else if (offset > 0) { |
- [[window_ contentView] setStyle:STYLE_FLOATING]; |
+ [[window_ contentView] setCornerFlags: |
+ kRoundedTopRightCorner | kRoundedBottomLeftCorner | |
+ kRoundedBottomRightCorner]; |
} else { |
- [[window_ contentView] setStyle:STYLE_STANDARD]; |
+ [[window_ contentView] setCornerFlags:kRoundedTopRightCorner]; |
} |
offset_ = offset; |
window_frame.origin.y -= offset; |
} else { |
offset_ = 0; |
- [[window_ contentView] setStyle:STYLE_STANDARD]; |
+ [[window_ contentView] setCornerFlags:kRoundedTopRightCorner]; |
} |
// |delegate_| can be nil during unit tests. |
@@ -222,10 +199,12 @@ |
[window_ setOpaque:NO]; |
[window_ setHasShadow:NO]; |
- StatusBubbleViewCocoa* view = |
- [[[StatusBubbleViewCocoa alloc] initWithFrame:NSZeroRect] autorelease]; |
- [view setParent:parent_]; |
- |
+ // We do not need to worry about the bubble outliving |parent_| because our |
+ // teardown sequence in BWC guarantees that |parent_| outlives the status |
+ // bubble and that the StatusBubble is torn down completely prior to the |
+ // window going away. |
+ scoped_nsobject<BubbleView> view( |
+ [[BubbleView alloc] initWithFrame:NSZeroRect themeProvider:parent_]); |
[window_ setContentView:view]; |
[parent_ addChildWindow:window_ ordered:NSWindowAbove]; |
@@ -233,7 +212,7 @@ |
[window_ setAlphaValue:0.0f]; |
offset_ = 0; |
- [view setStyle:STYLE_STANDARD]; |
+ [view setCornerFlags:kRoundedTopRightCorner]; |
MouseMoved(); |
} |
@@ -251,116 +230,3 @@ |
[NSAnimationContext endGrouping]; |
} |
-@implementation StatusBubbleViewCocoa |
- |
-- (void)dealloc { |
- [parent_ release]; |
- [content_ release]; |
- [super dealloc]; |
-} |
- |
-- (void)setContent:(NSString*)content { |
- [content_ autorelease]; |
- content_ = [content copy]; |
- [self setNeedsDisplay:YES]; |
-} |
- |
-- (void)setStyle:(BubbleStyle)style { |
- style_ = style; |
- [self setNeedsDisplay:YES]; |
-} |
- |
-- (void)setParent:(NSWindow*)parent { |
- [parent_ autorelease]; |
- parent_ = [parent retain]; |
- [self setNeedsDisplay:YES]; |
-} |
- |
-- (GTMTheme*)gtm_theme { |
- return [parent_ gtm_theme]; |
-} |
- |
-- (NSFont*)font { |
- return [NSFont systemFontOfSize:[NSFont smallSystemFontSize]]; |
-} |
- |
-- (void)drawRect:(NSRect)rect { |
- float tl_radius, tr_radius, bl_radius, br_radius; |
- |
- switch (style_) { |
- case STYLE_BOTTOM: |
- tl_radius = 0.0f; |
- tr_radius = 0.0f; |
- bl_radius = kBubbleCornerRadius; |
- br_radius = kBubbleCornerRadius; |
- break; |
- case STYLE_FLOATING: |
- tl_radius = 0.0f; |
- tr_radius = kBubbleCornerRadius; |
- bl_radius = kBubbleCornerRadius; |
- br_radius = kBubbleCornerRadius; |
- break; |
- case STYLE_STANDARD: |
- tl_radius = 0.0f; |
- tr_radius = kBubbleCornerRadius; |
- bl_radius = 0.0f; |
- br_radius = 0.0f; |
- break; |
- default: |
- NOTREACHED(); |
- tl_radius = 0.0f; |
- tr_radius = 0.0f; |
- bl_radius = 0.0f; |
- br_radius = 0.0f; |
- } |
- |
- // Background / Edge |
- |
- NSRect bounds = [self bounds]; |
- bounds = NSInsetRect(bounds, 0.5, 0.5); |
- NSBezierPath *border = [NSBezierPath gtm_bezierPathWithRoundRect:bounds |
- topLeftCornerRadius:tl_radius |
- topRightCornerRadius:tr_radius |
- bottomLeftCornerRadius:bl_radius |
- bottomRightCornerRadius:br_radius]; |
- |
- NSColor* color = |
- [[self gtm_theme] backgroundColorForStyle:GTMThemeStyleToolBar |
- state:GTMThemeStateActiveWindow]; |
- |
- // workaround for default theme |
- // TODO(alcor) next GTM update return nil for background color if not set; |
- if ([color isEqual:[NSColor colorWithCalibratedWhite:0.5 alpha:1.0]]) |
- color = nil; |
- if (!color) |
- color = [NSColor colorWithCalibratedWhite:0.9 alpha:1.0]; |
- [color set]; |
- [border fill]; |
- |
- border = [NSBezierPath gtm_bezierPathWithRoundRect:bounds |
- topLeftCornerRadius:tl_radius |
- topRightCornerRadius:tr_radius |
- bottomLeftCornerRadius:bl_radius |
- bottomRightCornerRadius:br_radius]; |
- |
- [[NSColor colorWithDeviceWhite:kWindowEdge alpha:1.0f] set]; |
- [border stroke]; |
- |
- // Text |
- NSColor* textColor = [color gtm_legibleTextColor]; |
- NSFont* textFont = [self font]; |
- NSShadow* textShadow = [[[NSShadow alloc] init] autorelease]; |
- [textShadow setShadowBlurRadius:0.0f]; |
- [textShadow setShadowColor:[textColor gtm_legibleTextColor]]; |
- [textShadow setShadowOffset:NSMakeSize(0.0f, -1.0f)]; |
- |
- NSDictionary* textDict = [NSDictionary dictionaryWithObjectsAndKeys: |
- textColor, NSForegroundColorAttributeName, |
- textFont, NSFontAttributeName, |
- textShadow, NSShadowAttributeName, |
- nil]; |
- [content_ drawAtPoint:NSMakePoint(kTextPositionX, kTextPositionY) |
- withAttributes:textDict]; |
-} |
- |
-@end |