79 lines
1.8 KiB
OpenEdge ABL
79 lines
1.8 KiB
OpenEdge ABL
VERSION 1.0 CLASS
|
|
BEGIN
|
|
MultiUse = -1 'True
|
|
END
|
|
Attribute VB_Name = "CDS_StaticHierarchy"
|
|
Attribute VB_GlobalNameSpace = False
|
|
Attribute VB_Creatable = False
|
|
Attribute VB_PredeclaredId = False
|
|
Attribute VB_Exposed = False
|
|
' ================= Static hierarchy =======================
|
|
' Shared module version: 20210518
|
|
' Tested in: TestCommons
|
|
' Depends on: CDS_NodeSH
|
|
' Required reference: Scripting
|
|
' =========
|
|
' Example of valid structure
|
|
' 1
|
|
' 1.1
|
|
' 1.2
|
|
' 1.2.1
|
|
' 1.2.1.1
|
|
' 1.3
|
|
' 2
|
|
' 0
|
|
' ======
|
|
' Example of invalid structure ( increase level > 1 )
|
|
' 1
|
|
' 1.1.3
|
|
Option Explicit
|
|
|
|
Public nodes_ As Collection
|
|
|
|
Private levels_ As Scripting.Dictionary
|
|
Private previousRank_ As Long
|
|
|
|
Private Sub Class_Initialize()
|
|
Set nodes_ = New Collection
|
|
Set levels_ = New Scripting.Dictionary
|
|
previousRank_ = -1
|
|
End Sub
|
|
|
|
Public Property Get MaxDepth() As Long
|
|
MaxDepth = levels_.Count
|
|
End Property
|
|
|
|
Public Property Get Size() As Long
|
|
Size = nodes_.Count
|
|
End Property
|
|
|
|
' Requires nRank <= previousLevel + 1
|
|
Public Function PushItem(nRank&) As CDS_NodeSH
|
|
If nodes_.Count > 0 Then
|
|
If previousRank_ < nRank Then _
|
|
If previousRank_ <> nRank - 1 Then _
|
|
Exit Function
|
|
End If
|
|
|
|
Dim iNewNode As New CDS_NodeSH: Call iNewNode.Init(nodes_.Count + 1, nRank)
|
|
Set levels_(nRank) = iNewNode
|
|
previousRank_ = nRank
|
|
If levels_.Exists(nRank - 1) Then
|
|
Set iNewNode.parent_ = levels_(nRank - 1)
|
|
Call levels_(nRank - 1).children_.Add(iNewNode)
|
|
Call IncrementDescendants(nRank - 1)
|
|
End If
|
|
|
|
Call nodes_.Add(iNewNode)
|
|
Set PushItem = iNewNode
|
|
End Function
|
|
|
|
' =======
|
|
Private Function IncrementDescendants(nTarget&)
|
|
Dim nRank As Variant
|
|
For Each nRank In levels_
|
|
If nRank <= nTarget Then _
|
|
levels_(nRank).descendantsCount_ = levels_(nRank).descendantsCount_ + 1
|
|
Next nRank
|
|
End Function
|