Search code examples
objective-ccocoanstableviewhighlighting

Change highlighting color in NSTableView in Cocoa?


I am developing a Cocoa application and encountered a problem with highlighting. Standard highlighting color in MAC OS X applications is blue, but it doesn't suit my app, since because of design concepts, I need a green color for highlighting.

I tried to subclass NSTableview and override method

- (void)highlightSelectionInClipRect:(NSRect)clipRect

but it didn't help.

How to fix this problem?


Solution

  • I am using this, and so far works perfectly:

    - (void)highlightSelectionInClipRect:(NSRect)theClipRect
    {
    
            // this method is asking us to draw the hightlights for 
            // all of the selected rows that are visible inside theClipRect
    
            // 1. get the range of row indexes that are currently visible
            // 2. get a list of selected rows
            // 3. iterate over the visible rows and if their index is selected
            // 4. draw our custom highlight in the rect of that row.
    
        NSRange         aVisibleRowIndexes = [self rowsInRect:theClipRect];
        NSIndexSet *    aSelectedRowIndexes = [self selectedRowIndexes];
        int             aRow = aVisibleRowIndexes.location;
        int             anEndRow = aRow + aVisibleRowIndexes.length;
        NSGradient *    gradient;
        NSColor *       pathColor;
    
            // if the view is focused, use highlight color, otherwise use the out-of-focus highlight color
        if (self == [[self window] firstResponder] && [[self window] isMainWindow] && [[self window] isKeyWindow])
        {
            gradient = [[[NSGradient alloc] initWithColorsAndLocations:
                         [NSColor colorWithDeviceRed:(float)62/255 green:(float)133/255 blue:(float)197/255 alpha:1.0], 0.0, 
                         [NSColor colorWithDeviceRed:(float)48/255 green:(float)95/255 blue:(float)152/255 alpha:1.0], 1.0, nil] retain]; //160 80
    
            pathColor = [[NSColor colorWithDeviceRed:(float)48/255 green:(float)95/255 blue:(float)152/255 alpha:1.0] retain];
        }
        else
        {
            gradient = [[[NSGradient alloc] initWithColorsAndLocations:
                         [NSColor colorWithDeviceRed:(float)190/255 green:(float)190/255 blue:(float)190/255 alpha:1.0], 0.0, 
                         [NSColor colorWithDeviceRed:(float)150/255 green:(float)150/255 blue:(float)150/255 alpha:1.0], 1.0, nil] retain];
    
            pathColor = [[NSColor colorWithDeviceRed:(float)150/255 green:(float)150/255 blue:(float)150/255 alpha:1.0] retain];
        }
    
            // draw highlight for the visible, selected rows
        for (aRow; aRow < anEndRow; aRow++)
        {
            if([aSelectedRowIndexes containsIndex:aRow])
            {
                NSRect aRowRect = NSInsetRect([self rectOfRow:aRow], 1, 4); //first is horizontal, second is vertical
                NSBezierPath * path = [NSBezierPath bezierPathWithRoundedRect:aRowRect xRadius:4.0 yRadius:4.0]; //6.0
                    [path setLineWidth: 2];
                    [pathColor set];
                    [path stroke];
    
                [gradient drawInBezierPath:path angle:90];
            }
        }
    }