OSDN Git Service

ファイル読み込み中の時だけユーザの入力を受け付けないようにした
[fooeditengine/FooEditEngine.git] / Windows / FooEditEngine / FooTextBox.cs
index 685ffd8..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,7 +72,6 @@ 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 FooEditEngine.Padding(5,5,5,5));\r
@@ -431,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
@@ -438,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
@@ -453,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
@@ -468,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
@@ -483,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
@@ -498,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
@@ -513,18 +533,29 @@ 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
-            set;\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
         /// <summary>\r
@@ -534,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
@@ -549,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
@@ -564,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
@@ -579,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
@@ -594,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
@@ -609,11 +645,12 @@ 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
@@ -794,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
@@ -884,7 +972,6 @@ namespace FooEditEngine.Windows
         protected override void Dispose(bool disposing)\r
         {\r
             SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(this.SystemEvents_UserPreferenceChanged);\r
-            DocumentExtend.Progress -= this.Document_Progress;\r
             this.render.Dispose();\r
             this.Timer.Dispose();\r
             base.Dispose(disposing);\r
@@ -1086,7 +1173,7 @@ namespace FooEditEngine.Windows
                 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
@@ -1285,9 +1372,9 @@ namespace FooEditEngine.Windows
             this.Ime.Font = this.Font;\r
             System.Drawing.Point p = this.GetPostionFromIndex(this.Controller.SelectionStart);\r
             float dpi;\r
-            this.render.GetDpiHandler(out dpi, out dpi);\r
+            this.render.GetDpi(out dpi, out dpi);\r
             p.X = (int)(p.X * dpi / 96);\r
-            p.Y = (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
@@ -1344,16 +1431,6 @@ namespace FooEditEngine.Windows
             this.SelectionChanged(this, null);\r
         }\r
 \r
-        void Document_Progress(object sender, ProgressEventArgs e)\r
-        {\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
-        }\r
-\r
         void initScrollBars()\r
         {\r
             this.VScrollBar.SmallChange = 1;\r
@@ -1392,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