Plugins/Displays/Nano/GrowlNanoWindowController.m
author boredzo
Sun Jul 06 15:10:15 2008 +0000 (2008-07-06)
changeset 4135 9d0747a53f45
parent 3954 2dfcd1414225
child 4246 4f52d1d98978
child 4771 d398be175a6e
permissions -rw-r--r--
CFRelease the duration preference value if we get one. Found by the clang static analyzer.
rudy@2886
     1
//
rudy@2886
     2
//  GrowlNanoWindowController.m
rudy@2886
     3
//  Display Plugins
rudy@2886
     4
//
rudy@2886
     5
//  Created by Rudy Richter on 12/12/2005.
ingmarstein@3040
     6
//  Copyright 2005-2006, The Growl Project. All rights reserved.
rudy@2886
     7
//
rudy@2886
     8
rudy@2886
     9
rudy@2886
    10
#import "GrowlNanoWindowController.h"
rudy@2886
    11
#import "GrowlNanoWindowView.h"
rudy@2886
    12
#import "GrowlNanoPrefs.h"
rudy@2886
    13
#import "NSWindow+Transforms.h"
rudy@2886
    14
#import "GrowlSlidingWindowTransition.h"
evands@2915
    15
#import "GrowlWipeWindowTransition.h"
evands@3640
    16
#import "GrowlFadingWindowTransition.h"
evands@3640
    17
ingmarstein@2941
    18
#import "GrowlApplicationNotification.h"
ingmarstein@2941
    19
#include "CFDictionaryAdditions.h"
rudy@2886
    20
rudy@2886
    21
@implementation GrowlNanoWindowController
rudy@2886
    22
rudy@2886
    23
- (id) init {
rudy@2886
    24
	int sizePref = Nano_SIZE_NORMAL;
rudy@2886
    25
rudy@2886
    26
	//define our duration
rudy@2886
    27
	CFNumberRef prefsDuration = NULL;
rudy@2886
    28
	READ_GROWL_PREF_VALUE(Nano_DURATION_PREF, GrowlNanoPrefDomain, CFNumberRef, &prefsDuration);
evands@3637
    29
	[self setDisplayDuration:(prefsDuration ?
evands@3637
    30
							  [(NSNumber *)prefsDuration doubleValue] :
evands@3637
    31
							  GrowlNanoDurationPrefDefault)];
boredzo@4135
    32
	if (prefsDuration) CFRelease(prefsDuration);
rudy@2886
    33
rudy@2886
    34
	screenNumber = 0U;
rudy@2886
    35
	READ_GROWL_PREF_INT(Nano_SCREEN_PREF, GrowlNanoPrefDomain, &screenNumber);
evands@3954
    36
	NSArray *screens = [NSScreen screens];
evands@3954
    37
	unsigned int screensCount = [screens count];
evands@3954
    38
	if (screensCount) {
evands@3954
    39
		[self setScreen:((screensCount >= (screenNumber + 1)) ? [screens objectAtIndex:screenNumber] : [screens objectAtIndex:0])];
evands@3954
    40
	}
evands@3954
    41
				 
rudy@2886
    42
	NSRect sizeRect;
rudy@2886
    43
	NSRect screen = [[self screen] frame];
rudy@2886
    44
	READ_GROWL_PREF_INT(Nano_SIZE_PREF, GrowlNanoPrefDomain, &sizePref);
rudy@2886
    45
	sizeRect.origin = screen.origin;
rudy@3176
    46
	if (sizePref == Nano_SIZE_HUGE) {
rudy@3176
    47
		sizeRect.size.height = 50.0f;	
rudy@3176
    48
		sizeRect.size.width = 270.0f;
rudy@3176
    49
	} else {
rudy@2886
    50
		sizeRect.size.height = 25.0f;
rudy@3176
    51
		sizeRect.size.width = 185.0f;
rudy@3176
    52
	}
rudy@2886
    53
	frameHeight = sizeRect.size.height;
rudy@2886
    54
rudy@2886
    55
	READ_GROWL_PREF_INT(Nano_SIZE_PREF, GrowlNanoPrefDomain, &sizePref);
rudy@2886
    56
	NSPanel *panel = [[NSPanel alloc] initWithContentRect:sizeRect
rudy@2886
    57
												styleMask:NSBorderlessWindowMask
rudy@2886
    58
												  backing:NSBackingStoreBuffered
rudy@3005
    59
													defer:YES];
rudy@2886
    60
	NSRect panelFrame = [panel frame];
rudy@2886
    61
	[panel setBecomesKeyOnlyIfNeeded:YES];
rudy@2886
    62
	[panel setHidesOnDeactivate:NO];
rudy@2886
    63
	[panel setBackgroundColor:[NSColor clearColor]];
rudy@2886
    64
	[panel setLevel:NSFloatingWindowLevel];
rudy@2886
    65
	[panel setIgnoresMouseEvents:YES];
rudy@2886
    66
	[panel setSticky:YES];
rudy@2886
    67
	[panel setOpaque:NO];
rudy@2886
    68
	[panel setHasShadow:NO];
rudy@2886
    69
	[panel setCanHide:NO];
rudy@2886
    70
	[panel setOneShot:YES];
rudy@2886
    71
	[panel useOptimizedDrawing:YES];
rudy@2886
    72
	[panel setDelegate:self];
rudy@2886
    73
rudy@2886
    74
	GrowlNanoWindowView *view = [[GrowlNanoWindowView alloc] initWithFrame:panelFrame];
rudy@2886
    75
rudy@2886
    76
	[view setTarget:self];
rudy@2886
    77
	[view setAction:@selector(notificationClicked:)]; // Not used for now
rudy@2886
    78
rudy@2886
    79
	[panel setContentView:view]; // retains subview
rudy@2886
    80
	[view release];
rudy@3292
    81
	
rudy@3292
    82
	float xPosition = NSMaxX(screen) - (NSMaxX(screen) / 4);
rudy@3292
    83
	float yPosition = NSMaxY(screen);
rudy@3292
    84
	if([NSMenu menuBarVisible])
rudy@3292
    85
		yPosition-=[NSMenuView menuBarHeight];
rudy@3292
    86
	
rudy@3292
    87
	[panel setFrameOrigin:NSMakePoint(xPosition, yPosition)];
ingmarstein@2943
    88
rudy@2886
    89
	// call super so everything else is set up...
ingmarstein@2943
    90
	if ((self = [super initWithWindow:panel])) {
evands@3640
    91
		NanoEffectType effect = Nano_EFFECT_SLIDE;
ingmarstein@2943
    92
		READ_GROWL_PREF_INT(Nano_EFFECT_PREF, GrowlNanoPrefDomain, &effect);
evands@3640
    93
evands@3640
    94
		switch (effect) {
evands@3640
    95
			case Nano_EFFECT_SLIDE:
evands@3640
    96
			{
evands@3640
    97
				//slider effect
evands@3640
    98
				GrowlSlidingWindowTransition *slider = [[GrowlSlidingWindowTransition alloc] initWithWindow:panel];
evands@3640
    99
				[slider setFromOrigin:NSMakePoint(xPosition, yPosition) toOrigin:NSMakePoint(xPosition, yPosition - frameHeight)];
evands@3640
   100
				[slider setAutoReverses:YES];
evands@3640
   101
				[self addTransition:slider];
evands@3640
   102
				[self setStartPercentage:0 endPercentage:100 forTransition:slider];
evands@3640
   103
evands@3640
   104
				[slider release];
evands@3640
   105
				
evands@3640
   106
				break;
evands@3640
   107
			}
evands@3640
   108
			case Nano_EFFECT_WIPE:
evands@3640
   109
			{
evands@3640
   110
				//wipe effect
evands@3640
   111
				[panel setFrameOrigin:NSMakePoint(xPosition, NSMaxY(screen))];
evands@3640
   112
				GrowlWipeWindowTransition *wiper = [[GrowlWipeWindowTransition alloc] initWithWindow:panel];
evands@3640
   113
				[wiper setFromOrigin:NSMakePoint(xPosition, yPosition) toOrigin:NSMakePoint(xPosition, yPosition - frameHeight)];
evands@3640
   114
				[wiper setAutoReverses:YES];
evands@3640
   115
				[self addTransition:wiper];
evands@3640
   116
				[self setStartPercentage:0 endPercentage:100 forTransition:wiper];
evands@3640
   117
evands@3640
   118
				[wiper release];
evands@3640
   119
				
evands@3640
   120
				NSLog(@"Wipe not implemented");
evands@3640
   121
				break;
evands@3640
   122
			}
evands@3640
   123
			case Nano_EFFECT_FADE:
evands@3640
   124
			{
evands@3640
   125
				[panel setAlphaValue:0.0];
evands@3640
   126
				[panel setFrameOrigin:NSMakePoint(xPosition, yPosition - frameHeight)];
evands@3640
   127
evands@3640
   128
				GrowlFadingWindowTransition *fader = [[GrowlFadingWindowTransition alloc] initWithWindow:panel];
evands@3640
   129
				[self addTransition:fader];
evands@3640
   130
				[self setStartPercentage:0 endPercentage:100 forTransition:fader];
evands@3640
   131
				[fader setAutoReverses:YES];
evands@3640
   132
				[fader release];
evands@3640
   133
				break;
evands@3640
   134
			}
ingmarstein@2943
   135
		}
rudy@2886
   136
	}
evands@3543
   137
	
evands@3543
   138
	[panel release];
evands@3543
   139
rudy@2886
   140
	return self;
rudy@2886
   141
}
rudy@2886
   142
rudy@2886
   143
- (void) setNotification: (GrowlApplicationNotification *) theNotification {
rudy@2886
   144
	[super setNotification:theNotification];
rudy@2886
   145
	if (!theNotification)
rudy@2886
   146
		return;
ingmarstein@2943
   147
rudy@2886
   148
	NSDictionary *noteDict = [notification dictionaryRepresentation];
rudy@2886
   149
	NSString *title = [notification title];
evands@2922
   150
	NSString *text  = [notification notificationDescription];
rudy@2886
   151
	NSImage *icon   = getObjectForKey(noteDict, GROWL_NOTIFICATION_ICON);
ingmarstein@2941
   152
	int prio        = getIntegerForKey(noteDict, GROWL_NOTIFICATION_PRIORITY);
ingmarstein@2943
   153
rudy@2886
   154
	NSPanel *panel = (NSPanel *)[self window];
rudy@2886
   155
	GrowlNanoWindowView *view = [panel contentView];
ingmarstein@2941
   156
	[view setPriority:prio];
bgannin@3404
   157
	[view setTitle:title];
bgannin@3404
   158
	[view setText:text];
rudy@2886
   159
	[view setIcon:icon];
rudy@3176
   160
}
rudy@3176
   161
rudy@2886
   162
#pragma mark -
rudy@2886
   163
rudy@2886
   164
@end