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.    
  42.     [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
  43. }
  44.  
  45.  
  46. ////////////////////////////////////////////// *** preloadImage
  47.  
  48. + (NSImage *)preloadImage:(NSString *)_name
  49. {
  50.     NSImage *image = nil;
  51.     NSString *imagePath = [[NSBundle bundleWithIdentifier:@"com.connolly.SafariTabs"] pathForImageResource:_name];
  52.    
  53.     if (!imagePath) {
  54.         NSLog(@"SafariTabs: imagePath for %@ is nil", _name);
  55.         NSRunAlertPanel(@"ImagePath nil", [NSString stringWithFormat:@"%@", _name], @"OK", NULL, NULL);
  56.        
  57.         return nil;
  58.     }
  59.    
  60.     image = [[NSImage alloc] initByReferencingFile:imagePath];
  61.    
  62.     if (!image) {
  63.         NSLog(@"SafariTabs: image for %@ is nil", _name);
  64.        
  65.         return nil;
  66.     }
  67.    
  68.     [image setName:_name];
  69.    
  70.     return image;
  71. }
  72.  
  73.  
  74. ////////////////////////////////////////////// *** awakeFromNib
  75.  
  76. - (void)awakeFromNib
  77. {
  78.     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  79.     NSDictionary *info = [[NSBundle bundleWithIdentifier:@"com.connolly.SafariTabs"] infoDictionary];
  80.    
  81.     [authorTextField setStringValue:[NSString stringWithFormat:[authorTextField stringValue], [info objectForKey:@"CFBundleVersion"]]];
  82.    
  83.     [enableCloseWindowWarning setState:[defaults boolForKey:STEnableCloseWindowWarning]];
  84.     [enableQuitSafariWarning setState:[defaults boolForKey:STEnableQuitSafariWarning]];
  85.     [addCloseNoWarningCheckbox setState:[defaults boolForKey:STAddCloseNoWarningMenuItem]];
  86.     [addQuitNoWarningCheckbox setState:[defaults boolForKey:STAddQuitNoWarningMenuItem]];
  87.     [newTabsLoadOptionPopUpButtonx selectItemAtIndex:[defaults integerForKey:STNewTabsLoadOption]];
  88. }
  89.  
  90.  
  91. ////////////////////////////////////////////// *** imageForPreferenceNamed
  92.  
  93. - (NSImage *)imageForPreferenceNamed:(NSString *)_name
  94. {
  95.     NSImage *image = [NSImage imageNamed:@"SafariTabs"];
  96.    
  97.     if (!image) {
  98.         image = [STPreferences preloadImage:_name];
  99.     }
  100.    
  101.     return image;
  102. }
  103.  
  104.  
  105. ////////////////////////////////////////////// *** preferencesNibName
  106.  
  107. - (NSString *)preferencesNibName
  108. {
  109.     return @"STPreferences";
  110. }
  111.  
  112.  
  113. ////////////////////////////////////////////// *** didChange
  114.  
  115. - (void)didChange
  116. {
  117.     [super didChange];
  118. }
  119.  
  120.  
  121. ////////////////////////////////////////////// *** viewForPreferenceNamed
  122.  
  123. - (NSView *)viewForPreferenceNamed:(NSString *)name
  124. {
  125.     if (![[STSafariPlugin sharedInstance] isLoaded]) {
  126.         return nil;
  127.     }
  128.    
  129.     return [super viewForPreferenceNamed:name];
  130. }
  131.  
  132.  
  133. ////////////////////////////////////////////// *** hasChangesPending
  134.  
  135. - (BOOL)hasChangesPending
  136. {
  137.     return [super hasChangesPending];
  138. }
  139.  
  140.  
  141. ////////////////////////////////////////////// *** moduleWillBeRemoved
  142.  
  143. - (void)moduleWillBeRemoved
  144. {
  145.     [super moduleWillBeRemoved];
  146. }
  147.  
  148.  
  149. ////////////////////////////////////////////// *** moduleWasInstalled
  150.  
  151. - (void)moduleWasInstalled
  152. {
  153.     [super moduleWasInstalled];
  154.    
  155.     if (![[STSafariPlugin sharedInstance] isLoaded]) {
  156.         NSLog(@"SafariTabs: Failed To Load");
  157.     }
  158. }
  159.  
  160.  
  161. ////////////////////////////////////////////// *** changeEnableCloseWindowWarning
  162.  
  163. - (IBAction)changeEnableCloseWindowWarning:(id)sender
  164. {
  165.     [[NSUserDefaults standardUserDefaults] setBool:[sender state] forKey:STEnableCloseWindowWarning];
  166.    
  167.     if (([sender state] == 0) && ([addCloseNoWarningCheckbox state] == 1)) {
  168.         [addCloseNoWarningCheckbox setEnabled:[sender state]];
  169.         [addCloseNoWarningCheckbox setState:[sender state]];
  170.         [self addRemoveCloseMenuItem:[sender state]];
  171.     }
  172.    
  173.     [addCloseNoWarningCheckbox setEnabled:[sender state]];
  174. }
  175.  
  176.  
  177. ////////////////////////////////////////////// *** changeEnableQuitSafariWarning
  178.  
  179. - (IBAction)changeEnableQuitSafariWarning:(id)sender
  180. {
  181.     [[NSUserDefaults standardUserDefaults] setBool:[sender state] forKey:STEnableQuitSafariWarning];
  182.    
  183.     if (([sender state] == 0) && ([addQuitNoWarningCheckbox state] == 1)) {
  184.         [addQuitNoWarningCheckbox setEnabled:[sender state]];
  185.         [addQuitNoWarningCheckbox setState:[sender state]];
  186.         [self addRemoveQuitMenuItem:[sender state]];
  187.     }
  188.    
  189.     [addQuitNoWarningCheckbox setEnabled:[sender state]];
  190. }
  191.  
  192.  
  193. ////////////////////////////////////////////// *** changeAddCloseNoWarningMenuItem
  194.  
  195. - (IBAction)changeAddCloseNoWarningMenuItem:(id)sender
  196. {
  197.     [[NSUserDefaults standardUserDefaults] setBool:[sender state] forKey:STAddCloseNoWarningMenuItem];
  198.    
  199.     [self addRemoveCloseMenuItem:[sender state]];
  200. }
  201.  
  202.  
  203. ////////////////////////////////////////////// *** changeAddQuitNoWarningMenuItem
  204.  
  205. - (IBAction)changeAddQuitNoWarningMenuItem:(id)sender
  206. {
  207.     [[NSUserDefaults standardUserDefaults] setBool:[sender state] forKey:STAddQuitNoWarningMenuItem];
  208.    
  209.     [self addRemoveQuitMenuItem:[sender state]];
  210. }
  211.  
  212.  
  213. ////////////////////////////////////////////// *** changeNewTabsLoadOption
  214.  
  215. - (IBAction)changeNewTabsLoadOption:(id)sender
  216. {
  217.     [[NSUserDefaults standardUserDefaults] setInteger:[sender indexOfSelectedItem] forKey:STNewTabsLoadOption];
  218. }
  219.  
  220.  
  221. ////////////////////////////////////////////// *** closeWindowWithoutWarning
  222.  
  223. - (IBAction)closeWindowWithoutWarning:(id)sender
  224. {
  225.     [[[NSApplication sharedApplication] mainWindow] close];
  226. }
  227.  
  228.  
  229. ////////////////////////////////////////////// *** quitWithoutWarning
  230.  
  231. - (IBAction)quitWithoutWarning:(id)sender
  232. {
  233.     [[STSafariPlugin sharedInstance] setTerminateWithoutWarning:YES];
  234.     [[STSafariPlugin sharedInstance] quitWithoutWarning:self];
  235. }
  236.  
  237.  
  238. ////////////////////////////////////////////// *** addRemoveCloseMenuItem
  239.  
  240. - (void)addRemoveCloseMenuItem:(BOOL)flag
  241. {  
  242.     NSMenu *safariMenuBar = [[NSApplication sharedApplication] mainMenu];
  243.     NSMenu *fileMenu = [[safariMenuBar itemAtIndex:1] submenu];
  244.    
  245.     NSEnumerator *itemEnumerator = [[fileMenu itemArray] objectEnumerator];
  246.     NSMenuItem *item;
  247.    
  248.     // Add/remove the menu item depending on the flag
  249.     while (item = [itemEnumerator nextObject]) {
  250.         if (flag) {
  251.             if ([item action] == @selector(performClose:)) {
  252.                 int index = [fileMenu indexOfItem:item];
  253.                 [fileMenu insertItem:[closeMenuItem copy] atIndex:(index + 1)];
  254.                
  255.                 break;
  256.             }
  257.         }
  258.         else {
  259.             if ([item action] == @selector(closeWindowWithoutWarning:)) {
  260.                 [fileMenu removeItemAtIndex:[fileMenu indexOfItem:item]];
  261.                
  262.                 break;
  263.             }
  264.            
  265.         }
  266.     }
  267. }
  268.  
  269.  
  270. ////////////////////////////////////////////// *** addRemoveQuitMenuItem
  271.  
  272. - (void)addRemoveQuitMenuItem:(BOOL)flag
  273. {
  274.     NSMenu *safariMenuBar = [[NSApplication sharedApplication] mainMenu];
  275.     NSMenu *safariMenu = [[safariMenuBar itemAtIndex:0] submenu];
  276.    
  277.     NSEnumerator *itemEnumerator = [[safariMenu itemArray] objectEnumerator];
  278.     NSMenuItem *item;
  279.    
  280.     // Add/remove the menu item depending on the flag
  281.     while (item = [itemEnumerator nextObject]) {
  282.         if (flag) {
  283.             [safariMenu addItem:[quitMenuItem copy]];
  284.            
  285.             break;
  286.         }
  287.         else {
  288.             if ([item action] == @selector(quitWithoutWarning:)) {
  289.                 [safariMenu removeItemAtIndex:[safariMenu indexOfItem:item]];
  290.                
  291.                 break;
  292.             }
  293.            
  294.         }
  295.     }
  296. }
  297.  
  298. @end