mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-11-24 23:39:51 +03:00
600 lines
21 KiB
Mathematica
600 lines
21 KiB
Mathematica
|
//
|
||
|
// PSMUnifiedTabStyle.m
|
||
|
// --------------------
|
||
|
//
|
||
|
// Created by Keith Blount on 30/04/2006.
|
||
|
// Copyright 2006 __MyCompanyName__. All rights reserved.
|
||
|
//
|
||
|
|
||
|
#import "PSMUnifiedTabStyle.h"
|
||
|
#import "PSMTabBarCell.h"
|
||
|
#import "PSMTabBarControl.h"
|
||
|
#import "NSBezierPath_AMShading.h"
|
||
|
|
||
|
#define kPSMUnifiedObjectCounterRadius 7.0
|
||
|
#define kPSMUnifiedCounterMinWidth 20
|
||
|
|
||
|
@interface PSMUnifiedTabStyle (Private)
|
||
|
- (void)drawInteriorWithTabCell:(PSMTabBarCell *)cell inView:(NSView*)controlView;
|
||
|
@end
|
||
|
|
||
|
@implementation PSMUnifiedTabStyle
|
||
|
|
||
|
- (NSString *)name
|
||
|
{
|
||
|
return @"Unified";
|
||
|
}
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark Creation/Destruction
|
||
|
|
||
|
- (id) init
|
||
|
{
|
||
|
if ( (self = [super init]) ) {
|
||
|
unifiedCloseButton = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front"]];
|
||
|
unifiedCloseButtonDown = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front_Pressed"]];
|
||
|
unifiedCloseButtonOver = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front_Rollover"]];
|
||
|
|
||
|
unifiedCloseDirtyButton = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabCloseDirty_Front"]];
|
||
|
unifiedCloseDirtyButtonDown = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabCloseDirty_Front_Pressed"]];
|
||
|
unifiedCloseDirtyButtonOver = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabCloseDirty_Front_Rollover"]];
|
||
|
|
||
|
_addTabButtonImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabNew"]];
|
||
|
_addTabButtonPressedImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabNewPressed"]];
|
||
|
_addTabButtonRolloverImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabNewRollover"]];
|
||
|
|
||
|
_objectCountStringAttributes = [[NSDictionary alloc] initWithObjectsAndKeys:[[NSFontManager sharedFontManager] convertFont:[NSFont fontWithName:@"Helvetica" size:11.0] toHaveTrait:NSBoldFontMask], NSFontAttributeName,
|
||
|
[[NSColor whiteColor] colorWithAlphaComponent:0.85], NSForegroundColorAttributeName,
|
||
|
nil, nil];
|
||
|
|
||
|
leftMargin = 5.0;
|
||
|
}
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
- (void)dealloc
|
||
|
{
|
||
|
[unifiedCloseButton release];
|
||
|
[unifiedCloseButtonDown release];
|
||
|
[unifiedCloseButtonOver release];
|
||
|
[unifiedCloseDirtyButton release];
|
||
|
[unifiedCloseDirtyButtonDown release];
|
||
|
[unifiedCloseDirtyButtonOver release];
|
||
|
[_addTabButtonImage release];
|
||
|
[_addTabButtonPressedImage release];
|
||
|
[_addTabButtonRolloverImage release];
|
||
|
|
||
|
[_objectCountStringAttributes release];
|
||
|
|
||
|
[super dealloc];
|
||
|
}
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark Control Specific
|
||
|
|
||
|
- (void)setLeftMarginForTabBarControl:(CGFloat)margin
|
||
|
{
|
||
|
leftMargin = margin;
|
||
|
}
|
||
|
|
||
|
- (CGFloat)leftMarginForTabBarControl
|
||
|
{
|
||
|
return leftMargin;
|
||
|
}
|
||
|
|
||
|
- (CGFloat)rightMarginForTabBarControl
|
||
|
{
|
||
|
return 24.0f;
|
||
|
}
|
||
|
|
||
|
- (CGFloat)topMarginForTabBarControl
|
||
|
{
|
||
|
return 10.0f;
|
||
|
}
|
||
|
|
||
|
- (void)setOrientation:(PSMTabBarOrientation)value
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark Add Tab Button
|
||
|
|
||
|
- (NSImage *)addTabButtonImage
|
||
|
{
|
||
|
return _addTabButtonImage;
|
||
|
}
|
||
|
|
||
|
- (NSImage *)addTabButtonPressedImage
|
||
|
{
|
||
|
return _addTabButtonPressedImage;
|
||
|
}
|
||
|
|
||
|
- (NSImage *)addTabButtonRolloverImage
|
||
|
{
|
||
|
return _addTabButtonRolloverImage;
|
||
|
}
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark Cell Specific
|
||
|
|
||
|
- (NSRect)dragRectForTabCell:(PSMTabBarCell *)cell orientation:(PSMTabBarOrientation)orientation
|
||
|
{
|
||
|
NSRect dragRect = [cell frame];
|
||
|
dragRect.size.width++;
|
||
|
return dragRect;
|
||
|
}
|
||
|
|
||
|
- (NSRect)closeButtonRectForTabCell:(PSMTabBarCell *)cell withFrame:(NSRect)cellFrame
|
||
|
{
|
||
|
if ([cell hasCloseButton] == NO) {
|
||
|
return NSZeroRect;
|
||
|
}
|
||
|
|
||
|
NSRect result;
|
||
|
result.size = [unifiedCloseButton size];
|
||
|
result.origin.x = cellFrame.origin.x + MARGIN_X;
|
||
|
result.origin.y = cellFrame.origin.y + MARGIN_Y + 1.0;
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
- (NSRect)iconRectForTabCell:(PSMTabBarCell *)cell
|
||
|
{
|
||
|
NSRect cellFrame = [cell frame];
|
||
|
|
||
|
if ([cell hasIcon] == NO) {
|
||
|
return NSZeroRect;
|
||
|
}
|
||
|
|
||
|
NSRect result;
|
||
|
result.size = NSMakeSize(kPSMTabBarIconWidth, kPSMTabBarIconWidth);
|
||
|
result.origin.x = cellFrame.origin.x + MARGIN_X;
|
||
|
result.origin.y = cellFrame.origin.y + MARGIN_Y - 1.0;
|
||
|
|
||
|
if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) {
|
||
|
result.origin.x += [unifiedCloseButton size].width + kPSMTabBarCellPadding;
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
- (NSRect)indicatorRectForTabCell:(PSMTabBarCell *)cell
|
||
|
{
|
||
|
NSRect cellFrame = [cell frame];
|
||
|
|
||
|
if ([[cell indicator] isHidden]) {
|
||
|
return NSZeroRect;
|
||
|
}
|
||
|
|
||
|
NSRect result;
|
||
|
result.size = NSMakeSize(kPSMTabBarIndicatorWidth, kPSMTabBarIndicatorWidth);
|
||
|
result.origin.x = cellFrame.origin.x + cellFrame.size.width - MARGIN_X - kPSMTabBarIndicatorWidth;
|
||
|
result.origin.y = cellFrame.origin.y + MARGIN_Y - 1.0;
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
- (NSRect)objectCounterRectForTabCell:(PSMTabBarCell *)cell
|
||
|
{
|
||
|
NSRect cellFrame = [cell frame];
|
||
|
|
||
|
if ([cell count] == 0) {
|
||
|
return NSZeroRect;
|
||
|
}
|
||
|
|
||
|
CGFloat countWidth = [[self attributedObjectCountValueForTabCell:cell] size].width;
|
||
|
countWidth += (2 * kPSMUnifiedObjectCounterRadius - 6.0);
|
||
|
if (countWidth < kPSMUnifiedCounterMinWidth) {
|
||
|
countWidth = kPSMUnifiedCounterMinWidth;
|
||
|
}
|
||
|
|
||
|
NSRect result;
|
||
|
result.size = NSMakeSize(countWidth, 2 * kPSMUnifiedObjectCounterRadius); // temp
|
||
|
result.origin.x = cellFrame.origin.x + cellFrame.size.width - MARGIN_X - result.size.width;
|
||
|
result.origin.y = cellFrame.origin.y + MARGIN_Y + 1.0;
|
||
|
|
||
|
if (![[cell indicator] isHidden]) {
|
||
|
result.origin.x -= kPSMTabBarIndicatorWidth + kPSMTabBarCellPadding;
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
|
||
|
- (CGFloat)minimumWidthOfTabCell:(PSMTabBarCell *)cell
|
||
|
{
|
||
|
CGFloat resultWidth = 0.0;
|
||
|
|
||
|
// left margin
|
||
|
resultWidth = MARGIN_X;
|
||
|
|
||
|
// close button?
|
||
|
if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) {
|
||
|
resultWidth += [unifiedCloseButton size].width + kPSMTabBarCellPadding;
|
||
|
}
|
||
|
|
||
|
// icon?
|
||
|
if ([cell hasIcon]) {
|
||
|
resultWidth += kPSMTabBarIconWidth + kPSMTabBarCellPadding;
|
||
|
}
|
||
|
|
||
|
// the label
|
||
|
resultWidth += kPSMMinimumTitleWidth;
|
||
|
|
||
|
// object counter?
|
||
|
if ([cell count] > 0) {
|
||
|
resultWidth += [self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding;
|
||
|
}
|
||
|
|
||
|
// indicator?
|
||
|
if ([[cell indicator] isHidden] == NO)
|
||
|
resultWidth += kPSMTabBarCellPadding + kPSMTabBarIndicatorWidth;
|
||
|
|
||
|
// right margin
|
||
|
resultWidth += MARGIN_X;
|
||
|
|
||
|
return ceil(resultWidth);
|
||
|
}
|
||
|
|
||
|
- (CGFloat)desiredWidthOfTabCell:(PSMTabBarCell *)cell
|
||
|
{
|
||
|
CGFloat resultWidth = 0.0;
|
||
|
|
||
|
// left margin
|
||
|
resultWidth = MARGIN_X;
|
||
|
|
||
|
// close button?
|
||
|
if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed])
|
||
|
resultWidth += [unifiedCloseButton size].width + kPSMTabBarCellPadding;
|
||
|
|
||
|
// icon?
|
||
|
if ([cell hasIcon]) {
|
||
|
resultWidth += kPSMTabBarIconWidth + kPSMTabBarCellPadding;
|
||
|
}
|
||
|
|
||
|
// the label
|
||
|
resultWidth += [[cell attributedStringValue] size].width;
|
||
|
|
||
|
// object counter?
|
||
|
if ([cell count] > 0) {
|
||
|
resultWidth += [self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding;
|
||
|
}
|
||
|
|
||
|
// indicator?
|
||
|
if ([[cell indicator] isHidden] == NO)
|
||
|
resultWidth += kPSMTabBarCellPadding + kPSMTabBarIndicatorWidth;
|
||
|
|
||
|
// right margin
|
||
|
resultWidth += MARGIN_X;
|
||
|
|
||
|
return ceil(resultWidth);
|
||
|
}
|
||
|
|
||
|
- (CGFloat)tabCellHeight
|
||
|
{
|
||
|
return kPSMTabBarControlHeight;
|
||
|
}
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark Cell Values
|
||
|
|
||
|
- (NSAttributedString *)attributedObjectCountValueForTabCell:(PSMTabBarCell *)cell
|
||
|
{
|
||
|
NSString *contents = [NSString stringWithFormat:@"%lu", (unsigned long)[cell count]];
|
||
|
return [[[NSMutableAttributedString alloc] initWithString:contents attributes:_objectCountStringAttributes] autorelease];
|
||
|
}
|
||
|
|
||
|
- (NSAttributedString *)attributedStringValueForTabCell:(PSMTabBarCell *)cell
|
||
|
{
|
||
|
NSMutableAttributedString *attrStr;
|
||
|
NSString * contents = [cell stringValue];
|
||
|
attrStr = [[[NSMutableAttributedString alloc] initWithString:contents] autorelease];
|
||
|
NSRange range = NSMakeRange(0, [contents length]);
|
||
|
|
||
|
[attrStr addAttribute:NSFontAttributeName value:[NSFont systemFontOfSize:11.0] range:range];
|
||
|
|
||
|
// Paragraph Style for Truncating Long Text
|
||
|
static NSMutableParagraphStyle *TruncatingTailParagraphStyle = nil;
|
||
|
if (!TruncatingTailParagraphStyle) {
|
||
|
TruncatingTailParagraphStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] retain];
|
||
|
[TruncatingTailParagraphStyle setLineBreakMode:NSLineBreakByTruncatingTail];
|
||
|
}
|
||
|
[attrStr addAttribute:NSParagraphStyleAttributeName value:TruncatingTailParagraphStyle range:range];
|
||
|
|
||
|
return attrStr;
|
||
|
}
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark ---- drawing ----
|
||
|
|
||
|
- (void)drawTabCell:(PSMTabBarCell *)cell
|
||
|
{
|
||
|
NSRect cellFrame = [cell frame];
|
||
|
|
||
|
NSToolbar *toolbar = [[[cell controlView] window] toolbar];
|
||
|
BOOL showsBaselineSeparator = (toolbar && [toolbar respondsToSelector:@selector(showsBaselineSeparator)] && [toolbar showsBaselineSeparator]);
|
||
|
if (!showsBaselineSeparator) {
|
||
|
cellFrame.origin.y += 1.0;
|
||
|
cellFrame.size.height -= 1.0;
|
||
|
}
|
||
|
|
||
|
NSColor * lineColor = nil;
|
||
|
NSBezierPath* bezier = [NSBezierPath bezierPath];
|
||
|
lineColor = [NSColor colorWithCalibratedWhite:0.576 alpha:1.0];
|
||
|
|
||
|
if (!showsBaselineSeparator || [cell state] == NSOnState)
|
||
|
{
|
||
|
// selected tab
|
||
|
NSRect aRect = NSMakeRect(cellFrame.origin.x+0.5, cellFrame.origin.y-0.5, cellFrame.size.width, cellFrame.size.height);
|
||
|
|
||
|
// frame
|
||
|
CGFloat radius = MIN(6.0, 0.5f * MIN(NSWidth(aRect), NSHeight(aRect)));
|
||
|
NSRect rect = NSInsetRect(aRect, radius, radius);
|
||
|
|
||
|
[bezier appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect), NSMinY(rect)) radius:radius startAngle:180.0 endAngle:270.0];
|
||
|
|
||
|
[bezier appendBezierPathWithArcWithCenter:NSMakePoint(NSMaxX(rect), NSMinY(rect)) radius:radius startAngle:270.0 endAngle:360.0];
|
||
|
|
||
|
NSPoint cornerPoint = NSMakePoint(NSMaxX(aRect), NSMaxY(aRect));
|
||
|
[bezier appendBezierPathWithPoints:&cornerPoint count:1];
|
||
|
|
||
|
cornerPoint = NSMakePoint(NSMinX(aRect), NSMaxY(aRect));
|
||
|
[bezier appendBezierPathWithPoints:&cornerPoint count:1];
|
||
|
|
||
|
[bezier closePath];
|
||
|
|
||
|
//[[NSColor windowBackgroundColor] set];
|
||
|
//[bezier fill];
|
||
|
if ([NSApp isActive]) {
|
||
|
if ([cell state] == NSOnState) {
|
||
|
[bezier linearGradientFillWithStartColor:[NSColor colorWithCalibratedWhite:0.99 alpha:1.0]
|
||
|
endColor:[NSColor colorWithCalibratedWhite:0.941 alpha:1.0]];
|
||
|
} else if ([cell isHighlighted]) {
|
||
|
[bezier linearGradientFillWithStartColor:[NSColor colorWithCalibratedWhite:0.80 alpha:1.0]
|
||
|
endColor:[NSColor colorWithCalibratedWhite:0.80 alpha:1.0]];
|
||
|
} else {
|
||
|
[bezier linearGradientFillWithStartColor:[NSColor colorWithCalibratedWhite:0.835 alpha:1.0]
|
||
|
endColor:[NSColor colorWithCalibratedWhite:0.843 alpha:1.0]];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[lineColor set];
|
||
|
[bezier stroke];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// unselected tab
|
||
|
NSRect aRect = NSMakeRect(cellFrame.origin.x, cellFrame.origin.y, cellFrame.size.width, cellFrame.size.height);
|
||
|
aRect.origin.y += 0.5;
|
||
|
aRect.origin.x += 1.5;
|
||
|
aRect.size.width -= 1;
|
||
|
|
||
|
aRect.origin.x -= 1;
|
||
|
aRect.size.width += 1;
|
||
|
|
||
|
// rollover
|
||
|
if ([cell isHighlighted])
|
||
|
{
|
||
|
[[NSColor colorWithCalibratedWhite:0.0 alpha:0.1] set];
|
||
|
NSRectFillUsingOperation(aRect, NSCompositeSourceAtop);
|
||
|
}
|
||
|
|
||
|
// frame
|
||
|
|
||
|
[lineColor set];
|
||
|
[bezier moveToPoint:NSMakePoint(aRect.origin.x + aRect.size.width, aRect.origin.y-0.5)];
|
||
|
if (!([cell tabState] & PSMTab_RightIsSelectedMask)) {
|
||
|
[bezier lineToPoint:NSMakePoint(NSMaxX(aRect), NSMaxY(aRect))];
|
||
|
}
|
||
|
|
||
|
[bezier stroke];
|
||
|
|
||
|
// Create a thin lighter line next to the dividing line for a bezel effect
|
||
|
if (!([cell tabState] & PSMTab_RightIsSelectedMask)) {
|
||
|
[[[NSColor whiteColor] colorWithAlphaComponent:0.5] set];
|
||
|
[NSBezierPath strokeLineFromPoint:NSMakePoint(NSMaxX(aRect)+1.0, aRect.origin.y-0.5)
|
||
|
toPoint:NSMakePoint(NSMaxX(aRect)+1.0, NSMaxY(aRect)-2.5)];
|
||
|
}
|
||
|
|
||
|
// If this is the leftmost tab, we want to draw a line on the left, too
|
||
|
if ([cell tabState] & PSMTab_PositionLeftMask)
|
||
|
{
|
||
|
[lineColor set];
|
||
|
[NSBezierPath strokeLineFromPoint:NSMakePoint(aRect.origin.x,aRect.origin.y-0.5)
|
||
|
toPoint:NSMakePoint(aRect.origin.x,NSMaxY(aRect)-2.5)];
|
||
|
[[[NSColor whiteColor] colorWithAlphaComponent:0.5] set];
|
||
|
[NSBezierPath strokeLineFromPoint:NSMakePoint(aRect.origin.x+1.0,aRect.origin.y-0.5)
|
||
|
toPoint:NSMakePoint(aRect.origin.x+1.0,NSMaxY(aRect)-2.5)];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[self drawInteriorWithTabCell:cell inView:[cell controlView]];
|
||
|
}
|
||
|
|
||
|
|
||
|
- (void)drawInteriorWithTabCell:(PSMTabBarCell *)cell inView:(NSView*)controlView
|
||
|
{
|
||
|
NSRect cellFrame = [cell frame];
|
||
|
CGFloat labelPosition = cellFrame.origin.x + MARGIN_X;
|
||
|
|
||
|
// close button
|
||
|
if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) {
|
||
|
NSSize closeButtonSize = NSZeroSize;
|
||
|
NSRect closeButtonRect = [cell closeButtonRectForFrame:cellFrame];
|
||
|
NSImage * closeButton = nil;
|
||
|
|
||
|
closeButton = [cell isEdited] ? unifiedCloseDirtyButton : unifiedCloseButton;
|
||
|
|
||
|
if ([cell closeButtonOver]) closeButton = [cell isEdited] ? unifiedCloseDirtyButtonOver : unifiedCloseButtonOver;
|
||
|
if ([cell closeButtonPressed]) closeButton = [cell isEdited] ? unifiedCloseDirtyButtonDown : unifiedCloseButtonDown;
|
||
|
|
||
|
closeButtonSize = [closeButton size];
|
||
|
if ([controlView isFlipped]) {
|
||
|
closeButtonRect.origin.y += closeButtonRect.size.height;
|
||
|
}
|
||
|
|
||
|
[closeButton compositeToPoint:closeButtonRect.origin operation:NSCompositeSourceOver fraction:1.0];
|
||
|
|
||
|
// scoot label over
|
||
|
labelPosition += closeButtonSize.width + kPSMTabBarCellPadding;
|
||
|
}
|
||
|
|
||
|
// icon
|
||
|
if ([cell hasIcon]) {
|
||
|
NSRect iconRect = [self iconRectForTabCell:cell];
|
||
|
NSImage *icon = [[[cell representedObject] identifier] icon];
|
||
|
if ([controlView isFlipped]) {
|
||
|
iconRect.origin.y += iconRect.size.height;
|
||
|
}
|
||
|
|
||
|
// center in available space (in case icon image is smaller than kPSMTabBarIconWidth)
|
||
|
if ([icon size].width < kPSMTabBarIconWidth) {
|
||
|
iconRect.origin.x += (kPSMTabBarIconWidth - [icon size].width) / 2.0;
|
||
|
}
|
||
|
if ([icon size].height < kPSMTabBarIconWidth) {
|
||
|
iconRect.origin.y -= (kPSMTabBarIconWidth - [icon size].height) / 2.0;
|
||
|
}
|
||
|
|
||
|
[icon compositeToPoint:iconRect.origin operation:NSCompositeSourceOver fraction:1.0];
|
||
|
|
||
|
// scoot label over
|
||
|
labelPosition += iconRect.size.width + kPSMTabBarCellPadding;
|
||
|
}
|
||
|
|
||
|
// label rect
|
||
|
NSRect labelRect;
|
||
|
labelRect.origin.x = labelPosition;
|
||
|
labelRect.size.width = cellFrame.size.width - (labelRect.origin.x - cellFrame.origin.x) - kPSMTabBarCellPadding;
|
||
|
NSSize s = [[cell attributedStringValue] size];
|
||
|
labelRect.origin.y = cellFrame.origin.y + (cellFrame.size.height-s.height) / 2.0 - 1.0;
|
||
|
labelRect.size.height = s.height;
|
||
|
|
||
|
if (![[cell indicator] isHidden]) {
|
||
|
labelRect.size.width -= (kPSMTabBarIndicatorWidth + kPSMTabBarCellPadding);
|
||
|
}
|
||
|
|
||
|
// object counter
|
||
|
if ([cell count] > 0) {
|
||
|
[[cell countColor] ?: [NSColor colorWithCalibratedWhite:0.3 alpha:0.6] set];
|
||
|
NSBezierPath *path = [NSBezierPath bezierPath];
|
||
|
NSRect myRect = [self objectCounterRectForTabCell:cell];
|
||
|
myRect.origin.y -= 1.0;
|
||
|
[path moveToPoint:NSMakePoint(myRect.origin.x + kPSMUnifiedObjectCounterRadius, myRect.origin.y)];
|
||
|
[path lineToPoint:NSMakePoint(myRect.origin.x + myRect.size.width - kPSMUnifiedObjectCounterRadius, myRect.origin.y)];
|
||
|
[path appendBezierPathWithArcWithCenter:NSMakePoint(myRect.origin.x + myRect.size.width - kPSMUnifiedObjectCounterRadius, myRect.origin.y + kPSMUnifiedObjectCounterRadius) radius:kPSMUnifiedObjectCounterRadius startAngle:270.0 endAngle:90.0];
|
||
|
[path lineToPoint:NSMakePoint(myRect.origin.x + kPSMUnifiedObjectCounterRadius, myRect.origin.y + myRect.size.height)];
|
||
|
[path appendBezierPathWithArcWithCenter:NSMakePoint(myRect.origin.x + kPSMUnifiedObjectCounterRadius, myRect.origin.y + kPSMUnifiedObjectCounterRadius) radius:kPSMUnifiedObjectCounterRadius startAngle:90.0 endAngle:270.0];
|
||
|
[path fill];
|
||
|
|
||
|
// draw attributed string centered in area
|
||
|
NSRect counterStringRect;
|
||
|
NSAttributedString *counterString = [self attributedObjectCountValueForTabCell:cell];
|
||
|
counterStringRect.size = [counterString size];
|
||
|
counterStringRect.origin.x = myRect.origin.x + ((myRect.size.width - counterStringRect.size.width) / 2.0) + 0.25;
|
||
|
counterStringRect.origin.y = myRect.origin.y + ((myRect.size.height - counterStringRect.size.height) / 2.0) + 0.5;
|
||
|
[counterString drawInRect:counterStringRect];
|
||
|
|
||
|
labelRect.size.width -= myRect.size.width + kPSMTabBarCellPadding;
|
||
|
}
|
||
|
|
||
|
// label
|
||
|
[[cell attributedStringValue] drawInRect:labelRect];
|
||
|
}
|
||
|
|
||
|
- (void)drawBackgroundInRect:(NSRect)rect
|
||
|
{
|
||
|
//Draw for our whole bounds; it'll be automatically clipped to fit the appropriate drawing area
|
||
|
rect = [tabBar bounds];
|
||
|
|
||
|
NSRect gradientRect = rect;
|
||
|
gradientRect.size.height -= 1.0;
|
||
|
|
||
|
NSBezierPath *path = [NSBezierPath bezierPathWithRect:gradientRect];
|
||
|
[path linearGradientFillWithStartColor:[NSColor colorWithCalibratedWhite:0.835 alpha:1.0]
|
||
|
endColor:[NSColor colorWithCalibratedWhite:0.843 alpha:1.0]];
|
||
|
[[NSColor colorWithCalibratedWhite:0.576 alpha:1.0] set];
|
||
|
[NSBezierPath strokeLineFromPoint:NSMakePoint(rect.origin.x, NSMaxY(rect) - 0.5)
|
||
|
toPoint:NSMakePoint(NSMaxX(rect), NSMaxY(rect) - 0.5)];
|
||
|
|
||
|
if (![[[tabBar tabView] window] isKeyWindow]) {
|
||
|
[[NSColor windowBackgroundColor] set];
|
||
|
NSRectFill(gradientRect);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- (void)drawTabBar:(PSMTabBarControl *)bar inRect:(NSRect)rect
|
||
|
{
|
||
|
tabBar = bar;
|
||
|
[self drawBackgroundInRect:rect];
|
||
|
|
||
|
// no tab view == not connected
|
||
|
if (![bar tabView]) {
|
||
|
NSRect labelRect = rect;
|
||
|
labelRect.size.height -= 4.0;
|
||
|
labelRect.origin.y += 4.0;
|
||
|
NSMutableAttributedString *attrStr;
|
||
|
NSString *contents = @"PSMTabBarControl";
|
||
|
attrStr = [[[NSMutableAttributedString alloc] initWithString:contents] autorelease];
|
||
|
NSRange range = NSMakeRange(0, [contents length]);
|
||
|
[attrStr addAttribute:NSFontAttributeName value:[NSFont systemFontOfSize:11.0] range:range];
|
||
|
NSMutableParagraphStyle *centeredParagraphStyle = nil;
|
||
|
if (!centeredParagraphStyle) {
|
||
|
centeredParagraphStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] retain];
|
||
|
[centeredParagraphStyle setAlignment:NSCenterTextAlignment];
|
||
|
}
|
||
|
[attrStr addAttribute:NSParagraphStyleAttributeName value:centeredParagraphStyle range:range];
|
||
|
[attrStr drawInRect:labelRect];
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// draw cells
|
||
|
NSEnumerator *e = [[bar cells] objectEnumerator];
|
||
|
PSMTabBarCell *cell;
|
||
|
while ( (cell = [e nextObject]) ) {
|
||
|
if ([bar isAnimating] || (![cell isInOverflowMenu] && NSIntersectsRect([cell frame], rect))) {
|
||
|
[cell drawWithFrame:[cell frame] inView:bar];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark Archiving
|
||
|
|
||
|
- (void)encodeWithCoder:(NSCoder *)aCoder
|
||
|
{
|
||
|
//[super encodeWithCoder:aCoder];
|
||
|
if ([aCoder allowsKeyedCoding]) {
|
||
|
[aCoder encodeObject:unifiedCloseButton forKey:@"unifiedCloseButton"];
|
||
|
[aCoder encodeObject:unifiedCloseButtonDown forKey:@"unifiedCloseButtonDown"];
|
||
|
[aCoder encodeObject:unifiedCloseButtonOver forKey:@"unifiedCloseButtonOver"];
|
||
|
[aCoder encodeObject:unifiedCloseDirtyButton forKey:@"unifiedCloseDirtyButton"];
|
||
|
[aCoder encodeObject:unifiedCloseDirtyButtonDown forKey:@"unifiedCloseDirtyButtonDown"];
|
||
|
[aCoder encodeObject:unifiedCloseDirtyButtonOver forKey:@"unifiedCloseDirtyButtonOver"];
|
||
|
[aCoder encodeObject:_addTabButtonImage forKey:@"addTabButtonImage"];
|
||
|
[aCoder encodeObject:_addTabButtonPressedImage forKey:@"addTabButtonPressedImage"];
|
||
|
[aCoder encodeObject:_addTabButtonRolloverImage forKey:@"addTabButtonRolloverImage"];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- (id)initWithCoder:(NSCoder *)aDecoder
|
||
|
{
|
||
|
// self = [super initWithCoder:aDecoder];
|
||
|
//if (self) {
|
||
|
if ([aDecoder allowsKeyedCoding]) {
|
||
|
unifiedCloseButton = [[aDecoder decodeObjectForKey:@"unifiedCloseButton"] retain];
|
||
|
unifiedCloseButtonDown = [[aDecoder decodeObjectForKey:@"unifiedCloseButtonDown"] retain];
|
||
|
unifiedCloseButtonOver = [[aDecoder decodeObjectForKey:@"unifiedCloseButtonOver"] retain];
|
||
|
unifiedCloseDirtyButton = [[aDecoder decodeObjectForKey:@"unifiedCloseDirtyButton"] retain];
|
||
|
unifiedCloseDirtyButtonDown = [[aDecoder decodeObjectForKey:@"unifiedCloseDirtyButtonDown"] retain];
|
||
|
unifiedCloseDirtyButtonOver = [[aDecoder decodeObjectForKey:@"unifiedCloseDirtyButtonOver"] retain];
|
||
|
_addTabButtonImage = [[aDecoder decodeObjectForKey:@"addTabButtonImage"] retain];
|
||
|
_addTabButtonPressedImage = [[aDecoder decodeObjectForKey:@"addTabButtonPressedImage"] retain];
|
||
|
_addTabButtonRolloverImage = [[aDecoder decodeObjectForKey:@"addTabButtonRolloverImage"] retain];
|
||
|
}
|
||
|
//}
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
@end
|