Index: chrome/browser/chromeos/text_input/candidate_window.cc |
diff --git a/chrome/browser/chromeos/text_input/candidate_window.cc b/chrome/browser/chromeos/text_input/candidate_window.cc |
index c7cc055988fde5cbddd5bbaf9de493b177117722..cc351f5de815aa4dcf674ff26d584b01d196c3ce 100644 |
--- a/chrome/browser/chromeos/text_input/candidate_window.cc |
+++ b/chrome/browser/chromeos/text_input/candidate_window.cc |
@@ -163,8 +163,14 @@ class CandidateWindowView : public views::View { |
// The lookup table (candidates). |
ImeLookupTable lookup_table_; |
+ |
+ // Zero-origin index of the current page. If the cursor is on the first |
+ // page, the value will be 0. |
+ int current_page_index_; |
+ |
// The index in the current page of the candidate currently being selected. |
int selected_candidate_index_in_page_; |
+ |
// The observers of the object. |
ObserverList<Observer> observers_; |
@@ -457,6 +463,7 @@ void CandidateView::OnMouseReleased(const views::MouseEvent& event, |
CandidateWindowView::CandidateWindowView( |
views::Widget* parent_frame) |
: orientation_(kVertical), |
+ current_page_index_(0), |
selected_candidate_index_in_page_(0), |
parent_frame_(parent_frame), |
candidate_area_(NULL), |
@@ -533,9 +540,13 @@ void CandidateWindowView::UpdateCandidates( |
lookup_table_ = lookup_table; |
orientation_ = orientation; |
+ // Compute the index of the current page. |
+ current_page_index_ = |
+ lookup_table.cursor_absolute_index / lookup_table.page_size; |
+ |
// Update the candidates in the current page. |
- const int start_from = (lookup_table_.current_page_index * |
- lookup_table_.page_size); |
+ const int start_from = current_page_index_ * lookup_table.page_size; |
+ |
for (size_t i = 0; i < candidate_views_.size(); ++i) { |
const size_t index_in_page = i; |
const size_t candidate_index = start_from + index_in_page; |
@@ -548,9 +559,10 @@ void CandidateWindowView::UpdateCandidates( |
} |
} |
- // Select the current candidate per the lookup table. |
- // TODO(satorux): Rename cursor_row_index to cursor_index_in_page. |
- SelectCandidateAt(lookup_table_.cursor_row_index); |
+ // Select the first candidate candidate in the page. |
+ const int first_candidate_in_page = |
+ lookup_table.cursor_absolute_index % lookup_table.page_size; |
+ SelectCandidateAt(first_candidate_in_page); |
} |
void CandidateWindowView::MaybeInitializeCandidateViews( |
@@ -677,8 +689,12 @@ views::View* CandidateWindowView::CreateFooterArea() { |
} |
void CandidateWindowView::SelectCandidateAt(int index_in_page) { |
+ int cursor_absolute_index = |
+ lookup_table_.page_size * current_page_index_ + index_in_page; |
// Ignore click on out of range views. |
- if (index_in_page >= lookup_table_.num_candidates_in_current_page) { |
+ if (cursor_absolute_index < 0 || |
+ cursor_absolute_index >= |
+ static_cast<int>(lookup_table_.candidates.size())) { |
return; |
} |
@@ -695,15 +711,14 @@ void CandidateWindowView::SelectCandidateAt(int index_in_page) { |
candidate_views_[index_in_page]->Select(); |
// Update the cursor indexes in the model. |
- lookup_table_.cursor_row_index = index_in_page; |
- lookup_table_.cursor_absolute_index = |
- (lookup_table_.page_size * lookup_table_.current_page_index + |
- index_in_page); |
+ lookup_table_.cursor_absolute_index = cursor_absolute_index; |
// Update the footer area. |
footer_area_->RemoveAllChildViews(false); // Don't delete child views. |
if (orientation_ == kVertical) { |
// Show information about the cursor and the page in the footer area. |
+ // TODO(satorux): This only works with engines that return all |
+ // candidates (i.e. ibus-anthy). |
footer_label_->SetText( |
StringPrintf(L"%d/%d", |
lookup_table_.cursor_absolute_index + 1, |