From 7b39fe79c8f2f38618f3ffb2b051f4ebd335dfc7 Mon Sep 17 00:00:00 2001 From: BONNEVILLE Geoffroy Date: Tue, 28 Nov 2017 18:53:10 +0100 Subject: [PATCH] WIP strings in ressource file (XAML is done, code-behind is not) Invalid URI now shows a message Create entry is now a link above entries Entries gridview allows reordering (WIP enable it conditionnally) Code cleanup in adding/removing PwEntries from VM --- .../Controls/CompositeKeyUserControl.xaml | 4 +- ModernKeePass/ModernKeePassApp.csproj | 1 + ModernKeePass/Pages/EntryDetailPage.xaml | 39 +- ModernKeePass/Pages/EntryDetailPage.xaml.cs | 4 +- ModernKeePass/Pages/GroupDetailPage.xaml | 363 ++++++++++-------- ModernKeePass/Pages/GroupDetailPage.xaml.cs | 8 +- .../Pages/MainPageFrames/AboutPage.xaml | 10 +- .../Pages/MainPageFrames/NewDatabasePage.xaml | 4 +- .../MainPageFrames/OpenDatabasePage.xaml | 8 +- .../MainPageFrames/SaveDatabasePage.xaml | 8 +- .../Pages/MainPageFrames/WelcomePage.xaml | 4 +- .../SettingsDatabasePage.xaml | 8 +- .../SettingsSecurityPage.xaml | 10 +- .../SettingsWelcomePage.xaml | 6 +- ModernKeePass/Strings/en-US/Resources.resw | 282 ++++++++++++++ ModernKeePass/ViewModels/EntryVm.cs | 10 +- ModernKeePass/ViewModels/GroupVm.cs | 51 ++- 17 files changed, 587 insertions(+), 233 deletions(-) create mode 100644 ModernKeePass/Strings/en-US/Resources.resw diff --git a/ModernKeePass/Controls/CompositeKeyUserControl.xaml b/ModernKeePass/Controls/CompositeKeyUserControl.xaml index 3260145..343b2ea 100644 --- a/ModernKeePass/Controls/CompositeKeyUserControl.xaml +++ b/ModernKeePass/Controls/CompositeKeyUserControl.xaml @@ -34,7 +34,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/ModernKeePass/ModernKeePassApp.csproj b/ModernKeePass/ModernKeePassApp.csproj index d636b83..f8911a8 100644 --- a/ModernKeePass/ModernKeePassApp.csproj +++ b/ModernKeePass/ModernKeePassApp.csproj @@ -210,6 +210,7 @@ Designer + diff --git a/ModernKeePass/Pages/EntryDetailPage.xaml b/ModernKeePass/Pages/EntryDetailPage.xaml index e07d084..20d5453 100644 --- a/ModernKeePass/Pages/EntryDetailPage.xaml +++ b/ModernKeePass/Pages/EntryDetailPage.xaml @@ -337,21 +337,21 @@ - + - - - - - - - - - + + + + + + + + + - @@ -427,7 +430,7 @@ - + @@ -435,7 +438,7 @@ - + @@ -445,16 +448,16 @@ - + - + - - + + - + diff --git a/ModernKeePass/Pages/EntryDetailPage.xaml.cs b/ModernKeePass/Pages/EntryDetailPage.xaml.cs index 865b18a..ba3664e 100644 --- a/ModernKeePass/Pages/EntryDetailPage.xaml.cs +++ b/ModernKeePass/Pages/EntryDetailPage.xaml.cs @@ -97,9 +97,9 @@ namespace ModernKeePass.Pages var uri = new Uri(UrlTextBox.Text); await Windows.System.Launcher.LaunchUriAsync(uri); } - catch + catch (Exception ex) { - // TODO: Show some error + MessageDialogHelper.ShowErrorDialog(ex); } } } diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml b/ModernKeePass/Pages/GroupDetailPage.xaml index c510aca..0fdf633 100644 --- a/ModernKeePass/Pages/GroupDetailPage.xaml +++ b/ModernKeePass/Pages/GroupDetailPage.xaml @@ -18,6 +18,7 @@ + @@ -42,6 +43,13 @@ + + + + + + + @@ -88,175 +96,210 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + - - - - - - - - - - - - - - - - - + + + - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -288,7 +331,7 @@ FontWeight="SemiBold" TextWrapping="NoWrap" VerticalAlignment="Center" - PlaceholderText="New group name..."> + x:Uid="GroupTitle"> @@ -297,7 +340,7 @@ - + \ No newline at end of file diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml.cs b/ModernKeePass/Pages/GroupDetailPage.xaml.cs index cad355e..a3164b2 100644 --- a/ModernKeePass/Pages/GroupDetailPage.xaml.cs +++ b/ModernKeePass/Pages/GroupDetailPage.xaml.cs @@ -99,9 +99,6 @@ namespace ModernKeePass.Pages { case -1: return; - case 0: - entry = Model.AddNewEntry(); - break; default: entry = GridView.SelectedItem as EntryVm; break; @@ -156,5 +153,10 @@ namespace ModernKeePass.Pages } #endregion + + private void CreateEntry_ButtonClick(object sender, RoutedEventArgs e) + { + Frame.Navigate(typeof(EntryDetailPage), Model.AddNewEntry()); + } } } diff --git a/ModernKeePass/Pages/MainPageFrames/AboutPage.xaml b/ModernKeePass/Pages/MainPageFrames/AboutPage.xaml index 6325d3c..fe8e577 100644 --- a/ModernKeePass/Pages/MainPageFrames/AboutPage.xaml +++ b/ModernKeePass/Pages/MainPageFrames/AboutPage.xaml @@ -18,21 +18,21 @@ - + - + - + - + - + diff --git a/ModernKeePass/Pages/MainPageFrames/NewDatabasePage.xaml b/ModernKeePass/Pages/MainPageFrames/NewDatabasePage.xaml index 8186346..5e22f36 100644 --- a/ModernKeePass/Pages/MainPageFrames/NewDatabasePage.xaml +++ b/ModernKeePass/Pages/MainPageFrames/NewDatabasePage.xaml @@ -18,8 +18,8 @@ - - Create a new password database to the location of your chosing. + + diff --git a/ModernKeePass/Pages/MainPageFrames/OpenDatabasePage.xaml b/ModernKeePass/Pages/MainPageFrames/OpenDatabasePage.xaml index c94b795..c1265bd 100644 --- a/ModernKeePass/Pages/MainPageFrames/OpenDatabasePage.xaml +++ b/ModernKeePass/Pages/MainPageFrames/OpenDatabasePage.xaml @@ -17,10 +17,10 @@ - - Open an existing password database from your PC. - - Open an existing password database from an Internet location (not yet implemented). + + + + diff --git a/ModernKeePass/Pages/MainPageFrames/SaveDatabasePage.xaml b/ModernKeePass/Pages/MainPageFrames/SaveDatabasePage.xaml index 8e7d74a..6a9d9c9 100644 --- a/ModernKeePass/Pages/MainPageFrames/SaveDatabasePage.xaml +++ b/ModernKeePass/Pages/MainPageFrames/SaveDatabasePage.xaml @@ -11,9 +11,9 @@ - - This will save and close the currently opened database. - - This will save the currently opened database as a new file and leave it open. + + + + diff --git a/ModernKeePass/Pages/MainPageFrames/WelcomePage.xaml b/ModernKeePass/Pages/MainPageFrames/WelcomePage.xaml index 9552a79..8ad319b 100644 --- a/ModernKeePass/Pages/MainPageFrames/WelcomePage.xaml +++ b/ModernKeePass/Pages/MainPageFrames/WelcomePage.xaml @@ -9,11 +9,11 @@ - Have an existing password database? Open it here. + - Want to create a new password database? Do it here. + diff --git a/ModernKeePass/Pages/SettingsPageFrames/SettingsDatabasePage.xaml b/ModernKeePass/Pages/SettingsPageFrames/SettingsDatabasePage.xaml index 27797de..429c2bb 100644 --- a/ModernKeePass/Pages/SettingsPageFrames/SettingsDatabasePage.xaml +++ b/ModernKeePass/Pages/SettingsPageFrames/SettingsDatabasePage.xaml @@ -17,13 +17,13 @@ - + - + - + - + diff --git a/ModernKeePass/Pages/SettingsPageFrames/SettingsSecurityPage.xaml b/ModernKeePass/Pages/SettingsPageFrames/SettingsSecurityPage.xaml index 74c9fcd..fc03650 100644 --- a/ModernKeePass/Pages/SettingsPageFrames/SettingsSecurityPage.xaml +++ b/ModernKeePass/Pages/SettingsPageFrames/SettingsSecurityPage.xaml @@ -8,12 +8,12 @@ mc:Ignorable="d"> - + - - - + + + - + diff --git a/ModernKeePass/Pages/SettingsPageFrames/SettingsWelcomePage.xaml b/ModernKeePass/Pages/SettingsPageFrames/SettingsWelcomePage.xaml index f01f8bf..f46c32f 100644 --- a/ModernKeePass/Pages/SettingsPageFrames/SettingsWelcomePage.xaml +++ b/ModernKeePass/Pages/SettingsPageFrames/SettingsWelcomePage.xaml @@ -7,8 +7,8 @@ mc:Ignorable="d"> - - - + + + diff --git a/ModernKeePass/Strings/en-US/Resources.resw b/ModernKeePass/Strings/en-US/Resources.resw new file mode 100644 index 0000000..557aada --- /dev/null +++ b/ModernKeePass/Strings/en-US/Resources.resw @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Dominik Reichl for the KeePass application and file format + + + David Lechner for his PCL adapatation of the KeePass Library and his correlated tests + + + Credits + + + A modern password manager for the Windows Store + + + Homepage: + + + Create new key file + + + Password + + + Expiration date + + + Password has expired + + + User name or login + + + Notes + + + Password + + + Show password + + + Create new entry + + + Search... + + + New group name... + + + Create new... + + + Create a new password database to the location of your chosing. + + + Browse files... + + + Open an existing password database from your PC. + + + From Url... + + + Open an existing password database from an Internet location (not yet implemented). + + + Also add these characters: + + + Brackets ([], {}, (), ...) + + + Generate + + + Digits (0, 1, 2, ...) + + + Password Length: + + + Lower case (a, b, c, ...) + + + Minus (-) + + + Space ( ) + + + Special (!, $, %, ...) + + + Generate password + + + Underscore (_) + + + Upper case (A, B, C, ...) + + + Save as... + + + This will save the currently opened database as a new file and leave it open. + + + Save and close + + + This will save and close the currently opened database. + + + Compression Algorithm + + + Encryption Algorithm + + + Key Derivation Algorithm + + + Recycle bin + + + Disabled + + + Enabled + + + Here, you may change your database password, key file, or both. Just click on on + + + Update master key + + + when you're done. Please make sure to remember the password you choose here! + + + Change database security options + + + Update master key + + + Here, you may change the application or the database settings. + + + Select a setting pane on the left to access the options. + + + Settings + + + Want to create a new password database? Do it here. + + + Have an existing password database? Open it here. + + \ No newline at end of file diff --git a/ModernKeePass/ViewModels/EntryVm.cs b/ModernKeePass/ViewModels/EntryVm.cs index 59c44ec..c7309b1 100644 --- a/ModernKeePass/ViewModels/EntryVm.cs +++ b/ModernKeePass/ViewModels/EntryVm.cs @@ -226,7 +226,6 @@ namespace ModernKeePass.ViewModels { PreviousGroup = ParentGroup; PreviousGroup.Entries.Remove(this); - PreviousGroup.RemovePwEntry(_pwEntry); if (destination == null) { _database.AddDeletedItem(IdUuid); @@ -234,19 +233,22 @@ namespace ModernKeePass.ViewModels } ParentGroup = destination; ParentGroup.Entries.Add(this); - ParentGroup.AddPwEntry(_pwEntry); } public void CommitDelete() { _pwEntry.ParentGroup.Entries.Remove(_pwEntry); - if (_database.RecycleBinEnabled && !PreviousGroup.IsSelected) _database.RecycleBin.AddPwEntry(_pwEntry); - else _database.AddDeletedItem(IdUuid); + if (!_database.RecycleBinEnabled || PreviousGroup.IsSelected) _database.AddDeletedItem(IdUuid); } public void Save() { _database.Save(); } + + public PwEntry GetPwEntry() + { + return _pwEntry; + } } } diff --git a/ModernKeePass/ViewModels/GroupVm.cs b/ModernKeePass/ViewModels/GroupVm.cs index 42b527a..6349f18 100644 --- a/ModernKeePass/ViewModels/GroupVm.cs +++ b/ModernKeePass/ViewModels/GroupVm.cs @@ -1,4 +1,6 @@ -using System.Collections.ObjectModel; +using System; +using System.Collections.ObjectModel; +using System.Collections.Specialized; using System.Linq; using System.Text; using Windows.UI.Text; @@ -82,6 +84,7 @@ namespace ModernKeePass.ViewModels private readonly PwGroup _pwGroup; private readonly IDatabase _database; private bool _isEditMode; + private PwEntry _reorderedEntry; public GroupVm() {} @@ -96,12 +99,28 @@ namespace ModernKeePass.ViewModels ParentGroup = parent; if (recycleBinId != null && _pwGroup.Uuid.Equals(recycleBinId)) _database.RecycleBin = this; - Entries = new ObservableCollection(pwGroup.Entries.Select(e => new EntryVm(e, this)).OrderBy(e => e.Name)); - Entries.Insert(0, new EntryVm ()); - Groups = new ObservableCollection(pwGroup.Groups.Select(g => new GroupVm(g, this, recycleBinId)).OrderBy(g => g.Name)); + Entries = new ObservableCollection(pwGroup.Entries.Select(e => new EntryVm(e, this))); + Entries.CollectionChanged += Entries_CollectionChanged; + Groups = new ObservableCollection(pwGroup.Groups.Select(g => new GroupVm(g, this, recycleBinId))); Groups.Insert(0, new GroupVm ()); } + private void Entries_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + switch (e.Action) + { + case NotifyCollectionChangedAction.Remove: + var oldIndex = (uint) e.OldStartingIndex; + _reorderedEntry = _pwGroup.Entries.GetAt(oldIndex); + _pwGroup.Entries.RemoveAt(oldIndex); + break; + case NotifyCollectionChangedAction.Add: + if (e.OldStartingIndex == -1) _pwGroup.Entries.Add(((EntryVm)e.NewItems[0]).GetPwEntry()); + else _pwGroup.Entries.Insert((uint)e.NewStartingIndex, _reorderedEntry); + break; + } + } + public GroupVm AddNewGroup(string name = "") { var pwGroup = new PwGroup(true, true, name, PwIcon.Folder); @@ -114,23 +133,12 @@ namespace ModernKeePass.ViewModels public EntryVm AddNewEntry() { var pwEntry = new PwEntry(true, true); - _pwGroup.AddEntry(pwEntry, true); var newEntry = new EntryVm(pwEntry, this) {IsEditMode = true}; newEntry.GeneratePassword(); Entries.Add(newEntry); return newEntry; } - public void AddPwEntry(PwEntry entry) - { - _pwGroup.AddEntry(entry, true); - } - - public void RemovePwEntry(PwEntry entry) - { - _pwGroup.Entries.Remove(entry); - } - public void MarkForDelete() { if (_database.RecycleBinEnabled && _database.RecycleBin?.IdUuid == null) @@ -171,6 +179,19 @@ namespace ModernKeePass.ViewModels _database.Save(); } + public void SortEntries() + { + var comparer = new PwEntryComparer(PwDefs.TitleField, true, true); + try + { + _pwGroup.Entries.Sort(comparer); + Entries = new ObservableCollection(Entries.OrderBy(e => e.Name)); + } + catch (Exception e) + { + } + } + public override string ToString() { return Name;