1 #import "GrowlITTSWPrefs.h"
2 #import "GrowlPositioningDefines.h"
3 #import "GrowlDefinesInternal.h"
4 #define GrowlITTSWPrefsDomain @"com.ithinksw.growl-ittsw"
6 @interface GrowlPositionController
7 + (enum GrowlPosition)selectedOriginPosition;
10 @implementation GrowlITTSWPrefs
12 + (Class)appearanceEffect {
13 SYNCHRONIZE_GROWL_PREFS();
14 NSString *className = nil;
15 READ_GROWL_PREF_VALUE(@"appearanceEffect", GrowlITTSWPrefsDomain, NSString *, &className);
17 Class effectClass = NSClassFromString(className);
18 if (effectClass && [effectClass isSubclassOfClass:[ITWindowEffect class]]) {
22 return NSClassFromString(@"ITCutWindowEffect");
25 + (float)appearanceSpeed {
26 SYNCHRONIZE_GROWL_PREFS();
27 float appearanceSpeed = 0.8f;
28 READ_GROWL_PREF_FLOAT(@"appearanceSpeed", GrowlITTSWPrefsDomain, &appearanceSpeed);
29 return appearanceSpeed;
32 + (Class)vanishEffect {
33 SYNCHRONIZE_GROWL_PREFS();
34 NSString *className = nil;
35 READ_GROWL_PREF_VALUE(@"vanishEffect", GrowlITTSWPrefsDomain, NSString *, &className);
37 Class effectClass = NSClassFromString(className);
38 if (effectClass && [effectClass isSubclassOfClass:[ITWindowEffect class]]) {
42 return NSClassFromString(@"ITCutWindowEffect");
45 + (float)vanishSpeed {
46 SYNCHRONIZE_GROWL_PREFS();
47 float vanishSpeed = 0.8f;
48 READ_GROWL_PREF_FLOAT(@"vanishSpeed", GrowlITTSWPrefsDomain, &vanishSpeed);
52 + (float)vanishDelay {
53 SYNCHRONIZE_GROWL_PREFS();
54 float vanishDelay = 4.0f;
55 READ_GROWL_PREF_FLOAT(@"vanishDelay", GrowlITTSWPrefsDomain, &vanishDelay);
59 + (ITTSWBackgroundMode)backgroundStyle {
60 SYNCHRONIZE_GROWL_PREFS();
61 int backgroundStyle = ITTSWBackgroundReadable;
62 READ_GROWL_PREF_INT(@"backgroundStyle", GrowlITTSWPrefsDomain, &backgroundStyle);
63 return backgroundStyle;
66 + (NSColor *)backgroundColor {
67 SYNCHRONIZE_GROWL_PREFS();
68 NSData *backgroundColorData = nil;
69 READ_GROWL_PREF_VALUE(@"backgroundColor", GrowlITTSWPrefsDomain, NSData *, &backgroundColorData);
70 if (backgroundColorData && [backgroundColorData isKindOfClass:[NSData class]]) {
71 NSColor *backgroundColor = [NSUnarchiver unarchiveObjectWithData:backgroundColorData];
72 if (backgroundColor && [backgroundColor isKindOfClass:[NSColor class]]) {
73 return backgroundColor;
76 return [NSColor blueColor];
79 + (ITTransientStatusWindowSizing)windowSize {
80 SYNCHRONIZE_GROWL_PREFS();
81 ITTransientStatusWindowSizing windowSize = ITTransientStatusWindowMini;
82 READ_GROWL_PREF_INT(@"windowSize", GrowlITTSWPrefsDomain, &windowSize);
87 SYNCHRONIZE_GROWL_PREFS();
89 READ_GROWL_PREF_INT(@"screenIndex", GrowlITTSWPrefsDomain, &screenIndex);
93 + (NSScreen *)screen {
94 NSArray *screens = [NSScreen screens];
95 int screenIndex = [GrowlITTSWPrefs screenIndex];
96 if ([screens count] >= (screenIndex+1)) {
97 return [screens objectAtIndex:screenIndex];
99 return [screens objectAtIndex:0];
102 + (ITHorizontalWindowPosition)horizontalPosition {
103 switch ([GrowlPositionController selectedOriginPosition]) {
104 case GrowlBottomLeftPosition:
105 case GrowlTopLeftPosition:
106 return ITWindowPositionLeft;
109 case GrowlBottomRightPosition:
110 case GrowlTopRightPosition:
111 return ITWindowPositionRight;
116 + (ITVerticalWindowPosition)verticalPosition {
117 switch ([GrowlPositionController selectedOriginPosition]) {
118 case GrowlBottomLeftPosition:
119 case GrowlBottomRightPosition:
120 return ITWindowPositionBottom;
123 case GrowlTopLeftPosition:
124 case GrowlTopRightPosition:
125 return ITWindowPositionTop;
130 - (NSString *)mainNibName {
131 return @"GrowlITTSWPrefs";
135 [appearanceEffectButton selectItemAtIndex:[appearanceEffectButton indexOfItemWithRepresentedObject:[GrowlITTSWPrefs appearanceEffect]]];
136 [appearanceSpeedSlider setFloatValue:-([GrowlITTSWPrefs appearanceSpeed])];
137 [vanishEffectButton selectItemAtIndex:[vanishEffectButton indexOfItemWithRepresentedObject:[GrowlITTSWPrefs vanishEffect]]];
138 [vanishSpeedSlider setFloatValue:-([GrowlITTSWPrefs vanishSpeed])];
139 [vanishDelaySlider setFloatValue:[GrowlITTSWPrefs vanishDelay]];
141 ITTSWBackgroundMode backgroundStyle = [GrowlITTSWPrefs backgroundStyle];
142 [backgroundStyleButton selectItemWithTag:backgroundStyle];
143 if (backgroundStyle == ITTSWBackgroundColored) {
144 [backgroundColorWell setEnabled:YES];
146 [backgroundColorWell setEnabled:NO];
148 [[NSColorPanel sharedColorPanel] setShowsAlpha:YES];
149 [backgroundColorWell setColor:[GrowlITTSWPrefs backgroundColor]];
150 [windowSizeButton selectItemWithTag:[GrowlITTSWPrefs windowSize]];
152 [screenButton removeAllItems];
153 NSArray *screens = [NSScreen screens];
155 for (NSScreen *screen in screens) {
156 NSSize screenSize = [screen frame].size;
157 NSMenuItem *screenItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:@"Screen %i (%1.0fx%1.0f)", screenCount+1, screenSize.width, screenSize.height] action:NULL keyEquivalent:@""];
158 [screenItem setRepresentedObject:screen];
159 [[screenButton menu] addItem:screenItem];
162 if (screenCount > 1) {
163 [screenButton setEnabled:YES];
165 [screenButton setEnabled:NO];
167 [screenButton selectItemAtIndex:[screenButton indexOfItemWithRepresentedObject:[GrowlITTSWPrefs screen]]];
170 - (void)awakeFromNib {
171 NSArray *effectClasses = [ITWindowEffect effectClasses];
172 for (Class effectClass in effectClasses) {
173 NSMenuItem *appearanceEffectItem = [[NSMenuItem alloc] initWithTitle:[effectClass effectName] action:NULL keyEquivalent:@""];
174 NSMenuItem *vanishEffectItem = [[NSMenuItem alloc] initWithTitle:[effectClass effectName] action:NULL keyEquivalent:@""];
175 [appearanceEffectItem setRepresentedObject:effectClass];
176 [vanishEffectItem setRepresentedObject:effectClass];
178 [[appearanceEffectButton menu] addItem:[appearanceEffectItem autorelease]];
179 [[vanishEffectButton menu] addItem:[vanishEffectItem autorelease]];
182 NSArray *backgroundStyles = [NSArray arrayWithObjects:
183 [NSDictionary dictionaryWithObjectsAndKeys:@"Mac OS X", @"name", [NSNumber numberWithInt:ITTSWBackgroundApple], @"index", nil],
184 [NSDictionary dictionaryWithObjectsAndKeys:@"Very Readable", @"name", [NSNumber numberWithInt:ITTSWBackgroundReadable], @"index", nil],
185 [NSDictionary dictionaryWithObjectsAndKeys:@"Custom Color...", @"name", [NSNumber numberWithInt:ITTSWBackgroundColored], @"index", nil],
187 for (NSDictionary *backgroundStyleDict in backgroundStyles) {
188 NSString *backgroundStyleName = [backgroundStyleDict objectForKey:@"name"];
189 ITTSWBackgroundMode backgroundStyle = [[backgroundStyleDict objectForKey:@"index"] intValue];
190 NSMenuItem *backgroundStyleItem = [[NSMenuItem alloc] initWithTitle:backgroundStyleName action:NULL keyEquivalent:@""];
191 [backgroundStyleItem setTag:backgroundStyle];
193 [[backgroundStyleButton menu] addItem:[backgroundStyleItem autorelease]];
196 NSArray *windowSizes = [NSArray arrayWithObjects:
197 [NSDictionary dictionaryWithObjectsAndKeys:@"Regular", @"name", [NSNumber numberWithInt:ITTransientStatusWindowRegular], @"index", nil],
198 [NSDictionary dictionaryWithObjectsAndKeys:@"Small", @"name", [NSNumber numberWithInt:ITTransientStatusWindowSmall], @"index", nil],
199 [NSDictionary dictionaryWithObjectsAndKeys:@"Mini", @"name", [NSNumber numberWithInt:ITTransientStatusWindowMini], @"index", nil],
201 for (NSDictionary *windowSizeDict in windowSizes) {
202 NSString *windowSizeName = [windowSizeDict objectForKey:@"name"];
203 ITTransientStatusWindowSizing windowSize = [[windowSizeDict objectForKey:@"index"] intValue];
204 NSMenuItem *windowSizeItem = [[NSMenuItem alloc] initWithTitle:windowSizeName action:NULL keyEquivalent:@""];
205 [windowSizeItem setTag:windowSize];
207 [[windowSizeButton menu] addItem:[windowSizeItem autorelease]];
213 - (IBAction)setAppearanceEffect:(id)sender {
214 SYNCHRONIZE_GROWL_PREFS();
215 WRITE_GROWL_PREF_VALUE(@"appearanceEffect", NSStringFromClass([[appearanceEffectButton selectedItem] representedObject]), GrowlITTSWPrefsDomain);
216 UPDATE_GROWL_PREFS();
219 - (IBAction)setAppearanceSpeed:(id)sender {
220 SYNCHRONIZE_GROWL_PREFS();
221 float appearanceSpeed = -([appearanceSpeedSlider floatValue]);
222 WRITE_GROWL_PREF_FLOAT(@"appearanceSpeed", appearanceSpeed, GrowlITTSWPrefsDomain);
223 UPDATE_GROWL_PREFS();
226 - (IBAction)setVanishEffect:(id)sender {
227 SYNCHRONIZE_GROWL_PREFS();
228 WRITE_GROWL_PREF_VALUE(@"vanishEffect", NSStringFromClass([[vanishEffectButton selectedItem] representedObject]), GrowlITTSWPrefsDomain);
229 UPDATE_GROWL_PREFS();
232 - (IBAction)setVanishSpeed:(id)sender {
233 SYNCHRONIZE_GROWL_PREFS();
234 float vanishSpeed = -([vanishSpeedSlider floatValue]);
235 WRITE_GROWL_PREF_FLOAT(@"vanishSpeed", vanishSpeed, GrowlITTSWPrefsDomain);
236 UPDATE_GROWL_PREFS();
239 - (IBAction)setVanishDelay:(id)sender {
240 SYNCHRONIZE_GROWL_PREFS();
241 float vanishDelay = [vanishDelaySlider floatValue];
242 WRITE_GROWL_PREF_FLOAT(@"vanishDelay", vanishDelay, GrowlITTSWPrefsDomain);
243 UPDATE_GROWL_PREFS();
246 - (IBAction)setBackgroundStyle:(id)sender {
247 SYNCHRONIZE_GROWL_PREFS();
248 int style = [[backgroundStyleButton selectedItem] tag];
249 if (style == 2) { // colored
250 [backgroundColorWell setEnabled:YES];
252 [backgroundColorWell setEnabled:NO];
254 WRITE_GROWL_PREF_INT(@"backgroundStyle", style, GrowlITTSWPrefsDomain);
255 UPDATE_GROWL_PREFS();
258 - (IBAction)setBackgroundColor:(id)sender {
259 SYNCHRONIZE_GROWL_PREFS();
260 WRITE_GROWL_PREF_VALUE(@"backgroundColor", [NSArchiver archivedDataWithRootObject:[backgroundColorWell color]], GrowlITTSWPrefsDomain);
261 UPDATE_GROWL_PREFS();
264 - (IBAction)setWindowSize:(id)sender {
265 SYNCHRONIZE_GROWL_PREFS();
266 int size = [[windowSizeButton selectedItem] tag];
267 WRITE_GROWL_PREF_INT(@"windowSize", size, GrowlITTSWPrefsDomain);
268 UPDATE_GROWL_PREFS();
271 - (IBAction)setScreen:(id)sender {
272 SYNCHRONIZE_GROWL_PREFS();
273 int screenIndex = [screenButton indexOfSelectedItem];
274 WRITE_GROWL_PREF_INT(@"screenIndex", screenIndex, GrowlITTSWPrefsDomain);
275 UPDATE_GROWL_PREFS();