mirror of
https://github.com/nickshanks/ResKnife.git
synced 2024-09-03 22:29:05 +00:00
110 lines
2.5 KiB
Mathematica
110 lines
2.5 KiB
Mathematica
|
#import "DataSource.h"
|
||
|
#import "ResKnifeResourceProtocol.h"
|
||
|
|
||
|
@implementation DataSource
|
||
|
|
||
|
- (id)init
|
||
|
{
|
||
|
[self autorelease];
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
- (id)initForType:(NSString *)typeString
|
||
|
{
|
||
|
self = [super init];
|
||
|
type = [typeString copy];
|
||
|
data = [[NSMutableDictionary alloc] init];
|
||
|
{
|
||
|
id <ResKnifeResourceProtocol> resource;
|
||
|
NSArray *resources = [NSClassFromString(@"Resource") allResourcesOfType:type inDocument:nil];
|
||
|
NSEnumerator *enumerator = [resources objectEnumerator];
|
||
|
while( resource = [enumerator nextObject] )
|
||
|
[data setObject:[resource name] forKey:[resource resID]];
|
||
|
}
|
||
|
parsed = [[NSMutableArray alloc] initWithArray:[data allValues]];
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
- (void)dealloc
|
||
|
{
|
||
|
[data release];
|
||
|
[parsed release];
|
||
|
[super dealloc];
|
||
|
}
|
||
|
|
||
|
- (NSDictionary *)data
|
||
|
{
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
- (void)setData:(NSMutableDictionary *)newData
|
||
|
{
|
||
|
id old = data;
|
||
|
data = [newData retain];
|
||
|
[self parseForString:@"" sorted:YES];
|
||
|
[old autorelease];
|
||
|
}
|
||
|
|
||
|
- (void)setString:(NSString *)string forResID:(int)resID
|
||
|
{
|
||
|
[data setObject:string forKey:[NSNumber numberWithInt:resID]];
|
||
|
}
|
||
|
|
||
|
- (void)parseForString:(NSString *)string sorted:(BOOL)sort
|
||
|
{
|
||
|
NSNumber *resID;
|
||
|
NSEnumerator *enumerator = [[data allKeys] objectEnumerator];
|
||
|
[parsed removeAllObjects];
|
||
|
while( resID = [enumerator nextObject] )
|
||
|
{
|
||
|
NSString *value = [data objectForKey:resID];
|
||
|
NSRange range = [value rangeOfString:string options:NSCaseInsensitiveSearch];
|
||
|
if( range.location != NSNotFound || [string isEqualToString:@""] )
|
||
|
[parsed addObject:[NSString stringWithFormat:@"%@ {%@}", value, resID]];
|
||
|
}
|
||
|
if( sort ) [parsed sortUsingSelector:@selector(caseInsensitiveCompare:)];
|
||
|
}
|
||
|
|
||
|
- (id)objectValueForResID:(NSNumber *)resID
|
||
|
{
|
||
|
return [data objectForKey:resID];
|
||
|
}
|
||
|
|
||
|
- (NSString *)stringValueForResID:(NSNumber *)resID
|
||
|
{
|
||
|
return [NSString stringWithFormat:@"%@ {%@}", [data objectForKey:resID], resID];
|
||
|
}
|
||
|
|
||
|
/* NSComboBox Informal Prototype Implementation */
|
||
|
|
||
|
- (id)comboBox:(NSComboBox *)comboBox objectValueForItemAtIndex:(int)index
|
||
|
{
|
||
|
return [parsed objectAtIndex:index];
|
||
|
}
|
||
|
|
||
|
- (int)numberOfItemsInComboBox:(NSComboBox *)comboBox
|
||
|
{
|
||
|
return [parsed count];
|
||
|
}
|
||
|
|
||
|
/* Combo Box Delegate Methods */
|
||
|
|
||
|
- (void)controlTextDidBeginEditing:(NSNotification *)notification
|
||
|
{
|
||
|
[self parseForString:[[notification object] stringValue] sorted:YES];
|
||
|
[[notification object] reloadData];
|
||
|
}
|
||
|
|
||
|
- (void)controlTextDidChange:(NSNotification *)notification
|
||
|
{
|
||
|
[self parseForString:[[notification object] stringValue] sorted:YES];
|
||
|
[[notification object] reloadData];
|
||
|
}
|
||
|
|
||
|
- (BOOL)control:(NSControl *)control isValidObject:(id)object
|
||
|
{
|
||
|
return [parsed containsObject:object];
|
||
|
}
|
||
|
|
||
|
@end
|