OSDN Git Service

ファイル操作関連をDocumentExtendクラスに分離した
authorgdkhd812 <jbh03215@hotmail.com>
Sat, 24 Aug 2013 16:09:01 +0000 (01:09 +0900)
committergdkhd812 <jbh03215@hotmail.com>
Sat, 24 Aug 2013 16:09:01 +0000 (01:09 +0900)
14 files changed:
Common/Document.cs
Common/DocumentExtend.cs [new file with mode: 0644]
Common/EditView.cs
Common/PrintableView.cs
Common/ViewBase.cs
Metro/FooEditEngnine/FooEditEngine.csproj
Metro/FooEditEngnine/FooTextBox.cs
Metro/Test/MainPage.xaml.cs
WPF/FooEditEngine/FooEditEngine.csproj
WPF/FooEditEngine/FooTextBox.cs
WPF/Test/MainWindow.xaml.cs
Windows/FooEditEngine/FooEditEngine.csproj
Windows/FooEditEngine/FooTextBox.cs
Windows/Test/Form1.cs

index 33fd3a5..5e3242f 100644 (file)
@@ -9,8 +9,6 @@
 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
 \r
-//#define TEST_ASYNC\r
-\r
 using System;\r
 using System.IO;\r
 using System.Collections.Generic;\r
@@ -149,8 +147,6 @@ namespace FooEditEngine
         Regex regex;\r
         Match match;\r
         StringBuffer buffer;\r
-        CancellationTokenSource cancleTokenSource;\r
-        Progress<ProgressEventArgs> _Progress = new Progress<ProgressEventArgs>();\r
         bool _EnableFireUpdateEvent = true;\r
 \r
         /// <summary>\r
@@ -176,21 +172,6 @@ namespace FooEditEngine
         }\r
 \r
         /// <summary>\r
-        /// 進捗処理を表す\r
-        /// </summary>\r
-        public event EventHandler<ProgressEventArgs> Progress\r
-        {\r
-            add\r
-            {\r
-                this._Progress.ProgressChanged += value;\r
-            }\r
-            remove\r
-            {\r
-                this._Progress.ProgressChanged -= value;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
         /// ドキュメントが更新された時に呼ばれるイベント\r
         /// </summary>\r
         public event DocumentUpdateEventHandler Update;\r
@@ -233,7 +214,7 @@ namespace FooEditEngine
         public AsyncState State\r
         {\r
             get;\r
-            private set;\r
+            internal set;\r
         }\r
 \r
         /// <summary>\r
@@ -285,6 +266,14 @@ namespace FooEditEngine
             private set;\r
         }\r
 \r
+        internal StringBuffer StringBuffer\r
+        {\r
+            get\r
+            {\r
+                return this.buffer;\r
+            }\r
+        }\r
+\r
         /// <summary>\r
         /// DocumentReaderを作成します\r
         /// </summary>\r
@@ -441,216 +430,6 @@ namespace FooEditEngine
         }\r
 \r
         /// <summary>\r
-        /// 非同期操作をキャンセルします\r
-        /// </summary>\r
-        public void Cancel()\r
-        {\r
-            if(this.cancleTokenSource != null)\r
-                this.cancleTokenSource.Cancel();\r
-        }\r
-\r
-#if !METRO\r
-        /// <summary>\r
-        /// ファイルからドキュメントを構築します\r
-        /// </summary>\r
-        /// <param name="filepath">読み取り先のファイル</param>\r
-        /// <param name="enc">エンコーディング</param>\r
-        /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>\r
-        public void Load(string filepath, Encoding enc)\r
-        {\r
-            if (this.State != AsyncState.None)\r
-                throw new InvalidOperationException();\r
-            using (StreamReader sr = new StreamReader(filepath, enc))\r
-            {\r
-                this.Load(sr);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// ファイルからドキュメントを非同期的に構築します\r
-        /// </summary>\r
-        /// <param name="filepath">読み取り先のファイル</param>\r
-        /// <param name="enc">エンコーディング</param>\r
-        /// <remarks>読み取り操作は別スレッドで行われます。また、非同期操作中にこのメソッドを読みだすことはできません</remarks>\r
-        public async Task LoadAsync(string filepath, Encoding enc)\r
-        {\r
-            if (this.State != AsyncState.None)\r
-                throw new InvalidOperationException();\r
-            this.cancleTokenSource = new CancellationTokenSource();\r
-            using (StreamReader sr = new StreamReader(filepath, enc))\r
-            {\r
-                await this.LoadAsync(sr, this.cancleTokenSource);\r
-            }\r
-        }\r
-#endif\r
-\r
-        /// <summary>\r
-        /// ストリームからドキュメントを構築します\r
-        /// </summary>\r
-        /// <param name="sr">読み取り先のストリーム</param>\r
-        /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>\r
-        public void Load(TextReader sr)\r
-        {\r
-            Task t = this.LoadAsync(sr, null);\r
-            t.Wait();\r
-        }\r
-\r
-        /// <summary>\r
-        /// ストリームからドキュメントを非同期的に構築します\r
-        /// </summary>\r
-        /// <param name="sr">読み取り先のストリーム</param>\r
-        /// <returns>Taskオブジェクト</returns>\r
-        /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>\r
-        public async Task LoadAsync(TextReader sr)\r
-        {\r
-            this.cancleTokenSource = new CancellationTokenSource();\r
-            await this.LoadAsync(sr, this.cancleTokenSource);\r
-        }\r
-\r
-        /// <summary>\r
-        /// ストリームからドキュメントを非同期的に構築します\r
-        /// </summary>\r
-        /// <param name="sr">読み取り先のストリーム</param>\r
-        /// <param name="tokenSource">キャンセルトークン</param>\r
-        /// <returns>Taskオブジェクト</returns>\r
-        /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>\r
-        async Task LoadAsync(TextReader sr,CancellationTokenSource tokenSource = null)\r
-        {\r
-            if (this.State != AsyncState.None)\r
-                throw new InvalidOperationException();\r
-            if (sr.Peek() == -1)\r
-            {\r
-                return;\r
-            }\r
-\r
-            IProgress<ProgressEventArgs> progress = this._Progress;\r
-            try\r
-            {\r
-                progress.Report(new ProgressEventArgs(ProgressState.Start));\r
-                this.State = AsyncState.Loading;\r
-                this.FireUpdateEvent = false;\r
-                this.buffer.Clear();\r
-                this.UndoManager.BeginLock();\r
-                string str;\r
-                for (int i = 0; (str = await sr.ReadLineAsync().ConfigureAwait(false)) != null; i++)\r
-                {\r
-                    int index = this.buffer.Length;\r
-                    if (index < 0)\r
-                        index = 0;\r
-\r
-                    this.buffer.Replace(index, 0, str + Document.NewLine);\r
-\r
-                    if(tokenSource != null)\r
-                        tokenSource.Token.ThrowIfCancellationRequested();\r
-#if TEST_ASYNC\r
-                    System.Threading.Thread.Sleep(10);\r
-#endif\r
-                }\r
-            }\r
-            finally\r
-            {\r
-                this.FireUpdateEvent = true;\r
-                this.UndoManager.EndLock();\r
-                this.State = AsyncState.None;\r
-                progress.Report(new ProgressEventArgs(ProgressState.Complete));\r
-            }\r
-        }\r
-\r
-#if !METRO\r
-        /// <summary>\r
-        /// ドキュメントをファイルに保存します\r
-        /// </summary>\r
-        /// <param name="filepath">保存先のファイル</param>\r
-        /// <param name="enc">保存したいエンコード</param>\r
-        /// <param name="newline">改行を表す文字列</param>\r
-        /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>\r
-        public void Save(string filepath, Encoding enc, string newline)\r
-        {\r
-            if (this.State != AsyncState.None)\r
-                throw new InvalidOperationException();\r
-            using (StreamWriter sw = new StreamWriter(filepath, false, enc))\r
-            {\r
-                sw.NewLine = newline;\r
-                this.Save(sw);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// ドキュメントをファイルに保存します\r
-        /// </summary>\r
-        /// <param name="filepath">保存先のファイル</param>\r
-        /// <param name="enc">保存したいエンコード</param>\r
-        /// <param name="newline">改行を表す文字列</param>\r
-        /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>\r
-        public async Task SaveAsync(string filepath, Encoding enc, string newline)\r
-        {\r
-            if (this.State != AsyncState.None)\r
-                throw new InvalidOperationException();\r
-            this.cancleTokenSource = new CancellationTokenSource();\r
-            using (StreamWriter sw = new StreamWriter(filepath, false, enc))\r
-            {\r
-                sw.NewLine = newline;\r
-                await this.SaveAsync(sw,this.cancleTokenSource);\r
-            }\r
-        }\r
-#endif\r
-\r
-        /// <summary>\r
-        /// ストリームに保存します\r
-        /// </summary>\r
-        /// <param name="sw">保存先のストリーム</param>\r
-        /// <param name="tokenSource">キャンセルトークン</param>\r
-        /// <returns>Taskオブジェクト</returns>\r
-        /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>\r
-        public void Save(StreamWriter sw, CancellationTokenSource tokenSource = null)\r
-        {\r
-            Task t = this.SaveAsync(sw, null);\r
-            t.Wait();\r
-        }\r
-\r
-        /// <summary>\r
-        /// ストリームに非同期モードで保存します\r
-        /// </summary>\r
-        /// <param name="sw">保存先のストリーム</param>\r
-        /// <param name="tokenSource">キャンセルトークン</param>\r
-        /// <returns>Taskオブジェクト</returns>\r
-        /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>\r
-        public async Task SaveAsync(StreamWriter sw, CancellationTokenSource tokenSource = null)\r
-        {\r
-            if (this.State != AsyncState.None)\r
-                throw new InvalidOperationException();\r
-            IProgress<ProgressEventArgs> progress = this._Progress;\r
-            try\r
-            {\r
-                progress.Report(new ProgressEventArgs(ProgressState.Start));\r
-                this.State = AsyncState.Saving;\r
-                StringBuilder line = new StringBuilder();\r
-                for (int i = 0; i < this.Length; i++)\r
-                {\r
-                    char c = this.buffer[i];\r
-                    line.Append(c);\r
-                    if (c == Document.NewLine || i == this.Length - 1)\r
-                    {\r
-                        string str = line.ToString();\r
-                        str = str.Replace(Document.NewLine.ToString(), sw.NewLine);\r
-                        await sw.WriteAsync(str).ConfigureAwait(false);\r
-                        line.Clear();\r
-                        if(tokenSource != null)\r
-                            tokenSource.Token.ThrowIfCancellationRequested();\r
-#if TEST_ASYNC\r
-                    System.Threading.Thread.Sleep(10);\r
-#endif\r
-                    }\r
-                }\r
-            }\r
-            finally\r
-            {\r
-                this.State = AsyncState.None;\r
-                progress.Report(new ProgressEventArgs(ProgressState.Complete));\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
         /// Find()で使用するパラメーターをセットします\r
         /// </summary>\r
         /// <param name="pattern">検索したい文字列</param>\r
diff --git a/Common/DocumentExtend.cs b/Common/DocumentExtend.cs
new file mode 100644 (file)
index 0000000..8baac86
--- /dev/null
@@ -0,0 +1,249 @@
+/*\r
+ * Copyright (C) 2013 FooProject\r
+ * * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 3 of the License, or (at your option) any later version.\r
+\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of \r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r
+\r
+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
+\r
+//#define TEST_ASYNC\r
+\r
+using System;\r
+using System.IO;\r
+using System.Text;\r
+using System.Threading;\r
+using System.Threading.Tasks;\r
+\r
+namespace FooEditEngine\r
+{\r
+    /// <summary>\r
+    /// Documentの拡張クラス\r
+    /// </summary>\r
+    public static class DocumentExtend\r
+    {\r
+        static Progress<ProgressEventArgs> _Progress = new Progress<ProgressEventArgs>();\r
+        /// <summary>\r
+        /// 進捗処理を表す\r
+        /// </summary>\r
+        public static event EventHandler<ProgressEventArgs> Progress\r
+        {\r
+            add\r
+            {\r
+                _Progress.ProgressChanged += value;\r
+            }\r
+            remove\r
+            {\r
+                _Progress.ProgressChanged -= value;\r
+            }\r
+        }\r
+\r
+#if !METRO\r
+        /// <summary>\r
+        /// ファイルからドキュメントを構築します\r
+        /// </summary>\r
+        /// <param name="doc">Documentオブジェクト</param>\r
+        /// <param name="filepath">読み取り先のファイル</param>\r
+        /// <param name="enc">エンコーディング</param>\r
+        /// <remarks>\r
+        /// 非同期操作中はこのメソッドを実行することはできません。\r
+        /// </remarks>\r
+        public static void Load(this Document doc, string filepath, Encoding enc)\r
+        {\r
+            if (doc.State != AsyncState.None)\r
+                throw new InvalidOperationException();\r
+            using (StreamReader sr = new StreamReader(filepath, enc))\r
+            {\r
+                Load(doc,sr);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// ファイルからドキュメントを非同期的に構築します\r
+        /// </summary>\r
+        /// <param name="doc">Documentオブジェクト</param>\r
+        /// <param name="filepath">読み取り先のファイル</param>\r
+        /// <param name="enc">エンコーディング</param>\r
+        /// <param name="token">キャンセル用のトークン</param>\r
+        /// <remarks>\r
+        /// 読み取り操作は別スレッドで行われます。\r
+        /// また、非同期操作中にこのメソッドを読みだすことはできません\r
+        /// </remarks>\r
+        public static async Task LoadAsync(this Document doc, string filepath, Encoding enc, CancellationTokenSource token)\r
+        {\r
+            if (doc.State != AsyncState.None)\r
+                throw new InvalidOperationException();\r
+            using (StreamReader sr = new StreamReader(filepath, enc))\r
+            {\r
+                await LoadAsync(doc,sr, token);\r
+            }\r
+        }\r
+#endif\r
+\r
+        /// <summary>\r
+        /// ストリームからドキュメントを構築します\r
+        /// </summary>\r
+        /// <param name="doc">Documentオブジェクト</param>\r
+        /// <param name="sr">読み取り先のストリーム</param>\r
+        /// <remarks>\r
+        /// 非同期操作中はこのメソッドを実行することはできません\r
+        /// </remarks>\r
+        public static void Load(this Document doc, TextReader sr)\r
+        {\r
+            Task t = LoadAsync(doc,sr, null);\r
+            t.Wait();\r
+        }\r
+\r
+        /// <summary>\r
+        /// ストリームからドキュメントを非同期的に構築します\r
+        /// </summary>\r
+        /// <param name="doc">Documentオブジェクト</param>\r
+        /// <param name="sr">読み取り先のストリーム</param>\r
+        /// <param name="tokenSource">キャンセルトークン</param>\r
+        /// <returns>Taskオブジェクト</returns>\r
+        /// <remarks>\r
+        /// 読み取り操作は別スレッドで行われます。\r
+        /// また、非同期操作中はこのメソッドを実行することはできません。\r
+        /// </remarks>\r
+        public static async Task LoadAsync(this Document doc, TextReader sr, CancellationTokenSource tokenSource = null)\r
+        {\r
+            if (doc.State != AsyncState.None)\r
+                throw new InvalidOperationException();\r
+            if (sr.Peek() == -1)\r
+            {\r
+                return;\r
+            }\r
+\r
+            IProgress<ProgressEventArgs> progress = _Progress;\r
+            try\r
+            {\r
+                progress.Report(new ProgressEventArgs(ProgressState.Start));\r
+                doc.State = AsyncState.Loading;\r
+                doc.FireUpdateEvent = false;\r
+                doc.StringBuffer.Clear();\r
+                doc.UndoManager.BeginLock();\r
+                string str;\r
+                for (int i = 0; (str = await sr.ReadLineAsync().ConfigureAwait(false)) != null; i++)\r
+                {\r
+                    int index = doc.StringBuffer.Length;\r
+                    if (index < 0)\r
+                        index = 0;\r
+\r
+                    doc.StringBuffer.Replace(index, 0, str + Document.NewLine);\r
+\r
+                    if (tokenSource != null)\r
+                        tokenSource.Token.ThrowIfCancellationRequested();\r
+#if TEST_ASYNC\r
+                    System.Threading.Thread.Sleep(10);\r
+#endif\r
+                }\r
+            }\r
+            finally\r
+            {\r
+                doc.FireUpdateEvent = true;\r
+                doc.UndoManager.EndLock();\r
+                doc.State = AsyncState.None;\r
+                progress.Report(new ProgressEventArgs(ProgressState.Complete));\r
+            }\r
+        }\r
+\r
+#if !METRO\r
+        /// <summary>\r
+        /// ドキュメントをファイルに保存します\r
+        /// </summary>\r
+        /// <param name="doc">Documentオブジェクト</param>\r
+        /// <param name="filepath">保存先のファイル</param>\r
+        /// <param name="enc">保存したいエンコード</param>\r
+        /// <param name="newline">改行を表す文字列</param>\r
+        /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>\r
+        public static void Save(this Document doc, string filepath, Encoding enc, string newline)\r
+        {\r
+            if (doc.State != AsyncState.None)\r
+                throw new InvalidOperationException();\r
+            using (StreamWriter sw = new StreamWriter(filepath, false, enc))\r
+            {\r
+                sw.NewLine = newline;\r
+                Save(doc,sw);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// ドキュメントをファイルに保存します\r
+        /// </summary>\r
+        /// <param name="doc">Documentオブジェクト</param>\r
+        /// <param name="filepath">保存先のファイル</param>\r
+        /// <param name="enc">保存したいエンコード</param>\r
+        /// <param name="newline">改行を表す文字列</param>\r
+        /// <param name="token">CancellationTokenSourceオブジェクト</param>\r
+        /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>\r
+        public static async Task SaveAsync(this Document doc, string filepath, Encoding enc, string newline,CancellationTokenSource token)\r
+        {\r
+            if (doc.State != AsyncState.None)\r
+                throw new InvalidOperationException();\r
+            using (StreamWriter sw = new StreamWriter(filepath, false, enc))\r
+            {\r
+                sw.NewLine = newline;\r
+                await SaveAsync(doc,sw, token);\r
+            }\r
+        }\r
+#endif\r
+\r
+        /// <summary>\r
+        /// ストリームに保存します\r
+        /// </summary>\r
+        /// <param name="doc">Documentオブジェクト</param>\r
+        /// <param name="sw">保存先のストリーム</param>\r
+        /// <returns>Taskオブジェクト</returns>\r
+        /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>\r
+        public static void Save(this Document doc, StreamWriter sw)\r
+        {\r
+            Task t = SaveAsync(doc,sw, null);\r
+            t.Wait();\r
+        }\r
+\r
+        /// <summary>\r
+        /// ストリームに非同期モードで保存します\r
+        /// </summary>\r
+        /// <param name="doc">Documentオブジェクト</param>\r
+        /// <param name="sw">保存先のストリーム</param>\r
+        /// <param name="tokenSource">キャンセルトークン</param>\r
+        /// <returns>Taskオブジェクト</returns>\r
+        /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>\r
+        public static async Task SaveAsync(this Document doc,StreamWriter sw, CancellationTokenSource tokenSource = null)\r
+        {\r
+            if (doc.State != AsyncState.None)\r
+                throw new InvalidOperationException();\r
+            IProgress<ProgressEventArgs> progress = _Progress;\r
+            try\r
+            {\r
+                progress.Report(new ProgressEventArgs(ProgressState.Start));\r
+                doc.State = AsyncState.Saving;\r
+                StringBuilder line = new StringBuilder();\r
+                for (int i = 0; i < doc.Length; i++)\r
+                {\r
+                    char c = doc[i];\r
+                    line.Append(c);\r
+                    if (c == Document.NewLine || i == doc.Length - 1)\r
+                    {\r
+                        string str = line.ToString();\r
+                        str = str.Replace(Document.NewLine.ToString(), sw.NewLine);\r
+                        await sw.WriteAsync(str).ConfigureAwait(false);\r
+                        line.Clear();\r
+                        if (tokenSource != null)\r
+                            tokenSource.Token.ThrowIfCancellationRequested();\r
+#if TEST_ASYNC\r
+                    System.Threading.Thread.Sleep(10);\r
+#endif\r
+                    }\r
+                }\r
+            }\r
+            finally\r
+            {\r
+                doc.State = AsyncState.None;\r
+                progress.Report(new ProgressEventArgs(ProgressState.Complete));\r
+            }\r
+        }\r
+    }\r
+}\r
index 48c7662..0e0f8e2 100644 (file)
@@ -813,7 +813,7 @@ namespace FooEditEngine
             this.LineBreakingMarginWidth = width * 5 / 100;\r
         }\r
 \r
-        protected override void CalculateLineCountOnScreen()\r
+        public override void CalculateLineCountOnScreen()\r
         {\r
             if (this.LayoutLines.Count == 0 || this.PageBound.Height == 0)\r
                 return;\r
index 967feef..9ab4c62 100644 (file)
@@ -117,7 +117,7 @@ namespace FooEditEngine
             this.render.TextArea = new Rectangle(x, y, width, height);\r
         }\r
 \r
-        protected override void CalculateLineCountOnScreen()\r
+        public override void CalculateLineCountOnScreen()\r
         {\r
             if (this.LayoutLines.Count == 0)\r
                 return;\r
index 4338a12..63eb3c1 100644 (file)
@@ -52,7 +52,6 @@ namespace FooEditEngine
         {\r
             this.Document = doc;\r
             this.Document.UpdateCalledAlways += new DocumentUpdateEventHandler(doc_Update);\r
-            this.Document.Progress += Document_Progress;\r
             this._LayoutLines = new LineToIndexTable(this.Document, r);\r
             this._LayoutLines.SpilitString = new SpilitStringEventHandler(LayoutLines_SpilitStringByChar);\r
             this.render = r;\r
@@ -253,12 +252,15 @@ namespace FooEditEngine
             GC.SuppressFinalize(this);\r
         }\r
 \r
+        public virtual void CalculateLineCountOnScreen()\r
+        {\r
+        }\r
+\r
         protected virtual void Dispose(bool disposing)\r
         {\r
             if (disposing)\r
             {\r
                 this.Document.UpdateCalledAlways -= new DocumentUpdateEventHandler(this.doc_Update);    //これをしないと複数のビューを作成した時に妙なエラーが発生する\r
-                this.Document.Progress -= Document_Progress;\r
             }\r
             this._LayoutLines.Clear();\r
         }\r
@@ -267,9 +269,6 @@ namespace FooEditEngine
         {\r
         }\r
 \r
-        protected virtual void CalculateLineCountOnScreen()\r
-        {\r
-        }\r
 \r
         protected virtual void OnSrcChanged(EventArgs e)\r
         {\r
@@ -309,12 +308,6 @@ namespace FooEditEngine
             }\r
         }\r
 \r
-        void Document_Progress(object sender, ProgressEventArgs e)\r
-        {\r
-            if (e.state == ProgressState.Complete)\r
-                this.CalculateLineCountOnScreen();\r
-        }\r
-\r
         void doc_Update(object sender, DocumentUpdateEventArgs e)\r
         {\r
             switch (e.type)\r
index 29b8bb9..6ccd8e1 100644 (file)
     <Compile Include="..\..\Common\Document.cs">
       <Link>Document.cs</Link>
     </Compile>
+    <Compile Include="..\..\Common\DocumentExtend.cs">
+      <Link>DocumentExtend.cs</Link>
+    </Compile>
     <Compile Include="..\..\Common\EditView.cs">
       <Link>EditView.cs</Link>
     </Compile>
index dac43c6..44214a3 100644 (file)
@@ -71,7 +71,7 @@ namespace FooEditEngine.Metro
             this.textStore.CompositionEnded += textStore_CompositionEnded;\r
 \r
             this.Document = new Document();\r
-            this.Document.Progress += Document_Progress;\r
+            DocumentExtend.Progress += Document_Progress;\r
 \r
             this.rectangle = new Windows.UI.Xaml.Shapes.Rectangle();\r
             this.rectangle.Margin = this.Padding;\r
@@ -1059,6 +1059,7 @@ namespace FooEditEngine.Metro
                     this.textStore.NotifyTextChanged(0, 0, this.Document.Length);\r
                     if (this.verticalScrollBar != null)\r
                         this.verticalScrollBar.Maximum = this.View.LayoutLines.Count;\r
+                    this.View.CalculateLineCountOnScreen();\r
                     break;\r
             }\r
         }\r
index eb411b2..43ef768 100644 (file)
@@ -20,6 +20,7 @@ using Windows.UI.Xaml;
 using Windows.UI.Xaml.Controls;\r
 using Windows.UI.Xaml.Navigation;\r
 using Windows.UI.ApplicationSettings;\r
+using FooEditEngine;\r
 using FooEditEngine.Metro;\r
 \r
 // 空白ページのアイテム テンプレートについては、http://go.microsoft.com/fwlink/?LinkId=234238 を参照してください\r
index 3cd3693..6ce613b 100644 (file)
     <Compile Include="..\..\Common\Document.cs">
       <Link>Document.cs</Link>
     </Compile>
+    <Compile Include="..\..\Common\DocumentExtend.cs">
+      <Link>DocumentExtend.cs</Link>
+    </Compile>
     <Compile Include="..\..\Common\EditView.cs">
       <Link>EditView.cs</Link>
     </Compile>
index 3a3fc3a..64bcbcc 100644 (file)
@@ -83,7 +83,7 @@ namespace FooEditEngine.WPF
             this.textStore.CompositionEnded += textStore_CompositionEnded;\r
 \r
             this.Document = new Document();\r
-            this.Document.Progress += Document_Progress;\r
+            DocumentExtend.Progress += Document_Progress;\r
 \r
             this.Render = new D2DRender(this, 200, 200,this.image);\r
             this.Render.ShowFullSpace = this.ShowFullSpace;\r
@@ -946,6 +946,7 @@ namespace FooEditEngine.WPF
                     this.OnMouseMove(new MouseEventArgs(Mouse.PrimaryDevice, new TimeSpan(DateTime.Now.Ticks).Milliseconds));\r
                     if(this.verticalScrollBar != null)\r
                         this.verticalScrollBar.Maximum = this.View.LayoutLines.Count;\r
+                    this.View.CalculateLineCountOnScreen();\r
                     break;\r
             }\r
         }\r
index eeabf01..5ed1212 100644 (file)
@@ -25,6 +25,7 @@ namespace Test
     /// </summary>
     public partial class MainWindow : Window
     {
+        System.Threading.CancellationTokenSource cancleTokenSrc = new System.Threading.CancellationTokenSource();
         public MainWindow()
         {
             InitializeComponent();
@@ -38,7 +39,7 @@ namespace Test
 
         void MainWindow_Closed(object sender, System.EventArgs e)
         {
-            this.fooTextBox.Document.Cancel();
+            this.cancleTokenSrc.Cancel();
         }
 
         void fooTextBox_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
@@ -120,7 +121,7 @@ namespace Test
             bool result = (bool)ofd.ShowDialog(this);
             if (result == true)
             {
-                await this.fooTextBox.Document.LoadAsync(ofd.FileName, Encoding.Default);
+                await this.fooTextBox.Document.LoadAsync(ofd.FileName, Encoding.Default,this.cancleTokenSrc);
                 this.fooTextBox.Refresh();
             }
         }
@@ -190,7 +191,7 @@ namespace Test
             bool result = (bool)sfd.ShowDialog(this);
             if (result == true)
             {
-                await this.fooTextBox.Document.SaveAsync(sfd.FileName,Encoding.Default,"\r\n");
+                await this.fooTextBox.Document.SaveAsync(sfd.FileName,Encoding.Default,"\r\n",cancleTokenSrc);
                 MessageBox.Show("complete");
             }
         }
index 1fda0bd..dca7313 100644 (file)
@@ -82,6 +82,9 @@
     <Compile Include="..\..\Common\Document.cs">
       <Link>Document.cs</Link>
     </Compile>
+    <Compile Include="..\..\Common\DocumentExtend.cs">
+      <Link>DocumentExtend.cs</Link>
+    </Compile>
     <Compile Include="..\..\Common\EditView.cs">
       <Link>EditView.cs</Link>
     </Compile>
index fc22000..0171f15 100644 (file)
@@ -70,8 +70,7 @@ namespace FooEditEngine.Windows
             this.SetStyle(ControlStyles.Opaque, true);\r
 \r
             this.Document = new Document();\r
-            this.Document.Progress += Document_Progress;\r
-            this.Document.ChangeFireUpdateEvent += new EventHandler(Document_ChangeFireUpdateEvent);\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
@@ -645,26 +644,6 @@ namespace FooEditEngine.Windows
             this.Controller.DeSelectAll();\r
         }\r
 \r
-        void Document_ChangeFireUpdateEvent(object sender, EventArgs e)\r
-        {\r
-            if (this.Document.FireUpdateEvent)\r
-            {\r
-                this.Controller.AdjustCaret();\r
-                this.DeSelectAll();\r
-                this.BeginInvoke(new Action(() =>\r
-                {\r
-                    this.Timer.Start();\r
-                }));\r
-            }\r
-            else\r
-            {\r
-                this.BeginInvoke(new Action(() =>\r
-                {\r
-                    this.Timer.Stop();\r
-                }));\r
-            }\r
-        }\r
-\r
         /// <summary>\r
         /// クリップボードにコピーする\r
         /// </summary>\r
@@ -1404,6 +1383,7 @@ namespace FooEditEngine.Windows
             {\r
                 this.initScrollBars();\r
                 this.OnMouseMove(new MouseEventArgs(MouseButtons.None, 0, MousePosition.X, MousePosition.Y, 0));\r
+                this.View.CalculateLineCountOnScreen();\r
             }\r
         }\r
 \r
index 13a9010..c978e23 100644 (file)
@@ -63,7 +63,7 @@ namespace Test.Windows
             OpenFileDialog ofd = new OpenFileDialog();
             if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
             {
-                await this.fooTextBox1.Document.LoadAsync(ofd.FileName, Encoding.Default);
+                await this.fooTextBox1.Document.LoadAsync(ofd.FileName, Encoding.Default,null);
                 this.fooTextBox1.Refresh();
             }
         }