Index: ui/base/win/tsf_text_store.h |
diff --git a/ui/base/win/tsf_text_store.h b/ui/base/win/tsf_text_store.h |
index 1fb8253740a599b3c88fb46da12093b5ad3bf357..a1adf96febacb347190ccf9c7eef242e16b7caa1 100644 |
--- a/ui/base/win/tsf_text_store.h |
+++ b/ui/base/win/tsf_text_store.h |
@@ -6,12 +6,17 @@ |
#define UI_BASE_WIN_TSF_TEXT_STORE_H_ |
#include <msctf.h> |
+#include <deque> |
#include "base/basictypes.h" |
#include "base/compiler_specific.h" |
+#include "base/string16.h" |
#include "base/win/scoped_comptr.h" |
+#include "ui/base/ime/composition_underline.h" |
+#include "ui/base/range/range.h" |
namespace ui { |
+class TextInputClient; |
// TsfTextStore is used to interact with the system input method via TSF. |
class TsfTextStore : public ITextStoreACP, |
@@ -19,7 +24,7 @@ class TsfTextStore : public ITextStoreACP, |
public ITfTextEditSink { |
public: |
TsfTextStore(); |
- ~TsfTextStore(); |
+ virtual ~TsfTextStore(); |
virtual ULONG STDMETHODCALLTYPE AddRef() OVERRIDE; |
virtual ULONG STDMETHODCALLTYPE Release() OVERRIDE; |
@@ -144,7 +149,18 @@ class TsfTextStore : public ITextStoreACP, |
TfEditCookie read_only_edit_cookie, |
ITfEditRecord* edit_record) OVERRIDE; |
+ // Sets currently focused TextInputClient. |
+ void SetFocusedTextInputClient(HWND focused_window, |
+ TextInputClient* text_input_client); |
+ // Removes currently focused TextInputClient. |
+ void RemoveFocusedTextInputClient(TextInputClient* text_input_client); |
+ |
+ // Sends OnLayoutChange() via |text_store_acp_sink_|. |
+ void SendOnLayoutChange(); |
+ |
private: |
+ friend class TsfTextStoreTest; |
+ |
// The refrence count of this instance. |
volatile LONG ref_count_; |
@@ -154,9 +170,99 @@ class TsfTextStore : public ITextStoreACP, |
// The current mask of |text_store_acp_sink_|. |
DWORD text_store_acp_sink_mask_; |
+ // HWND of the current view window which is set in SetFocusedTextInputClient. |
+ HWND hwnd_; |
+ |
+ // Current TextInputClient which is set in SetFocusedTextInputClient. |
+ TextInputClient* text_input_client_; |
+ |
+ // Current status of the text store. |
+ struct TextStoreStatus { |
Seigo Nonaka
2012/08/21 16:14:06
Do you think this struct should be exposed?
If not
horo
2012/08/22 02:22:33
It is exposed because I would like to access to th
|
+ public: |
+ TextStoreStatus() |
+ : commited_size_(0), |
+ edit_flag_(false) { |
+ } |
+ void InsertText(int position, const string16& buffer){ |
+ string_buffer_ = string_buffer_.substr(0, position) + |
+ buffer + string_buffer_.substr(position); |
+ } |
+ void RemoveText(size_t position, size_t count) { |
+ string_buffer_ = string_buffer_.substr(0, position) + |
+ string_buffer_.substr(position + count); |
+ } |
+ void MoveSelection(size_t selection_start, size_t selection_end) { |
+ size_t text_length = string_buffer_.length(); |
+ if (selection_start >= text_length) |
+ selection_start = text_length; |
+ if (selection_end >= text_length) |
+ selection_end = text_length; |
+ selection_.set_start(selection_start); |
+ selection_.set_end(selection_end); |
+ } |
+ |
+ // |string_buffer_| contains commited string and composition string. |
+ // example: "aoi" is committed, and "umi" is under composition. |
+ // |string_buffer_|: "aoiumi" |
+ // |commited_size_|: 3 |
+ string16 string_buffer_; |
+ size_t commited_size_; |
+ |
+ // |selection_start_| and |selection_end_| indicates the selection range. |
+ // example: "iue" is selected |
+ // |string_buffer_|: "aiueo" |
+ // |selection_.start()|: 1 |
+ // |selection_.end()|: 4 |
+ Range selection_; |
+ |
+ // |start_offset| and |end_offset| of |composition_undelines_| indicates |
+ // the offsets in |string_buffer_|. |
+ // example: "aoi" is committed. There are two underlines in "umi" and "no". |
+ // |string_buffer_|: "aoiumino" |
+ // |commited_size_|: 3 |
+ // composition_undelines_.underlines[0].start_offset: 3 |
+ // composition_undelines_.underlines[0].end_offset: 6 |
+ // composition_undelines_.underlines[1].start_offset: 6 |
+ // composition_undelines_.underlines[1].end_offset: 8 |
+ CompositionUnderlines composition_undelines_; |
+ |
+ // |edit_flag_| indicates that the status is edited during |
+ // ITextStoreACPSink::OnLockGranted(). |
+ bool edit_flag_; |
+ } status_; |
+ |
+ // The type of current lock. |
+ // 0: No lock. |
+ // TS_LF_READ: read-only lock. |
+ // TS_LF_READWRITE: read/write lock. |
+ DWORD current_lock_type_; |
+ |
+ // Queue of the lock request used in RequestLock(). |
+ std::deque<DWORD> lock_queue_; |
+ |
+ // Check if the document has a read-only lock. |
+ bool ReaderLocked() const; |
+ |
+ // Check if the document has a read and write lock. |
+ bool WriterLocked() const; |
+ |
+ // Category manager and Display attribute manager are used to obtain the |
+ // attributes of the composition string. |
+ base::win::ScopedComPtr<ITfCategoryMgr> category_manager_; |
+ base::win::ScopedComPtr<ITfDisplayAttributeMgr> display_attribute_manager_; |
+ |
+ // Gets the display attribute structure. |
+ bool GetDisplayAttribute(TfGuidAtom guid_atom, |
+ TF_DISPLAYATTRIBUTE* attribute); |
+ |
+ // Gets the commited string size and underline information of the context. |
+ bool GetCompositionStatus(ITfContext* context, |
+ const TfEditCookie read_only_edit_cookie, |
+ size_t* commited_size, |
+ CompositionUnderlines* undelines); |
DISALLOW_COPY_AND_ASSIGN(TsfTextStore); |
}; |
} // namespace ui |
-#endif // UI_BASE_WIN_TSF_TEXT_STORE_H_ |
+#endif // UI_BASE_WIN_TSF_TEXT_STORE_H_ |