Confusing build fix after r171926.
[WebKit-https.git] / Tools / MiniBrowser / mac / AppDelegate.m
1 /*
2  * Copyright (C) 2010 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 "SettingsController.h"
29 #import "WK1BrowserWindowController.h"
30 #import "WK2BrowserWindowController.h"
31 #import <WebKit/WebHistory.h>
32 #import <WebKit/WebKit2.h>
33
34 enum {
35     WebKit1NewWindowTag = 1,
36     WebKit2NewWindowTag = 2
37 };
38
39 @implementation BrowserAppDelegate
40
41 - (id)init
42 {
43     self = [super init];
44     if (self) {
45         _browserWindowControllers = [[NSMutableSet alloc] init];
46     }
47
48     return self;
49 }
50
51 - (void)awakeFromNib
52 {
53     NSMenuItem *item = [[NSMenuItem alloc] init];
54     [item setSubmenu:[[SettingsController shared] menu]];
55     [[NSApp mainMenu] insertItem:[item autorelease] atIndex:[[NSApp mainMenu] indexOfItemWithTitle:@"Debug"]];
56 }
57
58 - (IBAction)newWindow:(id)sender
59 {
60     BrowserWindowController *controller = nil;
61
62     BOOL useWebKit2 = NO;
63
64     if (![sender respondsToSelector:@selector(tag)])
65         useWebKit2 = [SettingsController shared].useWebKit2ByDefault;
66     else
67         useWebKit2 = [sender tag] == WebKit2NewWindowTag;
68     
69     if (!useWebKit2)
70         controller = [[WK1BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"];
71 #if WK_API_ENABLED
72     else
73         controller = [[WK2BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"];
74 #endif
75     if (!controller)
76         return;
77
78     [[controller window] makeKeyAndOrderFront:sender];
79     [_browserWindowControllers addObject:controller];
80     
81     [controller loadURLString:[SettingsController shared].defaultURL];
82 }
83
84 - (void)browserWindowWillClose:(NSWindow *)window
85 {
86     [_browserWindowControllers removeObject:window.windowController];
87 }
88
89 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
90 {
91     WebHistory *webHistory = [[WebHistory alloc] init];
92     [WebHistory setOptionalSharedHistory:webHistory];
93     [webHistory release];
94
95     [self _updateNewWindowKeyEquivalents];
96
97     [self newWindow:self];
98 }
99
100 - (void)applicationWillTerminate:(NSNotification *)notification
101 {
102     for (BrowserWindowController* controller in _browserWindowControllers)
103         [controller applicationTerminating];
104 }
105
106 - (BrowserWindowController *)frontmostBrowserWindowController
107 {
108     for (NSWindow* window in [NSApp windows]) {
109         id delegate = [window delegate];
110
111         if (![delegate isKindOfClass:[BrowserWindowController class]])
112             continue;
113
114         BrowserWindowController *controller = (BrowserWindowController *)delegate;
115         assert([_browserWindowControllers containsObject:controller]);
116         return controller;
117     }
118
119     return nil;
120 }
121
122 - (IBAction)openDocument:(id)sender
123 {
124     BrowserWindowController *browserWindowController = [self frontmostBrowserWindowController];
125
126     if (browserWindowController) {
127         NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain];
128         [openPanel beginSheetModalForWindow:browserWindowController.window completionHandler:^(NSInteger result) {
129             if (result != NSOKButton)
130                 return;
131
132             NSURL *url = [openPanel.URLs objectAtIndex:0];
133             [browserWindowController loadURLString:[url absoluteString]];
134         }];
135         return;
136     }
137
138     NSOpenPanel *openPanel = [NSOpenPanel openPanel];
139     [openPanel beginWithCompletionHandler:^(NSInteger result) {
140         if (result != NSOKButton)
141             return;
142
143         BrowserWindowController *newBrowserWindowController = [[WK1BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"];
144         [newBrowserWindowController.window makeKeyAndOrderFront:self];
145
146         NSURL *url = [openPanel.URLs objectAtIndex:0];
147         [newBrowserWindowController loadURLString:[url absoluteString]];
148     }];
149 }
150
151 - (void)didChangeSettings
152 {
153     [self _updateNewWindowKeyEquivalents];
154
155     // Let all of the BrowserWindowControllers know that a setting changed, so they can attempt to dynamically update.
156     for (BrowserWindowController<BrowserController> *browserWindowController in _browserWindowControllers)
157         [browserWindowController didChangeSettings];
158 }
159
160 - (void)_updateNewWindowKeyEquivalents
161 {
162     if ([[SettingsController shared] useWebKit2ByDefault]) {
163         [_newWebKit1WindowItem setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask];
164         [_newWebKit2WindowItem setKeyEquivalentModifierMask:NSCommandKeyMask];
165     } else {
166         [_newWebKit1WindowItem setKeyEquivalentModifierMask:NSCommandKeyMask];
167         [_newWebKit2WindowItem setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask];
168     }
169 }
170
171 @end