/**
TODO Description
*/ @implementation NSFormCell + (void) initialize { if (self == [NSFormCell class]) { [self setVersion: 1]; } } /* The title attributes are those inherited from the NSActionCell class. */ - (id) init { return [self initTextCell: @"Field:"]; } /**Initializes and returns new NSFormCell with aString as its title and the text cell with an empty NSString.
See Also: [NSCell-initTextCell:]
*/ - (id) initTextCell: (NSString *)aString { self = [super initTextCell: @""]; if (nil == self) return nil; _cell.is_bezeled = YES; _cell.is_editable = YES; [self setAlignment: NSLeftTextAlignment]; _titleCell = [[NSCell alloc] initTextCell: aString]; [_titleCell setAlignment: NSRightTextAlignment]; _formcell_auto_title_width = YES; _displayedTitleWidth = -1; return self; } - (void)dealloc { RELEASE(_titleCell); TEST_RELEASE(_placeholder); [super dealloc]; } /**Returns whether the NSFormCell is Opaque. Returns YES if the textCell and the title cell are both Opaque, NO otherwise
See Also: [NSCell-isOpaque]
*/ - (BOOL)isOpaque { return [_titleCell isOpaque] && [super isOpaque]; } - (void)setAttributedTitle: (NSAttributedString *)anAttributedString { [_titleCell setAttributedStringValue: anAttributedString]; if (_formcell_auto_title_width) { // Invalidates title width _displayedTitleWidth = -1; // Update the control(s) [[NSNotificationCenter defaultCenter] postNotificationName: _NSFormCellDidChangeTitleWidthNotification object: self]; } } /**Sets the NSFormCell title to aString. TODO => _formcell_auto_title_width / Update the control(s)
*/ - (void)setTitle: (NSString*)aString { [_titleCell setStringValue: aString]; if (_formcell_auto_title_width) { // Invalidates title width _displayedTitleWidth = -1; // Update the control(s) [[NSNotificationCenter defaultCenter] postNotificationName: _NSFormCellDidChangeTitleWidthNotification object: self]; } } - (void)setTitleWithMnemonic:(NSString *)titleWithAmpersand { [_titleCell setTitleWithMnemonic: titleWithAmpersand]; if (_formcell_auto_title_width) { // Invalidates title width _displayedTitleWidth = -1; // Update the control(s) [[NSNotificationCenter defaultCenter] postNotificationName: _NSFormCellDidChangeTitleWidthNotification object: self]; } } /**Sets the text alignment of the NSFormCell's title to mode. NSRightTextAlignment by default. See NSTextAlignment for more informations.
See Also: -titleAlignment [NSCell-setAlignment:]
*/ - (void)setTitleAlignment: (NSTextAlignment)mode { [_titleCell setAlignment: mode]; } /**Set the text font of the NSFormCell's title to fontObject.
See Also: -titleFont [NSCell-setFont:]
*/ - (void)setTitleFont: (NSFont*)fontObject { [_titleCell setFont: fontObject]; if (_formcell_auto_title_width) { // Invalidates title width _displayedTitleWidth = -1; // Update the control(s) [[NSNotificationCenter defaultCenter] postNotificationName: _NSFormCellDidChangeTitleWidthNotification object: self]; } } /**Sets the width of the NSFormCell's title to width. All NSFormCell of the NSForm are updated
See Also: -titleWidth
*/ - (void)setTitleWidth: (CGFloat)width { if (width >= 0) { _formcell_auto_title_width = NO; _displayedTitleWidth = width; } else { _formcell_auto_title_width = YES; _displayedTitleWidth = -1; } // TODO: Don't updated the control if nothing changed. // Update the control(s) [[NSNotificationCenter defaultCenter] postNotificationName: _NSFormCellDidChangeTitleWidthNotification object: self]; } - (NSAttributedString *)attributedTitle { return [_titleCell attributedStringValue]; } /**Returns the NSFormCell's title.
See Also: -setTitle: [NSCell-stringValue]
*/ - (NSString*)title { return [_titleCell stringValue]; } /**Returns the text alignment of the NSFormCell's title. NSRightTextAlignment by default. See NSTextAlignment for more informations
See Also: -setTitleAlignment:
*/ - (NSTextAlignment)titleAlignment { return [_titleCell alignment]; } /**Returns the text font of the NSFormCell's title
See Also: -setTitleFont: [NSCell-font]
*/ - (NSFont*)titleFont { return [_titleCell font]; } /**Returns the writing direction of the NSFormCell's title
See Also: -setTitleBaseWritingDirection: [NSCell-baseWritingDirection]
*/ - (NSWritingDirection)titleBaseWritingDirection { return [_titleCell baseWritingDirection]; } /**Sets the writing direction of the NSFormCell's title
See Also: -titleBaseWritingDirection: [NSCell-setBaseWritingDirection]
*/ - (void)setTitleBaseWritingDirection: (NSWritingDirection)writingDirection { [_titleCell setBaseWritingDirection: writingDirection]; } // // Warning: this method returns the width of the title; the width the // title would have if the cell was the only cell in the form. This // is used by NSForm to align all the cells in its form. This is to // say that this title width is *not* what you are going to see on the // screen if more than one cell is present. Setting a titleWidth // manually with setTitleWidth: disables any alignment with other // cells. // - (CGFloat)titleWidth { if (_formcell_auto_title_width == NO) return _displayedTitleWidth; else { NSSize titleSize = [_titleCell cellSize]; return titleSize.width; } } - (CGFloat)titleWidth: (NSSize)aSize { if (_formcell_auto_title_width == NO) return _displayedTitleWidth; else { NSSize titleSize = [_titleCell cellSize]; if (aSize.width > titleSize.width) return titleSize.width; else return aSize.width; } } - (NSAttributedString*)placeholderAttributedString { if (_formcell_placeholder_is_attributed_string == YES) { return (NSAttributedString*)_placeholder; } else { return nil; } } - (NSString*)placeholderString { if (_formcell_placeholder_is_attributed_string == YES) { return nil; } else { return (NSString*)_placeholder; } } - (void)setPlaceholderAttributedString: (NSAttributedString*)string { ASSIGN(_placeholder, string); _formcell_placeholder_is_attributed_string = YES; } - (void)setPlaceholderString: (NSString*)string { ASSIGN(_placeholder, string); _formcell_placeholder_is_attributed_string = NO; } // Updates the title width. The width of aRect is the new title width // to display. Invoked by NSForm to align the editable parts of the // cells. - (void) calcDrawInfo: (NSRect)aRect { if (_formcell_auto_title_width == NO) return; _displayedTitleWidth = aRect.size.width; } - (NSSize)cellSize { NSSize returnedSize; NSSize titleSize = [_titleCell cellSize]; NSSize textSize; if (_contents != nil) textSize = [super cellSize]; else { ASSIGN (_contents, @"Minimum"); _cell.contents_is_attributed_string = NO; textSize = [super cellSize]; DESTROY (_contents); } returnedSize.width = titleSize.width + 3 + textSize.width; if (titleSize.height > textSize.height) returnedSize.height = titleSize.height; else returnedSize.height = textSize.height; return returnedSize; } - (NSRect) drawingRectForBounds: (NSRect)theRect { // Safety check if (_displayedTitleWidth == -1) _displayedTitleWidth = [self titleWidth]; theRect.origin.x += _displayedTitleWidth + 3; theRect.size.width -= _displayedTitleWidth + 3; return [super drawingRectForBounds: theRect]; } - (void) resetCursorRect: (NSRect)cellFrame inView: (NSView *)controlView { NSRect rect = NSMakeRect(cellFrame.origin.x + 3 + [self titleWidth], NSMinY(cellFrame), NSWidth(cellFrame) - 3 - [self titleWidth], NSHeight(cellFrame)); [super resetCursorRect: rect inView: controlView]; } - (void) _drawBorderAndBackgroundWithFrame: (NSRect)cellFrame inView: (NSView*)controlView { NSRect borderedFrame = cellFrame; // // Draw border // borderedFrame.origin.x += _displayedTitleWidth + 3; borderedFrame.size.width -= _displayedTitleWidth + 3; [super _drawBorderAndBackgroundWithFrame: borderedFrame inView: controlView]; // Draw text background [[NSColor textBackgroundColor] set]; NSRectFill([self drawingRectForBounds: cellFrame]); } - (void) drawWithFrame: (NSRect)cellFrame inView: (NSView*)controlView { NSRect titleFrame = cellFrame; // Safety check if (_displayedTitleWidth == -1) _displayedTitleWidth = [self titleWidth]; // Draw title titleFrame.size.width = _displayedTitleWidth; [_titleCell drawWithFrame: titleFrame inView: controlView]; // Draw text [super drawWithFrame: cellFrame inView: controlView]; } /* Attributed string that will be displayed. */ - (NSAttributedString*)_drawAttributedString { NSAttributedString *attrStr; attrStr = [super _drawAttributedString]; if (attrStr == nil) { attrStr = [self placeholderAttributedString]; if (attrStr == nil) { NSString *string; NSDictionary *attributes; NSMutableDictionary *newAttribs; string = [self placeholderString]; if (string == nil) { return nil; } attributes = [self _nonAutoreleasedTypingAttributes]; newAttribs = [NSMutableDictionary dictionaryWithDictionary: attributes]; [newAttribs setObject: [NSColor disabledControlTextColor] forKey: NSForegroundColorAttributeName]; return AUTORELEASE([[NSAttributedString alloc] initWithString: string attributes: newAttribs]); } else { return attrStr; } } else { return attrStr; } } /* * Copying */ - (id) copyWithZone: (NSZone*)zone { NSFormCell *c = (NSFormCell *)[super copyWithZone:zone]; /* We need to copy the title cell (as opposed to simply copying the pointer to it), otherwise if eg we change the string value of the title cell of the copied cell, the string value of the title cell of the original cell would be changed too ! */ c->_titleCell = [_titleCell copyWithZone: zone]; c->_placeholder = [_placeholder copyWithZone: zone]; return c; } - (void) encodeWithCoder: (NSCoder*)aCoder { [super encodeWithCoder: aCoder]; if ([aCoder allowsKeyedCoding]) { /* if ([self stringValue] != nil) { [aCoder encodeObject: [self stringValue] forKey: @"NSContents"]; } */ [aCoder encodeFloat: [self titleWidth] forKey: @"NSTitleWidth"]; [aCoder encodeObject: _titleCell forKey: @"NSTitleCell"]; } else { BOOL tmp = _formcell_auto_title_width; [aCoder encodeValueOfObjCType: @encode(BOOL) at: &tmp]; [aCoder encodeValueOfObjCType: @encode(float) at: &_displayedTitleWidth]; [aCoder encodeObject: _titleCell]; } } - (id) initWithCoder: (NSCoder*)aDecoder { self = [super initWithCoder: aDecoder]; if (nil == self) return nil; if ([aDecoder allowsKeyedCoding]) { if ([aDecoder containsValueForKey: @"NSContents"]) { [self setStringValue: [aDecoder decodeObjectForKey: @"NSContents"]]; } if ([aDecoder containsValueForKey: @"NSTitleWidth"]) { [self setTitleWidth: [aDecoder decodeFloatForKey: @"NSTitleWidth"]]; } if ([aDecoder containsValueForKey: @"NSTitleCell"]) { ASSIGN(_titleCell, [aDecoder decodeObjectForKey: @"NSTitleCell"]); } } else { BOOL tmp; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &tmp]; _formcell_auto_title_width = tmp; [aDecoder decodeValueOfObjCType: @encode(float) at: &_displayedTitleWidth]; [aDecoder decodeValueOfObjCType: @encode(id) at: &_titleCell]; } return self; } @end