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