diff --git a/src/ResXManager.VSIX.Compatibility.Shared/Refactorings.cs b/src/ResXManager.VSIX.Compatibility.Shared/Refactorings.cs index e363a2a4..3f9eb123 100644 --- a/src/ResXManager.VSIX.Compatibility.Shared/Refactorings.cs +++ b/src/ResXManager.VSIX.Compatibility.Shared/Refactorings.cs @@ -127,12 +127,6 @@ public bool CanMoveToResource() .Where(entity => !entity.IsWinFormsDesignerResource) .ToList(); - var filter = EntityFilter.BuildFilter(Settings.Default.ResourceFilter); - if (filter != null) - { - entities.RemoveAll(item => !filter(item.ToString())); - } - var projectResources = new HashSet(GetResourceEntriesFromProject(document, entities)); // put resources from the same project on top diff --git a/src/ResXManager.View/Behaviors/EntityFilter.cs b/src/ResXManager.View/Behaviors/EntityFilter.cs index 0e72dc0d..a6d205c3 100644 --- a/src/ResXManager.View/Behaviors/EntityFilter.cs +++ b/src/ResXManager.View/Behaviors/EntityFilter.cs @@ -8,6 +8,7 @@ using Microsoft.Xaml.Behaviors; using ResXManager.Infrastructure; +using ResXManager.Model; using Throttle; @@ -40,7 +41,7 @@ private void FilterText_Changed() listBox.Items.Filter = BuildFilter(value); } - public static Predicate? BuildFilter(string? value) + private static Predicate? BuildFilter(string? value) { value = value?.Trim(); @@ -50,7 +51,7 @@ private void FilterText_Changed() try { var regex = new Regex(value, RegexOptions.IgnoreCase | RegexOptions.Singleline); - return item => regex.IsMatch(item?.ToString() ?? string.Empty); + return item => Filter(item, regex); } catch (ArgumentException) { @@ -59,7 +60,7 @@ private void FilterText_Changed() try { var regex = new Regex(value.Replace(@"\", @"\\", StringComparison.Ordinal), RegexOptions.IgnoreCase | RegexOptions.Singleline); - return item => regex.IsMatch(item?.ToString() ?? string.Empty); + return item => Filter(item, regex); } catch (ArgumentException) { @@ -68,6 +69,11 @@ private void FilterText_Changed() return null; } + private static bool Filter(object item, Regex regex) + { + return item is ResourceEntity entity && (regex.IsMatch(entity.DisplayName) || regex.IsMatch(entity.ProjectName)); + } + protected override void OnAttached() { base.OnAttached(); diff --git a/src/ResXManager.View/Visuals/ProjectFilterItem.cs b/src/ResXManager.View/Visuals/ProjectFilterItem.cs new file mode 100644 index 00000000..7df0c0a1 --- /dev/null +++ b/src/ResXManager.View/Visuals/ProjectFilterItem.cs @@ -0,0 +1,15 @@ +namespace ResXManager.View.Visuals; + +using System.Text.RegularExpressions; + +public class ProjectFilterItem(string displayName) +{ + public string DisplayName { get; } = displayName; + + public string SearchText { get; } = $"^{Regex.Escape(displayName)}$"; + + public override string ToString() + { + return SearchText; + } +} diff --git a/src/ResXManager.View/Visuals/ResourceView.xaml b/src/ResXManager.View/Visuals/ResourceView.xaml index 87eb3aab..72e69f34 100644 --- a/src/ResXManager.View/Visuals/ResourceView.xaml +++ b/src/ResXManager.View/Visuals/ResourceView.xaml @@ -107,8 +107,19 @@ VerticalAlignment="Center" HorizontalAlignment="Right" Margin="2,0" /> - + + + + + + + diff --git a/src/ResXManager.View/Visuals/ResourceViewModel.cs b/src/ResXManager.View/Visuals/ResourceViewModel.cs index cdff085c..9de4d12d 100644 --- a/src/ResXManager.View/Visuals/ResourceViewModel.cs +++ b/src/ResXManager.View/Visuals/ResourceViewModel.cs @@ -25,6 +25,7 @@ using ResXManager.View.Tools; using Throttle; + using TomsToolbox.Essentials; using TomsToolbox.ObservableCollections; using TomsToolbox.Wpf; @@ -55,15 +56,30 @@ public ResourceViewModel(ResourceManager resourceManager, IConfiguration configu _performanceTracer = performanceTracer; ResourceTableEntries = SelectedEntities.ObservableSelectMany(entity => entity.Entries); - ResourceTableEntries.CollectionChanged += (_, __) => ResourceTableEntries_CollectionChanged(); + ResourceTableEntries.CollectionChanged += (_, _) => ResourceTableEntries_CollectionChanged(); + + ResourceManager.ResourceEntities.CollectionChanged += (_, _) => ResourceEntities_OnCollectionChanged(); resourceManager.LanguageChanged += ResourceManager_LanguageChanged; } + [Throttled(typeof(DispatcherThrottle))] + private void ResourceEntities_OnCollectionChanged() + { + ProjectNames.Clear(); + ProjectNames.AddRange(ResourceManager.ResourceEntities + .Select(entity => entity.ProjectName) + .Distinct() + .OrderBy(name => name) + .Select(name => new ProjectFilterItem(name))); + } + internal event EventHandler? ClearFiltersRequest; public ResourceManager ResourceManager { get; } + public ObservableCollection ProjectNames { get; } = []; + public IObservableCollection ResourceTableEntries { get; } public ObservableCollection SelectedEntities { get; } = [];