Home | History | Annotate | Download | only in infobars
      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 #include "chrome/browser/ui/cocoa/infobars/infobar_gradient_view.h"
      6 
      7 #include "base/memory/scoped_nsobject.h"
      8 #import "chrome/browser/themes/theme_service.h"
      9 #import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h"
     10 #import "chrome/browser/ui/cocoa/themed_window.h"
     11 
     12 namespace {
     13 
     14 const double kBackgroundColorTop[3] =
     15     {255.0 / 255.0, 242.0 / 255.0, 183.0 / 255.0};
     16 const double kBackgroundColorBottom[3] =
     17     {250.0 / 255.0, 230.0 / 255.0, 145.0 / 255.0};
     18 }
     19 
     20 @implementation InfoBarGradientView
     21 
     22 - (id)initWithFrame:(NSRect)frameRect {
     23   if ((self = [super initWithFrame:frameRect])) {
     24     NSColor* startingColor =
     25         [NSColor colorWithCalibratedRed:kBackgroundColorTop[0]
     26                                   green:kBackgroundColorTop[1]
     27                                    blue:kBackgroundColorTop[2]
     28                                   alpha:1.0];
     29     NSColor* endingColor =
     30         [NSColor colorWithCalibratedRed:kBackgroundColorBottom[0]
     31                                   green:kBackgroundColorBottom[1]
     32                                    blue:kBackgroundColorBottom[2]
     33                                   alpha:1.0];
     34     scoped_nsobject<NSGradient> gradient(
     35         [[NSGradient alloc] initWithStartingColor:startingColor
     36                                        endingColor:endingColor]);
     37     [self setGradient:gradient];
     38   }
     39   return self;
     40 }
     41 
     42 - (NSColor*)strokeColor {
     43   ui::ThemeProvider* themeProvider = [[self window] themeProvider];
     44   if (!themeProvider)
     45     return [NSColor blackColor];
     46 
     47   BOOL active = [[self window] isMainWindow];
     48   return themeProvider->GetNSColor(
     49       active ? ThemeService::COLOR_TOOLBAR_STROKE :
     50                ThemeService::COLOR_TOOLBAR_STROKE_INACTIVE,
     51       true);
     52 }
     53 
     54 - (void)drawRect:(NSRect)rect {
     55   NSRect bounds = [self bounds];
     56   bounds.size.height = infobars::kBaseHeight;
     57 
     58   // Around the bounds of the infobar, continue drawing the path into which the
     59   // gradient will be drawn.
     60   NSBezierPath* infoBarPath = [NSBezierPath bezierPath];
     61   [infoBarPath moveToPoint:NSMakePoint(NSMinX(bounds), NSMaxY(bounds))];
     62   [infoBarPath lineToPoint:NSMakePoint(NSMaxX(bounds), NSMaxY(bounds))];
     63   scoped_nsobject<NSBezierPath> topPath([infoBarPath copy]);
     64 
     65   [infoBarPath lineToPoint:NSMakePoint(NSMaxX(bounds), NSMinY(bounds))];
     66   [infoBarPath lineToPoint:NSMakePoint(NSMinX(bounds), NSMinY(bounds))];
     67   [infoBarPath closePath];
     68 
     69   // Draw the gradient.
     70   [[self gradient] drawInBezierPath:infoBarPath angle:270];
     71 
     72   // Stroke the bottom.
     73   NSColor* strokeColor = [self strokeColor];
     74   if (strokeColor) {
     75     [strokeColor set];
     76     NSRect borderRect, contentRect;
     77     NSDivideRect(bounds, &borderRect, &contentRect, 1, NSMinYEdge);
     78     NSRectFillUsingOperation(borderRect, NSCompositeSourceOver);
     79   }
     80 
     81   // Add an inner stroke.
     82   [[NSColor colorWithDeviceWhite:1.0 alpha:1.0] setStroke];
     83   NSAffineTransform* transform = [NSAffineTransform transform];
     84   [transform translateXBy:0.0 yBy:-1.0];
     85   [topPath transformUsingAffineTransform:transform];
     86   [topPath stroke];
     87 }
     88 
     89 - (BOOL)mouseDownCanMoveWindow {
     90   return NO;
     91 }
     92 
     93 // This view is intentionally not opaque because it overlaps with the findbar.
     94 
     95 - (BOOL)accessibilityIsIgnored {
     96   return NO;
     97 }
     98 
     99 - (id)accessibilityAttributeValue:(NSString*)attribute {
    100   if ([attribute isEqual:NSAccessibilityRoleAttribute])
    101     return NSAccessibilityGroupRole;
    102 
    103   return [super accessibilityAttributeValue:attribute];
    104 }
    105 
    106 @end
    107