Bumping to version 1.0.1, which uses the latest ITKit. This resolves GrowlITTSW bug #4.
[GrowlITTSW.git] / GrowlITTSWPrefs.m
1 #import "GrowlITTSWPrefs.h"
2 #import "GrowlPositioningDefines.h"
3 #import "GrowlDefinesInternal.h"
4 #define GrowlITTSWPrefsDomain @"com.ithinksw.growl-ittsw"
5
6 @interface GrowlPositionController
7 + (enum GrowlPosition)selectedOriginPosition;
8 @end
9
10 @implementation GrowlITTSWPrefs
11
12 + (Class)appearanceEffect {
13         SYNCHRONIZE_GROWL_PREFS();
14         NSString *className = nil;
15         READ_GROWL_PREF_VALUE(@"appearanceEffect", GrowlITTSWPrefsDomain, NSString *, &className);
16         if (className) {
17                 Class effectClass = NSClassFromString(className);
18                 if (effectClass && [effectClass isSubclassOfClass:[ITWindowEffect class]]) {
19                         return effectClass;
20                 }
21         }
22         return NSClassFromString(@"ITCutWindowEffect");
23 }
24
25 + (float)appearanceSpeed {
26         SYNCHRONIZE_GROWL_PREFS();
27         float appearanceSpeed = 0.8f;
28         READ_GROWL_PREF_FLOAT(@"appearanceSpeed", GrowlITTSWPrefsDomain, &appearanceSpeed);
29         return appearanceSpeed;
30 }
31
32 + (Class)vanishEffect {
33         SYNCHRONIZE_GROWL_PREFS();
34         NSString *className = nil;
35         READ_GROWL_PREF_VALUE(@"vanishEffect", GrowlITTSWPrefsDomain, NSString *, &className);
36         if (className) {
37                 Class effectClass = NSClassFromString(className);
38                 if (effectClass && [effectClass isSubclassOfClass:[ITWindowEffect class]]) {
39                         return effectClass;
40                 }
41         }
42         return NSClassFromString(@"ITCutWindowEffect");
43 }
44
45 + (float)vanishSpeed {
46         SYNCHRONIZE_GROWL_PREFS();
47         float vanishSpeed = 0.8f;
48         READ_GROWL_PREF_FLOAT(@"vanishSpeed", GrowlITTSWPrefsDomain, &vanishSpeed);
49         return vanishSpeed;
50 }
51
52 + (float)vanishDelay {
53         SYNCHRONIZE_GROWL_PREFS();
54         float vanishDelay = 4.0f;
55         READ_GROWL_PREF_FLOAT(@"vanishDelay", GrowlITTSWPrefsDomain, &vanishDelay);
56         return vanishDelay;
57 }
58
59 + (ITTSWBackgroundMode)backgroundStyle {
60         SYNCHRONIZE_GROWL_PREFS();
61         int backgroundStyle = ITTSWBackgroundReadable;
62         READ_GROWL_PREF_INT(@"backgroundStyle", GrowlITTSWPrefsDomain, &backgroundStyle);
63         return backgroundStyle;
64 }
65
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;
74                 }
75         }
76         return [NSColor blueColor];
77 }
78
79 + (ITTransientStatusWindowSizing)windowSize {
80         SYNCHRONIZE_GROWL_PREFS();
81         ITTransientStatusWindowSizing windowSize = ITTransientStatusWindowMini;
82         READ_GROWL_PREF_INT(@"windowSize", GrowlITTSWPrefsDomain, &windowSize);
83         return windowSize;
84 }
85
86 + (int)screenIndex {
87         SYNCHRONIZE_GROWL_PREFS();
88         int screenIndex = 0;
89         READ_GROWL_PREF_INT(@"screenIndex", GrowlITTSWPrefsDomain, &screenIndex);
90         return screenIndex;
91 }
92
93 + (NSScreen *)screen {
94         NSArray *screens = [NSScreen screens];
95         int screenIndex = [GrowlITTSWPrefs screenIndex];
96         if ([screens count] >= (screenIndex+1)) {
97                 return [screens objectAtIndex:screenIndex];
98         }
99         return [screens objectAtIndex:0];
100 }
101
102 + (ITHorizontalWindowPosition)horizontalPosition {
103         switch ([GrowlPositionController selectedOriginPosition]) {
104                 case GrowlBottomLeftPosition:
105                 case GrowlTopLeftPosition:
106                         return ITWindowPositionLeft;
107                         break;
108                 default:
109                 case GrowlBottomRightPosition:
110                 case GrowlTopRightPosition:
111                         return ITWindowPositionRight;
112                         break;
113         }
114 }
115
116 + (ITVerticalWindowPosition)verticalPosition {
117         switch ([GrowlPositionController selectedOriginPosition]) {
118                 case GrowlBottomLeftPosition:
119                 case GrowlBottomRightPosition:
120                         return ITWindowPositionBottom;
121                         break;
122                 default:
123                 case GrowlTopLeftPosition:
124                 case GrowlTopRightPosition:
125                         return ITWindowPositionTop;
126                         break;
127         }
128 }
129
130 + (float)imageSize {
131         SYNCHRONIZE_GROWL_PREFS();
132         float imageSize = 110.0f;
133         READ_GROWL_PREF_FLOAT(@"imageSize", GrowlITTSWPrefsDomain, &imageSize);
134         return imageSize;
135 }
136
137 + (BOOL)imageNoUpscale {
138         SYNCHRONIZE_GROWL_PREFS();
139         BOOL imageNoUpscale = NO;
140         READ_GROWL_PREF_BOOL(@"imageNoUpscale", GrowlITTSWPrefsDomain, &imageNoUpscale);
141         return imageNoUpscale;
142 }
143
144 + (BOOL)wrapNotifications {
145         SYNCHRONIZE_GROWL_PREFS();
146         BOOL wrapNotifications = NO;
147         READ_GROWL_PREF_BOOL(@"wrapNotifications", GrowlITTSWPrefsDomain, &wrapNotifications);
148         return wrapNotifications;
149 }
150
151 + (int)wrapColumns {
152         SYNCHRONIZE_GROWL_PREFS();
153         int wrapColumns = 64;
154         READ_GROWL_PREF_INT(@"wrapColumns", GrowlITTSWPrefsDomain, &wrapColumns);
155         return wrapColumns;
156 }
157
158 - (NSString *)mainNibName {
159         return @"GrowlITTSWPrefs";
160 }
161
162 - (void)didSelect {
163         [appearanceEffectButton selectItemAtIndex:[appearanceEffectButton indexOfItemWithRepresentedObject:[GrowlITTSWPrefs appearanceEffect]]];
164         [appearanceSpeedSlider setFloatValue:-([GrowlITTSWPrefs appearanceSpeed])];
165         [vanishEffectButton selectItemAtIndex:[vanishEffectButton indexOfItemWithRepresentedObject:[GrowlITTSWPrefs vanishEffect]]];
166         [vanishSpeedSlider setFloatValue:-([GrowlITTSWPrefs vanishSpeed])];
167         [vanishDelaySlider setFloatValue:[GrowlITTSWPrefs vanishDelay]];
168         
169         ITTSWBackgroundMode backgroundStyle = [GrowlITTSWPrefs backgroundStyle];
170         [backgroundStyleButton selectItemWithTag:backgroundStyle];
171         if (backgroundStyle == ITTSWBackgroundColored) {
172                 [backgroundColorWell setEnabled:YES];
173         } else {
174                 [backgroundColorWell setEnabled:NO];
175         }
176         [[NSColorPanel sharedColorPanel] setShowsAlpha:YES];
177         [backgroundColorWell setColor:[GrowlITTSWPrefs backgroundColor]];
178         [windowSizeButton selectItemWithTag:[GrowlITTSWPrefs windowSize]];
179         
180         [screenButton removeAllItems];
181         NSArray *screens = [NSScreen screens];
182         int screenCount = 0;
183         for (NSScreen *screen in screens) {
184                 NSSize screenSize = [screen frame].size;
185                 NSMenuItem *screenItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:@"Screen %i (%1.0fx%1.0f)", screenCount+1, screenSize.width, screenSize.height] action:NULL keyEquivalent:@""];
186                 [screenItem setRepresentedObject:screen];
187                 [[screenButton menu] addItem:screenItem];
188                 screenCount++;
189         }
190         if (screenCount > 1) {
191                 [screenButton setEnabled:YES];
192         } else {
193                 [screenButton setEnabled:NO];
194         }
195         [screenButton selectItemAtIndex:[screenButton indexOfItemWithRepresentedObject:[GrowlITTSWPrefs screen]]];
196         [imageSizeSlider setFloatValue:[GrowlITTSWPrefs imageSize]];
197         [imageNoUpscaleButton setState:([GrowlITTSWPrefs imageNoUpscale] ? NSOnState : NSOffState)];
198         
199         BOOL wrapNotifications = [GrowlITTSWPrefs wrapNotifications];
200         [wrapNotificationsButton setState:(wrapNotifications ? NSOnState : NSOffState)];
201         [wrapColumnsField setIntValue:[GrowlITTSWPrefs wrapColumns]];
202         [wrapColumnsField setEnabled:wrapNotifications];
203 }
204
205 - (void)awakeFromNib {
206         NSArray *effectClasses = [ITWindowEffect effectClasses];
207         for (Class effectClass in effectClasses) {
208                 NSMenuItem *appearanceEffectItem = [[NSMenuItem alloc] initWithTitle:[effectClass effectName] action:NULL keyEquivalent:@""];
209                 NSMenuItem *vanishEffectItem = [[NSMenuItem alloc] initWithTitle:[effectClass effectName] action:NULL keyEquivalent:@""];
210                 [appearanceEffectItem setRepresentedObject:effectClass];
211                 [vanishEffectItem setRepresentedObject:effectClass];
212                 
213                 [[appearanceEffectButton menu] addItem:[appearanceEffectItem autorelease]];
214                 [[vanishEffectButton menu] addItem:[vanishEffectItem autorelease]];
215         }
216         
217         NSArray *backgroundStyles = [NSArray arrayWithObjects:
218                                                                         [NSDictionary dictionaryWithObjectsAndKeys:@"Mac OS X", @"name", [NSNumber numberWithInt:ITTSWBackgroundApple], @"index", nil],
219                                                                         [NSDictionary dictionaryWithObjectsAndKeys:@"Very Readable", @"name", [NSNumber numberWithInt:ITTSWBackgroundReadable], @"index", nil],
220                                                                         [NSDictionary dictionaryWithObjectsAndKeys:@"Custom Color...", @"name", [NSNumber numberWithInt:ITTSWBackgroundColored], @"index", nil],
221                                                                  nil];
222         for (NSDictionary *backgroundStyleDict in backgroundStyles) {
223                 NSString *backgroundStyleName = [backgroundStyleDict objectForKey:@"name"];
224                 ITTSWBackgroundMode backgroundStyle = [[backgroundStyleDict objectForKey:@"index"] intValue];
225                 NSMenuItem *backgroundStyleItem = [[NSMenuItem alloc] initWithTitle:backgroundStyleName action:NULL keyEquivalent:@""];
226                 [backgroundStyleItem setTag:backgroundStyle];
227                 
228                 [[backgroundStyleButton menu] addItem:[backgroundStyleItem autorelease]];
229         }
230         
231         NSArray *windowSizes = [NSArray arrayWithObjects:
232                                                                 [NSDictionary dictionaryWithObjectsAndKeys:@"Regular", @"name", [NSNumber numberWithInt:ITTransientStatusWindowRegular], @"index", nil],
233                                                                 [NSDictionary dictionaryWithObjectsAndKeys:@"Small", @"name", [NSNumber numberWithInt:ITTransientStatusWindowSmall], @"index", nil],
234                                                                 [NSDictionary dictionaryWithObjectsAndKeys:@"Mini", @"name", [NSNumber numberWithInt:ITTransientStatusWindowMini], @"index", nil],
235                                                         nil];
236         for (NSDictionary *windowSizeDict in windowSizes) {
237                 NSString *windowSizeName = [windowSizeDict objectForKey:@"name"];
238                 ITTransientStatusWindowSizing windowSize = [[windowSizeDict objectForKey:@"index"] intValue];
239                 NSMenuItem *windowSizeItem = [[NSMenuItem alloc] initWithTitle:windowSizeName action:NULL keyEquivalent:@""];
240                 [windowSizeItem setTag:windowSize];
241                 
242                 [[windowSizeButton menu] addItem:[windowSizeItem autorelease]];
243         }
244         
245         [self didSelect];
246 }
247
248 - (IBAction)setAppearanceEffect:(id)sender {
249         SYNCHRONIZE_GROWL_PREFS();
250         WRITE_GROWL_PREF_VALUE(@"appearanceEffect", NSStringFromClass([[appearanceEffectButton selectedItem] representedObject]), GrowlITTSWPrefsDomain);
251         UPDATE_GROWL_PREFS();
252 }
253
254 - (IBAction)setAppearanceSpeed:(id)sender {
255         SYNCHRONIZE_GROWL_PREFS();
256         float appearanceSpeed = -([appearanceSpeedSlider floatValue]);
257         WRITE_GROWL_PREF_FLOAT(@"appearanceSpeed", appearanceSpeed, GrowlITTSWPrefsDomain);
258         UPDATE_GROWL_PREFS();
259 }
260
261 - (IBAction)setVanishEffect:(id)sender {
262         SYNCHRONIZE_GROWL_PREFS();
263         WRITE_GROWL_PREF_VALUE(@"vanishEffect", NSStringFromClass([[vanishEffectButton selectedItem] representedObject]), GrowlITTSWPrefsDomain);
264         UPDATE_GROWL_PREFS();
265 }
266
267 - (IBAction)setVanishSpeed:(id)sender {
268         SYNCHRONIZE_GROWL_PREFS();
269         float vanishSpeed = -([vanishSpeedSlider floatValue]);
270         WRITE_GROWL_PREF_FLOAT(@"vanishSpeed", vanishSpeed, GrowlITTSWPrefsDomain);
271         UPDATE_GROWL_PREFS();
272 }
273
274 - (IBAction)setVanishDelay:(id)sender {
275         SYNCHRONIZE_GROWL_PREFS();
276         float vanishDelay = [vanishDelaySlider floatValue];
277         WRITE_GROWL_PREF_FLOAT(@"vanishDelay", vanishDelay, GrowlITTSWPrefsDomain);
278         UPDATE_GROWL_PREFS();
279 }
280
281 - (IBAction)setBackgroundStyle:(id)sender {
282         SYNCHRONIZE_GROWL_PREFS();
283         int style = [[backgroundStyleButton selectedItem] tag];
284         if (style == 2) { // colored
285                 [backgroundColorWell setEnabled:YES];
286         } else {
287                 [backgroundColorWell setEnabled:NO];
288         }
289         WRITE_GROWL_PREF_INT(@"backgroundStyle", style, GrowlITTSWPrefsDomain);
290         UPDATE_GROWL_PREFS();
291 }
292
293 - (IBAction)setBackgroundColor:(id)sender {
294         SYNCHRONIZE_GROWL_PREFS();
295         WRITE_GROWL_PREF_VALUE(@"backgroundColor", [NSArchiver archivedDataWithRootObject:[backgroundColorWell color]], GrowlITTSWPrefsDomain);
296         UPDATE_GROWL_PREFS();
297 }
298
299 - (IBAction)setWindowSize:(id)sender {
300         SYNCHRONIZE_GROWL_PREFS();
301         int size = [[windowSizeButton selectedItem] tag];
302         WRITE_GROWL_PREF_INT(@"windowSize", size, GrowlITTSWPrefsDomain);
303         UPDATE_GROWL_PREFS();
304 }
305
306 - (IBAction)setScreen:(id)sender {
307         SYNCHRONIZE_GROWL_PREFS();
308         int screenIndex = [screenButton indexOfSelectedItem];
309         WRITE_GROWL_PREF_INT(@"screenIndex", screenIndex, GrowlITTSWPrefsDomain);
310         UPDATE_GROWL_PREFS();
311 }
312
313 - (IBAction)setImageSize:(id)sender {
314         SYNCHRONIZE_GROWL_PREFS();
315         float imageSize = [imageSizeSlider floatValue];
316         WRITE_GROWL_PREF_FLOAT(@"imageSize", imageSize, GrowlITTSWPrefsDomain);
317         UPDATE_GROWL_PREFS();
318 }
319
320 - (IBAction)setImageNoUpscale:(id)sender {
321         SYNCHRONIZE_GROWL_PREFS();
322         BOOL imageNoUpscale = ([imageNoUpscaleButton state] == NSOnState) ? YES : NO;
323         WRITE_GROWL_PREF_BOOL(@"imageNoUpscale", imageNoUpscale, GrowlITTSWPrefsDomain);
324         UPDATE_GROWL_PREFS();
325 }
326
327 - (IBAction)setWrap:(id)sender {
328         SYNCHRONIZE_GROWL_PREFS();
329         BOOL wrapNotifications = ([wrapNotificationsButton state] == NSOnState) ? YES : NO;
330         [wrapColumnsField setEnabled:wrapNotifications];
331         WRITE_GROWL_PREF_BOOL(@"wrapNotifications", wrapNotifications, GrowlITTSWPrefsDomain);
332         UPDATE_GROWL_PREFS();
333 }
334
335 - (IBAction)setWrapColumns:(id)sender {
336         SYNCHRONIZE_GROWL_PREFS();
337         int wrapColumns = [wrapColumnsField intValue];
338         [wrapColumnsField setIntValue:wrapColumns];
339         WRITE_GROWL_PREF_INT(@"wrapColumns", wrapColumns, GrowlITTSWPrefsDomain);
340         UPDATE_GROWL_PREFS();
341 }
342
343 @end