| Index: ui/app_list/views/search_result_view.cc
|
| diff --git a/ui/app_list/views/search_result_view.cc b/ui/app_list/views/search_result_view.cc
|
| deleted file mode 100644
|
| index de1f324da89d4b9b42c8344c3475489c032e057a..0000000000000000000000000000000000000000
|
| --- a/ui/app_list/views/search_result_view.cc
|
| +++ /dev/null
|
| @@ -1,358 +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/views/search_result_view.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "ui/app_list/app_list_constants.h"
|
| -#include "ui/app_list/search_result.h"
|
| -#include "ui/app_list/views/progress_bar_view.h"
|
| -#include "ui/app_list/views/search_result_actions_view.h"
|
| -#include "ui/app_list/views/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"
|
| -#include "ui/views/controls/menu/menu_runner.h"
|
| -
|
| -namespace app_list {
|
| -
|
| -namespace {
|
| -
|
| -const int kPreferredWidth = 300;
|
| -const int kPreferredHeight = 52;
|
| -const int kIconPadding = 14;
|
| -const int kTextTrailPadding = kIconPadding;
|
| -const int kBorderSize = 1;
|
| -
|
| -// Extra margin at the right of the rightmost action icon.
|
| -const int kActionButtonRightMargin = 8;
|
| -
|
| -int GetIconViewWidth() {
|
| - return kListIconSize + 2 * kIconPadding;
|
| -}
|
| -
|
| -// Creates a RenderText of given |text| and |styles|. Caller takes ownership
|
| -// of returned RenderText.
|
| -gfx::RenderText* CreateRenderText(const base::string16& text,
|
| - const SearchResult::Tags& tags) {
|
| - gfx::RenderText* render_text = gfx::RenderText::CreateInstance();
|
| - render_text->SetText(text);
|
| - render_text->SetColor(kResultDefaultTextColor);
|
| -
|
| - for (SearchResult::Tags::const_iterator it = tags.begin();
|
| - it != tags.end();
|
| - ++it) {
|
| - // NONE means default style so do nothing.
|
| - if (it->styles == SearchResult::Tag::NONE)
|
| - continue;
|
| -
|
| - if (it->styles & SearchResult::Tag::MATCH)
|
| - render_text->ApplyStyle(gfx::BOLD, true, it->range);
|
| - if (it->styles & SearchResult::Tag::DIM)
|
| - render_text->ApplyColor(kResultDimmedTextColor, it->range);
|
| - else if (it->styles & SearchResult::Tag::URL)
|
| - render_text->ApplyColor(kResultURLTextColor, it->range);
|
| - }
|
| -
|
| - return render_text;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// static
|
| -const char SearchResultView::kViewClassName[] = "ui/app_list/SearchResultView";
|
| -
|
| -SearchResultView::SearchResultView(SearchResultListView* list_view)
|
| - : views::CustomButton(this),
|
| - result_(NULL),
|
| - list_view_(list_view),
|
| - icon_(new views::ImageView),
|
| - actions_view_(new SearchResultActionsView(this)),
|
| - progress_bar_(new ProgressBarView) {
|
| - icon_->set_interactive(false);
|
| -
|
| - AddChildView(icon_);
|
| - AddChildView(actions_view_);
|
| - AddChildView(progress_bar_);
|
| - set_context_menu_controller(this);
|
| -}
|
| -
|
| -SearchResultView::~SearchResultView() {
|
| - ClearResultNoRepaint();
|
| -}
|
| -
|
| -void SearchResultView::SetResult(SearchResult* result) {
|
| - ClearResultNoRepaint();
|
| -
|
| - result_ = result;
|
| - if (result_)
|
| - result_->AddObserver(this);
|
| -
|
| - OnIconChanged();
|
| - OnActionsChanged();
|
| - UpdateTitleText();
|
| - UpdateDetailsText();
|
| - OnIsInstallingChanged();
|
| - OnPercentDownloadedChanged();
|
| - SchedulePaint();
|
| -}
|
| -
|
| -void SearchResultView::ClearResultNoRepaint() {
|
| - if (result_)
|
| - result_->RemoveObserver(this);
|
| - result_ = NULL;
|
| -}
|
| -
|
| -void SearchResultView::ClearSelectedAction() {
|
| - actions_view_->SetSelectedAction(-1);
|
| -}
|
| -
|
| -void SearchResultView::UpdateTitleText() {
|
| - if (!result_ || result_->title().empty()) {
|
| - title_text_.reset();
|
| - SetAccessibleName(base::string16());
|
| - } else {
|
| - title_text_.reset(CreateRenderText(result_->title(),
|
| - result_->title_tags()));
|
| - SetAccessibleName(result_->title());
|
| - }
|
| -}
|
| -
|
| -void SearchResultView::UpdateDetailsText() {
|
| - if (!result_ || result_->details().empty()) {
|
| - details_text_.reset();
|
| - } else {
|
| - details_text_.reset(CreateRenderText(result_->details(),
|
| - result_->details_tags()));
|
| - }
|
| -}
|
| -
|
| -const char* SearchResultView::GetClassName() const {
|
| - return kViewClassName;
|
| -}
|
| -
|
| -gfx::Size SearchResultView::GetPreferredSize() const {
|
| - 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(GetIconViewWidth());
|
| - icon_bounds.Inset(kIconPadding, (rect.height() - kListIconSize) / 2);
|
| - icon_bounds.Intersect(rect);
|
| - icon_->SetBoundsRect(icon_bounds);
|
| -
|
| - const int max_actions_width =
|
| - (rect.right() - kActionButtonRightMargin - icon_bounds.right()) / 2;
|
| - int actions_width = std::min(max_actions_width,
|
| - actions_view_->GetPreferredSize().width());
|
| -
|
| - gfx::Rect actions_bounds(rect);
|
| - actions_bounds.set_x(rect.right() - kActionButtonRightMargin - actions_width);
|
| - actions_bounds.set_width(actions_width);
|
| - actions_view_->SetBoundsRect(actions_bounds);
|
| -
|
| - const int progress_width = rect.width() / 5;
|
| - const int progress_height = progress_bar_->GetPreferredSize().height();
|
| - const gfx::Rect progress_bounds(
|
| - rect.right() - kActionButtonRightMargin - progress_width,
|
| - rect.y() + (rect.height() - progress_height) / 2,
|
| - progress_width,
|
| - progress_height);
|
| - progress_bar_->SetBoundsRect(progress_bounds);
|
| -}
|
| -
|
| -bool SearchResultView::OnKeyPressed(const ui::KeyEvent& event) {
|
| - // |result_| could be NULL when result list is changing.
|
| - if (!result_)
|
| - return false;
|
| -
|
| - switch (event.key_code()) {
|
| - case ui::VKEY_TAB: {
|
| - int new_selected = actions_view_->selected_action()
|
| - + (event.IsShiftDown() ? -1 : 1);
|
| - actions_view_->SetSelectedAction(new_selected);
|
| - return actions_view_->IsValidActionIndex(new_selected);
|
| - }
|
| - case ui::VKEY_RETURN: {
|
| - int selected = actions_view_->selected_action();
|
| - if (actions_view_->IsValidActionIndex(selected)) {
|
| - OnSearchResultActionActivated(selected, event.flags());
|
| - } else {
|
| - list_view_->SearchResultActivated(this, event.flags());
|
| - }
|
| - return true;
|
| - }
|
| - default:
|
| - break;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -void SearchResultView::ChildPreferredSizeChanged(views::View* child) {
|
| - Layout();
|
| -}
|
| -
|
| -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);
|
| -
|
| - const bool selected = list_view_->IsResultViewSelected(this);
|
| - const bool hover = state() == STATE_HOVERED || state() == STATE_PRESSED;
|
| - if (selected)
|
| - canvas->FillRect(content_rect, kSelectedColor);
|
| - else if (hover)
|
| - canvas->FillRect(content_rect, kHighlightedColor);
|
| - else
|
| - canvas->FillRect(content_rect, kContentsBackgroundColor);
|
| -
|
| - gfx::Rect border_bottom = gfx::SubtractRects(rect, content_rect);
|
| - canvas->FillRect(border_bottom, kResultBorderColor);
|
| -
|
| - gfx::Rect text_bounds(rect);
|
| - text_bounds.set_x(GetIconViewWidth());
|
| - if (actions_view_->visible()) {
|
| - text_bounds.set_width(
|
| - rect.width() - GetIconViewWidth() - kTextTrailPadding -
|
| - actions_view_->bounds().width() -
|
| - (actions_view_->has_children() ? kActionButtonRightMargin : 0));
|
| - } else {
|
| - text_bounds.set_width(rect.width() - GetIconViewWidth() -
|
| - kTextTrailPadding - progress_bar_->bounds().width() -
|
| - kActionButtonRightMargin);
|
| - }
|
| - text_bounds.set_x(GetMirroredXWithWidthInView(text_bounds.x(),
|
| - text_bounds.width()));
|
| -
|
| - if (title_text_ && details_text_) {
|
| - 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_) {
|
| - 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) {
|
| - DCHECK(sender == this);
|
| -
|
| - list_view_->SearchResultActivated(this, event.flags());
|
| -}
|
| -
|
| -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() > kListIconSize || image.height() > kListIconSize) {
|
| - image = gfx::ImageSkiaOperations::CreateResizedImage(
|
| - image,
|
| - skia::ImageOperations::RESIZE_BEST,
|
| - gfx::Size(kListIconSize, kListIconSize));
|
| - } else {
|
| - icon_->ResetImageSize();
|
| - }
|
| -
|
| - // Set the image to an empty image before we reset the image because
|
| - // since we're using the same backing store for our images, sometimes
|
| - // ImageView won't detect that we have a new image set due to the pixel
|
| - // buffer pointers remaining the same despite the image changing.
|
| - icon_->SetImage(gfx::ImageSkia());
|
| - icon_->SetImage(image);
|
| -}
|
| -
|
| -void SearchResultView::OnActionsChanged() {
|
| - actions_view_->SetActions(result_ ? result_->actions()
|
| - : SearchResult::Actions());
|
| -}
|
| -
|
| -void SearchResultView::OnIsInstallingChanged() {
|
| - const bool is_installing = result_ && result_->is_installing();
|
| - actions_view_->SetVisible(!is_installing);
|
| - progress_bar_->SetVisible(is_installing);
|
| -}
|
| -
|
| -void SearchResultView::OnPercentDownloadedChanged() {
|
| - progress_bar_->SetValue(result_ ? result_->percent_downloaded() / 100.0 : 0);
|
| -}
|
| -
|
| -void SearchResultView::OnItemInstalled() {
|
| - list_view_->OnSearchResultInstalled(this);
|
| -}
|
| -
|
| -void SearchResultView::OnItemUninstalled() {
|
| - list_view_->OnSearchResultUninstalled(this);
|
| -}
|
| -
|
| -void SearchResultView::OnSearchResultActionActivated(size_t index,
|
| - int event_flags) {
|
| - // |result_| could be NULL when result list is changing.
|
| - if (!result_)
|
| - return;
|
| -
|
| - DCHECK_LT(index, result_->actions().size());
|
| -
|
| - list_view_->SearchResultActionActivated(this, index, event_flags);
|
| -}
|
| -
|
| -void SearchResultView::ShowContextMenuForView(views::View* source,
|
| - const gfx::Point& point,
|
| - ui::MenuSourceType source_type) {
|
| - // |result_| could be NULL when result list is changing.
|
| - if (!result_)
|
| - return;
|
| -
|
| - ui::MenuModel* menu_model = result_->GetContextMenuModel();
|
| - if (!menu_model)
|
| - return;
|
| -
|
| - context_menu_runner_.reset(
|
| - new views::MenuRunner(menu_model, views::MenuRunner::HAS_MNEMONICS));
|
| - if (context_menu_runner_->RunMenuAt(GetWidget(),
|
| - NULL,
|
| - gfx::Rect(point, gfx::Size()),
|
| - views::MENU_ANCHOR_TOPLEFT,
|
| - source_type) ==
|
| - views::MenuRunner::MENU_DELETED)
|
| - return;
|
| -}
|
| -
|
| -} // namespace app_list
|
|
|