Files
Desktop_BLVStudio/BLV_Studio/ModelGrid/RowNode.vb
2025-12-11 10:06:44 +08:00

730 lines
16 KiB
VB.net
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Public NotInheritable Class RowNode
''' <summary>可见节点总数 </summary>
Friend _visibleCount As Integer
''' <summary>节点等级 </summary>
Private _lever As Integer
''' <summary>动作是否执行 </summary>
Private _action As Boolean
Public Sub New()
RowType = RowTypeEnum.DeviceEventAction
_action = True
Compile = True
DeviceAlias = String.Empty
Description = String.Empty
DelayTime = "0"
DelayUnit = "ms"
Params = New List(Of AttributeRowNodeTag)
Expanded = True
Visible = True
AllChildCount = 0
_lever = 0
_visibleCount = 0
Nodes = New RowNodes(Me)
RowListIndex = 0
RowList = New List(Of RowNode)()
RowList.Add(Me)
End Sub
#Region "节点特有属性"
''' <summary>
''' 事件编号
''' </summary>
''' <returns></returns>
Public Property eventId As String
''' <summary>
''' 节点类型
''' </summary>
''' <returns></returns>
Public Property RowType As RowTypeEnum
''' <summary>
''' 节点名称
''' </summary>
''' <returns></returns>
Public Property Name As String
''' <summary>
''' 节点接口属性,从XML读出来仅对设备对象有效
''' </summary>
''' <returns></returns>
Public Property [Interface] As String
''' <summary>
''' 节点显示文本
''' </summary>
''' <returns></returns>
Public Property Text As String
''' <summary>
''' 节点描述
''' </summary>
''' <returns></returns>
Public Property Description As String
''' <summary>
''' 设备别名
''' </summary>
''' <returns></returns>
Public Property DeviceAlias As String
''' <summary>
''' 设备是否具有别名
''' </summary>
''' <returns></returns>
Public Property HasAlias As Boolean
''' <summary>
''' 设备类型
''' </summary>
''' <returns></returns>
Public Property DeviceType As String
''' <summary>
''' 设备名称
''' </summary>
''' <returns></returns>
Public Property DeviceName As String
''' <summary>
''' 设备方法
''' </summary>
''' <returns></returns>
Public Property DeviceMothed As String
''' <summary>
''' 延时时间
''' </summary>
''' <returns></returns>
Public Property DelayTime As String
''' <summary>
''' DEV_TYPE_DATA
''' </summary>
''' <returns></returns>
Public Property DEV_TYPE_DATA As String
''' <summary>
''' PROTOCOL_VER
''' </summary>
''' <returns></returns>
Public Property PROTOCOL_VER As String
Public Enum CfgTypeEnum
''' <summary>
''' 0.默认类型
''' </summary>
CfgType_Default
''' <summary>
''' 1.小宝命令集
''' </summary>
CfgType_XiaoBaoCMD
''' <summary>
''' 2.设备存在
''' </summary>
CfgType_DeviceExists
End Enum
Public Enum RowTypeEnum
''' <summary>
''' 0.根节点
''' </summary>
RootNode
''' <summary>
''' 1.酒店组
''' </summary>
HotelGroup
''' <summary>
''' 2.酒店项目
''' </summary>
Hotel
''' <summary>
''' 3.酒店户型
''' </summary>
HotelRoomType
''' <summary>
''' 4.主机模型
''' </summary>
Model
''' <summary>
''' 5.主机模型属性集
''' </summary>
ModelAttributes
''' <summary>
''' 6.主机模型属性分组
''' </summary>
ModelAttributeGroup
''' <summary>
''' 7.主机模型属性
''' </summary>
ModelAttribute
''' <summary>
''' 8.模型外设组
''' </summary>
DeviceGroup
''' <summary>
''' 9.模型外设对象
''' </summary>
DeviceObject
''' <summary>
''' 10.模型外设属性组
''' </summary>
DeviceAttributes
''' <summary>
''' 11.模型外设方法组
''' </summary>
DeviceMothods
''' <summary>
''' 12.模型外设事件组
''' </summary>
DeviceEvents
''' <summary>
''' 13.模型外设属性
''' </summary>
DeviceAttribute
''' <summary>
''' 14.模型外设方法
''' </summary>
DeviceMothod
''' <summary>
''' 15.模型外设事件
''' </summary>
DeviceEvent
''' <summary>
''' 16.模型外设事件动作执行方式组
''' </summary>
DeviceEventActionModeGroup
''' <summary>
''' 17.模型外设事件动作执行方式
''' </summary>
DeviceEventActionMode
''' <summary>
''' 18.模型外设事件条件
''' </summary>
DeviceEventConditionItem
''' <summary>
''' 19.模型外设事件条件
''' </summary>
DeviceEventAllConditions
''' <summary>
''' 20.条件组节点
''' </summary>
DeviceEventConditions
''' <summary>
''' 21.模型外设事件执行动作组集合
''' </summary>
DeviceEventAllActions
''' <summary>
''' 22.模型外设事件执行动作组
''' </summary>
DeviceEventActions
''' <summary>
''' 23.模型外设事件执行动作
''' </summary>
DeviceEventAction
''' <summary>
''' 24.情景模式组
''' </summary>
ContextualModels
''' <summary>
''' 25.情景模式
''' </summary>
ContextualModel
''' <summary>
''' 26.外设模型
''' </summary>
ExternalModel
''' <summary>
''' 27.属性集 = XiaoBaoCMD
''' </summary>
ModelAttributes_XiaoBaoCMD
''' <summary>
''' 28.属性 = XiaoBaoCMD
''' </summary>
ModelAttribute_XiaoBaoCMD
''' <summary>
''' 29.属性集 = 设备存在
''' </summary>
ModelAttributes_DeviceExists
''' <summary>
''' 30.属性 = 设备存在
''' </summary>
ModelAttribute_DeviceExists
End Enum
''' <summary>
''' 延时单位
''' </summary>
''' <returns></returns>
Public Property DelayUnit As String
''' <summary>
''' 动作执行参数
''' </summary>
Public Params As List(Of AttributeRowNodeTag)
''' <summary>
''' 动作是否执行,仅代表表格上的勾选状态参与编译属性参考Compile属性
''' </summary>
''' <returns></returns>
Public Property Action As Boolean
Get
Return _action
End Get
Set(value As Boolean)
_action = value
UpdateCompile()
End Set
End Property
''' <summary>
''' 动作是否参与编译
''' </summary>
''' <returns></returns>
Public Property Compile As Boolean
''' <summary>
''' 节点标签
''' </summary>
''' <returns></returns>
Public Property Tag As Object
#End Region
#Region "节点公共属性"
''' <summary>
''' 节点是否处于展开状态
''' </summary>
''' <returns></returns>
Public Property Expanded() As Boolean
''' <summary>
''' 节点是否处于可见状态
''' </summary>
''' <returns></returns>
Public Property Visible() As Boolean
''' <summary>
''' 节点的级别,可见节点级别从0开始
''' </summary>
''' <returns></returns>
Public Property Lever As Integer
Get
Return _lever
End Get
Set(value As Integer)
_lever = value
For Each node As RowNode In Nodes
node.Lever = _lever + 1
Next
End Set
End Property
''' <summary>
''' 节点在父节点中的索引,可见节点级别从0开始
''' </summary>
''' <returns></returns>
Public Property Index As Integer
''' <summary>
''' 下一级子节点总数
''' </summary>
''' <returns></returns>
Public ReadOnly Property Count() As Integer
Get
Return Nodes.Count
End Get
End Property
''' <summary>
''' 所有子节点中,可见子节点总数
''' </summary>
''' <returns></returns>
Public ReadOnly Property VisibleNodesCount() As Integer
Get
Return _visibleCount
End Get
End Property
''' <summary>
''' 所有子节点总数
''' </summary>
''' <returns></returns>
Public Property AllChildCount() As Integer
''' <summary>
''' 当前节点树的起始节点
''' </summary>
''' <returns></returns>
Public Property HeadNode() As RowNode
''' <summary>
''' 当前节点的父节点
''' </summary>
''' <returns></returns>
Public Property ParentNode() As RowNode
''' <summary>
''' 当前节点的同级上一节点若当前节点为首节点则返回nothing
''' </summary>
''' <returns></returns>
Public Property PrevNode() As RowNode
''' <summary>
''' 当前节点的同级下一节点若当前节点为尾节点则返回nothing
''' </summary>
''' <returns></returns>
Public Property NextNode() As RowNode
''' <summary>
''' 节点所属节点数组的位置,从0开始即头结点的的索引
''' </summary>
''' <returns></returns>
Public Property RowListIndex As Integer
''' <summary>
''' 节点树的所有节点集合
''' </summary>
''' <returns></returns>
Public Property RowList As List(Of RowNode)
''' <summary>
''' 子节点集合
''' </summary>
''' <returns></returns>
Public Property Nodes As RowNodes
#End Region
#Region "节点操作"
''' <summary>
''' 更新节点参与编译属性
''' </summary>
Friend Sub UpdateCompile()
If ParentNode Is Nothing Then
Compile = Action
Else
Compile = Action AndAlso ParentNode.Compile
End If
For Each node As RowNode In Nodes
node.Compile = Action AndAlso node.ParentNode.Compile
node.UpdateCompile()
Next
End Sub
''' <summary>
''' 获取所有子节点
''' </summary>
Friend Function GetAllChildsNodeList(argRowNode As RowNode, ByVal lstChildNodeList As List(Of RowNode)) As Boolean
If argRowNode.Nodes.Count < 1 Then Return False
'将指定节点的所有子节点平铺加入到lstChildNodeList列表中
For Each tmpNode As RowNode In argRowNode.Nodes
lstChildNodeList.Add(tmpNode)
'如有子节点则递归调用,直到子节点数量为零(没有子节点)
If tmpNode.Nodes.Count > 0 Then GetAllChildsNodeList(tmpNode, lstChildNodeList)
Next
Return True
End Function
''' <summary>
''' 更新可见子节点总数
''' </summary>
''' <param name="count"></param>
Friend Sub UpdateVisibleCount(count As Integer)
_visibleCount += count
If ParentNode IsNot Nothing Then ParentNode.UpdateVisibleCount(count)
End Sub
''' <summary>
''' 更新子节点可见
''' </summary>
Friend Sub UpdateVisible(Optional isForceSetVisible As Boolean = False,
Optional isVisible As Boolean = True)
For Each node As RowNode In Nodes
'Momo 0416 增加强制参数某些情况下通过传参强制设定visible状态
If isForceSetVisible = True Then
node.Visible = isVisible
Else
node.Visible = Expanded AndAlso Visible
End If
node.UpdateVisible()
Next
End Sub
''' <summary>
''' 展开节点
''' </summary>
Public Sub Expand()
If Expanded Then Return
Expanded = True
Dim num As Integer
For Each node As RowNode In Nodes
num += node.VisibleNodesCount + 1
Next
UpdateVisibleCount(num)
'更新子节点是否可见
UpdateVisible()
End Sub
''' <summary>
''' 展开所有节点包括子节点
''' </summary>
Public Sub ExpandAll()
Expand()
'展开所有节点
For Each node As RowNode In Nodes
node.ExpandAll()
'展开的同时,设置属性为可见
node.Visible = True
Next
End Sub
''' <summary>
''' 折叠节点
''' </summary>
Public Sub Collapse()
If Expanded = False Then Return
Expanded = False
'更新可见总数
Dim num As Integer
For Each node As RowNode In Nodes
num += node.VisibleNodesCount + 1
Next
UpdateVisibleCount(0 - num)
'更新子节点是否可见
UpdateVisible()
End Sub
''' <summary>
''' 收缩所有节点包括子节点
''' </summary>
Public Sub CollapseAll()
Collapse()
'收缩所有节点
For Each node As RowNode In Nodes
node.CollapseAll()
Next
End Sub
''' <summary>
''' 展开或折叠节点
''' </summary>
Public Sub Toggle()
If Expanded Then
Collapse()
Else
Expand()
End If
End Sub
''' <summary>
''' 增加子节点
''' </summary>
Public Sub AddNode(node As RowNode)
Nodes.Add(node)
End Sub
''' <summary>
''' 插入子节点
''' </summary>
Public Sub InsertNode(index As Integer, childNode As RowNode)
Nodes.Insert(index, childNode)
End Sub
Public Sub RemoveChildNode(childNode As RowNode)
Nodes.Remove(childNode)
End Sub
Public Sub RemoveChildAt(index As Integer)
If index >= Nodes.Count Then Return
Dim child As RowNode = CType(Nodes.Item(index), RowNode)
Nodes.RemoveAt(index)
End Sub
''' <summary>
''' 移除本身节点
''' </summary>
Public Function Remove() As Boolean
ParentNode.Nodes.Remove(Me)
Return True
End Function
''' <summary>
''' 清空节点所有子节点
''' </summary>
Public Sub Clear()
Nodes.Clear()
End Sub
''' <summary>
''' 节点上移
''' </summary>
Public Sub MoveUp()
If Index = 0 Then Return
If Remove() = False Then Return
ParentNode.Nodes.Insert(Index - 1, Me)
End Sub
''' <summary>
''' 节点下移
''' </summary>
Public Sub MoveDown()
If Index = ParentNode.Nodes.Count - 1 Then Return
If Remove() = False Then Return
ParentNode.Nodes.Insert(Index + 1, Me)
End Sub
''' <summary>
''' 节点左移
''' </summary>
Public Sub MoveLeft()
If _lever = 0 Then Return
If Remove() = False Then Return
ParentNode.ParentNode.Nodes.Insert(ParentNode.Index + 1, Me)
'更新节点可见与可见子节点数
End Sub
''' <summary>
''' 节点右移
''' </summary>
Public Sub MoveRight()
If Index = 0 Then Return
If Remove() = False Then Return
Dim rNode As RowNode = CType(ParentNode.Nodes(Index - 1), RowNode)
rNode.Nodes.Add(Me)
'更新节点可见与可见子节点数
End Sub
'''' <summary>
'''' 交换两个节点信息 err
'''' </summary>
'''' <returns></returns>
'Public Function Exchange(ByRef argRowNode1 As RowNode,
' ByRef argRowNode2 As RowNode,
' ByRef argErrMsg As String) As Boolean
' Try
' If argRowNode1.RowType <> argRowNode2.RowType Then
' argErrMsg = "两个节点类型不同,不可进行交换!"
' Return False
' End If
' Dim tmpNode As RowNode = argRowNode1
' argRowNode1 = argRowNode2
' argRowNode2 = tmpNode
' Catch ex As Exception
' argErrMsg = ex.Message.ToString
' Return False
' End Try
' Return True
'End Function
''' <summary>
''' 节点深复制,创建一个完全相同信息的节点(功能待测试)
''' </summary>
''' <returns></returns>
Public Function Clone() As RowNode
Dim cpNode As New RowNode
With cpNode
.RowType = RowType
.Action = Action
.Nodes = New RowNodes(cpNode)
'todo:克隆功能待重写
End With
Return cpNode
End Function
#End Region
#Region "节点类型"
#End Region
End Class