lib/events/MainForm.ps1

#######################################################################################################################################################
# WARNING: DO NOT EDIT THIS FILE AS IT IS GENERATED AND WILL BE OVERWRITTEN ON THE NEXT UPDATE! #
# #
# Generated via psake on: 2026-07-16T04:27:51.297Z #
# Version: 2026.7.16.29 #
# Copyright Fortigi (C) 2024-2026 #
#######################################################################################################################################################
#requires -Version 7.0

$Script:PendingWebViewCompletions = [System.Collections.Generic.List[object]]::new()

$Script:WebViewCompletionPollTimer = New-Object System.Windows.Threading.DispatcherTimer
$Script:WebViewCompletionPollTimer.Interval = [TimeSpan]::FromMilliseconds(50)
$Script:WebViewCompletionPollTimer.Add_Tick({
        try {
            $Completed = @($Script:PendingWebViewCompletions | Where-Object { $_.Task.IsCompleted })
            foreach ($Pending in $Completed) {
                [void]$Script:PendingWebViewCompletions.Remove($Pending)

                if ($null -ne $Pending.TabSession) {
                    $PreviouslyActiveTab = Get-ActiveTabSession
                    try {
                        Set-ActiveTabContext -TabSession $Pending.TabSession
                        & $Pending.OnCompletedScriptBlock $Pending
                    }
                    finally {
                        if ($null -ne $PreviouslyActiveTab) {
                            Set-ActiveTabContext -TabSession $PreviouslyActiveTab
                        }
                    }
                }
                else {
                    & $Pending.OnCompletedScriptBlock $Pending
                }
            }
        }
        catch {
            $_.Exception.Message | Write-LogOutput -LogType ERROR -ErrorObject $_
        }
    })
$Script:WebViewCompletionPollTimer.Start()

try {
    $TabStripPanelFactory = New-Object System.Windows.FrameworkElementFactory([Fortigi.ShrinkingTabPanel])
    (Get-TabControlSessions).ItemsPanel = New-Object System.Windows.Controls.ItemsPanelTemplate($TabStripPanelFactory)
}
catch {
    "Failed to set the single-row tab panel: {0}" -f $_.Exception.Message | Write-LogOutput -LogType WARNING
}

try {
    $AddNewTabItem = (Get-TabControlSessions).Items | Where-Object { $_.Name -eq "TabItemAddNew" } | Select-Object -First 1
    if ($null -ne $AddNewTabItem) {
        $AddNewTabItem.Add_PreviewMouseLeftButtonDown({
                param($AddTabSender, $AddTabArgs)
                try {
                    $AddTabArgs.Handled = $true
                    New-EmptyTabSession | Out-Null
                }
                catch {
                    $_.Exception.Message | Write-LogOutput -LogType ERROR -ErrorObject $_
                }
            })
    }
}
catch {
    "Failed to wire the '+' add-tab click handler: {0}" -f $_.Exception.Message | Write-LogOutput -LogType WARNING
}

$Script:MainForm.Definition.Add_Closed({
        try {
            $_ | Show-EventInfo
            $Script:MainForm.State = "Closed"
            $Script:MainForm.Definition.Close()
        }
        catch {
            $_.Exception.Message | Write-LogOutput -LogType ERROR -ErrorObject $_
        }
    })

$Script:MainForm.Definition.Add_Closing({
        try {
            $_ | Show-EventInfo
            $Script:MainForm.State = "Closing"
            Save-TabSessions
            Save-FormMeasurements
            if (Test-LogFormIsVisible) {
                $Script:LogForm.Definition.Close()
            }
            if (Test-SqlHistoryFormOpen) {
                $Script:SqlHistoryForm.Definition.Close()
            }
            if (Test-SqlSchemaFormIsVisible) {
                $Script:SqlSchemaForm.Definition.Close()
            }
        }
        catch {
            $_.Exception.Message | Write-LogOutput -LogType ERROR -ErrorObject $_
        }
    })

$Script:MainForm.Definition.AddHandler(
    [System.Windows.Input.Keyboard]::KeyDownEvent,
    [System.Windows.Input.KeyEventHandler] {
        param(
            $EventSender,
            $EventArgs
        )
        if ((Test-EditorNavigationKey -KeyName ([string]$EventArgs.Key)) -and $EventArgs.OriginalSource -is [Microsoft.Web.WebView2.Wpf.WebView2]) {
            $EventArgs.Handled = $false
        }
    },
    $true)

$Script:MainForm.Definition.Add_PreviewKeyDown({
        param(
            $EventSender,
            $EventArgs
        )
        try {
            $_ | Show-EventInfo

            $ControlPressed = [System.Windows.Input.Keyboard]::Modifiers -band [System.Windows.Input.ModifierKeys]::Control
            $ShiftPressed = [System.Windows.Input.Keyboard]::Modifiers -band [System.Windows.Input.ModifierKeys]::Shift

            if ($EventArgs.Key -eq [System.Windows.Input.Key]::F5) {
                if ($null -ne $Script:Webview.Object -and $Script:Webview.Object.IsKeyboardFocusWithin) {
                    "F5 key at MainForm level - WebView2 has focus, deferring to Monaco" | Write-LogOutput -LogType VERBOSE
                }
                else {
                    "F5 key intercepted at MainForm level" | Write-LogOutput -LogType VERBOSE

                    $EventArgs.Handled = $true

                    "Triggering Execute Query from F5 key press (MainForm)" | Write-LogOutput -LogType VERBOSE
                    $Script:MainForm.Elements.ButtonExecuteQuery.RaiseEvent([System.Windows.RoutedEventArgs]::new([System.Windows.Controls.Primitives.ButtonBase]::ClickEvent))
                }
            }
            elseif ($ControlPressed -and $EventArgs.Key -eq [System.Windows.Input.Key]::Tab) {
                $EventArgs.Handled = $true
                if ($ShiftPressed) {
                    "Ctrl+Shift+Tab intercepted at MainForm level - select previous tab" | Write-LogOutput -LogType VERBOSE
                    Select-AdjacentTab -Direction Previous
                }
                else {
                    "Ctrl+Tab intercepted at MainForm level - select next tab" | Write-LogOutput -LogType VERBOSE
                    Select-AdjacentTab -Direction Next
                }
            }
            elseif ($EventArgs.Key -eq [System.Windows.Input.Key]::S -and $ControlPressed -and -not $ShiftPressed) {
                "Ctrl+S key intercepted at MainForm level" | Write-LogOutput -LogType VERBOSE

                $EventArgs.Handled = $true

                "Triggering Save Query from Ctrl+S key press (MainForm)" | Write-LogOutput -LogType VERBOSE
                $Script:MainForm.Elements.ButtonSaveQuery.RaiseEvent([System.Windows.RoutedEventArgs]::new([System.Windows.Controls.Primitives.ButtonBase]::ClickEvent))
            }
            elseif ($EventArgs.Key -eq [System.Windows.Input.Key]::C -and $ControlPressed -and -not $ShiftPressed) {
                "Ctrl+C detected at MainForm level - allowing to pass through to focused control" | Write-LogOutput -LogType VERBOSE
            }
            elseif ($ControlPressed -and $ShiftPressed -and $EventArgs.Key -eq [System.Windows.Input.Key]::K) {
                "Ctrl+Shift+K intercepted at MainForm level - duplicate active tab" | Write-LogOutput -LogType VERBOSE
                $EventArgs.Handled = $true
                $ActiveTab = Get-ActiveTabSession
                if ($null -ne $ActiveTab) {
                    Invoke-DuplicateTab -TabId $ActiveTab.Id
                }
            }
            elseif ($ControlPressed -and -not $ShiftPressed -and $EventArgs.Key -eq [System.Windows.Input.Key]::T) {
                "Ctrl+T intercepted at MainForm level - duplicate active tab without query" | Write-LogOutput -LogType VERBOSE
                $EventArgs.Handled = $true
                $ActiveTab = Get-ActiveTabSession
                if ($null -ne $ActiveTab) {
                    Invoke-DuplicateTab -TabId $ActiveTab.Id -WithoutQuery
                }
            }
            elseif ($ControlPressed -and -not $ShiftPressed -and ($EventArgs.Key -eq [System.Windows.Input.Key]::W -or $EventArgs.Key -eq [System.Windows.Input.Key]::F4)) {
                "Ctrl+W / Ctrl+F4 intercepted at MainForm level - close active tab" | Write-LogOutput -LogType VERBOSE
                $EventArgs.Handled = $true
                $ActiveTab = Get-ActiveTabSession
                if ($null -ne $ActiveTab) {
                    Close-TabSession -TabId $ActiveTab.Id
                }
            }
        }
        catch {
            $_.Exception.Message | Write-LogOutput -LogType ERROR -ErrorObject $_
        }
    })

$Script:MainForm.Definition.Add_PreviewKeyUp({
        try {
            $_ | Show-EventInfo
        }
        catch {
            $_.Exception.Message | Write-LogOutput -LogType ERROR -ErrorObject $_
        }
    })

$Script:MainForm.Definition.Add_Loaded({
        try {
            $_ | Show-EventInfo

            $Script:MainForm.State = "Open"

            if ($Script:AppGlobalConfig.LogFormOpen) {
                Open-LogForm
            }

            if ($null -ne ($Script:MainForm.Definition | Get-FormPositionConfig)) {
                $Position = $Script:MainForm.Definition | Get-FormPositionConfig
                "Main form position: {0}" -f $Position | Write-LogOutput -LogType DEBUG
                $Script:MainForm.Definition.Left = [Int]::Abs($Position.Split("x")[0])
                $Script:MainForm.Definition.Top = [Int]::Abs($Position.Split("x")[1])
            }
            if ($null -ne ($Script:MainForm.Definition | Get-FormSizeConfig)) {
                $Size = $Script:MainForm.Definition | Get-FormSizeConfig
                "Main form size: {0}" -f $Size | Write-LogOutput -LogType DEBUG
                $Script:MainForm.Definition.Width = [Int]::Abs($Size.Split("x")[0])
                $Script:MainForm.Definition.Height = [Int]::Abs($Size.Split("x")[1])
            }

            Restore-TabSessions
        }
        catch {
            "Tab session restore failed: {0}" -f $_.Exception.Message | Write-LogOutput -LogType ERROR -ErrorObject $_
        }
    })

$Script:MainForm.Definition.Add_LocationChanged({
        try {
            $_ | Show-EventInfo -LogType VERBOSE2

            $ActionId = [System.Guid]::NewGuid().ToString()

            if (!$Script:MainForm.Definition.IsVisible -or $Script:MainForm.Definition.Left -lt 0 -or $Script:MainForm.Definition.Top -lt 0) {
                "MainForm is not suitable for processing. Position: {0}x{1}, Dimensions: {2}x{3} (Id:{4})" -f $Script:MainForm.Definition.Left, $Script:MainForm.Definition.Top, $Script:MainForm.Definition.Width , $Script:MainForm.Definition.Height, $ActionId | Write-LogOutput -LogType VERBOSE2
                return
            }

            "MainForm Position: {0}x{1}, Dimensions: {2}x{3} (Id:{4})" -f $Script:MainForm.Definition.Left, $Script:MainForm.Definition.Top, $Script:MainForm.Definition.Width , $Script:MainForm.Definition.Height, $ActionId | Write-LogOutput -LogType VERBOSE2
            if ((Test-LogFormIsVisible) -and -not $Script:LogForm.PositionManager.Synchronizing) {
                if ($Script:LogForm.Definition.Left -lt 0 -or $Script:LogForm.Definition.Top -lt 0) {
                    "LogForm is not suitable for processing. Position: {0}x{1}, Dimensions: {2}x{3} (Id:{4})" -f $Script:MainForm.Definition.Left, $Script:MainForm.Definition.Top, $Script:MainForm.Definition.Width , $Script:MainForm.Definition.Height, $ActionId | Write-LogOutput -LogType VERBOSE2
                    return
                }
                "LogForm Position: {0}x{1}, Dimensions: {2}x{3} (Id:{4})" -f $Script:LogForm.Definition.Left, $Script:LogForm.Definition.Top, $Script:LogForm.Definition.Width , $Script:LogForm.Definition.Height, $ActionId | Write-LogOutput -LogType VERBOSE2
                $Script:LogForm.PositionManager.Synchronizing = $true
                $Script:MainForm.Definition.Dispatcher.Invoke({
                        $Script:LogForm.Definition.Left = [Int]::Abs($Script:MainForm.Definition.Left) + [Int]::Abs($Script:LogForm.PositionManager.PositionOffSetLeft)
                        $Script:LogForm.Definition.Top = [Int]::Abs($Script:MainForm.Definition.Top) + [Int]::Abs($Script:LogForm.PositionManager.PositionOffSetTop)
                        "LogForm Position: {0}x{1}, Dimensions: {2}x{3}, PositionManagerOffSet: {4}x{5} (Id:{6})" -f $Script:LogForm.Definition.Left, $Script:LogForm.Definition.Top, $Script:LogForm.Definition.Width , $Script:LogForm.Definition.Height, $Script:LogForm.PositionManager.PositionOffSetLeft, $Script:LogForm.PositionManager.PositionOffSetTop, $ActionId | Write-LogOutput -LogType VERBOSE2
                        $Script:LogForm.PositionManager.Synchronizing = $false
                    }, [System.Windows.Threading.DispatcherPriority]::Render)
            }
            if ((Test-SqlSchemaFormIsVisible) -and -not $Script:SqlSchemaForm.PositionManager.Synchronizing) {
                $_ | Show-EventInfo -LogType VERBOSE2
                if ($Script:SqlSchemaForm.Definition.Left -lt 0 -or $Script:SqlSchemaForm.Definition.Top -lt 0) {
                    "SqlSchemaForm is not suitable for processing. Position: {0}x{1}, Dimensions: {2}x{3} (Id:{4})" -f $Script:SqlSchemaForm.Definition.Left, $Script:SqlSchemaForm.Definition.Top, $Script:SqlSchemaForm.Definition.Width , $Script:SqlSchemaForm.Definition.Height, $ActionId | Write-LogOutput -LogType VERBOSE2
                    return
                }
                "SqlSchemaForm Position: {0}x{1}, Dimensions: {2}x{3} (Id:{4})" -f $Script:SqlSchemaForm.Definition.Left, $Script:SqlSchemaForm.Definition.Top, $Script:SqlSchemaForm.Definition.Width , $Script:SqlSchemaForm.Definition.Height, $ActionId | Write-LogOutput -LogType VERBOSE2
                $Script:SqlSchemaForm.PositionManager.Synchronizing = $true
                $Script:MainForm.Definition.Dispatcher.Invoke({
                        $Script:SqlSchemaForm.Definition.Left = [Int]::Abs($Script:MainForm.Definition.Left) - [Int]::Abs($Script:SqlSchemaForm.PositionManager.PositionOffSetLeft)
                        $Script:SqlSchemaForm.Definition.Top = [Int]::Abs($Script:MainForm.Definition.Top) - [Int]::Abs($Script:SqlSchemaForm.PositionManager.PositionOffSetTop)
                        "SqlSchemaForm Position: {0}x{1}, Dimensions: {2}x{3}, PositionManagerOffSet: {4}x{5} (Id:{6})" -f $Script:SqlSchemaForm.Definition.Left, $Script:SqlSchemaForm.Definition.Top, $Script:SqlSchemaForm.Definition.Width, $Script:SqlSchemaForm.Definition.Height, $Script:SqlSchemaForm.PositionManager.PositionOffSetLeft, $Script:SqlSchemaForm.PositionManager.PositionOffSetTop, $ActionId | Write-LogOutput -LogType VERBOSE2
                        $Script:SqlSchemaForm.PositionManager.Synchronizing = $false
                    }, [System.Windows.Threading.DispatcherPriority]::Render)
            }
        }
        catch {
            "WebView2 initialization failed: {0}" -f $_.Exception.Message | Write-LogOutput -LogType ERROR -ErrorObject $_
        }
    })

(Get-TabControlSessions).Add_SelectionChanged({
        param(
            $EventSender,
            $EventArgs
        )
        try {
            $_ | Show-EventInfo

            if ($Script:MainForm.State -ne "Open") {
                return
            }

            if ($EventArgs.OriginalSource -ne (Get-TabControlSessions)) {
                return
            }

            $SelectedItem = (Get-TabControlSessions).SelectedItem
            if ($null -eq $SelectedItem) {
                return
            }

            if ($SelectedItem.Name -eq "TabItemAddNew") {
                $CurrentTab = Get-ActiveTabSession
                if ($null -ne $CurrentTab -and $null -ne $CurrentTab.TabItem) {
                    (Get-TabControlSessions).SelectedItem = $CurrentTab.TabItem
                }
                else {
                    (Get-TabControlSessions).SelectedIndex = -1
                }
                return
            }

            $TabSession = $Script:Tabs | Where-Object { $_.TabItem -eq $SelectedItem } | Select-Object -First 1
            if ($null -ne $TabSession) {
                $OutgoingTabId = $Script:ActiveTabId

                Set-ActiveTabContext -TabSession $TabSession

                if (![string]::IsNullOrWhiteSpace($OutgoingTabId) -and $OutgoingTabId -ne $TabSession.Id) {
                    $Script:PreviousActiveTabId = $OutgoingTabId
                }

                if (-not $Script:SuppressEditorSync -and -not $TabSession.IsMaterialized) {
                    $OpeningPopup = Show-PopupWindow -Message ("Opening tab '{0}', please wait..." -f $TabSession.DisplayName)
                    if ($null -ne $OpeningPopup) {
                        $OpeningPopup.Dispatcher.Invoke([System.Action] {}, [System.Windows.Threading.DispatcherPriority]::Render) | Out-Null
                    }
                    try {
                        Complete-TabMaterialization -TabSession $TabSession
                    }
                    finally {
                        if ($null -ne $OpeningPopup) {
                            $OpeningPopup.Close()
                        }
                    }
                }

                if ($TabSession.NeedsEditorSync -and -not $Script:SuppressEditorSync) {
                    $TabSession.NeedsEditorSync = $false
                    $Script:MainForm.Definition.Dispatcher.BeginInvoke(
                        [System.Windows.Threading.DispatcherPriority]::Background,
                        [System.Action] { Set-EditorValue }) | Out-Null
                }

                Update-ApplicationTitle

                if (Test-SqlSchemaFormIsVisible) {
                    Get-SqlSchemaObject
                }
            }
        }
        catch {
            $_.Exception.Message | Write-LogOutput -LogType ERROR -ErrorObject $_
        }
    })