Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifdef HAVE_CONFIG_H
00009 # include <config.h>
00010 #endif
00011
00012
00013 #import "CocoaListBox.h"
00014
00015
00016 @implementation CocoaListBox
00017
00018 @synthesize fillX;
00019 @synthesize fillY;
00020
00021 - (id)initWithFrame:(NSRect)frame {
00022 self = [super initWithFrame:frame];
00023 if (self) {
00024 fillX = NO;
00025 fillY = NO;
00026 dataArray = [[NSMutableArray alloc] init];
00027 [self setColumnAutoresizingStyle:NSTableViewLastColumnOnlyAutoresizingStyle];
00028 [self setUsesAlternatingRowBackgroundColors:YES];
00029 [self setDataSource:self];
00030 [self setDelegate:self];
00031
00032 [self setTarget:self];
00033 [self setAction:@selector(performAction:)];
00034
00035 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performAction:) name:NSTableViewSelectionDidChangeNotification object:self];
00036 }
00037 return self;
00038 }
00039
00040 -(void) dealloc {
00041 [[NSNotificationCenter defaultCenter] removeObserver:self];
00042 [dataArray release];
00043 [super dealloc];
00044 }
00045
00046 #pragma mark Special Methods
00047
00048 -(void) setC_ActionPtr:(gwenListBoxActionPtr)ptr Data:(void*)data {
00049 c_actionPtr = ptr;
00050 c_actionData = data;
00051 }
00052
00053 -(void) performAction:(id) sender {
00054 if (c_actionPtr) {
00055 c_actionPtr(self, c_actionData);
00056 }
00057 }
00058
00059 -(void) setTitelsAndCreateColumns:(NSString*)titleString {
00060 if (!titleString) return;
00061
00062
00063 NSArray *oldColumns = [self tableColumns];
00064 for (NSTableColumn *oldColumn in oldColumns) {
00065 [self removeTableColumn:oldColumn];
00066 }
00067
00068
00069
00070 NSArray *titles = [titleString componentsSeparatedByString:@"\t"];
00071
00072 NSUInteger numOfColumns = [titles count];
00073 NSUInteger i;
00074 for (i=0; i<numOfColumns; i++) {
00075 NSString *indexString = [NSString stringWithFormat:@"%u",i];
00076 NSTableColumn *newColumn = [[NSTableColumn alloc] initWithIdentifier:indexString];
00077 [newColumn setEditable:NO];
00078 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:indexString ascending:YES];
00079 [newColumn setSortDescriptorPrototype:sortDescriptor];
00080 [sortDescriptor release];
00081 NSString *newTitle = [titles objectAtIndex:i];
00082 if (newTitle) [[newColumn headerCell] setStringValue:newTitle];
00083 [self addTableColumn:newColumn];
00084 }
00085 [self sizeLastColumnToFit];
00086 }
00087
00088 -(NSString*) titlesString {
00089 NSArray *columns = [self tableColumns];
00090 if (columns) {
00091 NSMutableString *ouputString = [[NSMutableString alloc] init];
00092
00093 NSUInteger i;
00094 NSUInteger count = [columns count];
00095 for (i=0; i<count; i++) {
00096 NSString *value = [[[columns objectAtIndex:i] headerCell] stringValue];
00097 if (value) {
00098 [ouputString appendString:value];
00099 }
00100 if (i<count-1) [ouputString appendString:@"\t"];
00101 }
00102 return [ouputString autorelease];
00103 }
00104 return nil;
00105 }
00106
00107 -(void) addDataRowString:(NSString*)dataRowString {
00108 if (!dataRowString) return;
00109
00110 NSArray *newDataStrings = [dataRowString componentsSeparatedByString:@"\t"];
00111
00112 NSMutableArray *columnArray = [[NSMutableArray alloc] initWithArray:newDataStrings];
00113 [dataArray addObject:columnArray];
00114 [columnArray release];
00115 }
00116
00117 -(NSString*) dataRowStringForRow:(NSUInteger)index {
00118 if (index < [dataArray count]) {
00119 NSMutableString *ouputString = [[NSMutableString alloc] init];
00120 NSArray *rowArray = [dataArray objectAtIndex:index];
00121
00122 NSUInteger i;
00123 NSUInteger count = [rowArray count];
00124 for (i=0; i<count; i++) {
00125 NSString *value = [rowArray objectAtIndex:i];
00126 if (value) {
00127 [ouputString appendString:value];
00128 }
00129 if (i<count-1) [ouputString appendString:@"\t"];
00130 }
00131 return [ouputString autorelease];
00132 }
00133 return nil;
00134 }
00135
00136 -(void) clearDataRows {
00137 [dataArray removeAllObjects];
00138 [self reloadData];
00139 }
00140
00141
00142
00143 NSInteger positionSort(id element1, id element2, void *context)
00144 {
00145 NSString *obj1 = nil;
00146 NSString *obj2 = nil;
00147 NSDictionary *contextDict = (NSDictionary*)context;
00148 NSInteger indexOfColumn = [[contextDict objectForKey:@"indexOfColumn"] integerValue];
00149 BOOL ascending = [[contextDict objectForKey:@"ascending"] boolValue];
00150 if ([element1 count] > indexOfColumn) {
00151 obj1 = [element1 objectAtIndex:indexOfColumn];
00152 }
00153 if ([element2 count] > indexOfColumn) {
00154 obj2 = [element2 objectAtIndex:indexOfColumn];
00155 }
00156 if (obj1 && obj2) {
00157 NSComparisonResult result = [obj1 localizedCaseInsensitiveCompare:obj2];
00158 if (ascending) return result;
00159 else {
00160 if (result == NSOrderedAscending) return NSOrderedDescending;
00161 else if (result == NSOrderedDescending) return NSOrderedAscending;
00162 else return result;
00163 }
00164 }
00165 return NSOrderedSame;
00166 }
00167
00168
00169 -(void) sortTableView:(NSTableView*)tableView {
00170 NSArray *sortDescriptors = [tableView sortDescriptors];
00171 if (!sortDescriptors || [sortDescriptors count] <=0) return;
00172 NSSortDescriptor *sortDesc = [sortDescriptors objectAtIndex:0];
00173
00174 if (sortDesc) {
00175 NSNumber *indexOfColumn = [NSNumber numberWithInteger:[[sortDesc key] integerValue]];
00176 NSNumber *sortOrder = [NSNumber numberWithBool:[sortDesc ascending]];
00177
00178 NSArray *keys = [NSArray arrayWithObjects:@"indexOfColumn", @"ascending", nil];
00179 NSArray *objects = [NSArray arrayWithObjects:indexOfColumn, sortOrder, nil];
00180 NSDictionary *contextDict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
00181
00182 [dataArray sortUsingFunction:positionSort context:contextDict];
00183 [self reloadData];
00184 }
00185 }
00186
00187
00188 -(BOOL) setColumnWidthTo:(NSInteger)widthInPixels forColumn:(NSInteger)index {
00189 if (index < 0 || widthInPixels < 0) return NO;
00190 NSTableColumn *tableColumn = [self tableColumnWithIdentifier:[NSString stringWithFormat:@"%i",index]];
00191 if (tableColumn) {
00192 [tableColumn setWidth:widthInPixels];
00193 return YES;
00194 }
00195 return NO;
00196 }
00197
00198 -(NSInteger) widthOfColumn:(NSInteger)index {
00199 if (index >= 0) {
00200 NSTableColumn *tableColumn = [self tableColumnWithIdentifier:[NSString stringWithFormat:@"%i",index]];
00201 if (tableColumn) {
00202 return ceil([tableColumn width]);
00203 }
00204 }
00205 return -1;
00206 }
00207
00208 -(BOOL) setSortOrderTo:(BOOL)ascending ForColumnWithIndex:(NSUInteger)index {
00209 NSArray *tableColumns = [self tableColumns];
00210 if (index < [tableColumns count]) {
00211 NSSortDescriptor *sortDesc = [[NSSortDescriptor alloc] initWithKey:[NSString stringWithFormat:@"%u",index] ascending:ascending];
00212 [self setSortDescriptors:[NSArray arrayWithObject:sortDesc]];
00213 [sortDesc release];
00214
00215 [self sortTableView:self];
00216 return YES;
00217 }
00218 return NO;
00219 }
00220
00221 -(NSInteger) sortOrderForColumnAtIndex:(NSUInteger)index {
00222 NSArray *tableColumns = [self tableColumns];
00223 if (index < [tableColumns count]) {
00224 NSArray *sortDescriptors = [self sortDescriptors];
00225 if (!sortDescriptors || [sortDescriptors count] <=0) return -1;
00226 NSSortDescriptor *sortDesc = [sortDescriptors objectAtIndex:0];
00227
00228 if ((NSUInteger)[[sortDesc key] integerValue] == index) {
00229 return [sortDesc ascending];
00230 }
00231 }
00232 return -1;
00233 }
00234
00235 #pragma mark DataSource Methods
00236
00237 - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView {
00238 return [dataArray count];
00239 }
00240
00241 - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
00242 if (rowIndex >= 0 && rowIndex < [dataArray count]) {
00243 NSUInteger index = [(NSString*)[aTableColumn identifier] integerValue];
00244 NSArray *rowArray = [dataArray objectAtIndex:rowIndex];
00245 if (rowArray && index < [rowArray count]) {
00246 return [rowArray objectAtIndex:index];
00247 }
00248 }
00249 return nil;
00250 }
00251
00252 - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
00253 return;
00254 }
00255
00256 #pragma mark Delegate Methods
00257
00258 - (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors {
00259 [self sortTableView:aTableView];
00260 }
00261
00262 #pragma mark Protocoll Methods
00263
00264 - (NSSize) minSize {
00265 return NSMakeSize(300.0, 300.0);
00266 }
00267
00268 - (BOOL) fillX {
00269 return fillX;
00270 }
00271
00272 - (BOOL) fillY {
00273 return fillY;
00274 }
00275
00276 @end