This is MiscTableController.m in view mode; [Download] [Up]
#import <appkit/appkit.h>
#import <dbkit/dbkit.h>
#import <misckit/misckit.h>
#import "MiscTableController.h"
//--------------------------------------------------------------------------------------
@implementation MiscTableController
//--------------------------------------------------------------------------------------
/*" The #MiscTableController class allows displaying and editing lists
with multivalue rows. The row objects can be of any arbitrary class as
long as they conform to the #MiscTCRow protocol. HashTables are a
good choice.
%{<<more later>>} "*/
//--------------------------------------------------------------------------------------
- init;
//--------------------------------------------------------------------------------------
/*" Initialises a new #MiscTableController intance. "*/
{
[super init];
rows=[[MiscList allocFromZone:[self zone]] init];
return self;
}
//--------------------------------------------------------------------------------------
- free
//--------------------------------------------------------------------------------------
/*" Frees the #MiscTableController and %all row objects. "*/
{
[rows freeObjects];
rows=[rows free];
return [super free];
}
//--------------------------------------------------------------------------------------
- (MiscList *)rows;
//--------------------------------------------------------------------------------------
/*" Returns the internal #MiscList Objects that holds the rows.
Consider it %read-only, changes can confused the controller! "*/
{
return rows;
}
//--------------------------------------------------------------------------------------
- (unsigned int)rowCount;
//--------------------------------------------------------------------------------------
/*" Returns the number of rows in the #DBTableView. "*/
{
return [rows count];
}
//--------------------------------------------------------------------------------------
- setTableView:(DBTableView *)aView withIdentifiers:(NXAtom *)ids;
//--------------------------------------------------------------------------------------
/*" Associates the Controller with a #DBTableView. #Identifiers must be
all %NULL terminated array of #NXAtoms that are used to identify
the columns. These values are passed as key in the delegate methods.
Returns #nil if the identifier array contains too many or too few
elements. "*/
{
int colNo;
NXAtom *identifierP;
for(colNo=0,identifierP=ids;*identifierP;identifierP++)
colNo++;
if(colNo!=[aView columnCount])
return nil;
tableView=aView;
identifiers=ids;
for(colNo=0,identifierP=identifiers;*identifierP;identifierP++)
[[tableView columnAt:colNo++] setIdentifier:(id)(*identifierP)];
[tableView setDataSource:self];
[tableView reloadData:self];
return self;
}
//--------------------------------------------------------------------------------------
- (DBTableView *)tableView;
//--------------------------------------------------------------------------------------
/*" Returns the #DBTableView that the controller is connected to. "*/
{
return tableView;
}
//--------------------------------------------------------------------------------------
- (NXAtom *)identifiers;
//--------------------------------------------------------------------------------------
/*" Return the array of #NXAtoms which are used to identify the columns in
the #DBTableView. "*/
{
return identifiers;
}
//--------------------------------------------------------------------------------------
- setDelegate:anObject;
//--------------------------------------------------------------------------------------
/*" Sets the delegate object. "*/
{
delegate=anObject;
return self;
}
//--------------------------------------------------------------------------------------
- delegate;
//--------------------------------------------------------------------------------------
/*" Returns the delegate object. "*/
{
return delegate;
}
//-----------------------------------------------------------
- addRow:(id <MiscTCRow>)row;
//-----------------------------------------------------------
/*" Adds a new row object and redisplays the #DBTableView. "*/
{
[rows addObject:[(id)row copyFromZone:[self zone]]];
[tableView reloadData:self];
return self;
}
//-----------------------------------------------------------
- addRowsFrom:(List *)list;
//-----------------------------------------------------------
{
int idx;
for(idx=0;idx<[list count];idx++)
[rows addObject:[[list objectAt:idx] copyFromZone:[self zone]]];
[tableView reloadData:self];
return self;
}
//--------------------------------------------------------------------------------------
- removeSelectedRow:sender;
//--------------------------------------------------------------------------------------
/*" Removes the currently selected row (if there is one) and redisplays the
#DBTableView."*/
{
int row=[tableView selectedRow];
if(row<0)
return nil;
[rows removeObjectAt:row];
if(sender)
[tableView reloadData:self];
return self;
}
//--------------------------------------------------------------------------------------
- empty:sender;
//--------------------------------------------------------------------------------------
/*" Removes all rows, frees the objects and redisplays the #DBTableView."*/
{
[rows freeObjects];
[rows empty];
if(sender)
[tableView reloadData:self];
return self;
}
//--------------------------------------------------------------------------------------
- getValueFor:identifier at:(unsigned int)aPosition into:aValue;
//--------------------------------------------------------------------------------------
/*" Method from the DBDataSource Protocol. "*/
{
[aValue setStringValue:[[rows objectAt:aPosition] valueForKey:identifier]];
return self;
}
//--------------------------------------------------------------------------------------
- setValueFor:identifier at:(unsigned int)aPosition from:aValue;
//--------------------------------------------------------------------------------------
/*" Method from the DBDataSource Protocol. "*/
{
[[rows objectAt:aPosition] insertKey:identifier value:(void *)[aValue stringValue]];
if([delegate respondsTo:@selector(miscTableController:valueDidChangeFor:at:)])
[delegate miscTableController:self valueDidChangeFor:identifier at:aPosition];
return self;
}
//--------------------------------------------------------------------------------------
- miscTableController:sender valueDidChangeFor:identifier at:(unsigned int)position;
//--------------------------------------------------------------------------------------
/*" Delegate method. Sent to the delegate whenever a row changes. Delegate
doesn't have to implement this method. "*/
{
return self;
}
//--------------------------------------------------------------------------------------
@end
//--------------------------------------------------------------------------------------
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.