text: // 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.
  
  #ifndef UI_VIEWS_IME_INPUT_METHOD_BRIDGE_H_
  #define UI_VIEWS_IME_INPUT_METHOD_BRIDGE_H_
  
  #include <string>
  
  #include "base/basictypes.h"
  #include "base/compiler_specific.h"
  #include "ui/base/ime/text_input_client.h"
  #include "ui/gfx/rect.h"
  #include "ui/views/ime/input_method_base.h"
  
  namespace ui {
  class InputMethod;
  }  // namespace ui
  
  namespace views {
  
  class View;
  
  // A "bridge" InputMethod implementation for views top-level widgets, which just
  // sends/receives IME related events to/from a system-wide ui::InputMethod
  // object.
  class InputMethodBridge : public InputMethodBase,
                            public ui::TextInputClient {
   public:
    // |shared_input_method| indicates if |host| is shared among other top level
    // widgets.
    InputMethodBridge(internal::InputMethodDelegate* delegate,
                      ui::InputMethod* host,
                      bool shared_input_method);
    virtual ~InputMethodBridge();
  
    // Overridden from InputMethod:
    virtual void OnFocus() OVERRIDE;
    virtual void OnBlur() OVERRIDE;
    virtual bool OnUntranslatedIMEMessage(const base::NativeEvent& event,
                                          NativeEventResult* result) OVERRIDE;
    virtual void DispatchKeyEvent(const ui::KeyEvent& key) OVERRIDE;
    virtual void OnTextInputTypeChanged(View* view) OVERRIDE;
    virtual void OnCaretBoundsChanged(View* view) OVERRIDE;
    virtual void CancelComposition(View* view) OVERRIDE;
    virtual void OnInputLocaleChanged() OVERRIDE;
    virtual std::string GetInputLocale() OVERRIDE;
    virtual bool IsActive() OVERRIDE;
    virtual bool IsCandidatePopupOpen() const OVERRIDE;
    virtual void ShowImeIfNeeded() OVERRIDE;
  
    // Overridden from TextInputClient:
    virtual void SetCompositionText(
        const ui::CompositionText& composition) OVERRIDE;
    virtual void ConfirmCompositionText() OVERRIDE;
    virtual void ClearCompositionText() OVERRIDE;
    virtual void InsertText(const base::string16& text) OVERRIDE;
    virtual void InsertChar(base::char16 ch, int flags) OVERRIDE;
    virtual gfx::NativeWindow GetAttachedWindow() const OVERRIDE;
    virtual ui::TextInputType GetTextInputType() const OVERRIDE;
    virtual ui::TextInputMode GetTextInputMode() const OVERRIDE;
    virtual bool CanComposeInline() const OVERRIDE;
    virtual gfx::Rect GetCaretBounds() const OVERRIDE;
    virtual bool GetCompositionCharacterBounds(uint32 index,
                                               gfx::Rect* rect) const OVERRIDE;
    virtual bool HasCompositionText() const OVERRIDE;
    virtual bool GetTextRange(gfx::Range* range) const OVERRIDE;
    virtual bool GetCompositionTextRange(gfx::Range* range) const OVERRIDE;
    virtual bool GetSelectionRange(gfx::Range* range) const OVERRIDE;
    virtual bool SetSelectionRange(const gfx::Range& range) OVERRIDE;
    virtual bool DeleteRange(const gfx::Range& range) OVERRIDE;
    virtual bool GetTextFromRange(const gfx::Range& range,
                                  base::string16* text) const OVERRIDE;
    virtual void OnInputMethodChanged() OVERRIDE;
    virtual bool ChangeTextDirectionAndLayoutAlignment(
        base::i18n::TextDirection direction) OVERRIDE;
    virtual void ExtendSelectionAndDelete(size_t before, size_t after) OVERRIDE;
    virtual void EnsureCaretInRect(const gfx::Rect& rect) OVERRIDE;
    virtual void OnCandidateWindowShown() OVERRIDE;
    virtual void OnCandidateWindowUpdated() OVERRIDE;
    virtual void OnCandidateWindowHidden() OVERRIDE;
    virtual bool IsEditingCommandEnabled(int command_id) OVERRIDE;
    virtual void ExecuteEditingCommand(int command_id) OVERRIDE;
  
    // Overridden from FocusChangeListener.
    virtual void OnWillChangeFocus(View* focused_before, View* focused) OVERRIDE;
    virtual void OnDidChangeFocus(View* focused_before, View* focused) OVERRIDE;
  
    ui::InputMethod* GetHostInputMethod() const;
  
   private:
    class HostObserver;
  
    void UpdateViewFocusState();
  
    ui::InputMethod* host_;
  
    // An observer observing the host input method for cases that the host input
    // method is destroyed before this bridge input method.
    scoped_ptr<HostObserver> host_observer_;
  
    const bool shared_input_method_;
  
    DISALLOW_COPY_AND_ASSIGN(InputMethodBridge);
  };
  
  }  // namespace views
  
  #endif  // UI_VIEWS_IME_INPUT_METHOD_BRIDGE_H_
  