Home | History | Annotate | Download | only in cocoa
      1 // Copyright (c) 2012 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/nsview_additions.h"
      6 
      7 #include "base/logging.h"
      8 
      9 #if !defined(MAC_OS_X_VERSION_10_7) || \
     10     MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
     11 
     12 @interface NSView (LionAPI)
     13 - (NSSize)convertSizeFromBacking:(NSSize)size;
     14 @end
     15 
     16 #endif  // 10.7
     17 
     18 @implementation NSView (ChromeAdditions)
     19 
     20 - (CGFloat)cr_lineWidth {
     21   // All shipping retina macs run at least 10.7.
     22   if (![self respondsToSelector:@selector(convertSizeFromBacking:)])
     23     return 1;
     24   return [self convertSizeFromBacking:NSMakeSize(1, 1)].width;
     25 }
     26 
     27 - (BOOL)cr_isMouseInView {
     28   NSPoint mouseLoc = [[self window] mouseLocationOutsideOfEventStream];
     29   mouseLoc = [[self superview] convertPoint:mouseLoc fromView:nil];
     30   return [self hitTest:mouseLoc] == self;
     31 }
     32 
     33 - (BOOL)cr_isBelowView:(NSView*)otherView {
     34   NSArray* subviews = [[self superview] subviews];
     35 
     36   NSUInteger selfIndex = [subviews indexOfObject:self];
     37   DCHECK_NE(NSNotFound, selfIndex);
     38 
     39   NSUInteger otherIndex = [subviews indexOfObject:otherView];
     40   DCHECK_NE(NSNotFound, otherIndex);
     41 
     42   return selfIndex < otherIndex;
     43 }
     44 
     45 - (BOOL)cr_isAboveView:(NSView*)otherView {
     46   return ![self cr_isBelowView:otherView];
     47 }
     48 
     49 - (void)cr_ensureSubview:(NSView*)subview
     50             isPositioned:(NSWindowOrderingMode)place
     51               relativeTo:(NSView *)otherView {
     52   DCHECK(place == NSWindowAbove || place == NSWindowBelow);
     53   BOOL isAbove = place == NSWindowAbove;
     54   if ([[subview superview] isEqual:self] &&
     55       [subview cr_isAboveView:otherView] == isAbove) {
     56     return;
     57   }
     58 
     59   [subview removeFromSuperview];
     60   [self addSubview:subview
     61         positioned:place
     62         relativeTo:otherView];
     63 }
     64 
     65 - (NSColor*)cr_keyboardFocusIndicatorColor {
     66   return [[NSColor keyboardFocusIndicatorColor]
     67       colorWithAlphaComponent:0.5 / [self cr_lineWidth]];
     68 }
     69 
     70 - (void)cr_recursivelySetNeedsDisplay:(BOOL)flag {
     71   [self setNeedsDisplay:YES];
     72   for (NSView* child in [self subviews])
     73     [child cr_recursivelySetNeedsDisplay:flag];
     74 }
     75 
     76 @end
     77