Chromium Code Reviews| Index: chrome/browser/ui/cocoa/bookmarks/bookmark_button.mm |
| diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_button.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_button.mm |
| index 6eea93677469813272e9aef36cacb8949859f8bf..80bd82cc52af6b84f6ee6e3afa02dca4c0d37062 100644 |
| --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_button.mm |
| +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_button.mm |
| @@ -9,8 +9,10 @@ |
| #include "base/logging.h" |
| #include "base/mac/foundation_util.h" |
| #import "base/mac/scoped_nsobject.h" |
| +#include "base/mac/sdk_forward_declarations.h" |
| #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_window.h" |
| #import "chrome/browser/ui/cocoa/bookmarks/bookmark_button_cell.h" |
| +#import "chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.h" |
| #import "chrome/browser/ui/cocoa/browser_window_controller.h" |
| #import "chrome/browser/ui/cocoa/view_id_util.h" |
| #include "components/bookmarks/browser/bookmark_model.h" |
| @@ -33,7 +35,19 @@ namespace { |
| BookmarkButton* gDraggedButton = nil; // Weak |
| }; |
| -@interface BookmarkButton(Private) |
| +@interface BookmarkButton() <NSPasteboardItemDataProvider> |
| + |
| +// NSPasteboardItemDataProvider: |
| +- (void)pasteboard:(NSPasteboard*)sender |
| + item:(NSPasteboardItem*)item |
| + provideDataForType:(NSString*)type; |
| + |
| +// NSDraggingSource: |
| +- (void)draggingSession:(NSDraggingSession*)session |
| + endedAtPoint:(NSPoint)aPoint |
| + operation:(NSDragOperation)operation; |
| +- (NSDragOperation)draggingSession:(NSDraggingSession*)session |
| + sourceOperationMaskForDraggingContext:(NSDraggingContext)context; |
| // Make a drag image for the button. |
| - (NSImage*)dragImage; |
| @@ -42,7 +56,6 @@ BookmarkButton* gDraggedButton = nil; // Weak |
| @end // @interface BookmarkButton(Private) |
| - |
| @implementation BookmarkButton |
| @synthesize delegate = delegate_; |
| @@ -175,10 +188,6 @@ BookmarkButton* gDraggedButton = nil; // Weak |
| // the stack. |
| [self retain]; |
| - // Ask our delegate to fill the pasteboard for us. |
| - NSPasteboard* pboard = [NSPasteboard pasteboardWithName:NSDragPboard]; |
| - [[self delegate] fillPasteboard:pboard forDragOfButton:self]; |
| - |
| // Lock bar visibility, forcing the overlay to stay visible if we are in |
| // fullscreen mode. |
| if ([[self delegate] dragShouldLockBarVisibility]) { |
| @@ -202,12 +211,25 @@ BookmarkButton* gDraggedButton = nil; // Weak |
| dragPending_ = YES; |
| gDraggedButton = self; |
| - CGFloat yAt = [self bounds].size.height; |
| - NSSize dragOffset = NSMakeSize(0.0, 0.0); |
| NSImage* image = [self dragImage]; |
| [self setHidden:YES]; |
| - [self dragImage:image at:NSMakePoint(0, yAt) offset:dragOffset |
| - event:event pasteboard:pboard source:self slideBack:YES]; |
| + |
| + NSPasteboardItem *pbItem = [NSPasteboardItem new]; |
| + [pbItem |
| + setDataProvider:self |
| + forTypes:[NSArray arrayWithObjects:kBookmarkButtonDragType, nil]]; |
|
Avi (use Gerrit)
2016/03/18 21:41:03
@[ kBookmarkButtonDragType ]
?
erikchen
2016/03/18 22:20:35
Done.
|
| + |
| + base::scoped_nsobject<NSDraggingItem> dragItem( |
| + [[NSDraggingItem alloc] initWithPasteboardWriter:pbItem]); |
| + [dragItem setDraggingFrame:[self bounds] contents:image]; |
| + |
| + [self beginDraggingSessionWithItems:@[ dragItem.get() ] |
| + event:event |
| + source:self]; |
| + while (gDraggedButton != nil) { |
| + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode |
| + beforeDate:[NSDate distantFuture]]; |
| + } |
| [self setHidden:NO]; |
| // And we're done. |
| @@ -217,6 +239,27 @@ BookmarkButton* gDraggedButton = nil; // Weak |
| [self autorelease]; |
| } |
| +- (void)pasteboard:(NSPasteboard*)sender |
| + item:(NSPasteboardItem*)item |
| + provideDataForType:(NSString*)type { |
| + [sender setData:[NSData dataWithBytes:&gDraggedButton |
| + length:sizeof(gDraggedButton)] |
| + forType:kBookmarkButtonDragType]; |
| +} |
| + |
| +- (NSDragOperation)draggingSession:(NSDraggingSession*)session |
| + sourceOperationMaskForDraggingContext:(NSDraggingContext)context { |
| + NSDragOperation operation = NSDragOperationCopy; |
| + |
| + if (context == NSDraggingContextWithinApplication) |
| + operation |= NSDragOperationMove; |
| + |
| + if ([delegate_ canDragBookmarkButtonToTrash:self]) |
| + operation |= NSDragOperationDelete; |
| + |
| + return operation; |
| +} |
| + |
| // Overridden to release bar visibility. |
| - (DraggableButtonResult)endDrag { |
| gDraggedButton = nil; |
| @@ -230,20 +273,9 @@ BookmarkButton* gDraggedButton = nil; // Weak |
| return kDraggableButtonImplUseBase; |
| } |
| -- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal { |
| - NSDragOperation operation = NSDragOperationCopy; |
| - if (isLocal) { |
| - operation |= NSDragOperationMove; |
| - } |
| - if ([delegate_ canDragBookmarkButtonToTrash:self]) { |
| - operation |= NSDragOperationDelete; |
| - } |
| - return operation; |
| -} |
| - |
| -- (void)draggedImage:(NSImage *)anImage |
| - endedAt:(NSPoint)aPoint |
| - operation:(NSDragOperation)operation { |
| +- (void)draggingSession:(NSDraggingSession*)session |
| + endedAtPoint:(NSPoint)aPoint |
| + operation:(NSDragOperation)operation { |
| gDraggedButton = nil; |
| // Inform delegate of drag source that we're finished dragging, |
| // so it can close auto-opened bookmark folders etc. |
| @@ -325,8 +357,6 @@ BookmarkButton* gDraggedButton = nil; // Weak |
| return kDraggableButtonMixinDidWork; |
| } |
| - |
| - |
| // mouseEntered: and mouseExited: are called from our |
| // BookmarkButtonCell. We redirect this information to our delegate. |
| // The controller can then perform menu-like actions (e.g. "hover over |
| @@ -428,11 +458,6 @@ BookmarkButton* gDraggedButton = nil; // Weak |
| [self setNeedsDisplay:YES]; |
| } |
| -@end |
| - |
| -@implementation BookmarkButton(Private) |
| - |
| - |
| - (void)installCustomTrackingArea { |
| const NSTrackingAreaOptions options = |
| NSTrackingActiveAlways | |
| @@ -451,7 +476,6 @@ BookmarkButton* gDraggedButton = nil; // Weak |
| [self addTrackingArea:area_]; |
| } |
| - |
| - (NSImage*)dragImage { |
| NSRect bounds = [self bounds]; |
| base::scoped_nsobject<NSImage> image( |
| @@ -474,4 +498,4 @@ BookmarkButton* gDraggedButton = nil; // Weak |
| return image.autorelease(); |
| } |
| -@end // @implementation BookmarkButton(Private) |
| +@end |