Fix some stray tabs and style violations.
[enjoyable.git] / EnjoyableApplicationDelegate.m
1 //
2 // EnjoyableApplicationDelegate.m
3 // Enjoy
4 //
5 // Created by Sam McCall on 4/05/09.
6 //
7
8 #import "EnjoyableApplicationDelegate.h"
9
10 #import "NJMapping.h"
11 #import "NJMappingsController.h"
12 #import "NJDeviceController.h"
13 #import "NJOutputController.h"
14 #import "NJEvents.h"
15
16 @implementation EnjoyableApplicationDelegate
17
18 - (void)didSwitchApplication:(NSNotification *)note {
19 NSRunningApplication *activeApp = note.userInfo[NSWorkspaceApplicationKey];
20 NSString *name = activeApp.localizedName;
21 if (!name)
22 name = activeApp.bundleIdentifier;
23 if (name && ![name isEqualToString:NSRunningApplication.currentApplication.localizedName])
24 [self.mappingsController activateMappingForProcess:name];
25 }
26
27 - (void)applicationDidFinishLaunching:(NSNotification *)notification {
28 [NSNotificationCenter.defaultCenter
29 addObserver:self
30 selector:@selector(mappingDidChange:)
31 name:NJEventMappingChanged
32 object:nil];
33 [NSNotificationCenter.defaultCenter
34 addObserver:self
35 selector:@selector(mappingListDidChange:)
36 name:NJEventMappingListChanged
37 object:nil];
38 [NSNotificationCenter.defaultCenter
39 addObserver:self
40 selector:@selector(eventTranslationActivated:)
41 name:NJEventTranslationActivated
42 object:nil];
43 [NSNotificationCenter.defaultCenter
44 addObserver:self
45 selector:@selector(eventTranslationDeactivated:)
46 name:NJEventTranslationDeactivated
47 object:nil];
48
49 [self.inputController setup];
50 [self.mappingsController load];
51 }
52
53 - (void)applicationDidBecomeActive:(NSNotification *)notification {
54 [window makeKeyAndOrderFront:nil];
55 }
56
57 - (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication
58 hasVisibleWindows:(BOOL)flag {
59 [window makeKeyAndOrderFront:nil];
60 return NO;
61 }
62
63 - (void)eventTranslationActivated:(NSNotification *)note {
64 [NSProcessInfo.processInfo disableAutomaticTermination:@"Input translation is active."];
65 [NSWorkspace.sharedWorkspace.notificationCenter
66 addObserver:self
67 selector:@selector(didSwitchApplication:)
68 name:NSWorkspaceDidActivateApplicationNotification
69 object:nil];
70 NSLog(@"Listening for application changes.");
71 }
72
73 - (void)eventTranslationDeactivated:(NSNotification *)note {
74 [NSProcessInfo.processInfo enableAutomaticTermination:@"Input translation is active."];
75 [NSWorkspace.sharedWorkspace.notificationCenter
76 removeObserver:self
77 name:NSWorkspaceDidActivateApplicationNotification
78 object:nil];
79 NSLog(@"Ignoring application changes.");
80 }
81
82 - (void)mappingListDidChange:(NSNotification *)note {
83 NSArray *mappings = note.object;
84 while (dockMenuBase.lastItem.representedObject)
85 [dockMenuBase removeLastItem];
86 int added = 0;
87 for (NJMapping *mapping in mappings) {
88 NSString *keyEquiv = ++added < 10 ? @(added).stringValue : @"";
89 NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:mapping.name
90 action:@selector(chooseMapping:)
91 keyEquivalent:keyEquiv];
92 item.representedObject = mapping;
93 item.state = mapping == self.mappingsController.currentMapping;
94 [dockMenuBase addItem:item];
95 }
96 }
97
98 - (void)mappingDidChange:(NSNotification *)note {
99 NJMapping *current = note.object;
100 for (NSMenuItem *item in dockMenuBase.itemArray)
101 if (item.representedObject)
102 item.state = item.representedObject == current;
103 }
104
105 - (void)chooseMapping:(NSMenuItem *)sender {
106 NJMapping *chosen = sender.representedObject;
107 [self.mappingsController activateMapping:chosen];
108 }
109
110 #define OUTPUT_PANE_MIN_WIDTH 390
111
112 - (CGFloat)splitView:(NSSplitView *)sender constrainMaxCoordinate:(CGFloat)proposedMax ofSubviewAt:(NSInteger)offset {
113 return proposedMax - OUTPUT_PANE_MIN_WIDTH;
114 }
115
116 - (void)splitView:(NSSplitView *)splitView resizeSubviewsWithOldSize:(NSSize)oldSize {
117 NSView *inputView = splitView.subviews[0];
118 NSView *outputView = splitView.subviews[1];
119 if (outputView.frame.size.width < OUTPUT_PANE_MIN_WIDTH) {
120 NSSize frameSize = splitView.frame.size;
121 CGFloat inputWidth = frameSize.width - OUTPUT_PANE_MIN_WIDTH - splitView.dividerThickness;
122 inputView.frame = NSMakeRect(inputWidth, frameSize.height,
123 inputView.frame.size.width,
124 inputView.frame.size.height);
125 outputView.frame = NSMakeRect(inputWidth + splitView.dividerThickness,
126 0,
127 OUTPUT_PANE_MIN_WIDTH,
128 frameSize.height);
129 } else
130 [splitView adjustSubviews];
131 }
132
133 - (NSMenu *)applicationDockMenu:(NSApplication *)sender {
134 NSMenu *menu = [[NSMenu alloc] init];
135 int added = 0;
136 for (NJMapping *mapping in self.mappingsController) {
137 NSString *keyEquiv = ++added < 10 ? @(added).stringValue : @"";
138 NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:mapping.name
139 action:@selector(chooseMapping:)
140 keyEquivalent:keyEquiv];
141 item.representedObject = mapping;
142 item.state = mapping == self.mappingsController.currentMapping;
143 [menu addItem:item];
144 }
145 return menu;
146 }
147
148 - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename {
149 NSURL *url = [NSURL fileURLWithPath:filename];
150 [self.mappingsController addMappingWithContentsOfURL:url];
151 return YES;
152 }
153
154
155 @end