mirror of
https://github.com/staxrip/staxrip.git
synced 2026-10-25 02:30:28 +08:00
274 lines
10 KiB
VB.net
274 lines
10 KiB
VB.net
Imports System.Threading
|
|
Imports System.Threading.Tasks
|
|
Imports System.Globalization
|
|
|
|
Imports StaxRip.CommandLine
|
|
Imports StaxRip.UI
|
|
|
|
Class CommandLineForm
|
|
Private Params As CommandLineParams
|
|
|
|
Public HTMLHelp As String
|
|
|
|
Public Sub New(params As CommandLineParams)
|
|
InitializeComponent()
|
|
Me.Params = params
|
|
Text = params.Title
|
|
InitUI()
|
|
|
|
If SimpleUI.Tree.Nodes.Count > 10 Then
|
|
SimpleUI.Tree.ItemHeight = CInt(SimpleUI.Tree.Height / SimpleUI.Tree.Nodes.Count) - 3
|
|
End If
|
|
|
|
SelectLastPage()
|
|
AddHandler params.ValueChanged, AddressOf ValueChanged
|
|
params.RaiseValueChanged(Nothing)
|
|
|
|
cbGoTo.Sorted = True
|
|
cbGoTo.SendMessageCue("Search")
|
|
cbGoTo.Select()
|
|
|
|
cms.Items.Add(New ActionMenuItem("Execute Command Line", Sub() params.Execute(), Nothing, p.SourceFile <> ""))
|
|
cms.Items.Add(New ActionMenuItem("Copy Command Line", Sub() Clipboard.SetText(params.GetCommandLine(True, True))))
|
|
cms.Items.Add(New ActionMenuItem("Show Command Line", Sub() g.ShowCommandLinePreview(params.GetCommandLine(True, True))))
|
|
cms.Items.Add(New ActionMenuItem("Help", Sub() ShowHelp()))
|
|
cms.Items.Add(New ActionMenuItem(params.GetPackage.Name + " Help", Sub() g.ShellExecute(params.GetPackage.GetHelpPath)))
|
|
|
|
UpdateSearchComboBox()
|
|
End Sub
|
|
|
|
Sub SelectLastPage()
|
|
SimpleUI.SelectLast(Params.Title + "page selection")
|
|
End Sub
|
|
|
|
Sub ValueChanged(item As CommandLineItem)
|
|
rtbCmdl.SetText(Params.GetCommandLine(False, False))
|
|
rtbCmdl.SelectionLength = 0
|
|
UpdateHeight()
|
|
End Sub
|
|
|
|
Sub UpdateHeight()
|
|
Dim s = TextRenderer.MeasureText(rtbCmdl.Text, rtbCmdl.Font,
|
|
New Size(rtbCmdl.ClientSize.Width, Integer.MaxValue),
|
|
TextFormatFlags.WordBreak)
|
|
Height += CInt(s.Height * 1.2) - rtbCmdl.Height
|
|
rtbCmdl.Refresh()
|
|
End Sub
|
|
|
|
Sub InitUI()
|
|
Dim flowPanels As New List(Of Control)
|
|
Dim helpControl As Control
|
|
Dim currentFlow As SimpleUI.FlowPage
|
|
|
|
For x = 0 To Params.Items.Count - 1
|
|
Dim item = Params.Items(x)
|
|
Dim parent As FlowLayoutPanelEx = SimpleUI.GetFlowPage(item.Path)
|
|
currentFlow = DirectCast(parent, SimpleUI.FlowPage)
|
|
|
|
If Not flowPanels.Contains(parent) Then
|
|
flowPanels.Add(parent)
|
|
parent.SuspendLayout()
|
|
End If
|
|
|
|
Dim help As String
|
|
|
|
If item.Help <> "" Then
|
|
help = item.Help
|
|
Else
|
|
help = Nothing 'compiler bug?
|
|
End If
|
|
|
|
If item.Switch <> "" Then
|
|
If item.NoSwitch <> "" Then
|
|
help = item.Switch + CrLf2 + item.NoSwitch
|
|
Else
|
|
help = item.Switch
|
|
End If
|
|
|
|
If TypeOf item Is BoolParam Then
|
|
If DirectCast(item, BoolParam).DefaultValue Then
|
|
help += CrLf2 + "Default: enabled"
|
|
Else
|
|
help += CrLf2 + "Default: disabled"
|
|
End If
|
|
ElseIf TypeOf item Is NumParam Then
|
|
Dim param = DirectCast(item, NumParam)
|
|
help += CrLf2 + "Default: " & param.DefaultValue.ToString(CultureInfo.InvariantCulture) + CrLf +
|
|
"Minimum: " & param.MinMaxStepDec(0) & CrLf + "Maximum: " & param.MinMaxStepDec(1)
|
|
ElseIf TypeOf item Is OptionParam Then
|
|
Dim param = DirectCast(item, OptionParam)
|
|
|
|
If param.DefaultValue >= 0 AndAlso param.DefaultValue < param.Options.Length Then
|
|
help += CrLf2 + "Default: " + param.Options(param.DefaultValue)
|
|
End If
|
|
ElseIf TypeOf item Is StringParam Then
|
|
help += CrLf2 + "Default: " & DirectCast(item, StringParam).DefaultValue
|
|
End If
|
|
|
|
If item.Help <> "" Then help += CrLf2 + item.Help
|
|
If item.URL <> "" Then help += CrLf2 + "[" + item.URL + " " + item.URL + "]"
|
|
End If
|
|
|
|
If TypeOf item Is BoolParam Then
|
|
Dim cb = SimpleUI.AddCheckBox(parent)
|
|
cb.Margin = New Padding(3) With {.Left = 9}
|
|
cb.Text = item.Text
|
|
cb.Tooltip = help
|
|
If item.URL <> "" Then currentFlow.TipProvider.SetURL(item.URL, cb)
|
|
DirectCast(item, BoolParam).Init(cb)
|
|
helpControl = cb
|
|
ElseIf TypeOf item Is NumParam Then
|
|
Dim tempItem = DirectCast(item, NumParam)
|
|
Dim param = DirectCast(item, NumParam)
|
|
Dim nb = SimpleUI.AddNumericBlock(parent)
|
|
nb.Label.Text = item.Text
|
|
nb.Label.Tooltip = help
|
|
If item.URL <> "" Then currentFlow.TipProvider.SetURL(item.URL, nb.Label)
|
|
nb.NumEdit.Init(param.MinMaxStepDec)
|
|
AddHandler nb.Label.MouseDoubleClick, Sub() tempItem.Value = tempItem.DefaultValue
|
|
DirectCast(item, NumParam).Init(nb.NumEdit)
|
|
helpControl = nb.Label
|
|
ElseIf TypeOf item Is OptionParam Then
|
|
Dim tempItem = DirectCast(item, OptionParam)
|
|
Dim os = DirectCast(item, OptionParam)
|
|
Dim mb = SimpleUI.AddMenuButtonBlock(Of Integer)(parent)
|
|
mb.Label.Text = item.Text
|
|
mb.Tooltip = help
|
|
If item.URL <> "" Then currentFlow.TipProvider.SetURL(item.URL, mb.Label, mb.MenuButton)
|
|
helpControl = mb.Label
|
|
AddHandler mb.Label.MouseDoubleClick, Sub() tempItem.ValueChangedUser(tempItem.DefaultValue)
|
|
|
|
If os.Expand Then
|
|
mb.Expand(mb.MenuButton)
|
|
End If
|
|
|
|
For x2 = 0 To os.Options.Length - 1
|
|
mb.MenuButton.Add(os.Options(x2), x2)
|
|
Next
|
|
|
|
os.Init(mb.MenuButton)
|
|
ElseIf TypeOf item Is StringParam Then
|
|
Dim tempItem = DirectCast(item, StringParam)
|
|
Dim tb = SimpleUI.AddTextBlock(parent)
|
|
tb.Label.Text = item.Text
|
|
tb.Label.Tooltip = help
|
|
helpControl = tb.Label
|
|
AddHandler tb.Label.MouseDoubleClick, Sub() tempItem.Value = tempItem.DefaultValue
|
|
tb.Expand(tb.Edit)
|
|
Dim sp = DirectCast(item, StringParam)
|
|
sp.Init(tb)
|
|
End If
|
|
|
|
Dim listText = item.Switch
|
|
If listText = "" AndAlso item.Text <> "" Then listText = item.Text.Trim(" "c, ":"c)
|
|
|
|
If listText <> "" AndAlso Not helpControl Is Nothing Then
|
|
SearchControlDic(listText) = helpControl
|
|
ControlFlowDic(helpControl) = currentFlow
|
|
ControlHelpDic(helpControl) = item.Help
|
|
End If
|
|
Next
|
|
|
|
For Each i In flowPanels
|
|
i.ResumeLayout()
|
|
Next
|
|
End Sub
|
|
|
|
Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
|
|
SimpleUI.SaveLast(Params.Title + "page selection")
|
|
MyBase.OnFormClosed(e)
|
|
End Sub
|
|
|
|
Private Sub CommandLineForm_HelpRequested(sender As Object, hlpevent As HelpEventArgs) Handles Me.HelpRequested
|
|
ShowHelp()
|
|
End Sub
|
|
|
|
Sub ShowHelp()
|
|
Dim f As New HelpForm()
|
|
f.Doc.WriteStart(Text)
|
|
If cbGoTo.Visible Then f.Doc.WriteP("The Search input field can be used to search for options, it searches in the switch, the label and the help. Multiple matches can be cycled by pressing enter.")
|
|
f.Doc.WriteP("Numeric values and options can easily be reset to their default value by double clicking on the label. The default value for boolean and any other value can be found in the tooltip which can be shown by right-clicking the label.")
|
|
If HTMLHelp <> "" Then f.Doc.Writer.WriteRaw(HTMLHelp)
|
|
f.Doc.WriteTips(SimpleUI.ActivePage.TipProvider.GetTips)
|
|
f.Show()
|
|
End Sub
|
|
|
|
Private SearchIndex As Integer
|
|
Private SearchControlDic As New Dictionary(Of String, Control)
|
|
Private ControlFlowDic As New Dictionary(Of Control, SimpleUI.FlowPage)
|
|
Private ControlHelpDic As New Dictionary(Of Control, String)
|
|
|
|
Private Sub cbGoTo_KeyDown(sender As Object, e As KeyEventArgs) Handles cbGoTo.KeyDown
|
|
If e.KeyData = Keys.Enter Then
|
|
SearchIndex += 1
|
|
cbGoTo_TextChanged(Nothing, Nothing)
|
|
Else
|
|
SearchIndex = 0
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub cbGoTo_TextChanged(sender As Object, e As EventArgs) Handles cbGoTo.TextChanged
|
|
Dim q = cbGoTo.Text.ToLower
|
|
|
|
Dim matchedControls As New List(Of Control)
|
|
|
|
If q.Length > 1 Then
|
|
For Each i In SearchControlDic
|
|
If i.Key.ToLower.Contains(q) Then
|
|
matchedControls.Add(i.Value)
|
|
End If
|
|
Next
|
|
|
|
For Each i In ControlHelpDic
|
|
If i.Value <> "" AndAlso i.Value.ToLower.Contains(q) AndAlso
|
|
Not matchedControls.Contains(i.Key) Then
|
|
|
|
matchedControls.Add(i.Key)
|
|
End If
|
|
Next
|
|
|
|
If matchedControls.Count > 0 Then
|
|
If SearchIndex >= matchedControls.Count Then
|
|
SearchIndex = 0
|
|
End If
|
|
|
|
ShowControl(matchedControls(SearchIndex))
|
|
End If
|
|
End If
|
|
End Sub
|
|
|
|
Sub ShowControl(c As Control)
|
|
Dim flow = ControlFlowDic(c)
|
|
SimpleUI.ShowPage(flow)
|
|
c.Font = New Font(c.Font, FontStyle.Bold)
|
|
c.ForeColor = ControlPaint.Dark(ToolStripRendererEx.ColorBorder, 0.1)
|
|
ResetFontAsync(c)
|
|
End Sub
|
|
|
|
Async Sub ResetFontAsync(c As Control)
|
|
Await Task.Run(Sub() Thread.Sleep(1000))
|
|
|
|
If Not c.IsDisposed AndAlso Not c.Disposing Then
|
|
c.Font = New Font(c.Font, FontStyle.Regular)
|
|
c.ForeColor = Color.Black
|
|
End If
|
|
End Sub
|
|
|
|
Sub UpdateSearchComboBox()
|
|
cbGoTo.Items.Clear()
|
|
|
|
For Each i In SearchControlDic
|
|
If cbGoTo.Text = "" OrElse SearchControlDic.ContainsKey(cbGoTo.Text) OrElse
|
|
i.Key.ToLower.Contains(cbGoTo.Text.ToLower) Then
|
|
|
|
cbGoTo.Items.Add(i.Key)
|
|
End If
|
|
Next
|
|
|
|
If cbGoTo.Items.Count < 20 Then cbGoTo.Visible = False
|
|
End Sub
|
|
|
|
Private Sub CommandLineForm_Load(sender As Object, e As EventArgs) Handles Me.Load
|
|
UpdateHeight()
|
|
End Sub
|
|
End Class |