Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7357)

Unified Diff: chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm

Issue 8141003: [Mac] Restore the old bookmark menus now that the experiment is over. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm
new file mode 100644
index 0000000000000000000000000000000000000000..c108b4259c36df335cad321dca4a7e68b175df9b
--- /dev/null
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm
@@ -0,0 +1,206 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.h"
+
+#include "chrome/browser/bookmarks/bookmark_pasteboard_helper_mac.h"
+#import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.h"
+#import "chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.h"
+#include "content/browser/user_metrics.h"
+
+#import "third_party/mozilla/NSPasteboard+Utils.h"
+
+@interface BookmarkBarFolderView()
+
+@property(readonly, nonatomic) id<BookmarkButtonControllerProtocol> controller;
+
+@end
+
+@implementation BookmarkBarFolderView
+
+- (void)awakeFromNib {
+ NSArray* types = [NSArray arrayWithObjects:
+ NSStringPboardType,
+ NSHTMLPboardType,
+ NSURLPboardType,
+ kBookmarkButtonDragType,
+ kBookmarkDictionaryListPboardType,
+ nil];
+ [self registerForDraggedTypes:types];
+}
+
+- (void)dealloc {
+ [self unregisterDraggedTypes];
+ [super dealloc];
+}
+
+- (id<BookmarkButtonControllerProtocol>)controller {
+ // When needed for testing, set the local data member |controller_| to
+ // the test controller.
+ return controller_ ? controller_ : [[self window] windowController];
+}
+
+- (void)drawRect:(NSRect)rect {
+ // TODO(jrg): copied from bookmark_bar_view but orientation changed.
+ // Code dup sucks but I'm not sure I can take 16 lines and make it
+ // generic for horiz vs vertical while keeping things simple.
+ // TODO(jrg): when throwing it all away and using animations, try
+ // hard to make a common routine for both.
+ // http://crbug.com/35966, http://crbug.com/35968
+
+ // Draw the bookmark-button-dragging drop indicator if necessary.
+ if (dropIndicatorShown_) {
+ const CGFloat kBarHeight = 1;
+ const CGFloat kBarHorizPad = 4;
+ const CGFloat kBarOpacity = 0.85;
+
+ NSRect uglyBlackBar =
+ NSMakeRect(kBarHorizPad, dropIndicatorPosition_,
+ NSWidth([self bounds]) - 2*kBarHorizPad,
+ kBarHeight);
+ NSColor* uglyBlackBarColor = [NSColor blackColor];
+ [[uglyBlackBarColor colorWithAlphaComponent:kBarOpacity] setFill];
+ [[NSBezierPath bezierPathWithRect:uglyBlackBar] fill];
+ }
+}
+
+// TODO(mrossetti,jrg): Identical to -[BookmarkBarView
+// dragClipboardContainsBookmarks]. http://crbug.com/35966
+// Shim function to assist in unit testing.
+- (BOOL)dragClipboardContainsBookmarks {
+ return bookmark_pasteboard_helper_mac::DragClipboardContainsBookmarks();
+}
+
+// Virtually identical to [BookmarkBarView draggingEntered:].
+// TODO(jrg): find a way to share code. Lack of multiple inheritance
+// makes things more of a pain but there should be no excuse for laziness.
+// http://crbug.com/35966
+- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)info {
+ inDrag_ = YES;
+ if (![[self controller] draggingAllowed:info])
+ return NSDragOperationNone;
+ if ([[info draggingPasteboard] dataForType:kBookmarkButtonDragType] ||
+ [self dragClipboardContainsBookmarks] ||
+ [[info draggingPasteboard] containsURLData]) {
+ // Find the position of the drop indicator.
+ BOOL showIt = [[self controller]
+ shouldShowIndicatorShownForPoint:[info draggingLocation]];
+ if (!showIt) {
+ if (dropIndicatorShown_) {
+ dropIndicatorShown_ = NO;
+ [self setNeedsDisplay:YES];
+ }
+ } else {
+ CGFloat y =
+ [[self controller]
+ indicatorPosForDragToPoint:[info draggingLocation]];
+
+ // Need an update if the indicator wasn't previously shown or if it has
+ // moved.
+ if (!dropIndicatorShown_ || dropIndicatorPosition_ != y) {
+ dropIndicatorShown_ = YES;
+ dropIndicatorPosition_ = y;
+ [self setNeedsDisplay:YES];
+ }
+ }
+
+ [[self controller] draggingEntered:info]; // allow hover-open to work
+ return [info draggingSource] ? NSDragOperationMove : NSDragOperationCopy;
+ }
+ return NSDragOperationNone;
+}
+
+- (void)draggingExited:(id<NSDraggingInfo>)info {
+ [[self controller] draggingExited:info];
+
+ // Regardless of the type of dragging which ended, we need to get rid of the
+ // drop indicator if one was shown.
+ if (dropIndicatorShown_) {
+ dropIndicatorShown_ = NO;
+ [self setNeedsDisplay:YES];
+ }
+}
+
+- (void)draggingEnded:(id<NSDraggingInfo>)info {
+ // Awkwardness since views open and close out from under us.
+ if (inDrag_) {
+ inDrag_ = NO;
+ }
+
+ [self draggingExited:info];
+}
+
+- (BOOL)wantsPeriodicDraggingUpdates {
+ // TODO(jrg): This should probably return |YES| and the controller should
+ // slide the existing bookmark buttons interactively to the side to make
+ // room for the about-to-be-dropped bookmark.
+ // http://crbug.com/35968
+ return NO;
+}
+
+- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)info {
+ // For now it's the same as draggingEntered:.
+ // TODO(jrg): once we return YES for wantsPeriodicDraggingUpdates,
+ // this should ping the [self controller] to perform animations.
+ // http://crbug.com/35968
+ return [self draggingEntered:info];
+}
+
+- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)info {
+ return YES;
+}
+
+// This code is practically identical to the same function in BookmarkBarView
+// with the only difference being how the controller is retrieved.
+// TODO(mrossetti,jrg): http://crbug.com/35966
+// Implement NSDraggingDestination protocol method
+// performDragOperation: for URLs.
+- (BOOL)performDragOperationForURL:(id<NSDraggingInfo>)info {
+ NSPasteboard* pboard = [info draggingPasteboard];
+ DCHECK([pboard containsURLData]);
+
+ NSArray* urls = nil;
+ NSArray* titles = nil;
+ [pboard getURLs:&urls andTitles:&titles convertingFilenames:YES];
+
+ return [[self controller] addURLs:urls
+ withTitles:titles
+ at:[info draggingLocation]];
+}
+
+// This code is practically identical to the same function in BookmarkBarView
+// with the only difference being how the controller is retrieved.
+// http://crbug.com/35966
+// Implement NSDraggingDestination protocol method
+// performDragOperation: for bookmark buttons.
+- (BOOL)performDragOperationForBookmarkButton:(id<NSDraggingInfo>)info {
+ BOOL doDrag = NO;
+ NSData* data = [[info draggingPasteboard]
+ dataForType:kBookmarkButtonDragType];
+ // [info draggingSource] is nil if not the same application.
+ if (data && [info draggingSource]) {
+ BookmarkButton* button = nil;
+ [data getBytes:&button length:sizeof(button)];
+ BOOL copy = !([info draggingSourceOperationMask] & NSDragOperationMove);
+ doDrag = [[self controller] dragButton:button
+ to:[info draggingLocation]
+ copy:copy];
+ UserMetrics::RecordAction(UserMetricsAction("BookmarkBarFolder_DragEnd"));
+ }
+ return doDrag;
+}
+
+- (BOOL)performDragOperation:(id<NSDraggingInfo>)info {
+ if ([[self controller] dragBookmarkData:info])
+ return YES;
+ NSPasteboard* pboard = [info draggingPasteboard];
+ if ([pboard dataForType:kBookmarkButtonDragType] &&
+ [self performDragOperationForBookmarkButton:info])
+ return YES;
+ if ([pboard containsURLData] && [self performDragOperationForURL:info])
+ return YES;
+ return NO;
+}
+
+@end

Powered by Google App Engine
This is Rietveld 408576698