Files
Desktop_BLVStudio/BLV_Studio/ModelGrid/RowNode.vb

730 lines
16 KiB
VB.net
Raw Normal View History

2025-12-11 10:06:44 +08:00
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