diff options
Diffstat (limited to 'chromium/ui/app_list/cocoa/apps_collection_view_drag_manager.mm')
-rw-r--r-- | chromium/ui/app_list/cocoa/apps_collection_view_drag_manager.mm | 263 |
1 files changed, 0 insertions, 263 deletions
diff --git a/chromium/ui/app_list/cocoa/apps_collection_view_drag_manager.mm b/chromium/ui/app_list/cocoa/apps_collection_view_drag_manager.mm deleted file mode 100644 index 74e23c4e0ec..00000000000 --- a/chromium/ui/app_list/cocoa/apps_collection_view_drag_manager.mm +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright 2013 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 "ui/app_list/cocoa/apps_collection_view_drag_manager.h" - -#include "base/logging.h" -#include "base/mac/foundation_util.h" -#import "ui/app_list/cocoa/apps_grid_controller.h" -#import "ui/app_list/cocoa/apps_grid_view_item.h" -#import "ui/app_list/cocoa/item_drag_controller.h" - -namespace { - -// Distance cursor must travel in either x or y direction to start a drag. -const CGFloat kDragThreshold = 5; - -} // namespace - -@interface AppsCollectionViewDragManager () - -// Returns the item index that |theEvent| would hit in the page at |pageIndex| -// or NSNotFound if no item is hit. -- (size_t)itemIndexForPage:(size_t)pageIndex - hitWithEvent:(NSEvent*)theEvent; - -- (void)initiateDrag:(NSEvent*)theEvent; -- (void)updateDrag:(NSEvent*)theEvent; -- (void)completeDrag; - -- (NSMenu*)menuForEvent:(NSEvent*)theEvent - inPage:(NSCollectionView*)page; - -@end - -// An NSCollectionView that forwards mouse events to the factory they share. -@interface GridCollectionView : NSCollectionView { - @private - AppsCollectionViewDragManager* factory_; -} - -@property(assign, nonatomic) AppsCollectionViewDragManager* factory; - -@end - -@implementation AppsCollectionViewDragManager - -- (id)initWithCellSize:(NSSize)cellSize - rows:(size_t)rows - columns:(size_t)columns - gridController:(AppsGridController*)gridController { - if ((self = [super init])) { - cellSize_ = cellSize; - rows_ = rows; - columns_ = columns; - gridController_ = gridController; - } - return self; -} - -- (NSCollectionView*)makePageWithFrame:(NSRect)pageFrame { - base::scoped_nsobject<GridCollectionView> itemCollectionView( - [[GridCollectionView alloc] initWithFrame:pageFrame]); - [itemCollectionView setFactory:self]; - [itemCollectionView setMaxNumberOfRows:rows_]; - [itemCollectionView setMinItemSize:cellSize_]; - [itemCollectionView setMaxItemSize:cellSize_]; - [itemCollectionView setSelectable:YES]; - [itemCollectionView setFocusRingType:NSFocusRingTypeNone]; - [itemCollectionView setBackgroundColors: - [NSArray arrayWithObject:[NSColor clearColor]]]; - [itemCollectionView setDelegate:gridController_]; - - base::scoped_nsobject<AppsGridViewItem> itemPrototype( - [[AppsGridViewItem alloc] initWithSize:cellSize_]); - [[itemPrototype button] setTarget:gridController_]; - [[itemPrototype button] setAction:@selector(onItemClicked:)]; - - [itemCollectionView setItemPrototype:itemPrototype]; - return itemCollectionView.autorelease(); -} - -- (void)onMouseDownInPage:(NSCollectionView*)page - withEvent:(NSEvent*)theEvent { - size_t pageIndex = [gridController_ pageIndexForCollectionView:page]; - itemHitIndex_ = [self itemIndexForPage:pageIndex - hitWithEvent:theEvent]; - if (itemHitIndex_ == NSNotFound) - return; - - mouseDownLocation_ = [theEvent locationInWindow]; - [[[gridController_ itemAtIndex:itemHitIndex_] view] mouseDown:theEvent]; -} - -- (void)onMouseDragged:(NSEvent*)theEvent { - if (itemHitIndex_ == NSNotFound) - return; - - if (dragging_) { - [self updateDrag:theEvent]; - return; - } - - NSPoint mouseLocation = [theEvent locationInWindow]; - CGFloat deltaX = mouseLocation.x - mouseDownLocation_.x; - CGFloat deltaY = mouseLocation.y - mouseDownLocation_.y; - if (deltaX * deltaX + deltaY * deltaY > kDragThreshold * kDragThreshold) { - [self initiateDrag:theEvent]; - return; - } - - [[[gridController_ itemAtIndex:itemHitIndex_] view] mouseDragged:theEvent]; -} - -- (void)onMouseUp:(NSEvent*)theEvent { - if (itemHitIndex_ == NSNotFound) - return; - - if (dragging_) { - [self completeDrag]; - return; - } - - [[[gridController_ itemAtIndex:itemHitIndex_] view] mouseUp:theEvent]; -} - -- (size_t)itemIndexForPage:(size_t)pageIndex - hitWithEvent:(NSEvent*)theEvent { - NSCollectionView* page = - [gridController_ collectionViewAtPageIndex:pageIndex]; - NSPoint pointInView = [page convertPoint:[theEvent locationInWindow] - fromView:nil]; - - const size_t itemsInPage = [[page content] count]; - for (size_t indexInPage = 0; indexInPage < itemsInPage; ++indexInPage) { - if ([page mouse:pointInView - inRect:[page frameForItemAtIndex:indexInPage]]) { - return indexInPage + pageIndex * rows_ * columns_; - } - } - - return NSNotFound; -} - -- (void)initiateDrag:(NSEvent*)theEvent { - DCHECK_LT(itemHitIndex_, [gridController_ itemCount]); - dragging_ = YES; - - if (!itemDragController_) { - itemDragController_.reset( - [[ItemDragController alloc] initWithGridCellSize:cellSize_]); - [[[gridController_ view] superview] addSubview:[itemDragController_ view]]; - } - - [itemDragController_ initiate:[gridController_ itemAtIndex:itemHitIndex_] - mouseDownLocation:mouseDownLocation_ - currentLocation:[theEvent locationInWindow] - timestamp:[theEvent timestamp]]; - - itemDragIndex_ = itemHitIndex_; - [self updateDrag:theEvent]; -} - -- (void)updateDrag:(NSEvent*)theEvent { - [itemDragController_ update:[theEvent locationInWindow] - timestamp:[theEvent timestamp]]; - [gridController_ maybeChangePageForPoint:[theEvent locationInWindow]]; - - size_t visiblePage = [gridController_ visiblePage]; - size_t itemIndexOver = [self itemIndexForPage:visiblePage - hitWithEvent:theEvent]; - DCHECK_NE(0u, [gridController_ itemCount]); - if (itemIndexOver == NSNotFound) { - if (visiblePage != [gridController_ pageCount] - 1) - return; - - // If nothing was hit, but the last page is shown, move to the end. - itemIndexOver = [gridController_ itemCount] - 1; - } - - if (itemDragIndex_ == itemIndexOver) - return; - - [gridController_ moveItemInView:itemDragIndex_ - toItemIndex:itemIndexOver]; - // A new item may be created when moving between pages. Ensure it is hidden. - [[[gridController_ itemAtIndex:itemIndexOver] button] setHidden:YES]; - itemDragIndex_ = itemIndexOver; -} - -- (void)cancelDrag { - if (!dragging_) - return; - - [gridController_ moveItemInView:itemDragIndex_ - toItemIndex:itemHitIndex_]; - itemDragIndex_ = itemHitIndex_; - [self completeDrag]; - itemHitIndex_ = NSNotFound; // Ignore future mouse events for this drag. -} - -- (void)completeDrag { - DCHECK_GE(itemDragIndex_, 0u); - [gridController_ cancelScrollTimer]; - AppsGridViewItem* item = [gridController_ itemAtIndex:itemDragIndex_]; - - // The item could still be animating in the NSCollectionView, so ask it where - // it would place the item. - NSCollectionView* pageView = base::mac::ObjCCastStrict<NSCollectionView>( - [[item view] superview]); - size_t indexInPage = itemDragIndex_ % (rows_ * columns_); - NSPoint targetOrigin = [[[itemDragController_ view] superview] - convertPoint:[pageView frameForItemAtIndex:indexInPage].origin - fromView:pageView]; - - [itemDragController_ complete:item - targetOrigin:targetOrigin]; - [gridController_ moveItemWithIndex:itemHitIndex_ - toModelIndex:itemDragIndex_]; - - dragging_ = NO; -} - -- (NSMenu*)menuForEvent:(NSEvent*)theEvent - inPage:(NSCollectionView*)page { - size_t pageIndex = [gridController_ pageIndexForCollectionView:page]; - size_t itemIndex = [self itemIndexForPage:pageIndex - hitWithEvent:theEvent]; - if (itemIndex == NSNotFound) - return nil; - - return [[gridController_ itemAtIndex:itemIndex] contextMenu]; -} - -@end - -@implementation GridCollectionView - -@synthesize factory = factory_; - -- (NSMenu*)menuForEvent:(NSEvent*)theEvent { - return [factory_ menuForEvent:theEvent - inPage:self]; -} - -- (void)mouseDown:(NSEvent*)theEvent { - [factory_ onMouseDownInPage:self - withEvent:theEvent]; -} - -- (void)mouseDragged:(NSEvent*)theEvent { - [factory_ onMouseDragged:theEvent]; -} - -- (void)mouseUp:(NSEvent*)theEvent { - [factory_ onMouseUp:theEvent]; -} - -- (BOOL)acceptsFirstResponder { - return NO; -} - -@end |