Implemented preference pane.
[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 - (NSString *)mainNibName {
131         return @"GrowlITTSWPrefs";
132 }
133
134 - (void)didSelect {
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]];
140         
141         ITTSWBackgroundMode backgroundStyle = [GrowlITTSWPrefs backgroundStyle];
142         [backgroundStyleButton selectItemWithTag:backgroundStyle];
143         if (backgroundStyle == ITTSWBackgroundColored) {
144                 [backgroundColorWell setEnabled:YES];
145         } else {
146                 [backgroundColorWell setEnabled:NO];
147         }
148         [[NSColorPanel sharedColorPanel] setShowsAlpha:YES];
149         [backgroundColorWell setColor:[GrowlITTSWPrefs backgroundColor]];
150         [windowSizeButton selectItemWithTag:[GrowlITTSWPrefs windowSize]];
151         
152         [screenButton removeAllItems];
153         NSArray *screens = [NSScreen screens];
154         int screenCount = 0;
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];
160                 screenCount++;
161         }
162         if (screenCount > 1) {
163                 [screenButton setEnabled:YES];
164         } else {
165                 [screenButton setEnabled:NO];
166         }
167         [screenButton selectItemAtIndex:[screenButton indexOfItemWithRepresentedObject:[GrowlITTSWPrefs screen]]];
168 }
169
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];
177                 
178                 [[appearanceEffectButton menu] addItem:[appearanceEffectItem autorelease]];
179                 [[vanishEffectButton menu] addItem:[vanishEffectItem autorelease]];
180         }
181         
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],
186                                                                  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];
192                 
193                 [[backgroundStyleButton menu] addItem:[backgroundStyleItem autorelease]];
194         }
195         
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],
200                                                         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];
206                 
207                 [[windowSizeButton menu] addItem:[windowSizeItem autorelease]];
208         }
209         
210         [self didSelect];
211 }
212
213 - (IBAction)setAppearanceEffect:(id)sender {
214         SYNCHRONIZE_GROWL_PREFS();
215         WRITE_GROWL_PREF_VALUE(@"appearanceEffect", NSStringFromClass([[appearanceEffectButton selectedItem] representedObject]), GrowlITTSWPrefsDomain);
216         UPDATE_GROWL_PREFS();
217 }
218
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();
224 }
225
226 - (IBAction)setVanishEffect:(id)sender {
227         SYNCHRONIZE_GROWL_PREFS();
228         WRITE_GROWL_PREF_VALUE(@"vanishEffect", NSStringFromClass([[vanishEffectButton selectedItem] representedObject]), GrowlITTSWPrefsDomain);
229         UPDATE_GROWL_PREFS();
230 }
231
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();
237 }
238
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();
244 }
245
246 - (IBAction)setBackgroundStyle:(id)sender {
247         SYNCHRONIZE_GROWL_PREFS();
248         int style = [[backgroundStyleButton selectedItem] tag];
249         if (style == 2) { // colored
250                 [backgroundColorWell setEnabled:YES];
251         } else {
252                 [backgroundColorWell setEnabled:NO];
253         }
254         WRITE_GROWL_PREF_INT(@"backgroundStyle", style, GrowlITTSWPrefsDomain);
255         UPDATE_GROWL_PREFS();
256 }
257
258 - (IBAction)setBackgroundColor:(id)sender {
259         SYNCHRONIZE_GROWL_PREFS();
260         WRITE_GROWL_PREF_VALUE(@"backgroundColor", [NSArchiver archivedDataWithRootObject:[backgroundColorWell color]], GrowlITTSWPrefsDomain);
261         UPDATE_GROWL_PREFS();
262 }
263
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();
269 }
270
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();
276 }
277
278 @end