Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 11ff450

Browse files
committed
add configurable option to exclude sourcefiles from being processed as soon as possible
git-tfs-id: [https://tfs.codeplex.com:443/tfs/TFS36]$/ResXResourceManager/Main;C37756
1 parent b918b08 commit 11ff450

10 files changed

Lines changed: 235 additions & 6 deletions

File tree

ResXManager.Model/Configuration.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,19 @@ public abstract class Configuration : ConfigurationBase
2828
{
2929
[NotNull]
3030
private readonly DispatcherThrottle _codeReferencesChangeThrottle;
31+
[NotNull]
32+
private readonly DispatcherThrottle _sourceFileExclusionFiltersChangeThrottle;
33+
3134
private CodeReferenceConfiguration _codeReferences;
35+
private SourceFileExclusionFilterConfiguration _sourceFileExclusionFilters;
3236

3337
protected Configuration([NotNull] ITracer tracer)
3438
: base(tracer)
3539
{
3640
Contract.Requires(tracer != null);
3741

3842
_codeReferencesChangeThrottle = new DispatcherThrottle(DispatcherPriority.ContextIdle, PersistCodeReferences);
43+
_sourceFileExclusionFiltersChangeThrottle = new DispatcherThrottle(DispatcherPriority.ContextIdle, PersistSourceFileExclusionFilters);
3944
}
4045

4146
[NotNull]
@@ -49,6 +54,17 @@ public CodeReferenceConfiguration CodeReferences
4954
}
5055
}
5156

57+
[NotNull]
58+
public SourceFileExclusionFilterConfiguration SourceFileExclusionFilters
59+
{
60+
get
61+
{
62+
Contract.Ensures(Contract.Result<SourceFileExclusionFilterConfiguration>() != null);
63+
64+
return _sourceFileExclusionFilters ?? LoadSourceFileExclusionFilterConfiguration();
65+
}
66+
}
67+
5268
public bool SaveFilesImmediatelyUponChange
5369
{
5470
get
@@ -196,6 +212,7 @@ public void Reload()
196212
protected virtual void OnReload()
197213
{
198214
_codeReferences = null;
215+
_sourceFileExclusionFilters = null;
199216

200217
// ReSharper disable once PossibleNullReferenceException
201218
GetType().GetProperties().ForEach(p => OnPropertyChanged(p.Name));
@@ -219,12 +236,31 @@ private CodeReferenceConfiguration LoadCodeReferenceConfiguration()
219236
return _codeReferences;
220237
}
221238

239+
private void PersistSourceFileExclusionFilters()
240+
{
241+
// ReSharper disable once ExplicitCallerInfoArgument
242+
SetValue(SourceFileExclusionFilters, nameof(SourceFileExclusionFilters));
243+
}
244+
245+
[NotNull]
246+
private SourceFileExclusionFilterConfiguration LoadSourceFileExclusionFilterConfiguration()
247+
{
248+
Contract.Ensures(Contract.Result<SourceFileExclusionFilterConfiguration>() != null);
249+
250+
// ReSharper disable once ExplicitCallerInfoArgument
251+
_sourceFileExclusionFilters = GetValue(default(SourceFileExclusionFilterConfiguration), nameof(SourceFileExclusionFilters)) ?? SourceFileExclusionFilterConfiguration.Default;
252+
_sourceFileExclusionFilters.ItemPropertyChanged += (_, __) => _sourceFileExclusionFiltersChangeThrottle.Tick();
253+
254+
return _sourceFileExclusionFilters;
255+
}
256+
222257
[ContractInvariantMethod]
223258
[SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "Required for code contracts.")]
224259
[Conditional("CONTRACTS_FULL")]
225260
private void ObjectInvariant()
226261
{
227262
Contract.Invariant(_codeReferencesChangeThrottle != null);
263+
Contract.Invariant(_sourceFileExclusionFiltersChangeThrottle != null);
228264
}
229265
}
230266
}

ResXManager.Model/ResXManager.Model.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@
184184
<Compile Include="..\Version.cs">
185185
<Link>Version.cs</Link>
186186
</Compile>
187+
<Compile Include="SourceFileExclusionFilterConfiguration.cs" />
187188
<Compile Include="CodeReferenceConfiguration.cs" />
188189
<Compile Include="ColumnKind.cs" />
189190
<Compile Include="Configuration.cs" />

ResXManager.Model/ResourceManagerExtensions.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Diagnostics.Contracts;
55
using System.IO;
66
using System.Linq;
7+
using System.Text.RegularExpressions;
78

89
using JetBrains.Annotations;
910

@@ -13,19 +14,25 @@
1314
public static class ResourceManagerExtensions
1415
{
1516
[NotNull]
16-
public static IList<ProjectFile> GetAllSourceFiles([NotNull] this DirectoryInfo solutionFolder, [NotNull] ISourceFileFilter sourceFileFilter)
17+
public static IList<ProjectFile> GetAllSourceFiles([NotNull] this DirectoryInfo solutionFolder, [NotNull] Configuration configuration, [NotNull] ISourceFileFilter sourceFileFilter)
1718
{
18-
1919
Contract.Requires(solutionFolder != null);
20+
Contract.Requires(configuration != null);
2021
Contract.Requires(sourceFileFilter != null);
2122
Contract.Ensures(Contract.Result<IList<ProjectFile>>() != null);
2223

24+
var sourceFileExclusionFilters = configuration.SourceFileExclusionFilters.Items
25+
.Where(sourceFileExclusionFilter => !string.IsNullOrEmpty(sourceFileExclusionFilter.Expression))
26+
.Select(sourceFileExclusionFilter => new Regex(sourceFileExclusionFilter.Expression, RegexOptions.IgnoreCase | RegexOptions.Singleline))
27+
.ToArray();
28+
2329
var solutionFolderLength = solutionFolder.FullName.Length + 1;
2430

2531
var fileInfos = solutionFolder.EnumerateFiles("*.*", SearchOption.AllDirectories);
2632
Contract.Assume(fileInfos != null);
2733

2834
var allProjectFiles = fileInfos
35+
.Where(fileInfo => !sourceFileExclusionFilters.Any(sourceFileExclusionFilter => sourceFileExclusionFilter.IsMatch(fileInfo.FullName)))
2936
.Select(fileInfo => new ProjectFile(fileInfo.FullName, solutionFolder.FullName, @"<unknown>", null))
3037
.Where(file => file.IsResourceFile() || sourceFileFilter.IsSourceFile(file))
3138
.ToArray();
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
namespace tomenglertde.ResXManager.Model
2+
{
3+
using System;
4+
using System.Collections.ObjectModel;
5+
using System.ComponentModel;
6+
using System.Diagnostics;
7+
using System.Diagnostics.CodeAnalysis;
8+
using System.Diagnostics.Contracts;
9+
using System.Runtime.Serialization;
10+
11+
using JetBrains.Annotations;
12+
13+
using TomsToolbox.ObservableCollections;
14+
15+
[DataContract]
16+
public class SourceFileExclusionFilterConfigurationItem : INotifyPropertyChanged
17+
{
18+
private string _expression;
19+
20+
[DataMember]
21+
public string Expression
22+
{
23+
get
24+
{
25+
return _expression;
26+
}
27+
set
28+
{
29+
SetProperty(ref _expression, value, nameof(Expression));
30+
}
31+
}
32+
33+
#region INotifyPropertyChanged implementation
34+
35+
public event PropertyChangedEventHandler PropertyChanged;
36+
37+
[NotifyPropertyChangedInvocator]
38+
private void SetProperty<T>(ref T backingField, T value, [NotNull] string propertyName)
39+
{
40+
Contract.Requires(!string.IsNullOrEmpty(propertyName));
41+
42+
if (Equals(backingField, value))
43+
return;
44+
45+
backingField = value;
46+
47+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
48+
}
49+
50+
#endregion
51+
}
52+
53+
[KnownType(typeof(SourceFileExclusionFilterConfigurationItem))]
54+
[DataContract]
55+
[TypeConverter(typeof(JsonSerializerTypeConverter<SourceFileExclusionFilterConfiguration>))]
56+
public class SourceFileExclusionFilterConfiguration
57+
{
58+
private ObservableCollection<SourceFileExclusionFilterConfigurationItem> _items;
59+
private ObservablePropertyChangeTracker<SourceFileExclusionFilterConfigurationItem> _changeTracker;
60+
61+
[DataMember(Name = "Items")]
62+
[NotNull]
63+
public ObservableCollection<SourceFileExclusionFilterConfigurationItem> Items
64+
{
65+
get
66+
{
67+
Contract.Ensures(Contract.Result<ObservableCollection<SourceFileExclusionFilterConfigurationItem>>() != null);
68+
CreateCollection();
69+
// ReSharper disable once AssignNullToNotNullAttribute
70+
return _items;
71+
}
72+
}
73+
74+
public event EventHandler<PropertyChangedEventArgs> ItemPropertyChanged
75+
{
76+
add
77+
{
78+
CreateCollection();
79+
// ReSharper disable once PossibleNullReferenceException
80+
_changeTracker.ItemPropertyChanged += value;
81+
}
82+
remove
83+
{
84+
CreateCollection();
85+
// ReSharper disable once PossibleNullReferenceException
86+
_changeTracker.ItemPropertyChanged -= value;
87+
}
88+
}
89+
90+
[NotNull]
91+
public static SourceFileExclusionFilterConfiguration Default
92+
{
93+
get
94+
{
95+
Contract.Ensures(Contract.Result<SourceFileExclusionFilterConfiguration>() != null);
96+
97+
var value = new SourceFileExclusionFilterConfiguration();
98+
99+
value.Add(@"Migrations\\\d{15}");
100+
101+
return value;
102+
}
103+
}
104+
105+
private void Add(string expression)
106+
{
107+
Items.Add(
108+
new SourceFileExclusionFilterConfigurationItem
109+
{
110+
Expression = expression
111+
});
112+
}
113+
114+
private void CreateCollection()
115+
{
116+
Contract.Ensures(_items != null);
117+
Contract.Ensures(_changeTracker != null);
118+
119+
if (_items != null)
120+
return;
121+
122+
_items = new ObservableCollection<SourceFileExclusionFilterConfigurationItem>();
123+
_changeTracker = new ObservablePropertyChangeTracker<SourceFileExclusionFilterConfigurationItem>(_items);
124+
}
125+
126+
[ContractInvariantMethod]
127+
[SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "Required for code contracts.")]
128+
[Conditional("CONTRACTS_FULL")]
129+
private void ObjectInvariant()
130+
{
131+
Contract.Invariant((_items == null) || (_changeTracker != null));
132+
}
133+
}
134+
}

ResXManager.Scripting/SourceFilesProvider.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,28 @@ namespace ResXManager.Scripting
33
using System;
44
using System.Collections.Generic;
55
using System.ComponentModel.Composition;
6+
using System.Diagnostics.Contracts;
67
using System.IO;
78

9+
using JetBrains.Annotations;
10+
811
using tomenglertde.ResXManager.Model;
912

1013
[Export]
1114
[Export(typeof(ISourceFilesProvider))]
1215
internal class SourceFilesProvider : ISourceFilesProvider, ISourceFileFilter
1316
{
17+
[NotNull]
18+
private readonly Configuration _configuration;
19+
20+
[ImportingConstructor]
21+
public SourceFilesProvider([NotNull] Configuration configuration)
22+
{
23+
Contract.Requires(configuration != null);
24+
25+
_configuration = configuration;
26+
}
27+
1428
public string Folder { get; set; }
1529

1630
public IList<ProjectFile> SourceFiles
@@ -21,7 +35,7 @@ public IList<ProjectFile> SourceFiles
2135
if (String.IsNullOrEmpty(folder))
2236
return new ProjectFile[0];
2337

24-
return new DirectoryInfo(folder).GetAllSourceFiles(this);
38+
return new DirectoryInfo(folder).GetAllSourceFiles(_configuration, this);
2539
}
2640
}
2741

ResXManager.View/Properties/Resources.Designer.cs

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

ResXManager.View/Properties/Resources.de.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,4 +401,7 @@ Z.B. ".* - (?!Migrations)" um EF Migrationsdateien auszublenden.</value>
401401
<data name="UnloadSnapshot" xml:space="preserve">
402402
<value>Snapshot entladen</value>
403403
</data>
404+
<data name="SourceFileExclusionFilters_Header" xml:space="preserve">
405+
<value>*Source file exclusion filters</value>
406+
</data>
404407
</root>

ResXManager.View/Properties/Resources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,4 +410,7 @@ Use e.g. ".* - (?!Migrations)" to hide EF migrations.</value>
410410
<data name="UnloadSnapshot" xml:space="preserve">
411411
<value>Unload Snapshot</value>
412412
</data>
413+
<data name="SourceFileExclusionFilters_Header" xml:space="preserve">
414+
<value>Source file exclusion filters</value>
415+
</data>
413416
</root>

ResXManager.View/Visuals/ConfigurationEditorView.xaml

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,9 @@
152152
<Decorator Height="5" />
153153

154154
<GroupBox Header="{x:Static properties:Resources.Diagnostics}" Style="{StaticResource GroupStyle}">
155-
<CheckBox Margin="10"
155+
<CheckBox Margin="10"
156156
Style="{StaticResource {x:Static styles:ResourceKeys.CheckBoxStyle}}"
157-
Content="{x:Static properties:Resources.ShowPerformanceTraces}"
157+
Content="{x:Static properties:Resources.ShowPerformanceTraces}"
158158
IsChecked="{Binding Configuration.ShowPerformanceTraces}"/>
159159
</GroupBox>
160160

@@ -177,6 +177,22 @@
177177
</DataGrid>
178178
</GroupBox>
179179

180+
<Decorator Height="5" />
181+
182+
<GroupBox Header="{x:Static properties:Resources.SourceFileExclusionFilters_Header}" Style="{StaticResource GroupStyle}">
183+
<DataGrid ItemsSource="{Binding Configuration.SourceFileExclusionFilters.Items}"
184+
AutoGenerateColumns="False" CanUserReorderColumns="False" CanUserResizeRows="False"
185+
Style="{DynamicResource {x:Static styles:ResourceKeys.DataGridStyle}}"
186+
Margin="10" MinHeight="50" MaxHeight="250" MinWidth="700">
187+
<DataGrid.Columns>
188+
<DataGridTextColumn Header="{x:Static properties:Resources.RegularExpression}" Binding="{Binding Expression}" Width="5*" />
189+
</DataGrid.Columns>
190+
<i:Interaction.Behaviors>
191+
<dgx:ExtendedStarSizeBehavior ResourceLocator="{StaticResource ResourceLocator}" />
192+
</i:Interaction.Behaviors>
193+
</DataGrid>
194+
</GroupBox>
195+
180196
<ItemsControl toms:VisualComposition.RegionId="{x:Static infrastructure:RegionId.Configuration}">
181197
<ItemsControl.ItemTemplate>
182198
<DataTemplate>

ResXManager/MainViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ public IList<ProjectFile> SourceFiles
273273
if (string.IsNullOrEmpty(folder))
274274
return new ProjectFile[0];
275275

276-
return new DirectoryInfo(folder).GetAllSourceFiles(new SourceFileFilter(_configuration));
276+
return new DirectoryInfo(folder).GetAllSourceFiles(_configuration, new SourceFileFilter(_configuration));
277277
}
278278
}
279279

0 commit comments

Comments
 (0)