Hmmm. Making my cell a subclass of NSTextFieldCell solved the problem.

I would dearly love to get a look at the the source for NSTextFieldCell to see what it's doing, behind-the-scenes, that makes this binding work. In general, it would be a boon to developers if Apple would open up the source for these types of core AppKit classes. It's not like NSTextFieldCell is some cutting edge class and would be a great way for developers to see how to create subclasses "the right way."

Anyway, thanks for the tip, it works perfectly now. Just wish I knew why...

-Ken




On Feb 12, 2009, at 6:18 PM, Corbin Dunn wrote:


On Feb 12, 2009, at 1:18 PM, Ken Tozier wrote:

24 hours later, still completely stumped on this one. The sticking point seems to be that Apple's NSTextFieldCell is doing something that is not clearly defined in the Key-Value Observing/Key-Value coding documentation to allow the following to work

Your best bet is to probably just subclass NSTextFieldCell -- which is probably correct for your cell, since you want to draw some text and other sub cells. Modify the rect that you want the text to draw in, and just call [super] to do the real drawing work.


[column bind: @"value" toObject: arrayController withKeyPath: @"arrangedObjects.name" options: nil];

I suspect that all I'm missing is some required accessor, but nowhere in the documentation does Apple offer a step by step example on how to write a bindable custom NSCell subclass. What methods are absolutely required? What methods are optional?

Please do log a bug requesting our documentation be clarified for how to do this, and also log a bug saying that you can't bind the value parameter of a plain NSCell. If you can, also enclose your test project/code.

thank you!

corbin


Here's my custom cell code. Where am I going wrong?

Thanks for any help

@interface PMXDocumentCell : NSCell
{
        NSButtonCell            *addButton;
        
        NSImage                 *backImage,
                                                *backSelectedImage,
                                                *addButtonImage,
                                                *addButtonSelectedImage,
                                                *currentBackImage;
                                                
        NSString                        *documentName;
        
        NSDictionary            *textAttributes;
}

+ (id) documentCell;
- (void) initImages;
- (void) initSubCells;

- (NSString *) documentName;
- (void) setDocumentName:(NSString *) inName;

- (id) objectValue;
- (void) setObjectValue:(id) inObject;


@end

#define ADD_BUTTON_SIZE                 17

@implementation PMXDocumentCell

+ (id) documentCell
{
        return [[[PMXDocumentCell alloc]
                                init]
                                autorelease];
}

- (id) init
{
        self = [super init];
        if (self)
        {
                [self initImages];
                [self initSubCells];
                
                currentBackImage        = backImage;
                textAttributes                  = [[NSDictionary alloc] 
initWithObjectsAndKeys:
                                                                        
[NSColor blackColor], NSForegroundColorAttributeName,
                                                                        [NSFont 
systemFontOfSize:13], NSFontAttributeName,
                                                                        nil];   
        }
        
        return self;
}

- (void) initImages
{
        NSBundle                                *bundle         = [NSBundle 
bundleForClass: [self class]];
        NSString                                *path;
        
        path                                    = [bundle pathForResource: @"add_button" 
ofType: @"png"];
        addButtonImage                  = [[NSImage alloc] 
initWithContentsOfFile: path];
        
path = [bundle pathForResource: @"add_button_white" ofType: @"png"]; addButtonSelectedImage = [[NSImage alloc] initWithContentsOfFile: path];
        
        path                                    = [bundle pathForResource: @"toolbar_25" 
ofType: @"png"];
        backImage                               = [[NSImage alloc] 
initWithContentsOfFile: path];
        
path = [bundle pathForResource: @"toolbar_25_focus" ofType: @"png"];
        backSelectedImage               = [[NSImage alloc] 
initWithContentsOfFile: path];
        
        // set resizing
        [addButtonImage setScalesWhenResized: YES];
        [addButtonSelectedImage setScalesWhenResized: YES];
        [backImage setScalesWhenResized: YES];
        [backSelectedImage setScalesWhenResized: YES];
        
        // size button images
[addButtonImage setSize: NSMakeSize(ADD_BUTTON_SIZE, ADD_BUTTON_SIZE)]; [addButtonSelectedImage setSize: NSMakeSize(ADD_BUTTON_SIZE, ADD_BUTTON_SIZE)];
}

- (void) initSubCells
{
        addButton                       = [[NSButtonCell alloc] init];
        [addButton setBordered: NO];
        [addButton setButtonType: NSMomentaryChangeButton];
        [addButton setImage: addButtonImage];
        [addButton setAlternateImage: addButtonSelectedImage];
}

- (void) drawWithFrame:(NSRect) inCellFrame
                        inView:(NSView *) inControlView
{
NSRect buttonFrame = NSMakeRect(inCellFrame.size.width - ADD_BUTTON_SIZE - 6, inCellFrame.origin.y, ADD_BUTTON_SIZE, ADD_BUTTON_SIZE), nameFrame = NSMakeRect(6, inCellFrame.origin.y, inCellFrame.size.width - ADD_BUTTON_SIZE - 12 , ADD_BUTTON_SIZE);
        
NSPoint textPoint = NSMakePoint(inCellFrame.origin.x + 1, inCellFrame.origin.y);
        
currentBackImage = [self isHighlighted] ? backSelectedImage : backImage ;

        [currentBackImage drawAtPoint: inCellFrame.origin
                        fromRect: NSZeroRect
                        operation: NSCompositeSourceOver
                        fraction: 1.0];
                        
        [addButton drawWithFrame: buttonFrame
                        inView: inControlView];
        
        [documentName drawInRect: nameFrame
                        withAttributes: textAttributes];
}

- (NSString *) objectValue
{
        return documentName;
}


- (void) setObjectValue:(id) inObject
{
        if (inObject == nil)
                inObject        = @"document name";
                
        if ([inObject isKindOfClass: [NSString class]])
                [self setStringValue: inObject];
        else
[NSException raise: NSInvalidArgumentException format: @"%@ Invalid object %@", NSStringFromSelector(_cmd), inObject];
}

- (NSString *) documentName
{
        return documentName;
}

- (void) setDocumentName:(NSString *) inName
{
        [inName retain];
        [documentName release];
        documentName    = inName;
        
        // Tell control view to redisplay us.
        [(NSControl *)[self controlView] updateCell: self];
}

@end



_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to