blob: 054eb0160a37c464a8d25c40bc87e7d2fbb109a0 [file] [log] [blame] [edit]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/views/ime/mock_input_method.h"
#include "base/basictypes.h"
#include "base/logging.h"
#include "ui/base/events/event.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/base/keycodes/keyboard_codes.h"
#include "ui/views/widget/widget.h"
namespace views {
MockInputMethod::MockInputMethod()
: composition_changed_(false),
focus_changed_(false),
text_input_type_changed_(false),
caret_bounds_changed_(false),
cancel_composition_called_(false),
locale_("en-US"),
direction_(base::i18n::LEFT_TO_RIGHT),
active_(true) {
}
MockInputMethod::MockInputMethod(internal::InputMethodDelegate* delegate)
: composition_changed_(false),
focus_changed_(false),
text_input_type_changed_(false),
caret_bounds_changed_(false),
cancel_composition_called_(false),
locale_("en-US"),
direction_(base::i18n::LEFT_TO_RIGHT),
active_(true) {
set_delegate(delegate);
}
MockInputMethod::~MockInputMethod() {
}
void MockInputMethod::Init(Widget* widget) {
InputMethodBase::Init(widget);
}
void MockInputMethod::DispatchKeyEvent(const ui::KeyEvent& key) {
bool handled = (composition_changed_ || result_text_.length()) &&
!IsTextInputTypeNone();
ClearStates();
if (handled) {
ui::KeyEvent mock_key(ui::ET_KEY_PRESSED, ui::VKEY_PROCESSKEY, key.flags());
DispatchKeyEventPostIME(mock_key);
} else {
DispatchKeyEventPostIME(key);
}
if (focus_changed_)
return;
ui::TextInputClient* client = GetTextInputClient();
if (client) {
if (handled) {
if (result_text_.length())
client->InsertText(result_text_);
if (composition_changed_) {
if (composition_.text.length())
client->SetCompositionText(composition_);
else
client->ClearCompositionText();
}
} else if (key.type() == ui::ET_KEY_PRESSED) {
char16 ch = key.GetCharacter();
client->InsertChar(ch, key.flags());
}
}
ClearResult();
}
void MockInputMethod::OnTextInputTypeChanged(View* view) {
if (IsViewFocused(view))
text_input_type_changed_ = true;
InputMethodBase::OnTextInputTypeChanged(view);
}
void MockInputMethod::OnCaretBoundsChanged(View* view) {
if (IsViewFocused(view))
caret_bounds_changed_ = true;
}
void MockInputMethod::CancelComposition(View* view) {
if (IsViewFocused(view)) {
cancel_composition_called_ = true;
ClearResult();
}
}
std::string MockInputMethod::GetInputLocale() {
return locale_;
}
base::i18n::TextDirection MockInputMethod::GetInputTextDirection() {
return direction_;
}
bool MockInputMethod::IsActive() {
return active_;
}
bool MockInputMethod::IsMock() const {
return true;
}
void MockInputMethod::OnWillChangeFocus(View* focused_before, View* focused) {
ui::TextInputClient* client = GetTextInputClient();
if (client && client->HasCompositionText())
client->ConfirmCompositionText();
focus_changed_ = true;
ClearResult();
}
void MockInputMethod::Clear() {
ClearStates();
ClearResult();
}
void MockInputMethod::SetCompositionTextForNextKey(
const ui::CompositionText& composition) {
composition_changed_ = true;
composition_ = composition;
}
void MockInputMethod::SetResultTextForNextKey(const string16& result) {
result_text_ = result;
}
void MockInputMethod::SetInputLocale(const std::string& locale) {
if (locale_ != locale) {
locale_ = locale;
OnInputMethodChanged();
}
}
void MockInputMethod::SetInputTextDirection(
base::i18n::TextDirection direction) {
if (direction_ != direction) {
direction_ = direction;
OnInputMethodChanged();
}
}
void MockInputMethod::SetActive(bool active) {
if (active_ != active) {
active_ = active;
OnInputMethodChanged();
}
}
void MockInputMethod::ClearStates() {
focus_changed_ = false;
text_input_type_changed_ = false;
caret_bounds_changed_ = false;
cancel_composition_called_ = false;
}
void MockInputMethod::ClearResult() {
composition_.Clear();
composition_changed_ = false;
result_text_.clear();
}
} // namespace views