226 lines
5.7 KiB
VB.net
226 lines
5.7 KiB
VB.net
|
|
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
|