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
3 // found in the LICENSE file.
5 #include "ui/app_list/search_result_list_view.h"
10 #include "base/message_loop.h"
11 #include "ui/app_list/search_result_view.h"
12 #include "ui/app_list/search_result_list_view_delegate.h"
13 #include "ui/views/layout/box_layout.h"
17 const int kMaxResults
= 6;
23 SearchResultListView::SearchResultListView(
24 SearchResultListViewDelegate
* delegate
)
25 : delegate_(delegate
),
27 last_visible_index_(0),
29 ALLOW_THIS_IN_INITIALIZER_LIST(update_factory_(this)) {
31 new views::BoxLayout(views::BoxLayout::kVertical
, 0, 0, 0));
33 for (int i
= 0; i
< kMaxResults
; ++i
)
34 AddChildView(new SearchResultView(this, this));
37 SearchResultListView::~SearchResultListView() {
39 results_
->RemoveObserver(this);
42 void SearchResultListView::SetResults(AppListModel::SearchResults
* results
) {
44 results_
->RemoveObserver(this);
48 results_
->AddObserver(this);
53 void SearchResultListView::SetSelectedIndex(int selected_index
) {
54 if (selected_index_
== selected_index
)
57 if (selected_index_
>= 0)
58 GetResultViewAt(selected_index_
)->SchedulePaint();
60 selected_index_
= selected_index
;
62 if (selected_index_
>= 0)
63 GetResultViewAt(selected_index_
)->SchedulePaint();
66 bool SearchResultListView::IsResultViewSelected(
67 const SearchResultView
* result_view
) const {
68 if (selected_index_
< 0)
71 return static_cast<const SearchResultView
*>(child_at(selected_index_
)) ==
75 bool SearchResultListView::OnKeyPressed(const views::KeyEvent
& event
) {
76 switch (event
.key_code()) {
78 SetSelectedIndex(std::max(selected_index_
- 1, 0));
81 SetSelectedIndex(std::min(selected_index_
+ 1, last_visible_index_
));
84 if (selected_index_
>= 0)
85 ButtonPressed(GetResultViewAt(selected_index_
), event
);
93 SearchResultView
* SearchResultListView::GetResultViewAt(int index
) {
94 DCHECK(index
>= 0 && index
< child_count());
95 return static_cast<SearchResultView
*>(child_at(index
));
98 void SearchResultListView::Update() {
99 last_visible_index_
= 0;
100 for (size_t i
= 0; i
< static_cast<size_t>(child_count()); ++i
) {
101 SearchResultView
* result_view
= GetResultViewAt(i
);
102 if (i
< results_
->item_count()) {
103 result_view
->SetResult(results_
->GetItemAt(i
));
104 result_view
->SetVisible(true);
105 last_visible_index_
= i
;
107 result_view
->SetResult(NULL
);
108 result_view
->SetVisible(false);
111 if (selected_index_
> last_visible_index_
)
112 SetSelectedIndex(last_visible_index_
);
115 update_factory_
.InvalidateWeakPtrs();
118 void SearchResultListView::ScheduleUpdate() {
119 // When search results are added one by one, each addition generates an update
120 // request. Consolidates those update requests into one Update call.
121 if (!update_factory_
.HasWeakPtrs()) {
122 MessageLoop::current()->PostTask(
124 base::Bind(&SearchResultListView::Update
,
125 update_factory_
.GetWeakPtr()));
129 void SearchResultListView::ButtonPressed(views::Button
* sender
,
130 const views::Event
& event
) {
131 if (sender
->GetClassName() != SearchResultView::kViewClassName
)
135 const SearchResult
* result
=
136 static_cast<SearchResultView
*>(sender
)->result();
138 delegate_
->OpenResult(*result
, event
.flags());
142 void SearchResultListView::ListItemsAdded(size_t start
, size_t count
) {
146 void SearchResultListView::ListItemsRemoved(size_t start
, size_t count
) {
147 size_t last
= std::min(start
+ count
, static_cast<size_t>(child_count()));
148 for (size_t i
= start
; i
< last
; ++i
)
149 GetResultViewAt(i
)->SetResult(NULL
);
154 void SearchResultListView::ListItemsChanged(size_t start
, size_t count
) {
158 } // namespace app_list