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