1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#import "chrome/browser/ui/cocoa/download/download_item_button.h" 6 7#include "base/logging.h" 8#include "base/sys_string_conversions.h" 9#import "chrome/browser/ui/cocoa/download/download_item_cell.h" 10#import "chrome/browser/ui/cocoa/download/download_item_controller.h" 11 12@implementation DownloadItemButton 13 14@synthesize download = downloadPath_; 15@synthesize controller = controller_; 16 17// Overridden from DraggableButton. 18- (void)beginDrag:(NSEvent*)event { 19 if (!downloadPath_.empty()) { 20 NSString* filename = base::SysUTF8ToNSString(downloadPath_.value()); 21 [self dragFile:filename fromRect:[self bounds] slideBack:YES event:event]; 22 } 23} 24 25// Override to show a context menu on mouse down if clicked over the context 26// menu area. 27- (void)mouseDown:(NSEvent*)event { 28 DCHECK(controller_); 29 // Override so that we can pop up a context menu on mouse down. 30 NSCell* cell = [self cell]; 31 DCHECK([cell respondsToSelector:@selector(isMouseOverButtonPart)]); 32 if ([reinterpret_cast<DownloadItemCell*>(cell) isMouseOverButtonPart]) { 33 [super mouseDown:event]; 34 } else { 35 // Hold a reference to our controller in case the download completes and we 36 // represent a file that's auto-removed (e.g. a theme). 37 scoped_nsobject<DownloadItemController> ref([controller_ retain]); 38 [cell setHighlighted:YES]; 39 [[self menu] setDelegate:self]; 40 [NSMenu popUpContextMenu:[self menu] 41 withEvent:[NSApp currentEvent] 42 forView:self]; 43 } 44} 45 46- (void)menuDidClose:(NSMenu*)menu { 47 [[self cell] setHighlighted:NO]; 48} 49 50- (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent*)event { 51 return YES; 52} 53 54@end 55