| Index: ui/app_list/search_result_view.cc
|
| diff --git a/ui/app_list/search_result_view.cc b/ui/app_list/search_result_view.cc
|
| deleted file mode 100644
|
| index 3753b9a8737805c41ff3a3ed58612668c569de58..0000000000000000000000000000000000000000
|
| --- a/ui/app_list/search_result_view.cc
|
| +++ /dev/null
|
| @@ -1,309 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "ui/app_list/search_result_view.h"
|
| -
|
| -#include "ui/app_list/app_list_constants.h"
|
| -#include "ui/app_list/search_result.h"
|
| -#include "ui/app_list/search_result_list_view.h"
|
| -#include "ui/gfx/canvas.h"
|
| -#include "ui/gfx/font.h"
|
| -#include "ui/gfx/image/image_skia_operations.h"
|
| -#include "ui/gfx/render_text.h"
|
| -#include "ui/views/controls/button/image_button.h"
|
| -#include "ui/views/controls/image_view.h"
|
| -
|
| -namespace {
|
| -
|
| -const int kPreferredWidth = 300;
|
| -const int kPreferredHeight = 52;
|
| -const int kIconDimension = 32;
|
| -const int kIconPadding = 14;
|
| -const int kIconViewWidth = kIconDimension + 2 * kIconPadding;
|
| -const int kTextTrailPadding = kIconPadding;
|
| -const int kBorderSize = 1;
|
| -
|
| -// Maximum dimensions of a search result's action icons.
|
| -const int kActionIconDimension = 24;
|
| -
|
| -// Total space (including padding) used for each action icon's button.
|
| -const int kActionButtonWidth = 32;
|
| -
|
| -// Extra margin at the right of the rightmost action icon.
|
| -const int kActionButtonRightMargin = 8;
|
| -
|
| -const SkColor kBorderColor = SkColorSetARGB(0x0F, 0, 0, 0);
|
| -
|
| -const SkColor kDefaultTextColor = SkColorSetRGB(0x33, 0x33, 0x33);
|
| -const SkColor kDimmedTextColor = SkColorSetRGB(0x96, 0x96, 0x96);
|
| -const SkColor kURLTextColor = SkColorSetRGB(0x00, 0x99, 0x33);
|
| -
|
| -const SkColor kSelectedBorderColor = kBorderColor;
|
| -const SkColor kSelectedBackgroundColor = SkColorSetARGB(0x0F, 0x4D, 0x90, 0xFE);
|
| -const SkColor kHoverAndPushedColor = SkColorSetARGB(0x05, 0, 0, 0);
|
| -
|
| -// A non-interactive image view to display result icon.
|
| -class IconView : public views::ImageView {
|
| - public:
|
| - IconView() : ImageView() {}
|
| - virtual ~IconView() {}
|
| -
|
| - private:
|
| - // views::View overrides:
|
| - virtual bool HitTestRect(const gfx::Rect& rect) const OVERRIDE {
|
| - return false;
|
| - }
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(IconView);
|
| -};
|
| -
|
| -// Creates a RenderText of given |text| and |styles|. Caller takes ownership
|
| -// of returned RenderText.
|
| -gfx::RenderText* CreateRenderText(const string16& text,
|
| - const app_list::SearchResult::Tags& tags) {
|
| - gfx::RenderText* render_text = gfx::RenderText::CreateInstance();
|
| - render_text->SetText(text);
|
| -
|
| - gfx::StyleRange default_style;
|
| - default_style.foreground = kDefaultTextColor;
|
| - render_text->set_default_style(default_style);
|
| - render_text->ApplyDefaultStyle();
|
| -
|
| - for (app_list::SearchResult::Tags::const_iterator it = tags.begin();
|
| - it != tags.end();
|
| - ++it) {
|
| - // NONE means default style so do nothing.
|
| - if (it->styles == app_list::SearchResult::Tag::NONE)
|
| - continue;
|
| -
|
| - gfx::StyleRange style;
|
| - style.range = it->range;
|
| -
|
| - if (it->styles & app_list::SearchResult::Tag::MATCH)
|
| - style.font_style = gfx::Font::BOLD;
|
| - if (it->styles & app_list::SearchResult::Tag::URL)
|
| - style.foreground = kURLTextColor;
|
| - if (it->styles & app_list::SearchResult::Tag::DIM)
|
| - style.foreground = kDimmedTextColor;
|
| -
|
| - render_text->ApplyStyleRange(style);
|
| - }
|
| -
|
| - return render_text;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace app_list {
|
| -
|
| -// static
|
| -const char SearchResultView::kViewClassName[] = "ui/app_list/SearchResultView";
|
| -
|
| -SearchResultView::SearchResultView(SearchResultListView* list_view,
|
| - SearchResultViewDelegate* delegate)
|
| - : views::CustomButton(this),
|
| - result_(NULL),
|
| - list_view_(list_view),
|
| - delegate_(delegate),
|
| - icon_(new IconView) {
|
| - AddChildView(icon_);
|
| -}
|
| -
|
| -SearchResultView::~SearchResultView() {
|
| - ClearResultNoRepaint();
|
| -}
|
| -
|
| -void SearchResultView::SetResult(SearchResult* result) {
|
| - ClearResultNoRepaint();
|
| -
|
| - result_ = result;
|
| - if (result_)
|
| - result_->AddObserver(this);
|
| -
|
| - OnIconChanged();
|
| - OnActionIconsChanged();
|
| - UpdateTitleText();
|
| - UpdateDetailsText();
|
| - SchedulePaint();
|
| -}
|
| -
|
| -void SearchResultView::ClearResultNoRepaint() {
|
| - if (result_)
|
| - result_->RemoveObserver(this);
|
| - result_ = NULL;
|
| -}
|
| -
|
| -void SearchResultView::UpdateTitleText() {
|
| - if (!result_ || result_->title().empty()) {
|
| - title_text_.reset();
|
| - } else {
|
| - title_text_.reset(CreateRenderText(result_->title(),
|
| - result_->title_tags()));
|
| - }
|
| -}
|
| -
|
| -void SearchResultView::UpdateDetailsText() {
|
| - if (!result_ || result_->details().empty()) {
|
| - details_text_.reset();
|
| - } else {
|
| - details_text_.reset(CreateRenderText(result_->details(),
|
| - result_->details_tags()));
|
| - }
|
| -}
|
| -
|
| -std::string SearchResultView::GetClassName() const {
|
| - return kViewClassName;
|
| -}
|
| -
|
| -gfx::Size SearchResultView::GetPreferredSize() {
|
| - return gfx::Size(kPreferredWidth, kPreferredHeight);
|
| -}
|
| -
|
| -void SearchResultView::Layout() {
|
| - gfx::Rect rect(GetContentsBounds());
|
| - if (rect.IsEmpty())
|
| - return;
|
| -
|
| - gfx::Rect icon_bounds(rect);
|
| - icon_bounds.set_width(kIconViewWidth);
|
| - icon_bounds.Inset(kIconPadding, (rect.height() - kIconDimension) / 2);
|
| - icon_bounds.Intersect(rect);
|
| - icon_->SetBoundsRect(icon_bounds);
|
| -
|
| - size_t num_buttons = action_buttons_.size();
|
| - for (size_t i = 0; i < num_buttons; ++i) {
|
| - views::ImageButton* button = action_buttons_[i];
|
| - gfx::Rect button_bounds(
|
| - rect.right() - kActionButtonRightMargin -
|
| - (num_buttons - i) * kActionButtonWidth,
|
| - (rect.y() + rect.height() - kActionIconDimension) / 2,
|
| - kActionButtonWidth, kActionIconDimension);
|
| - button->SetBoundsRect(button_bounds);
|
| - }
|
| -}
|
| -
|
| -void SearchResultView::OnPaint(gfx::Canvas* canvas) {
|
| - gfx::Rect rect(GetContentsBounds());
|
| - if (rect.IsEmpty())
|
| - return;
|
| -
|
| - gfx::Rect content_rect(rect);
|
| - content_rect.set_height(rect.height() - kBorderSize);
|
| -
|
| - canvas->FillRect(content_rect, kContentsBackgroundColor);
|
| -
|
| - bool selected = list_view_->IsResultViewSelected(this);
|
| - if (selected) {
|
| - canvas->FillRect(content_rect, kSelectedBackgroundColor);
|
| - } else if (state() == STATE_HOVERED || state() == STATE_PRESSED) {
|
| - canvas->FillRect(content_rect, kHoverAndPushedColor);
|
| - }
|
| -
|
| - gfx::Rect border_bottom = gfx::SubtractRects(rect, content_rect);
|
| - canvas->FillRect(border_bottom,
|
| - selected ? kSelectedBorderColor : kBorderColor);
|
| -
|
| - gfx::Rect text_bounds(rect);
|
| - text_bounds.set_x(kIconViewWidth);
|
| - text_bounds.set_width(
|
| - rect.width() - kIconViewWidth - kTextTrailPadding -
|
| - action_buttons_.size() * kActionButtonWidth -
|
| - (!action_buttons_.empty() ? kActionButtonRightMargin : 0));
|
| - text_bounds.set_x(GetMirroredXWithWidthInView(text_bounds.x(),
|
| - text_bounds.width()));
|
| -
|
| - if (title_text_.get() && details_text_.get()) {
|
| - gfx::Size title_size(text_bounds.width(),
|
| - title_text_->GetStringSize().height());
|
| - gfx::Size details_size(text_bounds.width(),
|
| - details_text_->GetStringSize().height());
|
| - int total_height = title_size.height() + + details_size.height();
|
| - int y = text_bounds.y() + (text_bounds.height() - total_height) / 2;
|
| -
|
| - title_text_->SetDisplayRect(gfx::Rect(gfx::Point(text_bounds.x(), y),
|
| - title_size));
|
| - title_text_->Draw(canvas);
|
| -
|
| - y += title_size.height();
|
| - details_text_->SetDisplayRect(gfx::Rect(gfx::Point(text_bounds.x(), y),
|
| - details_size));
|
| - details_text_->Draw(canvas);
|
| - } else if (title_text_.get()) {
|
| - gfx::Size title_size(text_bounds.width(),
|
| - title_text_->GetStringSize().height());
|
| - gfx::Rect centered_title_rect(text_bounds);
|
| - centered_title_rect.ClampToCenteredSize(title_size);
|
| - title_text_->SetDisplayRect(centered_title_rect);
|
| - title_text_->Draw(canvas);
|
| - }
|
| -}
|
| -
|
| -void SearchResultView::ButtonPressed(views::Button* sender,
|
| - const ui::Event& event) {
|
| - if (sender == this) {
|
| - delegate_->SearchResultActivated(this, event);
|
| - return;
|
| - }
|
| -
|
| - for (size_t i = 0; i < action_buttons_.size(); ++i) {
|
| - if (sender == action_buttons_[i]) {
|
| - delegate_->SearchResultActionActivated(this, i, event);
|
| - return;
|
| - }
|
| - }
|
| - NOTREACHED() << "Got unexpected button press on " << sender;
|
| -}
|
| -
|
| -void SearchResultView::OnIconChanged() {
|
| - gfx::ImageSkia image(result_ ? result_->icon() : gfx::ImageSkia());
|
| - // Note this might leave the view with an old icon. But it is needed to avoid
|
| - // flash when a SearchResult's icon is loaded asynchronously. In this case, it
|
| - // looks nicer to keep the stale icon for a little while on screen instead of
|
| - // clearing it out. It should work correctly as long as the SearchResult does
|
| - // not forget to SetIcon when it's ready.
|
| - if (image.isNull())
|
| - return;
|
| -
|
| - // Scales down big icons but leave small ones unchanged.
|
| - if (image.width() > kIconDimension || image.height() > kIconDimension) {
|
| - image = gfx::ImageSkiaOperations::CreateResizedImage(
|
| - image,
|
| - skia::ImageOperations::RESIZE_BEST,
|
| - gfx::Size(kIconDimension, kIconDimension));
|
| - } else {
|
| - icon_->ResetImageSize();
|
| - }
|
| -
|
| - icon_->SetImage(image);
|
| -}
|
| -
|
| -void SearchResultView::OnActionIconsChanged() {
|
| - while (action_buttons_.size() >
|
| - (result_ ? result_->action_icons().size() : 0)) {
|
| - RemoveChildView(action_buttons_.back());
|
| - action_buttons_.pop_back();
|
| - }
|
| -
|
| - if (result_) {
|
| - while (action_buttons_.size() < result_->action_icons().size()) {
|
| - views::ImageButton* button = new views::ImageButton(this);
|
| - button->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
|
| - views::ImageButton::ALIGN_MIDDLE);
|
| - AddChildView(button);
|
| - action_buttons_.push_back(button);
|
| - }
|
| -
|
| - const SearchResult::ActionIconSets& icons = result_->action_icons();
|
| - for (size_t i = 0; i < icons.size(); ++i) {
|
| - const SearchResult::ActionIconSet& icon = icons.at(i);
|
| - views::ImageButton* button = action_buttons_[i];
|
| - button->SetImage(views::CustomButton::STATE_NORMAL, &icon.base_image);
|
| - button->SetImage(views::CustomButton::STATE_HOVERED, &icon.hover_image);
|
| - button->SetImage(views::CustomButton::STATE_PRESSED, &icon.pressed_image);
|
| - button->SetTooltipText(icon.tooltip_text);
|
| - }
|
| - }
|
| -}
|
| -
|
| -} // namespace app_list
|
|
|