1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_BASE_IME_WIN_TSF_EVENT_ROUTER_H_
6#define UI_BASE_IME_WIN_TSF_EVENT_ROUTER_H_
7
8#include <atlbase.h>
9#include <atlcom.h>
10#include <msctf.h>
11
12#include <set>
13
14#include "base/basictypes.h"
15#include "base/callback.h"
16#include "base/compiler_specific.h"
17#include "ui/base/ime/text_input_type.h"
18#include "ui/base/range/range.h"
19#include "ui/base/ui_export.h"
20
21struct ITfDocumentMgr;
22
23namespace ui {
24
25class TSFEventRouterObserver {
26 public:
27  TSFEventRouterObserver() {}
28
29  // Called when the number of currently opened candidate windows changes.
30  virtual void OnCandidateWindowCountChanged(size_t window_count) {}
31
32  // Called when a composition is started.
33  virtual void OnTSFStartComposition() {}
34
35  // Called when the text contents are updated. If there is no composition,
36  // ui::Range::InvalidRange is passed to |composition_range|.
37  virtual void OnTextUpdated(const ui::Range& composition_range) {}
38
39  // Called when a composition is terminated.
40  virtual void OnTSFEndComposition() {}
41
42 protected:
43  virtual ~TSFEventRouterObserver() {}
44
45 private:
46  DISALLOW_COPY_AND_ASSIGN(TSFEventRouterObserver);
47};
48
49// This class monitores TSF related events and forwards them to given
50// |observer|.
51class UI_EXPORT TSFEventRouter {
52 public:
53  // Do not pass NULL to |observer|.
54  explicit TSFEventRouter(TSFEventRouterObserver* observer);
55  virtual ~TSFEventRouter();
56
57  // Returns true if the IME is composing text.
58  bool IsImeComposing();
59
60  // Callbacks from the TSFEventRouterDelegate:
61  void OnCandidateWindowCountChanged(size_t window_count);
62  void OnTSFStartComposition();
63  void OnTextUpdated(const ui::Range& composition_range);
64  void OnTSFEndComposition();
65
66  // Sets |thread_manager| to be monitored. |thread_manager| can be NULL.
67  void SetManager(ITfThreadMgr* thread_manager);
68
69 private:
70  class Delegate;
71
72  CComPtr<Delegate> delegate_;
73
74  TSFEventRouterObserver* observer_;
75
76  DISALLOW_COPY_AND_ASSIGN(TSFEventRouter);
77};
78
79}  // namespace ui
80
81#endif  // UI_BASE_IME_WIN_TSF_EVENT_ROUTER_H_
82