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