gwenhywfar 5.14.1
CocoaListBox.m
Go to the documentation of this file.
1//
2// CocoaListBox.m
3//
4//
5// Created by Samuel Strupp on 17.08.10.
6//
7
8#ifdef HAVE_CONFIG_H
9# include <config.h>
10#endif
11
12
13#import "CocoaListBox.h"
14
15
16@implementation CocoaListBox
17
18@synthesize fillX;
19@synthesize fillY;
20
21- (id)initWithFrame:(NSRect)frame {
22 self = [super initWithFrame:frame];
23 if (self) {
24 fillX = NO;
25 fillY = NO;
26 dataArray = [[NSMutableArray alloc] init];
27 [self setColumnAutoresizingStyle:NSTableViewLastColumnOnlyAutoresizingStyle];
28 [self setUsesAlternatingRowBackgroundColors:YES];
29 [self setDataSource:self];
30 [self setDelegate:self];
31
32 [self setTarget:self];
33 [self setAction:@selector(performAction:)];
34
35 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performAction:) name:NSTableViewSelectionDidChangeNotification object:self];
36 }
37 return self;
38}
39
40-(void) dealloc {
41 [[NSNotificationCenter defaultCenter] removeObserver:self];
42 [dataArray release];
43 [super dealloc];
44}
45
46#pragma mark Special Methods
47
48-(void) setC_ActionPtr:(gwenListBoxActionPtr)ptr Data:(void*)data {
49 c_actionPtr = ptr;
50 c_actionData = data;
51}
52
53-(void) performAction:(id) sender {
54 if (c_actionPtr) {
56 }
57}
58
59-(void) setTitelsAndCreateColumns:(NSString*)titleString {
60 if (!titleString) return;
61
62 //first delete old columns
63 NSArray *oldColumns = [self tableColumns];
64 for (NSTableColumn *oldColumn in oldColumns) {
65 [self removeTableColumn:oldColumn];
66 }
67
68
69 //now create new columns
70 NSArray *titles = [titleString componentsSeparatedByString:@"\t"];
71 //NSLog(@"%@", titles);
72 NSUInteger numOfColumns = [titles count];
73 NSUInteger i;
74 for (i=0; i<numOfColumns; i++) {
75 NSString *indexString = [NSString stringWithFormat:@"%u",i];
76 NSTableColumn *newColumn = [[NSTableColumn alloc] initWithIdentifier:indexString];
77 [newColumn setEditable:NO];
78 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:indexString ascending:YES];
79 [newColumn setSortDescriptorPrototype:sortDescriptor];
80 [sortDescriptor release];
81 NSString *newTitle = [titles objectAtIndex:i];
82 if (newTitle) [[newColumn headerCell] setStringValue:newTitle];
83 [self addTableColumn:newColumn];
84 }
85 [self sizeLastColumnToFit];
86}
87
88-(NSString*) titlesString {
89 NSArray *columns = [self tableColumns];
90 if (columns) {
91 NSMutableString *ouputString = [[NSMutableString alloc] init];
92
93 NSUInteger i;
94 NSUInteger count = [columns count];
95 for (i=0; i<count; i++) {
96 NSString *value = [[[columns objectAtIndex:i] headerCell] stringValue];
97 if (value) {
98 [ouputString appendString:value];
99 }
100 if (i<count-1) [ouputString appendString:@"\t"];
101 }
102 return [ouputString autorelease];
103 }
104 return nil;
105}
106
107-(void) addDataRowString:(NSString*)dataRowString {
108 if (!dataRowString) return;
109
110 NSArray *newDataStrings = [dataRowString componentsSeparatedByString:@"\t"];
111 //NSLog(@"%@", newDataStrings);
112 NSMutableArray *columnArray = [[NSMutableArray alloc] initWithArray:newDataStrings];
113 [dataArray addObject:columnArray];
114 [columnArray release];
115}
116
117-(NSString*) dataRowStringForRow:(NSUInteger)index {
118 if (index < [dataArray count]) {
119 NSMutableString *ouputString = [[NSMutableString alloc] init];
120 NSArray *rowArray = [dataArray objectAtIndex:index];
121
122 NSUInteger i;
123 NSUInteger count = [rowArray count];
124 for (i=0; i<count; i++) {
125 NSString *value = [rowArray objectAtIndex:i];
126 if (value) {
127 [ouputString appendString:value];
128 }
129 if (i<count-1) [ouputString appendString:@"\t"];
130 }
131 return [ouputString autorelease];
132 }
133 return nil;
134}
135
137 [dataArray removeAllObjects];
138 [self reloadData];
139}
140
141
142
143NSInteger positionSort(id element1, id element2, void *context)
144{
145 NSString *obj1 = nil;
146 NSString *obj2 = nil;
147 NSDictionary *contextDict = (NSDictionary*)context;
148 NSInteger indexOfColumn = [[contextDict objectForKey:@"indexOfColumn"] integerValue];
149 BOOL ascending = [[contextDict objectForKey:@"ascending"] boolValue];
150 if ([element1 count] > indexOfColumn) {
151 obj1 = [element1 objectAtIndex:indexOfColumn];
152 }
153 if ([element2 count] > indexOfColumn) {
154 obj2 = [element2 objectAtIndex:indexOfColumn];
155 }
156 if (obj1 && obj2) {
157 NSComparisonResult result = [obj1 localizedCaseInsensitiveCompare:obj2];
158 if (ascending) return result;
159 else {
160 if (result == NSOrderedAscending) return NSOrderedDescending;
161 else if (result == NSOrderedDescending) return NSOrderedAscending;
162 else return result;
163 }
164 }
165 return NSOrderedSame;
166}
167
168
169-(void) sortTableView:(NSTableView*)tableView {
170 NSArray *sortDescriptors = [tableView sortDescriptors];
171 if (!sortDescriptors || [sortDescriptors count] <=0) return;
172 NSSortDescriptor *sortDesc = [sortDescriptors objectAtIndex:0];
173
174 if (sortDesc) {
175 NSNumber *indexOfColumn = [NSNumber numberWithInteger:[[sortDesc key] integerValue]];
176 NSNumber *sortOrder = [NSNumber numberWithBool:[sortDesc ascending]];
177 //NSLog(@"sort Index = %@ Ascending = %@", [indexOfColumn description], [sortOrder description]);
178 NSArray *keys = [NSArray arrayWithObjects:@"indexOfColumn", @"ascending", nil];
179 NSArray *objects = [NSArray arrayWithObjects:indexOfColumn, sortOrder, nil];
180 NSDictionary *contextDict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
181
182 [dataArray sortUsingFunction:positionSort context:contextDict];
183 [self reloadData];
184 }
185}
186
187
188-(BOOL) setColumnWidthTo:(NSInteger)widthInPixels forColumn:(NSInteger)index {
189 if (index < 0 || widthInPixels < 0) return NO;
190 NSTableColumn *tableColumn = [self tableColumnWithIdentifier:[NSString stringWithFormat:@"%i",index]];
191 if (tableColumn) {
192 [tableColumn setWidth:widthInPixels];
193 return YES;
194 }
195 return NO;
196}
197
198-(NSInteger) widthOfColumn:(NSInteger)index {
199 if (index >= 0) {
200 NSTableColumn *tableColumn = [self tableColumnWithIdentifier:[NSString stringWithFormat:@"%i",index]];
201 if (tableColumn) {
202 return ceil([tableColumn width]);
203 }
204 }
205 return -1;
206}
207
208-(BOOL) setSortOrderTo:(BOOL)ascending ForColumnWithIndex:(NSUInteger)index {
209 NSArray *tableColumns = [self tableColumns];
210 if (index < [tableColumns count]) {
211 NSSortDescriptor *sortDesc = [[NSSortDescriptor alloc] initWithKey:[NSString stringWithFormat:@"%u",index] ascending:ascending];
212 [self setSortDescriptors:[NSArray arrayWithObject:sortDesc]];
213 [sortDesc release];
214
215 [self sortTableView:self];
216 return YES;
217 }
218 return NO;
219}
220
221-(NSInteger) sortOrderForColumnAtIndex:(NSUInteger)index {
222 NSArray *tableColumns = [self tableColumns];
223 if (index < [tableColumns count]) {
224 NSArray *sortDescriptors = [self sortDescriptors];
225 if (!sortDescriptors || [sortDescriptors count] <=0) return -1;
226 NSSortDescriptor *sortDesc = [sortDescriptors objectAtIndex:0];
227
228 if ((NSUInteger)[[sortDesc key] integerValue] == index) {
229 return [sortDesc ascending];
230 }
231 }
232 return -1;
233}
234
235#pragma mark DataSource Methods
236
237- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView {
238 return [dataArray count];
239}
240
241- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
242 if (rowIndex >= 0 && rowIndex < [dataArray count]) {
243 NSUInteger index = [(NSString*)[aTableColumn identifier] integerValue];
244 NSArray *rowArray = [dataArray objectAtIndex:rowIndex];
245 if (rowArray && index < [rowArray count]) {
246 return [rowArray objectAtIndex:index];
247 }
248 }
249 return nil;
250}
251
252- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
253 return;
254}
255
256#pragma mark Delegate Methods
257
258- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors {
259 [self sortTableView:aTableView];
260}
261
262#pragma mark Protocoll Methods
263
264- (NSSize) minSize {
265 return NSMakeSize(300.0, 300.0);
266}
267
268- (BOOL) fillX {
269 return fillX;
270}
271
272- (BOOL) fillY {
273 return fillY;
274}
275
276@end
void(* gwenListBoxActionPtr)(NSTableView *listbox, void *data)
NSString * titlesString()
NSMutableArray * dataArray
gwenListBoxActionPtr c_actionPtr
void * c_actionData