Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(942)

Side by Side Diff: chrome/browser/cocoa/infobar_controller.mm

Issue 354008: [Mac] Enables animations for the infobar.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 <Cocoa/Cocoa.h> 5 #import <Cocoa/Cocoa.h>
6 6
7 #include "base/logging.h" // for NOTREACHED() 7 #include "base/logging.h" // for NOTREACHED()
8 #include "base/mac_util.h" 8 #include "base/mac_util.h"
9 #include "base/sys_string_conversions.h" 9 #include "base/sys_string_conversions.h"
10 #import "chrome/browser/cocoa/animatable_view.h"
10 #include "chrome/browser/cocoa/event_utils.h" 11 #include "chrome/browser/cocoa/event_utils.h"
11 #include "chrome/browser/cocoa/infobar.h" 12 #include "chrome/browser/cocoa/infobar.h"
12 #import "chrome/browser/cocoa/infobar_container_controller.h" 13 #import "chrome/browser/cocoa/infobar_container_controller.h"
13 #import "chrome/browser/cocoa/infobar_controller.h" 14 #import "chrome/browser/cocoa/infobar_controller.h"
14 #include "chrome/browser/tab_contents/tab_contents.h" 15 #include "chrome/browser/tab_contents/tab_contents.h"
15 #include "skia/ext/skia_utils_mac.h" 16 #include "skia/ext/skia_utils_mac.h"
16 #include "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" 17 #include "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h"
17 #include "webkit/glue/window_open_disposition.h" 18 #include "webkit/glue/window_open_disposition.h"
18 19
20 namespace {
21 // Durations set to match the default SlideAnimation duration.
22 const float kAnimateOpenDuration = 0.12;
23 const float kAnimateCloseDuration = 0.12;
24 }
19 25
20 @interface InfoBarController (PrivateMethods) 26 @interface InfoBarController (PrivateMethods)
21 // Closes the infobar by calling RemoveDelegate on the container. 27 // Asks the container controller to remove the infobar for this delegate. This
22 // This will remove the infobar from its associated TabContents as 28 // call will trigger a notification that starts the infobar animating closed.
23 // well as trigger the deletion of this InfoBarController. Once the 29 - (void)removeInfoBar;
24 // delegate is removed from the container, it is no longer needed, so 30
25 // we ask it to delete itself. 31 // Performs final cleanup after an animation is finished or stopped, including
26 - (void)closeInfoBar; 32 // notifying the InfoBarDelegate that the infobar was closed and removing the
33 // infobar from its container, if necessary.
34 - (void)cleanUpAfterAnimation:(BOOL)finished;
35
27 // Removes the ok and cancel buttons, and resizes the textfield to use the 36 // Removes the ok and cancel buttons, and resizes the textfield to use the
28 // space. 37 // space.
29 - (void)removeButtons; 38 - (void)removeButtons;
30 @end 39 @end
31 40
32 @implementation InfoBarController 41 @implementation InfoBarController
33 42
34 @synthesize containerController = containerController_; 43 @synthesize containerController = containerController_;
35 @synthesize delegate = delegate_; 44 @synthesize delegate = delegate_;
36 45
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 } 78 }
70 79
71 // Called when someone clicks on the cancel button. 80 // Called when someone clicks on the cancel button.
72 - (void)cancel:(id)sender { 81 - (void)cancel:(id)sender {
73 // Subclasses must override this method if they do not hide the cancel button. 82 // Subclasses must override this method if they do not hide the cancel button.
74 NOTREACHED(); 83 NOTREACHED();
75 } 84 }
76 85
77 // Called when someone clicks on the close button. 86 // Called when someone clicks on the close button.
78 - (void)dismiss:(id)sender { 87 - (void)dismiss:(id)sender {
79 [self closeInfoBar]; 88 [self removeInfoBar];
89 }
90
91 - (AnimatableView*)animatableView {
92 return static_cast<AnimatableView*>([self view]);
93 }
94
95 - (void)open {
96 // Simply reset the frame size to its opened size, forcing a relayout.
97 CGFloat finalHeight = [[self view] frame].size.height;
98 [[self animatableView] setHeight:finalHeight];
99 }
100
101 - (void)animateOpen {
102 // Force the frame size to be 0 and then start an animation.
103 NSRect frame = [[self view] frame];
104 CGFloat finalHeight = frame.size.height;
105 frame.size.height = 0;
106 [[self view] setFrame:frame];
107 [[self animatableView] animateToNewHeight:finalHeight
108 duration:kAnimateOpenDuration];
109 }
110
111 - (void)close {
112 infoBarClosing_ = YES;
113 [self cleanUpAfterAnimation:YES];
114 }
115
116 - (void)animateClosed {
117 // Start animating closed. We will receive a notification when the animation
118 // is done, at which point we can remove our view from the hierarchy and
119 // notify the delegate that the infobar was closed.
120 [[self animatableView] animateToNewHeight:0 duration:kAnimateCloseDuration];
121
122 // The above call may trigger an animationDidStop: notification for any
123 // currently-running animations, so do not set |infoBarClosing_| until after
124 // starting the animation.
125 infoBarClosing_ = YES;
80 } 126 }
81 127
82 - (void)addAdditionalControls { 128 - (void)addAdditionalControls {
83 // Default implementation does nothing. 129 // Default implementation does nothing.
84 } 130 }
85 131
86 @end 132 @end
87 133
88 @implementation InfoBarController (PrivateMethods) 134 @implementation InfoBarController (PrivateMethods)
89 135
90 - (void)closeInfoBar { 136 - (void)removeInfoBar {
91 // Calling RemoveDelegate() triggers notifications which will remove
92 // the infobar view from the infobar container. At that point it is
93 // safe to ask the delegate to delete itself.
94 DCHECK(delegate_); 137 DCHECK(delegate_);
95 [containerController_ removeDelegate:delegate_]; 138 [containerController_ removeDelegate:delegate_];
96 delegate_->InfoBarClosed();
97 delegate_ = NULL;
98 } 139 }
99 140
100 - (void)removeButtons { 141 - (void)removeButtons {
101 // Extend the label all the way across. 142 // Extend the label all the way across.
102 // Remove the ok and cancel buttons, since they are not needed. 143 // Remove the ok and cancel buttons, since they are not needed.
103 NSRect labelFrame = [label_ frame]; 144 NSRect labelFrame = [label_ frame];
104 labelFrame.size.width = NSMaxX([cancelButton_ frame]) - NSMinX(labelFrame); 145 labelFrame.size.width = NSMaxX([cancelButton_ frame]) - NSMinX(labelFrame);
105 [okButton_ removeFromSuperview]; 146 [okButton_ removeFromSuperview];
106 [cancelButton_ removeFromSuperview]; 147 [cancelButton_ removeFromSuperview];
107 [label_ setFrame:labelFrame]; 148 [label_ setFrame:labelFrame];
108 } 149 }
109 150
151 - (void)cleanUpAfterAnimation:(BOOL)finished {
152 // Don't need to do any cleanup if the bar was animating open.
153 if (!infoBarClosing_)
154 return;
155
156 // Notify the delegate that the infobar was closed. The delegate may delete
157 // itself as a result of InfoBarClosed(), so we null out its pointer.
158 delegate_->InfoBarClosed();
159 delegate_ = NULL;
160
161 // If the animation ran to completion, then we need to remove ourselves from
162 // the container. If the animation was interrupted, then the container will
163 // take care of removing us.
164 // TODO(rohitrao): UGH! This works for now, but should be cleaner.
165 if (finished)
166 [containerController_ removeController:self];
167 }
168
169 - (void)animationDidStop:(NSAnimation*)animation {
170 [self cleanUpAfterAnimation:NO];
171 }
172
173 - (void)animationDidEnd:(NSAnimation*)animation {
174 [self cleanUpAfterAnimation:YES];
175 }
176
110 @end 177 @end
111 178
112 179
113 ///////////////////////////////////////////////////////////////////////// 180 /////////////////////////////////////////////////////////////////////////
114 // AlertInfoBarController implementation 181 // AlertInfoBarController implementation
115 182
116 @implementation AlertInfoBarController 183 @implementation AlertInfoBarController
117 184
118 // Alert infobars have a text message. 185 // Alert infobars have a text message.
119 - (void)addAdditionalControls { 186 - (void)addAdditionalControls {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 [label_ setAttributedStringValue:infoText]; 263 [label_ setAttributedStringValue:infoText];
197 } 264 }
198 265
199 // Called when someone clicks on the link in the infobar. This method 266 // Called when someone clicks on the link in the infobar. This method
200 // is called by the InfobarTextField on its delegate (the 267 // is called by the InfobarTextField on its delegate (the
201 // LinkInfoBarController). 268 // LinkInfoBarController).
202 - (void)linkClicked { 269 - (void)linkClicked {
203 WindowOpenDisposition disposition = 270 WindowOpenDisposition disposition =
204 event_utils::WindowOpenDispositionFromNSEvent([NSApp currentEvent]); 271 event_utils::WindowOpenDispositionFromNSEvent([NSApp currentEvent]);
205 if (delegate_->AsLinkInfoBarDelegate()->LinkClicked(disposition)) 272 if (delegate_->AsLinkInfoBarDelegate()->LinkClicked(disposition))
206 [self closeInfoBar]; 273 [self removeInfoBar];
207 } 274 }
208 275
209 @end 276 @end
210 277
211 278
212 ///////////////////////////////////////////////////////////////////////// 279 /////////////////////////////////////////////////////////////////////////
213 // ConfirmInfoBarController implementation 280 // ConfirmInfoBarController implementation
214 281
215 @implementation ConfirmInfoBarController 282 @implementation ConfirmInfoBarController
216 283
217 // Called when someone clicks on the "OK" button. 284 // Called when someone clicks on the "OK" button.
218 - (IBAction)ok:(id)sender { 285 - (IBAction)ok:(id)sender {
219 if (delegate_->AsConfirmInfoBarDelegate()->Accept()) 286 if (delegate_->AsConfirmInfoBarDelegate()->Accept())
220 [self closeInfoBar]; 287 [self removeInfoBar];
221 } 288 }
222 289
223 // Called when someone clicks on the "Cancel" button. 290 // Called when someone clicks on the "Cancel" button.
224 - (IBAction)cancel:(id)sender { 291 - (IBAction)cancel:(id)sender {
225 if (delegate_->AsConfirmInfoBarDelegate()->Cancel()) 292 if (delegate_->AsConfirmInfoBarDelegate()->Cancel())
226 [self closeInfoBar]; 293 [self removeInfoBar];
227 } 294 }
228 295
229 // Confirm infobars can have OK and/or cancel buttons, depending on 296 // Confirm infobars can have OK and/or cancel buttons, depending on
230 // the return value of GetButtons(). We create each button if 297 // the return value of GetButtons(). We create each button if
231 // required and position them to the left of the close button. 298 // required and position them to the left of the close button.
232 - (void)addAdditionalControls { 299 - (void)addAdditionalControls {
233 ConfirmInfoBarDelegate* delegate = delegate_->AsConfirmInfoBarDelegate(); 300 ConfirmInfoBarDelegate* delegate = delegate_->AsConfirmInfoBarDelegate();
234 int visibleButtons = delegate->GetButtons(); 301 int visibleButtons = delegate->GetButtons();
235 302
236 NSRect okButtonFrame = [okButton_ frame]; 303 NSRect okButtonFrame = [okButton_ frame];
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 LinkInfoBarController* controller = 384 LinkInfoBarController* controller =
318 [[LinkInfoBarController alloc] initWithDelegate:this]; 385 [[LinkInfoBarController alloc] initWithDelegate:this];
319 return new InfoBar(controller); 386 return new InfoBar(controller);
320 } 387 }
321 388
322 InfoBar* ConfirmInfoBarDelegate::CreateInfoBar() { 389 InfoBar* ConfirmInfoBarDelegate::CreateInfoBar() {
323 ConfirmInfoBarController* controller = 390 ConfirmInfoBarController* controller =
324 [[ConfirmInfoBarController alloc] initWithDelegate:this]; 391 [[ConfirmInfoBarController alloc] initWithDelegate:this];
325 return new InfoBar(controller); 392 return new InfoBar(controller);
326 } 393 }
OLDNEW
« no previous file with comments | « chrome/browser/cocoa/infobar_controller.h ('k') | chrome/browser/cocoa/infobar_controller_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698