OSDN Git Service

ファイルを保存できない問題を解決した
[fooeditengine/FooEditEngine.git] / WPF / FooEditEngine / FooTextBox.cs
index add244d..17084f7 100644 (file)
@@ -9,6 +9,8 @@
 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.Tasks;\r
 using System.Runtime.InteropServices;\r
 using System.Windows;\r
 using System.Windows.Input;\r
@@ -84,15 +86,15 @@ namespace FooEditEngine.WPF
             this.textStore.CompositionUpdated += textStore_CompositionUpdated;\r
             this.textStore.CompositionEnded += textStore_CompositionEnded;\r
 \r
-            this.Document = new Document();\r
-            DocumentExtend.Progress += new EventHandler<ProgressEventArgs>(Document_Progress);\r
-\r
             this.Render = new D2DRender(this, 200, 200,this.image);\r
             this.Render.ShowFullSpace = this.ShowFullSpace;\r
             this.Render.ShowHalfSpace = this.ShowHalfSpace;\r
             this.Render.ShowTab = this.ShowTab;\r
 \r
-            this.View = new EditView(this.Document, this.Render,new Padding(5,5,5,5));\r
+            this.Document = new Document();\r
+            this.Document.LayoutLines.Render = this.Render;\r
+\r
+            this.View = new EditView(this.Document, this.Render, new Padding(5, 5, 5, 5));\r
             this.View.SrcChanged += View_SrcChanged;\r
             this.View.InsertMode = this.InsertMode;\r
             this.View.DrawLineNumber = this.DrawLineNumber;\r
@@ -346,6 +348,60 @@ namespace FooEditEngine.WPF
         }\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
+            fs.Close();\r
+        }\r
+\r
+        async Task LoadAsyncImpl(WinFileReader fs,System.Threading.CancellationTokenSource token)\r
+        {\r
+            this.IsEnabled = false;\r
+            this.View.LayoutLines.IsFrozneDirtyFlag = true;\r
+            await this.Document.LoadAsync(fs, token);\r
+            this.View.LayoutLines.IsFrozneDirtyFlag = false;\r
+            TextStoreHelper.NotifyTextChanged(this.textStore, 0, 0, this.Document.Length);\r
+            if (this.verticalScrollBar != null)\r
+                this.verticalScrollBar.Maximum = this.View.LayoutLines.Count;\r
+            this.View.CalculateLineCountOnScreen();\r
+            this.IsEnabled = 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
+            fs.Close();\r
+        }\r
+\r
+        /// <summary>\r
         /// アンマネージドリソースを開放する\r
         /// </summary>\r
         public void Dispose()\r
@@ -371,7 +427,6 @@ namespace FooEditEngine.WPF
                 this.Render.Dispose();\r
             }\r
             SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);\r
-            DocumentExtend.Progress -= this.Document_Progress;\r
         }\r
         \r
         void Refresh(Rectangle updateRect)\r
@@ -916,25 +971,6 @@ namespace FooEditEngine.WPF
             TextStoreHelper.NotifyTextChanged(this.textStore, e.startIndex, e.removeLength, e.insertLength);\r
         }\r
 \r
-        void Document_Progress(object sender, ProgressEventArgs e)\r
-        {\r
-            switch (e.state)\r
-            {\r
-                case ProgressState.Start:\r
-                    this.View.LayoutLines.IsFrozneDirtyFlag = true;\r
-                    break;\r
-                case ProgressState.Complete:\r
-                    this.View.LayoutLines.IsFrozneDirtyFlag = false;\r
-                    this.Dispatcher.BeginInvoke(new Action(()=>{\r
-                        TextStoreHelper.NotifyTextChanged(this.textStore, 0, 0, this.Document.Length);\r
-                        if (this.verticalScrollBar != null)\r
-                            this.verticalScrollBar.Maximum = this.View.LayoutLines.Count;\r
-                    }), null);\r
-                    this.View.CalculateLineCountOnScreen();\r
-                    break;\r
-            }\r
-        }\r
-\r
         void timer_Tick(object sender, EventArgs e)\r
         {\r
             if (this.image.ActualWidth == 0 || this.image.ActualHeight == 0)\r