diff --git a/ChangeLog b/ChangeLog index a4cd52c43..1e6421154 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2013-10-15 Eric Wasylishen + + * Headers/Additions/GNUstepGUI/GSTheme.h: Add -tabViewContentRectForBounds: + method. + * Source/GSThemeDrawing.m: + * Source/NSTabView.m: Move the -contentRect implementation to GSTheme + so we can delegate to GSDrawTiles, if used. + 2013-10-15 Eric Wasylishen * Source/NSTabViewItem.m (-drawLabel:inRect:): Center label vertically diff --git a/Headers/Additions/GNUstepGUI/GSTheme.h b/Headers/Additions/GNUstepGUI/GSTheme.h index c45267595..20ad98bdb 100644 --- a/Headers/Additions/GNUstepGUI/GSTheme.h +++ b/Headers/Additions/GNUstepGUI/GSTheme.h @@ -1147,6 +1147,10 @@ APPKIT_EXPORT NSString *GSThemeWillDeactivateNotification; - (NSRect) browserHeaderDrawingRectForCell: (NSTableHeaderCell*)cell withFrame: (NSRect)rect; +- (NSRect) tabViewContentRectForBounds: (NSRect)aRect + tabViewType: (NSTabViewType)type + tabView: (NSTabView *)view; + - (void) drawTabViewRect: (NSRect)rect inView: (NSView *)view withItems: (NSArray *)items diff --git a/Source/GSThemeDrawing.m b/Source/GSThemeDrawing.m index 91d5a61e5..4a3ec6db7 100644 --- a/Source/GSThemeDrawing.m +++ b/Source/GSThemeDrawing.m @@ -2011,6 +2011,104 @@ typedef enum { return [img size].height; } +- (NSRect) tabViewBackgroundRectForBounds: (NSRect)aRect + tabViewType: (NSTabViewType)type +{ + const CGFloat tabHeight = [self tabHeightForType: type]; + + switch (type) + { + default: + case NSTopTabsBezelBorder: + aRect.size.height -= tabHeight; + aRect.origin.y += tabHeight; + break; + + case NSBottomTabsBezelBorder: + aRect.size.height -= tabHeight; + break; + + case NSLeftTabsBezelBorder: + aRect.size.width -= tabHeight; + aRect.origin.x += tabHeight; + break; + + case NSRightTabsBezelBorder: + aRect.size.width -= tabHeight; + break; + + case NSNoTabsBezelBorder: + case NSNoTabsLineBorder: + case NSNoTabsNoBorder: + break; + } + + return aRect; +} + + +- (NSRect) tabViewContentRectForBounds: (NSRect)aRect + tabViewType: (NSTabViewType)type + tabView: (NSTabView *)view +{ + NSRect cRect = [self tabViewBackgroundRectForBounds: aRect + tabViewType: type]; + NSString *name = GSStringFromTabViewType(type); + GSDrawTiles *tiles = [self tilesNamed: name state: GSThemeNormalState]; + + if (tiles == nil) + { + switch (type) + { + case NSBottomTabsBezelBorder: + cRect.origin.x += 1; + cRect.origin.y += 1; + cRect.size.width -= 3; + cRect.size.height -= 2; + break; + case NSNoTabsBezelBorder: + cRect.origin.x += 1; + cRect.origin.y += 1; + cRect.size.width -= 3; + cRect.size.height -= 2; + break; + case NSNoTabsLineBorder: + cRect.origin.y += 1; + cRect.origin.x += 1; + cRect.size.width -= 2; + cRect.size.height -= 2; + break; + case NSTopTabsBezelBorder: + cRect.origin.x += 1; + cRect.origin.y += 1; + cRect.size.width -= 3; + cRect.size.height -= 2; + break; + case NSLeftTabsBezelBorder: + cRect.origin.x += 1; + cRect.origin.y += 1; + cRect.size.width -= 3; + cRect.size.height -= 2; + break; + case NSRightTabsBezelBorder: + cRect.origin.x += 1; + cRect.origin.y += 1; + cRect.size.width -= 3; + cRect.size.height -= 2; + break; + case NSNoTabsNoBorder: + default: + break; + } + } + else + { + cRect = [tiles contentRectForRect: cRect]; + } + return cRect; +} + + - (void) drawTabViewBezelRect: (NSRect)aRect tabViewType: (NSTabViewType)type inView: (NSView *)view @@ -2069,42 +2167,14 @@ typedef enum { const NSUInteger howMany = [items count]; int i; int previousState = 0; + const NSTabViewType type = [(NSTabView *)view tabViewType]; const NSRect bounds = [view bounds]; - NSRect aRect = bounds; + NSRect aRect = [self tabViewBackgroundRectForBounds: bounds tabViewType: type]; const BOOL truncate = [(NSTabView *)view allowsTruncatedLabels]; - const NSTabViewType type = [(NSTabView *)view tabViewType]; const CGFloat tabHeight = [self tabHeightForType: type]; DPSgsave(ctxt); - - // Calculate the background rect - switch (type) - { - default: - case NSTopTabsBezelBorder: - aRect.size.height -= tabHeight; - aRect.origin.y += tabHeight; - break; - - case NSBottomTabsBezelBorder: - aRect.size.height -= tabHeight; - break; - - case NSLeftTabsBezelBorder: - aRect.size.width -= tabHeight; - aRect.origin.x += tabHeight; - break; - - case NSRightTabsBezelBorder: - aRect.size.width -= tabHeight; - break; - - case NSNoTabsBezelBorder: - case NSNoTabsLineBorder: - case NSNoTabsNoBorder: - break; - } [self drawTabViewBezelRect: aRect tabViewType: type diff --git a/Source/NSTabView.m b/Source/NSTabView.m index 2fd1df61b..f55d5f834 100644 --- a/Source/NSTabView.m +++ b/Source/NSTabView.m @@ -405,52 +405,10 @@ - (NSRect) contentRect { - NSRect cRect = _bounds; - - switch (_type) - { - case NSBottomTabsBezelBorder: - cRect.origin.x += 1; - cRect.origin.y += 1; - cRect.size.width -= 3; - cRect.size.height -= 19; - break; - case NSNoTabsBezelBorder: - cRect.origin.x += 1; - cRect.origin.y += 1; - cRect.size.width -= 3; - cRect.size.height -= 3; - break; - case NSNoTabsLineBorder: - cRect.origin.y += 1; - cRect.origin.x += 1; - cRect.size.width -= 2; - cRect.size.height -= 2; - break; - case NSTopTabsBezelBorder: - cRect.origin.x += 1; - cRect.origin.y += 18; - cRect.size.width -= 3; - cRect.size.height -= 19; - break; - case NSLeftTabsBezelBorder: - cRect.origin.x += 21; - cRect.origin.y += 1; - cRect.size.width -= 21; - cRect.size.height -= 3; - break; - case NSRightTabsBezelBorder: - cRect.origin.x += 1; - cRect.origin.y += 1; - cRect.size.width -= 21; - cRect.size.height -= 3; - break; - case NSNoTabsNoBorder: - default: - break; - } - - return cRect; + NSRect result = [[GSTheme theme] tabViewContentRectForBounds: _bounds + tabViewType: [self tabViewType] + tabView: self]; + return result; } // Drawing.