dev.stuconnolly.com / svn / safaritabs

  1. /*
  2.  *  STPreferences.m
  3.  *
  4.  *  SafariTabs
  5.  *
  6.  *  Copyright (c) 2007 Stuart Connolly. All rights reserved.
  7.  *
  8.  *  This program is free software; you can redistribute it and/or
  9.  *  modify it under the terms of the GNU General Public License
  10.  *  as published by the Free Software Foundation; either version 2
  11.  *  of the License, or (at your option) any later version.
  12.  *
  13.  *  This program is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16.  *  GNU General Public License for more details.
  17.  *
  18.  *  You should have received a copy of the GNU General Public License
  19.  *  along with this program; if not, write to the Free Software
  20.  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  21.  */
  22.  
  23. #import "STPreferences.h"
  24. #import "STSafariPlugin.h"
  25. #import "STConstants.h"
  26.  
  27. @implementation STPreferences
  28.  
  29.  
  30. ////////////////////////////////////////////// *** initialize
  31.  
  32. + (void)initialize
  33. {
  34.     NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
  35.    
  36.     [defaults setObject:[NSNumber numberWithBool:YES] forKey:STEnableCloseWindowWarning];
  37.     [defaults setObject:[NSNumber numberWithBool:YES] forKey:STEnableQuitSafariWarning];
  38.     [defaults setObject:[NSNumber numberWithBool:YES] forKey:STAddCloseNoWarningMenuItem];
  39.     [defaults setObject:[NSNumber numberWithBool:YES] forKey:STAddQuitNoWarningMenuItem];
  40.     [defaults setObject:[NSNumber numberWithInt:0] forKey:STNewTabsLoadOption];
  41.     [defaults setObject:@"" forKey:STCustomLoadURL];
  42.    
  43.     [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
  44. }
  45.  
  46.  
  47. ////////////////////////////////////////////// *** preloadImage
  48.  
  49. + (NSImage *)preloadImage:(NSString *)_name
  50. {
  51.     NSImage *image = nil;
  52.     NSString *imagePath = [[NSBundle bundleWithIdentifier:@"com.connolly.SafariTabs"] pathForImageResource:_name];
  53.    
  54.     if (!imagePath) {
  55.         NSLog(@"SafariTabs: imagePath for %@ is nil", _name);
  56.         NSRunAlertPanel(@"ImagePath nil", [NSString stringWithFormat:@"%@", _name], @"OK", NULL, NULL);
  57.        
  58.         return nil;
  59.     }
  60.    
  61.     image = [[NSImage alloc] initByReferencingFile:imagePath];
  62.    
  63.     if (!image) {
  64.         NSLog(@"SafariTabs: image for %@ is nil", _name);
  65.        
  66.         return nil;
  67.     }
  68.    
  69.     [image setName:_name];
  70.    
  71.     return image;
  72. }
  73.  
  74.  
  75. ////////////////////////////////////////////// *** awakeFromNib
  76.  
  77. - (void)awakeFromNib
  78. {
  79.     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  80.     NSDictionary *info = [[NSBundle bundleWithIdentifier:@"com.connolly.SafariTabs"] infoDictionary];
  81.    
  82.     [authorTextField setStringValue:[NSString stringWithFormat:[authorTextField stringValue], [info objectForKey:@"CFBundleVersion"]]];
  83.    
  84.     [enableCloseWindowWarning setState:[defaults boolForKey:STEnableCloseWindowWarning]];
  85.     [enableQuitSafariWarning setState:[defaults boolForKey:STEnableQuitSafariWarning]];
  86.     [addCloseNoWarningCheckbox setState:[defaults boolForKey:STAddCloseNoWarningMenuItem]];
  87.     [addQuitNoWarningCheckbox setState:[defaults boolForKey:STAddQuitNoWarningMenuItem]];
  88.     [newTabsLoadOptionPopUpButtonx selectItemAtIndex:[defaults integerForKey:STNewTabsLoadOption]];
  89.     [customURLTextField setStringValue:[defaults stringForKey:STCustomLoadURL]];
  90. }
  91.  
  92.  
  93. ////////////////////////////////////////////// *** imageForPreferenceNamed
  94.  
  95. - (NSImage *)imageForPreferenceNamed:(NSString *)_name
  96. {
  97.     NSImage *image = [NSImage imageNamed:@"SafariTabs"];
  98.    
  99.     if (!image) {
  100.         image = [STPreferences preloadImage:_name];
  101.     }
  102.    
  103.     return image;
  104. }
  105.  
  106.  
  107. ////////////////////////////////////////////// *** preferencesNibName
  108.  
  109. - (NSString *)preferencesNibName
  110. {
  111.     return @"STPreferences";
  112. }
  113.  
  114.  
  115. ////////////////////////////////////////////// *** didChange
  116.  
  117. - (void)didChange
  118. {
  119.     [super didChange];
  120. }
  121.  
  122.  
  123. ////////////////////////////////////////////// *** viewForPreferenceNamed
  124.  
  125. - (NSView *)viewForPreferenceNamed:(NSString *)name
  126. {
  127.     if (![[STSafariPlugin sharedInstance] isLoaded]) {
  128.         return nil;
  129.     }
  130.    
  131.     return [super viewForPreferenceNamed:name];
  132. }
  133.  
  134.  
  135. ////////////////////////////////////////////// *** hasChangesPending
  136.  
  137. - (BOOL)hasChangesPending
  138. {
  139.     return [super hasChangesPending];
  140. }
  141.  
  142.  
  143. ////////////////////////////////////////////// *** moduleWillBeRemoved
  144.  
  145. - (void)moduleWillBeRemoved
  146. {
  147.     [super moduleWillBeRemoved];
  148. }
  149.  
  150.  
  151. ////////////////////////////////////////////// *** moduleWasInstalled
  152.  
  153. - (void)moduleWasInstalled
  154. {
  155.     [super moduleWasInstalled];
  156.    
  157.     if (![[STSafariPlugin sharedInstance] isLoaded]) {
  158.         NSLog(@"SafariTabs: Failed To Load");
  159.     }
  160. }
  161.  
  162.  
  163. ////////////////////////////////////////////// *** changeEnableCloseWindowWarning
  164.  
  165. - (IBAction)changeEnableCloseWindowWarning:(id)sender
  166. {
  167.     [[NSUserDefaults standardUserDefaults] setBool:[sender state] forKey:STEnableCloseWindowWarning];
  168.    
  169.     if (([sender state] == 0) && ([addCloseNoWarningCheckbox state] == 1)) {
  170.         [addCloseNoWarningCheckbox setEnabled:[sender state]];
  171.         [addCloseNoWarningCheckbox setState:[sender state]];
  172.         [self addRemoveCloseMenuItem:[sender state]];
  173.     }
  174.    
  175.     [addCloseNoWarningCheckbox setEnabled:[sender state]];
  176. }
  177.  
  178.  
  179. ////////////////////////////////////////////// *** changeEnableQuitSafariWarning
  180.  
  181. - (IBAction)changeEnableQuitSafariWarning:(id)sender
  182. {
  183.     [[NSUserDefaults standardUserDefaults] setBool:[sender state] forKey:STEnableQuitSafariWarning];
  184.    
  185.     if (([sender state] == 0) && ([addQuitNoWarningCheckbox state] == 1)) {
  186.         [addQuitNoWarningCheckbox setEnabled:[sender state]];
  187.         [addQuitNoWarningCheckbox setState:[sender state]];
  188.         [self addRemoveQuitMenuItem:[sender state]];
  189.     }
  190.    
  191.     [addQuitNoWarningCheckbox setEnabled:[sender state]];
  192. }
  193.  
  194.  
  195. ////////////////////////////////////////////// *** changeAddCloseNoWarningMenuItem
  196.  
  197. - (IBAction)changeAddCloseNoWarningMenuItem:(id)sender
  198. {
  199.     [[NSUserDefaults standardUserDefaults] setBool:[sender state] forKey:STAddCloseNoWarningMenuItem];
  200.    
  201.     [self addRemoveCloseMenuItem:[sender state]];
  202. }
  203.  
  204.  
  205. ////////////////////////////////////////////// *** changeAddQuitNoWarningMenuItem
  206.  
  207. - (IBAction)changeAddQuitNoWarningMenuItem:(id)sender
  208. {
  209.     [[NSUserDefaults standardUserDefaults] setBool:[sender state] forKey:STAddQuitNoWarningMenuItem];
  210.    
  211.     [self addRemoveQuitMenuItem:[sender state]];
  212. }
  213.  
  214.  
  215. ////////////////////////////////////////////// *** changeNewTabsLoadOption
  216.  
  217. - (IBAction)changeNewTabsLoadOption:(id)sender
  218. {
  219.     [[NSUserDefaults standardUserDefaults] setInteger:[sender indexOfSelectedItem] forKey:STNewTabsLoadOption];
  220. }
  221.  
  222.  
  223. ////////////////////////////////////////////// *** closeWindowWithoutWarning
  224.  
  225. - (IBAction)closeWindowWithoutWarning:(id)sender
  226. {
  227.     [[[NSApplication sharedApplication] mainWindow] close];
  228. }
  229.  
  230.  
  231. ////////////////////////////////////////////// *** quitWithoutWarning
  232.  
  233. - (IBAction)quitWithoutWarning:(id)sender
  234. {
  235.     [[STSafariPlugin sharedInstance] setTerminateWithoutWarning:YES];
  236.     [[STSafariPlugin sharedInstance] quitWithoutWarning:self];
  237. }
  238.  
  239.  
  240. ////////////////////////////////////////////// *** customURL
  241.  
  242. - (IBAction)customURL:(id)sender
  243. {
  244.     [NSApp beginSheet:customURLPanel modalForWindow:[[super viewForPreferenceNamed:@"STPreferences"] window] modalDelegate:self didEndSelector:nil contextInfo:nil];
  245.     [[NSUserDefaults standardUserDefaults] setInteger:4 forKey:STNewTabsLoadOption];
  246. }
  247.  
  248.  
  249. ////////////////////////////////////////////// *** cancelCustomURL
  250.  
  251. - (IBAction)cancelCustomURL:(id)sender
  252. {
  253.     [customURLPanel orderOut:self];
  254.     [NSApp endSheet:customURLPanel returnCode:1];
  255. }
  256.  
  257.  
  258. ////////////////////////////////////////////// *** confirmCustomURL
  259.  
  260. - (IBAction)confirmCustomURL:(id)sender
  261. {
  262.     [customURLPanel orderOut:self];
  263.     [NSApp endSheet:customURLPanel returnCode:1];
  264.    
  265.     [[NSUserDefaults standardUserDefaults] setObject:[customURLTextField stringValue] forKey:STCustomLoadURL];
  266. }
  267.  
  268.  
  269. ////////////////////////////////////////////// *** addRemoveCloseMenuItem
  270.  
  271. - (void)addRemoveCloseMenuItem:(BOOL)flag
  272. {  
  273.     NSMenu *safariMenuBar = [[NSApplication sharedApplication] mainMenu];
  274.     NSMenu *fileMenu = [[safariMenuBar itemAtIndex:1] submenu];
  275.    
  276.     NSEnumerator *itemEnumerator = [[fileMenu itemArray] objectEnumerator];
  277.     NSMenuItem *item;
  278.    
  279.     // Add/remove the menu item depending on the flag
  280.     while (item = [itemEnumerator nextObject]) {
  281.         if (flag) {
  282.             if ([item action] == @selector(performClose:)) {
  283.                 int index = [fileMenu indexOfItem:item];
  284.                 [fileMenu insertItem:[closeMenuItem copy] atIndex:(index + 1)];
  285.                
  286.                 break;
  287.             }
  288.         }
  289.         else {
  290.             if ([item action] == @selector(closeWindowWithoutWarning:)) {
  291.                 [fileMenu removeItemAtIndex:[fileMenu indexOfItem:item]];
  292.                
  293.                 break;
  294.             }
  295.         }
  296.     }
  297. }
  298.  
  299.  
  300. ////////////////////////////////////////////// *** addRemoveQuitMenuItem
  301.  
  302. - (void)addRemoveQuitMenuItem:(BOOL)flag
  303. {
  304.     NSMenu *safariMenuBar = [[NSApplication sharedApplication] mainMenu];
  305.     NSMenu *safariMenu = [[safariMenuBar itemAtIndex:0] submenu];
  306.    
  307.     NSEnumerator *itemEnumerator = [[safariMenu itemArray] objectEnumerator];
  308.     NSMenuItem *item;
  309.    
  310.     // Add/remove the menu item depending on the flag
  311.     while (item = [itemEnumerator nextObject]) {
  312.         if (flag) {
  313.             [safariMenu addItem:[quitMenuItem copy]];
  314.            
  315.             break;
  316.         }
  317.         else {
  318.             if ([item action] == @selector(quitWithoutWarning:)) {
  319.                 [safariMenu removeItemAtIndex:[safariMenu indexOfItem:item]];
  320.                
  321.                 break;
  322.             }
  323.         }
  324.     }
  325. }
  326.  
  327. @end