-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUTIListOpenAndDropFilter.m
More file actions
78 lines (64 loc) · 1.98 KB
/
Copy pathUTIListOpenAndDropFilter.m
File metadata and controls
78 lines (64 loc) · 1.98 KB
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
//
// UTIListOpenAndDropFilter.m
// DMG DJ
//
#import <CoreServices/CoreServices.h>
#import "UTIListOpenAndDropFilter.h"
@implementation UTIListOpenAndDropFilter
- (id)initWithUTIs:(NSString *)firstArg, ... {
self = [super init];
fileManager = [[NSFileManager defaultManager] retain];
utiList = [[NSMutableArray array] retain];
va_list argList;
NSString *uti = firstArg;
va_start(argList, firstArg);
do {
[utiList addObject:uti];
} while (uti = va_arg(argList, NSString*));
va_end(argList);
return self;
}
- (BOOL)fileConforms:(NSString *)filename {
// see http://www.cocoadev.com/index.pl?GetUTIForFileAtPath
BOOL conforms = NO;
FSRef ref;
FSPathMakeRef((const UInt8 *)[filename fileSystemRepresentation],
&ref, NULL);
CFStringRef fileUTI = NULL;
LSCopyItemAttribute(&ref, kLSRolesAll, kLSItemContentType, (CFTypeRef *)&fileUTI);
if (fileUTI) {
NSEnumerator *utiEnmr = [utiList objectEnumerator];
NSString *uti;
while ((uti = [utiEnmr nextObject]) && !conforms) {
conforms = UTTypeConformsTo(fileUTI, (CFStringRef)uti);
}
CFRelease(fileUTI);
}
return conforms;
}
- (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename {
BOOL isDir;
[fileManager fileExistsAtPath:filename isDirectory:&isDir];
return isDir || [self fileConforms:filename];
}
- (BOOL)panel:(id)sender isValidFilename:(NSString *)filename {
return [self fileConforms:filename];
}
- (NSDragOperation)tableView:(NSTableView *)aTableView
validateDrop:(id <NSDraggingInfo>)info
proposedRow:(int)row
proposedDropOperation:(NSTableViewDropOperation)operation {
NSPasteboard *pasteboard = [info draggingPasteboard];
if ([[pasteboard types] containsObject:NSFilenamesPboardType]) {
NSArray *files = [pasteboard propertyListForType:NSFilenamesPboardType];
NSEnumerator *fileEnmr = [files objectEnumerator];
NSString *filename;
while (filename = [fileEnmr nextObject]) {
if (![self fileConforms:filename]) {
return NSDragOperationNone;
}
}
}
return NSDragOperationEvery;
}
@end