| OLD | NEW |
| (Empty) |
| 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/bookmarks/bookmark_bar_folder_view.h" | |
| 6 | |
| 7 #include "chrome/browser/bookmarks/bookmark_pasteboard_helper_mac.h" | |
| 8 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.h" | |
| 9 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.h" | |
| 10 #include "content/browser/user_metrics.h" | |
| 11 | |
| 12 #import "third_party/mozilla/NSPasteboard+Utils.h" | |
| 13 | |
| 14 @interface BookmarkBarFolderView() | |
| 15 | |
| 16 @property(readonly, nonatomic) id<BookmarkButtonControllerProtocol> controller; | |
| 17 | |
| 18 @end | |
| 19 | |
| 20 @implementation BookmarkBarFolderView | |
| 21 | |
| 22 - (void)awakeFromNib { | |
| 23 NSArray* types = [NSArray arrayWithObjects: | |
| 24 NSStringPboardType, | |
| 25 NSHTMLPboardType, | |
| 26 NSURLPboardType, | |
| 27 kBookmarkButtonDragType, | |
| 28 kBookmarkDictionaryListPboardType, | |
| 29 nil]; | |
| 30 [self registerForDraggedTypes:types]; | |
| 31 } | |
| 32 | |
| 33 - (void)dealloc { | |
| 34 [self unregisterDraggedTypes]; | |
| 35 [super dealloc]; | |
| 36 } | |
| 37 | |
| 38 - (id<BookmarkButtonControllerProtocol>)controller { | |
| 39 // When needed for testing, set the local data member |controller_| to | |
| 40 // the test controller. | |
| 41 return controller_ ? controller_ : [[self window] windowController]; | |
| 42 } | |
| 43 | |
| 44 - (void)drawRect:(NSRect)rect { | |
| 45 // TODO(jrg): copied from bookmark_bar_view but orientation changed. | |
| 46 // Code dup sucks but I'm not sure I can take 16 lines and make it | |
| 47 // generic for horiz vs vertical while keeping things simple. | |
| 48 // TODO(jrg): when throwing it all away and using animations, try | |
| 49 // hard to make a common routine for both. | |
| 50 // http://crbug.com/35966, http://crbug.com/35968 | |
| 51 | |
| 52 // Draw the bookmark-button-dragging drop indicator if necessary. | |
| 53 if (dropIndicatorShown_) { | |
| 54 const CGFloat kBarHeight = 1; | |
| 55 const CGFloat kBarHorizPad = 4; | |
| 56 const CGFloat kBarOpacity = 0.85; | |
| 57 | |
| 58 NSRect uglyBlackBar = | |
| 59 NSMakeRect(kBarHorizPad, dropIndicatorPosition_, | |
| 60 NSWidth([self bounds]) - 2*kBarHorizPad, | |
| 61 kBarHeight); | |
| 62 NSColor* uglyBlackBarColor = [NSColor blackColor]; | |
| 63 [[uglyBlackBarColor colorWithAlphaComponent:kBarOpacity] setFill]; | |
| 64 [[NSBezierPath bezierPathWithRect:uglyBlackBar] fill]; | |
| 65 } | |
| 66 } | |
| 67 | |
| 68 // TODO(mrossetti,jrg): Identical to -[BookmarkBarView | |
| 69 // dragClipboardContainsBookmarks]. http://crbug.com/35966 | |
| 70 // Shim function to assist in unit testing. | |
| 71 - (BOOL)dragClipboardContainsBookmarks { | |
| 72 return bookmark_pasteboard_helper_mac::DragClipboardContainsBookmarks(); | |
| 73 } | |
| 74 | |
| 75 // Virtually identical to [BookmarkBarView draggingEntered:]. | |
| 76 // TODO(jrg): find a way to share code. Lack of multiple inheritance | |
| 77 // makes things more of a pain but there should be no excuse for laziness. | |
| 78 // http://crbug.com/35966 | |
| 79 - (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)info { | |
| 80 inDrag_ = YES; | |
| 81 if (![[self controller] draggingAllowed:info]) | |
| 82 return NSDragOperationNone; | |
| 83 if ([[info draggingPasteboard] dataForType:kBookmarkButtonDragType] || | |
| 84 [self dragClipboardContainsBookmarks] || | |
| 85 [[info draggingPasteboard] containsURLData]) { | |
| 86 // Find the position of the drop indicator. | |
| 87 BOOL showIt = [[self controller] | |
| 88 shouldShowIndicatorShownForPoint:[info draggingLocation]]; | |
| 89 if (!showIt) { | |
| 90 if (dropIndicatorShown_) { | |
| 91 dropIndicatorShown_ = NO; | |
| 92 [self setNeedsDisplay:YES]; | |
| 93 } | |
| 94 } else { | |
| 95 CGFloat y = | |
| 96 [[self controller] | |
| 97 indicatorPosForDragToPoint:[info draggingLocation]]; | |
| 98 | |
| 99 // Need an update if the indicator wasn't previously shown or if it has | |
| 100 // moved. | |
| 101 if (!dropIndicatorShown_ || dropIndicatorPosition_ != y) { | |
| 102 dropIndicatorShown_ = YES; | |
| 103 dropIndicatorPosition_ = y; | |
| 104 [self setNeedsDisplay:YES]; | |
| 105 } | |
| 106 } | |
| 107 | |
| 108 [[self controller] draggingEntered:info]; // allow hover-open to work | |
| 109 return [info draggingSource] ? NSDragOperationMove : NSDragOperationCopy; | |
| 110 } | |
| 111 return NSDragOperationNone; | |
| 112 } | |
| 113 | |
| 114 - (void)draggingExited:(id<NSDraggingInfo>)info { | |
| 115 [[self controller] draggingExited:info]; | |
| 116 | |
| 117 // Regardless of the type of dragging which ended, we need to get rid of the | |
| 118 // drop indicator if one was shown. | |
| 119 if (dropIndicatorShown_) { | |
| 120 dropIndicatorShown_ = NO; | |
| 121 [self setNeedsDisplay:YES]; | |
| 122 } | |
| 123 } | |
| 124 | |
| 125 - (void)draggingEnded:(id<NSDraggingInfo>)info { | |
| 126 // Awkwardness since views open and close out from under us. | |
| 127 if (inDrag_) { | |
| 128 inDrag_ = NO; | |
| 129 } | |
| 130 | |
| 131 [self draggingExited:info]; | |
| 132 } | |
| 133 | |
| 134 - (BOOL)wantsPeriodicDraggingUpdates { | |
| 135 // TODO(jrg): This should probably return |YES| and the controller should | |
| 136 // slide the existing bookmark buttons interactively to the side to make | |
| 137 // room for the about-to-be-dropped bookmark. | |
| 138 // http://crbug.com/35968 | |
| 139 return NO; | |
| 140 } | |
| 141 | |
| 142 - (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)info { | |
| 143 // For now it's the same as draggingEntered:. | |
| 144 // TODO(jrg): once we return YES for wantsPeriodicDraggingUpdates, | |
| 145 // this should ping the [self controller] to perform animations. | |
| 146 // http://crbug.com/35968 | |
| 147 return [self draggingEntered:info]; | |
| 148 } | |
| 149 | |
| 150 - (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)info { | |
| 151 return YES; | |
| 152 } | |
| 153 | |
| 154 // This code is practically identical to the same function in BookmarkBarView | |
| 155 // with the only difference being how the controller is retrieved. | |
| 156 // TODO(mrossetti,jrg): http://crbug.com/35966 | |
| 157 // Implement NSDraggingDestination protocol method | |
| 158 // performDragOperation: for URLs. | |
| 159 - (BOOL)performDragOperationForURL:(id<NSDraggingInfo>)info { | |
| 160 NSPasteboard* pboard = [info draggingPasteboard]; | |
| 161 DCHECK([pboard containsURLData]); | |
| 162 | |
| 163 NSArray* urls = nil; | |
| 164 NSArray* titles = nil; | |
| 165 [pboard getURLs:&urls andTitles:&titles convertingFilenames:YES]; | |
| 166 | |
| 167 return [[self controller] addURLs:urls | |
| 168 withTitles:titles | |
| 169 at:[info draggingLocation]]; | |
| 170 } | |
| 171 | |
| 172 // This code is practically identical to the same function in BookmarkBarView | |
| 173 // with the only difference being how the controller is retrieved. | |
| 174 // http://crbug.com/35966 | |
| 175 // Implement NSDraggingDestination protocol method | |
| 176 // performDragOperation: for bookmark buttons. | |
| 177 - (BOOL)performDragOperationForBookmarkButton:(id<NSDraggingInfo>)info { | |
| 178 BOOL doDrag = NO; | |
| 179 NSData* data = [[info draggingPasteboard] | |
| 180 dataForType:kBookmarkButtonDragType]; | |
| 181 // [info draggingSource] is nil if not the same application. | |
| 182 if (data && [info draggingSource]) { | |
| 183 BookmarkButton* button = nil; | |
| 184 [data getBytes:&button length:sizeof(button)]; | |
| 185 BOOL copy = !([info draggingSourceOperationMask] & NSDragOperationMove); | |
| 186 doDrag = [[self controller] dragButton:button | |
| 187 to:[info draggingLocation] | |
| 188 copy:copy]; | |
| 189 UserMetrics::RecordAction(UserMetricsAction("BookmarkBarFolder_DragEnd")); | |
| 190 } | |
| 191 return doDrag; | |
| 192 } | |
| 193 | |
| 194 - (BOOL)performDragOperation:(id<NSDraggingInfo>)info { | |
| 195 if ([[self controller] dragBookmarkData:info]) | |
| 196 return YES; | |
| 197 NSPasteboard* pboard = [info draggingPasteboard]; | |
| 198 if ([pboard dataForType:kBookmarkButtonDragType] && | |
| 199 [self performDragOperationForBookmarkButton:info]) | |
| 200 return YES; | |
| 201 if ([pboard containsURLData] && [self performDragOperationForURL:info]) | |
| 202 return YES; | |
| 203 return NO; | |
| 204 } | |
| 205 | |
| 206 @end | |
| OLD | NEW |