| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 #include "chrome/browser/chromeos/input_method/candidate_window_view.h" | 4 #include "chrome/browser/chromeos/input_method/candidate_window_view.h" |
| 5 | 5 |
| 6 #include <string> | 6 #include <string> |
| 7 | 7 |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "chrome/browser/chromeos/input_method/candidate_view.h" | 9 #include "chrome/browser/chromeos/input_method/candidate_view.h" |
| 10 #include "chrome/browser/chromeos/input_method/candidate_window_constants.h" | 10 #include "chrome/browser/chromeos/input_method/candidate_window_constants.h" |
| 11 #include "chromeos/ime/candidate_window.h" | |
| 12 #include "ui/gfx/color_utils.h" | 11 #include "ui/gfx/color_utils.h" |
| 13 #include "ui/gfx/screen.h" | 12 #include "ui/gfx/screen.h" |
| 14 #include "ui/native_theme/native_theme.h" | 13 #include "ui/native_theme/native_theme.h" |
| 15 #include "ui/views/background.h" | 14 #include "ui/views/background.h" |
| 16 #include "ui/views/border.h" | 15 #include "ui/views/border.h" |
| 17 #include "ui/views/bubble/bubble_frame_view.h" | 16 #include "ui/views/bubble/bubble_frame_view.h" |
| 18 #include "ui/views/controls/label.h" | 17 #include "ui/views/controls/label.h" |
| 19 #include "ui/views/corewm/window_animations.h" | 18 #include "ui/views/corewm/window_animations.h" |
| 20 #include "ui/views/layout/box_layout.h" | 19 #include "ui/views/layout/box_layout.h" |
| 21 #include "ui/views/layout/fill_layout.h" | 20 #include "ui/views/layout/fill_layout.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 | 67 |
| 69 gfx::NativeView parent_; | 68 gfx::NativeView parent_; |
| 70 int offset_; | 69 int offset_; |
| 71 | 70 |
| 72 DISALLOW_COPY_AND_ASSIGN(CandidateWindowBorder); | 71 DISALLOW_COPY_AND_ASSIGN(CandidateWindowBorder); |
| 73 }; | 72 }; |
| 74 | 73 |
| 75 // Computes the page index. For instance, if the page size is 9, and the | 74 // Computes the page index. For instance, if the page size is 9, and the |
| 76 // cursor is pointing to 13th candidate, the page index will be 1 (2nd | 75 // cursor is pointing to 13th candidate, the page index will be 1 (2nd |
| 77 // page, as the index is zero-origin). Returns -1 on error. | 76 // page, as the index is zero-origin). Returns -1 on error. |
| 78 int ComputePageIndex(const CandidateWindow& candidate_window) { | 77 int ComputePageIndex(const ui::CandidateWindow& candidate_window) { |
| 79 if (candidate_window.page_size() > 0) | 78 if (candidate_window.page_size() > 0) |
| 80 return candidate_window.cursor_position() / candidate_window.page_size(); | 79 return candidate_window.cursor_position() / candidate_window.page_size(); |
| 81 return -1; | 80 return -1; |
| 82 } | 81 } |
| 83 | 82 |
| 84 } // namespace | 83 } // namespace |
| 85 | 84 |
| 86 class InformationTextArea : public views::View { | 85 class InformationTextArea : public views::View { |
| 87 public: | 86 public: |
| 88 // InformationTextArea's border is drawn as a separator, it should appear | 87 // InformationTextArea's border is drawn as a separator, it should appear |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 1, theme->GetSystemColor(ui::NativeTheme::kColorId_MenuBorderColor))); | 156 1, theme->GetSystemColor(ui::NativeTheme::kColorId_MenuBorderColor))); |
| 158 | 157 |
| 159 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); | 158 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); |
| 160 auxiliary_text_ = new InformationTextArea(gfx::ALIGN_RIGHT, 0); | 159 auxiliary_text_ = new InformationTextArea(gfx::ALIGN_RIGHT, 0); |
| 161 preedit_ = new InformationTextArea(gfx::ALIGN_LEFT, kMinPreeditAreaWidth); | 160 preedit_ = new InformationTextArea(gfx::ALIGN_LEFT, kMinPreeditAreaWidth); |
| 162 candidate_area_ = new views::View; | 161 candidate_area_ = new views::View; |
| 163 auxiliary_text_->SetVisible(false); | 162 auxiliary_text_->SetVisible(false); |
| 164 preedit_->SetVisible(false); | 163 preedit_->SetVisible(false); |
| 165 candidate_area_->SetVisible(false); | 164 candidate_area_->SetVisible(false); |
| 166 preedit_->SetBorder(InformationTextArea::BOTTOM); | 165 preedit_->SetBorder(InformationTextArea::BOTTOM); |
| 167 if (candidate_window_.orientation() == CandidateWindow::VERTICAL) { | 166 if (candidate_window_.orientation() == ui::CandidateWindow::VERTICAL) { |
| 168 AddChildView(preedit_); | 167 AddChildView(preedit_); |
| 169 AddChildView(candidate_area_); | 168 AddChildView(candidate_area_); |
| 170 AddChildView(auxiliary_text_); | 169 AddChildView(auxiliary_text_); |
| 171 auxiliary_text_->SetBorder(InformationTextArea::TOP); | 170 auxiliary_text_->SetBorder(InformationTextArea::TOP); |
| 172 candidate_area_->SetLayoutManager(new views::BoxLayout( | 171 candidate_area_->SetLayoutManager(new views::BoxLayout( |
| 173 views::BoxLayout::kVertical, 0, 0, 0)); | 172 views::BoxLayout::kVertical, 0, 0, 0)); |
| 174 } else { | 173 } else { |
| 175 AddChildView(preedit_); | 174 AddChildView(preedit_); |
| 176 AddChildView(auxiliary_text_); | 175 AddChildView(auxiliary_text_); |
| 177 AddChildView(candidate_area_); | 176 AddChildView(candidate_area_); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 preedit_->SetText(utf8_text); | 225 preedit_->SetText(utf8_text); |
| 227 } | 226 } |
| 228 | 227 |
| 229 void CandidateWindowView::ShowLookupTable() { | 228 void CandidateWindowView::ShowLookupTable() { |
| 230 candidate_area_->SetVisible(true); | 229 candidate_area_->SetVisible(true); |
| 231 auxiliary_text_->SetVisible(candidate_window_.is_auxiliary_text_visible()); | 230 auxiliary_text_->SetVisible(candidate_window_.is_auxiliary_text_visible()); |
| 232 UpdateVisibility(); | 231 UpdateVisibility(); |
| 233 } | 232 } |
| 234 | 233 |
| 235 void CandidateWindowView::UpdateCandidates( | 234 void CandidateWindowView::UpdateCandidates( |
| 236 const CandidateWindow& new_candidate_window) { | 235 const ui::CandidateWindow& new_candidate_window) { |
| 237 // Updating the candidate views is expensive. We'll skip this if possible. | 236 // Updating the candidate views is expensive. We'll skip this if possible. |
| 238 if (!candidate_window_.IsEqual(new_candidate_window)) { | 237 if (!candidate_window_.IsEqual(new_candidate_window)) { |
| 239 if (candidate_window_.orientation() != new_candidate_window.orientation()) { | 238 if (candidate_window_.orientation() != new_candidate_window.orientation()) { |
| 240 // If the new layout is vertical, the aux text should appear at the | 239 // If the new layout is vertical, the aux text should appear at the |
| 241 // bottom. If horizontal, it should appear between preedit and candidates. | 240 // bottom. If horizontal, it should appear between preedit and candidates. |
| 242 if (new_candidate_window.orientation() == CandidateWindow::VERTICAL) { | 241 if (new_candidate_window.orientation() == ui::CandidateWindow::VERTICAL) { |
| 243 ReorderChildView(auxiliary_text_, -1); | 242 ReorderChildView(auxiliary_text_, -1); |
| 244 auxiliary_text_->SetAlignment(gfx::ALIGN_RIGHT); | 243 auxiliary_text_->SetAlignment(gfx::ALIGN_RIGHT); |
| 245 auxiliary_text_->SetBorder(InformationTextArea::TOP); | 244 auxiliary_text_->SetBorder(InformationTextArea::TOP); |
| 246 candidate_area_->SetLayoutManager(new views::BoxLayout( | 245 candidate_area_->SetLayoutManager(new views::BoxLayout( |
| 247 views::BoxLayout::kVertical, 0, 0, 0)); | 246 views::BoxLayout::kVertical, 0, 0, 0)); |
| 248 } else { | 247 } else { |
| 249 ReorderChildView(auxiliary_text_, 1); | 248 ReorderChildView(auxiliary_text_, 1); |
| 250 auxiliary_text_->SetAlignment(gfx::ALIGN_LEFT); | 249 auxiliary_text_->SetAlignment(gfx::ALIGN_LEFT); |
| 251 auxiliary_text_->SetBorder(InformationTextArea::BOTTOM); | 250 auxiliary_text_->SetBorder(InformationTextArea::BOTTOM); |
| 252 candidate_area_->SetLayoutManager(new views::BoxLayout( | 251 candidate_area_->SetLayoutManager(new views::BoxLayout( |
| (...skipping 16 matching lines...) Expand all Loading... |
| 269 current_page_index * new_candidate_window.page_size(); | 268 current_page_index * new_candidate_window.page_size(); |
| 270 | 269 |
| 271 int max_shortcut_width = 0; | 270 int max_shortcut_width = 0; |
| 272 int max_candidate_width = 0; | 271 int max_candidate_width = 0; |
| 273 for (size_t i = 0; i < candidate_views_.size(); ++i) { | 272 for (size_t i = 0; i < candidate_views_.size(); ++i) { |
| 274 const size_t index_in_page = i; | 273 const size_t index_in_page = i; |
| 275 const size_t candidate_index = start_from + index_in_page; | 274 const size_t candidate_index = start_from + index_in_page; |
| 276 CandidateView* candidate_view = candidate_views_[index_in_page]; | 275 CandidateView* candidate_view = candidate_views_[index_in_page]; |
| 277 // Set the candidate text. | 276 // Set the candidate text. |
| 278 if (candidate_index < new_candidate_window.candidates().size()) { | 277 if (candidate_index < new_candidate_window.candidates().size()) { |
| 279 const CandidateWindow::Entry& entry = | 278 const ui::CandidateWindow::Entry& entry = |
| 280 new_candidate_window.candidates()[candidate_index]; | 279 new_candidate_window.candidates()[candidate_index]; |
| 281 candidate_view->SetEntry(entry); | 280 candidate_view->SetEntry(entry); |
| 282 candidate_view->SetState(views::Button::STATE_NORMAL); | 281 candidate_view->SetState(views::Button::STATE_NORMAL); |
| 283 candidate_view->SetInfolistIcon(!entry.description_title.empty()); | 282 candidate_view->SetInfolistIcon(!entry.description_title.empty()); |
| 284 } else { | 283 } else { |
| 285 // Disable the empty row. | 284 // Disable the empty row. |
| 286 candidate_view->SetEntry(CandidateWindow::Entry()); | 285 candidate_view->SetEntry(ui::CandidateWindow::Entry()); |
| 287 candidate_view->SetState(views::Button::STATE_DISABLED); | 286 candidate_view->SetState(views::Button::STATE_DISABLED); |
| 288 candidate_view->SetInfolistIcon(false); | 287 candidate_view->SetInfolistIcon(false); |
| 289 } | 288 } |
| 290 if (new_candidate_window.orientation() == CandidateWindow::VERTICAL) { | 289 if (new_candidate_window.orientation() == ui::CandidateWindow::VERTICAL) { |
| 291 int shortcut_width = 0; | 290 int shortcut_width = 0; |
| 292 int candidate_width = 0; | 291 int candidate_width = 0; |
| 293 candidate_views_[i]->GetPreferredWidths( | 292 candidate_views_[i]->GetPreferredWidths( |
| 294 &shortcut_width, &candidate_width); | 293 &shortcut_width, &candidate_width); |
| 295 max_shortcut_width = std::max(max_shortcut_width, shortcut_width); | 294 max_shortcut_width = std::max(max_shortcut_width, shortcut_width); |
| 296 max_candidate_width = std::max(max_candidate_width, candidate_width); | 295 max_candidate_width = std::max(max_candidate_width, candidate_width); |
| 297 } | 296 } |
| 298 } | 297 } |
| 299 if (new_candidate_window.orientation() == CandidateWindow::VERTICAL) { | 298 if (new_candidate_window.orientation() == ui::CandidateWindow::VERTICAL) { |
| 300 for (size_t i = 0; i < candidate_views_.size(); ++i) | 299 for (size_t i = 0; i < candidate_views_.size(); ++i) |
| 301 candidate_views_[i]->SetWidths(max_shortcut_width, max_candidate_width); | 300 candidate_views_[i]->SetWidths(max_shortcut_width, max_candidate_width); |
| 302 } | 301 } |
| 303 | 302 |
| 304 CandidateWindowBorder* border = static_cast<CandidateWindowBorder*>( | 303 CandidateWindowBorder* border = static_cast<CandidateWindowBorder*>( |
| 305 GetBubbleFrameView()->bubble_border()); | 304 GetBubbleFrameView()->bubble_border()); |
| 306 if (new_candidate_window.orientation() == CandidateWindow::VERTICAL) | 305 if (new_candidate_window.orientation() == ui::CandidateWindow::VERTICAL) |
| 307 border->set_offset(max_shortcut_width); | 306 border->set_offset(max_shortcut_width); |
| 308 else | 307 else |
| 309 border->set_offset(0); | 308 border->set_offset(0); |
| 310 } | 309 } |
| 311 // Update the current candidate window. We'll use candidate_window_ from here. | 310 // Update the current candidate window. We'll use candidate_window_ from here. |
| 312 // Note that SelectCandidateAt() uses candidate_window_. | 311 // Note that SelectCandidateAt() uses candidate_window_. |
| 313 candidate_window_.CopyFrom(new_candidate_window); | 312 candidate_window_.CopyFrom(new_candidate_window); |
| 314 | 313 |
| 315 // Select the current candidate in the page. | 314 // Select the current candidate in the page. |
| 316 if (candidate_window_.is_cursor_visible()) { | 315 if (candidate_window_.is_cursor_visible()) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 337 | 336 |
| 338 void CandidateWindowView::SetCursorBounds(const gfx::Rect& cursor_bounds, | 337 void CandidateWindowView::SetCursorBounds(const gfx::Rect& cursor_bounds, |
| 339 const gfx::Rect& composition_head) { | 338 const gfx::Rect& composition_head) { |
| 340 if (candidate_window_.show_window_at_composition()) | 339 if (candidate_window_.show_window_at_composition()) |
| 341 SetAnchorRect(composition_head); | 340 SetAnchorRect(composition_head); |
| 342 else | 341 else |
| 343 SetAnchorRect(cursor_bounds); | 342 SetAnchorRect(cursor_bounds); |
| 344 } | 343 } |
| 345 | 344 |
| 346 void CandidateWindowView::MaybeInitializeCandidateViews( | 345 void CandidateWindowView::MaybeInitializeCandidateViews( |
| 347 const CandidateWindow& candidate_window) { | 346 const ui::CandidateWindow& candidate_window) { |
| 348 const CandidateWindow::Orientation orientation = | 347 const ui::CandidateWindow::Orientation orientation = |
| 349 candidate_window.orientation(); | 348 candidate_window.orientation(); |
| 350 const size_t page_size = candidate_window.page_size(); | 349 const size_t page_size = candidate_window.page_size(); |
| 351 | 350 |
| 352 // Reset all candidate_views_ when orientation changes. | 351 // Reset all candidate_views_ when orientation changes. |
| 353 if (orientation != candidate_window_.orientation()) | 352 if (orientation != candidate_window_.orientation()) |
| 354 STLDeleteElements(&candidate_views_); | 353 STLDeleteElements(&candidate_views_); |
| 355 | 354 |
| 356 while (page_size < candidate_views_.size()) { | 355 while (page_size < candidate_views_.size()) { |
| 357 delete candidate_views_.back(); | 356 delete candidate_views_.back(); |
| 358 candidate_views_.pop_back(); | 357 candidate_views_.pop_back(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 for (size_t i = 0; i < candidate_views_.size(); ++i) { | 393 for (size_t i = 0; i < candidate_views_.size(); ++i) { |
| 395 if (sender == candidate_views_[i]) { | 394 if (sender == candidate_views_[i]) { |
| 396 FOR_EACH_OBSERVER(Observer, observers_, OnCandidateCommitted(i)); | 395 FOR_EACH_OBSERVER(Observer, observers_, OnCandidateCommitted(i)); |
| 397 return; | 396 return; |
| 398 } | 397 } |
| 399 } | 398 } |
| 400 } | 399 } |
| 401 | 400 |
| 402 } // namespace input_method | 401 } // namespace input_method |
| 403 } // namespace chromeos | 402 } // namespace chromeos |
| OLD | NEW |