Home | History | Annotate | Download | only in app_list
      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_APP_LIST_FOLDER_ITEM_H_
      6 #define UI_APP_LIST_APP_LIST_FOLDER_ITEM_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "ui/app_list/app_list_export.h"
     12 #include "ui/app_list/app_list_item.h"
     13 #include "ui/app_list/app_list_item_list_observer.h"
     14 #include "ui/app_list/app_list_item_observer.h"
     15 #include "ui/gfx/geometry/rect.h"
     16 
     17 namespace app_list {
     18 
     19 class AppListItemList;
     20 
     21 typedef std::vector<gfx::Rect> Rects;
     22 
     23 // AppListFolderItem implements the model/controller for folders.
     24 class APP_LIST_EXPORT AppListFolderItem : public AppListItem,
     25                                           public AppListItemListObserver,
     26                                           public AppListItemObserver {
     27  public:
     28   // The folder type affects folder behavior.
     29   enum FolderType {
     30     // Default folder type.
     31     FOLDER_TYPE_NORMAL,
     32     // Items can not be moved to/from OEM folders in the UI.
     33     FOLDER_TYPE_OEM
     34   };
     35 
     36   static const char kItemType[];
     37 
     38   AppListFolderItem(const std::string& id, FolderType folder_type);
     39   virtual ~AppListFolderItem();
     40 
     41   // Updates the folder's icon.
     42   void UpdateIcon();
     43 
     44   // Returns the icon of one of the top items with |item_index|.
     45   const gfx::ImageSkia& GetTopIcon(size_t item_index);
     46 
     47   // Returns the target icon bounds for |item| to fly back to its parent folder
     48   // icon in animation UI. If |item| is one of the top item icon, this will
     49   // match its corresponding top item icon in the folder icon. Otherwise,
     50   // the target icon bounds is centered at the |folder_icon_bounds| with
     51   // the same size of the top item icon.
     52   // The Rect returned is in the same coordinates of |folder_icon_bounds|.
     53   gfx::Rect GetTargetIconRectInFolderForItem(
     54       AppListItem* item, const gfx::Rect& folder_icon_bounds);
     55 
     56   AppListItemList* item_list() { return item_list_.get(); }
     57   const AppListItemList* item_list() const { return item_list_.get(); }
     58 
     59   FolderType folder_type() const { return folder_type_; }
     60 
     61   // AppListItem
     62   virtual void Activate(int event_flags) OVERRIDE;
     63   virtual const char* GetItemType() const OVERRIDE;
     64   virtual ui::MenuModel* GetContextMenuModel() OVERRIDE;
     65   virtual AppListItem* FindChildItem(const std::string& id) OVERRIDE;
     66   virtual size_t ChildItemCount() const OVERRIDE;
     67   virtual void OnExtensionPreferenceChanged() OVERRIDE;
     68   virtual bool CompareForTest(const AppListItem* other) const OVERRIDE;
     69 
     70   // Calculates the top item icons' bounds inside |folder_icon_bounds|.
     71   // Returns the bounds of top item icons in sequence of top left, top right,
     72   // bottom left, bottom right.
     73   static Rects GetTopIconsBounds(const gfx::Rect& folder_icon_bounds);
     74 
     75   // Returns an id for a new folder.
     76   static std::string GenerateId();
     77 
     78  private:
     79   // AppListItemObserver
     80   virtual void ItemIconChanged() OVERRIDE;
     81 
     82   // AppListItemListObserver
     83   virtual void OnListItemAdded(size_t index, AppListItem* item) OVERRIDE;
     84   virtual void OnListItemRemoved(size_t index,
     85                                  AppListItem* item) OVERRIDE;;
     86   virtual void OnListItemMoved(size_t from_index,
     87                                size_t to_index,
     88                                AppListItem* item) OVERRIDE;
     89 
     90   void UpdateTopItems();
     91 
     92   // The type of folder; may affect behavior of folder views.
     93   const FolderType folder_type_;
     94 
     95   // List of items in the folder.
     96   scoped_ptr<AppListItemList> item_list_;
     97 
     98   // Top items for generating folder icon.
     99   std::vector<AppListItem*> top_items_;
    100 
    101   DISALLOW_COPY_AND_ASSIGN(AppListFolderItem);
    102 };
    103 
    104 }  // namespace app_list
    105 
    106 #endif  // UI_APP_LIST_APP_LIST_FOLDER_ITEM_H_
    107