Index: views/ime/ime_context.h |
diff --git a/views/ime/ime_context.h b/views/ime/ime_context.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7261b4e974fe6b5be5c0ccc89c72db0fa7d2c2a9 |
--- /dev/null |
+++ b/views/ime/ime_context.h |
@@ -0,0 +1,240 @@ |
+// 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. |
+ |
+#ifndef VIEWS_IME_IME_CONTEXT_H_ |
+#define VIEWS_IME_IME_CONTEXT_H_ |
+#pragma once |
+ |
+#include <vector> |
+ |
+#include "base/basictypes.h" |
+#include "base/string16.h" |
+#include "third_party/skia/include/core/SkColor.h" |
+ |
+namespace gfx { |
+class Rect; |
+} |
+ |
+namespace views { |
+ |
+class IMEContext; |
+class KeyEvent; |
+class View; |
+ |
+// Duplicate WebKit::WebCompositionUnderline |
+struct CompositionUnderline { |
+ CompositionUnderline() |
+ : start_offset(0), |
+ end_offset(0), |
+ color(0), |
+ thick(false) {} |
+ |
+ CompositionUnderline(uint32 s, uint32 e, SkColor c, bool t) |
+ : start_offset(s), |
+ end_offset(e), |
+ color(c), |
+ thick(t) {} |
+ |
+ uint32 start_offset; |
+ uint32 end_offset; |
+ SkColor color; |
+ bool thick; |
+}; |
+ |
+// WebKit only supports underline attribue for composition, so we use |
+// CompositionUnderline as CompositionAttribute right now. |
+typedef struct CompositionUnderline CompositionAttribute; |
+typedef std::vector<CompositionAttribute> CompositionAttributeList; |
+ |
+// TODO(penghuang) more attributes (background, foreground color and etc) |
+// class CompositionAttribute { |
+// public: |
+// enum CompositionAttributeType{ |
+// CAT_UNDERLINE = 1, |
+// CAT_FORGROUND = 2, |
+// CAT_BACKGRUND = 3, |
+// }; |
+// |
+// CompositionAttributeType GetType() const { return type_; } |
+// unsigned GetStartOffset() const { return start_offset_; } |
+// unsigned GetEndOffset() const { return end_offset_; } |
+// unsigned GetValue() const { return value_; } |
+// |
+// private: |
+// CompositionAttributeType type_; |
+// unsigned start_offset_; |
+// unsigned end_offset_; |
+// unsigned value_; |
+// }; |
+ |
+// CommitTextListener is notified when a text is commited from the context. |
+class CommitTextListener { |
+ public: |
+ virtual void OnCommitText(IMEContext* sender, |
+ const string16& text) = 0; |
+ |
+ protected: |
+ virtual ~CommitTextListener() {} |
+}; |
+ |
+// CompositionListener is notified when composition of the context is changed. |
+class CompositionListener { |
+ public: |
+ virtual void OnStartComposition(IMEContext* sender) = 0; |
+ virtual void OnEndComposition(IMEContext* sender) = 0; |
+ virtual void OnSetComposition(IMEContext* sender, |
+ const string16& text, |
+ const CompositionAttributeList& attributes, |
+ uint32 cursor_pos) = 0; |
+ |
+ protected: |
+ virtual ~CompositionListener() {} |
+}; |
+ |
+// CompositionListener is notified when a key event is forwarded from |
+// the context. |
+class ForwardKeyEventListener { |
+ public: |
+ virtual void OnForwardKeyEvent(IMEContext* sender, |
+ const KeyEvent& event) = 0; |
+ |
+ protected: |
+ virtual ~ForwardKeyEventListener() {} |
+}; |
+ |
+// SurroundingListener is notified when an input method context needs to |
+// manipulate the text surround the input cursor. If associated view supports |
+// surrounding, it should set the listener to input method context. Some input |
+// methods generate different result depends on the chars before or after the |
+// input cursor. |
+// |
+// For example: |
+// Some Korean input method: |
+// Key events Unicode char |
+// 1 'C' +U314a |
+// 2 'K' +U314f |
+// 3 'C' 'K' +Ucc28 |
+// |
+// In case 2 and 3, when users press 'K', the input method will check the char |
+// before input cursor. If the char is +U314a, it will remove the char and |
+// insert a new char +Ucc28. If no char before input cursor, it will insert char |
+// +U314f. |
+// |
+// See also OnSetSurroundingActive() and OnDeleteSurrounding(). |
+class SurroundingListener { |
+ public: |
+ // Activate or inactivate surrounding support. When surrounding is activated, |
+ // The assoicated view should call SetSurrounding() to notify any changes of |
+ // text surround the input cursor. |
+ // Return true if associated view can support surrounding. |
+ virtual bool OnSetSurroundingActive(IMEContext* sender, |
+ bool activate) = 0; |
+ |
+ // Delete a picse of text surround the input cursor. |
+ // Return true if associated view delete the surrounding text successfully. |
+ virtual bool OnDeleteSurrounding(IMEContext* sender, |
+ int offset, |
+ int chars) = 0; |
+ protected: |
+ virtual ~SurroundingListener() {} |
+}; |
+ |
+class IMEContext { |
+ public: |
+ virtual ~IMEContext() {} |
+ |
+ // Set associated view. |
+ void set_view(View* view) { view_ = view; } |
+ |
+ // Get associated view. |
+ const View* view() const { return view_; } |
+ |
+ // Set a listener to receive a callback when im context commits a text. |
+ void set_commit_text_listener(CommitTextListener* listener) { |
+ commit_text_listener_ = listener; |
+ } |
+ |
+ // Set a listener to receive a callback when im context changes composition. |
+ void set_composition_listener(CompositionListener* listener) { |
+ composition_listener_ = listener; |
+ } |
+ |
+ // Set a listener to receive a callback when im context forwards a key event. |
+ void set_forward_key_event_listener(ForwardKeyEventListener* listener) { |
+ forward_key_event_listener_ = listener; |
+ } |
+ |
+ // Set a listener to receive a callback when im context need operater |
+ // surrounding. |
+ void set_surrounding_listener(SurroundingListener* listener) { |
+ surrounding_listener_ = listener; |
+ } |
+ |
+ // Tell the context it got/lost focus. |
+ virtual void Focus() = 0; |
+ virtual void Blur() = 0; |
+ |
+ // Reset context, context will be reset to initial state. |
+ virtual void Reset() = 0; |
+ |
+ // Filter key event, returns true, if the key event is handled, |
+ // associated widget should ignore it. |
+ virtual bool FilterKeyEvent(const views::KeyEvent& event) = 0; |
+ |
+ // Set text input cursor location on screen. |
+ virtual void SetCursorLocation(const gfx::Rect& caret_rect) = 0; |
+ |
+ // Set surrounding context. |
+ virtual void SetSurrounding(const string16& text, |
+ int cursor_pos) = 0; |
+ |
+ // Create an im context. |
+ static IMEContext* Create(View* view); |
+ |
+ protected: |
+ explicit IMEContext(View* view); |
+ |
+ // Commit text. |
+ void CommitText(const string16& text); |
+ |
+ // Start compostion. |
+ void StartComposition(); |
+ |
+ // End composition. |
+ void EndComposition(); |
+ |
+ // Set composition. |
+ void SetComposition(const string16& text, |
+ const CompositionAttributeList& attributes, |
+ uint32 cursor_pos); |
+ |
+ // Forward key event. |
+ void ForwardKeyEvent(const KeyEvent& event); |
+ |
+ // Notify the associated view whether or not the input context needs |
+ // surrounding. When surrounding is activated, associated view should |
+ // call SetSurrounding() to update any changes of text arround the input |
+ // cursor. |
+ // Return true if associated view can support surrounding. |
+ bool SetSurroundingActive(bool activate); |
+ |
+ // Delete surrouding arround cursor. Return true, if it is handled. |
+ bool DeleteSurrounding(int offset, int nchars); |
+ |
+ private: |
+ // Client view. |
+ View* view_; |
+ |
+ // Listeners: |
+ CommitTextListener* commit_text_listener_; |
+ CompositionListener* composition_listener_; |
+ ForwardKeyEventListener* forward_key_event_listener_; |
+ SurroundingListener* surrounding_listener_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(IMEContext); |
+}; |
+ |
+} // namespace views |
+ |
+#endif // VIEWS_IME_IM_CONTEXT_H_ |