1//
2//  PXFilterController.m
3//  Pixen-XCode
4//
5//  Created by Ian Henderson on 20.09.04.
6//  Copyright 2004 Open Sword Group. All rights reserved.
7//
8
9#import "PXFilterController.h"
10#import "PXFilter.h"
11#import "PXCanvas.h"
12
13@implementation PXFilterController
14
15- init
16{
17	[super init];
18	filters = [[NSMutableDictionary alloc] init];
19	filterBundles = [[NSMutableArray alloc] init];
20	return self;
21}
22
23- (void)dealloc
24{
25	[filters release];
26	[filterBundles release];
27	[super dealloc];
28}
29
30- (void)loadFilterAtPath:(NSString *)filename
31{
32	BOOL isDirectory;
33	if (![[NSFileManager defaultManager] fileExistsAtPath:filename isDirectory:&isDirectory] || !isDirectory) {
34		return;
35	}
36
37	NSBundle *filterBundle = [NSBundle bundleWithPath:filename];
38	if (filterBundle == nil) {
39		return;
40	}
41
42	NSString *className = [[[filename pathComponents] lastObject] stringByDeletingPathExtension];
43	Class filterClass;
44	if ((filterClass = [filterBundle classNamed:className]) == nil) {
45#ifdef __COCOA__
46		[NSAlert alertWithMessageText:@"Incomplete Filter" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"The filter located at %@ does not have a class named \"%@\".  Please change the file name back to how it was originally, or make sure the filename and filter class name are the same.", filename, className];
47#else
48#warning GNUstep TODO
49#endif
50		return;
51	}
52
53	id filter = [[[filterClass alloc] init] autorelease];
54	if (![filter respondsToSelector:@selector(name)]) {
55#ifdef __COCOA__
56		[NSAlert alertWithMessageText:@"Incomplete Filter" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"The filter located at %@ does not know its name.  I can't load such a confused file.", filename];
57#else
58#warning GNUstep TODO
59#endif
60		return;
61	}
62	if (![filter respondsToSelector:@selector(applyToCanvas:)]) {
63#ifdef __COCOA__
64		[NSAlert alertWithMessageText:@"Incomplete Filter" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"The filter located at %@ doesn't actually do anything.  Please implement -applyToCanvas:, or tell the author to.", filename];
65#else
66#warning GNUstep TODO
67#endif
68		return;
69	}
70	[filters setObject:filter forKey:[filter name]];
71	[filterBundles addObject:filterBundle];
72}
73
74- (void)loadFiltersFromDirectory:(NSString *)dir
75{
76	BOOL isDirectory;
77	if (![[NSFileManager defaultManager] fileExistsAtPath:dir isDirectory:&isDirectory] || !isDirectory) {
78		return;
79	}
80
81	NSEnumerator *filenameEnumerator = [[[NSFileManager defaultManager] directoryContentsAtPath:dir] objectEnumerator];
82	NSString *filename;
83	while (filename = [filenameEnumerator nextObject]) {
84		[self loadFilterAtPath:[dir stringByAppendingPathComponent:filename]];
85	}
86}
87
88- (void)updateFilterMenu
89{
90	NSEnumerator *titleEnumerator = [[filters allKeys] objectEnumerator];
91	NSString *title;
92	while ([filterMenu numberOfItems] > 0) {
93		[filterMenu removeItemAtIndex:0];
94	}
95	while (title = [titleEnumerator nextObject]) {
96		[[filterMenu addItemWithTitle:title action:@selector(doFilter:) keyEquivalent:@""] setTarget:self];
97	}
98}
99
100- (void)awakeFromNib
101{
102	[self loadFiltersFromDirectory:[@"~/Library/Application Support/Pixen/Filters" stringByExpandingTildeInPath]];
103	[self loadFiltersFromDirectory:[@"/Library/Application Support/Pixen/Filters" stringByExpandingTildeInPath]];
104	if ([[filters allKeys] count] > 0) {
105		[self updateFilterMenu];
106	}
107}
108
109- (NSObject<PXFilter> *)filterNamed:(NSString *)name
110{
111	return [filters objectForKey:name];
112}
113
114- (IBAction)doFilter:sender
115{
116	PXCanvas *canvas = [[[NSDocumentController sharedDocumentController] currentDocument] canvas];
117	[[self filterNamed:[sender title]] applyToCanvas:canvas];
118	[canvas changedInRect:NSMakeRect(0, 0, [canvas size].width, [canvas size].height)];
119}
120
121@end
122