OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "ash/common/system/chromeos/ime_menu/ime_menu_tray.h" | 5 #include "ash/common/system/chromeos/ime_menu/ime_menu_tray.h" |
6 | 6 |
7 #include "ash/common/accessibility_delegate.h" | 7 #include "ash/common/accessibility_delegate.h" |
8 #include "ash/common/ash_constants.h" | 8 #include "ash/common/ash_constants.h" |
9 #include "ash/common/material_design/material_design_controller.h" | 9 #include "ash/common/material_design/material_design_controller.h" |
10 #include "ash/common/session/session_state_delegate.h" | 10 #include "ash/common/session/session_state_delegate.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 | 48 |
49 namespace { | 49 namespace { |
50 // Returns the height range of ImeListView. | 50 // Returns the height range of ImeListView. |
51 gfx::Range GetImeListViewRange() { | 51 gfx::Range GetImeListViewRange() { |
52 const int max_items = 5; | 52 const int max_items = 5; |
53 const int min_items = 2; | 53 const int min_items = 2; |
54 const int tray_item_height = GetTrayConstant(TRAY_POPUP_ITEM_MIN_HEIGHT); | 54 const int tray_item_height = GetTrayConstant(TRAY_POPUP_ITEM_MIN_HEIGHT); |
55 return gfx::Range(tray_item_height * min_items, tray_item_height * max_items); | 55 return gfx::Range(tray_item_height * min_items, tray_item_height * max_items); |
56 } | 56 } |
57 | 57 |
| 58 // Returns the minimum with of IME menu. |
| 59 int GetMinimumMenuWidth() { |
| 60 return MaterialDesignController::IsSystemTrayMenuMaterial() |
| 61 ? kTrayMenuMinimumWidthMd |
| 62 : kTrayMenuMinimumWidth; |
| 63 } |
| 64 |
58 // Shows language and input settings page. | 65 // Shows language and input settings page. |
59 void ShowIMESettings() { | 66 void ShowIMESettings() { |
60 WmShell::Get()->RecordUserMetricsAction(UMA_STATUS_AREA_IME_SHOW_DETAILED); | 67 WmShell::Get()->RecordUserMetricsAction(UMA_STATUS_AREA_IME_SHOW_DETAILED); |
61 WmShell::Get()->system_tray_controller()->ShowIMESettings(); | 68 WmShell::Get()->system_tray_controller()->ShowIMESettings(); |
62 } | 69 } |
63 | 70 |
64 // Returns true if the current screen is login or lock screen. | 71 // Returns true if the current screen is login or lock screen. |
65 bool IsInLoginOrLockScreen() { | 72 bool IsInLoginOrLockScreen() { |
66 LoginStatus login = | 73 LoginStatus login = |
67 WmShell::Get()->system_tray_delegate()->GetUserLoginStatus(); | 74 WmShell::Get()->system_tray_delegate()->GetUserLoginStatus(); |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 ImeMenuTray* ime_menu_tray_; | 293 ImeMenuTray* ime_menu_tray_; |
287 SystemMenuButton* emoji_button_; | 294 SystemMenuButton* emoji_button_; |
288 SystemMenuButton* handwriting_button_; | 295 SystemMenuButton* handwriting_button_; |
289 SystemMenuButton* voice_button_; | 296 SystemMenuButton* voice_button_; |
290 SystemMenuButton* settings_button_; | 297 SystemMenuButton* settings_button_; |
291 HoverHighlightView* one_settings_button_view_; | 298 HoverHighlightView* one_settings_button_view_; |
292 | 299 |
293 DISALLOW_COPY_AND_ASSIGN(ImeButtonsView); | 300 DISALLOW_COPY_AND_ASSIGN(ImeButtonsView); |
294 }; | 301 }; |
295 | 302 |
| 303 // The list view that contains the selected IME and property items. |
| 304 class ImeMenuListView : public ImeListView { |
| 305 public: |
| 306 ImeMenuListView(SystemTrayItem* owner, |
| 307 bool show_keyboard_toggle, |
| 308 SingleImeBehavior single_ime_behavior) |
| 309 : ImeListView(owner, show_keyboard_toggle, ImeListView::HIDE_SINGLE_IME) { |
| 310 } |
| 311 |
| 312 ~ImeMenuListView() override {} |
| 313 |
| 314 protected: |
| 315 void Layout() override { |
| 316 gfx::Range height_range = GetImeListViewRange(); |
| 317 if (MaterialDesignController::IsSystemTrayMenuMaterial()) { |
| 318 scroller()->ClipHeightTo(height_range.start(), height_range.end()); |
| 319 } else { |
| 320 uint32_t current_height = scroll_content()->height(); |
| 321 int minimum_menu_width = GetMinimumMenuWidth(); |
| 322 if (current_height > height_range.end()) { |
| 323 scroller()->SetFixedSize( |
| 324 gfx::Size(minimum_menu_width, height_range.end())); |
| 325 } else if (current_height < height_range.start()) { |
| 326 scroller()->SetFixedSize( |
| 327 gfx::Size(minimum_menu_width, height_range.start())); |
| 328 } |
| 329 } |
| 330 ImeListView::Layout(); |
| 331 } |
| 332 |
| 333 DISALLOW_COPY_AND_ASSIGN(ImeMenuListView); |
| 334 }; |
| 335 |
296 } // namespace | 336 } // namespace |
297 | 337 |
298 ImeMenuTray::ImeMenuTray(WmShelf* wm_shelf) | 338 ImeMenuTray::ImeMenuTray(WmShelf* wm_shelf) |
299 : TrayBackgroundView(wm_shelf), | 339 : TrayBackgroundView(wm_shelf), |
300 label_(new ImeMenuLabel()), | 340 label_(new ImeMenuLabel()), |
301 show_keyboard_(false), | 341 show_keyboard_(false), |
302 force_show_keyboard_(false), | 342 force_show_keyboard_(false), |
303 should_block_shelf_auto_hide_(false), | 343 should_block_shelf_auto_hide_(false), |
304 keyboard_suppressed_(false) { | 344 keyboard_suppressed_(false) { |
305 if (MaterialDesignController::IsShelfMaterial()) { | 345 if (MaterialDesignController::IsShelfMaterial()) { |
(...skipping 11 matching lines...) Expand all Loading... |
317 | 357 |
318 ImeMenuTray::~ImeMenuTray() { | 358 ImeMenuTray::~ImeMenuTray() { |
319 if (bubble_) | 359 if (bubble_) |
320 bubble_->bubble_view()->reset_delegate(); | 360 bubble_->bubble_view()->reset_delegate(); |
321 SystemTrayNotifier* tray_notifier = WmShell::Get()->system_tray_notifier(); | 361 SystemTrayNotifier* tray_notifier = WmShell::Get()->system_tray_notifier(); |
322 tray_notifier->RemoveIMEObserver(this); | 362 tray_notifier->RemoveIMEObserver(this); |
323 tray_notifier->RemoveVirtualKeyboardObserver(this); | 363 tray_notifier->RemoveVirtualKeyboardObserver(this); |
324 } | 364 } |
325 | 365 |
326 void ImeMenuTray::ShowImeMenuBubble() { | 366 void ImeMenuTray::ShowImeMenuBubble() { |
327 int minimum_menu_width = MaterialDesignController::IsSystemTrayMenuMaterial() | 367 int minimum_menu_width = GetMinimumMenuWidth(); |
328 ? kTrayMenuMinimumWidthMd | |
329 : kTrayMenuMinimumWidth; | |
330 should_block_shelf_auto_hide_ = true; | 368 should_block_shelf_auto_hide_ = true; |
331 views::TrayBubbleView::InitParams init_params( | 369 views::TrayBubbleView::InitParams init_params( |
332 GetAnchorAlignment(), minimum_menu_width, minimum_menu_width); | 370 GetAnchorAlignment(), minimum_menu_width, minimum_menu_width); |
333 init_params.can_activate = true; | 371 init_params.can_activate = true; |
334 init_params.close_on_deactivate = true; | 372 init_params.close_on_deactivate = true; |
335 | 373 |
336 views::TrayBubbleView* bubble_view = | 374 views::TrayBubbleView* bubble_view = |
337 views::TrayBubbleView::Create(GetBubbleAnchor(), this, &init_params); | 375 views::TrayBubbleView::Create(GetBubbleAnchor(), this, &init_params); |
338 bubble_view->set_anchor_view_insets(GetBubbleAnchorInsets()); | 376 bubble_view->set_anchor_view_insets(GetBubbleAnchorInsets()); |
339 | 377 |
340 // In the material design, we will add a title item with a separator on the | 378 // In the material design, we will add a title item with a separator on the |
341 // top of the IME menu. | 379 // top of the IME menu. |
342 if (MaterialDesignController::IsSystemTrayMenuMaterial()) { | 380 if (MaterialDesignController::IsSystemTrayMenuMaterial()) { |
343 bubble_view->AddChildView( | 381 bubble_view->AddChildView( |
344 new ImeTitleView(!ShouldShowEmojiHandwritingVoiceButtons())); | 382 new ImeTitleView(!ShouldShowEmojiHandwritingVoiceButtons())); |
345 } else { | 383 } else { |
346 bubble_view->set_margins(gfx::Insets(7, 0, 0, 0)); | 384 bubble_view->set_margins(gfx::Insets(7, 0, 0, 0)); |
347 } | 385 } |
348 | 386 |
349 // Adds IME list to the bubble. | 387 // Adds IME list to the bubble. |
350 ime_list_view_ = new ImeListView(nullptr, ShouldShowKeyboardToggle(), | 388 ime_list_view_ = new ImeMenuListView(nullptr, ShouldShowKeyboardToggle(), |
351 ImeListView::SHOW_SINGLE_IME); | 389 ImeListView::SHOW_SINGLE_IME); |
352 | |
353 uint32_t current_height = ime_list_view_->scroll_content()->height(); | |
354 const gfx::Range height_range = GetImeListViewRange(); | |
355 | |
356 if (MaterialDesignController::IsSystemTrayMenuMaterial()) { | |
357 ime_list_view_->scroller()->ClipHeightTo(height_range.start(), | |
358 height_range.end()); | |
359 } else if (current_height > height_range.end()) { | |
360 ime_list_view_->scroller()->SetFixedSize( | |
361 gfx::Size(minimum_menu_width, height_range.end())); | |
362 } else if (current_height < height_range.start()) { | |
363 ime_list_view_->scroller()->SetFixedSize( | |
364 gfx::Size(minimum_menu_width, height_range.start())); | |
365 } | |
366 bubble_view->AddChildView(ime_list_view_); | 390 bubble_view->AddChildView(ime_list_view_); |
367 | 391 |
368 // The bottom view that contains buttons are not supported in login/lock | 392 // The bottom view that contains buttons are not supported in login/lock |
369 // screen. | 393 // screen. |
370 if (!IsInLoginOrLockScreen()) { | 394 if (!IsInLoginOrLockScreen()) { |
371 if (ShouldShowEmojiHandwritingVoiceButtons()) { | 395 if (ShouldShowEmojiHandwritingVoiceButtons()) { |
372 bubble_view->AddChildView( | 396 bubble_view->AddChildView( |
373 new ImeButtonsView(this, true, true, true, true)); | 397 new ImeButtonsView(this, true, true, true, true)); |
374 } else if (!MaterialDesignController::IsSystemTrayMenuMaterial()) { | 398 } else if (!MaterialDesignController::IsSystemTrayMenuMaterial()) { |
375 // For MD, we don't need |ImeButtonsView| as the settings button will be | 399 // For MD, we don't need |ImeButtonsView| as the settings button will be |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 WmShell::Get()->system_tray_delegate()->GetCurrentIME(¤t_ime_); | 586 WmShell::Get()->system_tray_delegate()->GetCurrentIME(¤t_ime_); |
563 | 587 |
564 // Updates the tray label based on the current input method. | 588 // Updates the tray label based on the current input method. |
565 if (current_ime_.third_party) | 589 if (current_ime_.third_party) |
566 label_->SetText(current_ime_.short_name + base::UTF8ToUTF16("*")); | 590 label_->SetText(current_ime_.short_name + base::UTF8ToUTF16("*")); |
567 else | 591 else |
568 label_->SetText(current_ime_.short_name); | 592 label_->SetText(current_ime_.short_name); |
569 } | 593 } |
570 | 594 |
571 } // namespace ash | 595 } // namespace ash |
OLD | NEW |