1 // Copyright (c) 2012 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_SEARCH_RESULT_H_ 6 #define UI_APP_LIST_SEARCH_RESULT_H_ 7 8 #include <vector> 9 10 #include "base/basictypes.h" 11 #include "base/observer_list.h" 12 #include "base/strings/string16.h" 13 #include "ui/app_list/app_list_export.h" 14 #include "ui/gfx/image/image_skia.h" 15 #include "ui/gfx/range/range.h" 16 17 namespace ui { 18 class MenuModel; 19 } 20 21 namespace app_list { 22 23 class SearchResultObserver; 24 25 // SearchResult consists of an icon, title text and details text. Title and 26 // details text can have tagged ranges that are displayed differently from 27 // default style. 28 class APP_LIST_EXPORT SearchResult { 29 public: 30 // How the result should be displayed. 31 enum DisplayType { 32 DISPLAY_LIST, 33 DISPLAY_TILE, 34 }; 35 36 // A tagged range in search result text. 37 struct APP_LIST_EXPORT Tag { 38 // Similar to ACMatchClassification::Style, the style values are not 39 // mutually exclusive. 40 enum Style { 41 NONE = 0, 42 URL = 1 << 0, 43 MATCH = 1 << 1, 44 DIM = 1 << 2, 45 }; 46 TagTag47 Tag(int styles, size_t start, size_t end) 48 : styles(styles), 49 range(start, end) { 50 } 51 52 int styles; 53 gfx::Range range; 54 }; 55 typedef std::vector<Tag> Tags; 56 57 // Data representing an action that can be performed on this search result. 58 // An action could be represented as an icon set or as a blue button with 59 // a label. Icon set is chosen if label text is empty. Otherwise, a blue 60 // button with the label text will be used. 61 struct APP_LIST_EXPORT Action { 62 Action(const gfx::ImageSkia& base_image, 63 const gfx::ImageSkia& hover_image, 64 const gfx::ImageSkia& pressed_image, 65 const base::string16& tooltip_text); 66 Action(const base::string16& label_text, 67 const base::string16& tooltip_text); 68 ~Action(); 69 70 gfx::ImageSkia base_image; 71 gfx::ImageSkia hover_image; 72 gfx::ImageSkia pressed_image; 73 74 base::string16 tooltip_text; 75 base::string16 label_text; 76 }; 77 typedef std::vector<Action> Actions; 78 79 SearchResult(); 80 virtual ~SearchResult(); 81 icon()82 const gfx::ImageSkia& icon() const { return icon_; } 83 void SetIcon(const gfx::ImageSkia& icon); 84 title()85 const base::string16& title() const { return title_; } set_title(const base::string16 & title)86 void set_title(const base::string16& title) { title_ = title;} 87 title_tags()88 const Tags& title_tags() const { return title_tags_; } set_title_tags(const Tags & tags)89 void set_title_tags(const Tags& tags) { title_tags_ = tags; } 90 details()91 const base::string16& details() const { return details_; } set_details(const base::string16 & details)92 void set_details(const base::string16& details) { details_ = details; } 93 details_tags()94 const Tags& details_tags() const { return details_tags_; } set_details_tags(const Tags & tags)95 void set_details_tags(const Tags& tags) { details_tags_ = tags; } 96 id()97 const std::string& id() const { return id_; } relevance()98 double relevance() const { return relevance_; } display_type()99 DisplayType display_type() const { return display_type_; } 100 actions()101 const Actions& actions() const { 102 return actions_; 103 } 104 void SetActions(const Actions& sets); 105 is_installing()106 bool is_installing() const { return is_installing_; } 107 void SetIsInstalling(bool is_installing); 108 percent_downloaded()109 int percent_downloaded() const { return percent_downloaded_; } 110 void SetPercentDownloaded(int percent_downloaded); 111 112 // Returns the dimension at which this result's icon should be displayed. 113 int GetPreferredIconDimension() const; 114 115 void NotifyItemInstalled(); 116 void NotifyItemUninstalled(); 117 118 void AddObserver(SearchResultObserver* observer); 119 void RemoveObserver(SearchResultObserver* observer); 120 121 // Opens the result. 122 virtual void Open(int event_flags); 123 124 // Invokes a custom action on the result. 125 virtual void InvokeAction(int action_index, int event_flags); 126 127 // Returns the context menu model for this item, or NULL if there is currently 128 // no menu for the item (e.g. during install). 129 // Note the returned menu model is owned by this item. 130 virtual ui::MenuModel* GetContextMenuModel(); 131 132 protected: set_id(const std::string & id)133 void set_id(const std::string& id) { id_ = id; } set_relevance(double relevance)134 void set_relevance(double relevance) { relevance_ = relevance; } set_display_type(DisplayType display_type)135 void set_display_type(DisplayType display_type) { 136 display_type_ = display_type; 137 } 138 139 private: 140 gfx::ImageSkia icon_; 141 142 base::string16 title_; 143 Tags title_tags_; 144 145 base::string16 details_; 146 Tags details_tags_; 147 148 std::string id_; 149 double relevance_; 150 DisplayType display_type_; 151 152 Actions actions_; 153 154 bool is_installing_; 155 int percent_downloaded_; 156 157 ObserverList<SearchResultObserver> observers_; 158 159 DISALLOW_COPY_AND_ASSIGN(SearchResult); 160 }; 161 162 } // namespace app_list 163 164 #endif // UI_APP_LIST_SEARCH_RESULT_H_ 165