CocoaListBox.m

Go to the documentation of this file.
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