diff --git a/Source/NSBox.m b/Source/NSBox.m index f0eec216f..3985f39e1 100644 --- a/Source/NSBox.m +++ b/Source/NSBox.m @@ -3,7 +3,7 @@ Simple box view that can display a border and title - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996-2015 Free Software Foundation, Inc. Author: Scott Christley Date: 1996 @@ -452,69 +452,22 @@ // - (void) drawRect: (NSRect)rect { - NSColor *color; - rect = NSIntersectionRect(_bounds, rect); - if (_box_type == NSBoxCustom) - { - if (_transparent) - { - color = [NSColor clearColor]; - } - else - { - color = _fill_color; - } - } - else - { - color = [_window backgroundColor]; - } - // Fill inside - [color set]; - NSRectFill(rect); - // Draw border - switch (_border_type) - { - case NSNoBorder: - break; - case NSLineBorder: - if (_box_type == NSBoxCustom) - { - [_border_color set]; - NSFrameRectWithWidth(_border_rect, _border_width); - } - else - { - [[NSColor controlDarkShadowColor] set]; - NSFrameRect(_border_rect); - } - break; - case NSBezelBorder: - [[GSTheme theme] drawDarkBezel: _border_rect withClip: rect]; - break; - case NSGrooveBorder: - [[GSTheme theme] drawGroove: _border_rect withClip: rect]; - break; - } - - // Draw title - if (_title_position != NSNoTitle) - { - // If the title is on the border, clip a hole in the later - if ((_border_type != NSNoBorder) - && ((_title_position == NSAtTop) || (_title_position == NSAtBottom))) - { - [color set]; - NSRectFill(_title_rect); - } - [_cell drawWithFrame: _title_rect inView: self]; - } + [[GSTheme theme] drawBoxInClipRect: rect + boxType: _box_type + borderType: _border_type + inView: self]; } - (BOOL) isOpaque { +#if 1 //TESTPLANT-MAL-MERGE-06202015 + // FIXME: Depends on theme; if always returning NO is a performance hit + // we can check if GSTheme is going to draw an old-style opaque box + // or not. + return NO; +#else if (_box_type == NSBoxCustom) { return !_transparent; @@ -523,6 +476,7 @@ { return YES; } +#endif } - (NSColor*) fillColor @@ -621,6 +575,10 @@ [self setBorderType: borderType]; } + else + { + _border_type = NSGrooveBorder; + } if ([aDecoder containsValueForKey: @"NSTitlePosition"]) { NSTitlePosition titlePosition = [aDecoder decodeIntForKey: @@ -628,6 +586,10 @@ [self setTitlePosition: titlePosition]; } + else + { + _title_position = NSAtTop; + } if ([aDecoder containsValueForKey: @"NSTransparent"]) { // On Apple this is always NO, we keep it for old GNUstep archives @@ -647,12 +609,27 @@ ASSIGN(_cell, titleCell); } + else + { + _cell = [[NSCell alloc] initTextCell: @"Title"]; + [_cell setAlignment: NSCenterTextAlignment]; + [_cell setBordered: NO]; + [_cell setEditable: NO]; + [self setTitleFont: [NSFont systemFontOfSize: + [NSFont smallSystemFontSize]]]; + } if ([aDecoder containsValueForKey: @"NSContentView"]) { NSView *contentView = [aDecoder decodeObjectForKey: @"NSContentView"]; [self setContentView: contentView]; } + else + { + NSView *cv = [NSView new]; + [self setContentView: cv]; + RELEASE(cv); + } } else { @@ -694,6 +671,29 @@ GSTheme *theme = [GSTheme theme]; NSRect r = NSZeroRect; + if (_box_type == NSBoxSeparator) + { + _title_rect = NSZeroRect; + _border_rect = _bounds; + if (_bounds.size.width > _bounds.size.height) + { + _border_rect.origin.y = (int)(_border_rect.size.height / 2); + _border_rect.size.height = 1; + } + else + { + _border_rect.origin.x = (int)(_border_rect.size.width / 2); + _border_rect.size.width = 1; + } + return r; + } + + // Don't try to compute anything while the title cell hasn't been set. + if (_cell == nil) + { + return r; + } + switch (_title_position) { case NSNoTitle: @@ -737,7 +737,7 @@ - (2 * borderSize.height); // center the title cell - c = (_bounds.size.width - titleSize.width) / 2; + c = floor((_bounds.size.width - titleSize.width) / 2); if (c < 0) c = 0; _title_rect.origin.x = _bounds.origin.x + c; _title_rect.origin.y = _bounds.origin.y + _border_rect.size.height @@ -773,7 +773,7 @@ r.size.height -= titleSize.height + borderSize.height; // center the title cell - c = (_border_rect.size.width - titleSize.width) / 2; + c = floor((_border_rect.size.width - titleSize.width) / 2); if (c < 0) c = 0; _title_rect.origin.x = _border_rect.origin.x + c; _title_rect.origin.y @@ -828,7 +828,7 @@ // r.size.height -= titleSize.height + borderSize.height; // center the title cell - c = (_border_rect.size.width - titleSize.width) / 2; + c = floor((_border_rect.size.width - titleSize.width) / 2); if (c < 0) c = 0; _title_rect.origin.x = _border_rect.origin.x + c; _title_rect.origin.y @@ -885,7 +885,7 @@ r.size.height -= (titleSize.height / 2) + borderSize.height; */ // center the title cell - c = (_border_rect.size.width - titleSize.width) / 2; + c = floor((_border_rect.size.width - titleSize.width) / 2); if (c < 0) c = 0; _title_rect.origin.x = c; _title_rect.origin.y = 0; @@ -919,7 +919,7 @@ - (2 * borderSize.height); // center the title cell - c = (_border_rect.size.width - titleSize.width) / 2; + c = floor((_border_rect.size.width - titleSize.width) / 2); if (c < 0) c = 0; _title_rect.origin.x = c; _title_rect.origin.y = 0; @@ -954,7 +954,7 @@ r.size.height -= titleSize.height + borderSize.height; // center the title cell - c = (_border_rect.size.width - titleSize.width) / 2; + c = floor((_border_rect.size.width - titleSize.width) / 2); if (c < 0) c = 0; _title_rect.origin.x = _border_rect.origin.x + c; _title_rect.origin.y = _border_rect.origin.y + borderSize.height;