X-Git-Url: http://git.ithinksw.org/GrowlITTSW.git/blobdiff_plain/2802d8d58f43f9b0b5c01c0c5ade24fdbecf17c7..HEAD:/GrowlITTSWController.m diff --git a/GrowlITTSWController.m b/GrowlITTSWController.m index 3cf14a3..5503ee8 100644 --- a/GrowlITTSWController.m +++ b/GrowlITTSWController.m @@ -7,22 +7,16 @@ // #import "GrowlITTSWController.h" +#import "GrowlITTSWPrefs.h" -#import #import +#import #import "RegexKitLite.h" -#import "GrowlPositioningDefines.h" - -@interface GrowlPositionController -+ (enum GrowlPosition)selectedOriginPosition; -@end - @implementation NSImage (SmoothAdditions) -- (NSImage *)imageScaledSmoothlyToSize:(NSSize)scaledSize -{ +- (NSImage *)imageScaledSmoothlyToSize:(NSSize)scaledSize { NSImage *newImage; NSImageRep *rep = [self bestRepresentationForDevice:nil]; @@ -39,53 +33,112 @@ @end +@interface GrowlITTSWController (Private) +- (void)syncWithPrefs; +@end + @implementation GrowlITTSWController -- (id)init -{ +- (id)init { if ( ( self = [super init] ) ) { - NSArray *screens = [NSScreen screens]; - _window = [[GrowlITTSWWindow sharedWindow] retain]; - - [_window setScreen:[screens objectAtIndex:0]]; - - [_window setExitMode:ITTransientStatusWindowExitAfterDelay]; - [_window setExitDelay:4.0]; - - [_window setSizing:ITTransientStatusWindowMini]; - - [_window setEntryEffect:[[[NSClassFromString(@"ITSlideVerticallyWindowEffect") alloc] initWithWindow:_window] autorelease]]; - [_window setExitEffect:[[[NSClassFromString(@"ITSlideHorizontallyWindowEffect") alloc] initWithWindow:_window] autorelease]]; - - [[_window entryEffect] setEffectTime:0.8]; - [[_window exitEffect] setEffectTime:0.8]; - - [(ITTSWBackgroundView *)[_window contentView]setBackgroundMode: - ITTSWBackgroundReadable]; + [_window setExitMode:ITTransientStatusWindowExitAfterDelay]; + [self syncWithPrefs]; + [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(syncWithPrefs) name:@"GrowlPreferencesChanged" object:nil]; } return self; } -- (void)dealloc -{ +- (void)dealloc { [_window release]; [super dealloc]; } -- (void)showWindowWithText:(NSString *)text image:(NSImage *)image -{ +- (void)syncWithPrefs { + _imageSize = [GrowlITTSWPrefs imageSize]; + _imageNoUpscale = [GrowlITTSWPrefs imageNoUpscale]; + _wrapNotifications = [GrowlITTSWPrefs wrapNotifications]; + _wrapColumns = [GrowlITTSWPrefs wrapColumns]; + + NSScreen *screen = [GrowlITTSWPrefs screen]; + ITHorizontalWindowPosition horizontalPosition = [GrowlITTSWPrefs horizontalPosition]; + ITVerticalWindowPosition verticalPosition = [GrowlITTSWPrefs verticalPosition]; + + Class appearanceEffect = [GrowlITTSWPrefs appearanceEffect]; + float appearanceSpeed = [GrowlITTSWPrefs appearanceSpeed]; + Class vanishEffect = [GrowlITTSWPrefs vanishEffect]; + float vanishSpeed = [GrowlITTSWPrefs vanishSpeed]; + float vanishDelay = [GrowlITTSWPrefs vanishDelay]; + + ITTSWBackgroundMode backgroundStyle = [GrowlITTSWPrefs backgroundStyle]; + NSColor *backgroundColor = [GrowlITTSWPrefs backgroundColor]; + ITTransientStatusWindowSizing windowSize = [GrowlITTSWPrefs windowSize]; + + if ([_window screen] != screen) { + [_window setScreen:screen]; + } + if ([_window horizontalPosition] != horizontalPosition) { + [_window setHorizontalPosition:horizontalPosition]; + } + if ([_window verticalPosition] != verticalPosition) { + [_window setVerticalPosition:verticalPosition]; + } + + if (![[_window entryEffect] isKindOfClass:appearanceEffect]) { + [_window setEntryEffect:[[[appearanceEffect alloc] initWithWindow:_window] autorelease]]; + } + if ([[_window entryEffect] effectTime] != appearanceSpeed) { + [[_window entryEffect] setEffectTime:appearanceSpeed]; + } + if (![[_window exitEffect] isKindOfClass:vanishEffect]) { + [_window setExitEffect:[[[vanishEffect alloc] initWithWindow:_window] autorelease]]; + } + if ([[_window exitEffect] effectTime] != vanishSpeed) { + [[_window exitEffect] setEffectTime:vanishSpeed]; + } + if ([_window exitDelay] != vanishDelay) { + [_window setExitDelay:vanishDelay]; + } + + if ([(ITTSWBackgroundView *)[_window contentView] backgroundMode] != backgroundStyle) { + [(ITTSWBackgroundView *)[_window contentView] setBackgroundMode:backgroundStyle]; + } + if (([(ITTSWBackgroundView *)[_window contentView] backgroundMode] == ITTSWBackgroundColored) && ![[(ITTSWBackgroundView *)[_window contentView] backgroundColor] isEqual:backgroundColor]) { + [(ITTSWBackgroundView *)[_window contentView] setBackgroundColor:backgroundColor]; + } + if ([_window sizing] != windowSize) { + [_window setSizing:windowSize]; + } +} + +- (void)showWindowWithTitle:(NSString *)title desc:(NSString *)desc image:(NSImage *)image { + NSString *text = title; + + if (desc && ![desc isEqualToString:@""] && ![desc isEqualToString:@"\n"]) { + text = [text stringByAppendingFormat:@"\n%@", desc]; + } + NSSize newSize; NSSize oldSize = [image size]; + BOOL wouldUpscale = ((oldSize.width <= _imageSize) && (oldSize.height <= _imageSize)); - if (oldSize.width > oldSize.height) { - newSize = NSMakeSize(110.0f, (oldSize.height * (110.0f / oldSize.width))); - } else { - newSize = NSMakeSize((oldSize.width * (110.0f / oldSize.height)), 110.0f); + if (!(wouldUpscale && _imageNoUpscale)) { + if (oldSize.width > oldSize.height) { + newSize = NSMakeSize(_imageSize, (oldSize.height * (_imageSize / oldSize.width))); + } else { + newSize = NSMakeSize((oldSize.width * (_imageSize / oldSize.height)), _imageSize); + } + + image = [[[[NSImage alloc] initWithData:[image TIFFRepresentation]] autorelease] imageScaledSmoothlyToSize:newSize]; } - image = [[[[NSImage alloc] initWithData:[image TIFFRepresentation]] autorelease] imageScaledSmoothlyToSize:newSize]; + if (_wrapNotifications) { + text = [text stringByReplacingOccurrencesOfRegex:[NSString stringWithFormat:@"(\\S\\S{%i,}|.{1,%i})(?:\\s+|$)", _wrapColumns, _wrapColumns] withString:@"$1\n"]; + } + + //trim trailing whitespace + text = [text stringByReplacingOccurrencesOfRegex:@"\\s+$" withString:@""]; NSArray *gothicChars = [NSArray arrayWithObjects:[NSString stringWithUTF8String:"☆"], [NSString stringWithUTF8String:"★"], nil]; NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:text]; @@ -93,7 +146,7 @@ if (([gothicChars count] > 0) && ([text length] > 0)) { NSMutableString *gothicRegex = [[NSMutableString alloc] init]; - [gothicRegex appendString:@"["]; + [gothicRegex appendString:@"[\\n"]; for (NSString *gothicChar in gothicChars) { [gothicRegex appendString:gothicChar]; } @@ -115,29 +168,6 @@ } } - switch ([GrowlPositionController selectedOriginPosition]) { - case GrowlMiddleColumnPosition: - [_window setVerticalPosition:ITWindowPositionMiddle]; - [_window setHorizontalPosition:ITWindowPositionCenter]; - break; - case GrowlTopLeftPosition: - [_window setVerticalPosition:ITWindowPositionTop]; - [_window setHorizontalPosition:ITWindowPositionLeft]; - break; - case GrowlBottomRightPosition: - [_window setVerticalPosition:ITWindowPositionBottom]; - [_window setHorizontalPosition:ITWindowPositionRight]; - break; - case GrowlTopRightPosition: - [_window setVerticalPosition:ITWindowPositionTop]; - [_window setHorizontalPosition:ITWindowPositionRight]; - break; - case GrowlBottomLeftPosition: - [_window setVerticalPosition:ITWindowPositionBottom]; - [_window setHorizontalPosition:ITWindowPositionLeft]; - break; - } - [_window setImage:image]; [_window buildTextWindowWithString:attributedText]; [_window appear:self];