1 | //
|
---|
2 | // PSPreferencesController.m
|
---|
3 | // Pester
|
---|
4 | //
|
---|
5 | // Created by Nicholas Riley on Sat Mar 29 2003.
|
---|
6 | // Copyright (c) 2003 Nicholas Riley. All rights reserved.
|
---|
7 | //
|
---|
8 |
|
---|
9 | #import "PSPreferencesController.h"
|
---|
10 | #import "PSApplication.h"
|
---|
11 | #import "NJRHotKeyField.h"
|
---|
12 | #import "NJRHotKey.h"
|
---|
13 | #import "NJRHotKeyManager.h"
|
---|
14 |
|
---|
15 | // NSUserDefaults key
|
---|
16 | static NSString * const PSSetAlarmHotKey = @"Pester set alarm system-wide keyboard shortcut";
|
---|
17 |
|
---|
18 | // NJRHotKeyManager shortcut identifier
|
---|
19 | static NSString * const PSSetAlarmHotKeyShortcut = @"PSSetAlarmHotKeyShortcut";
|
---|
20 |
|
---|
21 | @implementation PSPreferencesController
|
---|
22 |
|
---|
23 | + (void)readPreferences;
|
---|
24 | {
|
---|
25 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
---|
26 | NJRHotKeyManager *hotKeyManager = [NJRHotKeyManager sharedManager];
|
---|
27 | NJRHotKey *hotKey = [[[NJRHotKey alloc] initWithPropertyList: [defaults dictionaryForKey: PSSetAlarmHotKey]] autorelease];
|
---|
28 |
|
---|
29 | if (hotKey == nil) {
|
---|
30 | [hotKeyManager removeShortcutWithIdentifier: PSSetAlarmHotKeyShortcut];
|
---|
31 | } else {
|
---|
32 | if (![hotKeyManager addShortcutWithIdentifier: PSSetAlarmHotKeyShortcut
|
---|
33 | hotKey: hotKey
|
---|
34 | target: NSApp
|
---|
35 | action: @selector(orderFrontSetAlarmPanel:)]) {
|
---|
36 | [defaults removeObjectForKey: PSSetAlarmHotKey];
|
---|
37 | NSRunAlertPanel(NSLocalizedString(@"Can't reserve alarm key equivalent", "Hot key set failure"),
|
---|
38 | NSLocalizedString(@"Pester was unable to reserve the key equivalent %@. Please select another in Pester's Preferences, or click Clear to remove it.", "Hot key set failure"), nil, nil, nil, [hotKey keyGlyphs]);
|
---|
39 | [(PSApplication *)NSApp performSelector: @selector(orderFrontPreferencesPanel:) withObject: self afterDelay: 0.1];
|
---|
40 | }
|
---|
41 | }
|
---|
42 | }
|
---|
43 |
|
---|
44 | #pragma mark interface updating
|
---|
45 |
|
---|
46 | - (void)update;
|
---|
47 | {
|
---|
48 | // perform any interface propagation that needs to be done
|
---|
49 | }
|
---|
50 |
|
---|
51 | #pragma mark preferences I/O
|
---|
52 |
|
---|
53 | - (void)readFromPrefs;
|
---|
54 | {
|
---|
55 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
---|
56 | NJRHotKey *hotKey = [[NJRHotKey alloc] initWithPropertyList: [defaults dictionaryForKey: PSSetAlarmHotKey]];
|
---|
57 | [setAlarmHotKey setHotKey: hotKey];
|
---|
58 | [hotKey release];
|
---|
59 | }
|
---|
60 |
|
---|
61 | - (void)writeToPrefs;
|
---|
62 | {
|
---|
63 | NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
---|
64 | [defaults setObject: [[setAlarmHotKey hotKey] propertyListRepresentation] forKey: @"Pester set alarm system-wide keyboard shortcut"];
|
---|
65 | [defaults synchronize];
|
---|
66 | [[self class] readPreferences];
|
---|
67 | }
|
---|
68 |
|
---|
69 | #pragma mark initialize-release
|
---|
70 |
|
---|
71 | - (id)init {
|
---|
72 | if ( (self = [super initWithWindowNibName: @"Preferences"]) != nil) {
|
---|
73 | [[self window] center]; // connect outlets
|
---|
74 | [self readFromPrefs];
|
---|
75 | [self update];
|
---|
76 | // command
|
---|
77 | NSMutableCharacterSet *set = [[NSCharacterSet alphanumericCharacterSet] mutableCopy];
|
---|
78 | [set addCharactersInString: @"`-=[]/\\, "];
|
---|
79 | commandRejectSet = [set copy];
|
---|
80 | [set release];
|
---|
81 | // no modifiers, shift, option, option-shift
|
---|
82 | set = [[NSCharacterSet alphanumericCharacterSet] mutableCopy];
|
---|
83 | [set formUnionWithCharacterSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
---|
84 | [set formUnionWithCharacterSet: [NSCharacterSet punctuationCharacterSet]];
|
---|
85 | [set addCharactersInString: @"\r\e\x7f\x03"]; // CR, escape, delete, enter
|
---|
86 | [set addCharactersInRange: NSMakeRange(0xF700, 0x1FF)]; // reserved function key range
|
---|
87 | [set removeCharactersInRange: NSMakeRange(NSF1FunctionKey, 15)]; // F1-F15
|
---|
88 | textRejectSet = [set copy];
|
---|
89 | [set release];
|
---|
90 | // command-shift
|
---|
91 | commandShiftRejectSet = [[NSCharacterSet characterSetWithCharactersInString: @"ACFGHIPQS~? "] retain];
|
---|
92 | // command-option
|
---|
93 | commandOptionRejectSet = [[NSCharacterSet characterSetWithCharactersInString: @"DW\\-= "] retain];
|
---|
94 | }
|
---|
95 | return self;
|
---|
96 | }
|
---|
97 |
|
---|
98 | - (void)dealloc;
|
---|
99 | {
|
---|
100 | [textRejectSet release];
|
---|
101 | [commandRejectSet release];
|
---|
102 | [commandShiftRejectSet release];
|
---|
103 | [commandOptionRejectSet release];
|
---|
104 | [super dealloc];
|
---|
105 | }
|
---|
106 |
|
---|
107 | #pragma mark actions
|
---|
108 |
|
---|
109 | - (IBAction)hotKeySet:(NJRHotKeyField *)sender;
|
---|
110 | {
|
---|
111 | [self writeToPrefs];
|
---|
112 | }
|
---|
113 |
|
---|
114 | - (IBAction)showWindow:(id)sender;
|
---|
115 | {
|
---|
116 | [self readFromPrefs];
|
---|
117 | [super showWindow: sender];
|
---|
118 | }
|
---|
119 |
|
---|
120 | @end
|
---|
121 |
|
---|
122 | @implementation PSPreferencesController (NJRHotKeyFieldDelegate)
|
---|
123 |
|
---|
124 | - (BOOL)hotKeyField:(NJRHotKeyField *)hotKeyField shouldAcceptCharacter:(unichar)keyChar modifierFlags:(unsigned)modifierFlags rejectionMessage:(NSString **)message;
|
---|
125 | {
|
---|
126 | *message = nil;
|
---|
127 |
|
---|
128 | if (modifierFlags == 0 || modifierFlags == NSShiftKeyMask || modifierFlags == NSAlternateKeyMask || modifierFlags == (NSShiftKeyMask | NSAlternateKeyMask)) {
|
---|
129 | *message = modifierFlags == 0 ? @"key is reserved for typing text" :
|
---|
130 | @"key combination is reserved for typing text";
|
---|
131 | return ![textRejectSet characterIsMember: keyChar];
|
---|
132 | }
|
---|
133 | if (modifierFlags == NSCommandKeyMask) {
|
---|
134 | *message = @"key combination is reserved for application use";
|
---|
135 | return ![commandRejectSet characterIsMember: keyChar];
|
---|
136 | }
|
---|
137 | if (modifierFlags == (NSCommandKeyMask | NSShiftKeyMask)) {
|
---|
138 | *message = @"key combination is reserved for application use";
|
---|
139 | return ![commandShiftRejectSet characterIsMember: keyChar];
|
---|
140 | }
|
---|
141 | if (modifierFlags == (NSCommandKeyMask | NSAlternateKeyMask)) {
|
---|
142 | *message = @"key combination is reserved for Mac OS X use";
|
---|
143 | return ![commandOptionRejectSet characterIsMember: keyChar];
|
---|
144 | }
|
---|
145 | return YES;
|
---|
146 | }
|
---|
147 |
|
---|
148 | @end
|
---|