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)#ifndef UI_APP_LIST_VIEWS_SEARCH_BOX_VIEW_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define UI_APP_LIST_VIEWS_SEARCH_BOX_VIEW_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/app_list/search_box_model_observer.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/app_list/speech_ui_model_observer.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/views/controls/button/image_button.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/menu_button_listener.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield_controller.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/view.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageView;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MenuButton;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Textfield;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace app_list {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass AppListMenuViews;
263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass AppListModel;
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class AppListViewDelegate;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SearchBoxModel;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SearchBoxViewDelegate;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SearchBoxView consists of an icon and a Textfield. SearchBoxModel is its data
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// model that controls what icon to display, what placeholder text to use for
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Textfield. The text and selection model part could be set to change the
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contents and selection model of the Textfield.
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class APP_LIST_EXPORT SearchBoxView : public views::View,
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      public views::TextfieldController,
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      public views::ButtonListener,
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      public views::MenuButtonListener,
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      public SearchBoxModelObserver,
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      public SpeechUIModelObserver {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SearchBoxView(SearchBoxViewDelegate* delegate,
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                AppListViewDelegate* view_delegate);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SearchBoxView();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ModelChanged();
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool HasSearch() const;
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ClearSearch();
49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void InvalidateMenu();
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Textfield* search_box() { return search_box_; }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_contents_view(views::View* contents_view) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contents_view_ = contents_view;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View:
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMouseWheel(const ui::MouseWheelEvent& event) OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates model text and selection model with current Textfield info.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateModel();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fires query change notification.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyQueryChanged();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::TextfieldController:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ContentsChanged(views::Textfield* sender,
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               const base::string16& new_contents) OVERRIDE;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleKeyEvent(views::Textfield* sender,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const ui::KeyEvent& key_event) OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Overridden from views::ButtonListener:
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                             const ui::Event& event) OVERRIDE;
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::MenuButtonListener:
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnMenuButtonClicked(View* source,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const gfx::Point& point) OVERRIDE;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from SearchBoxModelObserver:
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void IconChanged() OVERRIDE;
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SpeechRecognitionButtonPropChanged() OVERRIDE;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void HintTextChanged() OVERRIDE;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SelectionModelChanged() OVERRIDE;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TextChanged() OVERRIDE;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Overridden from SpeechUIModelObserver:
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnSpeechRecognitionStateChanged(
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SpeechRecognitionState new_state) OVERRIDE;
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchBoxViewDelegate* delegate_;  // Not owned.
94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  AppListViewDelegate* view_delegate_;  // Not owned.
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AppListModel* model_;  // Owned by the profile-keyed service.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_ptr<AppListMenuViews> menu_;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ImageView* icon_view_;  // Owned by views hierarchy.
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  views::ImageButton* speech_button_;  // Owned by views hierarchy.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::MenuButton* menu_button_;  // Owned by views hierarchy.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Textfield* search_box_;  // Owned by views hierarchy.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* contents_view_;  // Owned by views hierarchy.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SearchBoxView);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace app_list
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // UI_APP_LIST_VIEWS_SEARCH_BOX_VIEW_H_
111