/** NSForm Form class, a matrix of text fields with labels Copyright (C) 1996 Free Software Foundation, Inc. Author: Ovidiu Predescu Date: March 1997 This file is part of the GNUstep GUI Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; see the file COPYING.LIB. If not, see or write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #import #import "AppKit/NSForm.h" #import "AppKit/NSFormCell.h" @implementation NSForm /* Class variables */ static Class defaultCellClass = nil; + (void) initialize { if (self == [NSForm class]) { /* Set the initial version */ [self setVersion: 1]; /* Set the default cell class */ defaultCellClass = [NSFormCell class]; } } + (Class) cellClass { return defaultCellClass; } + (void) setCellClass: (Class)classId { defaultCellClass = classId; } - (id) initWithFrame: (NSRect)frameRect mode: (NSMatrixMode)aMode cellClass: (Class)class numberOfRows: (NSInteger)rowsHigh numberOfColumns: (NSInteger)colsWide { self = [super initWithFrame: frameRect mode: aMode cellClass: class numberOfRows: rowsHigh numberOfColumns: colsWide]; if (nil == self) return nil; [self setIntercellSpacing: NSMakeSize (0, 4)]; return self; } - (id) initWithFrame: (NSRect)frameRect mode: (NSMatrixMode)aMode prototype: (NSCell*)prototype numberOfRows: (NSInteger)rowsHigh numberOfColumns: (NSInteger)colsWide { self = [super initWithFrame: frameRect mode: aMode prototype: prototype numberOfRows: rowsHigh numberOfColumns: colsWide]; if (nil == self) return nil; [self setIntercellSpacing: NSMakeSize (0, 4)]; return self; } /**

Adds a new entry with title as its title at the end of the NSForm and returns the NSFormCell.

See Also: -insertEntry:atIndex: -removeEntryAtIndex:

*/ - (NSFormCell*) addEntry: (NSString*)title { return [self insertEntry: title atIndex: [self numberOfRows]]; } /**

Inserts a new entry with title as its title at the index index of the NSForm and returns the NSFormCell.

See Also: -addEntry: -removeEntryAtIndex:

*/ - (NSFormCell*) insertEntry: (NSString*)title atIndex: (NSInteger)index { NSFormCell *new_cell = [[[object_getClass(self) cellClass] alloc] initTextCell: title]; [self insertRow: index]; [self putCell: new_cell atRow: index column: 0]; RELEASE (new_cell); return new_cell; } /**

Removes the entry at index index.

See Also: -insertEntry:atIndex: -addEntry:

*/ - (void) removeEntryAtIndex: (NSInteger)index { [[NSNotificationCenter defaultCenter] removeObserver: self name: _NSFormCellDidChangeTitleWidthNotification object: [self cellAtRow: index column: 0]]; [self removeRow: index]; } /* Overriding this method allows decoding stuff to be inherited simpler by NSForm */ - (void) putCell: (NSCell*)newCell atRow: (NSInteger)row column: (NSInteger)column { if (column > 0) { NSLog (@"Warning: NSForm: tried to add a cell in a column > 0"); return; } [super putCell: newCell atRow: row column: column]; [self setValidateSize: YES]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_setTitleWidthNeedsUpdate:) name: _NSFormCellDidChangeTitleWidthNotification object: newCell]; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self name: _NSFormCellDidChangeTitleWidthNotification object: nil]; [super dealloc]; } /**

Sets whether then NSForm's entries have bezeled border.

See Also: [NSCell-setBezeled:]

*/ - (void) setBezeled: (BOOL)flag { NSInteger i, count = [self numberOfRows]; /* Set the bezeled attribute to the cell prototype */ [[self prototype] setBezeled: flag]; for (i = 0; i < count; i++) [[self cellAtRow: i column: 0] setBezeled: flag]; } /**

Sets whether then NSForm's entries have border

See Also: [NSCell-setBordered:]

*/ - (void) setBordered: (BOOL)flag { NSInteger i, count = [self numberOfRows]; /* Set the bordered attribute to the cell prototype */ [[self prototype] setBordered: flag]; for (i = 0; i < count; i++) [[self cellAtRow: i column: 0] setBordered: flag]; } /**

Sets the width of all entries to width

See Also: [NSMatrix-setCellSize:]

*/ - (void) setEntryWidth: (float)width { NSSize size = [self cellSize]; size.width = width; [self setCellSize: size]; } /**

Sets the size of the frame to aSize

See Also: [NSView-setFrameSize:]

*/ - (void) setFrameSize: (NSSize)aSize { [super setFrameSize: aSize]; // Set the width of the entries independent of autosizesCells _cellSize.width = _bounds.size.width; } /**

Sets the spacing between all entries to spacing. By default the spacing is 4.

See Also: [NSMatrix-setIntercellSpacing:]

*/ - (void) setInterlineSpacing: (CGFloat)spacing { [self setIntercellSpacing: NSMakeSize(0, spacing)]; } /* For the title attributes we use the corresponding attributes from the cell. For the text attributes we use instead the attributes inherited from the NSCell class. */ /**

Sets the text alignment of the title to aMode for all entries. See NSTextAlignment for more informations. The default title alignment is NSLeftTextAlignment

See Also: [NSFormCell-setTitleAlignment:] -setTextAlignment:

*/ - (void) setTitleAlignment: (NSTextAlignment)aMode { NSInteger i, count = [self numberOfRows]; /* Set the title alignment attribute to the cell prototype */ [[self prototype] setTitleAlignment: aMode]; for (i = 0; i < count; i++) [[self cellAtRow: i column: 0] setTitleAlignment: aMode]; } /**

Sets the text alignment to aMode for all entries. See NSTextAlignment for more informations. The default text alignment is NSRightTextAlignment

See Also: -setTitleAlignment: [NSCell-setAlignment:]

*/ - (void) setTextAlignment: (NSTextAlignment)aMode { NSInteger i, count = [self numberOfRows]; /* Set the text alignment attribute to the cell prototype */ [[self prototype] setAlignment: aMode]; for (i = 0; i < count; i++) [[self cellAtRow: i column: 0] setAlignment: aMode]; } /**

Sets the text font of the title to fontObject for all entries

See Also: [NSFormCell-setTitleFont:] -setTextFont:

*/ - (void) setTitleFont: (NSFont*)fontObject { NSInteger i, count = [self numberOfRows]; /* Set the title font attribute to the cell prototype */ [[self prototype] setTitleFont: fontObject]; for (i = 0; i < count; i++) [[self cellAtRow: i column: 0] setTitleFont: fontObject]; } /**

Sets the text font to fontObject for all entries

See Also: [NSCell-setFont:] -setTitleFont:

*/ - (void) setTextFont: (NSFont*)fontObject { NSInteger i, count = [self numberOfRows]; /* Set the text font attribute to the cell prototype */ [[self prototype] setFont: fontObject]; for (i = 0; i < count; i++) [[self cellAtRow: i column: 0] setFont: fontObject]; } /**

Sets the title writing direction to direction for all entries

See Also: [NSFormCell-setTitleBaseWritingDirection:] -setTextBaseWritingDirection:

*/ - (void) setTitleBaseWritingDirection: (NSWritingDirection)direction { NSInteger i, count = [self numberOfRows]; /* Set the writing direction attribute to the cell prototype */ [[self prototype] setTitleBaseWritingDirection: direction]; for (i = 0; i < count; i++) [[self cellAtRow: i column: 0] setTitleBaseWritingDirection: direction]; } /**

Sets the contents writing direction to direction for all entries

See Also: [NSCell-setBaseWritingDirection:] -setTitleBaseWritingDirection:

*/ - (void) setTextBaseWritingDirection: (NSWritingDirection)direction { NSInteger i, count = [self numberOfRows]; /* Set the writing direction attribute to the cell prototype */ [[self prototype] setBaseWritingDirection: direction]; for (i = 0; i < count; i++) [[self cellAtRow: i column: 0] setBaseWritingDirection: direction]; } /**

Returns the index of the entry specified by aTag or -1 if aTag is not found in entries.

See Also: [NSMatrix-cellAtRow:column:]

*/ - (NSInteger) indexOfCellWithTag: (NSInteger)aTag { NSInteger i, count = [self numberOfRows]; for (i = 0; i < count; i++) if ([[self cellAtRow: i column: 0] tag] == aTag) return i; return -1; } /**

Returns the index of the current selected entry.

[NSMatrix-selectedRow]

*/ - (NSInteger) indexOfSelectedItem { return [self selectedRow]; } /**

Returns the NSFormCell at index index

See Also: [NSMatrix-cellAtRow:column:]

*/ - (id) cellAtIndex: (NSInteger)index { return [self cellAtRow: index column: 0]; } -(void) _setTitleWidthNeedsUpdate: (NSNotification*)notification { [self setValidateSize: YES]; } - (void) setValidateSize: (BOOL)flag { _title_width_needs_update = flag; // TODO: Think about reducing redisplaying if (flag) [self setNeedsDisplay]; } - (void) calcSize { NSInteger i, count = [self numberOfRows]; CGFloat new_title_width = 0; CGFloat candidate_title_width = 0; NSRect rect; // Compute max of title width in the cells for (i = 0; i < count; i++) { candidate_title_width = [_cells[i][0] titleWidth]; if (candidate_title_width > new_title_width) new_title_width = candidate_title_width; } // Suggest this max as title width to all cells rect = NSMakeRect (0, 0, new_title_width, 0); for (i = 0; i < count; i++) { [_cells[i][0] calcDrawInfo: rect]; } _title_width_needs_update = NO; } - (void) drawRect: (NSRect)rect { if (_title_width_needs_update) [self calcSize]; [super drawRect: rect]; } /**

Draws the NSFormCell at the specified index

See Also: -cellAtIndex: [NSCell-drawWithFrame:inView:] [NSMatrix-cellFrameAtRow:column:]

*/ - (void) drawCellAtIndex: (NSInteger)index { id theCell = [self cellAtIndex: index]; [theCell drawWithFrame: [self cellFrameAtRow: index column: 0] inView: self]; } - (void) drawCellAtRow: (NSInteger)row column: (NSInteger)column { [self drawCellAtIndex: row]; } /**

Selects the text in the entry specified by index.

[NSMatrix-selectTextAtRow:column:]

*/ - (void) selectTextAtIndex: (NSInteger)index { [self selectTextAtRow: index column: 0]; } @end