This repository has been archived on 2025-11-27. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
AUTS_OLD/AUTS_Win/FrmStationPlan.vb
2024-03-11 16:34:21 +08:00

1038 lines
35 KiB
VB.net
Raw Permalink 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.
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