OSDN Git Service

LayoutLinesをDocumentに移動した
authorkonekoneko <test2214@hotmail.co.jp>
Sat, 1 Mar 2014 11:18:08 +0000 (20:18 +0900)
committerkonekoneko <test2214@hotmail.co.jp>
Sat, 1 Mar 2014 11:18:08 +0000 (20:18 +0900)
Common/Direct2D/MyTextLayout.cs
Common/Document.cs
Common/ViewBase.cs
Metro/FooEditEngine/FooTextBox.cs
Metro/FooEditEngine/Print/DocumentSource.cs
WPF/FooEditEngine/FooTextBox.cs
WPF/UnitTest/UnitTest1.cs
WPF/UnitTest/UnitTest2.cs
WPF/UnitTest/UnitTest4.cs
Windows/FooEditEngine/FooTextBox.cs

index be7fd6f..0a9cb90 100644 (file)
@@ -26,7 +26,9 @@ namespace FooEditEngine
         internal MyTextLayout(DW.Factory dwFactory,string str,DW.TextFormat format,double width,double height,float dip,bool showLineBreak)
         {
             if (dwFactory.IsDisposed)
+            {
                 throw new InvalidOperationException();
+            }
             str = str.Trim(Document.NewLine);   //取り除かないとキャレットの動きがおかしくなる
             if (showLineBreak)
             {
index 28756a7..2b940bc 100644 (file)
@@ -131,18 +131,19 @@ namespace FooEditEngine
         Regex regex;\r
         Match match;\r
         StringBuffer buffer;\r
+        LineToIndexTable _LayoutLines;\r
         bool _EnableFireUpdateEvent = true;\r
         SemaphoreSlim Semaphore = new SemaphoreSlim(MaxSemaphoreCount);\r
 \r
         /// <summary>\r
         /// コンストラクター\r
         /// </summary>\r
-        public Document()\r
-            : this(null)\r
+        internal Document(ITextRender render)\r
+            : this(null,render)\r
         {\r
         }\r
 \r
-        internal Document(Document doc)\r
+        internal Document(Document doc,ITextRender render)\r
         {\r
             if (doc == null)\r
                 this.buffer = new StringBuffer();\r
@@ -154,6 +155,58 @@ namespace FooEditEngine
             this.ChangeFireUpdateEvent += new EventHandler((s, e) => { });\r
             this.Markers = new MarkerCollection(this);\r
             this.UndoManager = new UndoManager();\r
+            this._LayoutLines = new LineToIndexTable(this, render);\r
+            this._LayoutLines.SpilitString = LayoutLines_SpilitStringByChar;\r
+            this._LayoutLines.Clear();\r
+        }\r
+\r
+        /// <summary>\r
+        /// レイアウト行を表す\r
+        /// </summary>\r
+        public LineToIndexTable LayoutLines\r
+        {\r
+            get\r
+            {\r
+                return this._LayoutLines;\r
+            }\r
+        }\r
+\r
+        IList<LineToIndexTableData> LayoutLines_SpilitStringByChar(object sender, SpilitStringEventArgs e)\r
+        {\r
+            return this.CreateLineList(e.index, e.length);\r
+        }\r
+\r
+        /// <summary>\r
+        /// レイアウト行を返す\r
+        /// </summary>\r
+        /// <param name="index">開始インデックス</param>\r
+        /// <param name="length">長さ</param>\r
+        /// <param name="lineLimitLength">1行当たりの最大文字数。-1で無制限</param>\r
+        /// <returns>レイアウト行リスト</returns>\r
+        internal IList<LineToIndexTableData> CreateLineList(int index, int length, int lineLimitLength = -1)\r
+        {\r
+            int startIndex = index;\r
+            int endIndex = index + length - 1;\r
+            List<LineToIndexTableData> output = new List<LineToIndexTableData>();\r
+\r
+            foreach (Tuple<int, int> range in this.ForEachLines(startIndex, endIndex, lineLimitLength))\r
+            {\r
+                int lineHeadIndex = range.Item1;\r
+                int lineLength = range.Item2;\r
+                char c = this.buffer[lineHeadIndex + lineLength - 1];\r
+                bool hasNewLine = c == Document.NewLine;\r
+                output.Add(this.LayoutLines.CreateLineToIndexTableData(lineHeadIndex, lineLength, hasNewLine, null));\r
+            }\r
+\r
+            if (output.Count > 0)\r
+                output.Last().LineEnd = true;\r
+\r
+            return output;\r
+        }\r
+\r
+        internal void FireUpdate(DocumentUpdateEventArgs e)\r
+        {\r
+            this.buffer_Update(this.buffer, e);\r
         }\r
 \r
         /// <summary>\r
@@ -673,6 +726,15 @@ namespace FooEditEngine
 \r
         void buffer_Update(object sender, DocumentUpdateEventArgs e)\r
         {\r
+            switch (e.type)\r
+            {\r
+                case UpdateType.Replace:\r
+                    this._LayoutLines.UpdateAsReplace(e.startIndex, e.removeLength, e.insertLength);\r
+                    break;\r
+                case UpdateType.Clear:\r
+                    this._LayoutLines.Clear();\r
+                    break;\r
+            }\r
             this.UpdateCalledAlways(this, e);\r
             if(this.FireUpdateEvent)\r
                 this.Update(this, e);\r
index e1a16da..2842906 100644 (file)
@@ -78,7 +78,6 @@ namespace FooEditEngine
         const int SpiltCharCount = 1024;\r
 \r
         protected Document Document;\r
-        protected LineToIndexTable _LayoutLines;\r
         protected Point2 _Src = new Point2();\r
         protected Rectangle _Rect;\r
         protected double _LongestWidth;\r
@@ -92,7 +91,6 @@ namespace FooEditEngine
             this._Padding = padding;\r
             this.Document = doc;\r
             this.Document.UpdateCalledAlways += new DocumentUpdateEventHandler(doc_Update);\r
-            this._LayoutLines = new LineToIndexTable(this.Document, r);\r
             this._LayoutLines.SpilitString = new SpilitStringEventHandler(LayoutLines_SpilitStringByChar);\r
             this.render = r;\r
             this.render.ChangedRenderResource += new ChangedRenderResourceEventHandler(render_ChangedRenderResource);\r
@@ -104,6 +102,14 @@ namespace FooEditEngine
             this.MarkerPatternSet.Updated += WacthDogPattern_Updated;\r
         }\r
 \r
+        protected LineToIndexTable _LayoutLines\r
+        {\r
+            get\r
+            {\r
+                return this.Document.LayoutLines;\r
+            }\r
+        }\r
+\r
         public event EventHandler SrcChanged;\r
 \r
         public event EventHandler PerformLayouted;\r
@@ -244,8 +250,8 @@ namespace FooEditEngine
         /// </summary>\r
         public virtual void PerfomLayouts()\r
         {\r
-            this.doc_Update(this.Document, new DocumentUpdateEventArgs(UpdateType.Clear, -1, -1, -1));\r
-            this.doc_Update(this.Document, new DocumentUpdateEventArgs(UpdateType.Replace, 0, 0, this.Document.Length));\r
+            this.Document.FireUpdate(new DocumentUpdateEventArgs(UpdateType.Clear, -1, -1, -1));\r
+            this.Document.FireUpdate(new DocumentUpdateEventArgs(UpdateType.Replace, 0, 0, this.Document.Length));\r
             CalculateLineCountOnScreen();\r
             this.PerformLayouted(this, null);\r
         }\r
@@ -398,11 +404,7 @@ namespace FooEditEngine
         {\r
             switch (e.type)\r
             {\r
-                case UpdateType.Replace:\r
-                    this._LayoutLines.UpdateAsReplace(e.startIndex, e.removeLength, e.insertLength);\r
-                    break;\r
                 case UpdateType.Clear:\r
-                    this._LayoutLines.Clear();\r
                     this._LongestWidth = 0;\r
                     break;\r
             }\r
@@ -429,24 +431,7 @@ namespace FooEditEngine
 \r
         IList<LineToIndexTableData> LayoutLines_SpilitStringByChar(object sender, SpilitStringEventArgs e)\r
         {\r
-            LineToIndexTable layoutLineCollection = (LineToIndexTable)sender;\r
-            int startIndex = e.index;\r
-            int endIndex = e.index + e.length - 1;\r
-            List<LineToIndexTableData> output = new List<LineToIndexTableData>();\r
-\r
-            foreach (Tuple<int, int> range in this.Document.ForEachLines(startIndex, endIndex, 1000))\r
-            {\r
-                int lineHeadIndex = range.Item1;\r
-                int lineLength = range.Item2;\r
-                char c = this.Document[lineHeadIndex + lineLength - 1];\r
-                bool hasNewLine = c == Document.NewLine;\r
-                output.Add(layoutLineCollection.CreateLineToIndexTableData(lineHeadIndex, lineLength, hasNewLine, null));\r
-            }\r
-\r
-            if (output.Count > 0)\r
-                output.Last().LineEnd = true;\r
-\r
-            return output;\r
+            return this.Document.CreateLineList(e.index, e.length,1000);\r
         }\r
     }\r
 }\r
index b5edb7a..f40ec3b 100644 (file)
@@ -72,12 +72,12 @@ namespace FooEditEngine.Metro
             this.textStore.CompositionUpdated += textStore_CompositionUpdated;\r
             this.textStore.CompositionEnded += textStore_CompositionEnded;\r
 \r
-            this.Document = new Document();\r
-\r
             this.rectangle = new Windows.UI.Xaml.Shapes.Rectangle();\r
             this.rectangle.Margin = this.Padding;\r
             this.Render = new D2DRender(this,this.rectangle,this.textStore);\r
 \r
+            this.Document = new Document(this.Render);\r
+\r
             this.View = new EditView(this.Document, this.Render, new Padding(5, Gripper.HitAreaWidth, Gripper.HitAreaWidth / 2, Gripper.HitAreaWidth));\r
             this.View.SrcChanged += View_SrcChanged;\r
             this.View.InsertMode = this.InsertMode;\r
index f55e984..54a2df6 100644 (file)
@@ -62,9 +62,9 @@ namespace FooEditEngine
         Windows.UI.Color foreground, comment, keyword1, keyword2, literal, url;\r
         string fontName;\r
         double fontSize;\r
-        Document document;\r
         LineBreakMethod lineBreakMethod;\r
         int lineBreakCharCount, tabCount;\r
+        Document document;\r
         bool urlMark;\r
         IHilighter hilighter;\r
         float displayDpi;\r
@@ -80,7 +80,7 @@ namespace FooEditEngine
             this.fontName = textbox.FontFamily.Source;\r
             this.fontSize = textbox.FontSize;\r
             this.tabCount = textbox.TabChars;\r
-            this.document = new Document(textbox.Document);\r
+            this.document = textbox.Document;\r
             this.lineBreakMethod = textbox.LineBreakMethod;\r
             this.lineBreakCharCount = textbox.LineBreakCharCount;\r
             this.drawLineNumber = textbox.DrawLineNumber;\r
@@ -90,9 +90,9 @@ namespace FooEditEngine
             this.padding = padding;\r
             this.EnableHilight = true;\r
         }\r
-        public D2DRenderBase CreateRender(PrintPageDescription pagedesc, IPrintDocumentPackageTarget docPackageTarget)\r
+        public D2DPrintRender CreateRender(PrintPageDescription pagedesc, IPrintDocumentPackageTarget docPackageTarget)\r
         {\r
-            D2DRenderBase render;\r
+            D2DPrintRender render;\r
             Size size = new Size(pagedesc.ImageableRect.Width, pagedesc.ImageableRect.Height);\r
             render = new D2DPrintRender(this.fontName, this.fontSize, size, Math.Min(pagedesc.DpiX, pagedesc.DpiY), docPackageTarget);\r
             render.Foreground = D2DRenderBase.ToColor4(this.foreground);\r
@@ -116,9 +116,10 @@ namespace FooEditEngine
             render.Url = D2DRenderBase.ToColor4(this.url);\r
             return render;\r
         }\r
-        public PrintableView CreateView(PrintPageDescription pagedesc, D2DRenderBase render, string header, string footer)\r
+        public PrintableView CreateView(PrintPageDescription pagedesc, IPrintableTextRender render, string header, string footer)\r
         {\r
-            PrintableView view = new PrintableView(this.document, (IPrintableTextRender)render,padding);\r
+            Document documentSnap = new Document(this.document, render);\r
+            PrintableView view = new PrintableView(documentSnap, render,padding);\r
             view.TabStops = this.tabCount;\r
             view.LineBreak = this.lineBreakMethod == LineBreakMethod.None ? LineBreakMethod.PageBound : this.lineBreakMethod;\r
             view.LineBreakCharCount = this.lineBreakCharCount;\r
@@ -217,7 +218,7 @@ namespace FooEditEngine
             PrintTaskOptions options = (PrintTaskOptions)printTaskOptions;\r
             PrintPageDescription pagedesc = options.GetPageDescription(1);\r
 \r
-            D2DRenderBase render = this.factory.CreateRender(pagedesc, docPackageTarget);\r
+            D2DPrintRender render = this.factory.CreateRender(pagedesc, docPackageTarget);\r
             PrintableView view = this.factory.CreateView(pagedesc, render, this.Header, this.Fotter);\r
 \r
             bool result = false;\r
index 8f53691..7a30776 100644 (file)
@@ -86,14 +86,14 @@ namespace FooEditEngine.WPF
             this.textStore.CompositionUpdated += textStore_CompositionUpdated;\r
             this.textStore.CompositionEnded += textStore_CompositionEnded;\r
 \r
-            this.Document = new Document();\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(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
index e47717e..51c9273 100644 (file)
@@ -82,7 +82,8 @@ namespace UnitTest
         [TestMethod]
         public void UpdateItems()
         {
-            Document doc = new Document();
+            DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             FoldingCollection collection = new FoldingCollection();
             collection.Add(new FoldingItem(0, 10));
             collection.Add(new FoldingItem(1, 5));
index f0de6cc..6956e88 100644 (file)
@@ -23,8 +23,8 @@ namespace UnitTest
         [TestMethod]
         public void InsertSingleLineTest()
         {
-            Document doc = new Document();
             DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             DummyView view = new DummyView(doc, render);
             doc.Clear();
             doc.Append("a\nb\nc\nd");
@@ -62,8 +62,8 @@ namespace UnitTest
         [TestMethod]
         public void InsertMultiLineTest()
         {
-            Document doc = new Document();
             DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             DummyView view = new DummyView(doc, render);
 
             doc.Clear();
@@ -100,8 +100,8 @@ namespace UnitTest
         [TestMethod]
         public void RemoveSingleLineTest()
         {
-            Document doc = new Document();
             DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             DummyView view = new DummyView(doc, render);
             doc.Clear();
             doc.Append("aa\nbb\ncc\ndd");
@@ -134,8 +134,8 @@ namespace UnitTest
         [TestMethod]
         public void RemoveMultiLineTest()
         {
-            Document doc = new Document();
             DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             DummyView view = new DummyView(doc, render);
 
             doc.Clear();
@@ -186,8 +186,8 @@ namespace UnitTest
         [TestMethod]
         public void QueryTest()
         {
-            Document doc = new Document();
             DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             DummyView view = new DummyView(doc, render);
             doc.Clear();
             doc.Append("a\nb\nc");
@@ -219,7 +219,8 @@ namespace UnitTest
         [TestMethod]
         public void FindTest1()
         {
-            Document doc = new Document();
+            DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             doc.Append("is this a pen");
             doc.SetFindParam("is", false, RegexOptions.None);
             IEnumerator<SearchResult> it = doc.Find();
@@ -234,7 +235,8 @@ namespace UnitTest
         [TestMethod]
         public void FindTest2()
         {
-            Document doc = new Document();
+            DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             doc.Append("is this a pen");
             doc.SetFindParam("is", false, RegexOptions.None);
             IEnumerator<SearchResult> it = doc.Find(3,4);
@@ -246,7 +248,8 @@ namespace UnitTest
         [TestMethod]
         public void FindTest3()
         {
-            Document doc = new Document();
+            DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             doc.Append("is this a pen");
             doc.SetFindParam("is", false, RegexOptions.None);
             IEnumerator<SearchResult> it = doc.Find(0, 8);
@@ -261,7 +264,8 @@ namespace UnitTest
         [TestMethod]
         public void ReaderTest1()
         {
-            Document doc = new Document();
+            DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             doc.Append("a");
             DocumentReader reader = doc.CreateReader();
             Assert.IsTrue(reader.Read() == 'a');
@@ -271,7 +275,8 @@ namespace UnitTest
         [TestMethod]
         public void ReaderTest2()
         {
-            Document doc = new Document();
+            DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             doc.Append("abc");
             DocumentReader reader = doc.CreateReader();
             char[] buf = new char[2];
@@ -284,7 +289,8 @@ namespace UnitTest
         [TestMethod]
         public void GetLinesText()
         {
-            Document doc = new Document();
+            DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             doc.Append("a\nb\nc");
             var result = doc.GetLines(0, doc.Length - 1).ToArray();
             Assert.AreEqual("a\n", result[0]);
@@ -339,7 +345,8 @@ namespace UnitTest
         [TestMethod]
         public void MarkerTest()
         {
-            Document doc = new Document();
+            DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             doc.Append("this is a pen");
             doc.SetMarker(MarkerIDs.Defalut, Marker.Create(0, 4, HilightType.Sold));
 
@@ -383,8 +390,8 @@ namespace UnitTest
             };
             string str = "html haml";
 
-            Document doc = new Document();
             DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             DummyView view = new DummyView(doc, render);
             view.MarkerPatternSet.Add(MarkerIDs.Defalut, dog);
             doc.Clear();
index d68066a..adabd1f 100644 (file)
@@ -21,9 +21,9 @@ namespace UnitTest
         [TestMethod]
         public void SelectTest()
         {
-            Document doc = new Document();
             DummyRender render = new DummyRender();
-            EditView view = new EditView(doc,render);
+            Document doc = new Document(render);
+            EditView view = new EditView(doc, render);
             Controller ctrl = new Controller(doc, view);
             doc.Clear();
             doc.Append("a\nb\nc");
@@ -34,8 +34,8 @@ namespace UnitTest
         [TestMethod]
         public void ReplaceSelectionTest()
         {
-            Document doc = new Document();
             DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             EditView view = new EditView(doc, render);
             Controller ctrl = new Controller(doc, view);
             doc.Clear();
@@ -49,8 +49,8 @@ namespace UnitTest
         [TestMethod]
         public void SelectByRectTest()
         {
-            Document doc = new Document();
             DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             EditView view = new EditView(doc, render);
             Controller ctrl = new Controller(doc, view);
             doc.Clear();
@@ -64,8 +64,8 @@ namespace UnitTest
         [TestMethod]
         public void RectEditTest()
         {
-            Document doc = new Document();
             DummyRender render = new DummyRender();
+            Document doc = new Document(render);
             EditView view = new EditView(doc, render);
             Controller ctrl = new Controller(doc, view);
             doc.Clear();
index d868049..7f48a9e 100644 (file)
@@ -71,10 +71,9 @@ namespace FooEditEngine.Windows
             this.SetStyle(ControlStyles.UserPaint, true);\r
             this.SetStyle(ControlStyles.Opaque, true);\r
 \r
-            this.Document = new Document();\r
-\r
             this.render = new D2DTextRender(this);\r
-            this.View = new EditView(this.Document,this.render,new FooEditEngine.Padding(5,5,5,5));\r
+            this.Document = new Document(this.render);\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