diff --git a/AppKit/CPScrollView.j b/AppKit/CPScrollView.j index 2b42f709c..9093f43e5 100644 --- a/AppKit/CPScrollView.j +++ b/AppKit/CPScrollView.j @@ -30,6 +30,8 @@ @import "CPScroller.j" @import "CPView.j" +@class CPTableView + #define SHOULD_SHOW_CORNER_VIEW() (_scrollerStyle === CPScrollerStyleLegacy && _verticalScroller && ![_verticalScroller isHidden]) @@ -95,6 +97,8 @@ var TIMER_INTERVAL = 0.2, var CPScrollerStyleGlobal = CPScrollerStyleOverlay, CPScrollerStyleGlobalChangeNotification = @"CPScrollerStyleGlobalChangeNotification"; +var CPScrollViewBorderSuffixes = @[@"no-border", @"line-border", @"bezel-border", @"groove-border"]; + /*! @ingroup appkit @class CPScrollView @@ -162,7 +166,15 @@ var CPScrollerStyleGlobal = CPScrollerStyleOverlay, { return @{ @"bottom-corner-color": [CPColor whiteColor], - @"border-color": [CPColor blackColor] + @"border-color": [CPColor blackColor], + @"content-inset-no-border": CGInsetMake(0, 0, 0, 0), + @"content-inset-line-border": CGInsetMake(1, 1, 1, 1), + @"content-inset-bezel-border": CGInsetMake(1, 1, 1, 1), + @"content-inset-groove-border": CGInsetMake(2, 2, 2, 2), + @"background-color-no-border": [CPNull null], + @"background-color-line-border": [CPNull null], + @"background-color-bezel-border": [CPNull null], + @"background-color-groove-border": [CPNull null] }; } @@ -197,19 +209,35 @@ var CPScrollerStyleGlobal = CPScrollerStyleOverlay, + (CGRect)_insetBounds:(CGRect)bounds borderType:(CPBorderType)borderType { + // First, we have to check if we are compiling a theme or running an application because if working on a theme, + // we can't use theme attributes to determine the inset ! This would be a kind of circular reference... + + var compilingATheme = [[[CPBundle mainBundle] objectForInfoDictionaryKey:@"CPApplicationDelegateClass"] isEqualToString:@"BKShowcaseController"]; + + if (compilingATheme) + return bounds; + + var contentInset = [[CPTheme defaultTheme] valueForAttributeWithName:@"content-inset-"+CPScrollViewBorderSuffixes[borderType] forClass:CPScrollView]; + + // As this is a class method, we don't have object attributes, so if the theme doesn't declare content insets, we don't automatically get default value. + // Get it by hand. + if (!contentInset) + contentInset = [[self themeAttributes] objectForKey:@"content-inset-"+CPScrollViewBorderSuffixes[borderType]]; + switch (borderType) { + case CPNoBorder: case CPLineBorder: case CPBezelBorder: - return CGRectInset(bounds, 1.0, 1.0); + return CGRectInsetByInset(bounds, contentInset); case CPGrooveBorder: - bounds = CGRectInset(bounds, 2.0, 2.0); + // FIXME: Do something better with this + bounds = CGRectInsetByInset(bounds, contentInset); ++bounds.origin.y; --bounds.size.height; return bounds; - case CPNoBorder: default: return bounds; } @@ -1288,9 +1316,6 @@ Notifies the delegate when the scroll view has finished scrolling. if (_isObserving) return; - //Make sure to have the last global style for the scroller - [self _didReceiveDefaultStyleChange:nil]; - [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_didReceiveDefaultStyleChange:) name:CPScrollerStyleGlobalChangeNotification @@ -1305,7 +1330,7 @@ Notifies the delegate when the scroll view has finished scrolling. { [super drawRect:aRect]; - if (_borderType == CPNoBorder) + if ([self isCSSBased] || (_borderType == CPNoBorder)) return; var strokeRect = [self bounds], @@ -1510,6 +1535,33 @@ Notifies the delegate when the scroll view has finished scrolling. #pragma mark - +@implementation CPScrollView (CSSTheming) + +- (void)layoutSubviews +{ + if (![self isCSSBased] || (_borderType === CPNoBorder)) + return; + + [self setBackgroundColor:[self currentValueForThemeAttribute:@"background-color-"+CPScrollViewBorderSuffixes[_borderType]]]; +} + +- (BOOL)isCSSBased +{ + return [[self theme] isCSSBased]; +} + +- (void)refreshDisplay +{ + if ([self isCSSBased]) + [self setNeedsLayout:YES]; + else + [self setNeedsDisplay:YES]; +} + +@end + +#pragma mark - + @implementation CPScrollView (FirstResponder) // Those 4 next methods are needed to (un)set CPThemeStateFirstResponder based on content view