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;