Skip to content

Commit 0559303

Browse files
authored
Merge pull request #4380 from comintern/indenter
Fixes handling of vertical spacing in indenter; adds a setting to configure handling of empty lines.
2 parents 6d4087b + 205846e commit 0559303

16 files changed

+360
-7
lines changed

Rubberduck.Core/Rubberduck.Core.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,9 @@
382382
<Compile Include="AutoComplete\AutoCompleteClosingParenthese.cs" />
383383
<Compile Include="AutoComplete\AutoCompleteClosingString.cs" />
384384
<Compile Include="AutoComplete\AutoCompleteService.cs" />
385+
<Compile Include="UI\Settings\Converters\EmptyLineHandlingToTextConverter.cs" />
386+
<Compile Include="UI\Settings\Converters\EmptyLineHandlingValueTextToEnumValueConverter.cs" />
387+
<Compile Include="UI\Settings\Converters\EnumToBooleanConverter.cs" />
385388
<Compile Include="UI\UnitTesting\Commands\AddTestModuleWithStubsCommand.cs" />
386389
<Compile Include="UI\CodeExplorer\Commands\AddPropertyPageCommand.cs" />
387390
<Compile Include="UI\CodeExplorer\Commands\AddUserDocumentCommand.cs" />
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Globalization;
4+
using System.Linq;
5+
using System.Windows.Data;
6+
using Rubberduck.Resources;
7+
using Rubberduck.SmartIndenter;
8+
9+
namespace Rubberduck.UI.Settings.Converters
10+
{
11+
public class EmptyLineHandlingToTextConverter : IValueConverter
12+
{
13+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
14+
{
15+
var styles = (IEnumerable<EmptyLineHandling>)value;
16+
return styles.Select(s => RubberduckUI.ResourceManager.GetString("EmptyLineHandling_" + s, CultureInfo.CurrentUICulture)).ToArray();
17+
}
18+
19+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
20+
{
21+
return value;
22+
}
23+
}
24+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Linq;
4+
using System.Windows.Data;
5+
using Rubberduck.Resources;
6+
using Rubberduck.SmartIndenter;
7+
8+
namespace Rubberduck.UI.Settings.Converters
9+
{
10+
public class EmptyLineHandlingValueTextToEnumValueConverter : IValueConverter
11+
{
12+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
13+
{
14+
var enumValue = (EmptyLineHandling)value;
15+
return RubberduckUI.ResourceManager.GetString("EmptyLineHandling_" + enumValue, CultureInfo.CurrentUICulture);
16+
}
17+
18+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
19+
{
20+
var selectedString = (string)value;
21+
22+
var values = Enum.GetValues(typeof(EmptyLineHandling)).OfType<EmptyLineHandling>();
23+
24+
foreach (var v in values.Where(v =>
25+
RubberduckUI.ResourceManager.GetString("EmptyLineHandling_" + v, CultureInfo.CurrentUICulture) == selectedString))
26+
{
27+
return v;
28+
}
29+
30+
return value;
31+
}
32+
}
33+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using System.Windows.Data;
3+
4+
namespace Rubberduck.UI.Settings.Converters
5+
{
6+
//Thanks to https://stackoverflow.com/a/2908885/4088852
7+
public class EnumToBooleanConverter : IValueConverter
8+
{
9+
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
10+
{
11+
return value != null && value.Equals(parameter);
12+
}
13+
14+
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
15+
{
16+
return value != null && value.Equals(true) ? parameter : Binding.DoNothing;
17+
}
18+
}
19+
}

Rubberduck.Core/UI/Settings/IndenterSettings.xaml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,24 @@
1212
<converters:EndOfLineCommentStyleToVisibilityConverter x:Key="EndOfLineCommentStyleToVisibility"/>
1313
<converters:EndOfLineCommentStyleToTextConverter x:Key="LocalizedEndOfLineCommentStyles"/>
1414
<converters:EndOfLineCommentStyleValueTextToEnumValueConverter x:Key="EndOfLineCommentStyleTextToEnumValue"/>
15+
16+
<converters:EmptyLineHandlingToTextConverter x:Key="LocalizedEmptyLineHandlers"/>
17+
<converters:EmptyLineHandlingValueTextToEnumValueConverter x:Key="EmptyLineHandlingValueTextToEnumValue"/>
18+
1519
<ObjectDataProvider x:Key="CommentStyles"
1620
MethodName="GetValues"
1721
ObjectType="{x:Type core:Enum}">
1822
<ObjectDataProvider.MethodParameters>
1923
<x:TypeExtension Type="{x:Type smartIndenter:EndOfLineCommentStyle}"/>
2024
</ObjectDataProvider.MethodParameters>
2125
</ObjectDataProvider>
26+
<ObjectDataProvider x:Key="EmptyLineOptions"
27+
MethodName="GetValues"
28+
ObjectType="{x:Type core:Enum}">
29+
<ObjectDataProvider.MethodParameters>
30+
<x:TypeExtension Type="{x:Type smartIndenter:EmptyLineHandling}"/>
31+
</ObjectDataProvider.MethodParameters>
32+
</ObjectDataProvider>
2233
</UserControl.Resources>
2334
<ScrollViewer Margin="0,0,10,0">
2435
<StackPanel Margin="5">
@@ -299,6 +310,13 @@
299310
</AccessText.Text>
300311
</AccessText>
301312
</CheckBox>
313+
<Label FontWeight="SemiBold" HorizontalAlignment="Left">
314+
<Resx ResxName="Rubberduck.Resources.RubberduckUI" Key="IndenterSettings_EmptyLineHeading"/>
315+
</Label>
316+
<ComboBox Margin="5,0,0,5"
317+
HorizontalAlignment="Left"
318+
ItemsSource="{Binding Source={StaticResource EmptyLineOptions},Converter={StaticResource LocalizedEmptyLineHandlers},UpdateSourceTrigger=PropertyChanged}"
319+
SelectedItem="{Binding EmptyLineHandlingMethod,Mode=TwoWay,Converter={StaticResource EmptyLineHandlingValueTextToEnumValue},UpdateSourceTrigger=PropertyChanged}"/>
302320
</StackPanel>
303321
</Expander>
304322
<Expander Grid.Row="3"

Rubberduck.Core/UI/Settings/IndenterSettingsViewModel.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,20 @@ public EndOfLineCommentStyle EndOfLineCommentStyle
151151
}
152152
}
153153

154+
private EmptyLineHandling _emptyLineHandlingMethod;
155+
public EmptyLineHandling EmptyLineHandlingMethod
156+
{
157+
get => _emptyLineHandlingMethod;
158+
set
159+
{
160+
if (_emptyLineHandlingMethod != value)
161+
{
162+
_emptyLineHandlingMethod = value;
163+
OnPropertyChanged();
164+
}
165+
}
166+
}
167+
154168
private bool _forceCompilerDirectivesInColumn1;
155169
public bool ForceCompilerDirectivesInColumn1
156170
{
@@ -398,6 +412,7 @@ private IIndenterSettings GetCurrentSettings()
398412
AlignDims = AlignDims,
399413
EndOfLineCommentColumnSpaceAlignment = EndOfLineCommentColumnSpaceAlignment,
400414
EndOfLineCommentStyle = EndOfLineCommentStyle,
415+
EmptyLineHandlingMethod = EmptyLineHandlingMethod,
401416
ForceCompilerDirectivesInColumn1 = ForceCompilerDirectivesInColumn1,
402417
ForceDebugStatementsInColumn1 = ForceDebugStatementsInColumn1,
403418
ForceDebugPrintInColumn1 = ForceDebugPrintInColumn1,
@@ -427,6 +442,7 @@ public void UpdateConfig(Configuration config)
427442
config.UserSettings.IndenterSettings.AlignDims = AlignDims;
428443
config.UserSettings.IndenterSettings.EndOfLineCommentColumnSpaceAlignment = EndOfLineCommentColumnSpaceAlignment;
429444
config.UserSettings.IndenterSettings.EndOfLineCommentStyle = EndOfLineCommentStyle;
445+
config.UserSettings.IndenterSettings.EmptyLineHandlingMethod = EmptyLineHandlingMethod;
430446
config.UserSettings.IndenterSettings.ForceCompilerDirectivesInColumn1 = ForceCompilerDirectivesInColumn1;
431447
config.UserSettings.IndenterSettings.ForceDebugStatementsInColumn1 = ForceDebugStatementsInColumn1;
432448
config.UserSettings.IndenterSettings.ForceDebugPrintInColumn1 = ForceDebugPrintInColumn1;
@@ -458,6 +474,7 @@ private void TransferSettingsToView(IIndenterSettings toLoad)
458474
AlignDims = toLoad.AlignDims;
459475
EndOfLineCommentColumnSpaceAlignment = toLoad.EndOfLineCommentColumnSpaceAlignment;
460476
EndOfLineCommentStyle = toLoad.EndOfLineCommentStyle;
477+
EmptyLineHandlingMethod = toLoad.EmptyLineHandlingMethod;
461478
ForceCompilerDirectivesInColumn1 = toLoad.ForceCompilerDirectivesInColumn1;
462479
ForceDebugStatementsInColumn1 = toLoad.ForceDebugStatementsInColumn1;
463480
ForceDebugPrintInColumn1 = toLoad.ForceDebugPrintInColumn1;

Rubberduck.Resources/RubberduckUI.Designer.cs

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.Resources/RubberduckUI.resx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,4 +1303,16 @@ NOTE: Restart is required for the setting to take effect.</value>
13031303
<data name="Language_CS" xml:space="preserve">
13041304
<value>Czech</value>
13051305
</data>
1306+
<data name="EmptyLineHandling_Ignore" xml:space="preserve">
1307+
<value>Ignore</value>
1308+
</data>
1309+
<data name="EmptyLineHandling_Indent" xml:space="preserve">
1310+
<value>Indent</value>
1311+
</data>
1312+
<data name="EmptyLineHandling_Remove" xml:space="preserve">
1313+
<value>Remove</value>
1314+
</data>
1315+
<data name="IndenterSettings_EmptyLineHeading" xml:space="preserve">
1316+
<value>Empty line handling:</value>
1317+
</data>
13061318
</root>

Rubberduck.SmartIndenter/AbsoluteCodeLine.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,20 @@ private int MultipleCaseAdjustment()
228228

229229
public string Indent(int indents, bool atProcStart, bool absolute = false)
230230
{
231-
if (IsEmpty || (ContainsOnlyComment && !_settings.AlignCommentsWithCode && !absolute))
231+
if (IsEmpty)
232+
{
233+
switch (_settings.EmptyLineHandlingMethod)
234+
{
235+
case EmptyLineHandling.Ignore:
236+
return Original;
237+
case EmptyLineHandling.Remove:
238+
return string.Empty;
239+
case EmptyLineHandling.Indent:
240+
return new string(' ', _settings.IndentSpaces * indents);
241+
}
242+
}
243+
244+
if (ContainsOnlyComment && !_settings.AlignCommentsWithCode && !absolute)
232245
{
233246
return Original;
234247
}

Rubberduck.SmartIndenter/IIndenterSettings.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public interface IIndenterSettings
2020
bool AlignDims { get; set; }
2121
int AlignDimColumn { get; set; }
2222
EndOfLineCommentStyle EndOfLineCommentStyle { get; set; }
23+
EmptyLineHandling EmptyLineHandlingMethod { get; set; }
2324
int EndOfLineCommentColumnSpaceAlignment { get; set; }
2425
int IndentSpaces { get; set; }
2526
bool VerticallySpaceProcedures { get; set; }
@@ -35,4 +36,11 @@ public enum EndOfLineCommentStyle
3536
StandardGap,
3637
AlignInColumn
3738
}
39+
40+
public enum EmptyLineHandling
41+
{
42+
Ignore,
43+
Remove,
44+
Indent
45+
}
3846
}

0 commit comments

Comments
 (0)