gwenhywfar
4.3.1
|
00001 // 00002 // CocoaListBox.m 00003 // 00004 // 00005 // Created by Samuel Strupp on 17.08.10. 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 //first delete old columns 00063 NSArray *oldColumns = [self tableColumns]; 00064 for (NSTableColumn *oldColumn in oldColumns) { 00065 [self removeTableColumn:oldColumn]; 00066 } 00067 00068 00069 //now create new columns 00070 NSArray *titles = [titleString componentsSeparatedByString:@"\t"]; 00071 //NSLog(@"%@", titles); 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 //NSLog(@"%@", newDataStrings); 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 //NSLog(@"sort Index = %@ Ascending = %@", [indexOfColumn description], [sortOrder description]); 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