views:

118

answers:

1

I have created a Sub-Class of NSOutlineView and used the below code to make the row colors alternate.

Header File.

#import <Cocoa/Cocoa.h>


@interface MyOutlineView : NSOutlineView {
}

- (void) drawStripesInRect:(NSRect)clipRect;

@end

Implementation File.

#import "MyOutlineView.h"

// RGB values for stripe color (light blue)
#define STRIPE_RED   (237.0 / 255.0)
#define STRIPE_GREEN (243.0 / 255.0)
#define STRIPE_BLUE  (254.0 / 255.0)
static NSColor *sStripeColor = nil;

@implementation MyOutlineView

// This is called after the table background is filled in,
// but before the cell contents are drawn.
// We override it so we can do our own light-blue row stripes a la iTunes.
- (void) highlightSelectionInClipRect:(NSRect)rect {
    [self drawStripesInRect:rect];
    [super highlightSelectionInClipRect:rect];
}

// This routine does the actual blue stripe drawing,
// filling in every other row of the table with a blue background
// so you can follow the rows easier with your eyes.
- (void) drawStripesInRect:(NSRect)clipRect {
    NSRect stripeRect;
    float fullRowHeight = [self rowHeight] + [self intercellSpacing].height;
    float clipBottom = NSMaxY(clipRect);
    int firstStripe = clipRect.origin.y / fullRowHeight;
    if (firstStripe % 2 == 0)
        firstStripe++;   // we're only interested in drawing the stripes
    // set up first rect
    stripeRect.origin.x = clipRect.origin.x;
    stripeRect.origin.y = firstStripe * fullRowHeight;
    stripeRect.size.width = clipRect.size.width;
    stripeRect.size.height = fullRowHeight;
    // set the color
    if (sStripeColor == nil)
        sStripeColor = [[NSColor colorWithCalibratedRed:STRIPE_RED
                 green:STRIPE_GREEN
                  blue:STRIPE_BLUE
                 alpha:1.0] retain];
    [sStripeColor set];
    // and draw the stripes
    while (stripeRect.origin.y < clipBottom) {
        NSRectFill(stripeRect);
        stripeRect.origin.y += fullRowHeight * 2.0;
    }
}

@end

But the Problem is that what the code is supposed to do doesn't happen to the Outline View, the code is correct but do I need to connect the Outline View to the code is some way?

+4  A: 

If you instantiate the outline view in IB, you need to set the class name of your outline view to "MyOutlineView" in the Identity inspector. Remember to double click on the control so that the inner rectangle is selected and the Inspector window title is "Outline View Identity"; a single click of the control will only select the scroll view (an outline view is embedded in a scroll view).

If you create your outline view programmatically, just be sure to instantiate a MyOutlineView instead of an NSOutlineView:

MyOutlineView *outlineView = [[MyOutlineView alloc] initWithFrame:rect];

where rect is the frame of your outline view.

Perspx
Perfect! You're amazing! Just wondering if you could help me with 1 last thing, How would I make the grid line color Yellow instead of Blue. I know I would have to change the numbers where it says define but what would i need to change it to? Thanks very very much!
Joshua
STRIPE_RED, STRIPE_GREEN and STRIPE_BLUE are the RGB values of the colours. If you find the RGB values of the yellow that you want, change those defines accordingly, keeping the /255.0 since they are evidently represented as a decimal between 0 and 1.
Perspx