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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/search_box_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "ui/app_list/app_list_model.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/app_list/app_list_switches.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/app_list/app_list_view_delegate.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/app_list/search_box_model.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/app_list/speech_ui_model.h"
14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "ui/app_list/views/app_list_menu_views.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/app_list/views/search_box_view_delegate.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/canvas.h"
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/resources/grit/ui_resources.h"
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/views/border.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/controls/button/image_button.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/menu_button.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/layout/box_layout.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace app_list {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kPadding = 14;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kPreferredWidth = 360;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kPreferredHeight = 48;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kHintTextColor = SkColorSetRGB(0xA0, 0xA0, 0xA0);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Menu offset relative to the bottom-right corner of the menu button.
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst int kMenuYOffsetFromButton = -4;
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst int kMenuXOffsetFromButton = -7;
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kBackgroundBorderWidth = 1;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kBackgroundBorderBottomWidth = 1;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kBackgroundBorderCornerRadius = 2;
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst SkColor kBackgroundBorderColor = SkColorSetRGB(0xEE, 0xEE, 0xEE);
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst SkColor kBackgroundBorderBottomColor = SkColorSetRGB(0xCC, 0xCC, 0xCC);
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A background that paints a solid white rounded rect with a thin grey border.
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SearchBoxBackground : public views::Background {
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SearchBoxBackground() {}
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~SearchBoxBackground() {}
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // views::Background overrides:
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void Paint(gfx::Canvas* canvas, views::View* view) const OVERRIDE {
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gfx::Rect bounds = view->GetContentsBounds();
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SkPaint paint;
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    paint.setFlags(SkPaint::kAntiAlias_Flag);
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    paint.setColor(kBackgroundBorderColor);
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    canvas->DrawRoundRect(bounds, kBackgroundBorderCornerRadius, paint);
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bounds.Inset(kBackgroundBorderWidth,
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 kBackgroundBorderWidth,
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 kBackgroundBorderWidth,
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 0);
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    paint.setColor(kBackgroundBorderBottomColor);
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    canvas->DrawRoundRect(bounds, kBackgroundBorderCornerRadius, paint);
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bounds.Inset(0, 0, 0, kBackgroundBorderBottomWidth);
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    paint.setColor(SK_ColorWHITE);
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    canvas->DrawRoundRect(bounds, kBackgroundBorderCornerRadius, paint);
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(SearchBoxBackground);
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SearchBoxView::SearchBoxView(SearchBoxViewDelegate* delegate,
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             AppListViewDelegate* view_delegate)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : delegate_(delegate),
81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      view_delegate_(view_delegate),
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      model_(NULL),
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      icon_view_(NULL),
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      speech_button_(NULL),
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      search_box_(new views::Textfield),
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      contents_view_(NULL) {
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (switches::IsExperimentalAppListEnabled()) {
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    set_background(new SearchBoxBackground());
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    icon_view_ = new views::ImageView;
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AddChildView(icon_view_);
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  views::BoxLayout* layout =
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new views::BoxLayout(views::BoxLayout::kHorizontal,
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           kPadding,
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           0,
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           kPadding - views::Textfield::kTextPadding);
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetLayoutManager(layout);
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layout->set_cross_axis_alignment(
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER);
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layout->set_minimum_cross_axis_size(kPreferredHeight);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  search_box_->SetBorder(views::Border::NullBorder());
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  search_box_->SetFontList(rb.GetFontList(ui::ResourceBundle::MediumFont));
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  search_box_->set_placeholder_text_color(kHintTextColor);
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  search_box_->set_controller(this);
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddChildView(search_box_);
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layout->SetFlexForView(search_box_, 1);
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS)
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  menu_button_ = new views::MenuButton(NULL, base::string16(), this, false);
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  menu_button_->SetBorder(views::Border::NullBorder());
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  menu_button_->SetImage(views::Button::STATE_NORMAL,
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         *rb.GetImageSkiaNamed(IDR_APP_LIST_TOOLS_NORMAL));
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  menu_button_->SetImage(views::Button::STATE_HOVERED,
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         *rb.GetImageSkiaNamed(IDR_APP_LIST_TOOLS_HOVER));
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  menu_button_->SetImage(views::Button::STATE_PRESSED,
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         *rb.GetImageSkiaNamed(IDR_APP_LIST_TOOLS_PRESSED));
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddChildView(menu_button_);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_delegate_->GetSpeechUI()->AddObserver(this);
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ModelChanged();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochSearchBoxView::~SearchBoxView() {
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_delegate_->GetSpeechUI()->RemoveObserver(this);
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  model_->search_box()->RemoveObserver(this);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SearchBoxView::ModelChanged() {
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (model_)
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    model_->search_box()->RemoveObserver(this);
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  model_ = view_delegate_->GetModel();
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DCHECK(model_);
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  model_->search_box()->AddObserver(this);
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  IconChanged();
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SpeechRecognitionButtonPropChanged();
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  HintTextChanged();
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool SearchBoxView::HasSearch() const {
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return !search_box_->text().empty();
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SearchBoxView::ClearSearch() {
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  search_box_->SetText(base::string16());
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_delegate_->AutoLaunchCanceled();
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Updates model and fires query changed manually because SetText() above
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // does not generate ContentsChanged() notification.
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateModel();
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotifyQueryChanged();
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
159558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid SearchBoxView::InvalidateMenu() {
160558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  menu_.reset();
161558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
162558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size SearchBoxView::GetPreferredSize() const {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size(kPreferredWidth, kPreferredHeight);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchBoxView::OnMouseWheel(const ui::MouseWheelEvent& event) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (contents_view_)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return contents_view_->OnMouseWheel(event);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBoxView::UpdateModel() {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporarily remove from observer to ignore notifications caused by us.
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  model_->search_box()->RemoveObserver(this);
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  model_->search_box()->SetText(search_box_->text());
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  model_->search_box()->SetSelectionModel(search_box_->GetSelectionModel());
1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  model_->search_box()->AddObserver(this);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBoxView::NotifyQueryChanged() {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(delegate_);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->QueryChanged(this);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBoxView::ContentsChanged(views::Textfield* sender,
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    const base::string16& new_contents) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateModel();
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_delegate_->AutoLaunchCanceled();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyQueryChanged();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchBoxView::HandleKeyEvent(views::Textfield* sender,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const ui::KeyEvent& key_event) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = false;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (contents_view_ && contents_view_->visible())
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handled = contents_view_->OnKeyPressed(key_event);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SearchBoxView::ButtonPressed(views::Button* sender,
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                  const ui::Event& event) {
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(speech_button_ && sender == speech_button_);
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  view_delegate_->ToggleSpeechRecognition();
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchBoxView::OnMenuButtonClicked(View* source, const gfx::Point& point) {
210558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!menu_)
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    menu_.reset(new AppListMenuViews(view_delegate_));
212558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const gfx::Point menu_location =
214ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      menu_button_->GetBoundsInScreen().bottom_right() +
215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      gfx::Vector2d(kMenuXOffsetFromButton, kMenuYOffsetFromButton);
216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  menu_->RunMenuAt(menu_button_, menu_location);
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBoxView::IconChanged() {
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (icon_view_)
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    icon_view_->SetImage(model_->search_box()->icon());
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SearchBoxView::SpeechRecognitionButtonPropChanged() {
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const SearchBoxModel::SpeechButtonProperty* speech_button_prop =
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      model_->search_box()->speech_button();
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (speech_button_prop) {
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!speech_button_) {
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      speech_button_ = new views::ImageButton(this);
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      AddChildView(speech_button_);
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (view_delegate_->GetSpeechUI()->state() ==
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SPEECH_RECOGNITION_HOTWORD_LISTENING) {
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      speech_button_->SetImage(
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          views::Button::STATE_NORMAL, &speech_button_prop->on_icon);
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      speech_button_->SetTooltipText(speech_button_prop->on_tooltip);
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else {
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      speech_button_->SetImage(
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          views::Button::STATE_NORMAL, &speech_button_prop->off_icon);
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      speech_button_->SetTooltipText(speech_button_prop->off_tooltip);
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (speech_button_) {
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // Deleting a view will detach it from its parent.
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      delete speech_button_;
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      speech_button_ = NULL;
248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBoxView::HintTextChanged() {
2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  search_box_->set_placeholder_text(model_->search_box()->hint_text());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBoxView::SelectionModelChanged() {
2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  search_box_->SelectSelectionModel(model_->search_box()->selection_model());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchBoxView::TextChanged() {
2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  search_box_->SetText(model_->search_box()->text());
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NotifyQueryChanged();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SearchBoxView::OnSpeechRecognitionStateChanged(
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SpeechRecognitionState new_state) {
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpeechRecognitionButtonPropChanged();
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SchedulePaint();
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace app_list
272