Home | History | Annotate | Download | only in notifications
      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/notifications/balloon_view.h"
      6 
      7 #import <Cocoa/Cocoa.h>
      8 
      9 #include "base/basictypes.h"
     10 #import "chrome/browser/ui/cocoa/notifications/balloon_controller.h"
     11 #import "third_party/GTM/AppKit/GTMNSBezierPath+RoundRect.h"
     12 
     13 namespace {
     14 
     15 const int kRoundedCornerSize = 6;
     16 
     17 }  // namespace
     18 
     19 @implementation BalloonWindow
     20 - (id)initWithContentRect:(NSRect)contentRect
     21                 styleMask:(NSUInteger)aStyle
     22                   backing:(NSBackingStoreType)bufferingType
     23                     defer:(BOOL)flag {
     24   self = [super initWithContentRect:contentRect
     25                           styleMask:NSBorderlessWindowMask
     26                             backing:NSBackingStoreBuffered
     27                               defer:NO];
     28   // Using NSModalPanelWindowLevel (8) rather then NSStatusWindowLevel (25)
     29   // ensures notification balloons on top of regular windows, but below
     30   // popup menus which are at NSPopUpMenuWindowLevel (101) and Spotlight
     31   // drop-out, which is at NSStatusWindowLevel-2 (23) for OSX 10.6/7.
     32   // See http://crbug.com/59878.
     33   if (self) {
     34     [self setLevel:NSModalPanelWindowLevel];
     35     [self setOpaque:NO];
     36     [self setBackgroundColor:[NSColor clearColor]];
     37   }
     38   return self;
     39 }
     40 
     41 - (BOOL)canBecomeMainWindow {
     42   return NO;
     43 }
     44 @end
     45 
     46 @implementation BalloonShelfViewCocoa
     47 - (void)drawRect:(NSRect)rect {
     48   NSBezierPath* path =
     49       [NSBezierPath gtm_bezierPathWithRoundRect:[self bounds]
     50                             topLeftCornerRadius:kRoundedCornerSize
     51                            topRightCornerRadius:kRoundedCornerSize
     52                          bottomLeftCornerRadius:0.0
     53                         bottomRightCornerRadius:0.0];
     54 
     55   [[NSColor colorWithCalibratedWhite:0.957 alpha:1.0] set];
     56   [path fill];
     57 
     58   [[NSColor colorWithCalibratedWhite:0.8 alpha:1.0] set];
     59   NSPoint origin = [self bounds].origin;
     60   [NSBezierPath strokeLineFromPoint:origin
     61       toPoint:NSMakePoint(origin.x + NSWidth([self bounds]), origin.y)];
     62 }
     63 @end
     64 
     65 @implementation BalloonContentViewCocoa
     66 - (void)drawRect:(NSRect)rect {
     67   rect = NSInsetRect([self bounds], 0.5, 0.5);
     68   NSBezierPath* path =
     69       [NSBezierPath gtm_bezierPathWithRoundRect:rect
     70                             topLeftCornerRadius:0.0
     71                            topRightCornerRadius:0.0
     72                          bottomLeftCornerRadius:kRoundedCornerSize
     73                         bottomRightCornerRadius:kRoundedCornerSize];
     74   [[NSColor whiteColor] set];
     75   [path setLineWidth:3];
     76   [path stroke];
     77 }
     78 @end
     79 
     80 @implementation BalloonOverlayViewCocoa
     81 
     82 // We do not want to bring chrome window to foreground when we click on any
     83 // part of the notification balloon. To do this, we first postpone the window
     84 // reorder here (shouldDelayWindowOrderingForEvent is called during mouseDown)
     85 // and then complete canceling the reorder by [NSApp preventWindowOrdering] in
     86 // mouseDown handler of this view.
     87 - (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent*)theEvent {
     88   return YES;
     89 }
     90 
     91 - (void)mouseDown:(NSEvent*)event {
     92   [NSApp preventWindowOrdering];
     93   // Continue bubbling the event up the chain of responders.
     94   [super mouseDown:event];
     95 }
     96 
     97 - (BOOL)acceptsFirstMouse:(NSEvent*)event {
     98   return YES;
     99 }
    100 @end
    101