\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
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
{\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
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
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
{\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
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
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
{\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
/// <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
}\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
/// <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
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();