Files

226 lines
5.7 KiB
VB.net
Raw Permalink Normal View History

2025-12-11 14:22:51 +08:00
Option Explicit On
Public Class Nodes
#Region "公共变量"
Private mobjNodes As Collection
Private mOwner As Node
Private mobjFirstNode As Node
Private mobjLastNode As Node
Private mintKey As Integer
#End Region
#Region "Public属性"
Public ReadOnly Property FirstNode() As Node
Get
Return mobjFirstNode
End Get
End Property
Public ReadOnly Property LastNode() As Node
Get
Return mobjLastNode
End Get
End Property
Default Public ReadOnly Property Item(ByVal Key As Object) As Node
Get
On Error Resume Next
Item = mobjNodes.Item(Key)
If Err.Number <> 0 Then
Return Nothing
End If
End Get
End Property
#End Region
#Region "Public方法"
Public Sub New(ByVal Owner As Node)
mobjNodes = New Collection
mOwner = Owner
End Sub
Public Sub Dispose()
Me.Dispose(True)
End Sub
Public Function Add() As Node
Return Add("", "")
End Function
Public Function Add(ByVal Text As String) As Node
Return Add(Text, "")
End Function
Public Function Add(ByVal Text As String, ByVal Tag As String) As Node
mintKey = mintKey + 1
Dim objNode As New Node("N" & mintKey, Text, Tag, mOwner.Level + 1, mOwner)
If mobjNodes.Count = 0 Then
mobjFirstNode = objNode
mobjLastNode = objNode
Else
mobjLastNode.NextNode = objNode
objNode.PrevNode = mobjLastNode
mobjLastNode = objNode
End If
mobjNodes.Add(objNode, objNode.Key)
mOwner.UpdateChindrenCount(1)
If mOwner.Expanded Then
mOwner.UpdateVisibleNodesCount(1)
End If
Return objNode
End Function
Public Sub Add(ByVal Count As Integer)
Dim i As Integer
For i = 1 To Count
Call Add()
Next
End Sub
Public Sub Clear()
Dim i As Integer
Dim objNode As Node
If mobjNodes Is Nothing Then
Return
End If
If mobjNodes.Count = 0 Then
Return
End If
mOwner.UpdateChindrenCount(-mobjNodes.Count)
If mOwner.Expanded Then
mOwner.UpdateVisibleNodesCount(-mobjNodes.Count)
End If
mobjLastNode = Nothing
mobjFirstNode = Nothing
For i = mobjNodes.Count To 1 Step -1
objNode = mobjNodes.Item(i)
If objNode.HasChildren Then
objNode.Nodes.Clear()
End If
mobjNodes.Remove(i)
Next
End Sub
Public Function Count() As Integer
Return mobjNodes.Count
End Function
Public Function InsertBefore(ByVal Key As String, ByVal Text As String, ByVal Tag As String) As Node
'在指定Key的前面插入一个新的节点
mintKey = mintKey + 1
Dim objNode1 As Node = mobjNodes.Item(Key)
Dim objNode2 As Node = objNode1.PrevNode
Dim objNode As New Node("N" & mintKey, Text, Tag, mOwner.Level + 1, mOwner)
objNode.NextNode = objNode1
objNode.PrevNode = objNode2
objNode1.PrevNode = objNode
If Not objNode2 Is Nothing Then
objNode2.NextNode = objNode
Else
mobjFirstNode = objNode
End If
mobjNodes.Add(objNode, objNode.Key)
mOwner.UpdateChindrenCount(1)
If mOwner.Expanded Then
mOwner.UpdateVisibleNodesCount(1)
End If
Return objNode
End Function
Public Function InsertAfter(ByVal Key As String, ByVal Text As String, ByVal Tag As String) As Node
'在指定Key的后面插入一个新的节点
mintKey = mintKey + 1
Dim objNode1 As Node = mobjNodes.Item(Key)
Dim objNode2 As Node = objNode1.NextNode
Dim objNode As New Node("N" & mintKey, Text, Tag, mOwner.Level + 1, mOwner)
objNode.PrevNode = objNode1
objNode.NextNode = objNode2
objNode1.NextNode = objNode
If Not objNode2 Is Nothing Then
objNode2.PrevNode = objNode
Else
mobjLastNode = objNode
End If
mobjNodes.Add(objNode, objNode.Key)
mOwner.UpdateChindrenCount(1)
If mOwner.Expanded Then
mOwner.UpdateVisibleNodesCount(1)
End If
Return objNode
End Function
Public Sub Remove(ByVal Key As Object)
Dim objNode As Node
objNode = mobjNodes.Item(Key)
If mobjNodes.Count <= 1 Then
mobjFirstNode = Nothing
mobjLastNode = Nothing
Else
If objNode.PrevNode Is Nothing Then 'FirstNode
mobjFirstNode = objNode.NextNode
mobjFirstNode.PrevNode = Nothing
Else
objNode.PrevNode.NextNode = objNode.NextNode
End If
If objNode.NextNode Is Nothing Then 'LastNode
mobjLastNode = objNode.PrevNode
mobjLastNode.NextNode = Nothing
Else
objNode.NextNode.PrevNode = objNode.PrevNode
End If
End If
If objNode.HasChildren Then
objNode.Nodes.Clear()
End If
mobjNodes.Remove(Key)
mOwner.UpdateChindrenCount(-1)
If mOwner.Expanded Then
mOwner.UpdateVisibleNodesCount(-1)
End If
End Sub
#End Region
#Region "其它"
Protected Overrides Sub Finalize()
Try
Me.Dispose(False)
Finally
MyBase.Finalize()
End Try
End Sub
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
Clear()
mobjNodes = Nothing
If disposing Then
GC.SuppressFinalize(Me)
End If
End Sub
#End Region
End Class