search_result.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/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)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace app_list {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SearchResultObserver;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SearchResult consists of an icon, title text and details text. Title and
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// details text can have tagged ranges that are displayed differently from
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// default style.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class APP_LIST_EXPORT SearchResult {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A tagged range in search result text.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Tag {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Similar to ACMatchClassification::Style, the style values are not
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mutually exclusive.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum Style {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NONE  = 0,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URL   = 1 << 0,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MATCH = 1 << 1,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DIM   = 1 << 2,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tag(int styles, size_t start, size_t end)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : styles(styles),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          range(start, end) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int styles;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::Range range;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<Tag> Tags;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A collection of images representing an action that can be performed on this
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // search result.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ActionIconSet {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ActionIconSet(const gfx::ImageSkia& base_image,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const gfx::ImageSkia& hover_image,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const gfx::ImageSkia& pressed_image,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const string16& tooltip_text);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~ActionIconSet();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::ImageSkia base_image;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::ImageSkia hover_image;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::ImageSkia pressed_image;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 tooltip_text;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<ActionIconSet> ActionIconSets;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchResult();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SearchResult();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::ImageSkia& icon() const { return icon_; }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetIcon(const gfx::ImageSkia& icon);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16& title() const { return title_; }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_title(const string16& title) { title_ = title;}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Tags& title_tags() const { return title_tags_; }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_title_tags(const Tags& tags) { title_tags_ = tags; }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16& details() const { return details_; }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_details(const string16& details) { details_ = details; }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Tags& details_tags() const { return details_tags_; }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_details_tags(const Tags& tags) { details_tags_ = tags; }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ActionIconSets& action_icons() const {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return action_icons_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetActionIcons(const ActionIconSets& sets);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddObserver(SearchResultObserver* observer);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveObserver(SearchResultObserver* observer);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia icon_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 title_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tags title_tags_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 details_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tags details_tags_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Optional list of icons representing additional actions that can be
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // performed on this result.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ActionIconSets action_icons_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<SearchResultObserver> observers_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SearchResult);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace app_list
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_APP_LIST_SEARCH_RESULT_H_
112