|
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
|