<Page
    x:Class="Microsoft.PowerToys.Settings.UI.Views.MouseWithoutBordersPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:controls="using:Microsoft.PowerToys.Settings.UI.Controls"
    xmlns:converters="using:CommunityToolkit.WinUI.UI.Converters"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:tkcontrols="using:CommunityToolkit.WinUI.Controls"
    xmlns:ui="using:CommunityToolkit.WinUI"
    AutomationProperties.LandmarkType="Main"
    mc:Ignorable="d">
    <Page.Resources>
        <converters:BoolToVisibilityConverter x:Key="negativeBoolToVisibilityConverter" />
        <converters:BoolToObjectConverter
            x:Key="OneRowMatrixBoolToNumberOfRowsConverter"
            FalseValue="2"
            TrueValue="4" />
    </Page.Resources>
    <controls:SettingsPageControl x:Uid="MouseWithoutBorders" ModuleImageSource="ms-appx:///Assets/Settings/Modules/MouseWithoutBorders.png">
        <controls:SettingsPageControl.ModuleContent>
            <StackPanel Orientation="Vertical">
                <controls:SettingsGroup x:Uid="MouseWithoutBorders_ActivationSettings">
                    <tkcontrols:SettingsCard
                        x:Uid="MouseWithoutBorders_Toggle_Enable"
                        HeaderIcon="{ui:BitmapIcon Source=/Assets/Settings/Icons/MouseWithoutBorders.png}"
                        IsEnabled="{x:Bind ViewModel.IsEnabledGpoConfigured, Mode=OneWay, Converter={StaticResource BoolNegationConverter}}">
                        <ToggleSwitch
                            x:Uid="ToggleSwitch"
                            IsEnabled="{x:Bind ViewModel.CanBeEnabled, Mode=OneWay}"
                            IsOn="{x:Bind ViewModel.IsEnabled, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                    <InfoBar
                        x:Uid="GPO_SettingIsManaged"
                        IsClosable="False"
                        IsOpen="{x:Bind ViewModel.IsEnabledGpoConfigured, Mode=OneWay}"
                        IsTabStop="{x:Bind ViewModel.IsEnabledGpoConfigured, Mode=OneWay}"
                        Severity="Informational" />
                </controls:SettingsGroup>
                <controls:SettingsGroup x:Uid="MouseWithoutBorders_KeySettings" IsEnabled="{x:Bind ViewModel.IsEnabled, Mode=OneWay}">
                    <tkcontrols:SettingsExpander
                        x:Name="MouseWithoutBorders_ConnectSettings"
                        x:Uid="MouseWithoutBorders_SecurityKey"
                        HeaderIcon="{ui:FontIcon Glyph=&#xE8D7;}"
                        IsExpanded="{x:Bind ViewModel.ConnectFieldsVisible, Mode=TwoWay}">
                        <tkcontrols:SettingsExpander.Items>
                            <tkcontrols:SettingsCard ContentAlignment="Right">
                                <StackPanel Orientation="Horizontal" Spacing="8">
                                    <TextBox
                                        x:Name="ConnectSecurityKeyTextBox"
                                        x:Uid="MWB_SecurityKeyLabel"
                                        Width="248" />
                                    <TextBox
                                        x:Name="ConnectPCNameTextBox"
                                        x:Uid="MWB_PCNameLabel"
                                        Width="248" />
                                    <Button
                                        x:Uid="MouseWithoutBorders_Connect"
                                        Command="{x:Bind ConnectCommand, Mode=OneTime}"
                                        Style="{StaticResource AccentButtonStyle}" />
                                </StackPanel>
                            </tkcontrols:SettingsCard>
                        </tkcontrols:SettingsExpander.Items>
                        <StackPanel Orientation="Horizontal" Spacing="8">
                            <TextBox IsReadOnly="True" Text="{x:Bind ViewModel.SecurityKey, Mode=TwoWay}" />
                            <Button
                                x:Uid="MouseWithoutBorders_NewKey"
                                Command="{x:Bind GenerateNewKeyCommand, Mode=OneTime}"
                                Style="{StaticResource AccentButtonStyle}" />
                            <Button
                                x:Uid="MouseWithoutBorders_Connect"
                                Command="{x:Bind ShowConnectFieldsCommand, Mode=OneTime}"
                                Style="{StaticResource AccentButtonStyle}"
                                Visibility="{x:Bind Path=ViewModel.ConnectFieldsVisible, Mode=OneWay, Converter={StaticResource negativeBoolToVisibilityConverter}, ConverterParameter=True}" />
                        </StackPanel>
                    </tkcontrols:SettingsExpander>

                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_ThisMachineNameLabel">
                        <StackPanel Orientation="Horizontal" Spacing="8">
                            <TextBlock
                                VerticalAlignment="Center"
                                Foreground="{ThemeResource TextFillColorSecondaryBrush}"
                                IsTextSelectionEnabled="True"
                                Text="{x:Bind ViewModel.MachineHostName, Mode=OneTime}" />
                            <Button
                                Width="32"
                                Height="32"
                                Padding="4"
                                Command="{x:Bind CopyPCNameCommand, Mode=OneTime}"
                                Content="&#xE8C8;"
                                FontFamily="{StaticResource SymbolThemeFontFamily}">
                                <ToolTipService.ToolTip>
                                    <TextBlock x:Uid="MouseWithoutBorders_CopyMachineName" TextWrapping="Wrap" />
                                </ToolTipService.ToolTip>
                            </Button>
                        </StackPanel>
                    </tkcontrols:SettingsCard>
                </controls:SettingsGroup>
                <controls:SettingsGroup x:Uid="MouseWithoutBorders_DeviceLayoutSettings" IsEnabled="{x:Bind ViewModel.IsEnabled, Mode=OneWay}">
                    <tkcontrols:SettingsCard
                        HorizontalContentAlignment="Stretch"
                        Background="{ThemeResource CardBackgroundFillColorSecondaryBrush}"
                        ContentAlignment="Vertical">
                        <StackPanel Orientation="Vertical" Spacing="8">
                            <ItemsControl
                                x:Name="DevicesItemsControl"
                                HorizontalAlignment="Center"
                                ItemsSource="{Binding MachineMatrixString, Mode=TwoWay}">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <WrapGrid MaximumRowsOrColumns="{Binding MatrixOneRow, Mode=OneWay, Converter={StaticResource OneRowMatrixBoolToNumberOfRowsConverter}}" Orientation="Horizontal" />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <!--  TODO: colors?  -->
                                        <!--
                                            BorderBrush="#DFDFDF"
                                            Background="#d4d4d4"
                                        -->
                                        <!--  Dragging while elevated crashes on WinUI3: https://github.com/microsoft/microsoft-ui-xaml/issues/7690  -->
                                        <Border
                                            Width="136"
                                            Height="90"
                                            Margin="4"
                                            AllowDrop="{Binding Item.CanDragDrop, Mode=OneWay}"
                                            Background="{ThemeResource SolidBackgroundFillColorBaseAltBrush}"
                                            BorderBrush="{Binding Item.StatusBrush}"
                                            BorderThickness="2"
                                            CanDrag="{Binding Item.CanDragDrop, Mode=OneWay}"
                                            CornerRadius="4"
                                            DataContext="{Binding}"
                                            DragOver="Device_DragOver"
                                            DragStarting="Device_DragStarting"
                                            Drop="Device_Drop"
                                            ToolTipService.ToolTip="{Binding Item.Name, Mode=OneWay}">
                                            <Grid>
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="*" />
                                                    <RowDefinition Height="Auto" />
                                                </Grid.RowDefinitions>

                                                <FontIcon
                                                    Margin="0,12,0,0"
                                                    VerticalAlignment="Center"
                                                    FontSize="32"
                                                    Glyph="&#xE7F8;" />
                                                <TextBlock
                                                    Grid.Row="1"
                                                    Margin="12"
                                                    HorizontalAlignment="Center"
                                                    Style="{StaticResource CaptionTextBlockStyle}"
                                                    Tag="DeviceName"
                                                    Text="{Binding Item.Name}" />
                                            </Grid>
                                        </Border>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                            <Button HorizontalAlignment="Right" Command="{x:Bind ReconnectCommand, Mode=OneTime}">
                                <ToolTipService.ToolTip>
                                    <TextBlock x:Uid="MouseWithoutBorders_ReconnectTooltip" TextWrapping="Wrap" />
                                </ToolTipService.ToolTip>
                                <TextBlock x:Uid="MouseWithoutBorders_ReconnectButton" />
                            </Button>


                        </StackPanel>
                    </tkcontrols:SettingsCard>

                    <InfoBar
                        x:Uid="MouseWithoutBorders_CannotDragDropAsAdmin"
                        IsClosable="True"
                        IsOpen="{x:Bind ViewModel.IsElevated, Mode=OneWay}"
                        IsTabStop="True"
                        Severity="Informational" />



                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_MatrixOneRow">
                        <ToggleSwitch x:Uid="MouseWithoutBorders_MatrixOneRow_ToggleSwitch" IsOn="{x:Bind ViewModel.MatrixOneRow, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                </controls:SettingsGroup>
                <controls:SettingsGroup x:Uid="MouseWithoutBorders_ServiceSettings" IsEnabled="{x:Bind ViewModel.CanToggleUseService, Mode=OneWay}">
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_UseService">
                        <ToggleSwitch
                            x:Uid="MouseWithoutBorders_UseService_ToggleSwitch"
                            IsEnabled="{x:Bind ViewModel.IsEnabled, Mode=OneWay}"
                            IsOn="{x:Bind ViewModel.UseService, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                    <InfoBar
                        x:Uid="MouseWithoutBorders_RunAsAdminText"
                        IsClosable="False"
                        IsOpen="{x:Bind ViewModel.CanToggleUseService, Mode=OneWay, Converter={StaticResource BoolNegationConverter}}"
                        IsTabStop="True"
                        Severity="Informational" />
                    <InfoBar
                        x:Uid="MouseWithoutBorders_ServiceUserUninstallWarning"
                        IsClosable="True"
                        IsOpen="True"
                        IsTabStop="True"
                        Severity="Warning" />
                    <tkcontrols:SettingsCard
                        x:Uid="MouseWithoutBorders_UninstallService"
                        ActionIcon="{ui:FontIcon Glyph=&#xE8A7;}"
                        Command="{x:Bind ViewModel.UninstallServiceEventHandler}"
                        IsClickEnabled="{x:Bind ViewModel.CanUninstallService, Mode=OneWay}"
                        IsEnabled="{x:Bind ViewModel.CanUninstallService, Mode=OneWay}" />
                </controls:SettingsGroup>
                <controls:SettingsGroup x:Uid="MouseWithoutBorders_Settings" IsEnabled="{x:Bind ViewModel.IsEnabled, Mode=OneWay}">
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_WrapMouse">
                        <ToggleSwitch x:Uid="MouseWithoutBorders_WrapMouse_ToggleSwitch" IsOn="{x:Bind ViewModel.WrapMouse, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_ShareClipboard">
                        <ToggleSwitch x:Uid="MouseWithoutBorders_ShareClipboard_ToggleSwitch" IsOn="{x:Bind ViewModel.ShareClipboard, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_TransferFile">
                        <ToggleSwitch x:Uid="MouseWithoutBorders_TransferFile_ToggleSwitch" IsOn="{x:Bind ViewModel.TransferFile, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_HideMouseAtScreenEdge">
                        <ToggleSwitch x:Uid="MouseWithoutBorders_HideMouseAtScreenEdge_ToggleSwitch" IsOn="{x:Bind ViewModel.HideMouseAtScreenEdge, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_DrawMouseCursor">
                        <ToggleSwitch x:Uid="MouseWithoutBorders_DrawMouseCursor_ToggleSwitch" IsOn="{x:Bind ViewModel.DrawMouseCursor, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_ValidateRemoteMachineIP">
                        <ToggleSwitch x:Uid="MouseWithoutBorders_ValidateRemoteMachineIP_ToggleSwitch" IsOn="{x:Bind ViewModel.ValidateRemoteMachineIP, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_SameSubnetOnly">
                        <ToggleSwitch x:Uid="MouseWithoutBorders_SameSubnetOnly_ToggleSwitch" IsOn="{x:Bind ViewModel.SameSubnetOnly, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_BlockScreenSaverOnOtherMachines">
                        <ToggleSwitch x:Uid="MouseWithoutBorders_BlockScreenSaverOnOtherMachines_ToggleSwitch" IsOn="{x:Bind ViewModel.BlockScreenSaverOnOtherMachines, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_MoveMouseRelatively">
                        <ToggleSwitch x:Uid="MouseWithoutBorders_MoveMouseRelatively_ToggleSwitch" IsOn="{x:Bind ViewModel.MoveMouseRelatively, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_BlockMouseAtScreenCorners">
                        <ToggleSwitch x:Uid="MouseWithoutBorders_BlockMouseAtScreenCorners_ToggleSwitch" IsOn="{x:Bind ViewModel.BlockMouseAtScreenCorners, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_ShowClipboardAndNetworkStatusMessages">
                        <ToggleSwitch x:Uid="MouseWithoutBorders_ShowClipboardAndNetworkStatusMessages_ToggleSwitch" IsOn="{x:Bind ViewModel.ShowClipboardAndNetworkStatusMessages, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                </controls:SettingsGroup>
                <controls:SettingsGroup x:Uid="MouseWithoutBorders_KeyboardShortcuts_Group" IsEnabled="{x:Bind ViewModel.IsEnabled, Mode=OneWay}">
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_EasyMouseOption">
                        <ComboBox MinWidth="{StaticResource SettingActionControlMinWidth}" SelectedIndex="{x:Bind Path=ViewModel.EasyMouseOptionIndex, Mode=TwoWay}">
                            <ComboBoxItem x:Uid="MouseWithoutBorders_EasyMouseOption_Disabled" />
                            <ComboBoxItem x:Uid="MouseWithoutBorders_EasyMouseOption_Enabled" />
                            <ComboBoxItem x:Uid="MouseWithoutBorders_EasyMouseOption_Ctrl" />
                            <ComboBoxItem x:Uid="MouseWithoutBorders_EasyMouseOption_Shift" />
                        </ComboBox>
                    </tkcontrols:SettingsCard>

                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_ToggleEasyMouseShortcut" HeaderIcon="{ui:FontIcon Glyph=&#xEDA7;}">
                        <controls:ShortcutControl
                            MinWidth="{StaticResource SettingActionControlMinWidth}"
                            AllowDisable="True"
                            HotkeySettings="{x:Bind Path=ViewModel.ToggleEasyMouseShortcut, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>

                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_LockMachinesShortcut" HeaderIcon="{ui:FontIcon Glyph=&#xEDA7;}">
                        <controls:ShortcutControl
                            MinWidth="{StaticResource SettingActionControlMinWidth}"
                            AllowDisable="True"
                            HotkeySettings="{x:Bind Path=ViewModel.LockMachinesShortcut, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>

                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_Switch2AllPcShortcut" HeaderIcon="{ui:FontIcon Glyph=&#xEDA7;}">
                        <controls:ShortcutControl
                            MinWidth="{StaticResource SettingActionControlMinWidth}"
                            AllowDisable="True"
                            HotkeySettings="{x:Bind Path=ViewModel.HotKeySwitch2AllPC, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>

                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_ReconnectShortcut" HeaderIcon="{ui:FontIcon Glyph=&#xEDA7;}">
                        <controls:ShortcutControl
                            MinWidth="{StaticResource SettingActionControlMinWidth}"
                            AllowDisable="True"
                            HotkeySettings="{x:Bind Path=ViewModel.ReconnectShortcut, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>

                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_SwitchBetweenMachineShortcut" HeaderIcon="{ui:FontIcon Glyph=&#xE92E;}">
                        <ComboBox MinWidth="{StaticResource SettingActionControlMinWidth}" SelectedIndex="{x:Bind Path=ViewModel.SelectedSwitchBetweenMachineShortcutOptionsIndex, Mode=TwoWay}">
                            <!--  These should be in the same order as the array items in MouseWithoutBordersViewModel.cs  -->
                            <ComboBoxItem x:Uid="MouseWithoutBorders_SwitchBetweenMachineShortcut_F1" />
                            <ComboBoxItem x:Uid="MouseWithoutBorders_SwitchBetweenMachineShortcut_1" />
                            <ComboBoxItem x:Uid="MouseWithoutBorders_SwitchBetweenMachineShortcut_Disabled" />
                        </ComboBox>
                    </tkcontrols:SettingsCard>
                </controls:SettingsGroup>
                <controls:SettingsGroup x:Uid="MouseWithoutBorders_AdvancedSettings_Group" IsEnabled="{x:Bind ViewModel.IsEnabled, Mode=OneWay}">
                    <tkcontrols:SettingsExpander x:Uid="MouseWithoutBorders_IPAddressMapping" IsExpanded="True">
                        <tkcontrols:SettingsExpander.Items>
                            <tkcontrols:SettingsCard HorizontalContentAlignment="Stretch" ContentAlignment="Vertical">
                                <TextBox
                                    x:Uid="MouseWithoutBorders_IPAddressMapping_TextBoxControl"
                                    MinWidth="240"
                                    MinHeight="160"
                                    AcceptsReturn="True"
                                    ScrollViewer.IsVerticalRailEnabled="True"
                                    ScrollViewer.VerticalScrollBarVisibility="Visible"
                                    ScrollViewer.VerticalScrollMode="Enabled"
                                    Text="{x:Bind ViewModel.Name2IP, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                    TextWrapping="Wrap" />
                            </tkcontrols:SettingsCard>
                        </tkcontrols:SettingsExpander.Items>
                    </tkcontrols:SettingsExpander>
                </controls:SettingsGroup>
                <controls:SettingsGroup x:Uid="MouseWithoutBorders_TroubleShooting" IsEnabled="{x:Bind ViewModel.IsEnabled, Mode=OneWay}">
                    <tkcontrols:SettingsCard
                        x:Uid="MouseWithoutBorders_AddFirewallRuleButtonControl"
                        ActionIcon="{ui:FontIcon Glyph=&#xE8A7;}"
                        Command="{x:Bind ViewModel.AddFirewallRuleEventHandler}"
                        IsClickEnabled="True" />
                    <tkcontrols:SettingsCard x:Uid="MouseWithoutBorders_ShowOriginalUI">
                        <ToggleSwitch
                            x:Uid="MouseWithoutBorders_ShowOriginalUI_ToggleSwitch"
                            IsEnabled="{x:Bind ViewModel.IsEnabled, Mode=OneWay}"
                            IsOn="{x:Bind ViewModel.ShowOriginalUI, Mode=TwoWay}" />
                    </tkcontrols:SettingsCard>
                </controls:SettingsGroup>
            </StackPanel>
        </controls:SettingsPageControl.ModuleContent>
        <controls:SettingsPageControl.PrimaryLinks>
            <controls:PageLink x:Uid="LearnMore_MouseWithoutBorders" Link="https://aka.ms/PowerToysOverview_MouseWithoutBorders" />
        </controls:SettingsPageControl.PrimaryLinks>
        <controls:SettingsPageControl.SecondaryLinks>
            <controls:PageLink Link="http://aka.ms/mm" Text="Mouse without Borders" />
            <controls:PageLink Link="https://github.com/microsoft/PowerToys/blob/main/COMMUNITY.md#mouse-without-borders-original-contributors" Text="Truong Do (Đỗ Đức Trường) and other original contributors" />
        </controls:SettingsPageControl.SecondaryLinks>
    </controls:SettingsPageControl>
</Page>
