Chromium Code Reviews| Index: chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm |
| diff --git a/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm b/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm |
| index cb541b1328a25275b05c821e43acefd3284081e0..2927db21d70b448a937b0167267840731d3913ed 100644 |
| --- a/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm |
| +++ b/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm |
| @@ -7,10 +7,18 @@ |
| #include "base/memory/scoped_nsobject.h" |
| #include "chrome/browser/tab_contents/infobar.h" |
| #import "chrome/browser/themes/theme_service.h" |
| +#import "chrome/browser/ui/cocoa/browser_window_controller.h" |
| #import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h" |
| +#import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" |
| #import "chrome/browser/ui/cocoa/themed_window.h" |
| #include "skia/ext/skia_utils_mac.h" |
| +const CGFloat kTipWidth = 23; |
|
rohitrao (ping after 24h)
2011/08/05 14:24:12
Might as well put this in a namespace.
Robert Sesek
2011/08/05 15:10:40
Done.
|
| + |
| +@interface InfoBarGradientView (Private) |
| +- (NSPoint)pointForTipApex; |
|
rohitrao (ping after 24h)
2011/08/05 14:24:12
Add a comment for this method. Mention what coord
Robert Sesek
2011/08/05 15:10:40
Done.
|
| +@end |
| + |
| @implementation InfoBarGradientView |
| - (void)setInfobarType:(InfoBarDelegate::Type)infobarType { |
| @@ -38,11 +46,23 @@ |
| NSRect bounds = [self bounds]; |
| bounds.size.height = infobars::kBaseHeight; |
| + const CGFloat kHalfWidth = kTipWidth / 2.0; |
| + const CGFloat kTipXOffset = [self pointForTipApex].x - kHalfWidth; |
| + |
| // Around the bounds of the infobar, continue drawing the path into which the |
| // gradient will be drawn. |
| NSBezierPath* infoBarPath = [NSBezierPath bezierPath]; |
| [infoBarPath moveToPoint:NSMakePoint(NSMinX(bounds), NSMaxY(bounds))]; |
| + |
| + // Draw the tip. |
| + [infoBarPath lineToPoint:NSMakePoint(kTipXOffset, NSMaxY(bounds))]; |
| + [infoBarPath relativeLineToPoint:NSMakePoint(kHalfWidth, |
| + infobars::kTipHeight)]; |
| + [infoBarPath relativeLineToPoint:NSMakePoint(kHalfWidth, |
| + -infobars::kTipHeight)]; |
| [infoBarPath lineToPoint:NSMakePoint(NSMaxX(bounds), NSMaxY(bounds))]; |
| + |
| + // Save off the top path of the infobar. |
| scoped_nsobject<NSBezierPath> topPath([infoBarPath copy]); |
| [infoBarPath lineToPoint:NSMakePoint(NSMaxX(bounds), NSMinY(bounds))]; |
| @@ -52,21 +72,33 @@ |
| // Draw the gradient. |
| [[self gradient] drawInBezierPath:infoBarPath angle:270]; |
| - // Stroke the bottom. |
| NSColor* strokeColor = [self strokeColor]; |
| if (strokeColor) { |
| [strokeColor set]; |
| + |
| + // Stroke the bottom of the infobar. |
| NSRect borderRect, contentRect; |
| NSDivideRect(bounds, &borderRect, &contentRect, 1, NSMinYEdge); |
| NSRectFillUsingOperation(borderRect, NSCompositeSourceOver); |
| + |
| + // Re-stroke the top because the tip will have no stroke. This will draw |
| + // over the divider drawn by the bottom of the tabstrip. |
| + [topPath stroke]; |
| } |
| // Add an inner stroke. |
| + const CGFloat kHighlightTipHeight = infobars::kTipHeight - 1; |
| + NSBezierPath* highlightPath = [NSBezierPath bezierPath]; |
| + [highlightPath moveToPoint:NSMakePoint(NSMinX(bounds), NSMaxY(bounds) - 1)]; |
| + [highlightPath relativeLineToPoint:NSMakePoint(kTipXOffset + 1, 0)]; |
| + [highlightPath relativeLineToPoint:NSMakePoint(kHalfWidth - 1, |
| + kHighlightTipHeight)]; |
| + [highlightPath relativeLineToPoint:NSMakePoint(kHalfWidth - 1, |
| + -kHighlightTipHeight)]; |
| + [highlightPath lineToPoint:NSMakePoint(NSMaxX(bounds), NSMaxY(bounds) - 1)]; |
| + |
| [[NSColor colorWithDeviceWhite:1.0 alpha:1.0] setStroke]; |
| - NSAffineTransform* transform = [NSAffineTransform transform]; |
| - [transform translateXBy:0.0 yBy:-1.0]; |
| - [topPath transformUsingAffineTransform:transform]; |
| - [topPath stroke]; |
| + [highlightPath stroke]; |
| } |
| - (BOOL)mouseDownCanMoveWindow { |
| @@ -86,4 +118,23 @@ |
| return [super accessibilityAttributeValue:attribute]; |
| } |
| +// Private ///////////////////////////////////////////////////////////////////// |
| + |
| +// Returns the point, in local coordinates, at which the apex of the infobar tip |
| +// should be drawn. |
| +- (NSPoint)pointForTipApex { |
| + id controller = [[self window] windowController]; |
|
rohitrao (ping after 24h)
2011/08/05 14:24:12
Can we do this through a delegate interface instea
Robert Sesek
2011/08/05 15:10:40
Routed through protocols. Done.
|
| + if (![controller isKindOfClass:[BrowserWindowController class]]) { |
| + NOTREACHED(); |
| + return NSZeroPoint; |
| + } |
| + |
| + BrowserWindowController* windowController = |
| + static_cast<BrowserWindowController*>(controller); |
| + LocationBarViewMac* locationBar = [windowController locationBarBridge]; |
| + NSPoint point = locationBar->GetPageInfoBubblePoint(); |
| + point = [self convertPoint:point fromView:nil]; |
| + return point; |
| +} |
| + |
| @end |