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 virtual void ItemNameChanged() OVERRIDE; 82 virtual void ItemHighlightedChanged() OVERRIDE; 83 virtual void ItemIsInstallingChanged() OVERRIDE; 84 virtual void ItemPercentDownloadedChanged() OVERRIDE; 85 86 // AppListItemListObserver 87 virtual void OnListItemAdded(size_t index, AppListItem* item) OVERRIDE; 88 virtual void OnListItemRemoved(size_t index, 89 AppListItem* item) OVERRIDE;; 90 virtual void OnListItemMoved(size_t from_index, 91 size_t to_index, 92 AppListItem* item) OVERRIDE; 93 94 void UpdateTopItems(); 95 96 // The type of folder; may affect behavior of folder views. 97 const FolderType folder_type_; 98 99 // List of items in the folder. 100 scoped_ptr<AppListItemList> item_list_; 101 102 // Top items for generating folder icon. 103 std::vector<AppListItem*> top_items_; 104 105 DISALLOW_COPY_AND_ASSIGN(AppListFolderItem); 106 }; 107 108 } // namespace app_list 109 110 #endif // UI_APP_LIST_APP_LIST_FOLDER_ITEM_H_ 111