[WebEditingTester] Hook up key equivalents for new window action
[WebKit-https.git] / Tools / WebEditingTester / AppDelegate.m
1 /*
2  * Copyright (C) 2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "AppDelegate.h"
27
28 #import "EditingOperations.h"
29 #import "WK1WebDocumentController.h"
30 #import "WK2WebDocumentController.h"
31
32 static NSString * const UseWebKit2ByDefaultPreferenceKey = @"UseWebKit2ByDefault";
33
34 @implementation WebEditingAppDelegate
35 - (id)init
36 {
37     self = [super init];
38     if (self)
39         _webDocuments = [[NSMutableSet alloc] init];
40     
41     return self;
42 }
43
44 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
45 {
46     [self newEditor:self];
47     [self _updateNewWindowKeyEquivalents];
48 }
49
50 - (IBAction)newEditor:(id)sender
51 {
52     Class controllerClass;
53
54     if (sender == self)
55         controllerClass = self._defaultWebDocumentControllerClass;
56     else if (sender == _newWK2EditorItem)
57         controllerClass = [WK2WebDocumentController class];
58     else if (sender == _newWK1EditorItem)
59         controllerClass = [WK1WebDocumentController class];
60     
61     WebDocumentController *controller = [[controllerClass alloc] init];
62     [[controller window] makeKeyAndOrderFront:sender];
63     [_webDocuments addObject:controller];
64     [controller loadHTMLString:[WebDocumentController defaultEditingSource]];
65 }
66
67 - (IBAction)showOperations:(id)sender
68 {
69     static BOOL initialized = NO;
70
71     if (!initialized) {
72         NSFont *font = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSMiniControlSize]];
73         NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
74         NSArray *operations = editingOperations();
75         
76         float maxWidth = 0;
77         for (NSString *operationName in operations)
78             maxWidth = MAX(maxWidth, [operationName sizeWithAttributes:attributes].width);
79
80         maxWidth += 24;
81         
82         unsigned long columnHeight = (operations.count + 2) / 3;
83         
84         NSView *superview = [_operationsPanel contentView];
85         
86         [_operationsPanel setContentSize:NSMakeSize(3 * maxWidth, columnHeight * 16 + 1)];
87         
88         float firstY = NSMaxY([superview frame]) - 1;
89         float y = firstY;
90         float x = 0;
91         for (NSString *operationName in operations) {
92             y -= 16;
93             if (y < 0) {
94                 y = firstY - 16;
95                 x += maxWidth;
96             }
97             NSButton *button = [[NSButton alloc] initWithFrame:NSMakeRect(x, y, maxWidth, 16)];
98             [button setBezelStyle:NSRoundedBezelStyle];
99             [button.cell setControlSize:NSMiniControlSize];
100             [button setFont:font];
101             [button setTitle:operationName];
102             [button setAction:NSSelectorFromString(operationName)];
103             [superview addSubview:button];
104         }
105         
106         [_operationsPanel center];
107         [_operationsPanel setFloatingPanel:YES];
108         [_operationsPanel setBecomesKeyOnlyIfNeeded:YES];
109         initialized = YES;
110     }
111
112     [_operationsPanel orderFront:nil];
113 }
114
115 - (Class)_defaultWebDocumentControllerClass
116 {
117     return self.useWebKit2ByDefault ? [WK2WebDocumentController class] : [WK1WebDocumentController class];
118 }
119
120 - (BOOL)useWebKit2ByDefault
121 {
122     return [[NSUserDefaults standardUserDefaults] boolForKey:UseWebKit2ByDefaultPreferenceKey];
123 }
124
125 - (IBAction)toggleUseWK2ByDefault:(id)sender
126 {
127     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
128     [defaults setBool:![defaults boolForKey:UseWebKit2ByDefaultPreferenceKey] forKey:UseWebKit2ByDefaultPreferenceKey];
129     [self _updateNewWindowKeyEquivalents];
130 }
131
132 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
133 {
134     SEL action = [menuItem action];
135     
136     if (action == @selector(toggleUseWK2ByDefault:))
137         [menuItem setState:[self useWebKit2ByDefault] ? NSOnState : NSOffState];
138     
139     return YES;
140 }
141
142 - (void)_updateNewWindowKeyEquivalents
143 {
144     if (self.useWebKit2ByDefault) {
145         [_newWK1EditorItem setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask];
146         [_newWK2EditorItem setKeyEquivalentModifierMask:NSCommandKeyMask];
147     } else {
148         [_newWK1EditorItem setKeyEquivalentModifierMask:NSCommandKeyMask];
149         [_newWK2EditorItem setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask];
150     }
151 }
152
153 @end