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