OSDN Git Service

FoldingItem.Parentを廃止した。これに伴い、FoldingCollectionにいくつかのメソッドを追加した
authorkonekoneko <test2214@hotmail.co.jp>
Sat, 15 Mar 2014 06:16:51 +0000 (15:16 +0900)
committerkonekoneko <test2214@hotmail.co.jp>
Sat, 15 Mar 2014 06:16:51 +0000 (15:16 +0900)
Common/EditView.cs
Common/FoldingCollection.cs
WPF/UnitTest/UnitTest1.cs

index 79c1810..6de6a4c 100644 (file)
@@ -281,9 +281,11 @@ namespace FooEditEngine
 \r
                     if (foldingData != null)\r
                     {\r
-                        if ((foldingData.Parent == null || foldingData.Parent.Expand) && foldingData.IsFirstLine(this.LayoutLines, i))\r
+                        if ((!this.LayoutLines.FoldingCollection.IsHasParent(foldingData) || \r
+                             !this.LayoutLines.FoldingCollection.IsParentHidden(foldingData))\r
+                            && foldingData.IsFirstLine(this.LayoutLines, i))\r
                             render.DrawFoldingMark(foldingData.Expand, this.PageBound.X + this.GetRealtiveX(AreaType.FoldingArea), pos.Y);\r
-                        if (foldingData.IsHidden(lineIndex))\r
+                        if (this.LayoutLines.FoldingCollection.IsHidden(lineIndex))\r
                             continue;\r
                     }\r
 \r
@@ -477,9 +479,7 @@ namespace FooEditEngine
                 lineHeadIndex = this.LayoutLines.GetIndexFromLineNumber(i);\r
                 lineLength = this.LayoutLines.GetLengthFromLineNumber(i);\r
 \r
-                FoldingItem foldingData = this.LayoutLines.FoldingCollection.Get(lineHeadIndex, lineLength);\r
-\r
-                if (foldingData != null && foldingData.IsHidden(lineHeadIndex))\r
+                if (this.LayoutLines.FoldingCollection.IsHidden(lineHeadIndex))\r
                     continue;\r
 \r
                 if (y + height > p.Y)\r
@@ -542,8 +542,7 @@ namespace FooEditEngine
             {\r
                 int lineHeadIndex = this.LayoutLines.GetIndexFromLineNumber(i);\r
                 int lineLength = this.LayoutLines.GetLengthFromLineNumber(i);\r
-                FoldingItem foldingData = this.LayoutLines.FoldingCollection.Get(lineHeadIndex, lineLength);\r
-                if (foldingData != null && foldingData.IsHidden(lineHeadIndex))\r
+                if (this.LayoutLines.FoldingCollection.IsHidden(lineHeadIndex))\r
                     continue;\r
                 p.Y += this.LayoutLines.GetLayout(i).Height;\r
             }\r
@@ -565,9 +564,12 @@ namespace FooEditEngine
                 int lineHeadIndex = this.LayoutLines.GetIndexFromLineNumber(row);\r
                 int lineLength = this.LayoutLines.GetLengthFromLineNumber(row);\r
                 FoldingItem foldingData = this.LayoutLines.FoldingCollection.Get(lineHeadIndex, lineLength);\r
-                if (foldingData != null && (!foldingData.IsFirstLine(this.LayoutLines, row) || foldingData.IsParentHidden()))\r
+                if(foldingData != null)\r
                 {\r
-                    this.LayoutLines.FoldingCollection.Expand(foldingData);\r
+                    if (this.LayoutLines.FoldingCollection.IsParentHidden(foldingData) || !foldingData.IsFirstLine(this.LayoutLines, row))\r
+                    {\r
+                        this.LayoutLines.FoldingCollection.Expand(foldingData);\r
+                    }\r
                 }\r
             }\r
 \r
@@ -690,9 +692,7 @@ namespace FooEditEngine
                         int lineHeadIndex = this.LayoutLines.GetIndexFromLineNumber(currentRow);\r
                         int lineLength = this.LayoutLines.GetLengthFromLineNumber(currentRow);\r
 \r
-                        FoldingItem foldingData = this.LayoutLines.FoldingCollection.Get(lineHeadIndex, lineLength);\r
-\r
-                        if (foldingData != null && foldingData.IsHidden(lineHeadIndex))\r
+                        if (this.LayoutLines.FoldingCollection.IsHidden(lineHeadIndex))\r
                             continue;\r
 \r
                         y += this.LayoutLines.GetLayout(currentRow).Height;\r
@@ -717,8 +717,7 @@ namespace FooEditEngine
             {\r
                 int lineHeadIndex = this.LayoutLines.GetIndexFromLineNumber(i);\r
                 int lineLength = this.LayoutLines.GetLengthFromLineNumber(i);\r
-                FoldingItem foldingData = this.LayoutLines.FoldingCollection.GetFarestHiddenFoldingData(lineHeadIndex, lineLength);\r
-                if (foldingData != null && foldingData.IsHidden(lineHeadIndex))\r
+                if (this.LayoutLines.FoldingCollection.IsHidden(lineHeadIndex))\r
                     continue;\r
                 if (count <= 0)\r
                     return i;\r
@@ -846,9 +845,7 @@ namespace FooEditEngine
                 int lineHeadIndex = this.LayoutLines.GetIndexFromLineNumber(row);\r
                 int lineLength = this.LayoutLines.GetLengthFromLineNumber(row);\r
 \r
-                FoldingItem foldingData = this.LayoutLines.FoldingCollection.Get(lineHeadIndex, lineLength);\r
-\r
-                if (foldingData != null && foldingData.End < this.Document.Length - 1 && foldingData.IsHidden(lineHeadIndex))\r
+                if (this.LayoutLines.FoldingCollection.IsHidden(lineHeadIndex))\r
                     continue;\r
 \r
                 ITextLayout layout = this.LayoutLines.GetLayout(row);\r
index cc3c1b7..119f5ea 100644 (file)
@@ -61,36 +61,18 @@ namespace FooEditEngine
             set;\r
         }\r
 \r
-        internal FoldingItem Parent;\r
-\r
         /// <summary>\r
         /// コンストラクター\r
         /// </summary>\r
         /// <param name="start">開始インデックス</param>\r
         /// <param name="end">終了インデックス</param>\r
-        public FoldingItem(int start, int end)\r
+        /// <param name="expand">展開フラグ</param>\r
+        public FoldingItem(int start, int end,bool expand = true)\r
         {\r
             if (start >= end)\r
                 throw new ArgumentException("start < endである必要があります");\r
             this.Range = new Range<int>(start, end);\r
-            this.Expand = true;\r
-        }\r
-\r
-        internal bool IsParentHidden()\r
-        {\r
-            if (this.Parent != null && !this.Parent.Expand)\r
-                return true;\r
-            else\r
-                return false;\r
-        }\r
-\r
-        internal bool IsHidden(int index)\r
-        {\r
-            if (this.Parent != null && !this.Parent.Expand)\r
-                return true;\r
-            if (!this.Expand && index > this.Start && index <= this.End)\r
-                return true;\r
-            return false;\r
+            this.Expand = expand;\r
         }\r
 \r
         internal bool IsFirstLine(LineToIndexTable layoutLines, int row)\r
@@ -188,12 +170,6 @@ namespace FooEditEngine
             {\r
                 if (item.Start == data.Start && item.End == data.End)\r
                     return;\r
-                if (item.Parent != null && data.Start < item.Parent.Start && data.End >= item.Parent.End)\r
-                    continue;\r
-                else if (item.Start < data.Start && item.End > data.End)\r
-                    data.Parent = item;\r
-                else if (item.Start > data.Start && item.End <= data.End)\r
-                    item.Parent = data;\r
             }\r
             this.collection.Add(data);\r
         }\r
@@ -275,14 +251,12 @@ namespace FooEditEngine
         /// <remarks>親ノードも含めてすべて展開されます</remarks>\r
         public void Expand(FoldingItem foldingData)\r
         {\r
-            while (foldingData != null)\r
-            {\r
-                foldingData.Expand = true;\r
-                if (foldingData.Parent == null || foldingData.Parent.Expand)\r
-                    break;\r
-                else\r
-                    foldingData = foldingData.Parent;\r
-            }\r
+            if (this.collection.Count == 0)\r
+                return;\r
+            this.collection.Rebuild();\r
+            List<FoldingItem> items = this.collection.Query(foldingData.Range);\r
+            foreach (FoldingItem item in items)\r
+                item.Expand = true;\r
             this.StatusChanged(this, new FoldingItemStatusChangedEventArgs(foldingData));\r
         }\r
 \r
@@ -305,6 +279,64 @@ namespace FooEditEngine
         }\r
 \r
         /// <summary>\r
+        /// インデックスを含むノードが折りたたまれているかを判定する\r
+        /// </summary>\r
+        /// <param name="index">インデックス</param>\r
+        /// <returns>折りたたまれていれば真を返す。そうでない場合・ノードが存在しない場合は偽を返す</returns>\r
+        public bool IsHidden(int index)\r
+        {\r
+            this.collection.Rebuild();\r
+            List<FoldingItem> items = this.collection.Query(index);\r
+            if (items.Count == 0)\r
+                return false;\r
+            int hiddenCount = items.Count((item) =>{\r
+                return !item.Expand && index > item.Start && index <= item.End;\r
+            });\r
+            return hiddenCount > 0;\r
+        }\r
+\r
+        /// <summary>\r
+        /// 親ノードが隠されているかどうかを判定する\r
+        /// </summary>\r
+        /// <param name="foldingItem">判定したいノード</param>\r
+        /// <returns>隠されていれば真を返す</returns>\r
+        public bool IsParentHidden(FoldingItem foldingItem)\r
+        {\r
+            if (foldingItem == null)\r
+                return false;\r
+            this.collection.Rebuild();\r
+            List<FoldingItem> items = this.collection.Query(foldingItem.Range);\r
+            if (items.Count == 0)\r
+                return false;\r
+            int hiddenCount = items.Count((item) =>\r
+            {\r
+                //自分自身ノードか\r
+                if (foldingItem.Range.Equals(item.Range))\r
+                    return false;\r
+                //ノードが親かつ隠されているかどうか\r
+                return !item.Expand && item.Start < foldingItem.Start && item.End > foldingItem.End;\r
+            });\r
+            return hiddenCount > 0;\r
+        }\r
+\r
+        /// <summary>\r
+        /// 親を持っているか判定する\r
+        /// </summary>\r
+        /// <param name="foldingItem">判定したいノード</param>\r
+        /// <returns>親を持っていれば真を返す</returns>\r
+        public bool IsHasParent(FoldingItem foldingItem)\r
+        {\r
+            if (foldingItem == null)\r
+                return false;\r
+            this.collection.Rebuild();\r
+            List<FoldingItem> items = this.collection.Query(foldingItem.Range);\r
+            if (items.Count == 0 || items.Count == 1)\r
+                return false;\r
+            int parentItemCount = items.Count((item) => item.Start < foldingItem.Start && item.End > foldingItem.End);\r
+            return parentItemCount > 0;\r
+        }\r
+\r
+        /// <summary>\r
         /// 指定した範囲に属する親ノードを取得する\r
         /// </summary>\r
         /// <param name="index">開始インデックス</param>\r
@@ -313,17 +345,25 @@ namespace FooEditEngine
         /// <remarks>指定した範囲には属する中で隠された親ノードだけが取得される</remarks>\r
         public FoldingItem GetFarestHiddenFoldingData(int index, int length)\r
         {\r
-            FoldingItem foldingData = this.Get(index, length);\r
-            if (foldingData == null)\r
+            if (this.collection.Count == 0)\r
                 return null;\r
-            while (foldingData.Parent != null)\r
+            this.collection.Rebuild();\r
+            List<FoldingItem> items = this.collection.Query(new Range<int>(index, index + length - 1));\r
+\r
+            //もっとも範囲の広いアイテムが親を表す\r
+            FoldingItem parentItem = null;\r
+            int max = 0;\r
+            foreach(FoldingItem item in items)\r
             {\r
-                if (foldingData.Parent.Expand)\r
-                    break;\r
-                else\r
-                    foldingData = foldingData.Parent;\r
+                int item_length = item.End -item.Start + 1;\r
+                if(item_length > max)\r
+                {\r
+                    max = item_length;\r
+                    parentItem = item;\r
+                }\r
             }\r
-            return foldingData;\r
+\r
+            return parentItem;\r
         }\r
     }\r
 }\r
index 82e9c1b..b15d68c 100644 (file)
@@ -19,6 +19,40 @@ namespace UnitTest
     public class FoldingCollectionTest
     {
         [TestMethod]
+        public void HiddenTest()
+        {
+            FoldingCollection collection = new FoldingCollection();
+            collection.Add(new FoldingItem(0, 10,false));
+            collection.Add(new FoldingItem(1, 5));
+            Assert.IsTrue(collection.IsHidden(2));
+            collection = new FoldingCollection();
+            collection.Add(new FoldingItem(0, 10));
+            collection.Add(new FoldingItem(1, 5,false));
+            Assert.IsTrue(collection.IsHidden(2));
+        }
+        [TestMethod]
+        public void HiddenParrentTest()
+        {
+            FoldingCollection collection = new FoldingCollection();
+            FoldingItem item = new FoldingItem(0, 10, false);
+            collection.Add(item);
+            FoldingItem item1 = new FoldingItem(1, 5);
+            collection.Add(item1);
+            Assert.IsTrue(collection.IsParentHidden(item1));
+            Assert.IsTrue(!collection.IsParentHidden(item));
+        }
+        [TestMethod]
+        public void HasParrentTest()
+        {
+            FoldingCollection collection = new FoldingCollection();
+            FoldingItem item = new FoldingItem(0, 10, false);
+            collection.Add(item);
+            FoldingItem item1 = new FoldingItem(1, 5);
+            collection.Add(item1);
+            Assert.IsTrue(collection.IsHasParent(item1));
+            Assert.IsTrue(!collection.IsHasParent(item));
+        }
+        [TestMethod]
         public void GetFoldingItem()
         {
             FoldingCollection collection = new FoldingCollection();