search_result.h revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
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/base/models/list_model.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/range/range.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace ui {
19a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class MenuModel;
20a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
21a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace app_list {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SearchResultObserver;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SearchResult consists of an icon, title text and details text. Title and
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// details text can have tagged ranges that are displayed differently from
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// default style.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class APP_LIST_EXPORT SearchResult {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A tagged range in search result text.
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct APP_LIST_EXPORT Tag {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Similar to ACMatchClassification::Style, the style values are not
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mutually exclusive.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum Style {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NONE  = 0,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URL   = 1 << 0,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MATCH = 1 << 1,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DIM   = 1 << 2,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tag(int styles, size_t start, size_t end)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : styles(styles),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          range(start, end) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int styles;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::Range range;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<Tag> Tags;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Data representing an action that can be performed on this search result.
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // An action could be represented as an icon set or as a blue button with
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // a label. Icon set is chosen if label text is empty. Otherwise, a blue
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // button with the label text will be used.
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct APP_LIST_EXPORT Action {
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Action(const gfx::ImageSkia& base_image,
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           const gfx::ImageSkia& hover_image,
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           const gfx::ImageSkia& pressed_image,
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           const base::string16& tooltip_text);
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Action(const base::string16& label_text,
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           const base::string16& tooltip_text);
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ~Action();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::ImageSkia base_image;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::ImageSkia hover_image;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::ImageSkia pressed_image;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::string16 tooltip_text;
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::string16 label_text;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef std::vector<Action> Actions;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchResult();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SearchResult();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::ImageSkia& icon() const { return icon_; }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetIcon(const gfx::ImageSkia& icon);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::string16& title() const { return title_; }
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void set_title(const base::string16& title) { title_ = title;}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Tags& title_tags() const { return title_tags_; }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_title_tags(const Tags& tags) { title_tags_ = tags; }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const base::string16& details() const { return details_; }
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void set_details(const base::string16& details) { details_ = details; }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Tags& details_tags() const { return details_tags_; }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_details_tags(const Tags& tags) { details_tags_ = tags; }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const Actions& actions() const {
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return actions_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetActions(const Actions& sets);
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool is_installing() const { return is_installing_; }
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetIsInstalling(bool is_installing);
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int percent_downloaded() const { return percent_downloaded_; }
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetPercentDownloaded(int percent_downloaded);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void NotifyItemInstalled();
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void NotifyItemUninstalled();
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddObserver(SearchResultObserver* observer);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveObserver(SearchResultObserver* observer);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Returns the context menu model for this item, or NULL if there is currently
110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // no menu for the item (e.g. during install).
111a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Note the returned menu model is owned by this item.
112a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual ui::MenuModel* GetContextMenuModel();
113a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia icon_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::string16 title_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tags title_tags_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::string16 details_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tags details_tags_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Actions actions_;
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool is_installing_;
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int percent_downloaded_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<SearchResultObserver> observers_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SearchResult);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace app_list
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_APP_LIST_SEARCH_RESULT_H_
136