OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "chrome/browser/ui/cocoa/intents/web_intent_picker_view_controller.h" | 5 #import "chrome/browser/ui/cocoa/intents/web_intent_picker_view_controller.h" |
6 | 6 |
7 #include "base/sys_string_conversions.h" | 7 #include "base/sys_string_conversions.h" |
8 #import "chrome/browser/ui/cocoa/event_utils.h" | 8 #import "chrome/browser/ui/cocoa/event_utils.h" |
9 #import "chrome/browser/ui/cocoa/flipped_view.h" | 9 #import "chrome/browser/ui/cocoa/flipped_view.h" |
10 #import "chrome/browser/ui/cocoa/hover_close_button.h" | 10 #import "chrome/browser/ui/cocoa/hover_close_button.h" |
11 #import "chrome/browser/ui/cocoa/intents/web_intent_choose_service_view_controll
er.h" | 11 #import "chrome/browser/ui/cocoa/intents/web_intent_choose_service_view_controll
er.h" |
12 #import "chrome/browser/ui/cocoa/intents/web_intent_extension_prompt_view_contro
ller.h" | 12 #import "chrome/browser/ui/cocoa/intents/web_intent_extension_prompt_view_contro
ller.h" |
13 #import "chrome/browser/ui/cocoa/intents/web_intent_inline_service_view_controll
er.h" | 13 #import "chrome/browser/ui/cocoa/intents/web_intent_inline_service_view_controll
er.h" |
14 #import "chrome/browser/ui/cocoa/intents/web_intent_message_view_controller.h" | 14 #import "chrome/browser/ui/cocoa/intents/web_intent_message_view_controller.h" |
15 #import "chrome/browser/ui/cocoa/intents/web_intent_picker_cocoa2.h" | 15 #import "chrome/browser/ui/cocoa/intents/web_intent_picker_cocoa2.h" |
16 #import "chrome/browser/ui/cocoa/intents/web_intent_progress_view_controller.h" | 16 #import "chrome/browser/ui/cocoa/intents/web_intent_progress_view_controller.h" |
17 #import "chrome/browser/ui/cocoa/intents/web_intent_service_row_view_controller.
h" | 17 #import "chrome/browser/ui/cocoa/intents/web_intent_service_row_view_controller.
h" |
18 #import "chrome/browser/ui/cocoa/key_equivalent_constants.h" | 18 #import "chrome/browser/ui/cocoa/key_equivalent_constants.h" |
19 #include "chrome/browser/ui/constrained_window.h" | 19 #include "chrome/browser/ui/constrained_window.h" |
20 #include "chrome/browser/ui/constrained_window_constants.h" | 20 #include "chrome/browser/ui/constrained_window_constants.h" |
21 #include "chrome/browser/ui/intents/web_intent_picker_delegate.h" | 21 #include "chrome/browser/ui/intents/web_intent_picker_delegate.h" |
22 #include "chrome/browser/ui/intents/web_intent_inline_disposition_delegate.h" | 22 #include "chrome/browser/ui/intents/web_intent_inline_disposition_delegate.h" |
23 #include "content/public/browser/web_contents.h" | 23 #include "content/public/browser/web_contents.h" |
24 #include "grit/generated_resources.h" | 24 #include "grit/generated_resources.h" |
25 #include "ui/base/cocoa/window_size_constants.h" | 25 #include "ui/base/cocoa/window_size_constants.h" |
26 #include "ui/base/l10n/l10n_util_mac.h" | 26 #include "ui/base/l10n/l10n_util_mac.h" |
27 | 27 |
28 @interface WebIntentPickerViewController () | 28 @interface WebIntentPickerViewController () |
29 | 29 |
30 - (void)performLayout; | 30 - (void)performLayoutWithOldViewController: |
| 31 (WebIntentViewController*)oldViewController; |
31 // Gets the view controller currently being displayed. | 32 // Gets the view controller currently being displayed. |
32 - (WebIntentViewController*)currentViewController; | 33 - (WebIntentViewController*)currentViewController; |
33 - (WebIntentPickerState)newPickerState; | 34 - (WebIntentPickerState)newPickerState; |
34 | 35 |
35 // Update the various views to match changes to the picker model. | 36 // Update the various views to match changes to the picker model. |
36 - (void)updateWaiting; | 37 - (void)updateWaiting; |
37 - (void)updateNoService; | 38 - (void)updateNoService; |
38 - (void)updateChooseService; | 39 - (void)updateChooseService; |
39 - (void)updateInlineService; | 40 - (void)updateInlineService; |
40 - (void)updateInstallingExtension; | 41 - (void)updateInstallingExtension; |
(...skipping 15 matching lines...) Expand all Loading... |
56 @end | 57 @end |
57 | 58 |
58 @implementation WebIntentPickerViewController | 59 @implementation WebIntentPickerViewController |
59 | 60 |
60 - (id)initWithPicker:(WebIntentPickerCocoa2*)picker { | 61 - (id)initWithPicker:(WebIntentPickerCocoa2*)picker { |
61 if ((self = [super init])) { | 62 if ((self = [super init])) { |
62 picker_ = picker; | 63 picker_ = picker; |
63 | 64 |
64 scoped_nsobject<NSView> view( | 65 scoped_nsobject<NSView> view( |
65 [[FlippedView alloc] initWithFrame:ui::kWindowSizeDeterminedLater]); | 66 [[FlippedView alloc] initWithFrame:ui::kWindowSizeDeterminedLater]); |
| 67 [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; |
66 [self setView:view]; | 68 [self setView:view]; |
67 | 69 |
68 closeButton_.reset([[HoverCloseButton alloc] initWithFrame:NSZeroRect]); | 70 closeButton_.reset([[HoverCloseButton alloc] initWithFrame:NSZeroRect]); |
69 [closeButton_ setTarget:self]; | 71 [closeButton_ setTarget:self]; |
70 [closeButton_ setAction:@selector(onCloseButton:)]; | 72 [closeButton_ setAction:@selector(onCloseButton:)]; |
71 [[closeButton_ cell] setKeyEquivalent:kKeyEquivalentEscape]; | 73 [[closeButton_ cell] setKeyEquivalent:kKeyEquivalentEscape]; |
72 [[self view] addSubview:closeButton_]; | 74 [[self view] addSubview:closeButton_]; |
73 | 75 |
74 chooseServiceViewController_.reset( | 76 chooseServiceViewController_.reset( |
75 [[WebIntentChooseServiceViewController alloc] init]); | 77 [[WebIntentChooseServiceViewController alloc] init]); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 return extensionPromptViewController_; | 129 return extensionPromptViewController_; |
128 } | 130 } |
129 | 131 |
130 - (void)update { | 132 - (void)update { |
131 // The model may be NULL between the time the dialog is closed and this object | 133 // The model may be NULL between the time the dialog is closed and this object |
132 // is deleted. | 134 // is deleted. |
133 if (!picker_->model()) | 135 if (!picker_->model()) |
134 return; | 136 return; |
135 | 137 |
136 WebIntentPickerState newState = [self newPickerState]; | 138 WebIntentPickerState newState = [self newPickerState]; |
137 NSView* currentView = [[self currentViewController] view]; | 139 WebIntentViewController* oldViewController = [self currentViewController]; |
138 if (state_ != newState || ![currentView superview]) { | 140 if (state_ != newState || ![[oldViewController view] superview]) { |
139 [currentView removeFromSuperview]; | |
140 // Clear the inline webview. | |
141 [inlineServiceViewController_ setServiceURL:GURL::EmptyGURL()]; | |
142 [extensionPromptViewController_ clear]; | |
143 state_ = newState; | 141 state_ = newState; |
144 currentView = [[self currentViewController] view]; | 142 [[self view] addSubview:[[self currentViewController] view]]; |
145 [[self view] addSubview:currentView]; | |
146 | 143 |
147 // Ensure that the close button is topmost. | 144 // Ensure that the close button is topmost. |
148 [closeButton_ removeFromSuperview]; | 145 [closeButton_ removeFromSuperview]; |
149 [[self view] addSubview:closeButton_]; | 146 [[self view] addSubview:closeButton_]; |
150 } | 147 } |
151 | 148 |
152 switch (state_) { | 149 switch (state_) { |
153 case PICKER_STATE_WAITING: | 150 case PICKER_STATE_WAITING: |
154 [self updateWaiting]; | 151 [self updateWaiting]; |
155 break; | 152 break; |
156 case PICKER_STATE_NO_SERVICE: | 153 case PICKER_STATE_NO_SERVICE: |
157 [self updateNoService]; | 154 [self updateNoService]; |
158 break; | 155 break; |
159 case PICKER_STATE_CHOOSE_SERVICE: | 156 case PICKER_STATE_CHOOSE_SERVICE: |
160 [self updateChooseService]; | 157 [self updateChooseService]; |
161 break; | 158 break; |
162 case PICKER_STATE_INLINE_SERVICE: | 159 case PICKER_STATE_INLINE_SERVICE: |
163 [self updateInlineService]; | 160 [self updateInlineService]; |
164 break; | 161 break; |
165 case PICKER_STATE_INSTALLING_EXTENSION: | 162 case PICKER_STATE_INSTALLING_EXTENSION: |
166 [self updateInstallingExtension]; | 163 [self updateInstallingExtension]; |
167 break; | 164 break; |
168 case PICKER_STATE_EXTENSION_PROMPT: | 165 case PICKER_STATE_EXTENSION_PROMPT: |
169 [self updateExtensionPrompt]; | 166 [self updateExtensionPrompt]; |
170 break; | 167 break; |
171 } | 168 } |
172 | 169 |
173 [self performLayout]; | 170 [self performLayoutWithOldViewController:oldViewController]; |
174 } | 171 } |
175 | 172 |
176 - (void)performLayout { | 173 - (void)performLayoutWithOldViewController: |
| 174 (WebIntentViewController*)oldViewController { |
177 WebIntentViewController* viewController = [self currentViewController]; | 175 WebIntentViewController* viewController = [self currentViewController]; |
178 [viewController sizeToFitAndLayout]; | 176 [viewController sizeToFitAndLayout]; |
179 [[viewController view] setFrameOrigin:NSZeroPoint]; | 177 [[viewController view] setFrameOrigin:NSZeroPoint]; |
180 | 178 |
181 NSRect bounds = [[viewController view] bounds]; | 179 NSRect bounds = [[viewController view] bounds]; |
| 180 NSWindow* window = [[self view] window]; |
| 181 NSRect windowFrame = [window frameRectForContentRect:bounds]; |
182 | 182 |
183 NSRect closeFrame; | 183 NSRect closeFrame; |
184 closeFrame.size.width = ConstrainedWindow::GetCloseButtonSize(); | 184 closeFrame.size.width = ConstrainedWindow::GetCloseButtonSize(); |
185 closeFrame.size.height = ConstrainedWindow::GetCloseButtonSize(); | 185 closeFrame.size.height = ConstrainedWindow::GetCloseButtonSize(); |
186 closeFrame.origin.x = NSMaxX(bounds) - NSWidth(closeFrame) - | 186 closeFrame.origin.x = NSMaxX(bounds) - NSWidth(closeFrame) - |
187 ConstrainedWindowConstants::kCloseButtonPadding; | 187 ConstrainedWindowConstants::kCloseButtonPadding; |
188 closeFrame.origin.y = ConstrainedWindowConstants::kCloseButtonPadding; | 188 closeFrame.origin.y = ConstrainedWindowConstants::kCloseButtonPadding; |
189 [closeButton_ setFrame:closeFrame]; | |
190 | 189 |
191 [[self view] setFrame:bounds]; | 190 if (oldViewController) { |
| 191 scoped_nsobject<NSMutableArray> array([[NSMutableArray alloc] init]); |
| 192 if (oldViewController && ![oldViewController isEqual:viewController]) { |
| 193 [array addObject:@{ |
| 194 NSViewAnimationTargetKey: [viewController view], |
| 195 NSViewAnimationEffectKey: NSViewAnimationFadeInEffect |
| 196 }]; |
| 197 [array addObject:@{ |
| 198 NSViewAnimationTargetKey: [oldViewController view], |
| 199 NSViewAnimationEffectKey: NSViewAnimationFadeOutEffect |
| 200 }]; |
| 201 } |
| 202 [array addObject:@{ |
| 203 NSViewAnimationTargetKey: window, |
| 204 NSViewAnimationEndFrameKey: [NSValue valueWithRect:windowFrame] |
| 205 }]; |
| 206 [array addObject:@{ |
| 207 NSViewAnimationTargetKey: closeButton_, |
| 208 NSViewAnimationEndFrameKey: [NSValue valueWithRect:closeFrame] |
| 209 }]; |
192 | 210 |
193 NSWindow* window = [[self view] window]; | 211 scoped_nsobject<NSViewAnimation> animation( |
194 [window setFrame:[window frameRectForContentRect:bounds] display:YES]; | 212 [[NSViewAnimation alloc] initWithViewAnimations:array]); |
| 213 [animation setAnimationBlockingMode:NSAnimationBlocking]; |
| 214 [animation setDuration:0.2]; |
| 215 [animation startAnimation]; |
| 216 } else { |
| 217 [window setFrame:windowFrame display:YES]; |
| 218 [[self view] setFrame:bounds]; |
| 219 [closeButton_ setFrame:closeFrame]; |
| 220 } |
| 221 |
| 222 if (oldViewController && ![oldViewController isEqual:viewController]) { |
| 223 [[oldViewController view] removeFromSuperview]; |
| 224 [oldViewController viewRemovedFromSuperview]; |
| 225 } |
195 } | 226 } |
196 | 227 |
197 - (WebIntentViewController*)currentViewController { | 228 - (WebIntentViewController*)currentViewController { |
198 switch (state_) { | 229 switch (state_) { |
199 case PICKER_STATE_WAITING: | 230 case PICKER_STATE_WAITING: |
200 return progressViewController_; | 231 return progressViewController_; |
201 case PICKER_STATE_NO_SERVICE: | 232 case PICKER_STATE_NO_SERVICE: |
202 return messageViewController_; | 233 return messageViewController_; |
203 case PICKER_STATE_CHOOSE_SERVICE: | 234 case PICKER_STATE_CHOOSE_SERVICE: |
204 return chooseServiceViewController_; | 235 return chooseServiceViewController_; |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 WindowOpenDisposition disposition = | 417 WindowOpenDisposition disposition = |
387 event_utils::WindowOpenDispositionFromNSEvent([NSApp currentEvent]); | 418 event_utils::WindowOpenDispositionFromNSEvent([NSApp currentEvent]); |
388 picker_->delegate()->OnSuggestionsLinkClicked(disposition); | 419 picker_->delegate()->OnSuggestionsLinkClicked(disposition); |
389 } | 420 } |
390 | 421 |
391 - (void)onChooseAnotherService:(id)sender { | 422 - (void)onChooseAnotherService:(id)sender { |
392 picker_->delegate()->OnChooseAnotherService(); | 423 picker_->delegate()->OnChooseAnotherService(); |
393 } | 424 } |
394 | 425 |
395 @end | 426 @end |
OLD | NEW |