Home | History | Annotate | Download | only in find_bar
      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 
     12 namespace {
     13 CGFloat 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