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 |