Home | History | Annotate | Download | only in cocoa
      1 // Copyright 2013 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 #ifndef UI_APP_LIST_COCOA_APPS_GRID_CONTROLLER_H_
      6 #define UI_APP_LIST_COCOA_APPS_GRID_CONTROLLER_H_
      7 
      8 #import <Cocoa/Cocoa.h>
      9 
     10 #include "base/mac/scoped_nsobject.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "ui/app_list/app_list_export.h"
     13 #import "ui/app_list/cocoa/app_list_pager_view.h"
     14 #import "ui/app_list/cocoa/scroll_view_with_no_scrollbars.h"
     15 
     16 namespace app_list {
     17 class AppListModel;
     18 class AppListViewDelegate;
     19 class AppsGridDelegateBridge;
     20 }
     21 
     22 @class AppsGridViewItem;
     23 @protocol AppsPaginationModelObserver;
     24 @class AppsCollectionViewDragManager;
     25 
     26 // Controls a grid of views, representing AppListItemList sub models.
     27 APP_LIST_EXPORT
     28 @interface AppsGridController : NSViewController<GestureScrollDelegate,
     29                                                  AppListPagerDelegate,
     30                                                  NSCollectionViewDelegate> {
     31  @private
     32   app_list::AppListViewDelegate* delegate_;  // Weak. Owned by view controller.
     33   scoped_ptr<app_list::AppsGridDelegateBridge> bridge_;
     34 
     35   base::scoped_nsobject<AppsCollectionViewDragManager> dragManager_;
     36   base::scoped_nsobject<NSMutableArray> pages_;
     37   base::scoped_nsobject<NSMutableArray> items_;
     38   base::scoped_nsobject<NSTimer> scrollWhileDraggingTimer_;
     39 
     40   id<AppsPaginationModelObserver> paginationObserver_;
     41 
     42   // Index of the currently visible page.
     43   size_t visiblePage_;
     44   // The page to which the view is currently animating a scroll.
     45   size_t targetScrollPage_;
     46   // The page to start scrolling to when the timer expires.
     47   size_t scheduledScrollPage_;
     48 
     49   // Whether we are currently animating a scroll to the nearest page.
     50   BOOL animatingScroll_;
     51 }
     52 
     53 @property(assign, nonatomic) id<AppsPaginationModelObserver> paginationObserver;
     54 
     55 + (void)setScrollAnimationDuration:(NSTimeInterval)duration;
     56 
     57 // The amount the grid view has been extended to hold the sometimes present
     58 // invisible scroller that allows for gesture scrolling.
     59 + (CGFloat)scrollerPadding;
     60 
     61 - (NSCollectionView*)collectionViewAtPageIndex:(size_t)pageIndex;
     62 - (size_t)pageIndexForCollectionView:(NSCollectionView*)page;
     63 
     64 - (AppsGridViewItem*)itemAtIndex:(size_t)itemIndex;
     65 
     66 - (app_list::AppListModel*)model;
     67 
     68 - (void)setDelegate:(app_list::AppListViewDelegate*)newDelegate;
     69 
     70 - (size_t)visiblePage;
     71 
     72 // Calls item->Activate for the currently selected item by simulating a click.
     73 - (void)activateSelection;
     74 
     75 // Return the number of pages of icons in the grid.
     76 - (size_t)pageCount;
     77 
     78 // Return the number of items over all pages in the grid.
     79 - (size_t)itemCount;
     80 
     81 // Scroll to a page in the grid view with an animation.
     82 - (void)scrollToPage:(size_t)pageIndex;
     83 
     84 // Start a timer to scroll to a new page, if |locationInWindow| is to the left
     85 // or the right of the view, or if it is over a pager segment. Cancels any
     86 // existing timer if the target page changes.
     87 - (void)maybeChangePageForPoint:(NSPoint)locationInWindow;
     88 
     89 // Cancel a timer that may have been set by maybeChangePageForPoint().
     90 - (void)cancelScrollTimer;
     91 
     92 // Moves an item within the view only, for dragging or in response to model
     93 // changes.
     94 - (void)moveItemInView:(size_t)fromIndex
     95            toItemIndex:(size_t)toIndex;
     96 
     97 // Moves an item in the item model. Does not adjust the view.
     98 - (void)moveItemWithIndex:(size_t)itemIndex
     99              toModelIndex:(size_t)modelIndex;
    100 
    101 // Return the index of the selected item.
    102 - (NSUInteger)selectedItemIndex;
    103 
    104 // Moves the selection to the given index.
    105 - (void)selectItemAtIndex:(NSUInteger)index;
    106 
    107 // Handle key actions. Similar to doCommandBySelector from NSResponder but that
    108 // requires this class to be in the responder chain. Instead this method is
    109 // invoked by the AppListViewController.
    110 // Returns YES if this handled navigation or launched an app.
    111 - (BOOL)handleCommandBySelector:(SEL)command;
    112 
    113 @end
    114 
    115 @interface AppsGridController(TestingAPI)
    116 
    117 - (AppsCollectionViewDragManager*)dragManager;
    118 - (size_t)scheduledScrollPage;
    119 
    120 @end
    121 
    122 #endif  // UI_APP_LIST_COCOA_APPS_GRID_CONTROLLER_H_
    123