OSDN Git Service

初コミット
[fooeditengine/FooEditEngine.git] / Common / DotNetTextStore / TextStore.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Linq;\r
4 using System.Text;\r
5 using System.Diagnostics;\r
6 using System.Reflection;\r
7 using System.Runtime.InteropServices;\r
8 using System.Globalization;\r
9 \r
10 using DotNetTextStore.UnmanagedAPI.TSF;\r
11 using DotNetTextStore.UnmanagedAPI.TSF.TextStore;\r
12 using DotNetTextStore.UnmanagedAPI.WinDef;\r
13 using DotNetTextStore.UnmanagedAPI.WinError;\r
14 \r
15 namespace DotNetTextStore \r
16 {\r
17 \r
18 \r
19     //========================================================================================\r
20 \r
21     /// <summary>\r
22     ///  テキストストアの実装を担うクラス。\r
23     /// <pre>\r
24     ///   各ドキュメント毎に実装すべき部分をイベントとして切り離して、テキストストアの実装を楽に\r
25     ///   させる。\r
26     /// </pre>\r
27     /// <pre>\r
28     ///   使用側としては各イベントハンドラの実装、フォーカスを取得した時に SetFocus() メソッドの\r
29     ///   呼び出し、選択やテキストが変更された時に NotifySelectionChanged() メソッドや\r
30     ///   NotifyTextChange() メソッドの呼び出しを行う必要がある。\r
31     /// </pre>\r
32     public sealed class TextStore :  TextStoreBase,IDisposable, ITextStoreACP, ITfContextOwnerCompositionSink\r
33     {\r
34         public delegate IntPtr GetHWndHandler();\r
35         public event GetHWndHandler GetHWnd;\r
36 \r
37         #region "生成と破棄"\r
38         /// <summary>\r
39         /// 後処理\r
40         /// </summary>\r
41         public void Dispose()\r
42         {\r
43             base.Dispose(false);\r
44             GC.SuppressFinalize(this);\r
45         }\r
46         #endregion\r
47 \r
48         #region ITextStoreACPの実装\r
49         public void GetWnd(int i_viewCookie, out IntPtr o_hwnd)\r
50         {\r
51 #if TSF_DEBUG_OUTPUT\r
52             using(var dbgout = new DebugOut("{0}()", DebugOut.GetCaller()) )\r
53 #endif\r
54             {\r
55                 if (GetHWnd != null)\r
56                     o_hwnd = GetHWnd();\r
57                 else\r
58                     o_hwnd = IntPtr.Zero;\r
59             }\r
60         }\r
61         #endregion\r
62 \r
63         #region TSF 関連のラッパメソッド\r
64         /// <summary>\r
65         /// スレッドマネージャの生成\r
66         /// </summary>\r
67         /// \r
68         /// <exception cref="COMException">\r
69         /// スレッドマネージャーの生成に失敗した場合。\r
70         /// </exception>\r
71         protected override void CreateThreadMgr()\r
72         {\r
73             if( _threadMgr == null )\r
74             {\r
75                 TextFrameworkFunctions.TF_GetThreadMgr(out _threadMgr);\r
76                 if( _threadMgr == null )\r
77                 {\r
78                     Type clsid = Marshal.GetTypeFromCLSID(TfDeclarations.CLSID_TF_ThreadMgr);\r
79                     _threadMgr = Activator.CreateInstance(clsid) as ITfThreadMgr;\r
80 \r
81                     if( _threadMgr == null )\r
82                     {\r
83                         const string message = "スレッドマネージャーの生成に失敗しました。";\r
84                         Debug.WriteLine(message);\r
85                         throw new COMException(message, HRESULT.E_NOTIMPL);\r
86                     }\r
87                 }\r
88             }\r
89         }\r
90 \r
91         #endregion\r
92 \r
93     }\r
94 }\r