item_drag_controller.mm revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#import "ui/app_list/cocoa/item_drag_controller.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#import "ui/app_list/cocoa/apps_grid_view_item.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/cocoa/window_size_constants.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Scale to transform the grid cell when a drag starts. Note that 1.5 ensures 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// that integers are used for the layer bounds when the grid cell dimensions 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// are even. 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const CGFloat kDraggingIconScale = 1.5; 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const NSTimeInterval kAnimationDuration = 0.2; 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NSString* const kGrowAnimationKey = @"growAnimation"; 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)@interface ItemDragController () 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)animateTransformFrom:(CATransform3D)fromValue 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) useDelegate:(BOOL)useDelegate; 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)clearAnimations; 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)@end 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)@implementation ItemDragController 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (id)initWithGridCellSize:(NSSize)size { 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if ((self = [super init])) { 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSRect frameRect = NSMakeRect(0, 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size.width * kDraggingIconScale, 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size.height * kDraggingIconScale); 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSView> dragView( 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch [[NSView alloc] initWithFrame:frameRect]); 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [dragView setWantsLayer:YES]; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [dragView setHidden:YES]; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dragLayer_.reset([[CALayer layer] retain]); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [dragLayer_ setFrame:NSRectToCGRect(frameRect)]; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [[dragView layer] addSublayer:dragLayer_]; 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [self setView:dragView]; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return self; 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)initiate:(AppsGridViewItem*)item 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mouseDownLocation:(NSPoint)mouseDownLocation 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) currentLocation:(NSPoint)currentLocation 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timestamp:(NSTimeInterval)eventTimestamp { 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [self clearAnimations]; 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSView* itemView = [item view]; 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSPoint pointInGridCell = [itemView convertPoint:mouseDownLocation 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fromView:nil]; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mouseOffset_ = NSMakePoint(pointInGridCell.x - NSMidX([itemView bounds]), 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSMidY([itemView bounds]) - pointInGridCell.y); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NSBitmapImageRep* imageRep = [item dragRepresentationForRestore:NO]; 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [dragLayer_ setContents:reinterpret_cast<id>([imageRep CGImage])]; 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [dragLayer_ setTransform:CATransform3DIdentity]; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Add a grow animation to the layer. 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CATransform3D growFrom = CATransform3DScale(CATransform3DIdentity, 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1.0 / kDraggingIconScale, 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1.0 / kDraggingIconScale, 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1.0); 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [self animateTransformFrom:growFrom 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) useDelegate:NO]; 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) growStart_ = eventTimestamp; 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [[self view] setHidden:NO]; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)update:(NSPoint)currentLocation 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) timestamp:(NSTimeInterval)eventTimestamp { 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSPoint pointInSuperview = [[[self view] superview] 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) convertPoint:currentLocation 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fromView:nil]; 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSRect rect = [[self view] bounds]; 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSPoint anchor = NSMakePoint(NSMidX(rect), NSMidY(rect)); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the grow animation is still in progress, make the point of the image 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that was clicked appear stuck to the mouse cursor. 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CGFloat progress = (eventTimestamp - growStart_) / kAnimationDuration; 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CGFloat currentIconScale = progress < 1.0 ? 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1.0 + (kDraggingIconScale - 1.0) * progress : 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kDraggingIconScale; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pointInSuperview.x -= (mouseOffset_.x * currentIconScale + anchor.x); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pointInSuperview.y -= (mouseOffset_.y * currentIconScale + anchor.y); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [[self view] setFrameOrigin:pointInSuperview]; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)complete:(AppsGridViewItem*)item 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) targetOrigin:(NSPoint)targetOrigin { 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [self clearAnimations]; 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSView* itemView = [item view]; 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NSBitmapImageRep* imageRep = [item dragRepresentationForRestore:YES]; 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [dragLayer_ setContents:reinterpret_cast<id>([imageRep CGImage])]; 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [dragLayer_ setTransform:CATransform3DScale(CATransform3DIdentity, 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1.0 / kDraggingIconScale, 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1.0 / kDraggingIconScale, 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1.0)]; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Retain the button so it can be unhidden when the animation completes. Note 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // that the |item| and corresponding button can differ from the |item| passed 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to initiate(), if it moved to a new page during the drag. At this point the 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // destination page is known, so retain the button. 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch buttonToRestore_.reset([[item button] retain]); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Add the shrink animation for the layer. 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [self animateTransformFrom:CATransform3DIdentity 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) useDelegate:YES]; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shrinking_ = YES; 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Also animate the translation, on the view. 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(tapted): This should be merged into the scale transform, instead of 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // using a separate NSViewAnimation. 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSRect startRect = [[self view] frame]; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The final position needs to be adjusted since it shrinks from each side. 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSRect targetRect = NSMakeRect( 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) targetOrigin.x - NSMidX([itemView bounds]) * (kDraggingIconScale - 1), 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) targetOrigin.y - NSMidY([itemView bounds]) * (kDraggingIconScale - 1), 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) startRect.size.width, 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) startRect.size.height); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSDictionary* animationDict = @{ 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSViewAnimationTargetKey: [self view], 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSViewAnimationStartFrameKey: [NSValue valueWithRect:startRect], 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NSViewAnimationEndFrameKey: [NSValue valueWithRect:targetRect] 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSViewAnimation> translate([[NSViewAnimation alloc] 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initWithViewAnimations:[NSArray arrayWithObject:animationDict]]); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [translate setDuration:kAnimationDuration]; 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [translate startAnimation]; 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)animateTransformFrom:(CATransform3D)fromValue 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) useDelegate:(BOOL)useDelegate { 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CABasicAnimation* animation = 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [CABasicAnimation animationWithKeyPath:@"transform"]; 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [animation setFromValue:[NSValue valueWithCATransform3D:fromValue]]; 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (useDelegate) 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [animation setDelegate:self]; 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [animation setDuration:kAnimationDuration]; 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [CATransaction begin]; 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [CATransaction setValue:[NSNumber numberWithFloat:kAnimationDuration] 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) forKey:kCATransactionAnimationDuration]; 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [dragLayer_ addAnimation:animation 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) forKey:@"transform"]; 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [CATransaction commit]; 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)clearAnimations { 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [dragLayer_ removeAllAnimations]; 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!shrinking_) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(buttonToRestore_); 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [buttonToRestore_ setHidden:NO]; 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buttonToRestore_.reset(); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shrinking_ = NO; 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)animationDidStop:(CAAnimation*)anim 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) finished:(BOOL)finished { 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!finished) 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(shrinking_); 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [self clearAnimations]; 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [dragLayer_ setContents:nil]; 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) [[self view] setHidden:YES]; 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)@end 189