1// 2// SubviewTableViewController.m 3// SubviewTableViewRuleEditor 4// 5// Created by Joar Wingfors on Sat Feb 15 2003. 6// Copyright (c) 2003 joar.com. All rights reserved. 7// 8 9#import "SubviewTableViewController.h" 10 11#import "SubviewTableViewCell.h" 12 13@implementation SubviewTableViewController 14 15- (id) initWithViewColumn:(NSTableColumn *) vCol 16{ 17 if ((self = [super init]) != nil) 18 { 19 // Weak references 20 subviewTableColumn = vCol; 21 subviewTableView = [subviewTableColumn tableView]; 22 23 // Setup table view delegate and data source 24 [subviewTableView setDataSource: self]; 25 [subviewTableView setDelegate: self]; 26 27 // Setup cell type for views column 28 [subviewTableColumn setDataCell: [[[SubviewTableViewCell alloc] init] autorelease]]; 29 30 // Setup column properties 31 [subviewTableColumn setEditable: NO]; 32 } 33 34 return self; 35} 36 37- (void) dealloc 38{ 39 subviewTableView = nil; 40 subviewTableColumn = nil; 41 delegate = nil; 42 43 [super dealloc]; 44} 45 46+ (id) controllerWithViewColumn:(NSTableColumn *) vCol 47{ 48 return [[[self alloc] initWithViewColumn: vCol] autorelease]; 49} 50 51- (void) setDelegate:(id) obj 52{ 53 // Check that the object passed to this method supports the required methods 54 NSParameterAssert([obj conformsToProtocol: @protocol(SubviewTableViewControllerDataSourceProtocol)]); 55 56 // Weak reference 57 delegate = obj; 58} 59 60- (id) delegate 61{ 62 return delegate; 63} 64 65- (void) reloadTableView 66{ 67 while ([[subviewTableView subviews] count] > 0) 68 { 69 [[[subviewTableView subviews] lastObject] removeFromSuperviewWithoutNeedingDisplay]; 70 } 71 [subviewTableView reloadData]; 72} 73 74- (BOOL) isValidDelegateForSelector:(SEL) command 75{ 76 return (([self delegate] != nil) && [[self delegate] respondsToSelector: command]); 77} 78 79// Methods from NSTableViewDelegate category 80 81- (BOOL) selectionShouldChangeInTableView:(NSTableView *) tableView 82{ 83 if ([self isValidDelegateForSelector: _cmd]) 84 { 85 return [[self delegate] selectionShouldChangeInTableView: tableView]; 86 } 87 else 88 { 89 return YES; 90 } 91} 92 93- (void) tableView:(NSTableView *) tableView didClickTableColumn:(NSTableColumn *) tableColumn 94{ 95 if ([self isValidDelegateForSelector: _cmd]) 96 { 97 [[self delegate] performSelector: _cmd withObject: tableView withObject: tableColumn]; 98 } 99} 100 101- (void) tableView:(NSTableView *) tableView didDragTableColumn:(NSTableColumn *) tableColumn 102{ 103 if ([self isValidDelegateForSelector: _cmd]) 104 { 105 [[self delegate] performSelector: _cmd withObject: tableView withObject: tableColumn]; 106 } 107} 108 109- (void) tableView:(NSTableView *) tableView mouseDownInHeaderOfTableColumn:(NSTableColumn *) tableColumn 110{ 111 if ([self isValidDelegateForSelector: _cmd]) 112 { 113 [[self delegate] performSelector: _cmd withObject: tableView withObject: tableColumn]; 114 } 115} 116 117- (BOOL) tableView:(NSTableView *) tableView shouldEditTableColumn:(NSTableColumn *) tableColumn row:(int) row 118{ 119 if ([self isValidDelegateForSelector: _cmd]) 120 { 121 return [[self delegate] tableView: tableView shouldEditTableColumn: tableColumn row: row]; 122 } 123 else 124 { 125 return YES; 126 } 127} 128 129- (BOOL) tableView:(NSTableView *) tableView shouldSelectRow:(int) row 130{ 131 if ([self isValidDelegateForSelector: _cmd]) 132 { 133 return [[self delegate] tableView: tableView shouldSelectRow: row]; 134 } 135 else 136 { 137 return YES; 138 } 139} 140 141- (BOOL) tableView:(NSTableView *) tableView shouldSelectTableColumn:(NSTableColumn *) tableColumn 142{ 143 if ([self isValidDelegateForSelector: _cmd]) 144 { 145 return [[self delegate] tableView: tableView shouldSelectTableColumn: tableColumn]; 146 } 147 else 148 { 149 return YES; 150 } 151} 152 153- (void) tableView:(NSTableView *) tableView willDisplayCell:(id) cell forTableColumn:(NSTableColumn *) tableColumn row:(int) row 154{ 155 if (tableColumn == subviewTableColumn) 156 { 157 // This is one of the few interesting things going on in this class. This is where 158 // our custom cell class is assigned the custom view that should be displayed for 159 // a particular row. 160 161 if ([self isValidDelegateForSelector: @selector(tableView:viewForRow:)]) 162 { 163 [(SubviewTableViewCell *)cell addSubview: [[self delegate] tableView: tableView viewForRow: row]]; 164 } 165 } 166 else 167 { 168 if ([self isValidDelegateForSelector: _cmd]) 169 { 170 [[self delegate] tableView: tableView willDisplayCell: cell forTableColumn: tableColumn row: row]; 171 } 172 } 173} 174 175- (void) tableViewColumnDidMove:(NSNotification *) notification 176{ 177 if ([self isValidDelegateForSelector: _cmd]) 178 { 179 [[self delegate] performSelector: _cmd withObject: notification]; 180 } 181} 182 183- (void) tableViewColumnDidResize:(NSNotification *) notification 184{ 185 if ([self isValidDelegateForSelector: _cmd]) 186 { 187 [[self delegate] performSelector: _cmd withObject: notification]; 188 } 189} 190 191- (void) tableViewSelectionDidChange:(NSNotification *) notification 192{ 193 if ([self isValidDelegateForSelector: _cmd]) 194 { 195 [[self delegate] performSelector: _cmd withObject: notification]; 196 } 197} 198 199- (void) tableViewSelectionIsChanging:(NSNotification *) notification 200{ 201 if ([self isValidDelegateForSelector: _cmd]) 202 { 203 [[self delegate] performSelector: _cmd withObject: notification]; 204 } 205} 206 207// Methods from NSTableDataSource protocol 208 209- (int) numberOfRowsInTableView:(NSTableView *) tableView 210{ 211 int count = 0; 212 213 if ([self isValidDelegateForSelector: _cmd]) 214 { 215 count = [[self delegate] numberOfRowsInTableView: tableView]; 216 } 217 218 return count; 219} 220 221- (BOOL) tableView:(NSTableView *) tableView acceptDrop:(id <NSDraggingInfo>) info row:(int) row dropOperation:(NSTableViewDropOperation) operation 222{ 223 if ([self isValidDelegateForSelector: _cmd]) 224 { 225 return [[self delegate] tableView: tableView acceptDrop: info row: row dropOperation: operation]; 226 } 227 else 228 { 229 return NO; 230 } 231} 232 233- (id) tableView:(NSTableView *) tableView objectValueForTableColumn:(NSTableColumn *) tableColumn row:(int) row 234{ 235 id obj = nil; 236 237 if ((tableColumn != subviewTableColumn) && [self isValidDelegateForSelector: _cmd]) 238 { 239 obj = [[self delegate] tableView: tableView objectValueForTableColumn: tableColumn row: row]; 240 } 241 242 return obj; 243} 244 245- (void) tableView:(NSTableView *) tableView setObjectValue:(id) obj forTableColumn:(NSTableColumn *) tableColumn row:(int) row 246{ 247 if ((tableColumn != subviewTableColumn) && [self isValidDelegateForSelector: _cmd]) 248 { 249 [[self delegate] tableView: tableView setObjectValue:obj forTableColumn: tableColumn row: row]; 250 } 251} 252 253- (NSDragOperation) tableView:(NSTableView *) tableView validateDrop:(id <NSDraggingInfo>) info proposedRow:(int) row proposedDropOperation:(NSTableViewDropOperation) operation 254{ 255 if ([self isValidDelegateForSelector: _cmd]) 256 { 257 return [[self delegate] tableView: tableView validateDrop: info proposedRow: row proposedDropOperation: operation]; 258 } 259 else 260 { 261 return NO; 262 } 263} 264 265- (BOOL) tableView:(NSTableView *) tableView writeRows:(NSArray *) rows toPasteboard:(NSPasteboard *) pboard 266{ 267 if ([self isValidDelegateForSelector: _cmd]) 268 { 269 return [[self delegate] tableView: tableView writeRows: rows toPasteboard: pboard]; 270 } 271 else 272 { 273 return NO; 274 } 275} 276 277@end 278