1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/tile_item_view.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/app_list_constants.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/app_list_item.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/app_list_model.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/app_list_view_delegate.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/app_list/search_result.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/app_list_main_view.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/canvas.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/color_analysis.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/color_utils.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/background.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/controls/image_view.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/controls/label.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kTileSize = 90;
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kTileHorizontalPadding = 10;
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace app_list {
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TileItemView::TileItemView()
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : views::CustomButton(this),
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      item_(NULL),
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      icon_(new views::ImageView),
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      title_(new views::Label) {
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  views::BoxLayout* layout_manager = new views::BoxLayout(
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      views::BoxLayout::kVertical, kTileHorizontalPadding, 0, 0);
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_manager->set_main_axis_alignment(
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER);
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetLayoutManager(layout_manager);
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  icon_->SetImageSize(gfx::Size(kTileIconSize, kTileIconSize));
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  title_->SetAutoColorReadabilityEnabled(false);
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  title_->SetEnabledColor(kGridTitleColor);
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  title_->set_background(views::Background::CreateSolidBackground(
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      app_list::kContentsBackgroundColor));
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  title_->SetFontList(rb.GetFontList(kItemTextFontStyle));
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  title_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // When |item_| is NULL, the tile is invisible. Calling SetSearchResult with a
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // non-NULL item makes the tile visible.
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetVisible(false);
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddChildView(icon_);
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AddChildView(title_);
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TileItemView::~TileItemView() {
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (item_)
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    item_->RemoveObserver(this);
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TileItemView::SetSearchResult(SearchResult* item) {
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SetVisible(item != NULL);
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SearchResult* old_item = item_;
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (old_item)
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    old_item->RemoveObserver(this);
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item_ = item;
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!item)
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  item_->AddObserver(this);
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  title_->SetText(item_->title());
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Only refresh the icon if it's different from the old one. This prevents
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // flickering.
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (old_item == NULL ||
846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      !item->icon().BackedBySameObjectAs(old_item->icon())) {
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    OnIconChanged();
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size TileItemView::GetPreferredSize() const {
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return gfx::Size(kTileSize, kTileSize);
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void TileItemView::ButtonPressed(views::Button* sender,
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const ui::Event& event) {
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  item_->Open(event.flags());
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TileItemView::OnIconChanged() {
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  icon_->SetImage(item_->icon());
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TileItemView::OnResultDestroying() {
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (item_)
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    item_->RemoveObserver(this);
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  item_ = NULL;
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace app_list
109