DialogBoxes.psm1

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

function Get-NewDialogBoxesOptionsList() {
    return New-Object 'System.Collections.Generic.List[DialogBoxesOptionModel]'
}


function Get-NewDialogBoxesOptionModel() {
    param (
        $InputMessage,
        $InputType
    )
    return [DialogBoxesOptionModel]::new($InputMessage, $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
function CreateDialogBoxOptions() {
    $userInputMessages = Get-NewDialogBoxesOptionsList
    $enableMfa = Get-NewDialogBoxesOptionModel -InputMessage "Enable user MFA?" -InputType "CheckBox"
    $project = Get-NewDialogBoxesOptionModel -InputMessage "Is this project user?"-InputType "CheckBox"
    $licenseType = Get-NewDialogBoxesOptionModel -InputMessage "Office 365 License Name." -InputType "TextBox"
    $sendEmailToManager = Get-NewDialogBoxesOptionModel -InputMessage "Send email to manager when complete?" -InputType "CheckBox"
    $userInputMessages.Add($enableMfa)
    $userInputMessages.Add($project)
    $userInputMessages.Add($licenseType)
    $userInputMessages.Add($sendEmailToManager)
    $array = $userInputMessages.ToArray()
    $multiInputDialog = Get-UserInputMultipleWithOption -MessagesAndInputTypes $array
    return $multiInputDialog
}
#>

function Get-UserInputMultipleWithOption {
    param (
        [Parameter(Mandatory = $true)][DialogBoxesOptionModel[]] $MessagesAndInputTypes,
        [Int32] $FontSize = 10
    )
    $font = New-Object System.Drawing.Font('Arial', $FontSize);
    $checkBox = "CheckBox"
    $textBox = "TextBox"
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
    $incrment = 20;
    $textBoxYSize = $([System.Windows.Forms.TextRenderer]::MeasureText($checkBox, $font).Height) + 5
    $gap = $textBoxYSize * 2.2 # 100;
    $labelToInputGap = $textBoxYSize;
    $maxLabelLen = 0;

    foreach ($messageI in $MessagesAndInputTypes) {
        $messagePixels = [System.Windows.Forms.TextRenderer]::MeasureText($messageI.InputMessage, $font)
        if ($messagePixels.Width -gt $maxLabelLen) {

            $maxLabelLen = $messagePixels.Width
        }
    }
    $labelWidth = 280 + $maxLabelLen
    $leftPadding = 10;
    $labelLocation = $incrment;
    $inputLocation = $incrment + $labelToInputGap
    $formYLen = ($MessagesAndInputTypes.Count * (( $textBoxYSize * 2) + $labelToInputGap + $incrment )) + 250
    # ( $labelToInputGap + $textBoxYSize + $textBoxYSize + $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
    $form.Font = $font
    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, (( $textBoxYSize ) + $labelToInputGap + $incrment ))
        $label.Text = $message.InputMessage
        $labelPixels = [System.Windows.Forms.TextRenderer]::MeasureText($label.Text, $font)
        if ($labelPixels.Width -gt ($formYLen - 50)) {
            $mult = $labelPixels.Width / ($formYLen - 50)
            $labelPixels.Height = $labelPixels.Height * $mult
        }
        if ($message.InputType -eq $textBox) {
            $inputBox = New-Object System.Windows.Forms.TextBox
            # $inputBox.Height = $textBoxYSize
            $inputBox.Location = New-Object System.Drawing.Point(0, ($incrment + $textBoxYSize))
            $inputBox.Size = New-Object System.Drawing.Size($labelWidth, $textBoxYSize )
        }
        elseif ($message.InputType -eq $checkBox) {
            $inputBox = New-Object System.Windows.Forms.CheckBox
            # $inputBox.Height = $textBoxYSize
            $inputBox.Location = New-Object System.Drawing.Point(0, ($incrment + $textBoxYSize))
            $inputBox.AutoSize = $true
        }
        $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 + ($maxLabelLen / 2 )), $inputLocation)
    $okButton.Text = 'OK'
    $okButton.Size = New-Object System.Drawing.Size((([System.Windows.Forms.TextRenderer]::MeasureText($okButton.Text, $font).Width) + 20), $textBoxYSize)
    $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 + ($maxLabelLen / 2 )), $inputLocation)
    $cancelButton.Text = 'Cancel'
    $cancelButton.Size = New-Object System.Drawing.Size( (([System.Windows.Forms.TextRenderer]::MeasureText($cancelButton.Text, $font).Width) + 20), $textBoxYSize)
    $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