15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_APP_LIST_SEARCH_RESULT_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_APP_LIST_SEARCH_RESULT_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h"
125e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/app_list/app_list_export.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/range/range.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace ui {
18a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class MenuModel;
19a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
20a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace app_list {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SearchResultObserver;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SearchResult consists of an icon, title text and details text. Title and
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// details text can have tagged ranges that are displayed differently from
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// default style.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class APP_LIST_EXPORT SearchResult {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A tagged range in search result text.
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct APP_LIST_EXPORT Tag {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Similar to ACMatchClassification::Style, the style values are not
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mutually exclusive.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum Style {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NONE  = 0,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URL   = 1 << 0,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MATCH = 1 << 1,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DIM   = 1 << 2,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tag(int styles, size_t start, size_t end)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : styles(styles),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          range(start, end) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int styles;
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    gfx::Range range;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<Tag> Tags;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Data representing an action that can be performed on this search result.
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // An action could be represented as an icon set or as a blue button with
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // a label. Icon set is chosen if label text is empty. Otherwise, a blue
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // button with the label text will be used.
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct APP_LIST_EXPORT Action {
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Action(const gfx::ImageSkia& base_image,
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           const gfx::ImageSkia& hover_image,
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           const gfx::ImageSkia& pressed_image,
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           const base::string16& tooltip_text);
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Action(const base::string16& label_text,
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           const base::string16& tooltip_text);
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ~Action();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::ImageSkia base_image;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::ImageSkia hover_image;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::ImageSkia pressed_image;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::string16 tooltip_text;
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 label_text;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef std::vector<Action> Actions;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchResult();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SearchResult();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::ImageSkia& icon() const { return icon_; }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetIcon(const gfx::ImageSkia& icon);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::string16& title() const { return title_; }
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void set_title(const base::string16& title) { title_ = title;}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Tags& title_tags() const { return title_tags_; }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_title_tags(const Tags& tags) { title_tags_ = tags; }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::string16& details() const { return details_; }
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void set_details(const base::string16& details) { details_ = details; }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Tags& details_tags() const { return details_tags_; }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_details_tags(const Tags& tags) { details_tags_ = tags; }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const std::string& id() const { return id_; }
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  double relevance() { return relevance_; }
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const Actions& actions() const {
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return actions_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetActions(const Actions& sets);
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool is_installing() const { return is_installing_; }
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetIsInstalling(bool is_installing);
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int percent_downloaded() const { return percent_downloaded_; }
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetPercentDownloaded(int percent_downloaded);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void NotifyItemInstalled();
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void NotifyItemUninstalled();
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddObserver(SearchResultObserver* observer);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveObserver(SearchResultObserver* observer);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Opens the result.
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void Open(int event_flags);
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Invokes a custom action on the result.
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void InvokeAction(int action_index, int event_flags);
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Returns the context menu model for this item, or NULL if there is currently
118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // no menu for the item (e.g. during install).
119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Note the returned menu model is owned by this item.
120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual ui::MenuModel* GetContextMenuModel();
121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected:
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void set_id(const std::string& id) { id_ = id; }
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void set_relevance(double relevance) { relevance_ = relevance; }
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia icon_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::string16 title_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tags title_tags_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::string16 details_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tags details_tags_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string id_;
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  double relevance_;
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Actions actions_;
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool is_installing_;
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int percent_downloaded_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<SearchResultObserver> observers_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SearchResult);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace app_list
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_APP_LIST_SEARCH_RESULT_H_
151