Drawing a “mail like†border on items in an NSTableView
June 10th, 2005 at 8:35 am (trackback)
Mail has a cool way of making unread messages stand out. It is really easy to do this type of thing with NSTableView/NSOutlineView. Subclass the one you want, and override drawRow. Toss in the code you see below, and it should give a cool highlight on all expandable rows in an NSOutlineView (you will have to modify it to have it work in NSTableView — just remove the call to isExpandable).

- (void)drawRow:(int)row clipRect:(NSRect)clipRect {
if (([self isExpandable:[self itemAtRow:row]]) && (![self isRowSelected:row])) {
// Draw a light-blue “mail like†border around the row, if not selected
NSRect rect = [self rectOfRow:row];
[[[NSColor blueColor] colorWithAlphaComponent:50/255.0] set];
NSBezierPath *path = [NSBezierPath bezierPath];
[path setLineCapStyle:NSRoundLineCapStyle];
[path setLineWidth:rect.size.height - 3];
int rowLevel = [self levelForRow:row];
float x = rect.origin.x + 10.0 + (rowLevel * [self indentationPerLevel]);
float y = rect.origin.y + (rect.size.height / 2.0);
[path moveToPoint:NSMakePoint(x,y)];
[path lineToPoint:NSMakePoint(x + rect.size.width - 2*10.0, y)];
[path stroke];
}
[super drawRow:row clipRect:clipRect];
}
NOTE: use this at your own risk. I think resizing the thing doesn’t quite work.
This entry was posted
on Friday, June 10th, 2005 at 8:35 am and is filed under Apple, Cocoa, General.
You can follow any responses to this entry through the
RSS 2.0 feed.
You can leave a response, or
trackback
from your own site.








March 10th, 2006 at 10:47 am
If it does not work in all cases, ie is robust, then it is not actually easy is it? Since of course you have not accomplished the task.