DialogBoxes.psm1

class DialogBoxesOptionModel {
    $InputMessage
    $InputType
    DialogBoxesOptionModel($message, $inputType) {
        $this.InputMessage = $message
        $this.InputType = $inputType
    }
}

function Show-Alert {
    param(
        [Parameter(Mandatory = $true)]
        [string] $Message
    )
    Add-Type -AssemblyName PresentationFramework
    $result = [System.Windows.MessageBox]::Show($Message, "Prompt", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning, [System.Windows.MessageBoxResult]::OK, [System.Windows.MessageBoxOptions]::DefaultDesktopOnly )
    return $result;
}

function Get-UserInput {
    param (
        [Parameter(Mandatory = $true)]
        [string] $Message
    )
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing

    $form = New-Object System.Windows.Forms.Form
    $form.Text = $Message
    $form.Size = New-Object System.Drawing.Size(300, 200)
    $form.StartPosition = 'CenterScreen'

    $okButton = New-Object System.Windows.Forms.Button
    $okButton.Location = New-Object System.Drawing.Point(75, 120)
    $okButton.Size = New-Object System.Drawing.Size(75, 23)
    $okButton.Text = 'OK'
    $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $form.AcceptButton = $okButton
    $form.Controls.Add($okButton)

    $cancelButton = New-Object System.Windows.Forms.Button
    $cancelButton.Location = New-Object System.Drawing.Point(150, 120)
    $cancelButton.Size = New-Object System.Drawing.Size(75, 23)
    $cancelButton.Text = 'Cancel'
    $cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
    $form.CancelButton = $cancelButton
    $form.Controls.Add($cancelButton)

    $label = New-Object System.Windows.Forms.Label
    $label.Location = New-Object System.Drawing.Point(10, 20)
    $label.Size = New-Object System.Drawing.Size(280, 20)
    $label.Text = $Message
    $form.Controls.Add($label)
    $textBox = New-Object System.Windows.Forms.TextBox
    $textBox.Location = New-Object System.Drawing.Point(10, 40)
    $textBox.Size = New-Object System.Drawing.Size(260, 20)
    $form.Controls.Add($textBox)
    $form.Topmost = $true
    $form.Add_Shown({ $textBox.Select() })
    $result = $form.ShowDialog()
    if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
        $x = $textBox.Text
        return $x;
    }
    return $null;
}
function Get-UserInputMultiple {
    param (
        [Parameter(Mandatory = $true)]$Messages
    )
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
    $incrment = 20;
    $gap = 50;
    $labelToInputGap = 30;
    $textBoxSize = 5;
    $labelWidth = 280
    $leftPadding = 10;
    $labelLocation = $incrment;
    $inputLocation = $incrment + $labelToInputGap
    $formYLen = ($Messages.Count * (( $textBoxSize * 2) + $labelToInputGap + $incrment )) + 250
    # ( $labelToInputGap + $textBoxSize + $textBoxSize + $gap + $incrment ))
    if ($Messages.Count -ge 11) {
        $formYLen += 100
    }
    $formXLen = $labelWidth + ($leftPadding * 4)
    $form = New-Object System.Windows.Forms.Form
    $form.Text = $Message
    $form.Size = New-Object System.Drawing.Size($formXLen, $formYLen)
    $form.StartPosition = 'CenterScreen'
    $form.Topmost = $true
    foreach ($message in $Messages) {
        $label = New-Object System.Windows.Forms.Label
        $label.Location = New-Object System.Drawing.Point($leftPadding, $labelLocation)
        $label.Size = New-Object System.Drawing.Size($labelWidth, (( $textBoxSize * 2) + $labelToInputGap + $incrment ))
        $label.Text = $message
        $textBox = New-Object System.Windows.Forms.TextBox
        $textBox.Location = New-Object System.Drawing.Point(0, ($incrment + $textBoxSize))
        $textBox.Size = New-Object System.Drawing.Size($labelWidth, $textBoxSize )
        $label.Controls.Add($textBox);
        $form.Controls.Add($label);
        $labelLocation += $incrment + $gap
        $inputLocation += $incrment + $gap
    }
    $okButton = New-Object System.Windows.Forms.Button
    $okButton.Location = New-Object System.Drawing.Point(75, $inputLocation)
    $okButton.Size = New-Object System.Drawing.Size(75, 23)
    $okButton.Text = 'OK'
    $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $form.AcceptButton = $okButton
    $form.Controls.Add($okButton)
    $cancelButton = New-Object System.Windows.Forms.Button
    $cancelButton.Location = New-Object System.Drawing.Point(175, $inputLocation)
    $cancelButton.Size = New-Object System.Drawing.Size(75, 23)
    $cancelButton.Text = 'Cancel'
    $cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
    $form.CancelButton = $cancelButton
    $form.Controls.Add($cancelButton)
    $form.Add_Shown({ $textBox.Select() })
    $result = $form.ShowDialog()
    $values = New-Object System.Collections.Generic.List[string]
    if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
        $vals = $form.Controls | Where-Object { $_.HasChildren -eq $true }
        foreach ($v in $vals) {
            $values.Add($v.Controls[0].Text);
        }
        return $values
    }
    return $null;
}

<#
.SYNOPSIS
    Pass in an array of Messages and Input types to create those fields in a dialog box.
.DESCRIPTION
    At the current time, only accepts check boxes and Text boxes. .
.NOTES
    Use the DialogBoxesOptionModel to create the fields and boxes. Types are CheckBox AND TextBox
.EXAMPLE
    $list = New-Object 'System.Collections.Generic.List[DialogBoxesOptionModel]'
    $model = [DialogBoxesOptionModel]::new("Do you like chicken", "CheckBox")
    $list.Add($model);
    $m2 = [DialogBoxesOptionModel]::new("What is your Name?", "TextBox")
    $list.Add($m2)
    $result = Get-UserInputMultipleWithOptions -MessagesAndInputTypes $list.ToArray()
    Write-Host $result
#>

function Get-UserInputMultipleWithOption {
    param (
        [Parameter(Mandatory = $true)][DialogBoxesOptionModel[]] $MessagesAndInputTypes
    )
    $checkBox = "CheckBox"
    $textBox = "TextBox"
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
    $incrment = 20;
    $gap = 50;
    $labelToInputGap = 30;
    $textBoxSize = 5;
    $labelWidth = 280
    $leftPadding = 10;
    $labelLocation = $incrment;
    $inputLocation = $incrment + $labelToInputGap
    $formYLen = ($Messages.Count * (( $textBoxSize * 2) + $labelToInputGap + $incrment )) + 250
    # ( $labelToInputGap + $textBoxSize + $textBoxSize + $gap + $incrment ))
    if ($Messages.Count -ge 11) {
        $formYLen += 100
    }
    $formXLen = $labelWidth + ($leftPadding * 4)
    $form = New-Object System.Windows.Forms.Form
    $form.Text = $Message
    $form.Size = New-Object System.Drawing.Size($formXLen, $formYLen)
    $form.StartPosition = 'CenterScreen'
    $form.Topmost = $true
    foreach ($message in $MessagesAndInputTypes) {
        $label = New-Object System.Windows.Forms.Label
        $label.Location = New-Object System.Drawing.Point($leftPadding, $labelLocation)
        $label.Size = New-Object System.Drawing.Size($labelWidth, (( $textBoxSize * 2) + $labelToInputGap + $incrment ))
        $label.Text = $message.InputMessage
        if ($message.InputType -eq $textBox) {
            $inputBox = New-Object System.Windows.Forms.TextBox
            $inputBox.Location = New-Object System.Drawing.Point(0, ($incrment + $textBoxSize))
        }
        elseif ($message.InputType -eq $checkBox) {
            $inputBox = New-Object System.Windows.Forms.CheckBox
            $inputBox.Location = New-Object System.Drawing.Point(0, ($incrment + $textBoxSize))

        }
        $inputBox.Size = New-Object System.Drawing.Size($labelWidth, $textBoxSize )
        $label.Controls.Add($inputBox);
        $form.Controls.Add($label);
        $labelLocation += $incrment + $gap
        $inputLocation += $incrment + $gap
    }
    $okButton = New-Object System.Windows.Forms.Button
    $okButton.Location = New-Object System.Drawing.Point(75, $inputLocation)
    $okButton.Size = New-Object System.Drawing.Size(75, 23)
    $okButton.Text = 'OK'
    $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $form.AcceptButton = $okButton
    $form.Controls.Add($okButton)
    $cancelButton = New-Object System.Windows.Forms.Button
    $cancelButton.Location = New-Object System.Drawing.Point(175, $inputLocation)
    $cancelButton.Size = New-Object System.Drawing.Size(75, 23)
    $cancelButton.Text = 'Cancel'
    $cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
    $form.CancelButton = $cancelButton
    $form.Controls.Add($cancelButton)
    $form.Add_Shown({ $inputBox.Select() })
    $result = $form.ShowDialog()
    $values = New-Object System.Collections.Generic.List[string]
    if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
        $vals = $form.Controls | Where-Object { $_.HasChildren -eq $true }
        foreach ($v in $vals) {
            $control = $v.Controls[0]
            $type = $control.GetType().Name;
            if ($type -eq $checkBox) {
                $values.Add($control.Checked)
            }
            else {
                $values.Add($control.Text);
            }
        }
        return $values
    }
    return $null;
}

function Get-FolderPathDialog {
    param (
        [string] $HelpText = "Please select folder.",
        [string] $InitialFolder = "MyComputer"
    )
    Add-Type -AssemblyName System.Windows.Forms
    $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
    $FolderBrowser.RootFolder = $InitialFolder
    $FolderBrowser.Description = $HelpText1
    $result = $FolderBrowser.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true; Name = $HelpText }))
    if ($result -eq [Windows.Forms.DialogResult]::OK) {
        return  $FolderBrowser.SelectedPath
    }
    else {
        Show-Alert -Message "Folder path was canceled."
        exit;
    }
}
function Get-FolderPathDialogV2 {
    param (
        [string] $HelpText = "Please select folder.",
        [string] $InitialFolder = "MyComputer"
    )
    Add-Type -AssemblyName System.Windows.Forms
    $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
    $FolderBrowser.RootFolder = $InitialFolder
    $FolderBrowser.Description = $HelpText1
    $result = $FolderBrowser.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true; Name = $HelpText }))
    if ($result -eq [Windows.Forms.DialogResult]::OK) {
        return  ($true, $FolderBrowser.SelectedPath)
    }
    else {
        Show-Alert -Message "Folder path was canceled."
        return ($false, "")
    }
}
function Get-FileDialog {
    param (
        [string] $FileTypeFilter = "",
        [string] $HelpText = "Please select file."
    )
    Add-Type -AssemblyName System.Windows.Forms
    $fileBrowser = New-Object System.Windows.Forms.OpenFileDialog
    $fileBrowser.Title = $HelpText
    $fileBrowser.Filter = $FileTypeFilter
    $fileBrowser.Multiselect = $false
    $fileBrowser.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true; Name = $HelpText })) | Out-Null
    return $fileBrowser.FileName
}
function Show-ConfirmationBox {
    param(
        [Parameter(Mandatory = $true)][string] $Message,
        [Parameter(Mandatory = $true)][string] $Title
    )
    return [System.Windows.Forms.MessageBox]::Show($Message, $title, "YesNo", "Information", "Button1");
}

#Export-ModuleMember -Function Get-UserInput
#Export-ModuleMember -Function Show-Alert
#Export-ModuleMember -Function Get-FolderPathDialog