Index: chrome/browser/cocoa/infobar_container_controller.mm |
=================================================================== |
--- chrome/browser/cocoa/infobar_container_controller.mm (revision 30850) |
+++ chrome/browser/cocoa/infobar_container_controller.mm (working copy) |
@@ -4,6 +4,7 @@ |
#include "base/logging.h" |
#include "base/mac_util.h" |
+#import "chrome/browser/cocoa/animatable_view.h" |
#include "chrome/browser/cocoa/infobar.h" |
#import "chrome/browser/cocoa/infobar_container_controller.h" |
#import "chrome/browser/cocoa/infobar_controller.h" |
@@ -27,11 +28,13 @@ |
const NotificationDetails& details) { |
switch (type.value) { |
case NotificationType::TAB_CONTENTS_INFOBAR_ADDED: |
- [controller_ addInfoBar:Details<InfoBarDelegate>(details).ptr()]; |
+ [controller_ addInfoBar:Details<InfoBarDelegate>(details).ptr() |
+ animate:YES]; |
break; |
case NotificationType::TAB_CONTENTS_INFOBAR_REMOVED: |
[controller_ |
- removeInfoBarsForDelegate:Details<InfoBarDelegate>(details).ptr()]; |
+ closeInfoBarsForDelegate:Details<InfoBarDelegate>(details).ptr() |
+ animate:YES]; |
break; |
case NotificationType::TAB_CONTENTS_INFOBAR_REPLACED: { |
typedef std::pair<InfoBarDelegate*, InfoBarDelegate*> |
@@ -97,6 +100,16 @@ |
currentTabContents_->RemoveInfoBar(delegate); |
} |
+- (void)removeController:(InfoBarController*)controller { |
+ // This code can be executed while InfoBarController is still on the stack, so |
+ // we retain and autorelease the controller to prevent it from being |
+ // dealloc'ed too early. |
+ [[controller retain] autorelease]; |
+ [[controller view] removeFromSuperview]; |
+ [infobarControllers_ removeObject:controller]; |
+ [self positionInfoBarsAndRedraw]; |
+} |
+ |
// TabStripModelObserverBridge notifications |
- (void)selectTabWithContents:(TabContents*)newContents |
previousContents:(TabContents*)oldContents |
@@ -110,6 +123,13 @@ |
[self changeTabContents:NULL]; |
} |
+- (void)resizeView:(NSView*)view newHeight:(float)height { |
+ NSRect frame = [view frame]; |
+ frame.size.height = height; |
+ [view setFrame:frame]; |
+ [self positionInfoBarsAndRedraw]; |
+} |
+ |
@end |
@implementation InfoBarContainerController (PrivateMethods) |
@@ -131,7 +151,8 @@ |
currentTabContents_ = contents; |
if (currentTabContents_) { |
for (int i = 0; i < currentTabContents_->infobar_delegate_count(); ++i) { |
- [self addInfoBar:currentTabContents_->GetInfoBarDelegateAt(i)]; |
+ [self addInfoBar:currentTabContents_->GetInfoBarDelegateAt(i) |
+ animate:NO]; |
} |
Source<TabContents> source(currentTabContents_); |
@@ -146,37 +167,42 @@ |
[self positionInfoBarsAndRedraw]; |
} |
-- (void)addInfoBar:(InfoBarDelegate*)delegate { |
+- (void)addInfoBar:(InfoBarDelegate*)delegate animate:(BOOL)animate { |
scoped_ptr<InfoBar> infobar(delegate->CreateInfoBar()); |
InfoBarController* controller = infobar->controller(); |
[controller setContainerController:self]; |
+ [[controller animatableView] setResizeDelegate:self]; |
[[self view] addSubview:[controller view]]; |
[infobarControllers_ addObject:[controller autorelease]]; |
+ |
+ if (animate) |
+ [controller animateOpen]; |
+ else |
+ [controller open]; |
} |
-- (void)removeInfoBarsForDelegate:(InfoBarDelegate*)delegate { |
+- (void)closeInfoBarsForDelegate:(InfoBarDelegate*)delegate |
+ animate:(BOOL)animate { |
for (InfoBarController* controller in |
[NSArray arrayWithArray:infobarControllers_.get()]) { |
if ([controller delegate] == delegate) { |
- // This code can be executed while -[InfoBarController closeInfoBar] is |
- // still on the stack, so we retain and autorelease the controller to |
- // prevent it from being dealloc'ed too early. |
- [[controller retain] autorelease]; |
- [[controller view] removeFromSuperview]; |
- [infobarControllers_ removeObject:controller]; |
+ if (animate) |
+ [controller animateClosed]; |
+ else |
+ [controller close]; |
} |
} |
} |
- (void)replaceInfoBarsForDelegate:(InfoBarDelegate*)old_delegate |
with:(InfoBarDelegate*)new_delegate { |
- // TODO(rohitrao): This should avoid animation when we add it. |
- [self removeInfoBarsForDelegate:old_delegate]; |
- [self addInfoBar:new_delegate]; |
+ [self closeInfoBarsForDelegate:old_delegate animate:NO]; |
+ [self addInfoBar:new_delegate animate:NO]; |
} |
- (void)removeAllInfoBars { |
for (InfoBarController* controller in infobarControllers_.get()) { |
+ [[controller animatableView] stopAnimation]; |
[[controller view] removeFromSuperview]; |
} |
[infobarControllers_ removeAllObjects]; |
@@ -198,7 +224,6 @@ |
frame.size.width = NSWidth(containerBounds); |
frame.origin.y = minY; |
minY += frame.size.height; |
- // TODO(rohitrao, jrg): Replace with an animator. |
[view setFrame:frame]; |
} |