gwenhywfar  4.6.0beta
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 
136 -(void) clearDataRows {
137  [dataArray removeAllObjects];
138  [self reloadData];
139 }
140 
141 
142 
143 NSInteger 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