OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/mode_indicator_controller.h" | |
6 | |
5 #include "base/command_line.h" | 7 #include "base/command_line.h" |
6 #include "base/logging.h" | 8 #include "base/logging.h" |
7 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
8 #include "chrome/browser/chromeos/input_method/input_method_util.h" | 10 #include "chrome/browser/chromeos/input_method/input_method_util.h" |
9 #include "chrome/browser/chromeos/input_method/mode_indicator_controller.h" | 11 #include "chrome/browser/chromeos/input_method/mode_indicator_delegate_view.h" |
10 #include "chrome/browser/chromeos/input_method/mode_indicator_widget.h" | |
11 #include "chromeos/chromeos_switches.h" | 12 #include "chromeos/chromeos_switches.h" |
12 | 13 |
13 namespace chromeos { | 14 namespace chromeos { |
14 namespace input_method { | 15 namespace input_method { |
15 | 16 |
16 ModeIndicatorController::ModeIndicatorController( | 17 class ModeIndicatorObserver : public views::WidgetObserver { |
Jun Mukai
2013/12/02 21:08:41
What is this class for? It just observes the widg
Hiro Komatsu
2013/12/03 02:39:36
This is to close the previous widget immediately w
| |
17 ModeIndicatorWidget* mi_widget) | 18 public: |
18 : is_focused_(false) { | 19 ModeIndicatorObserver() |
19 mi_widget_.reset(mi_widget); | 20 : active_widget_(NULL) {} |
20 | 21 |
21 InputMethodManager* imm = InputMethodManager::Get(); | 22 virtual ~ModeIndicatorObserver() {} |
22 DCHECK(imm); | 23 |
23 imm->AddObserver(this); | 24 // views::WidgetObserver override: |
25 virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE { | |
Jun Mukai
2013/12/02 21:08:41
Please move below. Normal order is: ctor/dtor -> n
Hiro Komatsu
2013/12/03 02:39:36
Done.
| |
26 if (widget == active_widget_) | |
27 active_widget_ = NULL; | |
28 } | |
29 | |
30 // If other active mode indicator widget is shown, close it immedicately. | |
31 // Then store this widget as the active widget. | |
32 void UpdateActiveModeIndicator(views::Widget* widget) { | |
33 if (active_widget_) | |
34 active_widget_->Close(); | |
35 active_widget_ = widget; | |
36 widget->AddObserver(this); | |
37 } | |
38 | |
39 private: | |
40 views::Widget* active_widget_; | |
41 }; | |
42 | |
43 | |
44 ModeIndicatorController::ModeIndicatorController(InputMethodManager* imm) | |
45 : imm_(imm), | |
46 is_focused_(false), | |
47 mi_observer_(new ModeIndicatorObserver) { | |
48 DCHECK(imm_); | |
49 imm_->AddObserver(this); | |
24 } | 50 } |
25 | 51 |
26 ModeIndicatorController::~ModeIndicatorController() { | 52 ModeIndicatorController::~ModeIndicatorController() { |
27 InputMethodManager* imm = InputMethodManager::Get(); | 53 imm_->RemoveObserver(this); |
28 DCHECK(imm); | |
29 imm->RemoveObserver(this); | |
30 } | 54 } |
31 | 55 |
32 void ModeIndicatorController::SetCursorBounds( | 56 void ModeIndicatorController::SetCursorBounds( |
33 const gfx::Rect& cursor_bounds) { | 57 const gfx::Rect& cursor_bounds) { |
34 mi_widget_->SetCursorBounds(cursor_bounds); | 58 cursor_bounds_ = cursor_bounds; |
35 } | 59 } |
36 | 60 |
37 void ModeIndicatorController::FocusStateChanged(bool is_focused) { | 61 void ModeIndicatorController::FocusStateChanged(bool is_focused) { |
38 is_focused_ = is_focused; | 62 is_focused_ = is_focused; |
39 } | 63 } |
40 | 64 |
41 void ModeIndicatorController::InputMethodChanged(InputMethodManager* manager, | 65 void ModeIndicatorController::InputMethodChanged(InputMethodManager* manager, |
42 bool show_message) { | 66 bool show_message) { |
43 if (!show_message) | 67 if (!show_message) |
44 return; | 68 return; |
45 | 69 |
46 ShowModeIndicator(manager); | 70 ShowModeIndicator(); |
47 } | 71 } |
48 | 72 |
49 void ModeIndicatorController::InputMethodPropertyChanged( | 73 void ModeIndicatorController::InputMethodPropertyChanged( |
50 InputMethodManager* manager) { | 74 InputMethodManager* manager) { |
51 // Do nothing. | 75 // Do nothing. |
52 } | 76 } |
53 | 77 |
54 void ModeIndicatorController::ShowModeIndicator(InputMethodManager* manager) { | 78 void ModeIndicatorController::ShowModeIndicator() { |
55 // TODO(komatsu): When this is permanently enabled by defalut, | 79 // TODO(komatsu): When this is permanently enabled by defalut, |
56 // delete command_line.h and chromeos_switches.h from the header | 80 // delete command_line.h and chromeos_switches.h from the header |
57 // files. | 81 // files. |
58 if (CommandLine::ForCurrentProcess()->HasSwitch( | 82 if (CommandLine::ForCurrentProcess()->HasSwitch( |
59 switches::kDisableIMEModeIndicator)) | 83 switches::kDisableIMEModeIndicator)) |
60 return; | 84 return; |
61 | 85 |
62 // TODO(komatsu): Show the mode indicator in the right bottom of the | 86 // TODO(komatsu): Show the mode indicator in the right bottom of the |
63 // display when the launch bar is hidden and the focus is out. To | 87 // display when the launch bar is hidden and the focus is out. To |
64 // implement it, we should consider to use message center or system | 88 // implement it, we should consider to use message center or system |
65 // notification. Note, launch bar can be vertical and can be placed | 89 // notification. Note, launch bar can be vertical and can be placed |
66 // right/left side of display. | 90 // right/left side of display. |
67 if (!is_focused_) | 91 if (!is_focused_) |
68 return; | 92 return; |
69 | 93 |
70 DCHECK(manager); | 94 // Get the short name of the changed input method (e.g. US, JA, etc.) |
71 DCHECK(mi_widget_.get()); | 95 DCHECK(imm_); |
Jun Mukai
2013/12/02 21:08:41
You don't have to DCHECK, because imm_ is set in c
Hiro Komatsu
2013/12/03 02:39:36
Done.
| |
96 const InputMethodDescriptor descriptor = imm_->GetCurrentInputMethod(); | |
97 const string16 short_name = | |
98 imm_->GetInputMethodUtil()->GetInputMethodShortName(descriptor); | |
72 | 99 |
73 // Get the short name of the changed input method (e.g. US, JA, etc.) | 100 ModeIndicatorDelegateView* mi_delegate_view = |
74 const InputMethodDescriptor descriptor = manager->GetCurrentInputMethod(); | 101 new ModeIndicatorDelegateView(cursor_bounds_, short_name); |
75 const std::string short_name = UTF16ToUTF8( | 102 views::BubbleDelegateView::CreateBubble(mi_delegate_view); |
76 manager->GetInputMethodUtil()->GetInputMethodShortName(descriptor)); | 103 mi_observer_->UpdateActiveModeIndicator(mi_delegate_view->GetWidget()); |
77 mi_widget_->SetLabelTextUtf8(short_name); | 104 mi_delegate_view->ShowAndFadeOut(); |
78 | |
79 // Show the widget and hide it after 750msec. | |
80 mi_widget_->Show(); | |
81 const int kDelayMSec = 750; | |
82 mi_widget_->DelayHide(kDelayMSec); | |
83 } | 105 } |
84 | 106 |
85 } // namespace input_method | 107 } // namespace input_method |
86 } // namespace chromeos | 108 } // namespace chromeos |
OLD | NEW |