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