| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "chrome/browser/ui/cocoa/find_bar/find_bar_view.h" |
| |
| #import "chrome/browser/ui/cocoa/nsview_additions.h" |
| #import "chrome/browser/ui/cocoa/themed_window.h" |
| #import "chrome/browser/ui/cocoa/url_drop_target.h" |
| #import "chrome/browser/ui/cocoa/view_id_util.h" |
| #import "ui/base/cocoa/nsgraphics_context_additions.h" |
| #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" |
| |
| namespace { |
| CGFloat kCurveSize = 8; |
| } // end namespace |
| |
| @implementation FindBarView |
| |
| - (void)awakeFromNib { |
| // Register for all the drag types handled by the RWHVCocoa. |
| [self registerForDraggedTypes:[URLDropTargetHandler handledDragTypes]]; |
| } |
| |
| - (void)drawRect:(NSRect)rect { |
| const CGFloat lineWidth = [self cr_lineWidth]; |
| const CGFloat halfLineWidth = lineWidth / 2.0; |
| |
| // TODO(rohitrao): Make this prettier. |
| rect = NSInsetRect([self bounds], halfLineWidth, halfLineWidth); |
| rect = NSOffsetRect(rect, 0, lineWidth); |
| |
| NSPoint topLeft = NSMakePoint(NSMinX(rect), NSMaxY(rect)); |
| NSPoint topRight = NSMakePoint(NSMaxX(rect), NSMaxY(rect)); |
| NSPoint midLeft1 = |
| NSMakePoint(NSMinX(rect) + kCurveSize, NSMaxY(rect) - kCurveSize); |
| NSPoint midLeft2 = |
| NSMakePoint(NSMinX(rect) + kCurveSize, NSMinY(rect) + kCurveSize); |
| NSPoint midRight1 = |
| NSMakePoint(NSMaxX(rect) - kCurveSize, NSMinY(rect) + kCurveSize); |
| NSPoint midRight2 = |
| NSMakePoint(NSMaxX(rect) - kCurveSize, NSMaxY(rect) - kCurveSize); |
| NSPoint bottomLeft = |
| NSMakePoint(NSMinX(rect) + (2 * kCurveSize), NSMinY(rect)); |
| NSPoint bottomRight = |
| NSMakePoint(NSMaxX(rect) - (2 * kCurveSize), NSMinY(rect)); |
| |
| NSBezierPath* path = [NSBezierPath bezierPath]; |
| [path moveToPoint:topLeft]; |
| [path curveToPoint:midLeft1 |
| controlPoint1:NSMakePoint(midLeft1.x, topLeft.y) |
| controlPoint2:NSMakePoint(midLeft1.x, topLeft.y)]; |
| [path lineToPoint:midLeft2]; |
| [path curveToPoint:bottomLeft |
| controlPoint1:NSMakePoint(midLeft2.x, bottomLeft.y) |
| controlPoint2:NSMakePoint(midLeft2.x, bottomLeft.y)]; |
| |
| [path lineToPoint:bottomRight]; |
| [path curveToPoint:midRight1 |
| controlPoint1:NSMakePoint(midRight1.x, bottomLeft.y) |
| controlPoint2:NSMakePoint(midRight1.x, bottomLeft.y)]; |
| [path lineToPoint:midRight2]; |
| [path curveToPoint:topRight |
| controlPoint1:NSMakePoint(midRight2.x, topLeft.y) |
| controlPoint2:NSMakePoint(midRight2.x, topLeft.y)]; |
| |
| { |
| gfx::ScopedNSGraphicsContextSaveGState scopedGState; |
| NSGraphicsContext* context = [NSGraphicsContext currentContext]; |
| [path addClip]; |
| |
| // Set the pattern phase |
| NSPoint position = [[self window] |
| themeImagePositionForAlignment:THEME_IMAGE_ALIGN_WITH_TAB_STRIP]; |
| [context cr_setPatternPhase:position forView:self]; |
| |
| [super drawBackgroundWithOpaque:YES]; |
| } |
| |
| [[self strokeColor] set]; |
| [path setLineWidth:lineWidth]; |
| [path stroke]; |
| } |
| |
| // The findbar is mostly opaque, but has an 8px transparent border on the left |
| // and right sides (see |kCurveSize|). This is an artifact of the way it is |
| // drawn. We override hitTest to return nil for points in this transparent |
| // area. |
| - (NSView*)hitTest:(NSPoint)point { |
| NSView* hitView = [super hitTest:point]; |
| if (hitView == self) { |
| // |rect| is approximately equivalent to the opaque area of the findbar. |
| NSRect rect = NSInsetRect([self bounds], kCurveSize, 0); |
| if (!NSMouseInRect(point, rect, [self isFlipped])) |
| return nil; |
| } |
| |
| return hitView; |
| } |
| |
| // Eat all mouse events, to prevent clicks from falling through to views below. |
| - (void)mouseDown:(NSEvent *)theEvent { |
| } |
| |
| - (void)rightMouseDown:(NSEvent *)theEvent { |
| } |
| |
| - (void)otherMouseDown:(NSEvent *)theEvent { |
| } |
| |
| - (void)mouseUp:(NSEvent *)theEvent { |
| } |
| |
| - (void)rightMouseUp:(NSEvent *)theEvent { |
| } |
| |
| - (void)otherMouseUp:(NSEvent *)theEvent { |
| } |
| |
| - (void)mouseMoved:(NSEvent *)theEvent { |
| } |
| |
| - (void)mouseDragged:(NSEvent *)theEvent { |
| } |
| |
| - (void)rightMouseDragged:(NSEvent *)theEvent { |
| } |
| |
| - (void)otherMouseDragged:(NSEvent *)theEvent { |
| } |
| |
| // Eat drag operations, to prevent drags from going through to the views below. |
| - (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)info { |
| return NSDragOperationNone; |
| } |
| |
| - (ViewID)viewID { |
| return VIEW_ID_FIND_IN_PAGE; |
| } |
| |
| // Specifies that mouse events over this view should be ignored by the |
| // render host. |
| - (BOOL)nonWebContentView { |
| return YES; |
| } |
| |
| @end |