421 lines
12 KiB
VB.net
421 lines
12 KiB
VB.net
|
|
|
|||
|
|
Public Class RowNodes
|
|||
|
|
Implements IList, ICollection, IEnumerable
|
|||
|
|
|
|||
|
|
Private ReadOnly _owner As RowNode
|
|||
|
|
|
|||
|
|
Private nodes As List(Of RowNode)
|
|||
|
|
|
|||
|
|
Friend Sub New(node As RowNode)
|
|||
|
|
_owner = node
|
|||
|
|
nodes = New List(Of RowNode)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
Default Public Property Item(index As Integer) As Object Implements IList.Item
|
|||
|
|
Get
|
|||
|
|
Return nodes.Item(index)
|
|||
|
|
End Get
|
|||
|
|
Set(value As Object)
|
|||
|
|
nodes(index) = CType(value, RowNode)
|
|||
|
|
End Set
|
|||
|
|
End Property
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
Public ReadOnly Property IsReadOnly As Boolean Implements IList.IsReadOnly
|
|||
|
|
Get
|
|||
|
|
Return False
|
|||
|
|
End Get
|
|||
|
|
End Property
|
|||
|
|
|
|||
|
|
Public ReadOnly Property IsFixedSize As Boolean Implements IList.IsFixedSize
|
|||
|
|
Get
|
|||
|
|
Return False
|
|||
|
|
End Get
|
|||
|
|
End Property
|
|||
|
|
|
|||
|
|
Public ReadOnly Property Count As Integer Implements ICollection.Count
|
|||
|
|
Get
|
|||
|
|
Return nodes.Count
|
|||
|
|
End Get
|
|||
|
|
End Property
|
|||
|
|
|
|||
|
|
Public ReadOnly Property SyncRoot As Object Implements ICollection.SyncRoot
|
|||
|
|
Get
|
|||
|
|
Return False
|
|||
|
|
End Get
|
|||
|
|
End Property
|
|||
|
|
|
|||
|
|
Public ReadOnly Property IsSynchronized As Boolean Implements ICollection.IsSynchronized
|
|||
|
|
Get
|
|||
|
|
Return False
|
|||
|
|
End Get
|
|||
|
|
End Property
|
|||
|
|
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 更新节点的上一节点指向
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="node">需要更新的节点</param>
|
|||
|
|
Private Sub AddNodeUpdatePrevNode(node As RowNode)
|
|||
|
|
If node.Index > 0 Then
|
|||
|
|
node.PrevNode = node.ParentNode.Nodes(node.Index - 1)
|
|||
|
|
|
|||
|
|
'更新上一节点的下一节点指向
|
|||
|
|
node.PrevNode.NextNode = node
|
|||
|
|
Else
|
|||
|
|
node.PrevNode = Nothing
|
|||
|
|
End If
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 更新节点的下一节点指向
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="node">需要更新的节点</param>
|
|||
|
|
Private Sub AddNodeUpdateNextNode(node As RowNode)
|
|||
|
|
If node.Index < node.ParentNode.Nodes.Count - 1 Then
|
|||
|
|
node.NextNode = node.ParentNode.Nodes(node.Index + 1)
|
|||
|
|
|
|||
|
|
'更新下一节点的上一节点指向
|
|||
|
|
node.NextNode.PrevNode = node
|
|||
|
|
Else
|
|||
|
|
node.NextNode = Nothing
|
|||
|
|
End If
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 新增节点后,更新父节点的所有子节点计数
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="node">新增的节点</param>
|
|||
|
|
Private Sub AddNodeUpdateAllChildCount(node As RowNode)
|
|||
|
|
Dim pNode As RowNode = node.ParentNode
|
|||
|
|
|
|||
|
|
While pNode IsNot Nothing
|
|||
|
|
pNode.AllChildCount += (node.AllChildCount + 1)
|
|||
|
|
|
|||
|
|
pNode = pNode.ParentNode
|
|||
|
|
End While
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 删除节点后,更新父节点的所有子节点计数
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="node">被删除的节点</param>
|
|||
|
|
''' <param name="include">包含当前节点</param>
|
|||
|
|
Private Sub DelNodeUpdateAllChildCount(node As RowNode, Optional include As Boolean = True)
|
|||
|
|
|
|||
|
|
Dim removeCount As Integer
|
|||
|
|
|
|||
|
|
If include Then
|
|||
|
|
removeCount = node.AllChildCount + 1
|
|||
|
|
Else
|
|||
|
|
removeCount = node.AllChildCount
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
Dim pNode As RowNode = node.ParentNode
|
|||
|
|
While pNode IsNot Nothing
|
|||
|
|
pNode.AllChildCount -= removeCount
|
|||
|
|
|
|||
|
|
pNode = pNode.ParentNode
|
|||
|
|
End While
|
|||
|
|
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 插入节点后,更新节点下方节点的索引
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="node">需要更新下方节点索引的节点</param>
|
|||
|
|
Private Sub AddNodeUpdateRowIndex(node As RowNode)
|
|||
|
|
While node.NextNode IsNot Nothing
|
|||
|
|
node.NextNode.Index = node.Index + 1
|
|||
|
|
node = node.NextNode
|
|||
|
|
End While
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 删除节点后,更新节点下方节点的索引
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="node"></param>
|
|||
|
|
Private Sub DelNodeUpdateRowIndex(node As RowNode)
|
|||
|
|
If node.NextNode Is Nothing Then Return
|
|||
|
|
node.NextNode.Index = node.Index
|
|||
|
|
node = node.NextNode
|
|||
|
|
|
|||
|
|
While node.NextNode IsNot Nothing
|
|||
|
|
node.NextNode.Index = node.Index + 1
|
|||
|
|
node = node.NextNode
|
|||
|
|
End While
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 获取新添加的节点的链状目录索引
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="node"></param>
|
|||
|
|
''' <returns></returns>
|
|||
|
|
Private Function GetRowListIndex(node As RowNode) As Integer
|
|||
|
|
Dim rowListIndex As Integer
|
|||
|
|
If node.Index = 0 Then
|
|||
|
|
rowListIndex = node.ParentNode.RowListIndex + 1
|
|||
|
|
Else
|
|||
|
|
rowListIndex = node.PrevNode.RowListIndex + node.PrevNode.AllChildCount + 1
|
|||
|
|
End If
|
|||
|
|
Return rowListIndex
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 更新节点的所有子节点的链式结合的指向
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="pNode"></param>
|
|||
|
|
''' <param name="node"></param>
|
|||
|
|
Private Sub AddNodeUpdateRowList(pNode As RowNode, node As RowNode)
|
|||
|
|
node.RowList = pNode.RowList
|
|||
|
|
node.RowListIndex = GetRowListIndex(node)
|
|||
|
|
node.RowList.Insert(node.RowListIndex, node)
|
|||
|
|
|
|||
|
|
For Each cNode As RowNode In node.Nodes
|
|||
|
|
AddNodeUpdateRowList(node, cNode)
|
|||
|
|
Next
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 删除节点后,更新链状列表
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="node"></param>
|
|||
|
|
''' <param name="include">包含当前节点</param>
|
|||
|
|
Private Sub DelNodeUpdateRowList(node As RowNode, Optional include As Boolean = True)
|
|||
|
|
Dim index As Integer
|
|||
|
|
|
|||
|
|
If include Then
|
|||
|
|
index = node.RowListIndex
|
|||
|
|
node.RowList.RemoveAt(index)
|
|||
|
|
Else
|
|||
|
|
index = node.RowListIndex + 1
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
Dim removeCount As Integer = node.AllChildCount
|
|||
|
|
While removeCount > 0
|
|||
|
|
node.RowList.RemoveAt(index)
|
|||
|
|
removeCount -= 1
|
|||
|
|
End While
|
|||
|
|
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 插入节点后,更新链状目录中受影响节点的索引
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="node"></param>
|
|||
|
|
Private Sub AddNodeUpdateRowListIndex(node As RowNode)
|
|||
|
|
Dim startIndex As Integer = node.RowListIndex + node.AllChildCount + 1
|
|||
|
|
|
|||
|
|
For index As Integer = startIndex To node.RowList.Count - 1
|
|||
|
|
node.RowList(index).RowListIndex = index
|
|||
|
|
Next
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 删除节点后,更新链状目录中受影响节点的索引
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="node">删除的节点</param>
|
|||
|
|
''' <param name="include">是否保存该节点</param>
|
|||
|
|
Private Sub DelNodeUpdateRowListIndex(node As RowNode, Optional include As Boolean = True)
|
|||
|
|
Dim startIndex As Integer = node.RowListIndex
|
|||
|
|
If include = False Then startIndex += 1
|
|||
|
|
For i As Integer = startIndex To node.RowList.Count - 1
|
|||
|
|
_owner.RowList(i).RowListIndex = i
|
|||
|
|
Next
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
Public Function Add(value As Object) As Integer Implements IList.Add
|
|||
|
|
Dim node As RowNode
|
|||
|
|
Try
|
|||
|
|
node = CType(value, RowNode)
|
|||
|
|
Catch ex As Exception
|
|||
|
|
Return -1
|
|||
|
|
End Try
|
|||
|
|
|
|||
|
|
nodes.Add(node)
|
|||
|
|
node.HeadNode = _owner.HeadNode
|
|||
|
|
node.ParentNode = _owner
|
|||
|
|
node.Lever = _owner.Lever + 1
|
|||
|
|
node.Index = nodes.Count - 1
|
|||
|
|
node.RowList = _owner.RowList
|
|||
|
|
node.Visible = _owner.Visible And _owner.Expanded
|
|||
|
|
|
|||
|
|
'更新节点可见属性
|
|||
|
|
node.UpdateVisible()
|
|||
|
|
|
|||
|
|
'更新节点参与编译
|
|||
|
|
node.UpdateCompile()
|
|||
|
|
|
|||
|
|
'更新节点可见节点数
|
|||
|
|
' If _owner.Expanded Then _owner.UpdateVisibleCount(1 + node.VisibleNodesCount)
|
|||
|
|
If node.Visible Then _owner.UpdateVisibleCount(1 + node.VisibleNodesCount)
|
|||
|
|
|
|||
|
|
'更新父节点总子节点计数
|
|||
|
|
AddNodeUpdateAllChildCount(node)
|
|||
|
|
|
|||
|
|
'更新上一节点指向
|
|||
|
|
AddNodeUpdatePrevNode(node)
|
|||
|
|
|
|||
|
|
'更新下一节点指向
|
|||
|
|
node.NextNode = Nothing
|
|||
|
|
|
|||
|
|
'将节点及其子节点插入到链状目录中,并更新链状目指向
|
|||
|
|
AddNodeUpdateRowList(_owner, node)
|
|||
|
|
|
|||
|
|
'更新下方节点链状索引
|
|||
|
|
AddNodeUpdateRowListIndex(node)
|
|||
|
|
|
|||
|
|
Return nodes.Count
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
|
|||
|
|
Public Sub Insert(index As Integer, value As Object) Implements IList.Insert
|
|||
|
|
Dim node As RowNode = CType(value, RowNode)
|
|||
|
|
nodes.Insert(index, node)
|
|||
|
|
node.HeadNode = _owner.HeadNode
|
|||
|
|
node.ParentNode = _owner
|
|||
|
|
node.Lever = _owner.Lever + 1
|
|||
|
|
node.Index = index
|
|||
|
|
node.RowList = _owner.RowList
|
|||
|
|
node.Visible = _owner.Visible And _owner.Expanded
|
|||
|
|
'node.Compile = _owner.Compile AndAlso node.Action
|
|||
|
|
|
|||
|
|
'更新节点可见属性
|
|||
|
|
node.UpdateVisible()
|
|||
|
|
|
|||
|
|
'更新节点参与编译
|
|||
|
|
node.UpdateCompile()
|
|||
|
|
|
|||
|
|
'更新节点可见节点数
|
|||
|
|
'If _owner.Expanded Then _owner.UpdateVisibleCount(1 + node.VisibleNodesCount)
|
|||
|
|
If node.Visible Then _owner.UpdateVisibleCount(1 + node.VisibleNodesCount)
|
|||
|
|
|
|||
|
|
'更新父节点总子节点计数
|
|||
|
|
AddNodeUpdateAllChildCount(node)
|
|||
|
|
|
|||
|
|
'更新上一节点指向
|
|||
|
|
AddNodeUpdatePrevNode(node)
|
|||
|
|
|
|||
|
|
'更新下一节点指向
|
|||
|
|
AddNodeUpdateNextNode(node)
|
|||
|
|
|
|||
|
|
'更新下方节点树状索引
|
|||
|
|
AddNodeUpdateRowIndex(node)
|
|||
|
|
|
|||
|
|
'将节点及其子节点插入到链状目录中,并更新链状目指向
|
|||
|
|
AddNodeUpdateRowList(_owner, node)
|
|||
|
|
|
|||
|
|
'更新下方节点链状索引
|
|||
|
|
AddNodeUpdateRowListIndex(node)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 移除指定节点
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="value"></param>
|
|||
|
|
Public Sub Remove(value As Object) Implements IList.Remove
|
|||
|
|
Dim node As RowNode = CType(value, RowNode)
|
|||
|
|
nodes.Remove(node)
|
|||
|
|
|
|||
|
|
_owner.UpdateVisibleCount(0 - (1 + node.VisibleNodesCount))
|
|||
|
|
|
|||
|
|
'更新父节点总子节点计数
|
|||
|
|
DelNodeUpdateAllChildCount(node)
|
|||
|
|
|
|||
|
|
'更新上一节点的下一节点指向
|
|||
|
|
If node.PrevNode IsNot Nothing Then
|
|||
|
|
node.PrevNode.NextNode = node.NextNode
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
'更新下一节点的上一节点指向
|
|||
|
|
If node.NextNode IsNot Nothing Then
|
|||
|
|
node.NextNode.PrevNode = node.PrevNode
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
'更新下方节点树状索引
|
|||
|
|
DelNodeUpdateRowIndex(node)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
'链状目录移除被删除的节点
|
|||
|
|
DelNodeUpdateRowList(node)
|
|||
|
|
|
|||
|
|
'更新链状目录中的节点索引
|
|||
|
|
DelNodeUpdateRowListIndex(node)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public Sub RemoveAt(index As Integer) Implements IList.RemoveAt
|
|||
|
|
Dim node As RowNode = nodes(index)
|
|||
|
|
nodes.RemoveAt(index)
|
|||
|
|
|
|||
|
|
_owner.UpdateVisibleCount(0 - (1 + node.VisibleNodesCount))
|
|||
|
|
|
|||
|
|
'更新父节点总子节点计数
|
|||
|
|
DelNodeUpdateAllChildCount(node)
|
|||
|
|
|
|||
|
|
'更新上一节点的下一节点指向
|
|||
|
|
If node.PrevNode IsNot Nothing Then
|
|||
|
|
node.PrevNode.NextNode = node.NextNode
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
'更新下一节点的上一节点指向
|
|||
|
|
If node.NextNode IsNot Nothing Then
|
|||
|
|
node.NextNode.PrevNode = node.PrevNode
|
|||
|
|
End If
|
|||
|
|
|
|||
|
|
'更新下方节点树状索引
|
|||
|
|
DelNodeUpdateRowIndex(node)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
'链状目录移除被删除的节点
|
|||
|
|
DelNodeUpdateRowList(node)
|
|||
|
|
|
|||
|
|
'更新链状目录中的节点索引
|
|||
|
|
DelNodeUpdateRowListIndex(node)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 清空节点
|
|||
|
|
''' </summary>
|
|||
|
|
Public Sub Clear() Implements IList.Clear
|
|||
|
|
_owner.UpdateVisibleCount(0 - _owner.VisibleNodesCount)
|
|||
|
|
|
|||
|
|
'清空树状目录子节点
|
|||
|
|
nodes.Clear()
|
|||
|
|
|
|||
|
|
'更新父节点总子节点计数
|
|||
|
|
DelNodeUpdateAllChildCount(_owner, False)
|
|||
|
|
|
|||
|
|
'链状目录移除被删除的节点
|
|||
|
|
DelNodeUpdateRowList(_owner, False)
|
|||
|
|
|
|||
|
|
'更新链状目录中的节点索引
|
|||
|
|
DelNodeUpdateRowListIndex(_owner, False)
|
|||
|
|
|
|||
|
|
'更新总子节点计数
|
|||
|
|
_owner.AllChildCount = 0
|
|||
|
|
End Sub
|
|||
|
|
Public Sub CopyTo(array As Array, index As Integer) Implements ICollection.CopyTo
|
|||
|
|
nodes.CopyTo(CType(array, RowNode()), index)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public Function Contains(value As Object) As Boolean Implements IList.Contains
|
|||
|
|
Return nodes.Contains(CType(value, RowNode))
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
Public Function IndexOf(value As Object) As Integer Implements IList.IndexOf
|
|||
|
|
Return nodes.IndexOf(CType(value, RowNode))
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
|
|||
|
|
Return nodes.GetEnumerator
|
|||
|
|
End Function
|
|||
|
|
End Class
|