-
Notifications
You must be signed in to change notification settings - Fork 32
/
UKListSheet.m
119 lines (91 loc) · 3.15 KB
/
UKListSheet.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//
// UKListSheet.m
// Shovel
//
// Created by Uli Kusterer on Tue Mar 23 2004.
// Copyright (c) 2004 Uli Kusterer.
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#import "UKListSheet.h"
@implementation UKListSheet
-(int) runList: (NSArray*)l modalForWindow: (NSWindow*)owner
{
int dialogResult = 0;
list = [l retain];
[listView reloadData];
[NSApp beginSheet: [listView window] modalForWindow: owner
modalDelegate:self didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:)
contextInfo: &dialogResult];
while( dialogResult == 0 )
{
NSEvent* evt = [NSApp nextEventMatchingMask: NSAnyEventMask
untilDate:[NSDate dateWithTimeIntervalSinceNow: 1] // 1 second so we get to check whether the flag was set.
inMode: NSModalPanelRunLoopMode dequeue: YES];
if( evt )
[NSApp sendEvent: evt];
}
[[listView window] orderOut: self];
[list release];
list = nil;
return dialogResult;
}
-(IBAction) sheetButtonClicked: (id)sender
{
[NSApp endSheet: [listView window] returnCode: NSAlertFirstButtonReturn +[sender tag] -1];
}
-(void) sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(int*)dialogResult
{
*dialogResult = returnCode;
}
-(int) numberOfRowsInTableView: (NSTableView*)tableView
{
return [list count];
}
-(id) tableView: (NSTableView*)tableView objectValueForTableColumn: (NSTableColumn*)tableColumn row: (int)row
{
NSDictionary* dict = [list objectAtIndex: row];
return [dict valueForKey: [tableColumn identifier]];
}
-(void) tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(int)row
{
NSMutableDictionary* dict = nil;
id dCell = [tableColumn dataCellForRow: row];
// If single selection and this is button column, uncheck all others:
if( singleSelection && [dCell isKindOfClass: [NSButtonCell class]] ) // Sadly, can't detect NSButtonType :-(
{
NSEnumerator* enny = [list objectEnumerator];
while( (dict = [enny nextObject]) )
[dict setObject: [NSNumber numberWithInt: 0] forKey: [tableColumn identifier]];
[listView setNeedsDisplay: YES];
}
// Now find and select this one:
dict = [list objectAtIndex: row];
[dict setObject: object forKey: [tableColumn identifier]];
}
-(BOOL) singleSelection
{
return singleSelection;
}
-(void) setSingleSelection: (BOOL)n
{
singleSelection = n;
}
@end