| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 views::GridLayout::FILL, views::GridLayout::FILL, | 112 views::GridLayout::FILL, views::GridLayout::FILL, |
| 113 1, views::GridLayout::USE_PREF, 0, 0); | 113 1, views::GridLayout::USE_PREF, 0, 0); |
| 114 layout->StartRow(0, 0); | 114 layout->StartRow(0, 0); |
| 115 | 115 |
| 116 // Add the view contents. | 116 // Add the view contents. |
| 117 layout->AddView(view); // |view| is owned by |wraper|, not |layout|. | 117 layout->AddView(view); // |view| is owned by |wraper|, not |layout|. |
| 118 return wrapper; | 118 return wrapper; |
| 119 } | 119 } |
| 120 | 120 |
| 121 // Creates shortcut text from the given index and the orientation. | 121 // Creates shortcut text from the given index and the orientation. |
| 122 std::wstring CreateShortcutText( | 122 string16 CreateShortcutText(int index, |
| 123 int index, | 123 InputMethodLookupTable::Orientation orientation) { |
| 124 InputMethodLookupTable::Orientation orientation) { | |
| 125 // Choose the character used for the shortcut label. | 124 // Choose the character used for the shortcut label. |
| 126 const wchar_t kShortcutCharacters[] = L"1234567890ABCDEF"; | 125 const char kShortcutCharacters[] = "1234567890ABCDEF"; |
| 127 // The default character should not be used but just in case. | 126 // The default character should not be used but just in case. |
| 128 wchar_t shortcut_character = L'?'; | 127 char shortcut_character = L'?'; |
| 129 // -1 to exclude the null character at the end. | 128 // -1 to exclude the null character at the end. |
| 130 if (index < static_cast<int>(arraysize(kShortcutCharacters) - 1)) { | 129 if (index < static_cast<int>(arraysize(kShortcutCharacters) - 1)) |
| 131 shortcut_character = kShortcutCharacters[index]; | 130 shortcut_character = kShortcutCharacters[index]; |
| 132 } | |
| 133 | 131 |
| 134 std::wstring shortcut_text; | 132 std::string shortcut_text(1, shortcut_character); |
| 135 if (orientation == InputMethodLookupTable::kVertical) { | 133 if (orientation != InputMethodLookupTable::kVertical) |
| 136 shortcut_text = base::StringPrintf(L"%lc", shortcut_character); | 134 shortcut_text += '.'; |
| 137 } else { | 135 return ASCIIToUTF16(shortcut_text); |
| 138 shortcut_text = base::StringPrintf(L"%lc.", shortcut_character); | |
| 139 } | |
| 140 | |
| 141 return shortcut_text; | |
| 142 } | 136 } |
| 143 | 137 |
| 144 // Creates the shortcut label, and returns it (never returns NULL). | 138 // Creates the shortcut label, and returns it (never returns NULL). |
| 145 // The label text is not set in this function. | 139 // The label text is not set in this function. |
| 146 views::Label* CreateShortcutLabel( | 140 views::Label* CreateShortcutLabel( |
| 147 InputMethodLookupTable::Orientation orientation) { | 141 InputMethodLookupTable::Orientation orientation) { |
| 148 // Create the shortcut label. The label will be owned by | 142 // Create the shortcut label. The label will be owned by |
| 149 // |wrapped_shortcut_label|, hence it's deleted when | 143 // |wrapped_shortcut_label|, hence it's deleted when |
| 150 // |wrapped_shortcut_label| is deleted. | 144 // |wrapped_shortcut_label| is deleted. |
| 151 views::Label* shortcut_label = new views::Label; | 145 views::Label* shortcut_label = new views::Label; |
| 152 | 146 |
| 153 if (orientation == InputMethodLookupTable::kVertical) { | 147 if (orientation == InputMethodLookupTable::kVertical) { |
| 154 shortcut_label->SetFont( | 148 shortcut_label->SetFont( |
| 155 shortcut_label->font().DeriveFont(kFontSizeDelta, gfx::Font::BOLD)); | 149 shortcut_label->font().DeriveFont(kFontSizeDelta, gfx::Font::BOLD)); |
| 156 } else { | 150 } else { |
| 157 shortcut_label->SetFont( | 151 shortcut_label->SetFont( |
| 158 shortcut_label->font().DeriveFont(kFontSizeDelta)); | 152 shortcut_label->font().DeriveFont(kFontSizeDelta)); |
| 159 } | 153 } |
| 160 // TODO(satorux): Maybe we need to use language specific fonts for | 154 // TODO(satorux): Maybe we need to use language specific fonts for |
| 161 // candidate_label, like Chinese font for Chinese input method? | 155 // candidate_label, like Chinese font for Chinese input method? |
| 162 shortcut_label->SetColor(kShortcutColor); | 156 shortcut_label->SetEnabledColor(kShortcutColor); |
| 157 shortcut_label->SetDisabledColor(kDisabledShortcutColor); |
| 163 | 158 |
| 164 return shortcut_label; | 159 return shortcut_label; |
| 165 } | 160 } |
| 166 | 161 |
| 167 // Wraps the shortcut label, then decorates wrapped shortcut label | 162 // Wraps the shortcut label, then decorates wrapped shortcut label |
| 168 // and returns it (never returns NULL). | 163 // and returns it (never returns NULL). |
| 169 // The label text is not set in this function. | 164 // The label text is not set in this function. |
| 170 views::View* CreateWrappedShortcutLabel( | 165 views::View* CreateWrappedShortcutLabel( |
| 171 views::Label* shortcut_label, | 166 views::Label* shortcut_label, |
| 172 InputMethodLookupTable::Orientation orientation) { | 167 InputMethodLookupTable::Orientation orientation) { |
| 173 // Wrap it with padding. | 168 // Wrap it with padding. |
| 174 const gfx::Insets kVerticalShortcutLabelInsets(1, 6, 1, 6); | 169 const gfx::Insets kVerticalShortcutLabelInsets(1, 6, 1, 6); |
| 175 const gfx::Insets kHorizontalShortcutLabelInsets(1, 3, 1, 0); | 170 const gfx::Insets kHorizontalShortcutLabelInsets(1, 3, 1, 0); |
| 176 const gfx::Insets insets = | 171 const gfx::Insets insets = |
| 177 (orientation == InputMethodLookupTable::kVertical ? | 172 (orientation == InputMethodLookupTable::kVertical ? |
| 178 kVerticalShortcutLabelInsets : | 173 kVerticalShortcutLabelInsets : |
| 179 kHorizontalShortcutLabelInsets); | 174 kHorizontalShortcutLabelInsets); |
| 180 views::View* wrapped_shortcut_label = | 175 views::View* wrapped_shortcut_label = |
| 181 WrapWithPadding(shortcut_label, insets); | 176 WrapWithPadding(shortcut_label, insets); |
| 182 | 177 |
| 183 // Add decoration based on the orientation. | 178 // Add decoration based on the orientation. |
| 184 if (orientation == InputMethodLookupTable::kVertical) { | 179 if (orientation == InputMethodLookupTable::kVertical) { |
| 185 // Set the background color. | 180 // Set the background color. |
| 186 wrapped_shortcut_label->set_background( | 181 wrapped_shortcut_label->set_background( |
| 187 views::Background::CreateSolidBackground( | 182 views::Background::CreateSolidBackground( |
| 188 kShortcutBackgroundColor)); | 183 kShortcutBackgroundColor)); |
| 184 shortcut_label->SetBackgroundColor( |
| 185 wrapped_shortcut_label->background()->get_color()); |
| 189 } | 186 } |
| 190 | 187 |
| 191 return wrapped_shortcut_label; | 188 return wrapped_shortcut_label; |
| 192 } | 189 } |
| 193 | 190 |
| 194 // Creates the candidate label, and returns it (never returns NULL). | 191 // Creates the candidate label, and returns it (never returns NULL). |
| 195 // The label text is not set in this function. | 192 // The label text is not set in this function. |
| 196 views::Label* CreateCandidateLabel( | 193 views::Label* CreateCandidateLabel( |
| 197 InputMethodLookupTable::Orientation orientation) { | 194 InputMethodLookupTable::Orientation orientation) { |
| 198 views::Label* candidate_label = NULL; | 195 views::Label* candidate_label = NULL; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 216 // Creates the annotation label, and return it (never returns NULL). | 213 // Creates the annotation label, and return it (never returns NULL). |
| 217 // The label text is not set in this function. | 214 // The label text is not set in this function. |
| 218 views::Label* CreateAnnotationLabel( | 215 views::Label* CreateAnnotationLabel( |
| 219 InputMethodLookupTable::Orientation orientation) { | 216 InputMethodLookupTable::Orientation orientation) { |
| 220 // Create the annotation label. | 217 // Create the annotation label. |
| 221 views::Label* annotation_label = new views::Label; | 218 views::Label* annotation_label = new views::Label; |
| 222 | 219 |
| 223 // Change the font size and color. | 220 // Change the font size and color. |
| 224 annotation_label->SetFont( | 221 annotation_label->SetFont( |
| 225 annotation_label->font().DeriveFont(kFontSizeDelta)); | 222 annotation_label->font().DeriveFont(kFontSizeDelta)); |
| 226 annotation_label->SetColor(kAnnotationColor); | 223 annotation_label->SetEnabledColor(kAnnotationColor); |
| 227 annotation_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); | 224 annotation_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
| 228 | 225 |
| 229 return annotation_label; | 226 return annotation_label; |
| 230 } | 227 } |
| 231 | 228 |
| 232 // Computes shortcut column width. | 229 // Computes shortcut column width. |
| 233 int ComputeShortcutColumnWidth( | 230 int ComputeShortcutColumnWidth( |
| 234 const InputMethodLookupTable& lookup_table) { | 231 const InputMethodLookupTable& lookup_table) { |
| 235 int shortcut_column_width = 0; | 232 int shortcut_column_width = 0; |
| 236 // Create the shortcut label. The label will be owned by | 233 // Create the shortcut label. The label will be owned by |
| 237 // |wrapped_shortcut_label|, hence it's deleted when | 234 // |wrapped_shortcut_label|, hence it's deleted when |
| 238 // |wrapped_shortcut_label| is deleted. | 235 // |wrapped_shortcut_label| is deleted. |
| 239 views::Label* shortcut_label = CreateShortcutLabel(lookup_table.orientation); | 236 views::Label* shortcut_label = CreateShortcutLabel(lookup_table.orientation); |
| 240 scoped_ptr<views::View> wrapped_shortcut_label( | 237 scoped_ptr<views::View> wrapped_shortcut_label( |
| 241 CreateWrappedShortcutLabel(shortcut_label, lookup_table.orientation)); | 238 CreateWrappedShortcutLabel(shortcut_label, lookup_table.orientation)); |
| 242 | 239 |
| 243 // Compute the max width in shortcut labels. | 240 // Compute the max width in shortcut labels. |
| 244 // We'll create temporary shortcut labels, and choose the largest width. | 241 // We'll create temporary shortcut labels, and choose the largest width. |
| 245 for (int i = 0; i < lookup_table.page_size; ++i) { | 242 for (int i = 0; i < lookup_table.page_size; ++i) { |
| 246 shortcut_label->SetText( | 243 shortcut_label->SetText(CreateShortcutText(i, lookup_table.orientation)); |
| 247 WideToUTF16Hack(CreateShortcutText(i, lookup_table.orientation))); | |
| 248 shortcut_column_width = | 244 shortcut_column_width = |
| 249 std::max(shortcut_column_width, | 245 std::max(shortcut_column_width, |
| 250 wrapped_shortcut_label->GetPreferredSize().width()); | 246 wrapped_shortcut_label->GetPreferredSize().width()); |
| 251 } | 247 } |
| 252 | 248 |
| 253 return shortcut_column_width; | 249 return shortcut_column_width; |
| 254 } | 250 } |
| 255 | 251 |
| 256 // Computes the page index. For instance, if the page size is 9, and the | 252 // Computes the page index. For instance, if the page size is 9, and the |
| 257 // cursor is pointing to 13th candidate, the page index will be 1 (2nd | 253 // cursor is pointing to 13th candidate, the page index will be 1 (2nd |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 | 381 |
| 386 const gfx::Insets kInsets(2, 2, 2, 4); | 382 const gfx::Insets kInsets(2, 2, 2, 4); |
| 387 views::View* contents = WrapWithPadding(label_, kInsets); | 383 views::View* contents = WrapWithPadding(label_, kInsets); |
| 388 SetContents(contents); | 384 SetContents(contents); |
| 389 contents->set_border( | 385 contents->set_border( |
| 390 views::Border::CreateSolidBorder(1, kFrameColor)); | 386 views::Border::CreateSolidBorder(1, kFrameColor)); |
| 391 contents->set_background( | 387 contents->set_background( |
| 392 views::Background::CreateVerticalGradientBackground( | 388 views::Background::CreateVerticalGradientBackground( |
| 393 kFooterTopColor, | 389 kFooterTopColor, |
| 394 kFooterBottomColor)); | 390 kFooterBottomColor)); |
| 391 label_->SetBackgroundColor(contents->background()->get_color()); |
| 395 } | 392 } |
| 396 | 393 |
| 397 // Set the displayed text. | 394 // Set the displayed text. |
| 398 void SetText(const std::string& utf8_text) { | 395 void SetText(const std::string& utf8_text) { |
| 399 label_->SetText(UTF8ToUTF16(utf8_text)); | 396 label_->SetText(UTF8ToUTF16(utf8_text)); |
| 400 } | 397 } |
| 401 | 398 |
| 402 protected: | 399 protected: |
| 403 virtual gfx::Size GetPreferredSize() OVERRIDE { | 400 virtual gfx::Size GetPreferredSize() OVERRIDE { |
| 404 gfx::Size size = HidableArea::GetPreferredSize(); | 401 gfx::Size size = HidableArea::GetPreferredSize(); |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 589 int index_in_page, | 586 int index_in_page, |
| 590 InputMethodLookupTable::Orientation orientation); | 587 InputMethodLookupTable::Orientation orientation); |
| 591 virtual ~CandidateView() {} | 588 virtual ~CandidateView() {} |
| 592 // Initializes the candidate view with the given column widths. | 589 // Initializes the candidate view with the given column widths. |
| 593 // A width of 0 means that the column is resizable. | 590 // A width of 0 means that the column is resizable. |
| 594 void Init(int shortcut_column_width, | 591 void Init(int shortcut_column_width, |
| 595 int candidate_column_width, | 592 int candidate_column_width, |
| 596 int annotation_column_width); | 593 int annotation_column_width); |
| 597 | 594 |
| 598 // Sets candidate text to the given text. | 595 // Sets candidate text to the given text. |
| 599 void SetCandidateText(const std::wstring& text); | 596 void SetCandidateText(const string16& text); |
| 600 | 597 |
| 601 // Sets shortcut text to the given text. | 598 // Sets shortcut text to the given text. |
| 602 void SetShortcutText(const std::wstring& text); | 599 void SetShortcutText(const string16& text); |
| 603 | 600 |
| 604 // Sets annotation text to the given text. | 601 // Sets annotation text to the given text. |
| 605 void SetAnnotationText(const std::wstring& text); | 602 void SetAnnotationText(const string16& text); |
| 606 | 603 |
| 607 // Sets infolist icon. | 604 // Sets infolist icon. |
| 608 void SetInfolistIcon(bool enable); | 605 void SetInfolistIcon(bool enable); |
| 609 | 606 |
| 610 // Selects the candidate row. Changes the appearance to make it look | 607 // Selects the candidate row. Changes the appearance to make it look |
| 611 // like a selected candidate. | 608 // like a selected candidate. |
| 612 void Select(); | 609 void Select(); |
| 613 | 610 |
| 614 // Unselects the candidate row. Changes the appearance to make it look | 611 // Unselects the candidate row. Changes the appearance to make it look |
| 615 // like an unselected candidate. | 612 // like an unselected candidate. |
| 616 void Unselect(); | 613 void Unselect(); |
| 617 | 614 |
| 618 // Enables or disables the candidate row based on |enabled|. Changes the | 615 // Enables or disables the candidate row based on |enabled|. Changes the |
| 619 // appearance to make it look like unclickable area. | 616 // appearance to make it look like unclickable area. |
| 620 void SetRowEnabled(bool enabled); | 617 void SetRowEnabled(bool enabled); |
| 621 | 618 |
| 622 // Returns the relative position of the candidate label. | 619 // Returns the relative position of the candidate label. |
| 623 gfx::Point GetCandidateLabelPosition() const; | 620 gfx::Point GetCandidateLabelPosition() const; |
| 624 | 621 |
| 625 private: | 622 private: |
| 626 // Overridden from View: | 623 // Overridden from View: |
| 627 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; | 624 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; |
| 628 | 625 |
| 626 // Notifies labels of their new background colors. Called whenever the view's |
| 627 // background color changes. |
| 628 void UpdateLabelBackgroundColors(); |
| 629 |
| 629 // Zero-origin index in the current page. | 630 // Zero-origin index in the current page. |
| 630 int index_in_page_; | 631 int index_in_page_; |
| 631 | 632 |
| 632 // The orientation of the candidate view. | 633 // The orientation of the candidate view. |
| 633 InputMethodLookupTable::Orientation orientation_; | 634 InputMethodLookupTable::Orientation orientation_; |
| 634 | 635 |
| 635 // The parent candidate window that contains this view. | 636 // The parent candidate window that contains this view. |
| 636 CandidateWindowView* parent_candidate_window_; | 637 CandidateWindowView* parent_candidate_window_; |
| 637 | 638 |
| 638 // Views created in the class will be part of tree of |this|, so these | 639 // Views created in the class will be part of tree of |this|, so these |
| 639 // child views will be deleted when |this| is deleted. | 640 // child views will be deleted when |this| is deleted. |
| 640 | 641 |
| 641 // The shortcut label renders shortcut numbers like 1, 2, and 3. | 642 // The shortcut label renders shortcut numbers like 1, 2, and 3. |
| 642 views::Label* shortcut_label_; | 643 views::Label* shortcut_label_; |
| 643 // The candidate label renders candidates. | 644 // The candidate label renders candidates. |
| 644 views::Label* candidate_label_; | 645 views::Label* candidate_label_; |
| 645 // The annotation label renders annotations. | 646 // The annotation label renders annotations. |
| 646 views::Label* annotation_label_; | 647 views::Label* annotation_label_; |
| 647 | 648 |
| 648 // The infolist icon. | 649 // The infolist icon. |
| 649 views::Label* infolist_label_; | 650 views::Label* infolist_label_; |
| 650 bool infolist_icon_enabled_; | 651 bool infolist_icon_enabled_; |
| 651 }; | 652 }; |
| 652 | 653 |
| 653 class InfolistView; | 654 class InfolistView; |
| 654 | 655 |
| 655 // InfolistWindowView is the main container of the infolist window UI. | 656 // InfolistWindowView is the main container of the infolist window UI. |
| 656 class InfolistWindowView : public views::View { | 657 class InfolistWindowView : public views::View { |
| 657 public: | 658 public: |
| 658 InfolistWindowView( | 659 InfolistWindowView(views::Widget* parent_frame, |
| 659 views::Widget* parent_frame, views::Widget* candidate_window_frame); | 660 views::Widget* candidate_window_frame); |
| 660 virtual ~InfolistWindowView(); | 661 virtual ~InfolistWindowView(); |
| 661 void Init(); | 662 void Init(); |
| 662 void Show(); | 663 void Show(); |
| 663 void DelayShow(unsigned int milliseconds); | 664 void DelayShow(unsigned int milliseconds); |
| 664 void Hide(); | 665 void Hide(); |
| 665 void DelayHide(unsigned int milliseconds); | 666 void DelayHide(unsigned int milliseconds); |
| 666 void UpdateCandidates(const InputMethodLookupTable& lookup_table); | 667 void UpdateCandidates(const InputMethodLookupTable& lookup_table); |
| 667 | 668 |
| 668 void ResizeAndMoveParentFrame(); | 669 void ResizeAndMoveParentFrame(); |
| 669 | 670 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 | 716 |
| 716 // Selects the infolist row. Changes the appearance to make it look | 717 // Selects the infolist row. Changes the appearance to make it look |
| 717 // like a selected candidate. | 718 // like a selected candidate. |
| 718 void Select(); | 719 void Select(); |
| 719 | 720 |
| 720 // Unselects the infolist row. Changes the appearance to make it look | 721 // Unselects the infolist row. Changes the appearance to make it look |
| 721 // like an unselected candidate. | 722 // like an unselected candidate. |
| 722 void Unselect(); | 723 void Unselect(); |
| 723 | 724 |
| 724 private: | 725 private: |
| 726 // Notifies labels of their new background colors. Called whenever the view's |
| 727 // background color changes. |
| 728 void UpdateLabelBackgroundColors(); |
| 729 |
| 725 // The parent candidate window that contains this view. | 730 // The parent candidate window that contains this view. |
| 726 InfolistWindowView* parent_infolist_window_; | 731 InfolistWindowView* parent_infolist_window_; |
| 727 | 732 |
| 728 // Views created in the class will be part of tree of |this|, so these | 733 // Views created in the class will be part of tree of |this|, so these |
| 729 // child views will be deleted when |this| is deleted. | 734 // child views will be deleted when |this| is deleted. |
| 730 | 735 |
| 731 // The title label. | 736 // The title label. |
| 732 views::Label* title_label_; | 737 views::Label* title_label_; |
| 733 // The description label. | 738 // The description label. |
| 734 views::Label* description_label_; | 739 views::Label* description_label_; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 854 layout->StartRow(0, 0); | 859 layout->StartRow(0, 0); |
| 855 // |wrapped_shortcut_label|, |candidate_label_|, and |annotation_label_| | 860 // |wrapped_shortcut_label|, |candidate_label_|, and |annotation_label_| |
| 856 // will be owned by |this|. | 861 // will be owned by |this|. |
| 857 layout->AddView(wrapped_shortcut_label); | 862 layout->AddView(wrapped_shortcut_label); |
| 858 layout->AddView(candidate_label_); | 863 layout->AddView(candidate_label_); |
| 859 layout->AddView(annotation_label_); | 864 layout->AddView(annotation_label_); |
| 860 if (orientation_ == InputMethodLookupTable::kVertical) { | 865 if (orientation_ == InputMethodLookupTable::kVertical) { |
| 861 layout->AddView(WrapWithPadding(infolist_label_, | 866 layout->AddView(WrapWithPadding(infolist_label_, |
| 862 gfx::Insets(2, 0, 2, 0))); | 867 gfx::Insets(2, 0, 2, 0))); |
| 863 } | 868 } |
| 869 UpdateLabelBackgroundColors(); |
| 864 } | 870 } |
| 865 | 871 |
| 866 void CandidateView::SetCandidateText(const std::wstring& text) { | 872 void CandidateView::SetCandidateText(const string16& text) { |
| 867 candidate_label_->SetText(WideToUTF16Hack(text)); | 873 candidate_label_->SetText(text); |
| 868 } | 874 } |
| 869 | 875 |
| 870 void CandidateView::SetShortcutText(const std::wstring& text) { | 876 void CandidateView::SetShortcutText(const string16& text) { |
| 871 shortcut_label_->SetText(WideToUTF16Hack(text)); | 877 shortcut_label_->SetText(text); |
| 872 } | 878 } |
| 873 | 879 |
| 874 void CandidateView::SetAnnotationText(const std::wstring& text) { | 880 void CandidateView::SetAnnotationText(const string16& text) { |
| 875 annotation_label_->SetText(WideToUTF16Hack(text)); | 881 annotation_label_->SetText(text); |
| 876 } | 882 } |
| 877 | 883 |
| 878 void CandidateView::SetInfolistIcon(bool enable) { | 884 void CandidateView::SetInfolistIcon(bool enable) { |
| 879 if (!infolist_label_) { | 885 if (!infolist_label_ || (infolist_icon_enabled_ == enable)) |
| 880 return; | 886 return; |
| 881 } | |
| 882 if (enable) { | |
| 883 infolist_label_->set_background( | |
| 884 views::Background::CreateSolidBackground(kSelectedRowFrameColor)); | |
| 885 } else { | |
| 886 infolist_label_->set_background(NULL); | |
| 887 } | |
| 888 if (infolist_icon_enabled_ != enable) { | |
| 889 SchedulePaint(); | |
| 890 } | |
| 891 infolist_icon_enabled_ = enable; | 887 infolist_icon_enabled_ = enable; |
| 888 infolist_label_->set_background(enable ? |
| 889 views::Background::CreateSolidBackground(kSelectedRowFrameColor) : NULL); |
| 890 UpdateLabelBackgroundColors(); |
| 891 SchedulePaint(); |
| 892 } | 892 } |
| 893 | 893 |
| 894 void CandidateView::Select() { | 894 void CandidateView::Select() { |
| 895 set_background( | 895 set_background( |
| 896 views::Background::CreateSolidBackground(kSelectedRowBackgroundColor)); | 896 views::Background::CreateSolidBackground(kSelectedRowBackgroundColor)); |
| 897 set_border(views::Border::CreateSolidBorder(1, kSelectedRowFrameColor)); | 897 set_border(views::Border::CreateSolidBorder(1, kSelectedRowFrameColor)); |
| 898 UpdateLabelBackgroundColors(); |
| 898 // Need to call SchedulePaint() for background and border color changes. | 899 // Need to call SchedulePaint() for background and border color changes. |
| 899 SchedulePaint(); | 900 SchedulePaint(); |
| 900 } | 901 } |
| 901 | 902 |
| 902 void CandidateView::Unselect() { | 903 void CandidateView::Unselect() { |
| 903 set_background(NULL); | 904 set_background(NULL); |
| 904 set_border(NULL); | 905 set_border(NULL); |
| 906 UpdateLabelBackgroundColors(); |
| 905 SchedulePaint(); // See comments at Select(). | 907 SchedulePaint(); // See comments at Select(). |
| 906 } | 908 } |
| 907 | 909 |
| 908 void CandidateView::SetRowEnabled(bool enabled) { | 910 void CandidateView::SetRowEnabled(bool enabled) { |
| 909 shortcut_label_->SetColor( | 911 shortcut_label_->SetEnabled(enabled); |
| 910 enabled ? kShortcutColor : kDisabledShortcutColor); | |
| 911 } | 912 } |
| 912 | 913 |
| 913 gfx::Point CandidateView::GetCandidateLabelPosition() const { | 914 gfx::Point CandidateView::GetCandidateLabelPosition() const { |
| 914 return candidate_label_->GetMirroredPosition(); | 915 return candidate_label_->GetMirroredPosition(); |
| 915 } | 916 } |
| 916 | 917 |
| 917 bool CandidateView::OnMousePressed(const views::MouseEvent& event) { | 918 bool CandidateView::OnMousePressed(const views::MouseEvent& event) { |
| 918 // TODO(kinaba): investigate a way to delay the commit until OnMouseReleased. | 919 // TODO(kinaba): investigate a way to delay the commit until OnMouseReleased. |
| 919 // Mouse-down selection is a temporally workaround for crosbug.com/11423. | 920 // Mouse-down selection is a temporally workaround for crosbug.com/11423. |
| 920 // | 921 // |
| (...skipping 29 matching lines...) Expand all Loading... |
| 950 // when a popup window gets hidden. http://crosbug.com/11422 | 951 // when a popup window gets hidden. http://crosbug.com/11422 |
| 951 | 952 |
| 952 gfx::Point location_in_candidate_window = event.location(); | 953 gfx::Point location_in_candidate_window = event.location(); |
| 953 views::View::ConvertPointToView(this, parent_candidate_window_, | 954 views::View::ConvertPointToView(this, parent_candidate_window_, |
| 954 &location_in_candidate_window); | 955 &location_in_candidate_window); |
| 955 parent_candidate_window_->OnCandidatePressed(location_in_candidate_window); | 956 parent_candidate_window_->OnCandidatePressed(location_in_candidate_window); |
| 956 parent_candidate_window_->CommitCandidate(); | 957 parent_candidate_window_->CommitCandidate(); |
| 957 return false; | 958 return false; |
| 958 } | 959 } |
| 959 | 960 |
| 960 CandidateWindowView::CandidateWindowView( | 961 void CandidateView::UpdateLabelBackgroundColors() { |
| 961 views::Widget* parent_frame) | 962 SkColor color = background() ? |
| 963 background()->get_color() : kDefaultBackgroundColor; |
| 964 if (orientation_ != InputMethodLookupTable::kVertical) |
| 965 shortcut_label_->SetBackgroundColor(color); |
| 966 candidate_label_->SetBackgroundColor(color); |
| 967 annotation_label_->SetBackgroundColor(color); |
| 968 if (infolist_label_) { |
| 969 infolist_label_->SetBackgroundColor(infolist_label_->background() ? |
| 970 infolist_label_->background()->get_color() : color); |
| 971 } |
| 972 } |
| 973 |
| 974 CandidateWindowView::CandidateWindowView(views::Widget* parent_frame) |
| 962 : selected_candidate_index_in_page_(0), | 975 : selected_candidate_index_in_page_(0), |
| 963 parent_frame_(parent_frame), | 976 parent_frame_(parent_frame), |
| 964 preedit_area_(NULL), | 977 preedit_area_(NULL), |
| 965 header_area_(NULL), | 978 header_area_(NULL), |
| 966 candidate_area_(NULL), | 979 candidate_area_(NULL), |
| 967 footer_area_(NULL), | 980 footer_area_(NULL), |
| 968 previous_shortcut_column_width_(0), | 981 previous_shortcut_column_width_(0), |
| 969 previous_candidate_column_width_(0), | 982 previous_candidate_column_width_(0), |
| 970 previous_annotation_column_width_(0) { | 983 previous_annotation_column_width_(0) { |
| 971 } | 984 } |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1098 } | 1111 } |
| 1099 | 1112 |
| 1100 // Update the candidates in the current page. | 1113 // Update the candidates in the current page. |
| 1101 const size_t start_from = current_page_index * new_lookup_table.page_size; | 1114 const size_t start_from = current_page_index * new_lookup_table.page_size; |
| 1102 | 1115 |
| 1103 // In some cases, engines send empty shortcut labels. For instance, | 1116 // In some cases, engines send empty shortcut labels. For instance, |
| 1104 // ibus-mozc sends empty labels when they show suggestions. In this | 1117 // ibus-mozc sends empty labels when they show suggestions. In this |
| 1105 // case, we should not show shortcut labels. | 1118 // case, we should not show shortcut labels. |
| 1106 const bool no_shortcut_mode = | 1119 const bool no_shortcut_mode = |
| 1107 (start_from < new_lookup_table.labels.size() && | 1120 (start_from < new_lookup_table.labels.size() && |
| 1108 new_lookup_table.labels[start_from] == ""); | 1121 new_lookup_table.labels[start_from].empty()); |
| 1109 for (size_t i = 0; i < candidate_views_.size(); ++i) { | 1122 for (size_t i = 0; i < candidate_views_.size(); ++i) { |
| 1110 const size_t index_in_page = i; | 1123 const size_t index_in_page = i; |
| 1111 const size_t candidate_index = start_from + index_in_page; | 1124 const size_t candidate_index = start_from + index_in_page; |
| 1112 CandidateView* candidate_view = candidate_views_[index_in_page]; | 1125 CandidateView* candidate_view = candidate_views_[index_in_page]; |
| 1113 // Set the shortcut text. | 1126 // Set the shortcut text. |
| 1114 if (no_shortcut_mode) { | 1127 if (no_shortcut_mode) { |
| 1115 candidate_view->SetShortcutText(L""); | 1128 candidate_view->SetShortcutText(string16()); |
| 1116 } else { | 1129 } else { |
| 1117 // At this moment, we don't use labels sent from engines for UX | 1130 // At this moment, we don't use labels sent from engines for UX |
| 1118 // reasons. First, we want to show shortcut labels in empty rows | 1131 // reasons. First, we want to show shortcut labels in empty rows |
| 1119 // (ex. show 6, 7, 8, ... in empty rows when the number of | 1132 // (ex. show 6, 7, 8, ... in empty rows when the number of |
| 1120 // candidates is 5). Second, we want to add a period after each | 1133 // candidates is 5). Second, we want to add a period after each |
| 1121 // shortcut label when the candidate window is horizontal. | 1134 // shortcut label when the candidate window is horizontal. |
| 1122 candidate_view->SetShortcutText( | 1135 candidate_view->SetShortcutText( |
| 1123 CreateShortcutText(i, new_lookup_table.orientation)); | 1136 CreateShortcutText(i, new_lookup_table.orientation)); |
| 1124 } | 1137 } |
| 1125 // Set the candidate text. | 1138 // Set the candidate text. |
| 1126 if (candidate_index < new_lookup_table.candidates.size() && | 1139 if (candidate_index < new_lookup_table.candidates.size() && |
| 1127 candidate_index < new_lookup_table.annotations.size()) { | 1140 candidate_index < new_lookup_table.annotations.size()) { |
| 1128 candidate_view->SetCandidateText( | 1141 candidate_view->SetCandidateText( |
| 1129 UTF8ToWide(new_lookup_table.candidates[candidate_index])); | 1142 UTF8ToUTF16(new_lookup_table.candidates[candidate_index])); |
| 1130 candidate_view->SetAnnotationText( | 1143 candidate_view->SetAnnotationText( |
| 1131 UTF8ToWide(new_lookup_table.annotations[candidate_index])); | 1144 UTF8ToUTF16(new_lookup_table.annotations[candidate_index])); |
| 1132 candidate_view->SetRowEnabled(true); | 1145 candidate_view->SetRowEnabled(true); |
| 1133 | 1146 |
| 1134 if ((new_lookup_table.mozc_candidates.candidate_size() > | 1147 if ((new_lookup_table.mozc_candidates.candidate_size() > |
| 1135 static_cast<int>(i)) && | 1148 static_cast<int>(i)) && |
| 1136 (new_lookup_table.mozc_candidates. | 1149 (new_lookup_table.mozc_candidates. |
| 1137 candidate(i).has_information_id())) { | 1150 candidate(i).has_information_id())) { |
| 1138 candidate_view->SetInfolistIcon(true); | 1151 candidate_view->SetInfolistIcon(true); |
| 1139 } else { | 1152 } else { |
| 1140 candidate_view->SetInfolistIcon(false); | 1153 candidate_view->SetInfolistIcon(false); |
| 1141 } | 1154 } |
| 1142 } else { | 1155 } else { |
| 1143 // Disable the empty row. | 1156 // Disable the empty row. |
| 1144 candidate_view->SetCandidateText(L""); | 1157 candidate_view->SetCandidateText(string16()); |
| 1145 candidate_view->SetAnnotationText(L""); | 1158 candidate_view->SetAnnotationText(string16()); |
| 1146 candidate_view->SetRowEnabled(false); | 1159 candidate_view->SetRowEnabled(false); |
| 1147 candidate_view->SetInfolistIcon(false); | 1160 candidate_view->SetInfolistIcon(false); |
| 1148 } | 1161 } |
| 1149 } | 1162 } |
| 1150 } | 1163 } |
| 1151 // Update the current lookup table. We'll use lookup_table_ from here. | 1164 // Update the current lookup table. We'll use lookup_table_ from here. |
| 1152 // Note that SelectCandidateAt() uses lookup_table_. | 1165 // Note that SelectCandidateAt() uses lookup_table_. |
| 1153 lookup_table_ = new_lookup_table; | 1166 lookup_table_ = new_lookup_table; |
| 1154 | 1167 |
| 1155 // Select the current candidate in the page. | 1168 // Select the current candidate in the page. |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1405 | 1418 |
| 1406 // Initialize the column set with three columns. | 1419 // Initialize the column set with three columns. |
| 1407 views::ColumnSet* column_set = layout->AddColumnSet(0); | 1420 views::ColumnSet* column_set = layout->AddColumnSet(0); |
| 1408 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, | 1421 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, |
| 1409 0, views::GridLayout::FIXED, 200, 0); | 1422 0, views::GridLayout::FIXED, 200, 0); |
| 1410 | 1423 |
| 1411 layout->StartRow(0, 0); | 1424 layout->StartRow(0, 0); |
| 1412 layout->AddView(wrapped_title_label); | 1425 layout->AddView(wrapped_title_label); |
| 1413 layout->StartRow(0, 0); | 1426 layout->StartRow(0, 0); |
| 1414 layout->AddView(wrapped_description_label); | 1427 layout->AddView(wrapped_description_label); |
| 1428 UpdateLabelBackgroundColors(); |
| 1415 } | 1429 } |
| 1416 | 1430 |
| 1417 | 1431 |
| 1418 void InfolistView::SetTitleText(const std::wstring& text) { | 1432 void InfolistView::SetTitleText(const std::wstring& text) { |
| 1419 title_label_->SetText(WideToUTF16Hack(text)); | 1433 title_label_->SetText(WideToUTF16Hack(text)); |
| 1420 } | 1434 } |
| 1421 | 1435 |
| 1422 void InfolistView::SetDescriptionText(const std::wstring& text) { | 1436 void InfolistView::SetDescriptionText(const std::wstring& text) { |
| 1423 description_label_->SetText(WideToUTF16Hack(text)); | 1437 description_label_->SetText(WideToUTF16Hack(text)); |
| 1424 } | 1438 } |
| 1425 | 1439 |
| 1426 void InfolistView::Select() { | 1440 void InfolistView::Select() { |
| 1427 set_background( | 1441 set_background(views::Background::CreateSolidBackground( |
| 1428 views::Background::CreateSolidBackground( | 1442 kSelectedInfolistRowBackgroundColor)); |
| 1429 kSelectedInfolistRowBackgroundColor)); | |
| 1430 set_border( | 1443 set_border( |
| 1431 views::Border::CreateSolidBorder(1, kSelectedInfolistRowFrameColor)); | 1444 views::Border::CreateSolidBorder(1, kSelectedInfolistRowFrameColor)); |
| 1445 UpdateLabelBackgroundColors(); |
| 1432 // Need to call SchedulePaint() for background and border color changes. | 1446 // Need to call SchedulePaint() for background and border color changes. |
| 1433 SchedulePaint(); | 1447 SchedulePaint(); |
| 1434 } | 1448 } |
| 1435 | 1449 |
| 1436 void InfolistView::Unselect() { | 1450 void InfolistView::Unselect() { |
| 1437 set_background(NULL); | 1451 set_background(NULL); |
| 1438 set_border(NULL); | 1452 set_border(NULL); |
| 1453 UpdateLabelBackgroundColors(); |
| 1439 SchedulePaint(); // See comments at Select(). | 1454 SchedulePaint(); // See comments at Select(). |
| 1440 } | 1455 } |
| 1441 | 1456 |
| 1442 InfolistWindowView::InfolistWindowView( | 1457 void InfolistView::UpdateLabelBackgroundColors() { |
| 1443 views::Widget* parent_frame, views::Widget* candidate_window_frame) | 1458 SkColor color = background() ? |
| 1459 background()->get_color() : kDefaultBackgroundColor; |
| 1460 title_label_->SetBackgroundColor(color); |
| 1461 description_label_->SetBackgroundColor(color); |
| 1462 } |
| 1463 |
| 1464 InfolistWindowView::InfolistWindowView(views::Widget* parent_frame, |
| 1465 views::Widget* candidate_window_frame) |
| 1444 : parent_frame_(parent_frame), | 1466 : parent_frame_(parent_frame), |
| 1445 candidate_window_frame_(candidate_window_frame), | 1467 candidate_window_frame_(candidate_window_frame), |
| 1446 infolist_area_(NULL), | 1468 infolist_area_(NULL), |
| 1447 visible_(false) { | 1469 visible_(false) { |
| 1448 } | 1470 } |
| 1449 | 1471 |
| 1450 InfolistWindowView::~InfolistWindowView() { | 1472 InfolistWindowView::~InfolistWindowView() { |
| 1451 if (infolist_area_ != NULL) { | 1473 if (infolist_area_ != NULL) { |
| 1452 infolist_area_->RemoveAllChildViews(false); | 1474 infolist_area_->RemoveAllChildViews(false); |
| 1453 } | 1475 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1477 views::Label* caption_label = NULL; | 1499 views::Label* caption_label = NULL; |
| 1478 caption_label = new views::Label; | 1500 caption_label = new views::Label; |
| 1479 caption_label->SetFont(caption_label->font().DeriveFont(kFontSizeDelta - 2)); | 1501 caption_label->SetFont(caption_label->font().DeriveFont(kFontSizeDelta - 2)); |
| 1480 caption_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); | 1502 caption_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
| 1481 caption_label->SetText( | 1503 caption_label->SetText( |
| 1482 l10n_util::GetStringUTF16(IDS_INPUT_METHOD_INFOLIST_WINDOW_TITLE)); | 1504 l10n_util::GetStringUTF16(IDS_INPUT_METHOD_INFOLIST_WINDOW_TITLE)); |
| 1483 views::View* wrapped_caption_label = | 1505 views::View* wrapped_caption_label = |
| 1484 WrapWithPadding(caption_label, gfx::Insets(2, 2, 2, 2)); | 1506 WrapWithPadding(caption_label, gfx::Insets(2, 2, 2, 2)); |
| 1485 wrapped_caption_label->set_background( | 1507 wrapped_caption_label->set_background( |
| 1486 views::Background::CreateSolidBackground(kInfolistTitleBackgroundColor)); | 1508 views::Background::CreateSolidBackground(kInfolistTitleBackgroundColor)); |
| 1509 caption_label->SetBackgroundColor( |
| 1510 wrapped_caption_label->background()->get_color()); |
| 1487 layout->AddView(wrapped_caption_label); | 1511 layout->AddView(wrapped_caption_label); |
| 1488 | 1512 |
| 1489 layout->StartRow(0, 0); | 1513 layout->StartRow(0, 0); |
| 1490 layout->AddView(infolist_area_); // |infolist_area_| is owned by |this|. | 1514 layout->AddView(infolist_area_); // |infolist_area_| is owned by |this|. |
| 1491 } | 1515 } |
| 1492 | 1516 |
| 1493 void InfolistWindowView::Hide() { | 1517 void InfolistWindowView::Hide() { |
| 1494 visible_ = false; | 1518 visible_ = false; |
| 1495 show_hide_timer_.Stop(); | 1519 show_hide_timer_.Stop(); |
| 1496 parent_frame_->Hide(); | 1520 parent_frame_->Hide(); |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1797 CandidateWindowController::~CandidateWindowController() { | 1821 CandidateWindowController::~CandidateWindowController() { |
| 1798 delete impl_; | 1822 delete impl_; |
| 1799 } | 1823 } |
| 1800 | 1824 |
| 1801 bool CandidateWindowController::Init() { | 1825 bool CandidateWindowController::Init() { |
| 1802 return impl_->Init(); | 1826 return impl_->Init(); |
| 1803 } | 1827 } |
| 1804 | 1828 |
| 1805 } // namespace input_method | 1829 } // namespace input_method |
| 1806 } // namespace chromeos | 1830 } // namespace chromeos |
| OLD | NEW |