Skip to content

Commit

Permalink
Add popup with choice of Accept or Won't Fix (#5046)
Browse files Browse the repository at this point in the history
Fixes #5032
  • Loading branch information
ugras-ergun-sonarsource committed Dec 11, 2023
1 parent 8d1f4ac commit 7894f7c
Show file tree
Hide file tree
Showing 5 changed files with 308 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/Integration/Integration.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,13 @@
<None Remove="Connection\UI\OrganizationSelectionWindow.xaml" />
<None Remove="Notifications\NotificationIndicator.xaml" />
<None Remove="Progress\ProgressControl.xaml" />
<None Remove="Transition\MuteWindowDialog.xaml" />

<Page Include="Connection\UI\ConnectionInfoDialogView.xaml" />
<Page Include="Connection\UI\OrganizationSelectionWindow.xaml" />
<Page Include="Notifications\NotificationIndicator.xaml" />
<Page Include="Progress\ProgressControl.xaml" />
<Page Include="Transition\MuteWindowDialog.xaml" />
</ItemGroup>

<ItemGroup>
Expand Down
91 changes: 91 additions & 0 deletions src/Integration/Resources/Strings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions src/Integration/Resources/Strings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -574,4 +574,34 @@ This is the general format to use when writing errors to output window or when t
<data name="BindingUpdateFailedToCheckSettings" xml:space="preserve">
<value>[Binding check] Error checking bound project settings file: {0}</value>
</data>
<data name="MuteWindow_AcceptContent" xml:space="preserve">
<value>The issue is valid but does not need fixing. It represents accepted technical debt.</value>
</data>
<data name="MuteWindow_AcceptTitle" xml:space="preserve">
<value>Accept</value>
</data>
<data name="MuteWindow_CancelButton" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="MuteWindow_CommentLabel" xml:space="preserve">
<value>Add a comment (optional):</value>
</data>
<data name="MuteWindow_FalsePositiveContent" xml:space="preserve">
<value>The issue is raised unxpectedly on code that should not trigger an issue.</value>
</data>
<data name="MuteWindow_FalsePositiveTitle" xml:space="preserve">
<value>False Positive</value>
</data>
<data name="MuteWindow_SubmitButton" xml:space="preserve">
<value>Mark Issue as...</value>
</data>
<data name="MuteWindow_Title" xml:space="preserve">
<value>Mark Issue as Resolved on SonarQube</value>
</data>
<data name="MuteWindow_WontFixContent" xml:space="preserve">
<value>The issue is valid but does not need fixing. It represents accepted technical debt.</value>
</data>
<data name="MuteWindow_WontFixTitle" xml:space="preserve">
<value>Won't Fix</value>
</data>
</root>
101 changes: 101 additions & 0 deletions src/Integration/Transition/MuteWindowDialog.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<vsui:DialogWindow x:Class="SonarLint.VisualStudio.Integration.Transition.MuteWindowDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:resx="clr-namespace:SonarLint.VisualStudio.Integration.Resources"
xmlns:local="clr-namespace:SonarLint.VisualStudio.Integration.Transition"
xmlns:vsui="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.15.0"
mc:Ignorable="d"
SizeToContent="WidthAndHeight"
Title="{x:Static resx:Strings.MuteWindow_Title}">
<vsui:DialogWindow.Resources>
<Style x:Key="RadioButtonStyle" TargetType="RadioButton">
<Setter Property="GroupName" Value="Transitions" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="Margin" Value="10,16,-10,0" />
<Setter Property="FontWeight" Value="Bold" />
</Style>
<Style x:Key="BorderStyle" TargetType="Border">
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="Height" Value="75" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="Width" Value="450" />
</Style>
<Style x:Key="LabelStyle" TargetType="Label">
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="Margin" Value="25,200,0,0" />
</Style>
<Style x:Key="TransitionLabelStyle" BasedOn="{StaticResource LabelStyle}" TargetType="Label">
<Setter Property="Margin" Value="10,36,0,0" />
</Style>
<Style x:Key="ButtonStyle" TargetType="Button">
<Setter Property="Padding" Value="5,1"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="VerticalAlignment" Value="Top"/>
</Style>
<Style x:Key="CancelButtonStyle" BasedOn="{StaticResource ButtonStyle}" TargetType="Button">
<Setter Property="Margin" Value="300,300,0,0"/>
</Style>
<Style x:Key="SubmitButtonStyle" TargetType="Button" BasedOn="{StaticResource ButtonStyle}">
<Setter Property="Margin" Value="360,300,0,0" />
<Setter Property="IsEnabled" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsChecked, ElementName=rbWontFix}" Value="True">
<Setter Property="IsEnabled" Value="True"/>
</DataTrigger>

<DataTrigger Binding="{Binding Path=IsChecked, ElementName=rbAccept}" Value="True">
<Setter Property="IsEnabled" Value="True"/>
</DataTrigger>

<DataTrigger Binding="{Binding Path=IsChecked, ElementName=rbFalsePositive}" Value="True">
<Setter Property="IsEnabled" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="TextStyle" TargetType="TextBox">
<Setter Property="Margin" Value="0,225,0,0" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="Height" Value="60" />
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="Width" Value="450" />
</Style>
<Style x:Key="TopBorderStyle" BasedOn="{StaticResource BorderStyle}" TargetType="Border">
<Setter Property="Margin" Value="25,25,0,0" />
</Style>
<Style x:Key="BottomBorderStyle" BasedOn="{StaticResource BorderStyle}" TargetType="Border">
<Setter Property="Margin" Value="25,115,0,0" />
</Style>
</vsui:DialogWindow.Resources>
<Grid Height="350" Width="500">
<Border Name="BorderWontFix" Style="{StaticResource TopBorderStyle}" Visibility="{Binding WontFixVisibility}">
<Grid>
<RadioButton Name="rbWontFix" Content="{x:Static resx:Strings.MuteWindow_WontFixTitle}" Style="{StaticResource RadioButtonStyle}" Checked="RadioButton_Checked"/>
<Label Content="{x:Static resx:Strings.MuteWindow_WontFixContent}" Style="{StaticResource TransitionLabelStyle}" />
</Grid>
</Border>

<Border Name="BorderAccept" Style="{StaticResource TopBorderStyle}" Visibility="{Binding AcceptVisibility}">
<Grid>
<RadioButton Name="rbAccept" Content="{x:Static resx:Strings.MuteWindow_AcceptTitle}" Style="{StaticResource RadioButtonStyle}" Checked="RadioButton_Checked"/>
<Label Content="{x:Static resx:Strings.MuteWindow_AcceptContent}" Style="{StaticResource TransitionLabelStyle}" />
</Grid>
</Border>

<Border Style="{StaticResource BottomBorderStyle}">
<Grid>
<RadioButton x:Name="rbFalsePositive" Content="{x:Static resx:Strings.MuteWindow_FalsePositiveTitle}" Style="{StaticResource RadioButtonStyle}" Checked="RadioButton_Checked"/>
<Label Content="{x:Static resx:Strings.MuteWindow_FalsePositiveContent}" Style="{StaticResource TransitionLabelStyle}" />
</Grid>
</Border>
<Label Content="{x:Static resx:Strings.MuteWindow_CommentLabel}" Style="{StaticResource LabelStyle}" />
<TextBox Name="txtComment" Style="{StaticResource TextStyle}"/>
<Button Name="Cancel" Content="{x:Static resx:Strings.MuteWindow_CancelButton}" Style="{StaticResource CancelButtonStyle}" Click="Cancel_Click"/>
<Button Name="Submit" Content="{x:Static resx:Strings.MuteWindow_SubmitButton}" Style="{StaticResource SubmitButtonStyle}" Click="Submit_Click"/>
</Grid>
</vsui:DialogWindow>
84 changes: 84 additions & 0 deletions src/Integration/Transition/MuteWindowDialog.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*
* SonarLint for Visual Studio
* Copyright (C) 2016-2023 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup;
using Microsoft.VisualStudio.PlatformUI;
using SonarQube.Client.Models;

namespace SonarLint.VisualStudio.Integration.Transition
{
/// <summary>
/// Interaction logic for UserControl1.xaml
/// </summary>
[ContentProperty(nameof(MuteWindowDialog))]
[ExcludeFromCodeCoverage]
public partial class MuteWindowDialog : DialogWindow
{
private readonly Dictionary<RadioButton, SonarQubeIssueTransition> Transitions;

public MuteWindowDialog(bool showAccept)
{
InitializeComponent();

SetVisibility(showAccept);

Transitions = InitializeTransitions();
}

private Dictionary<RadioButton, SonarQubeIssueTransition> InitializeTransitions()
{
return new Dictionary<RadioButton, SonarQubeIssueTransition>
{
{ rbWontFix, SonarQubeIssueTransition.WontFix },
{ rbAccept, SonarQubeIssueTransition.Accept },
{ rbFalsePositive, SonarQubeIssueTransition.FalsePositive }
};
}

private void SetVisibility(bool showAccept)
{
BorderWontFix.Visibility = showAccept ? Visibility.Hidden : Visibility.Visible;
BorderAccept.Visibility = showAccept ? Visibility.Visible : Visibility.Hidden;
}

private void Cancel_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
}

private void Submit_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}

public SonarQubeIssueTransition? SelectedIssueTransition { get; private set; }

public string Comment => txtComment.Text;

private void RadioButton_Checked(object sender, RoutedEventArgs e)
{
SelectedIssueTransition = Transitions[(RadioButton)sender];
}
}
}

0 comments on commit 7894f7c

Please sign in to comment.