OSDN Git Service

ファイル読み込み中の時だけユーザの入力を受け付けないようにした
[fooeditengine/FooEditEngine.git] / Windows / FooEditEngine / FooTextBox.cs
index 669783e..d868049 100644 (file)
@@ -9,7 +9,9 @@
 You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.\r
  */\r
 using System;\r
+using System.Text;\r
 using System.Threading;\r
+using System.Threading.Tasks;\r
 using System.Windows.Forms;\r
 using System.Drawing;\r
 using System.ComponentModel;\r
@@ -70,14 +72,13 @@ namespace FooEditEngine.Windows
             this.SetStyle(ControlStyles.Opaque, true);\r
 \r
             this.Document = new Document();\r
-            DocumentExtend.Progress += Document_Progress;\r
 \r
             this.render = new D2DTextRender(this);\r
-            this.View = new EditView(this.Document,this.render,new Margin(5,5,5,5));\r
+            this.View = new EditView(this.Document,this.render,new FooEditEngine.Padding(5,5,5,5));\r
             this.View.SrcChanged += View_SrcChanged;\r
             \r
             this.Controller = new Controller(this.Document, this.View);\r
-            this.Controller.CaretMoved += new EventHandler(Controller_CaretMoved);\r
+            this.Controller.SelectionChanged += new EventHandler(Controller_CaretMoved);\r
 \r
             this.Ime = new WinIME(this);\r
             this.Ime.ImeCompstion += new ImeCompstionEventHandeler(Ime_ImeCompstion);\r
@@ -94,17 +95,18 @@ namespace FooEditEngine.Windows
 \r
             this.TabStopChange += new TabStopChangeEventHandler((s, e) => { });\r
             this.InsetModeChange += new InsertModeChangeEventHandler((s, e) => { });\r
-            this.CaretMoved +=new EventHandler((s,e)=>{});\r
+            this.SelectionChanged +=new EventHandler((s,e)=>{});\r
 \r
             this.RightToLeftChanged += FooTextBox_RightToLeftChanged;\r
 \r
             SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);\r
+\r
         }\r
 \r
         /// <summary>\r
         /// キャレットが移動したときに通知されるイベント\r
         /// </summary>\r
-        public event EventHandler CaretMoved;\r
+        public event EventHandler SelectionChanged;\r
 \r
         /// <summary>\r
         /// タブの幅が変更された時に発生するイベント\r
@@ -133,6 +135,18 @@ namespace FooEditEngine.Windows
         }\r
 \r
         /// <summary>\r
+        /// マーカーパターンセットを表す\r
+        /// </summary>\r
+        [BrowsableAttribute(false)]\r
+        public MarkerPatternSet MarkerPatternSet\r
+        {\r
+            get\r
+            {\r
+                return this.View.MarkerPatternSet;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
         /// 保持しているドキュメント\r
         /// </summary>\r
         [BrowsableAttribute(false)]\r
@@ -378,25 +392,23 @@ namespace FooEditEngine.Windows
         }\r
 \r
         /// <summary>\r
-        /// é\81¸æ\8a\9eç¯\84å\9b²ã\81®é\96\8bå§\8bã\82¤ã\83³ã\83\87ã\83\83ã\82¯ã\82¹\r
+        /// é\81¸æ\8a\9eç¯\84å\9b²ã\82\92表ã\81\99\r
         /// </summary>\r
-        /// <remarks>SelectionLengthが0の場合はキャレット位置を表します</remarks>\r
+        /// <remarks>\r
+        /// Lengthが0の場合はキャレット位置を表します\r
+        /// 矩形選択モードの場合、選択範囲の文字数ではなく、開始位置から終了位置までの長さとなります\r
+        /// </remarks>\r
         [BrowsableAttribute(false)]\r
-        public int SelectionStart\r
+        public TextRange Selection\r
         {\r
-            get { return this.Controller.SelectionStart; }\r
+            get { return new TextRange(this.Controller.SelectionStart,this.Controller.SelectionLength); }\r
+            set\r
+            {\r
+                this.Controller.Select(value.Index, value.Length);\r
+            }\r
         }\r
 \r
         /// <summary>\r
-        /// 選択範囲の長さ\r
-        /// </summary>\r
-        /// <remarks>矩形選択モードの場合、選択範囲の文字数ではなく、開始位置から終了位置までの長さとなります</remarks>\r
-        [BrowsableAttribute(false)]\r
-        public int SelectionLength\r
-        {\r
-            get { return this.Controller.SelectionLength; }\r
-        }\r
-        /// <summary>\r
         /// 挿入モードかどうか\r
         /// </summary>\r
         [DefaultValue(true)]\r
@@ -420,6 +432,20 @@ namespace FooEditEngine.Windows
             set { this.Controller.RectSelection = value; }\r
         }\r
 \r
+        System.Drawing.Color ForegroundColor = SystemColors.ControlText,\r
+            BackgroundColor = SystemColors.Control,\r
+            HilightColor = System.Drawing.Color.DeepSkyBlue,\r
+            Keyword1Color = System.Drawing.Color.Blue,\r
+            Keyword2Color = System.Drawing.Color.DarkCyan,\r
+            LiteralColor = System.Drawing.Color.Brown,\r
+            UrlColor = System.Drawing.Color.Blue,\r
+            ControlCharColor = System.Drawing.Color.Gray,\r
+            CommentColor = System.Drawing.Color.Green,\r
+            InsertCaretColor = System.Drawing.Color.Black,\r
+            OverwriteCaretColor = System.Drawing.Color.Black,\r
+            LineMarkerColor = System.Drawing.Color.WhiteSmoke,\r
+            UpdateAreaColor = System.Drawing.Color.MediumSeaGreen;\r
+\r
         /// <summary>\r
         /// 前景色\r
         /// </summary>\r
@@ -427,11 +453,12 @@ namespace FooEditEngine.Windows
         {\r
             get\r
             {\r
-                return this.render.Foreground;\r
+                return this.ForegroundColor;\r
             }\r
             set\r
             {\r
-                this.render.Foreground = value;\r
+                this.render.Foreground = D2DTextRender.ToColor4(value);\r
+                this.ForegroundColor = value;\r
             }\r
         }\r
 \r
@@ -442,11 +469,12 @@ namespace FooEditEngine.Windows
         {\r
             get\r
             {\r
-                return this.render.Background;\r
+                return this.BackgroundColor;\r
             }\r
             set\r
             {\r
-                this.render.Background = value;\r
+                this.render.Background = D2DTextRender.ToColor4(value);\r
+                this.BackgroundColor = value;\r
             }\r
         }\r
 \r
@@ -457,11 +485,12 @@ namespace FooEditEngine.Windows
         {\r
             get\r
             {\r
-                return this.render.InsertCaret;\r
+                return this.InsertCaretColor;\r
             }\r
             set\r
             {\r
-                this.render.InsertCaret = value;\r
+                this.InsertCaretColor = value;\r
+                this.render.InsertCaret = D2DTextRender.ToColor4(value);\r
             }\r
         }\r
 \r
@@ -472,11 +501,12 @@ namespace FooEditEngine.Windows
         {\r
             get\r
             {\r
-                return this.render.OverwriteCaret;\r
+                return this.OverwriteCaretColor;\r
             }\r
             set\r
             {\r
-                this.render.OverwriteCaret = value;\r
+                this.OverwriteCaretColor = value;\r
+                this.render.OverwriteCaret = D2DTextRender.ToColor4(value);\r
             }\r
         }\r
 \r
@@ -487,11 +517,12 @@ namespace FooEditEngine.Windows
         {\r
             get\r
             {\r
-                return this.render.LineMarker;\r
+                return this.LineMarkerColor;\r
             }\r
             set\r
             {\r
-                this.render.LineMarker = value;\r
+                this.LineMarkerColor = value;\r
+                this.render.LineMarker = D2DTextRender.ToColor4(value);\r
             }\r
         }\r
 \r
@@ -502,11 +533,28 @@ namespace FooEditEngine.Windows
         {\r
             get\r
             {\r
-                return this.render.ControlChar;\r
+                return this.ControlCharColor;\r
             }\r
             set\r
             {\r
-                this.render.ControlChar = value;\r
+                this.ControlCharColor = value;\r
+                this.render.ControlChar = D2DTextRender.ToColor4(value);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// 編集行フラグの色\r
+        /// </summary>\r
+        public System.Drawing.Color UpdateArea\r
+        {\r
+            get\r
+            {\r
+                return this.UpdateAreaColor;\r
+            }\r
+            set\r
+            {\r
+                this.UpdateAreaColor = value;\r
+                this.render.UpdateArea = D2DTextRender.ToColor4(value);\r
             }\r
         }\r
 \r
@@ -517,11 +565,12 @@ namespace FooEditEngine.Windows
         {\r
             get\r
             {\r
-                return this.render.Url;\r
+                return this.UrlColor;\r
             }\r
             set\r
             {\r
-                this.render.Url = value;\r
+                this.UrlColor = value;\r
+                this.render.Url = D2DTextRender.ToColor4(value);\r
             }\r
         }\r
 \r
@@ -532,11 +581,12 @@ namespace FooEditEngine.Windows
         {\r
             get\r
             {\r
-                return this.render.Hilight;\r
+                return this.HilightColor;\r
             }\r
             set\r
             {\r
-                this.render.Hilight = value;\r
+                this.HilightColor = value;\r
+                this.render.Hilight = D2DTextRender.ToColor4(value);\r
             }\r
         }\r
 \r
@@ -547,11 +597,12 @@ namespace FooEditEngine.Windows
         {\r
             get\r
             {\r
-                return this.render.Comment;\r
+                return this.CommentColor;\r
             }\r
             set\r
             {\r
-                this.render.Comment = value;\r
+                this.CommentColor = value;\r
+                this.render.Comment = D2DTextRender.ToColor4(value);\r
             }\r
         }\r
 \r
@@ -562,11 +613,12 @@ namespace FooEditEngine.Windows
         {\r
             get\r
             {\r
-                return this.render.Literal;\r
+                return this.LiteralColor;\r
             }\r
             set\r
             {\r
-                this.render.Literal = value;\r
+                this.LiteralColor = value;\r
+                this.render.Literal = D2DTextRender.ToColor4(value);\r
             }\r
         }\r
 \r
@@ -577,11 +629,12 @@ namespace FooEditEngine.Windows
         {\r
             get\r
             {\r
-                return this.render.Keyword1;\r
+                return this.Keyword1Color;\r
             }\r
             set\r
             {\r
-                this.render.Keyword1 = value;\r
+                this.Keyword1Color = value;\r
+                this.render.Keyword1 = D2DTextRender.ToColor4(value);\r
             }\r
         }\r
 \r
@@ -592,18 +645,19 @@ namespace FooEditEngine.Windows
         {\r
             get\r
             {\r
-                return this.render.Keyword2;\r
+                return this.Keyword2Color;\r
             }\r
             set\r
             {\r
-                this.render.Keyword2 = value;\r
+                this.Keyword2Color = value;\r
+                this.render.Keyword2 = D2DTextRender.ToColor4(value);\r
             }\r
         }\r
 \r
         /// <summary>\r
         /// キャレットに下線を描くかどうか\r
         /// </summary>\r
-        [DefaultValue(true)]\r
+        [DefaultValue(false)]\r
         public bool DrawCaretLine\r
         {\r
             get { return !this.View.HideLineMarker; }\r
@@ -617,8 +671,6 @@ namespace FooEditEngine.Windows
         /// <param name="length">長さ</param>\r
         public void Select(int start, int length)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             this.Controller.Select(start, length);\r
             this.HScrollBar.Value = (int)this.View.Src.X;\r
             this.VScrollBar.Value = this.View.Src.Row;\r
@@ -629,8 +681,6 @@ namespace FooEditEngine.Windows
         /// </summary>\r
         public void SelectAll()\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             this.Controller.Select(0, this.Document.Length - 1);\r
         }\r
 \r
@@ -639,8 +689,6 @@ namespace FooEditEngine.Windows
         /// </summary>\r
         public void DeSelectAll()\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             this.Controller.DeSelectAll();\r
         }\r
 \r
@@ -649,8 +697,6 @@ namespace FooEditEngine.Windows
         /// </summary>\r
         public void Copy()\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             string text = this.SelectedText;\r
             if(text != null && text != string.Empty)\r
                 Clipboard.SetText(text);\r
@@ -661,8 +707,6 @@ namespace FooEditEngine.Windows
         /// </summary>\r
         public void Cut()\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             string text = this.SelectedText;\r
             if (text != null && text != string.Empty)\r
             {\r
@@ -676,8 +720,6 @@ namespace FooEditEngine.Windows
         /// </summary>\r
         public void Paste()\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             if (Clipboard.ContainsText() == false)\r
                 return;\r
             this.Controller.SelectedText = Clipboard.GetText();\r
@@ -690,8 +732,6 @@ namespace FooEditEngine.Windows
         /// <remarks>このメソッドを呼び出すと選択状態は解除されます</remarks>\r
         public void JumpCaret(int index)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             this.Controller.JumpCaret(index);\r
         }\r
         /// <summary>\r
@@ -702,8 +742,6 @@ namespace FooEditEngine.Windows
         /// <remarks>このメソッドを呼び出すと選択状態は解除されます</remarks>\r
         public void JumpCaret(int row, int col)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             this.Controller.JumpCaret(row, col);\r
         }\r
 \r
@@ -712,8 +750,6 @@ namespace FooEditEngine.Windows
         /// </summary>\r
         public new void Refresh()\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
             if (this.Document.FireUpdateEvent == false)\r
                 throw new InvalidOperationException("");\r
             if(this.View.CaretBlink)\r
@@ -729,8 +765,6 @@ namespace FooEditEngine.Windows
         /// <returns>高さ</returns>\r
         public double GetLineHeight(int row)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             if (this.Document.FireUpdateEvent == false)\r
                 throw new InvalidOperationException("");\r
             return this.View.LayoutLines.GetLayout(row).Height;\r
@@ -744,8 +778,6 @@ namespace FooEditEngine.Windows
         /// <remarks>テキストポイントがクライアント領域の原点より外にある場合、返される値は原点に丸められます</remarks>\r
         public System.Drawing.Point GetPostionFromTextPoint(TextPoint tp)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             if (this.Document.FireUpdateEvent == false)\r
                 throw new InvalidOperationException("");\r
             return this.View.GetPostionFromTextPoint(tp);\r
@@ -758,8 +790,6 @@ namespace FooEditEngine.Windows
         /// <returns>テキストポイント</returns>\r
         public TextPoint GetTextPointFromPostion(System.Drawing.Point p)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             if (this.Document.FireUpdateEvent == false)\r
                 throw new InvalidOperationException("");\r
             return this.View.GetTextPointFromPostion(p);\r
@@ -772,8 +802,6 @@ namespace FooEditEngine.Windows
         /// <returns>座標を返す</returns>\r
         public System.Drawing.Point GetPostionFromIndex(int index)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             if (this.Document.FireUpdateEvent == false)\r
                 throw new InvalidOperationException("");\r
             TextPoint tp = this.View.GetLayoutLineFromIndex(index);\r
@@ -787,8 +815,6 @@ namespace FooEditEngine.Windows
         /// <returns>インデックスを返す</returns>\r
         public int GetIndexFromPostion(System.Drawing.Point p)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                throw new InvalidOperationException();\r
             if (this.Document.FireUpdateEvent == false)\r
                 throw new InvalidOperationException("");\r
             TextPoint tp = this.View.GetTextPointFromPostion(p);\r
@@ -805,6 +831,57 @@ namespace FooEditEngine.Windows
         }\r
 \r
         /// <summary>\r
+        /// ストリームからドキュメントを構築する\r
+        /// </summary>\r
+        /// <param name="tr">TextReader</param>\r
+        /// <param name="token">キャンセル用トークン</param>\r
+        /// <returns>Taskオブジェクト</returns>\r
+        public async Task LoadAsync(System.IO.TextReader tr, System.Threading.CancellationTokenSource token)\r
+        {\r
+            WinFileReader fs = new WinFileReader(tr);\r
+            await this.LoadAsyncImpl(fs, token);\r
+        }\r
+\r
+        /// <summary>\r
+        /// ファイルからドキュメントを構築する\r
+        /// </summary>\r
+        /// <param name="filepath">ファイルパス</param>\r
+        /// <param name="enc">エンコード</param>\r
+        /// <param name="token">キャンセル用トークン</param>\r
+        /// <returns>Taskオブジェクト</returns>\r
+        public async Task LoadFileAsync(string filepath, Encoding enc, System.Threading.CancellationTokenSource token)\r
+        {\r
+            WinFileReader fs = new WinFileReader(filepath, enc);\r
+            await this.LoadAsyncImpl(fs, token);\r
+        }\r
+\r
+        async Task LoadAsyncImpl(WinFileReader fs, System.Threading.CancellationTokenSource token)\r
+        {\r
+            this.Enabled = false;\r
+            this.View.LayoutLines.IsFrozneDirtyFlag = true;\r
+            await this.Document.LoadAsync(fs, token);\r
+            this.View.LayoutLines.IsFrozneDirtyFlag = false;\r
+            this.initScrollBars();\r
+            this.OnMouseMove(new MouseEventArgs(MouseButtons.None, 0, MousePosition.X, MousePosition.Y, 0));\r
+            this.View.CalculateLineCountOnScreen();\r
+            this.Enabled = true;\r
+        }\r
+\r
+        /// <summary>\r
+        /// ドキュメントの内容をファイルに保存する\r
+        /// </summary>\r
+        /// <param name="filepath">ファイルパス</param>\r
+        /// <param name="newLine">改行コード</param>\r
+        /// <param name="enc">エンコード</param>\r
+        /// <returns>Taskオブジェクト</returns>\r
+        public async Task SaveFile(string filepath, Encoding enc, string newLine, System.Threading.CancellationTokenSource token)\r
+        {\r
+            WinFileWriter fs = new WinFileWriter(filepath, enc);\r
+            fs.NewLine = newLine;\r
+            await this.Document.SaveAsync(fs, token);\r
+        }\r
+\r
+        /// <summary>\r
         /// マウスカーソルを指定します\r
         /// </summary>\r
         public override Cursor Cursor\r
@@ -852,8 +929,6 @@ namespace FooEditEngine.Windows
         /// <returns>文字がコントロールによって処理された場合は true。それ以外の場合は false。 </returns>\r
         protected override bool ProcessCmdKey(ref Message msg, Keys keyData)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return false;\r
             const int WM_KEYDOWN = 0x100;\r
             if (msg.Msg != WM_KEYDOWN)\r
                 return base.ProcessCmdKey(ref msg, keyData);\r
@@ -924,6 +999,16 @@ namespace FooEditEngine.Windows
         }\r
 \r
         /// <summary>\r
+        /// PaddingChangedイベントを発生させます\r
+        /// </summary>\r
+        /// <param name="e">インベントデータ</param>\r
+        protected override void OnPaddingChanged(EventArgs e)\r
+        {\r
+            base.OnPaddingChanged(e);\r
+            this.View.Padding = new Padding(this.Padding.Left, this.Padding.Top, this.Padding.Right, this.Padding.Bottom);\r
+        }\r
+\r
+        /// <summary>\r
         /// GotFocusイベントを発生させます\r
         /// </summary>\r
         /// <param name="e">インベントデータ</param>\r
@@ -963,9 +1048,6 @@ namespace FooEditEngine.Windows
         /// <param name="e">インベントデータ</param>\r
         protected override void OnMouseDown(MouseEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
-\r
             TextPoint tp = this.View.GetTextPointFromPostion(e.Location);\r
             if (tp == TextPoint.Null)\r
                 return;\r
@@ -993,6 +1075,8 @@ namespace FooEditEngine.Windows
                 {\r
                     this.Controller.JumpCaret(tp.row, tp.col, false);\r
                 }\r
+                this.View.IsFocused = true;\r
+                this.Focus();\r
                 this.Refresh();\r
             }\r
         }\r
@@ -1003,9 +1087,6 @@ namespace FooEditEngine.Windows
         /// <param name="e">インベントデータ</param>\r
         protected override void OnMouseClick(MouseEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
-\r
             int index = this.GetIndexFromPostion(e.Location);\r
 \r
             FooMouseEventArgs mouseEvent = new FooMouseEventArgs(index, e.Button, e.Clicks, e.X, e.Y, e.Delta);\r
@@ -1019,9 +1100,6 @@ namespace FooEditEngine.Windows
         /// <param name="e">インベントデータ</param>\r
         protected override void OnMouseDoubleClick(MouseEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
-\r
             TextPoint tp = this.View.GetTextPointFromPostion(e.Location);\r
             if (tp == TextPoint.Null)\r
                 return;\r
@@ -1045,11 +1123,6 @@ namespace FooEditEngine.Windows
         /// <param name="e">インベントデータ</param>\r
         protected override void OnMouseMove(MouseEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-            {\r
-                this.Cursor = Cursors.WaitCursor;\r
-                return;\r
-            }\r
             if (this.Focused == false)\r
                 return;\r
 \r
@@ -1081,9 +1154,6 @@ namespace FooEditEngine.Windows
         /// <param name="e">インベントデータ</param>\r
         protected override void OnMouseWheel(MouseEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
-\r
             base.OnMouseWheel(e);\r
 \r
             ScrollDirection dir = e.Delta > 0 ? ScrollDirection.Up : ScrollDirection.Down;\r
@@ -1097,13 +1167,13 @@ namespace FooEditEngine.Windows
         /// <param name="e">インベントデータ</param>\r
         protected override void OnPaint(PaintEventArgs e)\r
         {\r
-            if (DesignMode || this.Document.State == AsyncState.Loading)\r
+            if (DesignMode)\r
             {\r
                 SolidBrush brush = new SolidBrush(this.BackColor);\r
                 e.Graphics.FillRectangle(brush, this.ClientRectangle);\r
                 brush.Dispose();\r
             }else if (this.Document.FireUpdateEvent){\r
-                this.render.BeginDraw();\r
+                this.render.BegineDraw();\r
                 this.View.Draw(e.ClipRectangle);\r
                 this.render.EndDraw();\r
             }\r
@@ -1143,9 +1213,6 @@ namespace FooEditEngine.Windows
         /// <param name="e">インベントデータ</param>\r
         protected override void OnKeyDown(KeyEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
-\r
             base.OnKeyDown(e);\r
             \r
             if (e.Handled)\r
@@ -1193,16 +1260,16 @@ namespace FooEditEngine.Windows
                     break;\r
                 case Keys.Home:\r
                     if (e.Control)\r
-                        this.Controller.JumpToHead(false);\r
+                        this.Controller.JumpToHead(e.Shift);\r
                     else\r
-                        this.Controller.JumpCaret(this.View.CaretPostion.row, 0);\r
+                        this.Controller.JumpToLineHead(this.View.CaretPostion.row, e.Shift);\r
                     this.Refresh();\r
                     break;\r
                 case Keys.End:\r
                     if (e.Control)\r
-                        this.Controller.JumpToEnd(false);\r
+                        this.Controller.JumpToEnd(e.Shift);\r
                     else\r
-                        this.Controller.JumpCaret(this.View.CaretPostion.row, this.View.LayoutLines[this.View.CaretPostion.row].Length - 1);\r
+                        this.Controller.JumpToLineEnd(this.View.CaretPostion.row, e.Shift);\r
                     this.Refresh();\r
                     break;\r
                 case Keys.Tab:\r
@@ -1223,9 +1290,6 @@ namespace FooEditEngine.Windows
         /// <param name="e">インベントデータ</param>\r
         protected override void OnKeyPress(KeyPressEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
-\r
             base.OnKeyPress(e);\r
 \r
             if (e.Handled)\r
@@ -1288,16 +1352,12 @@ namespace FooEditEngine.Windows
 \r
         void VScrollBar_Scroll(object sender, ScrollEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
             this.View.TryScroll(this.View.Src.X, e.NewValue);\r
             this.Refresh();\r
         }\r
 \r
         void HScrollBar_Scroll(object sender, ScrollEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
             int toX;\r
             if (this.RightToLeft == System.Windows.Forms.RightToLeft.Yes)\r
                 toX = -e.NewValue;\r
@@ -1309,10 +1369,13 @@ namespace FooEditEngine.Windows
 \r
         void Ime_StartCompstion(object sender, StartCompstionEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
             this.Ime.Font = this.Font;\r
-            this.Ime.Location = this.View.GetPostionFromTextPoint(this.CaretPostion);\r
+            System.Drawing.Point p = this.GetPostionFromIndex(this.Controller.SelectionStart);\r
+            float dpi;\r
+            this.render.GetDpi(out dpi, out dpi);\r
+            p.X = (int)(p.X * dpi / 96);\r
+            p.Y = (int)(p.Y * dpi / 96);\r
+            this.Ime.Location = p;\r
             this.View.HideCaret = true;\r
         }\r
 \r
@@ -1323,16 +1386,12 @@ namespace FooEditEngine.Windows
 \r
         void Ime_ImeCompstion(object sender, ImeCompstionEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
             this.Controller.DoInputString(e.InputText);\r
             this.Refresh();\r
         }\r
 \r
         void Ime_ImeDocumentFeed(object sender, ImeDocumentFeedEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
             TextPoint tp = this.CaretPostion;\r
             e.Pragraph = this.LayoutLines[tp.row];\r
             e.pos = tp.col;\r
@@ -1340,14 +1399,12 @@ namespace FooEditEngine.Windows
 \r
         void Ime_ImeReconvert(object sender, ImeReconvertStringEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
             if (this.RectSelection)\r
                 return;\r
-            if (this.SelectionLength != 0)\r
+            if (this.Controller.SelectionLength == 0)\r
             {\r
                 TextPoint tp = this.LayoutLines.GetTextPointFromIndex(this.Controller.SelectionStart);\r
-                e.TargetString = this.LayoutLines[tp.row].Substring(0, tp.col);\r
+                e.TargetString = this.LayoutLines[tp.row];\r
                 e.AutoAdjust = true;\r
             }\r
             else\r
@@ -1361,9 +1418,6 @@ namespace FooEditEngine.Windows
 \r
         void Ime_ImeQueryReconvert(object sender, ImeQueryRecovertStringEventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
-\r
             TextPoint tp = this.LayoutLines.GetTextPointFromIndex(this.Controller.SelectionStart);\r
             tp.col = e.offset;\r
 \r
@@ -1374,19 +1428,7 @@ namespace FooEditEngine.Windows
 \r
         void Controller_CaretMoved(object sender, EventArgs e)\r
         {\r
-            this.CaretMoved(this, null);\r
-        }\r
-\r
-        void Document_Progress(object sender, ProgressEventArgs e)\r
-        {\r
-            if (this.Document.State == AsyncState.Saving)\r
-                return;\r
-            if (e.state == ProgressState.Complete)\r
-            {\r
-                this.initScrollBars();\r
-                this.OnMouseMove(new MouseEventArgs(MouseButtons.None, 0, MousePosition.X, MousePosition.Y, 0));\r
-                this.View.CalculateLineCountOnScreen();\r
-            }\r
+            this.SelectionChanged(this, null);\r
         }\r
 \r
         void initScrollBars()\r
@@ -1401,8 +1443,6 @@ namespace FooEditEngine.Windows
 \r
         void Timer_Tick(object sender,EventArgs e)\r
         {\r
-            if (this.Document.State == AsyncState.Loading)\r
-                return;\r
             if (this.View.CaretPostion.row >= this.View.LayoutLines.Count || DesignMode)\r
                 return;\r
 \r
@@ -1429,18 +1469,21 @@ namespace FooEditEngine.Windows
             if (CaretBlinkTime == -1)\r
             {\r
                 this.View.CaretBlink = false;\r
-                this.BeginInvoke(new Action(() => {\r
+                if (this.IsHandleCreated)\r
+                    this.BeginInvoke(new Action(() =>\r
+                    {\r
                     this.Timer.Stop();\r
-                }));\r
+                    }));\r
             }\r
             else\r
             {\r
                 this.View.CaretBlink = true;\r
                 this.View.CaretBlinkTime = CaretBlinkTime * 2;\r
-                this.BeginInvoke(new Action(() =>\r
-                {\r
-                    this.Timer.Start();\r
-                }));\r
+                if(this.IsHandleCreated)\r
+                    this.BeginInvoke(new Action(() =>\r
+                    {\r
+                        this.Timer.Start();\r
+                    }));\r
             }\r
             this.View.CaretWidthOnInsertMode = SystemInformation.CaretWidth;\r
         }\r