root/ui/views/ime/input_method_base.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. widget_
  2. SetDelegate
  3. Init
  4. GetFocusedView
  5. OnTextInputTypeChanged
  6. GetTextInputClient
  7. GetTextInputType
  8. IsMock
  9. OnWillChangeFocus
  10. OnDidChangeFocus
  11. IsViewFocused
  12. IsTextInputTypeNone
  13. OnInputMethodChanged
  14. DispatchKeyEventPostIME
  15. GetCaretBoundsInWidget
  16. DetachFromWidget

// Copyright (c) 2012 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/input_method_base.h"

#include "base/logging.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/events/event.h"
#include "ui/views/view.h"
#include "ui/views/widget/widget.h"

namespace views {

InputMethodBase::InputMethodBase() : delegate_(NULL), widget_(NULL) {}

InputMethodBase::~InputMethodBase() {
  DetachFromWidget();
}

void InputMethodBase::SetDelegate(internal::InputMethodDelegate* delegate) {
  DCHECK(delegate);
  delegate_ = delegate;
}

void InputMethodBase::Init(Widget* widget) {
  DCHECK(widget);
  DCHECK(widget->GetFocusManager());
  DCHECK(!widget_) << "The input method is already initialized.";

  widget_ = widget;
  // Alert the InputMethod of the Widget's currently focused view.
  View* focused = widget->GetFocusManager()->GetFocusedView();
  if (focused)
    OnWillChangeFocus(NULL, focused);
  widget->GetFocusManager()->AddFocusChangeListener(this);
}

views::View* InputMethodBase::GetFocusedView() const {
  return widget_ ? widget_->GetFocusManager()->GetFocusedView() : NULL;
}

void InputMethodBase::OnTextInputTypeChanged(View* view) {}

ui::TextInputClient* InputMethodBase::GetTextInputClient() const {
  return (widget_ && widget_->IsActive() && GetFocusedView()) ?
      GetFocusedView()->GetTextInputClient() : NULL;
}

ui::TextInputType InputMethodBase::GetTextInputType() const {
  ui::TextInputClient* client = GetTextInputClient();
  return client ? client->GetTextInputType() : ui::TEXT_INPUT_TYPE_NONE;
}

bool InputMethodBase::IsMock() const {
  return false;
}

void InputMethodBase::OnWillChangeFocus(View* focused_before, View* focused) {}

void InputMethodBase::OnDidChangeFocus(View* focused_before, View* focused) {}

bool InputMethodBase::IsViewFocused(View* view) const {
  return widget_ && widget_->IsActive() && view && GetFocusedView() == view;
}

bool InputMethodBase::IsTextInputTypeNone() const {
  return GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE;
}

void InputMethodBase::OnInputMethodChanged() const {
  ui::TextInputClient* client = GetTextInputClient();
  if (client && client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE)
    client->OnInputMethodChanged();
}

void InputMethodBase::DispatchKeyEventPostIME(const ui::KeyEvent& key) const {
  if (delegate_)
    delegate_->DispatchKeyEventPostIME(key);
}

bool InputMethodBase::GetCaretBoundsInWidget(gfx::Rect* rect) const {
  DCHECK(rect);
  ui::TextInputClient* client = GetTextInputClient();
  if (!client || client->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE)
    return false;

  gfx::Rect caret_bounds = client->GetCaretBounds();
  gfx::Point caret_origin = caret_bounds.origin();
  View::ConvertPointFromScreen(GetFocusedView(), &caret_origin);
  caret_bounds.set_origin(caret_origin);
  *rect = GetFocusedView()->ConvertRectToWidget(caret_bounds);

  // Convert coordinates if the focused view is inside a child Widget.
  if (GetFocusedView()->GetWidget() != widget_)
    return Widget::ConvertRect(GetFocusedView()->GetWidget(), widget_, rect);
  return true;
}

void InputMethodBase::DetachFromWidget() {
  if (!widget_)
    return;

  widget_->GetFocusManager()->RemoveFocusChangeListener(this);
  widget_ = NULL;
}

}  // namespace views

/* [<][>][^][v][top][bottom][index][help] */