diff options
Diffstat (limited to 'Source/SPFavoriteTextFieldCell.m')
-rw-r--r-- | Source/SPFavoriteTextFieldCell.m | 208 |
1 files changed, 36 insertions, 172 deletions
diff --git a/Source/SPFavoriteTextFieldCell.m b/Source/SPFavoriteTextFieldCell.m index e084d173..f9ebd280 100644 --- a/Source/SPFavoriteTextFieldCell.m +++ b/Source/SPFavoriteTextFieldCell.m @@ -32,17 +32,6 @@ #import "SPFavoriteTextFieldCell.h" -#define FAVORITE_NAME_FONT_SIZE 12.0f - -@interface SPFavoriteTextFieldCell (PrivateAPI) - -- (NSAttributedString *)constructSubStringAttributedString; -- (NSAttributedString *)attributedStringForFavoriteName; -- (NSDictionary *)mainStringAttributedStringAttributes; -- (NSDictionary *)subStringAttributedStringAttributes; - -@end - @implementation SPFavoriteTextFieldCell /** @@ -51,10 +40,7 @@ - (id)init { if ((self = [super init])) { - mainStringColor = [NSColor blackColor]; - subStringColor = [NSColor grayColor]; - favoriteName = nil; - favoriteHost = nil; + drawsDividerUnderCell = NO; } return self; @@ -63,186 +49,64 @@ - (id)copyWithZone:(NSZone *)zone { SPFavoriteTextFieldCell *cell = (SPFavoriteTextFieldCell *)[super copyWithZone:zone]; - - cell->favoriteName = nil; - if (favoriteName) cell->favoriteName = [favoriteName copyWithZone:zone]; - cell->favoriteHost = nil; - if (favoriteHost) cell->favoriteHost = [favoriteHost copyWithZone:zone]; + cell->drawsDividerUnderCell = drawsDividerUnderCell; return cell; } /** - * Get the cell's favorite name. - */ -- (NSString *)favoriteName -{ - return favoriteName; -} - -/** - * Set the cell's favorite name to the supplied name. + * Returns whether this cell is set to draw a divider in the space directly below + * the cell (whatever currently populates that space). */ -- (void)setFavoriteName:(NSString *)name +- (BOOL)drawsDividerUnderCell { - if (favoriteName != name) { - [favoriteName release]; - favoriteName = [name retain]; - } + return drawsDividerUnderCell; } /** - * Get the cell's favorite host. + * Set whether this cell should draw a divider in the space directly below + * the cell (whatever currently populates that space). */ -- (NSString *)favoriteHost +- (void)setDrawsDividerUnderCell:(BOOL)drawsDivider { - return favoriteHost; + drawsDividerUnderCell = drawsDivider; } -/** - * Set the cell's favorite host to the supplied name. - */ -- (void)setFavoriteHost:(NSString *)host -{ - if (favoriteHost != host) { - [favoriteHost release]; - favoriteHost = [host retain]; - } -} +#pragma mark - /** - * Draws the actual cell. + * Draws the actual cell, with a divider if appropriate. */ - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { - (([self isHighlighted]) && (![[self highlightColorWithFrame:cellFrame inView:controlView] isEqualTo:[NSColor secondarySelectedControlColor]])) ? [self invertFontColors] : [self restoreFontColors]; - - // Construct and get the sub text attributed string - NSAttributedString *mainString = [self attributedStringForFavoriteName]; - NSAttributedString *subString = [self constructSubStringAttributedString]; - - NSRect subFrame = NSMakeRect(0.0f, 0.0f, [subString size].width, [subString size].height); - - // Total height of both strings with a 2 pixel separation space - CGFloat totalHeight = [mainString size].height + [subString size].height + 1.0f; - - cellFrame.origin.y += (cellFrame.size.height - totalHeight) / 2.0f; - cellFrame.origin.x += 10.0f; // Indent main string from image - - // Position the sub text's frame rect - subFrame.origin.y = [mainString size].height + cellFrame.origin.y + 1.0f; - subFrame.origin.x = cellFrame.origin.x; - - cellFrame.size.height = totalHeight; - - NSUInteger i; - CGFloat maxWidth = cellFrame.size.width; - CGFloat mainStringWidth = [mainString size].width; - CGFloat subStringWidth = [subString size].width; - - // Set a right-padding - maxWidth -= 10; - - if (maxWidth < mainStringWidth) { - for (i = 0; i <= [mainString length]; i++) { - if ([[mainString attributedSubstringFromRange:NSMakeRange(0, i)] size].width >= maxWidth && i >= 3) { - mainString = [[[NSMutableAttributedString alloc] initWithString:[[[mainString attributedSubstringFromRange:NSMakeRange(0, i - 3)] string] stringByAppendingString:@"..."] attributes:[self mainStringAttributedStringAttributes]] autorelease]; - } - } - } - - if (maxWidth < subStringWidth) { - for (i = 0; i <= [subString length]; i++) { - if ([[subString attributedSubstringFromRange:NSMakeRange(0, i)] size].width >= maxWidth && i >= 3) { - subString = [[[NSMutableAttributedString alloc] initWithString:[[[subString attributedSubstringFromRange:NSMakeRange(0, i - 3)] string] stringByAppendingString:@"..."] attributes:[self subStringAttributedStringAttributes]] autorelease]; - } - } - } - - [mainString drawInRect:cellFrame]; - [subString drawInRect:subFrame]; -} + [super drawInteriorWithFrame:cellFrame inView:controlView]; -- (NSSize)cellSize -{ - NSSize cellSize = [super cellSize]; - NSAttributedString *mainString = [self attributedStringForFavoriteName]; - NSAttributedString *subString = [self constructSubStringAttributedString]; - - // 15 := indention 10 from image to string plus 5 px padding - CGFloat theWidth = MAX([mainString size].width, [subString size].width) + (([self image] != nil) ? [[self image] size].width : 0) + 15; + if (drawsDividerUnderCell) { + NSRect viewFrame = [controlView frame]; - CGFloat totalHeight = [mainString size].height + [subString size].height + 1.0f; - - cellSize.width = theWidth; - cellSize.height = totalHeight + 13.0f; - return cellSize; -} + NSPoint startPoint = NSMakePoint(viewFrame.origin.x + 7.f, viewFrame.origin.y); + NSPoint endPoint = NSMakePoint(viewFrame.origin.x + viewFrame.size.width - 7.f, viewFrame.origin.y); -/** - * Inverts the displayed font colors when the cell is selected. - */ -- (void)invertFontColors -{ - mainStringColor = [NSColor whiteColor]; - subStringColor = [NSColor whiteColor]; -} - -/** - * Restores the displayed font colors once the cell is no longer selected. - */ -- (void)restoreFontColors -{ - mainStringColor = [NSColor blackColor]; - subStringColor = [NSColor grayColor]; -} - -/** - * Dealloc. - */ -- (void)dealloc -{ - [favoriteName release], favoriteName = nil; - [favoriteHost release], favoriteHost = nil; - - [super dealloc]; -} - -@end - -@implementation SPFavoriteTextFieldCell (PrivateAPI) - -/** - * Constructs the attributed string to be used as the cell's substring. - */ -- (NSAttributedString *)constructSubStringAttributedString -{ - return [[[NSAttributedString alloc] initWithString:favoriteHost attributes:[self subStringAttributedStringAttributes]] autorelease]; -} - -/** - * Constructs the attributed string for the cell's favorite name. - */ -- (NSAttributedString *)attributedStringForFavoriteName -{ - return [[[NSAttributedString alloc] initWithString:favoriteName attributes:[self mainStringAttributedStringAttributes]] autorelease]; -} - -/** - * Returns the attributes of the cell's main string. - */ -- (NSDictionary *)mainStringAttributedStringAttributes -{ - return [NSDictionary dictionaryWithObjectsAndKeys:mainStringColor, NSForegroundColorAttributeName, [NSFont systemFontOfSize:FAVORITE_NAME_FONT_SIZE], NSFontAttributeName, nil]; -} + if ([controlView isFlipped]) { + startPoint.y += cellFrame.size.height + 8.5f; + endPoint.y += cellFrame.size.height + 8.5f; + } else { + startPoint.y -= cellFrame.size.height + 8.5f; + endPoint.y -= cellFrame.size.height + 8.5f; + } -/** - * Returns the attributes of the cell's sub string. - */ -- (NSDictionary *)subStringAttributedStringAttributes -{ - return [NSDictionary dictionaryWithObjectsAndKeys:subStringColor, NSForegroundColorAttributeName, [NSFont systemFontOfSize:[NSFont smallSystemFontSize]], NSFontAttributeName, nil]; + [NSGraphicsContext saveGraphicsState]; + [[NSColor gridColor] set]; + NSShadow *lineGlow = [[NSShadow alloc] init]; + [lineGlow setShadowBlurRadius:1]; + [lineGlow setShadowColor:[[NSColor controlLightHighlightColor] colorWithAlphaComponent:0.75f]]; + [lineGlow setShadowOffset:NSMakeSize(0, -1)]; + [lineGlow set]; + [NSBezierPath strokeLineFromPoint:startPoint toPoint:endPoint]; + [lineGlow release]; + [NSGraphicsContext restoreGraphicsState]; + } } -@end +@end
\ No newline at end of file |