15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ime/candidate_window.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <string> 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/logging.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/values.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace ui { 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace { 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// The default entry number of a page in CandidateWindow. 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDefaultPageSize = 9; 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CandidateWindow::CandidateWindow() 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : property_(new CandidateWindowProperty) { 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CandidateWindow::~CandidateWindow() { 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool CandidateWindow::IsEqual(const CandidateWindow& cw) const { 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (page_size() != cw.page_size() || 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) cursor_position() != cw.cursor_position() || 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) is_cursor_visible() != cw.is_cursor_visible() || 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) orientation() != cw.orientation() || 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) show_window_at_composition() != cw.show_window_at_composition() || 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_auxiliary_text_visible() != cw.is_auxiliary_text_visible() || 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) auxiliary_text() != cw.auxiliary_text() || 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) candidates_.size() != cw.candidates_.size()) 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < candidates_.size(); ++i) { 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const Entry& left = candidates_[i]; 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const Entry& right = cw.candidates_[i]; 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (left.value != right.value || 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) left.label != right.label || 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) left.annotation != right.annotation || 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) left.description_title != right.description_title || 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) left.description_body != right.description_body) 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void CandidateWindow::CopyFrom(const CandidateWindow& cw) { 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetProperty(cw.GetProperty()); 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) candidates_.clear(); 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) candidates_ = cw.candidates_; 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CandidateWindow::GetInfolistEntries( 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<ui::InfolistEntry>* infolist_entries, 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool* has_highlighted) const { 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(infolist_entries); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(has_highlighted); 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) infolist_entries->clear(); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *has_highlighted = false; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const size_t cursor_index_in_page = cursor_position() % page_size(); 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < candidates().size(); ++i) { 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CandidateWindow::Entry& candidate_entry = candidates()[i]; 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (candidate_entry.description_title.empty() && 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) candidate_entry.description_body.empty()) 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) continue; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InfolistEntry entry(candidate_entry.description_title, 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) candidate_entry.description_body); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (i == cursor_index_in_page) { 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entry.highlighted = true; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *has_highlighted = true; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) infolist_entries->push_back(entry); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// When the default values are changed, please modify 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// InputMethodEngineInterface::CandidateWindowProperty too. 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CandidateWindow::CandidateWindowProperty::CandidateWindowProperty() 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : page_size(kDefaultPageSize), 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) cursor_position(0), 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) is_cursor_visible(true), 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) is_vertical(false), 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) show_window_at_composition(false), 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_auxiliary_text_visible(false) { 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CandidateWindow::CandidateWindowProperty::~CandidateWindowProperty() { 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CandidateWindow::Entry::Entry() { 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CandidateWindow::Entry::~Entry() { 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace ui 104