1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#import "chrome/browser/ui/cocoa/find_bar/find_bar_view.h"
6
7#import "chrome/browser/ui/cocoa/nsview_additions.h"
8#import "chrome/browser/ui/cocoa/themed_window.h"
9#import "chrome/browser/ui/cocoa/url_drop_target.h"
10#import "chrome/browser/ui/cocoa/view_id_util.h"
11
12namespace {
13CGFloat kCurveSize = 8;
14}  // end namespace
15
16@implementation FindBarView
17
18- (void)awakeFromNib {
19  // Register for all the drag types handled by the RWHVCocoa.
20  [self registerForDraggedTypes:[URLDropTargetHandler handledDragTypes]];
21}
22
23- (void)drawRect:(NSRect)rect {
24  const CGFloat lineWidth = [self cr_lineWidth];
25  const CGFloat halfLineWidth = lineWidth / 2.0;
26
27  // TODO(rohitrao): Make this prettier.
28  rect = NSInsetRect([self bounds], halfLineWidth, halfLineWidth);
29  rect = NSOffsetRect(rect, 0, lineWidth);
30
31  NSPoint topLeft = NSMakePoint(NSMinX(rect), NSMaxY(rect));
32  NSPoint topRight = NSMakePoint(NSMaxX(rect), NSMaxY(rect));
33  NSPoint midLeft1 =
34      NSMakePoint(NSMinX(rect) + kCurveSize, NSMaxY(rect) - kCurveSize);
35  NSPoint midLeft2 =
36      NSMakePoint(NSMinX(rect) + kCurveSize, NSMinY(rect) + kCurveSize);
37  NSPoint midRight1 =
38      NSMakePoint(NSMaxX(rect) - kCurveSize, NSMinY(rect) + kCurveSize);
39  NSPoint midRight2 =
40      NSMakePoint(NSMaxX(rect) - kCurveSize, NSMaxY(rect) - kCurveSize);
41  NSPoint bottomLeft =
42      NSMakePoint(NSMinX(rect) + (2 * kCurveSize), NSMinY(rect));
43  NSPoint bottomRight =
44      NSMakePoint(NSMaxX(rect) - (2 * kCurveSize), NSMinY(rect));
45
46  NSBezierPath* path = [NSBezierPath bezierPath];
47  [path moveToPoint:topLeft];
48  [path curveToPoint:midLeft1
49        controlPoint1:NSMakePoint(midLeft1.x, topLeft.y)
50        controlPoint2:NSMakePoint(midLeft1.x, topLeft.y)];
51  [path lineToPoint:midLeft2];
52  [path curveToPoint:bottomLeft
53        controlPoint1:NSMakePoint(midLeft2.x, bottomLeft.y)
54        controlPoint2:NSMakePoint(midLeft2.x, bottomLeft.y)];
55
56  [path lineToPoint:bottomRight];
57  [path curveToPoint:midRight1
58        controlPoint1:NSMakePoint(midRight1.x, bottomLeft.y)
59        controlPoint2:NSMakePoint(midRight1.x, bottomLeft.y)];
60  [path lineToPoint:midRight2];
61  [path curveToPoint:topRight
62        controlPoint1:NSMakePoint(midRight2.x, topLeft.y)
63        controlPoint2:NSMakePoint(midRight2.x, topLeft.y)];
64  NSGraphicsContext* context = [NSGraphicsContext currentContext];
65  [context saveGraphicsState];
66  [path addClip];
67
68  // Set the pattern phase
69  NSPoint phase = [[self window] themePatternPhase];
70
71  [context setPatternPhase:phase];
72  [super drawBackground];
73  [context restoreGraphicsState];
74
75  [[self strokeColor] set];
76  [path setLineWidth:lineWidth];
77  [path stroke];
78}
79
80// The findbar is mostly opaque, but has an 8px transparent border on the left
81// and right sides (see |kCurveSize|).  This is an artifact of the way it is
82// drawn.  We override hitTest to return nil for points in this transparent
83// area.
84- (NSView*)hitTest:(NSPoint)point {
85  NSView* hitView = [super hitTest:point];
86  if (hitView == self) {
87    // |rect| is approximately equivalent to the opaque area of the findbar.
88    NSRect rect = NSInsetRect([self bounds], kCurveSize, 0);
89    if (!NSMouseInRect(point, rect, [self isFlipped]))
90      return nil;
91  }
92
93  return hitView;
94}
95
96// Eat all mouse events, to prevent clicks from falling through to views below.
97- (void)mouseDown:(NSEvent *)theEvent {
98}
99
100- (void)rightMouseDown:(NSEvent *)theEvent {
101}
102
103- (void)otherMouseDown:(NSEvent *)theEvent {
104}
105
106- (void)mouseUp:(NSEvent *)theEvent {
107}
108
109- (void)rightMouseUp:(NSEvent *)theEvent {
110}
111
112- (void)otherMouseUp:(NSEvent *)theEvent {
113}
114
115- (void)mouseMoved:(NSEvent *)theEvent {
116}
117
118- (void)mouseDragged:(NSEvent *)theEvent {
119}
120
121- (void)rightMouseDragged:(NSEvent *)theEvent {
122}
123
124- (void)otherMouseDragged:(NSEvent *)theEvent {
125}
126
127// Eat drag operations, to prevent drags from going through to the views below.
128- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)info {
129  return NSDragOperationNone;
130}
131
132- (ViewID)viewID {
133  return VIEW_ID_FIND_IN_PAGE;
134}
135
136// Specifies that mouse events over this view should be ignored by the
137// render host.
138- (BOOL)nonWebContentView {
139  return YES;
140}
141
142@end
143