• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
item_list()56   AppListItemList* item_list() { return item_list_.get(); }
item_list()57   const AppListItemList* item_list() const { return item_list_.get(); }
58 
folder_type()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