1038 lines
35 KiB
VB.net
1038 lines
35 KiB
VB.net
Imports UTS_Core.Undo
|
||
Imports UTS_Core.UTSModule
|
||
Imports UTS_Core.UTSModule.Station
|
||
|
||
|
||
Public Class FrmStationPlan
|
||
|
||
#Region "初始化"
|
||
Public Property StationPlanCommand() As StationPlanCommandHelpers
|
||
|
||
Public Property StationPlanColHelpers() As Dictionary(Of String, PlanColHelper)
|
||
|
||
Property StationPlan() As StationPlan
|
||
|
||
Private Property SelectRowNode() As RowNode
|
||
|
||
Private Property SelectNode() As TreeNode
|
||
|
||
Private Property LastSelectNode() As TreeNode
|
||
|
||
Private _stationPlanUploading As Boolean
|
||
|
||
''' <summary>
|
||
''' 显示窗体
|
||
''' </summary>
|
||
''' <param name="parentControl"></param>
|
||
Public Sub ShowForm(parentControl As Control)
|
||
FormBorderStyle = FormBorderStyle.None
|
||
TopLevel = False
|
||
Dock = DockStyle.Fill
|
||
Parent = parentControl
|
||
Enabled = StationPlan IsNot Nothing
|
||
|
||
Show()
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 测试站修改时处理函数
|
||
''' </summary>
|
||
''' <param name="processStation"></param>
|
||
Public Sub Station_Changed(processStation As ProcessStation)
|
||
StationPlan = processStation.Packet.StationPlan
|
||
|
||
Enabled = StationPlan IsNot Nothing
|
||
|
||
If StationPlan IsNot Nothing Then
|
||
GrpStationPlan.Controls.Clear()
|
||
GrpStationPlan.Controls.Add(StationPlan.TreeView)
|
||
|
||
_stationPlanUploading = True '设置更新状态,避免触发树内容变更事件
|
||
|
||
InitializeTreeView(StationPlan.TreeView) '初始化树
|
||
StationPlan.UpdateTreeViewStyle() '更新树样式
|
||
|
||
_stationPlanUploading = False
|
||
End If
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 初始化站命令帮助信息
|
||
''' </summary>
|
||
Private Sub InitStationPlanCommandHelper()
|
||
Try
|
||
StationPlanCommand = New StationPlanCommandHelpers()
|
||
StationPlanCommand.InitCommandHelper(UtsDb.LocalDbType, UtsDb.LocalConnString)
|
||
Catch ex As Exception
|
||
Console.WriteLine($"InitStationPlanCommandHelper Error:{ex.Message}")
|
||
End Try
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 初始化站流程帮助信息
|
||
''' </summary>
|
||
Private Sub InitStationPlanColHelper()
|
||
Try
|
||
StationPlanColHelpers = PlanColHelper.InitPlanColHelper(UtsDb.LocalDbType, UtsDb.LocalConnString)
|
||
Catch ex As Exception
|
||
Console.WriteLine($"InitStationPlanColHelper Error:{ex.Message}")
|
||
End Try
|
||
|
||
If StationPlanColHelpers Is Nothing Then
|
||
StationPlanColHelpers = New Dictionary(Of String, PlanColHelper)()
|
||
End If
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 初始化行节点的风格
|
||
''' </summary>
|
||
Private Sub InitRowNodeStyles()
|
||
If IO.File.Exists(UtsPath.NodeStylePath()) Then
|
||
RowNode.LoadNodeStyles(UtsPath.NodeStylePath())
|
||
Else
|
||
RowNode.InitNodeStyles()
|
||
End If
|
||
End Sub
|
||
|
||
|
||
|
||
Private Sub FrmStationPlan_Load(sender As Object, e As EventArgs) Handles Me.Load
|
||
|
||
InitStationPlanCommandHelper()
|
||
|
||
InitStationPlanColHelper()
|
||
|
||
InitRowNodeStyles()
|
||
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 根据节点找寻节点关联的行节点信息
|
||
''' </summary>
|
||
''' <param name="node"></param>
|
||
''' <returns></returns>
|
||
Private Function FindRowInfo(node As TreeNode) As RowNode
|
||
Return CType(node.Tag, RowNode)
|
||
End Function
|
||
|
||
|
||
Private Sub InitializeTreeView(tree As TreeView)
|
||
With tree
|
||
.Dock = DockStyle.Fill
|
||
.AllowDrop = True '允许拖拽
|
||
.ShowLines = True '显示线条
|
||
.CheckBoxes = True '显示选择框
|
||
.ShowNodeToolTips = False '不显示节点的ToolTip
|
||
.HotTracking = True '移动反显
|
||
.ItemHeight = 20 '行高
|
||
.BorderStyle = BorderStyle.None
|
||
.ContextMenuStrip = CmsMain
|
||
|
||
RemoveHandler .ItemDrag, AddressOf TvwStationPlan_ItemDrag
|
||
RemoveHandler .DragEnter, AddressOf TvwStationPlan_DragEnter
|
||
RemoveHandler .DragDrop, AddressOf TvwStationPlan_DragDrop
|
||
RemoveHandler .DragOver, AddressOf TvwStationPlan_DragOver
|
||
RemoveHandler .AfterSelect, AddressOf TvwStationPlan_AfterSelect
|
||
RemoveHandler .AfterCheck, AddressOf TvwStationPlan_AfterCheck
|
||
' RemoveHandler .KeyDown, AddressOf TvwStationPlan_KeyDown
|
||
|
||
|
||
AddHandler .ItemDrag, AddressOf TvwStationPlan_ItemDrag
|
||
AddHandler .DragEnter, AddressOf TvwStationPlan_DragEnter
|
||
AddHandler .DragDrop, AddressOf TvwStationPlan_DragDrop
|
||
AddHandler .DragOver, AddressOf TvwStationPlan_DragOver
|
||
AddHandler .AfterSelect, AddressOf TvwStationPlan_AfterSelect
|
||
AddHandler .AfterCheck, AddressOf TvwStationPlan_AfterCheck
|
||
' AddHandler .KeyDown, AddressOf TvwStationPlan_KeyDown
|
||
End With
|
||
End Sub
|
||
|
||
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
|
||
RowNodeGrid.InitializeGrid(GrdRowNode)
|
||
End Sub
|
||
#End Region
|
||
|
||
#Region "节点拖拽"
|
||
|
||
''' <summary>
|
||
''' 开始拖拽子节点
|
||
''' </summary>
|
||
''' <param name="sender"></param>
|
||
''' <param name="e"></param>
|
||
Private Sub TvwStationPlan_ItemDrag(sender As Object, e As ItemDragEventArgs)
|
||
Dim srcNode As TreeNode = CType(e.Item, TreeNode)
|
||
Dim parentRowNode As RowNode = FindRowInfo(srcNode)
|
||
If parentRowNode.CanChangeLever = False Then Return
|
||
DoDragDrop(e.Item, DragDropEffects.Move)
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 拖拽进入控件
|
||
''' </summary>
|
||
''' <param name="sender"></param>
|
||
''' <param name="e"></param>
|
||
Private Sub TvwStationPlan_DragEnter(sender As Object, e As DragEventArgs)
|
||
e.Effect = DragDropEffects.Move
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 拖拽松开鼠标
|
||
''' </summary>
|
||
''' <param name="sender"></param>
|
||
''' <param name="e"></param>
|
||
Private Sub TvwStationPlan_DragDrop(sender As Object, e As DragEventArgs)
|
||
'得到拖放数据,并转换为TreeNode型
|
||
Dim srcNode As TreeNode = CType(e.Data.GetData(GetType(TreeNode)), TreeNode)
|
||
Dim parentRowNode As RowNode = FindRowInfo(srcNode)
|
||
|
||
Dim tvwDest As TreeView = CType(sender, TreeView)
|
||
Dim destNode As TreeNode = tvwDest.GetNodeAt(tvwDest.PointToClient(New Point(e.X, e.Y))) '获取拖拽所到的节点
|
||
Dim childRowNode As RowNode = FindRowInfo(destNode)
|
||
|
||
If IsNothing(destNode) Then Return '未获取到节点
|
||
If destNode.Equals(srcNode) Then Return '节点未移动
|
||
|
||
Dim pNode As TreeNode = destNode.Parent
|
||
While pNode IsNot Nothing
|
||
If pNode.Equals(srcNode) Then Return '移动至本身的子节点
|
||
pNode = pNode.Parent
|
||
End While
|
||
|
||
|
||
If parentRowNode.RowLever <> childRowNode.ParentNode.RowLever Then
|
||
If parentRowNode.CanChangeLever = False Then Return '不允许节点移动
|
||
End If
|
||
|
||
DeleteNode(srcNode)
|
||
InsertNode(childRowNode.ParentNode, parentRowNode, destNode.Index)
|
||
|
||
srcNode.BackColor = Color.White '修改节点背景色
|
||
tvwDest.SelectedNode = srcNode '选中当前节点
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 拖拽完成
|
||
''' </summary>
|
||
''' <param name="sender"></param>
|
||
''' <param name="e"></param>
|
||
Private Sub TvwStationPlan_DragOver(sender As Object, e As DragEventArgs)
|
||
|
||
End Sub
|
||
#End Region
|
||
|
||
#Region "数据同步与反同步"
|
||
Private Sub UpdateRowNodeGridFromNode(node As TreeNode)
|
||
If node Is Nothing Then Return
|
||
If _cellChanged = GridCellChangedEnum.None Then _cellChanged = GridCellChangedEnum.SelectChange
|
||
|
||
If _cellChanged = GridCellChangedEnum.SelectChange Then
|
||
|
||
RowNodeGrid.AfterSelectUpdateGrid(GrdRowNode, FindRowInfo(node))
|
||
|
||
_cellChanged = GridCellChangedEnum.None
|
||
End If
|
||
End Sub
|
||
|
||
|
||
''' <summary>
|
||
''' 选中节点时,更新节点被选中的样式
|
||
''' </summary>
|
||
''' <param name="node">更新的节点对象</param>
|
||
''' <param name="selected">是否处于选中状态</param>
|
||
Private Sub UpdateNodeStyle(node As TreeNode, selected As Boolean)
|
||
Static lastColor As Color = Color.Transparent
|
||
If node Is Nothing Then Return
|
||
|
||
If selected Then
|
||
lastColor = node.BackColor
|
||
node.BackColor = Color.DodgerBlue
|
||
Else
|
||
node.BackColor = lastColor
|
||
End If
|
||
End Sub
|
||
|
||
Private Sub TvwStationPlan_AfterSelect(sender As Object, e As TreeViewEventArgs)
|
||
If _stationPlanUploading Then Return
|
||
UpdateNodeStyle(LastSelectNode, False) '取消上一选中节点选中状态
|
||
|
||
SelectNode = StationPlan.TreeView.SelectedNode
|
||
SelectRowNode = FindRowInfo(SelectNode)
|
||
|
||
UpdateRowNodeGridFromNode(SelectNode)
|
||
UpdateNodeStyle(SelectNode, True) '更新当前节点的选中状态
|
||
|
||
LastSelectNode = SelectNode
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 详细信息表格内容变更类型枚举值
|
||
''' </summary>
|
||
Enum GridCellChangedEnum
|
||
''' <summary>
|
||
''' 未变更
|
||
''' </summary>
|
||
None
|
||
''' <summary>
|
||
''' 加载流程时时引起的变更
|
||
''' </summary>
|
||
TestPlan
|
||
''' <summary>
|
||
''' 行节点信息修改引起的变更
|
||
''' </summary>
|
||
RowNodeInfo
|
||
''' <summary>
|
||
''' 切换选择节点引起的变更
|
||
''' </summary>
|
||
SelectChange
|
||
End Enum
|
||
|
||
''' <summary>
|
||
''' 详细信息表格内容变更类型
|
||
''' </summary>
|
||
Private _cellChanged As GridCellChangedEnum = GridCellChangedEnum.None
|
||
|
||
''' <summary>
|
||
''' 行节点表,下拉框选择行
|
||
''' </summary>
|
||
Private _grdSingleRowDropRow As Integer
|
||
|
||
''' <summary>
|
||
''' 行节点表,下拉框所在列
|
||
''' </summary>
|
||
Private _grdSingleRowDropCol As Integer
|
||
|
||
|
||
Private Sub GrdSingleRow_CellChange(sender As Object, e As FlexCell.Grid.CellChangeEventArgs) Handles GrdRowNode.CellChange
|
||
If SelectNode Is Nothing Then Return
|
||
|
||
If _cellChanged = GridCellChangedEnum.None Then _cellChanged = GridCellChangedEnum.RowNodeInfo
|
||
If _cellChanged = GridCellChangedEnum.RowNodeInfo Then
|
||
If e.Col = RowNodeGrid.ColNameEnum.ColValue Then
|
||
Manager.RunCommand(New RowNodeCommand(SelectRowNode, e.Row, GrdRowNode.Cell(e.Row, e.Col).Text))
|
||
End If
|
||
|
||
_cellChanged = GridCellChangedEnum.None
|
||
End If
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 单行信息表格命令修改后,同步刷新本身信息
|
||
''' </summary>
|
||
Private Sub GrdSingleRowInfoCommandChanged(commandType As String, commandName As String)
|
||
Dim planCommand As StationPlanCommand = StationPlanCommand.GetCommand(commandType, commandName)
|
||
If planCommand IsNot Nothing Then
|
||
|
||
'拷贝所有参数到当前节点信息中
|
||
SelectRowNode.Parameters.Clear()
|
||
For Each cmdParam As CommandParam In planCommand.Params
|
||
SelectRowNode.Parameters.Add(cmdParam.Clone())
|
||
Next
|
||
|
||
|
||
'更新行节点信息表格内容
|
||
GrdRowNode.Rows = RowNodeGrid.RowNameEnum.Parameters + planCommand.Params.Count
|
||
For idx As Integer = 0 To planCommand.Params.Count - 1
|
||
Dim row As Integer = RowNodeGrid.RowNameEnum.Parameters + idx
|
||
|
||
GrdRowNode.Cell(row, RowNodeGrid.ColNameEnum.ColName).Text = planCommand.Params(idx).Desc
|
||
GrdRowNode.Cell(row, RowNodeGrid.ColNameEnum.ColValue).Text = planCommand.Params(idx).Value
|
||
Next
|
||
|
||
Else
|
||
GrdRowNode.Rows = RowNodeGrid.RowNameEnum.Parameters + 1
|
||
|
||
GrdRowNode.Cell(RowNodeGrid.RowNameEnum.Parameters, RowNodeGrid.ColNameEnum.ColName).Text = RowNodeGrid.RowNameEnum.Parameters.ToString()
|
||
GrdRowNode.Cell(RowNodeGrid.RowNameEnum.Parameters, RowNodeGrid.ColNameEnum.ColValue).Text = ""
|
||
End If
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 下拉框选择对象事件
|
||
''' </summary>
|
||
''' <param name="sender"></param>
|
||
''' <param name="e"></param>
|
||
Private Sub GrdSingleRow_ComboClick(sender As Object, e As FlexCell.Grid.ComboClickEventArgs) Handles GrdRowNode.ComboClick
|
||
If SelectNode Is Nothing Then Return
|
||
Select Case _grdSingleRowDropRow
|
||
Case RowNodeGrid.RowNameEnum.CommandType
|
||
'如果类型变化则,清空命令
|
||
Dim cmdType As String = GrdRowNode.Cell(RowNodeGrid.RowNameEnum.CommandType, RowNodeGrid.ColNameEnum.ColValue).Text
|
||
If String.Compare(SelectRowNode.CommandType, cmdType) <> 0 Then
|
||
GrdRowNode.Cell(RowNodeGrid.RowNameEnum.Command, RowNodeGrid.ColNameEnum.ColValue).Text = ""
|
||
|
||
GrdSingleRowInfoCommandChanged(cmdType, "")
|
||
End If
|
||
Case RowNodeGrid.RowNameEnum.Command
|
||
Dim cmdName As String = GrdRowNode.Cell(RowNodeGrid.RowNameEnum.Command, RowNodeGrid.ColNameEnum.ColValue).Text
|
||
If String.Compare(SelectRowNode.Command, cmdName) <> 0 Then
|
||
GrdSingleRowInfoCommandChanged(SelectRowNode.CommandType, cmdName)
|
||
End If
|
||
Case RowNodeGrid.RowNameEnum.RowType
|
||
|
||
End Select
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 表格下拉框出现时触发事件
|
||
''' </summary>
|
||
''' <param name="sender"></param>
|
||
''' <param name="e"></param>
|
||
Private Sub GrdSingleRow_ComboDropDown(sender As Object, e As FlexCell.Grid.ComboDropDownEventArgs) Handles GrdRowNode.ComboDropDown
|
||
_grdSingleRowDropRow = e.Row
|
||
_grdSingleRowDropCol = e.Col
|
||
|
||
Select Case e.Row
|
||
Case RowNodeGrid.RowNameEnum.CommandType
|
||
GrdRowNode.ComboBox(0).Items.Clear()
|
||
GrdRowNode.ComboBox(0).Items.AddRange(StationPlanCommand.GetCommandTypes())
|
||
Case RowNodeGrid.RowNameEnum.Command
|
||
GrdRowNode.ComboBox(0).Items.Clear()
|
||
GrdRowNode.ComboBox(0).Items.AddRange(StationPlanCommand.GetCommandNames(SelectRowNode.CommandType))
|
||
Case RowNodeGrid.RowNameEnum.RowType
|
||
GrdRowNode.ComboBox(0).Items.Clear()
|
||
GrdRowNode.ComboBox(0).Items.Add(RowNode.RowTypeEnum.Control)
|
||
GrdRowNode.ComboBox(0).Items.Add(RowNode.RowTypeEnum.Flow)
|
||
GrdRowNode.ComboBox(0).Items.Add(RowNode.RowTypeEnum.Module)
|
||
End Select
|
||
End Sub
|
||
|
||
#End Region
|
||
|
||
#Region "RowNode 选择行提示"
|
||
'Private _lastSingleRowSelCol As Integer
|
||
Private _lastSingleRowSelRow As Integer
|
||
|
||
''' <summary>
|
||
''' 更新流程列名提示
|
||
''' </summary>
|
||
''' <param name="colName"></param>
|
||
Private Sub UpdatePlanColNameTip(colName As String)
|
||
If StationPlanColHelpers.ContainsKey(colName) Then
|
||
Dim colHelper As PlanColHelper = StationPlanColHelpers.Item(colName)
|
||
RtxColTip.SuspendLayout()
|
||
RtxColTip.Clear()
|
||
|
||
RtxColTip.AppendText($"{colHelper.ColName}{vbCrLf}")
|
||
RtxColTip.AppendText($"类型:{colHelper.ColType}{vbCrLf}")
|
||
RtxColTip.AppendText($"描述:{colHelper.ColDesc}{vbCrLf}")
|
||
RtxColTip.ResumeLayout(False)
|
||
End If
|
||
End Sub
|
||
|
||
|
||
''' <summary>
|
||
''' 更新流程命令提示
|
||
''' </summary>
|
||
''' <param name="colName"></param>
|
||
''' <param name="commandType"></param>
|
||
''' <param name="commandName"></param>
|
||
''' <param name="paramIndex"></param>
|
||
Private Sub UpdateCommandTip(colName As String, commandType As String, commandName As String, paramIndex As Integer)
|
||
|
||
Dim planCommand As StationPlanCommand = StationPlanCommand.GetCommand(commandType, commandName)
|
||
If planCommand IsNot Nothing Then
|
||
RtxColTip.SuspendLayout()
|
||
RtxColTip.Clear()
|
||
|
||
RtxColTip.AppendText($"{colName}{vbCrLf}")
|
||
RtxColTip.AppendText($"类型:{planCommand.Params(paramIndex).Type}{vbCrLf}")
|
||
RtxColTip.AppendText($"上限:{planCommand.Params(paramIndex).UpperLimit}{vbCrLf}")
|
||
RtxColTip.AppendText($"下限:{planCommand.Params(paramIndex).LowerLimit}{vbCrLf}")
|
||
RtxColTip.AppendText($"描述:{planCommand.Params(paramIndex).Desc}{vbCrLf}")
|
||
RtxColTip.ResumeLayout(False)
|
||
Else
|
||
RtxColTip.AppendText($"{colName}{vbCrLf}")
|
||
End If
|
||
End Sub
|
||
|
||
|
||
''' <summary>
|
||
''' 单行信息表格更新当前行
|
||
''' </summary>
|
||
''' <param name="row"></param>
|
||
Private Sub UpdateSingleRowTip(row As Integer)
|
||
Dim colName As String = GrdRowNode.Cell(row, RowNodeGrid.ColNameEnum.ColName).Text
|
||
|
||
If row >= RowNodeGrid.RowNameEnum.Parameters Then
|
||
Dim commandType As String = GrdRowNode.Cell(RowNodeGrid.RowNameEnum.CommandType, RowNodeGrid.ColNameEnum.ColValue).Text
|
||
Dim command As String = GrdRowNode.Cell(RowNodeGrid.RowNameEnum.Command, RowNodeGrid.ColNameEnum.ColValue).Text
|
||
|
||
If String.IsNullOrEmpty(command) Then
|
||
UpdatePlanColNameTip(colName)
|
||
Else
|
||
UpdateCommandTip(colName, commandType, command, row - RowNodeGrid.RowNameEnum.Parameters)
|
||
End If
|
||
Else
|
||
UpdatePlanColNameTip(colName)
|
||
End If
|
||
|
||
End Sub
|
||
|
||
|
||
Private Sub SingleRowSelChange(row As Integer)
|
||
If _lastSingleRowSelRow = row Then Return
|
||
If _lastSingleRowSelRow >= GrdRowNode.Rows Then Return
|
||
'新增命令切换处理
|
||
|
||
GrdRowNode.Cell(_lastSingleRowSelRow, RowNodeGrid.ColNameEnum.ColName).FontBold = False
|
||
|
||
GrdRowNode.Cell(row, RowNodeGrid.ColNameEnum.ColName).FontBold = True
|
||
|
||
UpdateSingleRowTip(row) '更新列提示
|
||
|
||
_lastSingleRowSelRow = row
|
||
End Sub
|
||
|
||
Private Sub GrdRowNode_SelChange(sender As Object, e As FlexCell.Grid.SelChangeEventArgs) Handles GrdRowNode.SelChange
|
||
SingleRowSelChange(e.FirstRow)
|
||
End Sub
|
||
#End Region
|
||
|
||
#Region "增删节点"
|
||
|
||
''' <summary>
|
||
''' 删除节点
|
||
''' </summary>
|
||
''' <param name="node"></param>
|
||
Private Function DeleteNode(node As TreeNode) As Boolean
|
||
If node Is Nothing Then Return False
|
||
Dim rowNode As RowNode = FindRowInfo(node)
|
||
If rowNode.CanDelete = False Then Return False
|
||
|
||
Manager.RunCommand(New RowNodeCommand2(rowNode.ParentNode, rowNode, RowNodeCommand2.ChangeType.Remove))
|
||
|
||
Return True
|
||
End Function
|
||
|
||
|
||
Private Sub ClearAllNode()
|
||
StationPlan.CreateNewStationPlan()
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 上移节点
|
||
''' </summary>
|
||
''' <param name="node"></param>
|
||
Private Sub MoveUpNode(node As TreeNode)
|
||
Dim index As Integer = node.Index
|
||
If index = 0 Then Return
|
||
Dim rowNode As RowNode = FindRowInfo(node)
|
||
|
||
Manager.RunCommand(New RowNodeCommand2(rowNode.ParentNode, rowNode, RowNodeCommand2.ChangeType.MoveUp))
|
||
|
||
rowNode.TreeView.SelectedNode = rowNode.TreeNode
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 下移节点
|
||
''' </summary>
|
||
''' <param name="node"></param>
|
||
Private Sub MoveDownNode(node As TreeNode)
|
||
Dim index As Integer = node.Index
|
||
If index = node.Parent.Nodes.Count - 1 Then Return
|
||
|
||
Dim rowNode As RowNode = FindRowInfo(node)
|
||
Manager.RunCommand(New RowNodeCommand2(rowNode.ParentNode, rowNode, RowNodeCommand2.ChangeType.MoveDown))
|
||
|
||
rowNode.TreeView.SelectedNode = rowNode.TreeNode
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 左移节点
|
||
''' </summary>
|
||
''' <param name="node"></param>
|
||
Private Sub MoveLeftNode(node As TreeNode)
|
||
If node.Level = 0 Then Return
|
||
|
||
Dim rowNode As RowNode = FindRowInfo(node)
|
||
If rowNode.CanChangeLever = False Then Return
|
||
Manager.RunCommand(New RowNodeCommand2(rowNode.ParentNode, rowNode, RowNodeCommand2.ChangeType.MoveLeft))
|
||
|
||
rowNode.TreeView.SelectedNode = rowNode.TreeNode
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 右移节点
|
||
''' </summary>
|
||
''' <param name="node"></param>
|
||
Private Sub MoveRightNode(node As TreeNode)
|
||
If node.Index = 0 Then Return
|
||
|
||
Dim rowNode As RowNode = FindRowInfo(node)
|
||
If rowNode.CanChangeLever = False Then Return
|
||
Manager.RunCommand(New RowNodeCommand2(rowNode.ParentNode, rowNode, RowNodeCommand2.ChangeType.MoveRight))
|
||
|
||
rowNode.TreeView.SelectedNode = rowNode.TreeNode
|
||
End Sub
|
||
|
||
|
||
''' <summary>
|
||
''' 选中节点
|
||
''' </summary>
|
||
''' <param name="node"></param>
|
||
Private Sub CheckNode(node As TreeNode)
|
||
If node.Checked Then
|
||
node.Checked = False
|
||
Else
|
||
node.Checked = True
|
||
End If
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 全选节点
|
||
''' </summary>
|
||
''' <param name="tvw"></param>
|
||
''' <param name="checked"></param>
|
||
Private Sub CheckAll(tvw As TreeView, checked As Boolean)
|
||
For Each node As TreeNode In tvw.Nodes
|
||
node.Checked = checked
|
||
Next
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 根据节点当前状态,展开或折叠节点
|
||
''' </summary>
|
||
''' <param name="node"></param>
|
||
Private Sub ExpendNode(node As TreeNode)
|
||
If node.IsExpanded Then
|
||
node.Collapse()
|
||
Else
|
||
node.Expand()
|
||
End If
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 在指定父节点下,增加子节点
|
||
''' </summary>
|
||
''' <param name="node">添加子节点的树节点</param>
|
||
Private Sub AddNode(node As TreeNode)
|
||
If node Is Nothing Then Return
|
||
Dim parentRowNode As RowNode = FindRowInfo(node)
|
||
Dim rowNode As New RowNode With {.RowType = RowNode.RowTypeEnum.Flow}
|
||
|
||
If parentRowNode.CanAddChildNode Then
|
||
Manager.RunCommand(New RowNodeCommand2(parentRowNode, rowNode, RowNodeCommand2.ChangeType.Add))
|
||
Else
|
||
Manager.RunCommand(New RowNodeCommand2(parentRowNode.ParentNode, rowNode, RowNodeCommand2.ChangeType.Insert, parentRowNode.RowIndex + 1))
|
||
End If
|
||
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 在指定的行节点下,添加指定行节点
|
||
''' </summary>
|
||
''' <param name="parentRowNode"></param>
|
||
''' <param name="rowNode"></param>
|
||
Private Sub AddNode(parentRowNode As RowNode, rowNode As RowNode)
|
||
If parentRowNode.CanAddChildNode Then
|
||
Manager.RunCommand(New RowNodeCommand2(parentRowNode, rowNode, RowNodeCommand2.ChangeType.Add))
|
||
Else
|
||
Manager.RunCommand(New RowNodeCommand2(parentRowNode.ParentNode, rowNode, RowNodeCommand2.ChangeType.Insert, parentRowNode.RowIndex + 1))
|
||
End If
|
||
End Sub
|
||
|
||
|
||
Private Sub InsertNode(parentRowNode As RowNode, rowNode As RowNode, index As Integer)
|
||
If parentRowNode.CanAddChildNode Then
|
||
Manager.RunCommand(New RowNodeCommand2(parentRowNode, rowNode, RowNodeCommand2.ChangeType.Insert, index))
|
||
Else
|
||
Manager.RunCommand(New RowNodeCommand2(parentRowNode.ParentNode, rowNode, RowNodeCommand2.ChangeType.Add))
|
||
End If
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 读取XML,加载树状视图
|
||
''' </summary>
|
||
Private Sub LoadTreeViewFormXml()
|
||
_stationPlanUploading = True
|
||
Dim revStationPlanPath As String = $"{UtsPath.StationPacketTestPlanDirPath(StationPlan.ParentPacket.Name)}\Main.xml"
|
||
Try
|
||
StationPlan.LoadFromXml(revStationPlanPath)
|
||
Manager.ClearCommands()
|
||
Catch ex As Exception
|
||
MsgBox($"加载测试站流程发生错误,{ex.Message}")
|
||
StationPlan.CreateNewStationPlan()
|
||
End Try
|
||
_stationPlanUploading = False
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 读取XML,加载树状视图
|
||
''' </summary>
|
||
Private Sub LoadTreeViewFormXml(revStationPlanPath As String)
|
||
_stationPlanUploading = True
|
||
Try
|
||
StationPlan.LoadFromXml(revStationPlanPath)
|
||
Manager.ClearCommands()
|
||
Catch ex As Exception
|
||
MsgBox($"加载测试站流程发生错误,{ex.Message}")
|
||
StationPlan.CreateNewStationPlan()
|
||
End Try
|
||
_stationPlanUploading = False
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 将树状视图导出为Xml
|
||
''' </summary>
|
||
Private Sub ExportTreeViewToXml()
|
||
Dim revStationPlanPath As String = $"{UtsPath.StationPacketTestPlanDirPath(StationPlan.ParentPacket.Name)}\Main.xml"
|
||
StationPlan.ExportToXml(revStationPlanPath)
|
||
End Sub
|
||
|
||
Private Sub TsBtnAddNode_Click(sender As Object, e As EventArgs) Handles TsBtnAddNode.Click
|
||
AddNode(SelectNode)
|
||
End Sub
|
||
|
||
Private Sub TsBtnDeleteNode_Click(sender As Object, e As EventArgs) Handles TsBtnDeleteNode.Click
|
||
DeleteNode(SelectNode)
|
||
End Sub
|
||
|
||
Private Sub TsBtnClearAll_Click(sender As Object, e As EventArgs) Handles TsBtnClearAll.Click
|
||
If MsgBox("该操作无法撤销,是否继续清空节点?", MsgBoxStyle.OkCancel) = MsgBoxResult.Ok Then
|
||
If _stationPlanUploading Then Return
|
||
_stationPlanUploading = True
|
||
ClearAllNode() '清空树节点
|
||
Manager.ClearCommands() '清空撤销缓存
|
||
_stationPlanUploading = False
|
||
If StationPlan.TreeView.Nodes.Count > 0 Then StationPlan.TreeView.SelectedNode = StationPlan.TreeView.Nodes(0)
|
||
End If
|
||
End Sub
|
||
Private Sub TsBtnMoveUp_Click(sender As Object, e As EventArgs) Handles TsBtnMoveUp.Click
|
||
MoveUpNode(SelectNode)
|
||
End Sub
|
||
|
||
Private Sub TsBtnMoveDown_Click(sender As Object, e As EventArgs) Handles TsBtnMoveDown.Click
|
||
MoveDownNode(SelectNode)
|
||
End Sub
|
||
|
||
Private Sub TsBtnMoveLeft_Click(sender As Object, e As EventArgs) Handles TsBtnMoveLeft.Click
|
||
MoveLeftNode(SelectNode)
|
||
End Sub
|
||
|
||
Private Sub TsBtnMoveRight_Click(sender As Object, e As EventArgs) Handles TsBtnMoveRight.Click
|
||
MoveRightNode(SelectNode)
|
||
End Sub
|
||
|
||
Private Sub TsBtnNodeCheck_Click(sender As Object, e As EventArgs) Handles TsBtnNodeCheck.Click
|
||
CheckNode(SelectNode)
|
||
End Sub
|
||
|
||
Private Sub TsBtnAllCheck_Click(sender As Object, e As EventArgs) Handles TsBtnAllCheck.Click
|
||
CheckAll(StationPlan.TreeView, True)
|
||
End Sub
|
||
|
||
Private Sub TsBtnAllUncheck_Click(sender As Object, e As EventArgs) Handles TsBtnAllUncheck.Click
|
||
CheckAll(StationPlan.TreeView, False)
|
||
End Sub
|
||
|
||
|
||
Private Sub TsBtnCollapseAll_Click(sender As Object, e As EventArgs) Handles TsBtnCollapseAll.Click
|
||
StationPlan.TreeView.CollapseAll()
|
||
|
||
End Sub
|
||
|
||
Private Sub TsBtnAllExpend_Click(sender As Object, e As EventArgs) Handles TsBtnExpandAll.Click
|
||
StationPlan.TreeView.ExpandAll()
|
||
|
||
End Sub
|
||
|
||
Private Sub TsBtnNodeExpend_Click(sender As Object, e As EventArgs) Handles TsBtnNodeExpend.Click
|
||
ExpendNode(SelectNode)
|
||
|
||
End Sub
|
||
|
||
Private Sub TsBtnOpen_Click(sender As Object, e As EventArgs) Handles TsBtnOpen.Click
|
||
Using xml As New OpenFileDialog
|
||
xml.Filter = $"流程文件(*.xml)|*.xml"
|
||
|
||
If xml.ShowDialog() = DialogResult.OK Then
|
||
LoadTreeViewFormXml(xml.FileName)
|
||
End If
|
||
End Using
|
||
End Sub
|
||
|
||
Private Sub TsBtnLoad_Click(sender As Object, e As EventArgs) Handles TsBtnLoad.Click
|
||
LoadTreeViewFormXml()
|
||
End Sub
|
||
|
||
|
||
Private Sub TsBtnSave_Click(sender As Object, e As EventArgs) Handles TsBtnSave.Click
|
||
ExportTreeViewToXml()
|
||
End Sub
|
||
|
||
|
||
''' <summary>
|
||
''' 当前节点勾选状态变更时,同步修改其子节点的勾选状态
|
||
''' </summary>
|
||
''' <param name="rowNode"></param>
|
||
''' <param name="node"></param>
|
||
Private Sub AfterCheckUpdateChildRowNode(rowNode As RowNode, node As TreeNode)
|
||
For i As Integer = 0 To node.Nodes.Count - 1
|
||
Dim cRowNode As RowNode = CType(rowNode.RowNodes.Item(i), RowNode)
|
||
cRowNode.Action = rowNode.Action
|
||
cRowNode.UpdateTreeNodeText(node.Nodes.Item(i)) '更新节点文本
|
||
|
||
node.Nodes.Item(i).Checked = node.Checked
|
||
|
||
AfterCheckUpdateChildRowNode(cRowNode, node.Nodes.Item(i))
|
||
Next
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 当前节点勾选状态变更时,检查同级节点状态是否相同,更新父节点勾选状态
|
||
''' </summary>
|
||
''' <param name="rowNode"></param>
|
||
''' <param name="node"></param>
|
||
Private Sub AfterCheckUpdateParentRowNode(rowNode As RowNode, node As TreeNode)
|
||
If rowNode.RowLever = 0 Then Return
|
||
If rowNode.ParentNode.Action = rowNode.Action Then Return
|
||
|
||
For i As Integer = 0 To rowNode.ParentNode.RowNodes.Count - 1
|
||
Dim cRowNode As RowNode = CType(rowNode.ParentNode.RowNodes(i), RowNode)
|
||
If cRowNode.Action <> rowNode.Action Then Return
|
||
Next
|
||
rowNode.ParentNode.Action = rowNode.Action
|
||
rowNode.ParentNode.UpdateTreeNodeText(node.Parent)
|
||
node.Parent.Checked = node.Checked
|
||
|
||
AfterCheckUpdateParentRowNode(rowNode.ParentNode, node.Parent)
|
||
End Sub
|
||
|
||
|
||
|
||
Private Sub TvwStationPlan_AfterCheck(sender As Object, e As TreeViewEventArgs)
|
||
If _stationPlanUploading Then Return '设计修改父节点与子节点勾选信息,防止重复处理事件
|
||
_stationPlanUploading = True
|
||
|
||
Dim rowNode As RowNode = FindRowInfo(e.Node)
|
||
rowNode.Action = e.Node.Checked
|
||
rowNode.UpdateTreeNodeText(e.Node) '更新节点文本
|
||
|
||
If e.Node.Equals(SelectNode) Then
|
||
UpdateRowNodeGridFromNode(e.Node) '更新表格显示
|
||
End If
|
||
|
||
|
||
AfterCheckUpdateChildRowNode(rowNode, e.Node)
|
||
|
||
AfterCheckUpdateParentRowNode(rowNode, e.Node)
|
||
|
||
_stationPlanUploading = False
|
||
End Sub
|
||
|
||
Private Sub TsBtnStyle_Click(sender As Object, e As EventArgs) Handles TsBtnStyle.Click
|
||
Using dlgStyle As New DlgStationPlanStyle
|
||
If dlgStyle.ShowDialog() = DialogResult.OK Then
|
||
StationPlan.UpdateTreeViewStyle()
|
||
|
||
'保存样式
|
||
RowNode.SaveNodeStyles(UtsPath.NodeStylePath)
|
||
|
||
End If
|
||
End Using
|
||
End Sub
|
||
|
||
#End Region
|
||
|
||
#Region "保存与读取节点文件"
|
||
|
||
Private Sub SaveNodeFile(node As TreeNode)
|
||
If node Is Nothing Then Return
|
||
|
||
Using dialog As New SaveFileDialog
|
||
dialog.Title = $"请输入需要保存节点的文件名"
|
||
dialog.AddExtension = True
|
||
dialog.Filter = $"节点文件(*.xml)|*.xml"
|
||
If dialog.ShowDialog() <> DialogResult.OK Then Return
|
||
|
||
Dim rowNode As RowNode = FindRowInfo(node)
|
||
rowNode.ExportToXml(dialog.FileName)
|
||
End Using
|
||
End Sub
|
||
|
||
Private Sub LoadNodeFile(node As TreeNode)
|
||
If node Is Nothing Then Return
|
||
|
||
Using dialog As New OpenFileDialog
|
||
dialog.Title = $"请选择需要加载的节点文件"
|
||
dialog.Filter = $"节点文件(*.xml)|*.xml"
|
||
dialog.Multiselect = False
|
||
If dialog.ShowDialog() <> DialogResult.OK Then Return
|
||
|
||
_stationPlanUploading = True
|
||
|
||
Dim parentRowNode As RowNode = FindRowInfo(node)
|
||
|
||
Dim childRowNode As New RowNode
|
||
childRowNode.LoadFormXml(dialog.FileName)
|
||
|
||
AddNode(parentRowNode, childRowNode)
|
||
|
||
If node.IsExpanded = False Then node.Expand() '展开当前节点
|
||
_stationPlanUploading = False
|
||
End Using
|
||
|
||
End Sub
|
||
|
||
Private Sub MsiSaveNodeFile_Click(sender As Object, e As EventArgs) Handles MsiSaveNodeFile.Click
|
||
SaveNodeFile(SelectNode)
|
||
End Sub
|
||
|
||
|
||
Private Sub MsiLoadNodeFile_Click(sender As Object, e As EventArgs) Handles MsiLoadNodeFile.Click
|
||
LoadNodeFile(SelectNode)
|
||
End Sub
|
||
#End Region
|
||
|
||
#Region "撤销重做"
|
||
''' <summary>
|
||
''' 撤销重做操作类
|
||
''' </summary>
|
||
''' <returns></returns>
|
||
Private Property Manager() As New CommandManager
|
||
|
||
''' <summary>
|
||
''' 撤销节点操作
|
||
''' </summary>
|
||
Private Sub UndoNode()
|
||
Manager.Undo()
|
||
|
||
UpdateRowNodeGridFromNode(SelectNode) '更新表格显示
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 重做节点操作
|
||
''' </summary>
|
||
Private Sub RedoNode()
|
||
Manager.Redo()
|
||
UpdateRowNodeGridFromNode(SelectNode) '更新表格显示
|
||
End Sub
|
||
#End Region
|
||
|
||
#Region "节点复制剪切粘贴操作"
|
||
Private Property CloneRowNode As RowNode
|
||
|
||
''' <summary>
|
||
''' 复制节点
|
||
''' </summary>
|
||
Private Sub CopyNode(node As TreeNode)
|
||
If node Is Nothing Then Return
|
||
CloneRowNode = FindRowInfo(node).Clone()
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 剪切节点
|
||
''' </summary>
|
||
Private Sub CutNode(node As TreeNode)
|
||
If node Is Nothing Then Return
|
||
|
||
If DeleteNode(node) Then
|
||
CloneRowNode = FindRowInfo(node)
|
||
End If
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 粘贴节点
|
||
''' </summary>
|
||
Private Sub PasteNode(node As TreeNode)
|
||
If CloneRowNode Is Nothing Then Return
|
||
If node Is Nothing Then Return
|
||
|
||
Dim parentRowNode As RowNode = FindRowInfo(node)
|
||
Dim childRowNode As RowNode = CloneRowNode.Clone()
|
||
|
||
AddNode(parentRowNode, childRowNode)
|
||
If node.IsExpanded = False Then node.Expand()
|
||
End Sub
|
||
|
||
|
||
|
||
|
||
Private Sub MsiCopyNode_Click(sender As Object, e As EventArgs) Handles MsiCopyNode.Click
|
||
CopyNode(SelectNode)
|
||
End Sub
|
||
|
||
Private Sub MsiCutNode_Click(sender As Object, e As EventArgs) Handles MsiCutNode.Click
|
||
CutNode(SelectNode)
|
||
End Sub
|
||
|
||
Private Sub MsiNodePaste_Click(sender As Object, e As EventArgs) Handles MsiNodePaste.Click
|
||
PasteNode(SelectNode)
|
||
End Sub
|
||
|
||
Private Sub MsiUndo_Click(sender As Object, e As EventArgs) Handles MsiUndo.Click
|
||
UndoNode()
|
||
End Sub
|
||
|
||
Private Sub MsiRedo_Click(sender As Object, e As EventArgs) Handles MsiRedo.Click
|
||
RedoNode()
|
||
End Sub
|
||
|
||
''' <summary>
|
||
''' 快捷键操作
|
||
''' </summary>
|
||
''' <param name="sender"></param>
|
||
''' <param name="e"></param>
|
||
Private Sub TvwStationPlan_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
|
||
If e.Modifiers = Keys.Control Then
|
||
Select Case e.KeyCode
|
||
Case Keys.C '复制
|
||
If StationPlan.TreeView.Focused = False Then Return
|
||
CopyNode(SelectNode)
|
||
Case Keys.X '剪切
|
||
If StationPlan.TreeView.Focused = False Then Return
|
||
CutNode(SelectNode)
|
||
Case Keys.V '粘贴
|
||
If StationPlan.TreeView.Focused = False Then Return
|
||
PasteNode(SelectNode)
|
||
|
||
Case Keys.Z '撤销
|
||
UndoNode()
|
||
Case Keys.Y '重做
|
||
RedoNode()
|
||
|
||
Case Keys.O '加载
|
||
LoadTreeViewFormXml()
|
||
Case Keys.S '保存
|
||
ExportTreeViewToXml()
|
||
|
||
Case Keys.Up '节点上移
|
||
MoveUpNode(SelectNode)
|
||
Case Keys.Down '节点下移
|
||
MoveDownNode(SelectNode)
|
||
Case Keys.Left '节点左移
|
||
MoveLeftNode(SelectNode)
|
||
Case Keys.Right '节点移动
|
||
MoveRightNode(SelectNode)
|
||
|
||
Case Keys.D '增加节点
|
||
AddNode(SelectNode)
|
||
Case Keys.R '删除节点
|
||
DeleteNode(SelectNode)
|
||
End Select
|
||
ElseIf e.Modifiers = Keys.Alt Then
|
||
Select Case e.KeyCode
|
||
Case Keys.O '加载指定节点文件
|
||
LoadNodeFile(SelectNode)
|
||
Case Keys.S '保存指定节点
|
||
SaveNodeFile(SelectNode)
|
||
End Select
|
||
|
||
ElseIf e.Modifiers = Keys.None Then
|
||
Select Case e.KeyCode
|
||
Case Keys.Back '删除
|
||
If StationPlan.TreeView.Focused = False Then Return
|
||
DeleteNode(SelectNode)
|
||
End Select
|
||
|
||
End If
|
||
End Sub
|
||
|
||
Private Sub GrdRowNode_Load(sender As Object, e As EventArgs) Handles GrdRowNode.Load
|
||
|
||
End Sub
|
||
|
||
|
||
#End Region
|
||
|
||
End Class |