#import "BPSearcher.h" #import "BPPerson.h" #import "BPIcon.h" #import "BPIconGroup.h" #import "BPDocument.h" #import "BPEmailDocument.h" #import "BPPilesDisplay.h" #import "BPPilesDisplayController.h" @implementation BPSearcher - (id)init { [super init]; lastSearchResults = [[NSMutableArray alloc] initWithCapacity:20]; return self; } - (void)registerForNotifications { NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; [defaultCenter addObserver:self selector:@selector(handleNotification:) name:@"Search" object:nil]; } - (void)awakeFromNib { [self registerForNotifications]; } - (void)handleNotification:(NSNotification *)notif { if ([[notif name] isEqual:@"Search"]) { NSString *queryType = [[notif userInfo] objectForKey:@"Query"]; NSObject *doc = [[notif userInfo] objectForKey:@"Document"]; if ([queryType isEqual:@"Author"]) { [self searchOnPerson:[doc author]]; } else if ([queryType isEqual:@"Label"]) { NSLog(@"search label %@", doc); [self searchLabelForDocument:doc]; } } } - (void)searchOnPerson:(BPPerson *)person { BPIconGroup *group; BPIcon *icon; int i, j; [pilesDisplay clearSelectedIcons]; [pilesDisplay setNeedsDisplay:YES]; NSArray *groups = [pilesDisplay iconGroups]; NSArray *icons; for (i=0; i<[groups count]; i++) { icons = [[groups objectAtIndex:i] icons]; for (j=0; j<[icons count]; j++) { icon = [icons objectAtIndex:j]; BPEmailDocument *email = [icon representedObject]; if ([email isKindOfClass:[BPEmailDocument class]]) { /* if ([[email author] isEqual:person] || [[email toRecipients] containsObject:person] || [[email ccRecipients] containsObject:person]) { */ if ([[email author] isEqual:person] || ([[email toRecipients] containsObject:person] && [[email author] isEqual:[BPPerson personThatsMe]])) { [pilesDisplay selectIcon:icon]; [icon setBeingBrowsed:NO]; [pilesDisplay setNeedsDisplayInRect:[icon bounds]]; } } } } [pilesDisplayController setRecommendedLabel:[@"" stringByAppendingString:[person name]]]; } - (void)searchLabelForDocument:(NSObject *)aDocument { NSString *searchLabel; if ([aDocument isKindOfClass:[BPEmailDocument class]]) { searchLabel = [(BPEmailDocument *)aDocument labelWithoutPrefix]; } else { searchLabel = [aDocument label]; } BPIconGroup *group; BPIcon *icon; int i, j; [pilesDisplay clearSelectedIcons]; [pilesDisplay setNeedsDisplay:YES]; NSArray *groups = [pilesDisplay iconGroups]; NSArray *icons; for (i=0; i<[groups count]; i++) { icons = [[groups objectAtIndex:i] icons]; for (j=0; j<[icons count]; j++) { icon = [icons objectAtIndex:j]; NSObject *currDoc = [icon representedObject]; if ([[currDoc label] isEqual:searchLabel] || ([currDoc isKindOfClass:[BPEmailDocument class]] && [[(BPEmailDocument *)currDoc labelWithoutPrefix] isEqual:searchLabel])) { [pilesDisplay selectIcon:icon]; [icon setBeingBrowsed:NO]; [pilesDisplay setNeedsDisplayInRect:[icon bounds]]; } } } [pilesDisplayController setRecommendedLabel:searchLabel]; } - (IBAction)search:(id)sender { NSString *searchStr = [mailSearchField stringValue]; if ([[searchStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] isEqual:@""]) { // no search, so show all mail [displayedMailButton selectItemAtIndex:0]; // activate target/action [[displayedMailButton target] performSelector:[displayedMailButton action]]; return; } // clear search results [lastSearchResults removeAllObjects]; BPIconGroup *group; BPIcon *icon; int i, j; NSArray *groups = [pilesDisplay iconGroups]; NSArray *icons; for (i=0; i<[groups count]; i++) { icons = [[groups objectAtIndex:i] icons]; for (j=0; j<[icons count]; j++) { icon = [icons objectAtIndex:j]; NSObject *currDoc = [icon representedObject]; NSRange substrRange = [[currDoc allPersonsSummaries] rangeOfString:searchStr options:NSCaseInsensitiveSearch]; if (substrRange.length == 0) substrRange = [[currDoc label] rangeOfString:searchStr options:NSCaseInsensitiveSearch]; if (substrRange.length == 0) substrRange = [[currDoc body] rangeOfString:searchStr options:NSCaseInsensitiveSearch]; if (substrRange.length != 0) { [lastSearchResults addObject:icon]; [icon setOpacity:1.0]; [pilesDisplay selectIcon:icon]; [pilesDisplay setNeedsDisplayInRect:[icon bounds]]; } else { [icon setOpacity:0.15]; [pilesDisplay deselectIcon:icon]; [pilesDisplay setNeedsDisplayInRect:[icon bounds]]; } } } // set the display pop-up button to show "Last search results" [displayedMailButton selectItemAtIndex:3]; [pilesDisplayController setRecommendedLabel:searchStr]; } - (NSArray *)lastSearchResults { return [NSArray arrayWithArray:lastSearchResults]; } - (void)dealloc { NSLog(@"destroying %@", self); [lastSearchResults release]; [super dealloc]; } @end