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;
131 SYNCHRONIZE_GROWL_PREFS();
132 float imageSize = 110.0f;
133 READ_GROWL_PREF_FLOAT(@"imageSize", GrowlITTSWPrefsDomain, &imageSize);
137 + (BOOL)imageNoUpscale {
138 SYNCHRONIZE_GROWL_PREFS();
139 BOOL imageNoUpscale = NO;
140 READ_GROWL_PREF_BOOL(@"imageNoUpscale", GrowlITTSWPrefsDomain, &imageNoUpscale);
141 return imageNoUpscale;
144 + (BOOL)wrapNotifications {
145 SYNCHRONIZE_GROWL_PREFS();
146 BOOL wrapNotifications = NO;
147 READ_GROWL_PREF_BOOL(@"wrapNotifications", GrowlITTSWPrefsDomain, &wrapNotifications);
148 return wrapNotifications;
152 SYNCHRONIZE_GROWL_PREFS();
153 int wrapColumns = 64;
154 READ_GROWL_PREF_INT(@"wrapColumns", GrowlITTSWPrefsDomain, &wrapColumns);
158 - (NSString *)mainNibName {
159 return @"GrowlITTSWPrefs";
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]];
169 ITTSWBackgroundMode backgroundStyle = [GrowlITTSWPrefs backgroundStyle];
170 [backgroundStyleButton selectItemWithTag:backgroundStyle];
171 if (backgroundStyle == ITTSWBackgroundColored) {
172 [backgroundColorWell setEnabled:YES];
174 [backgroundColorWell setEnabled:NO];
176 [[NSColorPanel sharedColorPanel] setShowsAlpha:YES];
177 [backgroundColorWell setColor:[GrowlITTSWPrefs backgroundColor]];
178 [windowSizeButton selectItemWithTag:[GrowlITTSWPrefs windowSize]];
180 [screenButton removeAllItems];
181 NSArray *screens = [NSScreen screens];
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];
190 if (screenCount > 1) {
191 [screenButton setEnabled:YES];
193 [screenButton setEnabled:NO];
195 [screenButton selectItemAtIndex:[screenButton indexOfItemWithRepresentedObject:[GrowlITTSWPrefs screen]]];
196 [imageSizeSlider setFloatValue:[GrowlITTSWPrefs imageSize]];
197 [imageNoUpscaleButton setState:([GrowlITTSWPrefs imageNoUpscale] ? NSOnState : NSOffState)];
199 BOOL wrapNotifications = [GrowlITTSWPrefs wrapNotifications];
200 [wrapNotificationsButton setState:(wrapNotifications ? NSOnState : NSOffState)];
201 [wrapColumnsField setIntValue:[GrowlITTSWPrefs wrapColumns]];
202 [wrapColumnsField setEnabled:wrapNotifications];
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];
213 [[appearanceEffectButton menu] addItem:[appearanceEffectItem autorelease]];
214 [[vanishEffectButton menu] addItem:[vanishEffectItem autorelease]];
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],
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];
228 [[backgroundStyleButton menu] addItem:[backgroundStyleItem autorelease]];
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],
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];
242 [[windowSizeButton menu] addItem:[windowSizeItem autorelease]];
248 - (IBAction)setAppearanceEffect:(id)sender {
249 SYNCHRONIZE_GROWL_PREFS();
250 WRITE_GROWL_PREF_VALUE(@"appearanceEffect", NSStringFromClass([[appearanceEffectButton selectedItem] representedObject]), GrowlITTSWPrefsDomain);
251 UPDATE_GROWL_PREFS();
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();
261 - (IBAction)setVanishEffect:(id)sender {
262 SYNCHRONIZE_GROWL_PREFS();
263 WRITE_GROWL_PREF_VALUE(@"vanishEffect", NSStringFromClass([[vanishEffectButton selectedItem] representedObject]), GrowlITTSWPrefsDomain);
264 UPDATE_GROWL_PREFS();
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();
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();
281 - (IBAction)setBackgroundStyle:(id)sender {
282 SYNCHRONIZE_GROWL_PREFS();
283 int style = [[backgroundStyleButton selectedItem] tag];
284 if (style == 2) { // colored
285 [backgroundColorWell setEnabled:YES];
287 [backgroundColorWell setEnabled:NO];
289 WRITE_GROWL_PREF_INT(@"backgroundStyle", style, GrowlITTSWPrefsDomain);
290 UPDATE_GROWL_PREFS();
293 - (IBAction)setBackgroundColor:(id)sender {
294 SYNCHRONIZE_GROWL_PREFS();
295 WRITE_GROWL_PREF_VALUE(@"backgroundColor", [NSArchiver archivedDataWithRootObject:[backgroundColorWell color]], GrowlITTSWPrefsDomain);
296 UPDATE_GROWL_PREFS();
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();
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();
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();
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();
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();
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();