From bf78f02ae32e093713a2d285840e33d8c93a02fb Mon Sep 17 00:00:00 2001 From: John Taylor Date: Fri, 5 Feb 2021 09:59:27 -0700 Subject: [PATCH 1/2] Added sorting and ctrl-enter shortcut --- src/CosmosDbExplorer/CosmosDbExplorer.csproj | 1 + .../Models/TreeViewItemViewModel.cs | 31 +++++++++++--- .../SortedObservableCollection.cs | 41 +++++++++++++++++++ .../AssetRootNodeViewModelBase.cs | 10 +---- .../CollectionMetricsNodeViewModel.cs | 3 +- .../DatabaseNodes/ConnectionNodeViewModel.cs | 2 +- .../DatabaseNodes/DocumentNodeViewModel.cs | 3 +- .../DatabaseNodes/PermissionNodeViewModel.cs | 2 +- .../ResourceNodeViewModelBase.cs | 2 +- .../ScaleSettingsNodeViewModel.cs | 3 +- .../StoredProcedureNodeViewModel.cs | 3 +- .../DatabaseNodes/TriggerNodeViewModel.cs | 3 +- .../DatabaseNodes/UserDefFuncNodeViewModel.cs | 3 +- .../DatabaseNodes/UserNodeViewModel.cs | 2 +- .../DatabaseNodes/UsersNodeViewModel.cs | 3 +- .../ViewModel/DatabaseViewModel.cs | 2 +- .../Views/QueryEditorView.xaml | 3 +- 17 files changed, 87 insertions(+), 30 deletions(-) create mode 100644 src/CosmosDbExplorer/Infrastructure/SortedObservableCollection.cs diff --git a/src/CosmosDbExplorer/CosmosDbExplorer.csproj b/src/CosmosDbExplorer/CosmosDbExplorer.csproj index 824d106..f693e76 100644 --- a/src/CosmosDbExplorer/CosmosDbExplorer.csproj +++ b/src/CosmosDbExplorer/CosmosDbExplorer.csproj @@ -128,6 +128,7 @@ + diff --git a/src/CosmosDbExplorer/Infrastructure/Models/TreeViewItemViewModel.cs b/src/CosmosDbExplorer/Infrastructure/Models/TreeViewItemViewModel.cs index e156f35..a2c2898 100644 --- a/src/CosmosDbExplorer/Infrastructure/Models/TreeViewItemViewModel.cs +++ b/src/CosmosDbExplorer/Infrastructure/Models/TreeViewItemViewModel.cs @@ -5,6 +5,8 @@ using CosmosDbExplorer.Messages; using GalaSoft.MvvmLight.Threading; using CosmosDbExplorer.ViewModel; +using CosmosDbExplorer.Infrastructure; +using System.Collections.Generic; namespace CosmosDbExplorer.Infrastructure.Models { @@ -22,9 +24,9 @@ public interface ITreeViewItemViewModel /// Base class for all ViewModel classes displayed by TreeViewItems. /// This acts as an adapter between a raw data object and a TreeViewItem. /// - public class TreeViewItemViewModel : ObservableObject + public abstract class TreeViewItemViewModel : ObservableObject { - private static readonly TreeViewItemViewModel DummyChild = new TreeViewItemViewModel(); + private static readonly TreeViewItemViewModel DummyChild = new TreeViewItemViewModelDummy(); private bool _isExpanded; @@ -32,7 +34,7 @@ protected TreeViewItemViewModel(TreeViewItemViewModel parent, IMessenger messeng { Parent = parent; MessengerInstance = messenger; - Children = new ObservableCollection(); + Children = new SortedObservableCollection(Comparer); messenger.Register(this, OnRemoveNodeMessage); @@ -61,7 +63,7 @@ private TreeViewItemViewModel() /// /// Returns the logical child items of this object. /// - public ObservableCollection Children { get; } + public SortedObservableCollection Children { get; } /// /// Returns true if this object's Children have not yet been populated. @@ -126,9 +128,28 @@ protected virtual Task LoadChildren() public TreeViewItemViewModel Parent { get; } public IMessenger MessengerInstance { get; } + + private static readonly IComparer Comparer = new TreeViewItemViewModelComparer(); + + public abstract string Name { get; } + + private class TreeViewItemViewModelDummy + : TreeViewItemViewModel + { + public override string Name => string.Empty; + } + } + + public class TreeViewItemViewModelComparer + : IComparer + { + int IComparer.Compare(TreeViewItemViewModel x, TreeViewItemViewModel y) + { + return string.Compare(x.Name, y.Name); + } } - public class TreeViewItemViewModel : TreeViewItemViewModel + public abstract class TreeViewItemViewModel : TreeViewItemViewModel where TParent : TreeViewItemViewModel { public TreeViewItemViewModel(TParent parent, IMessenger messenger, bool lazyLoadChildren) diff --git a/src/CosmosDbExplorer/Infrastructure/SortedObservableCollection.cs b/src/CosmosDbExplorer/Infrastructure/SortedObservableCollection.cs new file mode 100644 index 0000000..1282690 --- /dev/null +++ b/src/CosmosDbExplorer/Infrastructure/SortedObservableCollection.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; + +namespace CosmosDbExplorer.Infrastructure +{ + public class SortedObservableCollection + : ObservableCollection + { + private readonly IComparer _comparer; + + public SortedObservableCollection(IComparer comparer) + { + _comparer = comparer ?? throw new System.ArgumentNullException(nameof(comparer)); + } + + public SortedObservableCollection(IEnumerable collection, IComparer comparer) + : base(collection) + { + _comparer = comparer ?? throw new System.ArgumentNullException(nameof(comparer)); + } + + public SortedObservableCollection(List list, IComparer comparer) + : base(list) + { + _comparer = comparer ?? throw new System.ArgumentNullException(nameof(comparer)); + } + + protected override void InsertItem(int index, TValue item) + { + index = this.TakeWhile(i => _comparer.Compare(item, i) > 0).Count(); + base.InsertItem(index, item); + } + + protected override void SetItem(int index, TValue item) + { + RemoveAt(index); + InsertItem(default, item); + } + } +} diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/AssetRootNodeViewModelBase.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/AssetRootNodeViewModelBase.cs index 4527126..cef0e45 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/AssetRootNodeViewModelBase.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/AssetRootNodeViewModelBase.cs @@ -1,14 +1,10 @@ -using System; -using System.Linq; -using System.Threading.Tasks; +using System.Threading.Tasks; using System.Windows.Media; using CosmosDbExplorer.Infrastructure; using CosmosDbExplorer.Infrastructure.Models; using CosmosDbExplorer.Messages; using CosmosDbExplorer.Services; using GalaSoft.MvvmLight.Ioc; -using GalaSoft.MvvmLight.Messaging; -using GalaSoft.MvvmLight.Threading; using Microsoft.Azure.Documents; namespace CosmosDbExplorer.ViewModel @@ -25,8 +21,6 @@ protected AssetRootNodeViewModelBase(CollectionNodeViewModel parent) MessengerInstance.Register>(this, InnerOnUpdateOrCreateNodeMessage); } - public string Name { get; protected set; } - public new CollectionNodeViewModel Parent { get { return base.Parent; } @@ -72,7 +66,7 @@ protected AssetNodeViewModelBase(TParent parent, TResource resource) Resource = resource; } - public string Name => Resource.Id; + public override string Name => Resource.Id; public string ContentId => Resource.AltLink; diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/CollectionMetricsNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/CollectionMetricsNodeViewModel.cs index f471c66..7f1af28 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/CollectionMetricsNodeViewModel.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/CollectionMetricsNodeViewModel.cs @@ -13,10 +13,9 @@ public class CollectionMetricsNodeViewModel : TreeViewItemViewModel "Collection Metrics"; public RelayCommand OpenCommand { diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ConnectionNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ConnectionNodeViewModel.cs index 99b4f18..0a92739 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ConnectionNodeViewModel.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ConnectionNodeViewModel.cs @@ -34,7 +34,7 @@ public ConnectionNodeViewModel(IDocumentDbService dbService, IMessenger messenge public List Databases { get; protected set; } - public string Name => Connection.DatabaseUri.ToString(); + public override string Name => Connection.DatabaseUri.ToString(); protected override async Task LoadChildren() { diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/DocumentNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/DocumentNodeViewModel.cs index 62b5261..8340790 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/DocumentNodeViewModel.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/DocumentNodeViewModel.cs @@ -12,10 +12,9 @@ public class DocumentNodeViewModel : TreeViewItemViewModel "Documents"; public RelayCommand OpenDocumentCommand { diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/PermissionNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/PermissionNodeViewModel.cs index 519cfb7..d9a9ea1 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/PermissionNodeViewModel.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/PermissionNodeViewModel.cs @@ -18,7 +18,7 @@ public PermissionNodeViewModel(Permission permission, UserNodeViewModel parent) public Permission Permission { get; set; } - public string Name => Permission?.Id; + public override string Name => Permission?.Id; public string ContentId => Permission?.AltLink ?? "NewPermission"; diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ResourceNodeViewModelBase.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ResourceNodeViewModelBase.cs index 4fd7b21..bd9ecce 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ResourceNodeViewModelBase.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ResourceNodeViewModelBase.cs @@ -23,7 +23,7 @@ protected ResourceNodeViewModelBase(Resource resource, TParent parent, bool lazy Resource = resource; } - public string Name => Resource.Id; + public override string Name => Resource.Id; public RelayCommand RefreshCommand { diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ScaleSettingsNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ScaleSettingsNodeViewModel.cs index 63f7e53..1468ad0 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ScaleSettingsNodeViewModel.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/ScaleSettingsNodeViewModel.cs @@ -11,10 +11,9 @@ public class ScaleSettingsNodeViewModel : TreeViewItemViewModel "Scale & Settings"; public string ContentId => Parent.Collection.SelfLink + "/ScaleSettings"; diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/StoredProcedureNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/StoredProcedureNodeViewModel.cs index 5f6fe29..d781e1c 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/StoredProcedureNodeViewModel.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/StoredProcedureNodeViewModel.cs @@ -11,9 +11,10 @@ public class StoredProcedureRootNodeViewModel : AssetRootNodeViewModelBase "Stored Procedures"; + protected override async Task LoadChildren() { IsLoading = true; diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/TriggerNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/TriggerNodeViewModel.cs index fbbe317..82ef731 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/TriggerNodeViewModel.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/TriggerNodeViewModel.cs @@ -11,8 +11,9 @@ public class TriggerRootNodeViewModel : AssetRootNodeViewModelBase public TriggerRootNodeViewModel(CollectionNodeViewModel parent) : base(parent) { - Name = "Triggers"; } + + public override string Name => "Triggers"; protected override async Task LoadChildren() { diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserDefFuncNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserDefFuncNodeViewModel.cs index 757cff3..94ef307 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserDefFuncNodeViewModel.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserDefFuncNodeViewModel.cs @@ -11,9 +11,10 @@ public class UserDefFuncRootNodeViewModel : AssetRootNodeViewModelBase "User Defined Functions"; + protected override async Task LoadChildren() { IsLoading = true; diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserNodeViewModel.cs index e4a23c9..68f6b70 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserNodeViewModel.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UserNodeViewModel.cs @@ -25,7 +25,7 @@ public UserNodeViewModel(User user, UsersNodeViewModel parent) _dbService = SimpleIoc.Default.GetInstance(); } - public string Name => User.Id; + public override string Name => User.Id; public string ContentId => User.AltLink ?? "NewUser"; diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UsersNodeViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UsersNodeViewModel.cs index 4c221d2..934f675 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UsersNodeViewModel.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseNodes/UsersNodeViewModel.cs @@ -19,13 +19,12 @@ public class UsersNodeViewModel : TreeViewItemViewModel, public UsersNodeViewModel(Database database, DatabaseNodeViewModel parent) : base(parent, parent.MessengerInstance, true) { - Name = "Users"; Database = database; _parent = parent; _dbService = SimpleIoc.Default.GetInstance(); } - public string Name { get; set; } + public override string Name => "Users"; public Database Database { get; } diff --git a/src/CosmosDbExplorer/ViewModel/DatabaseViewModel.cs b/src/CosmosDbExplorer/ViewModel/DatabaseViewModel.cs index bb7ce65..3bd9d73 100644 --- a/src/CosmosDbExplorer/ViewModel/DatabaseViewModel.cs +++ b/src/CosmosDbExplorer/ViewModel/DatabaseViewModel.cs @@ -46,7 +46,7 @@ public async Task LoadNodesAsync() connection.Connection = c.Value; return connection; - }); + }).OrderBy(c => c.Name); Nodes = new ObservableCollection(nodes); } diff --git a/src/CosmosDbExplorer/Views/QueryEditorView.xaml b/src/CosmosDbExplorer/Views/QueryEditorView.xaml index ed254e9..76ada6e 100644 --- a/src/CosmosDbExplorer/Views/QueryEditorView.xaml +++ b/src/CosmosDbExplorer/Views/QueryEditorView.xaml @@ -36,7 +36,8 @@ Document="{Binding Content, UpdateSourceTrigger=PropertyChanged}" IsModified="{Binding IsDirty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> - + + From e0001671b726c6b607dd08ab2a17c32c2999f923 Mon Sep 17 00:00:00 2001 From: John Taylor Date: Fri, 5 Feb 2021 12:19:33 -0700 Subject: [PATCH 2/2] Added shift-enter shortcut --- src/CosmosDbExplorer/Views/QueryEditorView.xaml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CosmosDbExplorer/Views/QueryEditorView.xaml b/src/CosmosDbExplorer/Views/QueryEditorView.xaml index 76ada6e..5581b3b 100644 --- a/src/CosmosDbExplorer/Views/QueryEditorView.xaml +++ b/src/CosmosDbExplorer/Views/QueryEditorView.xaml @@ -38,6 +38,7 @@ +