| 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
 | 
| 
 |