Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: chrome/browser/chromeos/input_method/candidate_window.cc

Issue 5444001: Speed up rendering of the input method candidate window. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: minor cleanup Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "chrome/browser/chromeos/input_method/candidate_window.h" 5 #include "chrome/browser/chromeos/input_method/candidate_window.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 shortcut_label->SetText( 229 shortcut_label->SetText(
230 CreateShortcutText(i, lookup_table.orientation)); 230 CreateShortcutText(i, lookup_table.orientation));
231 shortcut_column_width = 231 shortcut_column_width =
232 std::max(shortcut_column_width, 232 std::max(shortcut_column_width,
233 wrapped_shortcut_label->GetPreferredSize().width()); 233 wrapped_shortcut_label->GetPreferredSize().width());
234 } 234 }
235 235
236 return shortcut_column_width; 236 return shortcut_column_width;
237 } 237 }
238 238
239 // Computes the page index. For instance, if the page size is 9, and the
240 // cursor is pointing to 13th candidate, the page index will be 1 (2nd
241 // page, as the index is zero-origin). Returns -1 on error.
242 int ComputePageIndex(const chromeos::InputMethodLookupTable& lookup_table) {
243 if (lookup_table.page_size > 0)
244 return lookup_table.cursor_absolute_index / lookup_table.page_size;
245 return -1;
246 }
247
239 // Computes candidate column width. 248 // Computes candidate column width.
240 int ComputeCandidateColumnWidth( 249 int ComputeCandidateColumnWidth(
241 const chromeos::InputMethodLookupTable& lookup_table) { 250 const chromeos::InputMethodLookupTable& lookup_table) {
242 int candidate_column_width = 0; 251 int candidate_column_width = 0;
243 scoped_ptr<views::Label> candidate_label( 252 scoped_ptr<views::Label> candidate_label(
244 CreateCandidateLabel(lookup_table.orientation)); 253 CreateCandidateLabel(lookup_table.orientation));
245 254
246 // Compute the start index of |lookup_table_|. 255 // Compute the start index of |lookup_table_|.
247 const int current_page_index = 256 const int current_page_index = ComputePageIndex(lookup_table);
248 lookup_table.cursor_absolute_index / lookup_table.page_size; 257 if (current_page_index < 0)
258 return 0;
249 const size_t start_from = current_page_index * lookup_table.page_size; 259 const size_t start_from = current_page_index * lookup_table.page_size;
250 260
251 // Compute the max width in candidate labels. 261 // Compute the max width in candidate labels.
252 // We'll create temporary candidate labels, and choose the largest width. 262 // We'll create temporary candidate labels, and choose the largest width.
253 for (size_t i = 0; i < lookup_table.candidates.size(); ++i) { 263 for (size_t i = 0; i < lookup_table.candidates.size(); ++i) {
254 const size_t index = start_from + i; 264 const size_t index = start_from + i;
255 265
256 candidate_label->SetText( 266 candidate_label->SetText(
257 UTF8ToWide(lookup_table.candidates[index])); 267 UTF8ToWide(lookup_table.candidates[index]));
258 candidate_column_width = 268 candidate_column_width =
259 std::max(candidate_column_width, 269 std::max(candidate_column_width,
260 candidate_label->GetPreferredSize().width()); 270 candidate_label->GetPreferredSize().width());
261 } 271 }
262 272
263 return candidate_column_width; 273 return candidate_column_width;
264 } 274 }
265 275
266 // Computes annotation column width. 276 // Computes annotation column width.
267 int ComputeAnnotationColumnWidth( 277 int ComputeAnnotationColumnWidth(
268 const chromeos::InputMethodLookupTable& lookup_table) { 278 const chromeos::InputMethodLookupTable& lookup_table) {
269 int annotation_column_width = 0; 279 int annotation_column_width = 0;
270 scoped_ptr<views::Label> annotation_label( 280 scoped_ptr<views::Label> annotation_label(
271 CreateAnnotationLabel(lookup_table.orientation)); 281 CreateAnnotationLabel(lookup_table.orientation));
272 282
273 // Compute the start index of |lookup_table_|. 283 // Compute the start index of |lookup_table_|.
274 const int current_page_index = 284 const int current_page_index = ComputePageIndex(lookup_table);
275 lookup_table.cursor_absolute_index / lookup_table.page_size; 285 if (current_page_index < 0)
286 return 0;
276 const size_t start_from = current_page_index * lookup_table.page_size; 287 const size_t start_from = current_page_index * lookup_table.page_size;
277 288
278 // Compute max width in annotation labels. 289 // Compute max width in annotation labels.
279 // We'll create temporary annotation labels, and choose the largest width. 290 // We'll create temporary annotation labels, and choose the largest width.
280 for (size_t i = 0; i < lookup_table.annotations.size(); ++i) { 291 for (size_t i = 0; i < lookup_table.annotations.size(); ++i) {
281 const size_t index = start_from + i; 292 const size_t index = start_from + i;
282 293
283 annotation_label->SetText( 294 annotation_label->SetText(
284 UTF8ToWide(lookup_table.annotations[index])); 295 UTF8ToWide(lookup_table.annotations[index]));
285 annotation_column_width = 296 annotation_column_width =
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 349
339 // Hides the auxiliary text. 350 // Hides the auxiliary text.
340 void HideAuxiliaryText(); 351 void HideAuxiliaryText();
341 352
342 // Shows the auxiliary text. 353 // Shows the auxiliary text.
343 void ShowAuxiliaryText(); 354 void ShowAuxiliaryText();
344 355
345 // Updates the auxiliary text. 356 // Updates the auxiliary text.
346 void UpdateAuxiliaryText(const std::string& utf8_text); 357 void UpdateAuxiliaryText(const std::string& utf8_text);
347 358
359 // Returns true if we should update candidate views in the window. For
360 // instance, if we are going to show the same candidates as before, we
361 // don't have to update candidate views. This happens when the user just
362 // moves the cursor in the same page in the candidate window.
363 bool ShouldUpdateCandidateViews(
364 const InputMethodLookupTable& previous_table,
365 const InputMethodLookupTable& current_table);
366
348 // Updates candidates of the candidate window from |lookup_table|. 367 // Updates candidates of the candidate window from |lookup_table|.
349 // Candidates are arranged per |orientation|. 368 // Candidates are arranged per |orientation|.
350 void UpdateCandidates(const InputMethodLookupTable& lookup_table); 369 void UpdateCandidates(const InputMethodLookupTable& lookup_table);
351 370
352 // Resizes the parent frame and schedules painting. This needs to be 371 // Resizes the parent frame and schedules painting. This needs to be
353 // called when the visible contents of the candidate window are 372 // called when the visible contents of the candidate window are
354 // modified. 373 // modified.
355 void ResizeAndSchedulePaint(); 374 void ResizeAndSchedulePaint();
356 375
357 // Returns the horizontal offset used for placing the vertical candidate 376 // Returns the horizontal offset used for placing the vertical candidate
(...skipping 17 matching lines...) Expand all
375 // Creates the footer area, where we show status information. 394 // Creates the footer area, where we show status information.
376 // For instance, we show a cursor position like 2/19. 395 // For instance, we show a cursor position like 2/19.
377 views::View* CreateFooterArea(); 396 views::View* CreateFooterArea();
378 397
379 // Creates the header area, where we show auxiliary text. 398 // Creates the header area, where we show auxiliary text.
380 views::View* CreateHeaderArea(); 399 views::View* CreateHeaderArea();
381 400
382 // The lookup table (candidates). 401 // The lookup table (candidates).
383 InputMethodLookupTable lookup_table_; 402 InputMethodLookupTable lookup_table_;
384 403
385 // Zero-origin index of the current page. If the cursor is on the first
386 // page, the value will be 0.
387 int current_page_index_;
388
389 // The index in the current page of the candidate currently being selected. 404 // The index in the current page of the candidate currently being selected.
390 int selected_candidate_index_in_page_; 405 int selected_candidate_index_in_page_;
391 406
392 // The observers of the object. 407 // The observers of the object.
393 ObserverList<Observer> observers_; 408 ObserverList<Observer> observers_;
394 409
395 // The parent frame. 410 // The parent frame.
396 views::Widget* parent_frame_; 411 views::Widget* parent_frame_;
397 412
398 // Views created in the class will be part of tree of |this|, so these 413 // Views created in the class will be part of tree of |this|, so these
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 void CandidateView::OnMouseReleased(const views::MouseEvent& event, 704 void CandidateView::OnMouseReleased(const views::MouseEvent& event,
690 bool canceled) { 705 bool canceled) {
691 // Commit the current candidate unless it's canceled. 706 // Commit the current candidate unless it's canceled.
692 if (!canceled) { 707 if (!canceled) {
693 parent_candidate_window_->CommitCandidate(); 708 parent_candidate_window_->CommitCandidate();
694 } 709 }
695 } 710 }
696 711
697 CandidateWindowView::CandidateWindowView( 712 CandidateWindowView::CandidateWindowView(
698 views::Widget* parent_frame) 713 views::Widget* parent_frame)
699 : current_page_index_(0), 714 : selected_candidate_index_in_page_(0),
700 selected_candidate_index_in_page_(0),
701 parent_frame_(parent_frame), 715 parent_frame_(parent_frame),
702 candidate_area_(NULL), 716 candidate_area_(NULL),
703 footer_area_(NULL), 717 footer_area_(NULL),
704 header_area_(NULL), 718 header_area_(NULL),
705 header_label_(NULL), 719 header_label_(NULL),
706 footer_label_(NULL), 720 footer_label_(NULL),
707 previous_shortcut_column_width_(0), 721 previous_shortcut_column_width_(0),
708 previous_candidate_column_width_(0), 722 previous_candidate_column_width_(0),
709 previous_annotation_column_width_(0) { 723 previous_annotation_column_width_(0) {
710 } 724 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 ResizeAndSchedulePaint(); 784 ResizeAndSchedulePaint();
771 } 785 }
772 786
773 void CandidateWindowView::UpdateAuxiliaryText(const std::string& utf8_text) { 787 void CandidateWindowView::UpdateAuxiliaryText(const std::string& utf8_text) {
774 views::Label* target_label = ( 788 views::Label* target_label = (
775 lookup_table_.orientation == InputMethodLookupTable::kHorizontal ? 789 lookup_table_.orientation == InputMethodLookupTable::kHorizontal ?
776 header_label_ : footer_label_); 790 header_label_ : footer_label_);
777 target_label->SetText(UTF8ToWide(utf8_text)); 791 target_label->SetText(UTF8ToWide(utf8_text));
778 } 792 }
779 793
794 bool CandidateWindowView::ShouldUpdateCandidateViews(
795 const InputMethodLookupTable& previous_table,
796 const InputMethodLookupTable& current_table) {
797 // Check if most table contents are identical.
798 if (previous_table.page_size == current_table.page_size &&
799 previous_table.orientation == current_table.orientation &&
800 previous_table.candidates == current_table.candidates &&
801 previous_table.labels == current_table.labels &&
802 previous_table.annotations == current_table.annotations &&
803 // Check if the page indexes are identical.
804 ComputePageIndex(previous_table) == ComputePageIndex(current_table)) {
805 // If all of the conditions are met, we don't have to update candidate
806 // views.
807 return false;
808 }
809 return true;
810 }
811
780 void CandidateWindowView::UpdateCandidates( 812 void CandidateWindowView::UpdateCandidates(
781 const InputMethodLookupTable& lookup_table) { 813 const InputMethodLookupTable& lookup_table) {
Yusuke Sato 2010/12/01 22:39:04 Using lookup_table_ and lookup_table at the same t
satorux1 2010/12/02 02:13:07 Agreed. Done.
782 // Initialize candidate views if necessary. 814 const bool should_update = ShouldUpdateCandidateViews(lookup_table_,
783 MaybeInitializeCandidateViews(lookup_table); 815 lookup_table);
816 // Updating the candidate views is expensive. We'll skip this if possible.
817 if (should_update) {
818 // Initialize candidate views if necessary.
819 MaybeInitializeCandidateViews(lookup_table);
784 820
785 // In MaybeInitializeCandidateViews(), 821 // Compute the index of the current page.
786 // |lookup_table| values and |lookup_table_| values are compared, 822 const int current_page_index = ComputePageIndex(lookup_table);
787 // so this substitution is needed after the function. 823 if (current_page_index < 0) {
824 LOG(ERROR) << "Invalid lookup_table: " << lookup_table.ToString();
825 return;
826 }
827
828 // Update the candidates in the current page.
829 const size_t start_from = current_page_index * lookup_table.page_size;
830
831 // In some cases, engines send empty shortcut labels. For instance,
832 // ibus-mozc sends empty labels when they show suggestions. In this
833 // case, we should not show shortcut labels.
834 const bool no_shortcut_mode = (start_from < lookup_table.labels.size() &&
835 lookup_table.labels[start_from] == "");
836 for (size_t i = 0; i < candidate_views_.size(); ++i) {
837 const size_t index_in_page = i;
838 const size_t candidate_index = start_from + index_in_page;
839 CandidateView* candidate_view = candidate_views_[index_in_page];
840 // Set the shortcut text.
841 if (no_shortcut_mode) {
842 candidate_view->SetShortcutText(L"");
843 } else {
844 // At this moment, we don't use labels sent from engines for UX
845 // reasons. First, we want to show shortcut labels in empty rows
846 // (ex. show 6, 7, 8, ... in empty rows when the number of
847 // candidates is 5). Second, we want to add a period after each
848 // shortcut label when the candidate window is horizontal.
849 candidate_view->SetShortcutText(
850 CreateShortcutText(i, lookup_table.orientation));
851 }
852 // Set the candidate text.
853 if (candidate_index < lookup_table.candidates.size() &&
854 candidate_index < lookup_table.annotations.size()) {
855 candidate_view->SetCandidateText(
856 UTF8ToWide(lookup_table.candidates[candidate_index]));
857 candidate_view->SetAnnotationText(
858 UTF8ToWide(lookup_table.annotations[candidate_index]));
859 candidate_view->SetRowEnabled(true);
860 } else {
861 // Disable the empty row.
862 candidate_view->SetCandidateText(L"");
863 candidate_view->SetAnnotationText(L"");
864 candidate_view->SetRowEnabled(false);
865 }
866 }
867 }
788 lookup_table_ = lookup_table; 868 lookup_table_ = lookup_table;
789 869
790 // Compute the index of the current page. 870 // Select the current candidate in the page.
791 current_page_index_ = 871 const int current_candidate_in_page =
792 lookup_table.cursor_absolute_index / lookup_table.page_size;
793
794 // Update the candidates in the current page.
795 const size_t start_from = current_page_index_ * lookup_table.page_size;
796
797 // In some cases, engines send empty shortcut labels. For instance,
798 // ibus-mozc sends empty labels when they show suggestions. In this
799 // case, we should not show shortcut labels.
800 const bool no_shortcut_mode = (start_from < lookup_table_.labels.size() &&
801 lookup_table_.labels[start_from] == "");
802 for (size_t i = 0; i < candidate_views_.size(); ++i) {
803 const size_t index_in_page = i;
804 const size_t candidate_index = start_from + index_in_page;
805 CandidateView* candidate_view = candidate_views_[index_in_page];
806 // Set the shortcut text.
807 if (no_shortcut_mode) {
808 candidate_view->SetShortcutText(L"");
809 } else {
810 // At this moment, we don't use labels sent from engines for UX
811 // reasons. First, we want to show shortcut labels in empty rows
812 // (ex. show 6, 7, 8, ... in empty rows when the number of
813 // candidates is 5). Second, we want to add a period after each
814 // shortcut label when the candidate window is horizontal.
815 candidate_view->SetShortcutText(
816 CreateShortcutText(i, lookup_table_.orientation));
817 }
818 // Set the candidate text.
819 if (candidate_index < lookup_table_.candidates.size() &&
820 candidate_index < lookup_table_.annotations.size()) {
821 candidate_view->SetCandidateText(
822 UTF8ToWide(lookup_table_.candidates[candidate_index]));
823 candidate_view->SetAnnotationText(
824 UTF8ToWide(lookup_table_.annotations[candidate_index]));
825 candidate_view->SetRowEnabled(true);
826 } else {
827 // Disable the empty row.
828 candidate_view->SetCandidateText(L"");
829 candidate_view->SetAnnotationText(L"");
830 candidate_view->SetRowEnabled(false);
831 }
832 }
833
834 // Select the first candidate candidate in the page.
835 const int first_candidate_in_page =
836 lookup_table.cursor_absolute_index % lookup_table.page_size; 872 lookup_table.cursor_absolute_index % lookup_table.page_size;
837 SelectCandidateAt(first_candidate_in_page); 873 SelectCandidateAt(current_candidate_in_page);
838 } 874 }
839 875
840 void CandidateWindowView::MaybeInitializeCandidateViews( 876 void CandidateWindowView::MaybeInitializeCandidateViews(
841 const InputMethodLookupTable& lookup_table) { 877 const InputMethodLookupTable& lookup_table) {
842 const InputMethodLookupTable::Orientation orientation = 878 const InputMethodLookupTable::Orientation orientation =
843 lookup_table.orientation; 879 lookup_table.orientation;
844 const int page_size = lookup_table.page_size; 880 const int page_size = lookup_table.page_size;
845 881
846 // Current column width. 882 // Current column width.
847 int shortcut_column_width = 0; 883 int shortcut_column_width = 0;
848 int candidate_column_width = 0; 884 int candidate_column_width = 0;
849 int annotation_column_width = 0; 885 int annotation_column_width = 0;
850 886
851 // If orientation is horizontal, don't need to compute width, 887 // If orientation is horizontal, don't need to compute width,
852 // because each label is left aligned. 888 // because each label is left aligned.
853 if (orientation == InputMethodLookupTable::kVertical) { 889 if (orientation == InputMethodLookupTable::kVertical) {
854 shortcut_column_width = ComputeShortcutColumnWidth(lookup_table); 890 shortcut_column_width = ComputeShortcutColumnWidth(lookup_table);
855 candidate_column_width = ComputeCandidateColumnWidth(lookup_table); 891 candidate_column_width = ComputeCandidateColumnWidth(lookup_table);
856 annotation_column_width = ComputeAnnotationColumnWidth(lookup_table); 892 annotation_column_width = ComputeAnnotationColumnWidth(lookup_table);
857 } 893 }
858 894
859 // If the requested number of views matches the number of current views, and 895 // If the requested number of views matches the number of current views, and
860 // previous and current column width are same, just reuse these. 896 // previous and current column width are same, just reuse these.
897 //
898 // Note that the early exit logic is not only useful for improving
899 // performance, but also necessary for the horizontal candidate window
900 // to be redrawn properly. If we get rid of the logic, the horizontal
901 // candidate window won't get redrawn properly for some reason when
902 // there is no size change. You can test this by removing "return" here
903 // and type "ni" with Pinyin input method.
861 if (static_cast<int>(candidate_views_.size()) == page_size && 904 if (static_cast<int>(candidate_views_.size()) == page_size &&
862 lookup_table_.orientation == orientation && 905 lookup_table_.orientation == orientation &&
863 previous_shortcut_column_width_ == shortcut_column_width && 906 previous_shortcut_column_width_ == shortcut_column_width &&
864 previous_candidate_column_width_ == candidate_column_width && 907 previous_candidate_column_width_ == candidate_column_width &&
865 previous_annotation_column_width_ == annotation_column_width) { 908 previous_annotation_column_width_ == annotation_column_width) {
866 return; 909 return;
867 } 910 }
868 911
869 // Update the previous column widths. 912 // Update the previous column widths.
870 previous_shortcut_column_width_ = shortcut_column_width; 913 previous_shortcut_column_width_ = shortcut_column_width;
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 kFooterBottomColor)); 1032 kFooterBottomColor));
990 1033
991 views::View* footer_area = new views::View; 1034 views::View* footer_area = new views::View;
992 footer_area->SetLayoutManager(new views::FillLayout); 1035 footer_area->SetLayoutManager(new views::FillLayout);
993 // Initialize the footer area with the place holder (i.e. show nothing). 1036 // Initialize the footer area with the place holder (i.e. show nothing).
994 footer_area->AddChildView(footer_area_place_holder_.get()); 1037 footer_area->AddChildView(footer_area_place_holder_.get());
995 return footer_area; 1038 return footer_area;
996 } 1039 }
997 1040
998 void CandidateWindowView::SelectCandidateAt(int index_in_page) { 1041 void CandidateWindowView::SelectCandidateAt(int index_in_page) {
999 int cursor_absolute_index = 1042 const int current_page_index = ComputePageIndex(lookup_table_);
1000 lookup_table_.page_size * current_page_index_ + index_in_page; 1043 if (current_page_index < 0) {
1044 LOG(ERROR) << "Invalid lookup_table: " << lookup_table_.ToString();
1045 return;
1046 }
1047
1048 const int cursor_absolute_index =
1049 lookup_table_.page_size * current_page_index + index_in_page;
1001 // Ignore click on out of range views. 1050 // Ignore click on out of range views.
1002 if (cursor_absolute_index < 0 || 1051 if (cursor_absolute_index < 0 ||
1003 cursor_absolute_index >= 1052 cursor_absolute_index >=
1004 static_cast<int>(lookup_table_.candidates.size())) { 1053 static_cast<int>(lookup_table_.candidates.size())) {
1005 return; 1054 return;
1006 } 1055 }
1007 1056
1008 // Remember the currently selected candidate index in the current page. 1057 // Remember the currently selected candidate index in the current page.
1009 selected_candidate_index_in_page_ = index_in_page; 1058 selected_candidate_index_in_page_ = index_in_page;
1010 1059
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 DLOG(INFO) << "Ignored set_cursor_location signal to prevent window shake"; 1253 DLOG(INFO) << "Ignored set_cursor_location signal to prevent window shake";
1205 return; 1254 return;
1206 } 1255 }
1207 1256
1208 // Remember the cursor location. 1257 // Remember the cursor location.
1209 controller->set_cursor_location(gfx::Rect(x, y, width, height)); 1258 controller->set_cursor_location(gfx::Rect(x, y, width, height));
1210 // Move the window per the cursor location. 1259 // Move the window per the cursor location.
1211 controller->MoveCandidateWindow( 1260 controller->MoveCandidateWindow(
1212 controller->cursor_location(), 1261 controller->cursor_location(),
1213 controller->candidate_window_->GetHorizontalOffset()); 1262 controller->candidate_window_->GetHorizontalOffset());
1214 // The call is needed to ensure that the candidate window is redrawed 1263 // The call is needed to ensure that the candidate window is redrawn
1215 // properly after the cursor location is changed. 1264 // properly after the cursor location is changed.
1216 controller->candidate_window_->ResizeAndSchedulePaint(); 1265 controller->candidate_window_->ResizeAndSchedulePaint();
1217 } 1266 }
1218 1267
1219 void CandidateWindowController::Impl::OnUpdateAuxiliaryText( 1268 void CandidateWindowController::Impl::OnUpdateAuxiliaryText(
1220 void* input_method_library, 1269 void* input_method_library,
1221 const std::string& utf8_text, 1270 const std::string& utf8_text,
1222 bool visible) { 1271 bool visible) {
1223 CandidateWindowController::Impl* controller = 1272 CandidateWindowController::Impl* controller =
1224 static_cast<CandidateWindowController::Impl*>(input_method_library); 1273 static_cast<CandidateWindowController::Impl*>(input_method_library);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1281 1330
1282 CandidateWindowController::~CandidateWindowController() { 1331 CandidateWindowController::~CandidateWindowController() {
1283 delete impl_; 1332 delete impl_;
1284 } 1333 }
1285 1334
1286 bool CandidateWindowController::Init() { 1335 bool CandidateWindowController::Init() {
1287 return impl_->Init(); 1336 return impl_->Init();
1288 } 1337 }
1289 1338
1290 } // namespace chromeos 1339 } // namespace chromeos
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698