source: trunk/Cocoa/Pester/Source/PSPreferencesController.m@ 131

Last change on this file since 131 was 131, checked in by Nicholas Riley, 21 years ago

PSPreferencesController.[hm]: Added support for registering hot keys;
not the most elegant thing in the world, but much better than it was
in the prototype. Triggered by +readPreferences.

NJRHotKeyField.[hm]: Replaced model components (wow, was that ever
dumb) by NJRHotKey reference, eliminating cumbersome archiving model.
Added accessors for hot key.

NJRHotKeyManager.[hm]: Ported Quentin Carnicelli's HotKeyCenter code
to use NJRHotKey, cleaned up, and removed reverse-engineered pre-10.2
support.

NJRHotKey.[hm]: New. Provides Cocoa-centric storage for
three-component hot keys, mapping from Cocoa to Carbon modifiers.

PSApplication.m: Reorganized. Added invocation of
+[PSPreferencesController readPreferences].

Fixes bug 29.

File size: 5.4 KB
Line 
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
16static NSString * const PSSetAlarmHotKey = @"Pester set alarm system-wide keyboard shortcut";
17
18// NJRHotKeyManager shortcut identifier
19static 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 NSRunAlertPanel(NSLocalizedString(@"Can't reserve alarm key equivalent", "Hot key set failure"),
37 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]);
38 [defaults removeObjectForKey: PSSetAlarmHotKey];
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: @"\t\r\e\x7f\x03\x19"]; // tab, CR, escape, delete, enter, backtab
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}
105
106#pragma mark actions
107
108- (IBAction)hotKeySet:(NJRHotKeyField *)sender;
109{
110 [self writeToPrefs];
111}
112
113@end
114
115@implementation PSPreferencesController (NJRHotKeyFieldDelegate)
116
117- (BOOL)hotKeyField:(NJRHotKeyField *)hotKeyField shouldAcceptCharacter:(unichar)keyChar modifierFlags:(unsigned)modifierFlags rejectionMessage:(NSString **)message;
118{
119 *message = nil;
120
121 if (modifierFlags == 0 || modifierFlags == NSShiftKeyMask || modifierFlags == NSAlternateKeyMask || modifierFlags == (NSShiftKeyMask | NSAlternateKeyMask)) {
122 *message = modifierFlags == 0 ? @"key is reserved for typing text" :
123 @"key combination is reserved for typing text";
124 return ![textRejectSet characterIsMember: keyChar];
125 }
126 if (modifierFlags == NSCommandKeyMask) {
127 *message = @"key combination is reserved for application use";
128 return ![commandRejectSet characterIsMember: keyChar];
129 }
130 if (modifierFlags == (NSCommandKeyMask | NSShiftKeyMask)) {
131 *message = @"key combination is reserved for application use";
132 return ![commandShiftRejectSet characterIsMember: keyChar];
133 }
134 if (modifierFlags == (NSCommandKeyMask | NSAlternateKeyMask)) {
135 *message = @"key combination is reserved for Mac OS X use";
136 return ![commandOptionRejectSet characterIsMember: keyChar];
137 }
138 return YES;
139}
140
141@end
Note: See TracBrowser for help on using the repository browser.