15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_VIEWS_IME_INPUT_METHOD_BASE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_VIEWS_IME_INPUT_METHOD_BASE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/ime/input_method.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/ime/input_method_delegate.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class KeyEvent;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A helper that provides functionality shared by InputMethod implementations.
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class VIEWS_EXPORT InputMethodBase : public InputMethod,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     public FocusChangeListener {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputMethodBase();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InputMethodBase();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from InputMethod.
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetDelegate(internal::InputMethodDelegate* delegate) OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Init(Widget* widget) OVERRIDE;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnTextInputTypeChanged(View* view) OVERRIDE;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ui::TextInputClient* GetTextInputClient() const OVERRIDE;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ui::TextInputType GetTextInputType() const OVERRIDE;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsMock() const OVERRIDE;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from FocusChangeListener.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWillChangeFocus(View* focused_before, View* focused) OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDidChangeFocus(View* focused_before, View* focused) OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::InputMethodDelegate* delegate() const { return delegate_; }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Widget* widget() const { return widget_; }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* GetFocusedView() const;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true only if the View is focused and its Widget is active.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsViewFocused(View* view) const;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if there is no focused text input client or its type is none.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsTextInputTypeNone() const;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Calls the focused text input client's OnInputMethodChanged() method.
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This has no effect if the text input type is ui::TEXT_INPUT_TYPE_NONE.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnInputMethodChanged() const;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convenience method to call delegate_->DispatchKeyEventPostIME().
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DispatchKeyEventPostIME(const ui::KeyEvent& key) const;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the current text input client's caret bounds in Widget's coordinates.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if the current text input client doesn't support text input.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetCaretBoundsInWidget(gfx::Rect* rect) const;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Removes any state installed on |widget_| and NULLs it out. Use if the
66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // widget is in a state such that it should no longer be used (such as when
67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // this is in its destructor).
68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void DetachFromWidget();
69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internal::InputMethodDelegate* delegate_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Widget* widget_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InputMethodBase);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_VIEWS_IME_INPUT_METHOD_BASE_H_
80