aboutsummaryrefslogtreecommitdiffstats
path: root/Source/SPGrowlController.m
diff options
context:
space:
mode:
Diffstat (limited to 'Source/SPGrowlController.m')
-rw-r--r--Source/SPGrowlController.m41
1 files changed, 28 insertions, 13 deletions
diff --git a/Source/SPGrowlController.m b/Source/SPGrowlController.m
index b4f84780..50ca4906 100644
--- a/Source/SPGrowlController.m
+++ b/Source/SPGrowlController.m
@@ -31,6 +31,8 @@
static SPGrowlController *sharedGrowlController = nil;
+@class SPWindowController;
+
@implementation SPGrowlController
/**
@@ -84,21 +86,21 @@ static SPGrowlController *sharedGrowlController = nil;
* Calls the notification after a tiny delay to allow isKeyWindow to have updated
* after tasks.
*/
-- (void)notifyWithTitle:(NSString *)title description:(NSString *)description window:(NSWindow *)window notificationName:(NSString *)name
+- (void)notifyWithTitle:(NSString *)title description:(NSString *)description document:(TableDocument *)document notificationName:(NSString *)name
{
// Ensure that the delayed notification call is made on the main thread
if (![NSThread isMainThread]) {
- [[self onMainThread] notifyWithTitle:title description:description window:window notificationName:name];
+ [[self onMainThread] notifyWithTitle:title description:description document:document notificationName:name];
return;
}
NSMutableDictionary *notificationDictionary = [NSMutableDictionary dictionary];
[notificationDictionary setObject:title forKey:@"title"];
[notificationDictionary setObject:description forKey:@"description"];
- [notificationDictionary setObject:window forKey:@"window"];
+ [notificationDictionary setObject:document forKey:@"document"];
[notificationDictionary setObject:name forKey:@"name"];
- [notificationDictionary setObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:[window windowNumber]] forKey:@"notificationWindow"] forKey:@"clickContext"];
+ [notificationDictionary setObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedInteger:[document hash]] forKey:@"notificationDocumentHash"] forKey:@"clickContext"];
[self performSelector:@selector(notifyWithObject:) withObject:notificationDictionary afterDelay:0.1];
}
@@ -112,7 +114,7 @@ static SPGrowlController *sharedGrowlController = nil;
{
[self notifyWithTitle:[notificationDictionary objectForKey:@"title"]
description:[notificationDictionary objectForKey:@"description"]
- window:[notificationDictionary objectForKey:@"window"]
+ document:[notificationDictionary objectForKey:@"document"]
notificationName:[notificationDictionary objectForKey:@"name"]
iconData:nil
priority:0
@@ -123,13 +125,17 @@ static SPGrowlController *sharedGrowlController = nil;
/**
* Posts a Growl notification using the supplied details and effectively ignoring the default values.
*/
-- (void)notifyWithTitle:(NSString *)title description:(NSString *)description window:(NSWindow *)window notificationName:(NSString *)name iconData:(NSData *)data priority:(NSInteger)priority isSticky:(BOOL)sticky clickContext:(id)clickContext
+- (void)notifyWithTitle:(NSString *)title description:(NSString *)description document:(TableDocument *)document notificationName:(NSString *)name iconData:(NSData *)data priority:(NSInteger)priority isSticky:(BOOL)sticky clickContext:(id)clickContext
{
BOOL postNotification = YES;
- // Don't post the notification if the notification window is key and order front
+ // Don't post the notification if the notification document is frontmost
// as that suggests the user is already viewing the notification result.
- if ([window isKeyWindow]) postNotification = NO;
+ if ([[document parentWindow] isKeyWindow]
+ && [[[document parentTabViewItem] tabView] selectedTabViewItem] == [document parentTabViewItem])
+ {
+ postNotification = NO;
+ }
// If a timing notification name exists, check to see if it matches the notification name;
// if it does, and the time exceeds the threshold, display the notification even for
@@ -158,11 +164,20 @@ static SPGrowlController *sharedGrowlController = nil;
*/
- (void)growlNotificationWasClicked:(NSDictionary *)clickContext
{
- if (clickContext && [clickContext objectForKey:@"notificationWindow"]) {
- NSWindow *targetWindow = [NSApp windowWithWindowNumber:[[clickContext objectForKey:@"notificationWindow"] integerValue]];
- if (targetWindow) {
- [NSApp activateIgnoringOtherApps:YES];
- [targetWindow makeKeyAndOrderFront:self];
+ if (clickContext && [clickContext objectForKey:@"notificationDocumentHash"]) {
+ NSUInteger documentHash = [[clickContext objectForKey:@"notificationDocumentHash"] unsignedIntegerValue];
+
+ // Loop through the windows, looking for the document
+ for (NSWindow *eachWindow in [NSApp orderedWindows]) {
+ if ([[eachWindow windowController] isKindOfClass:[SPWindowController class]]) {
+ for (TableDocument *eachDocument in [[eachWindow windowController] documents]) {
+ if ([eachDocument hash] == documentHash) {
+ [NSApp activateIgnoringOtherApps:YES];
+ [eachDocument makeKeyDocument];
+ return;
+ }
+ }
+ }
}
}
}