Index: chrome/browser/cocoa/autocomplete_text_field_cell.mm |
diff --git a/chrome/browser/cocoa/autocomplete_text_field_cell.mm b/chrome/browser/cocoa/autocomplete_text_field_cell.mm |
index b287bf4b677bb903732a376b40dd19ad5af91aa9..af324907d5678e424f86f817eec33c8ae4229f68 100644 |
--- a/chrome/browser/cocoa/autocomplete_text_field_cell.mm |
+++ b/chrome/browser/cocoa/autocomplete_text_field_cell.mm |
@@ -54,6 +54,10 @@ const CGFloat kEditorHorizontalInset = 3.0; |
const CGFloat kLocationIconXOffset = 9.0; |
const CGFloat kLocationIconXPad = 5.0; |
+// How long to wait for mouse-up on the location icon before assuming |
+// that the user wants to drag. |
+const NSTimeInterval kLocationIconDragTimeout = 0.25; |
+ |
// Conveniences to centralize width+offset calculations. |
CGFloat WidthForHint(NSAttributedString* hintString) { |
return kHintXOffset + ceil([hintString size].width); |
@@ -588,14 +592,54 @@ NSAttributedString* AttributedStringForImage(NSImage* anImage, |
- (BOOL)mouseDown:(NSEvent*)theEvent |
inRect:(NSRect)cellFrame |
ofView:(AutocompleteTextField*)controlView { |
- AutocompleteTextFieldIcon* |
- icon = [self iconForEvent:theEvent inRect:cellFrame ofView:controlView]; |
- if (icon) { |
- [icon view]->OnMousePressed([icon rect]); |
- return YES; |
+ AutocompleteTextFieldIcon* icon = |
+ [self iconForEvent:theEvent inRect:cellFrame ofView:controlView]; |
+ if (!icon) |
+ return NO; |
+ |
+ // If the icon is draggable, then initiate a drag if the user drags |
+ // or holds the mouse down for awhile. |
+ if ([icon view]->IsDraggable()) { |
+ NSDate* timeout = |
+ [NSDate dateWithTimeIntervalSinceNow:kLocationIconDragTimeout]; |
+ NSEvent* event = [NSApp nextEventMatchingMask:(NSLeftMouseDraggedMask | |
+ NSLeftMouseUpMask) |
+ untilDate:timeout |
+ inMode:NSEventTrackingRunLoopMode |
+ dequeue:YES]; |
+ if (!event || [event type] == NSLeftMouseDragged) { |
+ NSPasteboard* pboard = [icon view]->GetDragPasteboard(); |
+ DCHECK(pboard); |
+ |
+ // TODO(shess): My understanding is that the -isFlipped |
+ // adjustment should not be necessary. But without it, the |
+ // image is nowhere near the cursor. Perhaps the icon's rect is |
+ // incorrectly calculated? |
+ // http://crbug.com/40711 |
+ NSPoint dragPoint = [icon rect].origin; |
+ if ([controlView isFlipped]) |
+ dragPoint.y += NSHeight([icon rect]); |
+ |
+ [controlView dragImage:[icon view]->GetImage() |
+ at:dragPoint |
+ offset:NSZeroSize |
+ event:event ? event : theEvent |
+ pasteboard:pboard |
+ source:self |
+ slideBack:YES]; |
+ return YES; |
+ } |
+ |
+ // On mouse-up fall through to mouse-pressed case. |
+ DCHECK_EQ([event type], NSLeftMouseUp); |
} |
- return NO; |
+ [icon view]->OnMousePressed([icon rect]); |
+ return YES; |
+} |
+ |
+- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal { |
+ return NSDragOperationCopy; |
} |
@end |