OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/app_list/views/app_list_view.h" | 5 #include "ui/app_list/views/app_list_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 ::switches::kDisableDwmComposition)) { | 76 ::switches::kDisableDwmComposition)) { |
77 return false; | 77 return false; |
78 } | 78 } |
79 #elif defined(OS_LINUX) && !defined(OS_CHROMEOS) | 79 #elif defined(OS_LINUX) && !defined(OS_CHROMEOS) |
80 // Shadows are not supported on (non-ChromeOS) Linux. | 80 // Shadows are not supported on (non-ChromeOS) Linux. |
81 return false; | 81 return false; |
82 #endif | 82 #endif |
83 return true; | 83 return true; |
84 } | 84 } |
85 | 85 |
| 86 // This view forwards the focus to the search box widget by providing it as a |
| 87 // FocusTraversable when a focus search is provided. |
| 88 class SearchBoxFocusHost : public views::View { |
| 89 public: |
| 90 explicit SearchBoxFocusHost(views::Widget* search_box_widget) |
| 91 : search_box_widget_(search_box_widget) {} |
| 92 |
| 93 ~SearchBoxFocusHost() override {} |
| 94 |
| 95 views::FocusTraversable* GetFocusTraversable() override { |
| 96 return search_box_widget_; |
| 97 } |
| 98 |
| 99 private: |
| 100 views::Widget* search_box_widget_; |
| 101 |
| 102 DISALLOW_COPY_AND_ASSIGN(SearchBoxFocusHost); |
| 103 }; |
| 104 |
86 // The view for the App List overlay, which appears as a white rounded | 105 // The view for the App List overlay, which appears as a white rounded |
87 // rectangle with the given radius. | 106 // rectangle with the given radius. |
88 class AppListOverlayView : public views::View { | 107 class AppListOverlayView : public views::View { |
89 public: | 108 public: |
90 explicit AppListOverlayView(int corner_radius) | 109 explicit AppListOverlayView(int corner_radius) |
91 : corner_radius_(corner_radius) { | 110 : corner_radius_(corner_radius) { |
92 SetPaintToLayer(true); | 111 SetPaintToLayer(true); |
93 SetVisible(false); | 112 SetVisible(false); |
94 layer()->SetOpacity(0.0f); | 113 layer()->SetOpacity(0.0f); |
95 } | 114 } |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 DISALLOW_COPY_AND_ASSIGN(HideViewAnimationObserver); | 194 DISALLOW_COPY_AND_ASSIGN(HideViewAnimationObserver); |
176 }; | 195 }; |
177 | 196 |
178 //////////////////////////////////////////////////////////////////////////////// | 197 //////////////////////////////////////////////////////////////////////////////// |
179 // AppListView: | 198 // AppListView: |
180 | 199 |
181 AppListView::AppListView(AppListViewDelegate* delegate) | 200 AppListView::AppListView(AppListViewDelegate* delegate) |
182 : delegate_(delegate), | 201 : delegate_(delegate), |
183 app_list_main_view_(nullptr), | 202 app_list_main_view_(nullptr), |
184 speech_view_(nullptr), | 203 speech_view_(nullptr), |
| 204 search_box_focus_host_(nullptr), |
185 search_box_widget_(nullptr), | 205 search_box_widget_(nullptr), |
186 search_box_view_(nullptr), | 206 search_box_view_(nullptr), |
187 overlay_view_(nullptr), | 207 overlay_view_(nullptr), |
188 animation_observer_(new HideViewAnimationObserver()) { | 208 animation_observer_(new HideViewAnimationObserver()) { |
189 CHECK(delegate); | 209 CHECK(delegate); |
190 | 210 |
191 delegate_->AddObserver(this); | 211 delegate_->AddObserver(this); |
192 delegate_->GetSpeechUI()->AddObserver(this); | 212 delegate_->GetSpeechUI()->AddObserver(this); |
193 } | 213 } |
194 | 214 |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 search_box_widget_params.opacity = | 476 search_box_widget_params.opacity = |
457 views::Widget::InitParams::TRANSLUCENT_WINDOW; | 477 views::Widget::InitParams::TRANSLUCENT_WINDOW; |
458 | 478 |
459 // Create a widget for the SearchBoxView to live in. This allows the | 479 // Create a widget for the SearchBoxView to live in. This allows the |
460 // SearchBoxView to be on top of the custom launcher page's WebContents | 480 // SearchBoxView to be on top of the custom launcher page's WebContents |
461 // (otherwise the search box events will be captured by the WebContents). | 481 // (otherwise the search box events will be captured by the WebContents). |
462 search_box_widget_ = new views::Widget; | 482 search_box_widget_ = new views::Widget; |
463 search_box_widget_->Init(search_box_widget_params); | 483 search_box_widget_->Init(search_box_widget_params); |
464 search_box_widget_->SetContentsView(search_box_view_); | 484 search_box_widget_->SetContentsView(search_box_view_); |
465 | 485 |
| 486 // The search box will not naturally receive focus by itself (because it is in |
| 487 // a separate widget). Create this SearchBoxFocusHost in the main widget to |
| 488 // forward the focus search into to the search box. |
| 489 search_box_focus_host_ = new SearchBoxFocusHost(search_box_widget_); |
| 490 AddChildView(search_box_focus_host_); |
| 491 search_box_widget_->SetFocusTraversableParentView(search_box_focus_host_); |
| 492 search_box_widget_->SetFocusTraversableParent( |
| 493 GetWidget()->GetFocusTraversable()); |
| 494 |
466 #if defined(USE_AURA) | 495 #if defined(USE_AURA) |
467 // Mouse events on the search box shadow should not be captured. | 496 // Mouse events on the search box shadow should not be captured. |
468 aura::Window* window = search_box_widget_->GetNativeWindow(); | 497 aura::Window* window = search_box_widget_->GetNativeWindow(); |
469 window->SetEventTargeter(scoped_ptr<ui::EventTargeter>( | 498 window->SetEventTargeter(scoped_ptr<ui::EventTargeter>( |
470 new SearchBoxWindowTargeter(search_box_view_))); | 499 new SearchBoxWindowTargeter(search_box_view_))); |
471 #endif | 500 #endif |
472 | 501 |
473 app_list_main_view_->contents_view()->Layout(); | 502 app_list_main_view_->contents_view()->Layout(); |
474 } | 503 } |
475 | 504 |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
770 | 799 |
771 if (will_appear) { | 800 if (will_appear) { |
772 speech_view_->SetVisible(true); | 801 speech_view_->SetVisible(true); |
773 } else { | 802 } else { |
774 app_list_main_view_->SetVisible(true); | 803 app_list_main_view_->SetVisible(true); |
775 search_box_view_->search_box()->RequestFocus(); | 804 search_box_view_->search_box()->RequestFocus(); |
776 } | 805 } |
777 } | 806 } |
778 | 807 |
779 } // namespace app_list | 808 } // namespace app_list |
OLD | NEW |